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
|
|
|
export type NormalizedAgentPermissions = Record<string, unknown> & {
|
2026-02-19 09:10:38 -06:00
|
|
|
canCreateAgents: boolean;
|
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
|
|
|
};
|
2026-02-19 09:10:38 -06:00
|
|
|
|
|
|
|
|
export function defaultPermissionsForRole(role: string): NormalizedAgentPermissions {
|
|
|
|
|
return {
|
|
|
|
|
canCreateAgents: role === "ceo",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function normalizeAgentPermissions(
|
|
|
|
|
permissions: unknown,
|
|
|
|
|
role: string,
|
|
|
|
|
): NormalizedAgentPermissions {
|
|
|
|
|
const defaults = defaultPermissionsForRole(role);
|
|
|
|
|
if (typeof permissions !== "object" || permissions === null || Array.isArray(permissions)) {
|
|
|
|
|
return defaults;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const record = permissions as Record<string, unknown>;
|
|
|
|
|
return {
|
|
|
|
|
canCreateAgents:
|
|
|
|
|
typeof record.canCreateAgents === "boolean"
|
|
|
|
|
? record.canCreateAgents
|
|
|
|
|
: defaults.canCreateAgents,
|
|
|
|
|
};
|
|
|
|
|
}
|