Implement agent hiring, approval workflows, config revisions, LLM reflection, and sidebar badges
Agent management: hire endpoint with permission gates and pending_approval status,
config revision tracking with rollback, agent duplicate route, permission CRUD.
Block pending_approval agents from auth, heartbeat, and assignments.
Approvals: revision request/resubmit flow, approval comments CRUD, issue-approval
linking, auto-wake agents on approval decisions with context snapshot.
Costs: per-agent breakdown, period filtering (month/week/day/all), cost by agent
list endpoint.
Adapters: agentConfigurationDoc on all adapters, /llms/agent-configuration.txt
reflection routes. Inject PAPERCLIP_APPROVAL_ID, PAPERCLIP_APPROVAL_STATUS,
PAPERCLIP_LINKED_ISSUE_IDS into adapter environments.
Sidebar badges endpoint for pending approval/inbox counts. Dashboard and company
settings extensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:02:41 -06:00
import { Router , type Request } from "express" ;
2026-03-03 08:45:26 -06:00
import type { Db } from "@paperclipai/db" ;
import { AGENT_ICON_NAMES } from "@paperclipai/shared" ;
Implement agent hiring, approval workflows, config revisions, LLM reflection, and sidebar badges
Agent management: hire endpoint with permission gates and pending_approval status,
config revision tracking with rollback, agent duplicate route, permission CRUD.
Block pending_approval agents from auth, heartbeat, and assignments.
Approvals: revision request/resubmit flow, approval comments CRUD, issue-approval
linking, auto-wake agents on approval decisions with context snapshot.
Costs: per-agent breakdown, period filtering (month/week/day/all), cost by agent
list endpoint.
Adapters: agentConfigurationDoc on all adapters, /llms/agent-configuration.txt
reflection routes. Inject PAPERCLIP_APPROVAL_ID, PAPERCLIP_APPROVAL_STATUS,
PAPERCLIP_LINKED_ISSUE_IDS into adapter environments.
Sidebar badges endpoint for pending approval/inbox counts. Dashboard and company
settings extensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:02:41 -06:00
import { forbidden } from "../errors.js" ;
import { listServerAdapters } from "../adapters/index.js" ;
import { agentService } from "../services/agents.js" ;
function hasCreatePermission ( agent : { role : string ; permissions : Record < string , unknown > | null | undefined } ) {
if ( ! agent . permissions || typeof agent . permissions !== "object" ) return false ;
return Boolean ( ( agent . permissions as Record < string , unknown > ) . canCreateAgents ) ;
}
export function llmRoutes ( db : Db ) {
const router = Router ( ) ;
const agentsSvc = agentService ( db ) ;
async function assertCanRead ( req : Request ) {
if ( req . actor . type === "board" ) return ;
if ( req . actor . type !== "agent" || ! req . actor . agentId ) {
throw forbidden ( "Board or permitted agent authentication required" ) ;
}
const actorAgent = await agentsSvc . getById ( req . actor . agentId ) ;
if ( ! actorAgent || ! hasCreatePermission ( actorAgent ) ) {
throw forbidden ( "Missing permission to read agent configuration reflection" ) ;
}
}
router . get ( "/llms/agent-configuration.txt" , async ( req , res ) = > {
await assertCanRead ( req ) ;
const adapters = listServerAdapters ( ) . sort ( ( a , b ) = > a . type . localeCompare ( b . type ) ) ;
const lines = [
"# Paperclip Agent Configuration Index" ,
"" ,
"Installed adapters:" ,
. . . adapters . map ( ( adapter ) = > ` - ${ adapter . type } : /llms/agent-configuration/ ${ adapter . type } .txt ` ) ,
"" ,
"Related API endpoints:" ,
"- GET /api/companies/:companyId/agent-configurations" ,
"- GET /api/agents/:id/configuration" ,
"- POST /api/companies/:companyId/agent-hires" ,
"" ,
2026-02-25 08:39:11 -06:00
"Agent identity references:" ,
"- GET /llms/agent-icons.txt" ,
"" ,
Implement agent hiring, approval workflows, config revisions, LLM reflection, and sidebar badges
Agent management: hire endpoint with permission gates and pending_approval status,
config revision tracking with rollback, agent duplicate route, permission CRUD.
Block pending_approval agents from auth, heartbeat, and assignments.
Approvals: revision request/resubmit flow, approval comments CRUD, issue-approval
linking, auto-wake agents on approval decisions with context snapshot.
Costs: per-agent breakdown, period filtering (month/week/day/all), cost by agent
list endpoint.
Adapters: agentConfigurationDoc on all adapters, /llms/agent-configuration.txt
reflection routes. Inject PAPERCLIP_APPROVAL_ID, PAPERCLIP_APPROVAL_STATUS,
PAPERCLIP_LINKED_ISSUE_IDS into adapter environments.
Sidebar badges endpoint for pending approval/inbox counts. Dashboard and company
settings extensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:02:41 -06:00
"Notes:" ,
"- Sensitive values are redacted in configuration read APIs." ,
"- New hires may be created in pending_approval state depending on company settings." ,
2026-04-10 22:26:21 -05:00
"- Timer heartbeats are opt-in for new hires. Leave runtimeConfig.heartbeat.enabled false unless the role truly needs scheduled work or the user explicitly asked for it." ,
Implement agent hiring, approval workflows, config revisions, LLM reflection, and sidebar badges
Agent management: hire endpoint with permission gates and pending_approval status,
config revision tracking with rollback, agent duplicate route, permission CRUD.
Block pending_approval agents from auth, heartbeat, and assignments.
Approvals: revision request/resubmit flow, approval comments CRUD, issue-approval
linking, auto-wake agents on approval decisions with context snapshot.
Costs: per-agent breakdown, period filtering (month/week/day/all), cost by agent
list endpoint.
Adapters: agentConfigurationDoc on all adapters, /llms/agent-configuration.txt
reflection routes. Inject PAPERCLIP_APPROVAL_ID, PAPERCLIP_APPROVAL_STATUS,
PAPERCLIP_LINKED_ISSUE_IDS into adapter environments.
Sidebar badges endpoint for pending approval/inbox counts. Dashboard and company
settings extensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:02:41 -06:00
"" ,
] ;
res . type ( "text/plain" ) . send ( lines . join ( "\n" ) ) ;
} ) ;
2026-02-25 08:39:11 -06:00
router . get ( "/llms/agent-icons.txt" , async ( req , res ) = > {
await assertCanRead ( req ) ;
const lines = [
"# Paperclip Agent Icon Names" ,
"" ,
"Set the `icon` field on hire/create payloads to one of:" ,
. . . AGENT_ICON_NAMES . map ( ( name ) = > ` - ${ name } ` ) ,
"" ,
"Example:" ,
'{ "name": "SearchOps", "role": "researcher", "icon": "search" }' ,
"" ,
] ;
res . type ( "text/plain" ) . send ( lines . join ( "\n" ) ) ;
} ) ;
Implement agent hiring, approval workflows, config revisions, LLM reflection, and sidebar badges
Agent management: hire endpoint with permission gates and pending_approval status,
config revision tracking with rollback, agent duplicate route, permission CRUD.
Block pending_approval agents from auth, heartbeat, and assignments.
Approvals: revision request/resubmit flow, approval comments CRUD, issue-approval
linking, auto-wake agents on approval decisions with context snapshot.
Costs: per-agent breakdown, period filtering (month/week/day/all), cost by agent
list endpoint.
Adapters: agentConfigurationDoc on all adapters, /llms/agent-configuration.txt
reflection routes. Inject PAPERCLIP_APPROVAL_ID, PAPERCLIP_APPROVAL_STATUS,
PAPERCLIP_LINKED_ISSUE_IDS into adapter environments.
Sidebar badges endpoint for pending approval/inbox counts. Dashboard and company
settings extensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:02:41 -06:00
router . get ( "/llms/agent-configuration/:adapterType.txt" , async ( req , res ) = > {
await assertCanRead ( req ) ;
const adapterType = req . params . adapterType as string ;
const adapter = listServerAdapters ( ) . find ( ( entry ) = > entry . type === adapterType ) ;
if ( ! adapter ) {
res . status ( 404 ) . type ( "text/plain" ) . send ( ` Unknown adapter type: ${ adapterType } ` ) ;
return ;
}
res
. type ( "text/plain" )
. send (
adapter . agentConfigurationDoc ? ?
` # ${ adapterType } agent configuration \ n \ nNo adapter-specific documentation registered. ` ,
) ;
} ) ;
return router ;
}