@personaai/runtime 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/routing.ts","../src/client-factory.ts","../src/errors.ts","../src/runtime.ts","../src/runRegistry.ts","../src/version.ts","../src/routes/health.ts","../src/routeHelpers.ts","../src/routes/restToolsManifest.ts","../src/routes/rcpManifest.ts","../src/runDriver.ts","../src/heartbeat.ts","../src/routes/chat.ts","../src/routes/architect.ts","../src/routes/resume.ts","../src/routes/threads.ts","../src/routes/voice.ts","../src/routes/messages.ts","../src/routes/agents.ts","../src/routes/files.ts","../src/routes/memory.ts","../src/routes/mcpOAuth.ts","../src/routes/mcps.ts","../src/routes/providers.ts","../src/routes/skills.ts","../src/routes/knowledge.ts","../src/routes/stores.ts","../src/routes/rcpSources.ts","../src/routes/auditLogs.ts","../src/routes/workflows.ts","../src/routes/workflowStream.ts","../src/routes/channels.ts"],"sourcesContent":["import type { RuntimeMethod, RuntimeRequest } from './types/request.js';\r\nimport type { RuntimeResponse } from './types/response.js';\r\nimport type { RunDriver } from './runDriver.js';\r\nimport type {\r\n ChannelsOptions,\r\n RcpManifestOptions,\r\n RestToolsManifestOptions,\r\n RuntimeCapabilities,\r\n} from './types/options.js';\r\n\r\nexport interface RouteContext {\r\n client: import('@personaai/sdk').PersonaClient;\r\n hooks: import('./types/hooks.js').RuntimeHooks | undefined;\r\n mode: 'development' | 'production';\r\n params: Record<string, string>;\r\n heartbeatIntervalMs: number;\r\n /** In-flight/recently-finished chat runs, keyed by runId — backs POST /chat's reconnect support. */\r\n runs: Map<string, RunDriver>;\r\n /** The fully-resolved (all keys present) capabilities this runtime instance was created with. */\r\n capabilities: Required<RuntimeCapabilities>;\r\n logger: import('@personaai/sdk').Logger;\r\n /** Set only when `createRuntime({ restToolsManifest })` was configured — backs the manifest route. */\r\n restToolsManifest: RestToolsManifestOptions | undefined;\r\n /** Set only when `createRuntime({ rcpManifest })` was configured — backs the RCP manifest route. */\r\n rcpManifest: RcpManifestOptions | undefined;\r\n /** Set only when `createRuntime({ channels })` was configured — backs the channel webhook routes. */\r\n channels: ChannelsOptions | undefined;\r\n}\r\n\r\nexport type RouteHandler = (request: RuntimeRequest, ctx: RouteContext) => Promise<RuntimeResponse>;\r\n\r\nexport interface Route {\r\n method: RuntimeMethod;\r\n /** Segments split on '/': a literal string, or `:name` for a captured param. */\r\n pattern: string[];\r\n handler: RouteHandler;\r\n /** @default true — only `/health` sets this to false. */\r\n requiresAuth?: boolean;\r\n}\r\n\r\nexport type MatchResult =\r\n | { kind: 'matched'; route: Route; params: Record<string, string> }\r\n | { kind: 'not-found' }\r\n | { kind: 'method-not-allowed'; allowed: RuntimeMethod[] };\r\n\r\nfunction splitPath(path: string): string[] {\r\n return path.split('/').filter((segment) => segment.length > 0);\r\n}\r\n\r\nexport function matchRoute(routes: Route[], method: RuntimeMethod, path: string): MatchResult {\r\n const requested = splitPath(path);\r\n let sawPathMatch = false;\r\n const allowed = new Set<RuntimeMethod>();\r\n\r\n for (const route of routes) {\r\n if (route.pattern.length !== requested.length) continue;\r\n\r\n const params: Record<string, string> = {};\r\n let matched = true;\r\n for (let i = 0; i < route.pattern.length; i++) {\r\n const patternSegment = route.pattern[i]!;\r\n const requestedSegment = requested[i]!;\r\n if (patternSegment.startsWith(':')) {\r\n params[patternSegment.slice(1)] = decodeURIComponent(requestedSegment);\r\n } else if (patternSegment !== requestedSegment) {\r\n matched = false;\r\n break;\r\n }\r\n }\r\n\r\n if (!matched) continue;\r\n\r\n sawPathMatch = true;\r\n allowed.add(route.method);\r\n if (route.method === method) {\r\n return { kind: 'matched', route, params };\r\n }\r\n }\r\n\r\n if (sawPathMatch) return { kind: 'method-not-allowed', allowed: [...allowed] };\r\n return { kind: 'not-found' };\r\n}\r\n\r\n/** Strips `mountPath` from `path` if present — tolerant of adapters that already stripped it themselves (e.g. a framework's own sub-router). */\r\nexport function stripMountPath(path: string, mountPath: string | undefined): string {\r\n if (!mountPath) return path;\r\n const normalizedMount = mountPath.endsWith('/') ? mountPath.slice(0, -1) : mountPath;\r\n if (!normalizedMount) return path;\r\n if (path === normalizedMount) return '/';\r\n if (path.startsWith(`${normalizedMount}/`)) return path.slice(normalizedMount.length);\r\n return path;\r\n}\r\n","import { PersonaClient, type Logger } from '@personaai/sdk';\r\nimport type { CreateRuntimeOptions } from './types/options.js';\r\n\r\n/**\r\n * One `PersonaClient` per request, scoped to the resolved user — the\r\n * pattern `@personaai/sdk`'s own README documents. Constructing a\r\n * `PersonaClient` does no I/O, so per-request construction has no\r\n * meaningful cost.\r\n */\r\nexport function createClientForRequest(\r\n options: CreateRuntimeOptions,\r\n userId: string | null,\r\n logger?: Logger\r\n): PersonaClient {\r\n const clientLogger = logger ? logger.child('sdk') : undefined;\r\n return new PersonaClient({\r\n baseUrl: options.baseUrl,\r\n credential: options.credential,\r\n externalUserId: userId ?? undefined,\r\n fetch: options.fetch,\r\n logger: clientLogger,\r\n });\r\n}\r\n","import { PersonaApiError } from '@personaai/sdk';\r\nimport type { RuntimeBufferedResponse } from './types/response.js';\r\n\r\n/** A runtime-originated HTTP error (routing, validation, auth) — as opposed to one surfaced from the Persona API itself. */\r\nexport class RuntimeHttpError extends Error {\r\n readonly status: number;\r\n readonly code: string;\r\n\r\n constructor(status: number, code: string, message: string) {\r\n super(message);\r\n this.name = 'RuntimeHttpError';\r\n this.status = status;\r\n this.code = code;\r\n Object.setPrototypeOf(this, RuntimeHttpError.prototype);\r\n }\r\n}\r\n\r\ninterface MappedError {\r\n status: number;\r\n code: string;\r\n message: string;\r\n detail?: unknown;\r\n}\r\n\r\n/**\r\n * Two-tier trust model: errors this runtime (or the Persona API) already\r\n * curated into a developer-facing message are safe to pass through as-is.\r\n * Anything else (a bug in host hook code, a raw network error, ...) is\r\n * untrusted and gets a fixed generic message in production — this is what\r\n * actually prevents internal implementation details (\"LangGraph\",\r\n * \"Qdrant\", stack traces) from ever reaching a runtime caller.\r\n */\r\nexport function mapErrorToRuntimeError(\r\n err: unknown,\r\n mode: 'development' | 'production'\r\n): MappedError {\r\n const dev = mode === 'development';\r\n\r\n if (err instanceof RuntimeHttpError) {\r\n return { status: err.status, code: err.code, message: err.message };\r\n }\r\n\r\n if (err instanceof PersonaApiError) {\r\n return {\r\n status: err.statusCode,\r\n code: err.code,\r\n message: err.message,\r\n ...(dev ? { detail: err.response } : {}),\r\n };\r\n }\r\n\r\n const message = err instanceof Error ? err.message : String(err);\r\n return {\r\n status: 500,\r\n code: 'INTERNAL_ERROR',\r\n message: dev ? message : 'An internal error occurred.',\r\n ...(dev\r\n ? {\r\n detail: {\r\n name: err instanceof Error ? err.name : typeof err,\r\n stack: err instanceof Error ? err.stack : undefined,\r\n },\r\n }\r\n : {}),\r\n };\r\n}\r\n\r\nexport function errorToResponse(\r\n err: unknown,\r\n mode: 'development' | 'production'\r\n): RuntimeBufferedResponse {\r\n const mapped = mapErrorToRuntimeError(err, mode);\r\n return {\r\n kind: 'buffered',\r\n status: mapped.status,\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n error: {\r\n code: mapped.code,\r\n message: mapped.message,\r\n ...(mapped.detail !== undefined ? { detail: mapped.detail } : {}),\r\n },\r\n }),\r\n };\r\n}\r\n","import type { CreateRuntimeOptions, Runtime, RuntimeCapabilities } from './types/options.js';\r\nimport type { RuntimeRequest } from './types/request.js';\r\nimport type { RuntimeResponse } from './types/response.js';\r\nimport { matchRoute, stripMountPath, type Route } from './routing.js';\r\nimport { createClientForRequest } from './client-factory.js';\r\nimport { errorToResponse, RuntimeHttpError } from './errors.js';\r\nimport { createLogger, PersonaApiError, type Logger } from '@personaai/sdk';\r\nimport type { RunDriver } from './runDriver.js';\r\nimport { evictStaleRuns, DEFAULT_RUN_GRACE_MS, DEFAULT_MAX_TRACKED_RUNS } from './runRegistry.js';\r\nimport { healthRoute } from './routes/health.js';\r\nimport { restToolsManifestRoute } from './routes/restToolsManifest.js';\r\nimport { rcpManifestRoute } from './routes/rcpManifest.js';\r\nimport { chatRoute } from './routes/chat.js';\r\nimport { architectRoute } from './routes/architect.js';\r\nimport { createResumeRoute } from './routes/resume.js';\r\nimport {\r\n listThreads,\r\n createThread,\r\n getThread,\r\n updateThread,\r\n deleteThread,\r\n bulkDeleteThreads,\r\n getThreadMessages,\r\n resetThread,\r\n} from './routes/threads.js';\r\nimport { createVoiceSession } from './routes/voice.js';\r\nimport { sendMessage, sendAgentMessage } from './routes/messages.js';\r\nimport {\r\n listAgents,\r\n createAgent,\r\n getAgent,\r\n updateAgent,\r\n deleteAgent,\r\n bulkDeleteAgents,\r\n getAgentMcpConnections,\r\n} from './routes/agents.js';\r\nimport {\r\n listFiles,\r\n uploadFile,\r\n downloadFile,\r\n deleteFile,\r\n bulkDeleteFiles,\r\n} from './routes/files.js';\r\nimport { listMemory, getMemoryFile, writeMemoryFile, deleteMemoryFile } from './routes/memory.js';\r\nimport {\r\n getOwnerAuthorizeUrl,\r\n getUserAuthorizeUrl,\r\n getUserConnectionStatus,\r\n disconnectUserConnection,\r\n disconnectOwnerConnection,\r\n} from './routes/mcpOAuth.js';\r\nimport {\r\n listMcps,\r\n createMcp,\r\n getMcp,\r\n updateMcp,\r\n deleteMcp,\r\n bulkDeleteMcps,\r\n getMcpUsage,\r\n testMcpConnection,\r\n readMcpResource,\r\n callMcpTool,\r\n} from './routes/mcps.js';\r\nimport {\r\n listProviders,\r\n createProvider,\r\n getProvider,\r\n updateProvider,\r\n deleteProvider,\r\n bulkDeleteProviders,\r\n testProviderConnection,\r\n getProviderModels,\r\n getProviderUsage,\r\n} from './routes/providers.js';\r\nimport {\r\n listSkills,\r\n createSkill,\r\n getSkill,\r\n updateSkill,\r\n deleteSkill,\r\n bulkDeleteSkills,\r\n getSkillUsage,\r\n} from './routes/skills.js';\r\nimport {\r\n listKnowledgeBases,\r\n createKnowledgeBase,\r\n getKnowledgeBase,\r\n updateKnowledgeBase,\r\n deleteKnowledgeBase,\r\n bulkDeleteKnowledgeBases,\r\n getKnowledgeBaseUsage,\r\n uploadKnowledgeDocuments,\r\n listKnowledgeDocuments,\r\n deleteKnowledgeDocument,\r\n searchKnowledgeBase,\r\n} from './routes/knowledge.js';\r\nimport {\r\n listStores,\r\n createStore,\r\n getStore,\r\n updateStore,\r\n deleteStore,\r\n listStoreFiles,\r\n getStoreFile,\r\n writeStoreFile,\r\n deleteStoreFile,\r\n} from './routes/stores.js';\r\nimport {\r\n listRcpSources,\r\n createRcpSource,\r\n getRcpSource,\r\n updateRcpSource,\r\n deleteRcpSource,\r\n bulkDeleteRcpSources,\r\n getRcpSourceUsage,\r\n testRcpSourceConnection,\r\n} from './routes/rcpSources.js';\r\nimport { listAuditLogs } from './routes/auditLogs.js';\r\nimport {\r\n listWorkflows,\r\n createWorkflow,\r\n getWorkflow,\r\n updateWorkflow,\r\n deleteWorkflow,\r\n saveWorkflowDraft,\r\n publishWorkflow,\r\n listWorkflowVersions,\r\n getWorkflowVersion,\r\n getWorkflowMermaid,\r\n listWorkflowRuns,\r\n getWorkflowRun,\r\n cancelWorkflowRun,\r\n} from './routes/workflows.js';\r\nimport { workflowStreamRoute } from './routes/workflowStream.js';\r\nimport { twilioVoiceChannel, twilioMessageChannel } from './routes/channels.js';\r\n\r\nfunction resolveCapabilities(\r\n capabilities: RuntimeCapabilities | undefined\r\n): Required<RuntimeCapabilities> {\r\n return {\r\n agentsWrite: capabilities?.agentsWrite ?? false,\r\n mcps: capabilities?.mcps ?? false,\r\n providers: capabilities?.providers ?? false,\r\n skills: capabilities?.skills ?? false,\r\n knowledge: capabilities?.knowledge ?? false,\r\n stores: capabilities?.stores ?? false,\r\n rcpSources: capabilities?.rcpSources ?? false,\r\n auditLogs: capabilities?.auditLogs ?? false,\r\n architect: capabilities?.architect ?? false,\r\n workflowsWrite: capabilities?.workflowsWrite ?? false,\r\n messages: capabilities?.messages ?? false,\r\n };\r\n}\r\n\r\nfunction buildRoutes(capabilities: Required<RuntimeCapabilities>): Route[] {\r\n const routes: Route[] = [\r\n { method: 'GET', pattern: ['health'], handler: healthRoute, requiresAuth: false },\r\n\r\n // Chat — always on, the core runtime feature.\r\n { method: 'POST', pattern: ['chat'], handler: chatRoute },\r\n { method: 'GET', pattern: ['chat', ':runId', 'resume'], handler: createResumeRoute('chat') },\r\n\r\n // Threads — always on, end-user-scoped conversation history.\r\n { method: 'GET', pattern: ['threads'], handler: listThreads },\r\n { method: 'POST', pattern: ['threads'], handler: createThread },\r\n { method: 'POST', pattern: ['threads', 'bulk-delete'], handler: bulkDeleteThreads },\r\n { method: 'GET', pattern: ['threads', ':id'], handler: getThread },\r\n { method: 'PATCH', pattern: ['threads', ':id'], handler: updateThread },\r\n { method: 'DELETE', pattern: ['threads', ':id'], handler: deleteThread },\r\n { method: 'GET', pattern: ['threads', ':id', 'messages'], handler: getThreadMessages },\r\n { method: 'POST', pattern: ['threads', ':id', 'reset'], handler: resetThread },\r\n\r\n // Voice — always on, end-user-scoped real-time voice sessions\r\n // (powered by Gemini Live). Mints a ticket only; the host's own\r\n // frontend opens the WebSocket directly, this runtime never proxies it.\r\n { method: 'POST', pattern: ['voice', 'sessions'], handler: createVoiceSession },\r\n\r\n // Agents — read-only discovery always on; write ops behind agentsWrite.\r\n { method: 'GET', pattern: ['agents'], handler: listAgents },\r\n\r\n // Files — always on, end-user-scoped uploads.\r\n { method: 'GET', pattern: ['files'], handler: listFiles },\r\n { method: 'POST', pattern: ['files'], handler: uploadFile },\r\n { method: 'POST', pattern: ['files', 'bulk-delete'], handler: bulkDeleteFiles },\r\n { method: 'GET', pattern: ['files', ':id'], handler: downloadFile },\r\n { method: 'DELETE', pattern: ['files', ':id'], handler: deleteFile },\r\n\r\n // Memory — always on, end-user-scoped.\r\n { method: 'GET', pattern: ['memory'], handler: listMemory },\r\n { method: 'GET', pattern: ['memory', 'file'], handler: getMemoryFile },\r\n { method: 'PUT', pattern: ['memory', 'file'], handler: writeMemoryFile },\r\n { method: 'DELETE', pattern: ['memory', 'file'], handler: deleteMemoryFile },\r\n\r\n // MCP OAuth — always on, end-user connects their own account.\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'oauth', 'owner', 'authorize'],\r\n handler: getOwnerAuthorizeUrl,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'oauth', 'user', 'authorize'],\r\n handler: getUserAuthorizeUrl,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'oauth', 'user', 'status'],\r\n handler: getUserConnectionStatus,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['mcps', ':id', 'oauth', 'user', 'connection'],\r\n handler: disconnectUserConnection,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['mcps', ':id', 'oauth', 'owner', 'connection'],\r\n handler: disconnectOwnerConnection,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['agents', ':id', 'mcp-connections'],\r\n handler: getAgentMcpConnections,\r\n },\r\n // MCP App resources and widget tool calls — always on for conversational widgets.\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'resource'],\r\n handler: readMcpResource,\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['mcps', ':id', 'call-tool'],\r\n handler: callMcpTool,\r\n },\r\n\r\n // Workflows — read-only discovery & execution always on; authoring ops behind workflowsWrite.\r\n { method: 'GET', pattern: ['workflows'], handler: listWorkflows },\r\n { method: 'POST', pattern: ['workflows', ':id', 'stream'], handler: workflowStreamRoute },\r\n {\r\n method: 'GET',\r\n pattern: ['workflows', 'runs', ':runId', 'resume'],\r\n handler: createResumeRoute('workflow'),\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['workflows', 'runs', ':runId', 'cancel'],\r\n handler: cancelWorkflowRun,\r\n },\r\n ];\r\n\r\n // Messaging — opt-in, unlike voice: a send reaches any number the caller\r\n // names and spends this Project's Twilio balance, so it isn't\r\n // end-user-scoped even though the caller must still authenticate.\r\n if (capabilities.messages) {\r\n routes.push(\r\n { method: 'POST', pattern: ['messages'], handler: sendMessage },\r\n { method: 'POST', pattern: ['messages', 'agent'], handler: sendAgentMessage }\r\n );\r\n }\r\n\r\n if (capabilities.agentsWrite) {\r\n routes.push(\r\n { method: 'POST', pattern: ['agents'], handler: createAgent },\r\n { method: 'POST', pattern: ['agents', 'bulk-delete'], handler: bulkDeleteAgents },\r\n { method: 'GET', pattern: ['agents', ':id'], handler: getAgent },\r\n { method: 'PATCH', pattern: ['agents', ':id'], handler: updateAgent },\r\n { method: 'DELETE', pattern: ['agents', ':id'], handler: deleteAgent }\r\n );\r\n }\r\n\r\n if (capabilities.mcps) {\r\n routes.push(\r\n { method: 'GET', pattern: ['mcps'], handler: listMcps },\r\n { method: 'POST', pattern: ['mcps'], handler: createMcp },\r\n { method: 'POST', pattern: ['mcps', 'bulk-delete'], handler: bulkDeleteMcps },\r\n { method: 'GET', pattern: ['mcps', ':id'], handler: getMcp },\r\n { method: 'PATCH', pattern: ['mcps', ':id'], handler: updateMcp },\r\n { method: 'DELETE', pattern: ['mcps', ':id'], handler: deleteMcp },\r\n { method: 'GET', pattern: ['mcps', ':id', 'usage'], handler: getMcpUsage },\r\n { method: 'POST', pattern: ['mcps', ':id', 'test'], handler: testMcpConnection }\r\n );\r\n }\r\n\r\n if (capabilities.providers) {\r\n routes.push(\r\n { method: 'GET', pattern: ['providers'], handler: listProviders },\r\n { method: 'POST', pattern: ['providers'], handler: createProvider },\r\n { method: 'POST', pattern: ['providers', 'bulk-delete'], handler: bulkDeleteProviders },\r\n { method: 'GET', pattern: ['providers', ':id'], handler: getProvider },\r\n { method: 'PATCH', pattern: ['providers', ':id'], handler: updateProvider },\r\n { method: 'DELETE', pattern: ['providers', ':id'], handler: deleteProvider },\r\n { method: 'POST', pattern: ['providers', ':id', 'test'], handler: testProviderConnection },\r\n { method: 'GET', pattern: ['providers', ':id', 'models'], handler: getProviderModels },\r\n { method: 'GET', pattern: ['providers', ':id', 'usage'], handler: getProviderUsage }\r\n );\r\n }\r\n\r\n if (capabilities.skills) {\r\n routes.push(\r\n { method: 'GET', pattern: ['skills'], handler: listSkills },\r\n { method: 'POST', pattern: ['skills'], handler: createSkill },\r\n { method: 'POST', pattern: ['skills', 'bulk-delete'], handler: bulkDeleteSkills },\r\n { method: 'GET', pattern: ['skills', ':id'], handler: getSkill },\r\n { method: 'PATCH', pattern: ['skills', ':id'], handler: updateSkill },\r\n { method: 'DELETE', pattern: ['skills', ':id'], handler: deleteSkill },\r\n { method: 'GET', pattern: ['skills', ':id', 'usage'], handler: getSkillUsage }\r\n );\r\n }\r\n\r\n if (capabilities.knowledge) {\r\n routes.push(\r\n { method: 'GET', pattern: ['knowledge'], handler: listKnowledgeBases },\r\n { method: 'POST', pattern: ['knowledge'], handler: createKnowledgeBase },\r\n { method: 'POST', pattern: ['knowledge', 'bulk-delete'], handler: bulkDeleteKnowledgeBases },\r\n { method: 'GET', pattern: ['knowledge', ':id'], handler: getKnowledgeBase },\r\n { method: 'PATCH', pattern: ['knowledge', ':id'], handler: updateKnowledgeBase },\r\n { method: 'DELETE', pattern: ['knowledge', ':id'], handler: deleteKnowledgeBase },\r\n { method: 'GET', pattern: ['knowledge', ':id', 'usage'], handler: getKnowledgeBaseUsage },\r\n {\r\n method: 'POST',\r\n pattern: ['knowledge', ':id', 'documents'],\r\n handler: uploadKnowledgeDocuments,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['knowledge', ':id', 'documents'],\r\n handler: listKnowledgeDocuments,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['knowledge', ':id', 'documents', ':sourceName'],\r\n handler: deleteKnowledgeDocument,\r\n },\r\n { method: 'POST', pattern: ['knowledge', ':id', 'search'], handler: searchKnowledgeBase }\r\n );\r\n }\r\n\r\n if (capabilities.stores) {\r\n routes.push(\r\n { method: 'GET', pattern: ['stores'], handler: listStores },\r\n { method: 'POST', pattern: ['stores'], handler: createStore },\r\n { method: 'GET', pattern: ['stores', ':id'], handler: getStore },\r\n { method: 'PATCH', pattern: ['stores', ':id'], handler: updateStore },\r\n { method: 'DELETE', pattern: ['stores', ':id'], handler: deleteStore },\r\n { method: 'GET', pattern: ['stores', ':id', 'files'], handler: listStoreFiles },\r\n { method: 'GET', pattern: ['stores', ':id', 'file'], handler: getStoreFile },\r\n { method: 'PUT', pattern: ['stores', ':id', 'file'], handler: writeStoreFile },\r\n { method: 'DELETE', pattern: ['stores', ':id', 'file'], handler: deleteStoreFile }\r\n );\r\n }\r\n\r\n if (capabilities.rcpSources) {\r\n routes.push(\r\n { method: 'GET', pattern: ['rcp-sources'], handler: listRcpSources },\r\n { method: 'POST', pattern: ['rcp-sources'], handler: createRcpSource },\r\n { method: 'POST', pattern: ['rcp-sources', 'bulk-delete'], handler: bulkDeleteRcpSources },\r\n { method: 'GET', pattern: ['rcp-sources', ':id'], handler: getRcpSource },\r\n { method: 'PATCH', pattern: ['rcp-sources', ':id'], handler: updateRcpSource },\r\n { method: 'DELETE', pattern: ['rcp-sources', ':id'], handler: deleteRcpSource },\r\n { method: 'GET', pattern: ['rcp-sources', ':id', 'usage'], handler: getRcpSourceUsage },\r\n { method: 'POST', pattern: ['rcp-sources', ':id', 'test'], handler: testRcpSourceConnection }\r\n );\r\n }\r\n\r\n if (capabilities.auditLogs) {\r\n routes.push({ method: 'GET', pattern: ['audit-logs'], handler: listAuditLogs });\r\n }\r\n\r\n if (capabilities.architect) {\r\n routes.push(\r\n { method: 'POST', pattern: ['architect'], handler: architectRoute },\r\n {\r\n method: 'GET',\r\n pattern: ['architect', ':runId', 'resume'],\r\n handler: createResumeRoute('architect'),\r\n }\r\n );\r\n }\r\n\r\n if (capabilities.workflowsWrite) {\r\n routes.push(\r\n { method: 'POST', pattern: ['workflows'], handler: createWorkflow },\r\n { method: 'GET', pattern: ['workflows', ':id'], handler: getWorkflow },\r\n { method: 'PATCH', pattern: ['workflows', ':id'], handler: updateWorkflow },\r\n { method: 'DELETE', pattern: ['workflows', ':id'], handler: deleteWorkflow },\r\n { method: 'PUT', pattern: ['workflows', ':id', 'draft'], handler: saveWorkflowDraft },\r\n { method: 'POST', pattern: ['workflows', ':id', 'publish'], handler: publishWorkflow },\r\n { method: 'GET', pattern: ['workflows', ':id', 'versions'], handler: listWorkflowVersions },\r\n {\r\n method: 'GET',\r\n pattern: ['workflows', ':id', 'versions', ':version'],\r\n handler: getWorkflowVersion,\r\n },\r\n { method: 'GET', pattern: ['workflows', ':id', 'mermaid'], handler: getWorkflowMermaid },\r\n { method: 'GET', pattern: ['workflows', ':id', 'runs'], handler: listWorkflowRuns },\r\n { method: 'GET', pattern: ['workflows', 'runs', ':runId'], handler: getWorkflowRun }\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\nfunction resolveMode(options: CreateRuntimeOptions): 'development' | 'production' {\r\n if (options.mode) return options.mode;\r\n return process.env.NODE_ENV === 'development' ? 'development' : 'production';\r\n}\r\n\r\nexport function createRuntime(options: CreateRuntimeOptions): Runtime {\r\n if (!options.baseUrl) throw new Error('createRuntime: \"baseUrl\" is required');\r\n if (!options.credential) throw new Error('createRuntime: \"credential\" is required');\r\n if (!options.resolveUser) throw new Error('createRuntime: \"resolveUser\" is required');\r\n\r\n const logger: Logger =\r\n options.logger ??\r\n createLogger(\r\n 'runtime',\r\n options.logLevel !== undefined ? { level: options.logLevel } : undefined\r\n );\r\n\r\n const capabilities = resolveCapabilities(options.capabilities);\r\n const routes = buildRoutes(capabilities);\r\n if (options.restToolsManifest) {\r\n // Not capability-gated — this route serves the host's own static data\r\n // (never calls PersonaClient) and is only added when configured at all.\r\n routes.push({\r\n method: 'GET',\r\n pattern: ['rest-tools', 'manifest'],\r\n handler: restToolsManifestRoute,\r\n requiresAuth: false,\r\n });\r\n }\r\n if (options.rcpManifest) {\r\n // Independent of restToolsManifest above — unrelated protocols, both\r\n // servable from the same runtime instance.\r\n routes.push({\r\n method: 'GET',\r\n pattern: ['rcp', 'manifest'],\r\n handler: rcpManifestRoute,\r\n requiresAuth: false,\r\n });\r\n }\r\n if (options.channels?.twilio) {\r\n // Bring-your-own-Twilio-number webhooks. Public by design: Twilio carries\r\n // no end-user session, so each handler verifies X-Twilio-Signature with\r\n // the host's own auth token and resolves the sender itself. Only exist\r\n // when configured at all.\r\n routes.push(\r\n {\r\n method: 'POST',\r\n pattern: ['channels', 'twilio', 'voice'],\r\n handler: twilioVoiceChannel,\r\n requiresAuth: false,\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['channels', 'twilio', 'message'],\r\n handler: twilioMessageChannel,\r\n requiresAuth: false,\r\n }\r\n );\r\n }\r\n const mode = resolveMode(options);\r\n const heartbeatIntervalMs = options.heartbeatIntervalMs ?? 15000;\r\n\r\n const runGraceMs = options.runGraceMs ?? DEFAULT_RUN_GRACE_MS;\r\n const maxTrackedRuns = options.maxTrackedRuns ?? DEFAULT_MAX_TRACKED_RUNS;\r\n\r\n logger.debug('runtime init', {\r\n mode,\r\n mountPath: options.mountPath ?? '',\r\n capabilities,\r\n heartbeatIntervalMs,\r\n runGraceMs,\r\n maxTrackedRuns,\r\n });\r\n const enabledCaps = Object.entries(capabilities)\r\n .filter(([, v]) => v)\r\n .map(([k]) => k);\r\n logger.info('runtime created', {\r\n mode,\r\n mountPath: options.mountPath ?? '',\r\n enabledCapabilities: enabledCaps.length ? enabledCaps : ['(core only)'],\r\n });\r\n logger.trace('runtime config', {\r\n baseUrl: options.baseUrl,\r\n hasHooks: !!options.hooks,\r\n routeCount: routes.length,\r\n });\r\n\r\n const runs = new Map<string, RunDriver>();\r\n const evictionTimer = setInterval(() => {\r\n const before = runs.size;\r\n evictStaleRuns(runs, Date.now(), runGraceMs, maxTrackedRuns);\r\n if (runs.size !== before) {\r\n logger.debug('run eviction sweep', { before, after: runs.size, runGraceMs, maxTrackedRuns });\r\n } else {\r\n logger.trace('run eviction sweep — no evictions', { before });\r\n }\r\n }, 60_000);\r\n evictionTimer.unref?.();\r\n\r\n function getRequestPreview(req: RuntimeRequest): Record<string, unknown> {\r\n const preview: Record<string, unknown> = {\r\n method: req.method,\r\n path: req.path,\r\n hasQuery: req.query && Object.keys(req.query).length > 0,\r\n hasBody: req.body !== undefined,\r\n hasFile: !!req.file,\r\n fileCount: req.files?.length ?? 0,\r\n userId: req.userId ?? null,\r\n };\r\n // Redact sensitive header values at trace level only\r\n if (req.headers) {\r\n const redacted: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(req.headers)) {\r\n if (v === undefined) continue;\r\n if (k.toLowerCase() === 'authorization') redacted[k] = '***';\r\n else redacted[k] = v;\r\n }\r\n preview.headers = redacted;\r\n }\r\n if (req.query && Object.keys(req.query).length) preview.query = req.query;\r\n return preview;\r\n }\r\n\r\n async function handle(request: RuntimeRequest): Promise<RuntimeResponse> {\r\n const startMs = Date.now();\r\n logger.debug('handle start', { method: request.method, path: request.path });\r\n logger.trace('handle request details', getRequestPreview(request));\r\n\r\n try {\r\n const path = stripMountPath(request.path, options.mountPath);\r\n logger.trace('stripMountPath', {\r\n originalPath: request.path,\r\n mountPath: options.mountPath ?? '',\r\n strippedPath: path,\r\n });\r\n\r\n const match = matchRoute(routes, request.method, path);\r\n\r\n if (match.kind === 'not-found') {\r\n logger.warn('route not found', {\r\n method: request.method,\r\n path: request.path,\r\n strippedPath: path,\r\n });\r\n throw new RuntimeHttpError(\r\n 404,\r\n 'NOT_FOUND',\r\n `No route for ${request.method} ${request.path}`\r\n );\r\n }\r\n if (match.kind === 'method-not-allowed') {\r\n logger.warn('method not allowed', {\r\n method: request.method,\r\n path: request.path,\r\n strippedPath: path,\r\n allowed: match.allowed,\r\n });\r\n const err = new RuntimeHttpError(\r\n 405,\r\n 'METHOD_NOT_ALLOWED',\r\n `${request.method} not allowed on ${request.path}. Allowed: ${match.allowed.join(', ')}.`\r\n );\r\n const response = errorToResponse(err, mode);\r\n logger.debug('handle completed — 405', {\r\n method: request.method,\r\n path: request.path,\r\n allowed: match.allowed,\r\n durationMs: Date.now() - startMs,\r\n });\r\n return { ...response, headers: { ...response.headers, Allow: match.allowed.join(', ') } };\r\n }\r\n\r\n logger.info('route matched', {\r\n method: request.method,\r\n path: request.path,\r\n strippedPath: path,\r\n pattern: match.route.pattern.join('/'),\r\n params: match.params,\r\n requiresAuth: match.route.requiresAuth !== false,\r\n });\r\n logger.debug('route matched', {\r\n method: request.method,\r\n path,\r\n pattern: match.route.pattern,\r\n params: match.params,\r\n });\r\n logger.trace('route handler', {\r\n handler: match.route.handler.name || 'anonymous',\r\n pattern: match.route.pattern,\r\n });\r\n\r\n let userId: string | null = null;\r\n if (match.route.requiresAuth !== false) {\r\n logger.debug('resolving user', { path: request.path });\r\n try {\r\n const resolved = await options.resolveUser(request);\r\n userId = typeof resolved === 'string' && resolved.length > 0 ? resolved : null;\r\n logger.trace('resolveUser result', { userId: userId ?? null, hasResult: !!userId });\r\n } catch (err) {\r\n userId = null;\r\n logger.warn('resolveUser threw', {\r\n path: request.path,\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n }\r\n if (userId === null) {\r\n logger.warn('unauthorized — could not resolve user', {\r\n method: request.method,\r\n path: request.path,\r\n });\r\n throw new RuntimeHttpError(\r\n 401,\r\n 'UNAUTHORIZED',\r\n 'Could not resolve an authenticated user for this request.'\r\n );\r\n }\r\n logger.debug('user resolved', { userId });\r\n } else {\r\n logger.debug('skipping auth for public route', { path: request.path });\r\n }\r\n\r\n const resolvedRequest: RuntimeRequest = { ...request, userId };\r\n const client = createClientForRequest(options, userId, logger);\r\n const routeLogger = logger.child('route');\r\n\r\n logger.debug('handler start', {\r\n method: request.method,\r\n path: request.path,\r\n handler: match.route.handler.name || 'anonymous',\r\n userId,\r\n });\r\n\r\n const response = await match.route.handler(resolvedRequest, {\r\n client,\r\n hooks: options.hooks,\r\n mode,\r\n params: match.params,\r\n heartbeatIntervalMs,\r\n runs,\r\n capabilities,\r\n logger: routeLogger,\r\n restToolsManifest: options.restToolsManifest,\r\n rcpManifest: options.rcpManifest,\r\n channels: options.channels,\r\n });\r\n\r\n const durationMs = Date.now() - startMs;\r\n logger.info('handle succeeded', {\r\n method: request.method,\r\n path: request.path,\r\n status: response.status,\r\n kind: response.kind,\r\n durationMs,\r\n userId,\r\n });\r\n logger.debug('handle completed', {\r\n method: request.method,\r\n path: request.path,\r\n status: response.status,\r\n durationMs,\r\n });\r\n logger.trace('handle response details', {\r\n method: request.method,\r\n path: request.path,\r\n status: response.status,\r\n headers: response.headers,\r\n kind: response.kind,\r\n durationMs,\r\n });\r\n\r\n return response;\r\n } catch (err) {\r\n const durationMs = Date.now() - startMs;\r\n const isHttpError = err instanceof RuntimeHttpError;\r\n // Upstream failures surface as PersonaApiError (from the SDK HTTP\r\n // client), not RuntimeHttpError — they were previously misclassified\r\n // as \"unexpected\" with code/status dropped, so the log said\r\n // `code: undefined, status: undefined` even when the exact upstream\r\n // status and code were known. Both shapes are recognized now.\r\n const isApiError = !isHttpError && err instanceof PersonaApiError;\r\n const failureStatus = isHttpError\r\n ? (err as RuntimeHttpError).status\r\n : isApiError\r\n ? err.statusCode\r\n : undefined;\r\n const meta = {\r\n method: request.method,\r\n path: request.path,\r\n durationMs,\r\n error: err instanceof Error ? err.message : String(err),\r\n code: isHttpError\r\n ? (err as RuntimeHttpError).code\r\n : isApiError\r\n ? err.code\r\n : undefined,\r\n status: failureStatus,\r\n };\r\n if (failureStatus !== undefined && failureStatus >= 500) {\r\n logger.error('handle failed — server error', meta);\r\n } else if (failureStatus !== undefined && failureStatus >= 400) {\r\n logger.warn('handle failed — client error', meta);\r\n } else {\r\n logger.error('handle failed — unexpected error', meta);\r\n }\r\n logger.trace('handle error details', { error: err, durationMs });\r\n return errorToResponse(err, mode);\r\n }\r\n }\r\n\r\n return {\r\n handle,\r\n close() {\r\n logger.debug('runtime close', { trackedRuns: runs.size });\r\n clearInterval(evictionTimer);\r\n logger.info('runtime closed', { trackedRuns: runs.size });\r\n },\r\n };\r\n}\r\n","import type { RunDriver } from './runDriver.js';\r\n\r\n/** How long a finished run stays resumable before it's evicted. */\r\nexport const DEFAULT_RUN_GRACE_MS = 5 * 60 * 1000;\r\n/** Safety valve against unbounded growth from many short-lived runs whose clients never reconnect. */\r\nexport const DEFAULT_MAX_TRACKED_RUNS = 1000;\r\n\r\n/**\r\n * Removes finished runs older than `graceMs`, then (if still over\r\n * `maxTracked`) evicts the oldest-finished runs until back under the cap.\r\n * Still-in-flight runs are never evicted by the cap — only completed ones.\r\n * Pure function over the registry Map so it's directly unit-testable\r\n * without waiting on a real timer.\r\n */\r\nexport function evictStaleRuns(\r\n runs: Map<string, RunDriver>,\r\n now: number,\r\n graceMs: number = DEFAULT_RUN_GRACE_MS,\r\n maxTracked: number = DEFAULT_MAX_TRACKED_RUNS\r\n): void {\r\n for (const [id, driver] of runs) {\r\n if (\r\n driver.isFinished() &&\r\n driver.finishedAt !== undefined &&\r\n now - driver.finishedAt > graceMs\r\n ) {\r\n runs.delete(id);\r\n }\r\n }\r\n\r\n const overBy = runs.size - maxTracked;\r\n if (overBy <= 0) return;\r\n\r\n const finished = [...runs.entries()]\r\n .filter(([, driver]) => driver.isFinished())\r\n .sort((a, b) => (a[1].finishedAt ?? 0) - (b[1].finishedAt ?? 0));\r\n\r\n let remaining = overBy;\r\n for (const [id] of finished) {\r\n if (remaining <= 0) break;\r\n runs.delete(id);\r\n remaining -= 1;\r\n }\r\n}\r\n","export const RUNTIME_VERSION = '0.22.0';\n","import type { RouteHandler } from '../routing.js';\r\nimport { errorToResponse } from '../errors.js';\r\nimport { RUNTIME_VERSION } from '../version.js';\r\n\r\nconst alwaysOnCapabilities = {\r\n chat: true,\r\n threads: true,\r\n agents: true,\r\n files: true,\r\n memory: true,\r\n mcpOAuth: true,\r\n workflows: true,\r\n};\r\n\r\n/**\r\n * Liveness/capability probe — deliberately does not require `resolveUser`\r\n * (this route's `requiresAuth: false`, so `request.userId` stays `null` and\r\n * `ctx.client` is naturally a bare, Project-scoped client). It's for\r\n * monitoring/status pages, not a user-scoped call; a host that wants it\r\n * gated behind auth can do so in its own router before mounting.\r\n *\r\n * `capabilities` in the response reflects the *actual* resolved\r\n * `RuntimeCapabilities` this instance was created with, not just which\r\n * routes always exist — a monitoring tool can use this to confirm a\r\n * deployment's admin surface is (or isn't) live without guessing from\r\n * config files.\r\n */\r\nexport const healthRoute: RouteHandler = async (_request, ctx) => {\r\n try {\r\n await ctx.client.whoami();\r\n } catch (err) {\r\n const failed = errorToResponse(err, ctx.mode);\r\n return { ...failed, status: 503 };\r\n }\r\n\r\n return {\r\n kind: 'buffered',\r\n status: 200,\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n status: 'ok',\r\n version: RUNTIME_VERSION,\r\n capabilities: { ...alwaysOnCapabilities, ...ctx.capabilities },\r\n }),\r\n };\r\n};\r\n","import type { FrontendToolDefinition } from '@personaai/sdk';\r\nimport { RuntimeHttpError } from './errors.js';\r\nimport type { RuntimeBufferedResponse } from './types/response.js';\r\n\r\n/**\r\n * Frontend tools from the browser (`@personaai/react`'s useFrontendTool &\r\n * co.) — on `POST /chat` and `POST /voice/session`. Only the outer shape is\r\n * checked here (a 400 otherwise); each entry's name/schema is validated (and\r\n * invalid ones dropped) by the backend, which also ignores them entirely\r\n * unless the Agent has `frontendToolsEnabled`. Empty → undefined.\r\n */\r\nexport function parseFrontendTools(value: unknown): FrontendToolDefinition[] | undefined {\r\n if (value === undefined || value === null) return undefined;\r\n if (\r\n !Array.isArray(value) ||\r\n !value.every((t) => typeof t === 'object' && t !== null && typeof t.name === 'string')\r\n ) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"tools\" must be an array of { name, description?, parameters? } objects.'\r\n );\r\n }\r\n return value.length > 0 ? (value as FrontendToolDefinition[]) : undefined;\r\n}\r\n\r\nexport function json(status: number, value: unknown): RuntimeBufferedResponse {\r\n return {\r\n kind: 'buffered',\r\n status,\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify(value),\r\n };\r\n}\r\n\r\nexport function noContent(): RuntimeBufferedResponse {\r\n return { kind: 'buffered', status: 204, headers: {}, body: '' };\r\n}\r\n\r\nexport function requireParam(params: Record<string, string>, name: string): string {\r\n const value = params[name];\r\n if (!value) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `\"${name}\" path parameter is required.`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function requireQueryParam(query: Record<string, string | undefined>, name: string): string {\r\n const value = query[name];\r\n if (!value) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `\"${name}\" query parameter is required.`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function toInt(value: string | undefined): number | undefined {\r\n if (value === undefined) return undefined;\r\n const parsed = Number.parseInt(value, 10);\r\n return Number.isNaN(parsed) ? undefined : parsed;\r\n}\r\n\r\nexport function requireBodyObject(body: unknown): Record<string, unknown> {\r\n if (typeof body !== 'object' || body === null) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\r\n }\r\n return body as Record<string, unknown>;\r\n}\r\n\r\nexport function requireStringField(body: Record<string, unknown>, field: string): string {\r\n const value = body[field];\r\n if (typeof value !== 'string' || value.length === 0) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `\"${field}\" is required and must be a string.`\r\n );\r\n }\r\n return value;\r\n}\r\n\r\n// TURN_CONTEXT_RCP_RESOLVERS_PLAN.md — mirrors agent-backend's\r\n// agui/turnContext.js#validateTurnContext exactly, so a bad `context` body\r\n// field fails fast here rather than round-tripping to the backend first.\r\n// Distinct from `contextOverride` (a plain string, no shape validation\r\n// beyond length): `context` is never shown to the model, only ever read\r\n// live by an RCP tool's resolver.\r\nconst MAX_TURN_CONTEXT_BYTES = 2000;\r\n\r\nexport function validateTurnContext(value: unknown): Record<string, unknown> | undefined {\r\n if (value === undefined) return undefined;\r\n\r\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\r\n throw new RuntimeHttpError(400, 'INVALID_CONTEXT', 'context must be a flat object.');\r\n }\r\n\r\n const context = value as Record<string, unknown>;\r\n for (const [key, entry] of Object.entries(context)) {\r\n const entryType = typeof entry;\r\n if (entryType !== 'string' && entryType !== 'number' && entryType !== 'boolean') {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_CONTEXT',\r\n `context.${key} must be a string, number, or boolean.`\r\n );\r\n }\r\n }\r\n\r\n // TextEncoder, not Buffer — this package must stay Edge-runtime\r\n // compatible (no node:* imports, no Node-only globals).\r\n const byteLength = new TextEncoder().encode(JSON.stringify(context)).length;\r\n if (byteLength > MAX_TURN_CONTEXT_BYTES) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'CONTEXT_TOO_LARGE',\r\n `context must be ${MAX_TURN_CONTEXT_BYTES} bytes or fewer when serialized.`\r\n );\r\n }\r\n\r\n return context;\r\n}\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json } from '../routeHelpers.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\n\r\n/**\r\n * Serves the configured `restToolsManifest.tools` list as\r\n * `{ tools: [...] }` — the shape a Persona REST Tool Source's Test\r\n * Connection expects. Never touches `PersonaClient`; this is pure host-side\r\n * data. `requiresAuth: false` at the route-table level (see `runtime.ts`) —\r\n * this is Persona-to-server traffic authenticated by its own bearer token\r\n * below, not an end-user request needing `resolveUser`.\r\n */\r\nexport const restToolsManifestRoute: RouteHandler = async (request, ctx) => {\r\n const manifest = ctx.restToolsManifest;\r\n if (!manifest) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'No REST tools manifest is configured.');\r\n }\r\n\r\n if (manifest.authToken) {\r\n const header = request.headers.authorization;\r\n const expected = `Bearer ${manifest.authToken}`;\r\n if (header !== expected) {\r\n throw new RuntimeHttpError(401, 'UNAUTHORIZED', 'Invalid or missing manifest bearer token.');\r\n }\r\n }\r\n\r\n return json(200, { tools: manifest.tools });\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json } from '../routeHelpers.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\n\r\n/**\r\n * Serves the configured `rcpManifest.tools` list as a conformant RCP\r\n * manifest — `{ rcpVersion, auth, tools }` — the shape any RCP client's\r\n * `discover()` expects. Never touches `PersonaClient`; this is pure\r\n * host-side data, unrelated to `restToolsManifestRoute`.\r\n * `requiresAuth: false` at the route-table level (see `runtime.ts`) — this\r\n * is client-to-server traffic authenticated by its own bearer token below,\r\n * not an end-user request needing `resolveUser`.\r\n */\r\nexport const rcpManifestRoute: RouteHandler = async (request, ctx) => {\r\n const manifest = ctx.rcpManifest;\r\n if (!manifest) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'No RCP manifest is configured.');\r\n }\r\n\r\n if (manifest.authToken) {\r\n const header = request.headers.authorization;\r\n const expected = `Bearer ${manifest.authToken}`;\r\n if (header !== expected) {\r\n throw new RuntimeHttpError(401, 'UNAUTHORIZED', 'Invalid or missing manifest bearer token.');\r\n }\r\n }\r\n\r\n return json(200, {\r\n rcpVersion: '0.1',\r\n auth: manifest.authToken\r\n ? { type: 'header', header: 'Authorization', scheme: 'Bearer' }\r\n : { type: 'none' },\r\n tools: manifest.tools,\r\n });\r\n};\r\n","import { EventType, type AguiEvent } from '@personaai/sdk';\r\nimport type { RunContext, RunResult, RuntimeHooks } from './types/hooks.js';\r\nimport { mapErrorToRuntimeError } from './errors.js';\r\n\r\n/**\r\n * Serializes one AG-UI event back out as an SSE frame — matches\r\n * `@personaai/sdk`'s own inbound `parseAguiEventStream` format byte-for-byte\r\n * (`data: <json>\\n\\n`, no `event:`/`id:` line), so a consumer using this SDK\r\n * to read the runtime's output round-trips cleanly.\r\n */\r\nexport function formatSseFrame(event: AguiEvent): string {\r\n return `data: ${JSON.stringify(event)}\\n\\n`;\r\n}\r\n\r\n/** A sanitized in-band RUN_ERROR frame for a failure that happens mid-stream, after headers are already committed. */\r\nexport function runErrorFrame(err: unknown, mode: 'development' | 'production'): string {\r\n const mapped = mapErrorToRuntimeError(err, mode);\r\n return formatSseFrame({\r\n type: EventType.RUN_ERROR,\r\n code: mapped.code,\r\n message: mapped.message,\r\n } as AguiEvent);\r\n}\r\n\r\ninterface Accumulator {\r\n text: string;\r\n interrupted: boolean;\r\n erroredInBand: boolean;\r\n threadCreateFired: boolean;\r\n toolNames: Map<string, string>;\r\n nodeMeta: Map<string, { nodeType: string; nodeLabel: string }>;\r\n}\r\n\r\nfunction newAccumulator(): Accumulator {\r\n return {\r\n text: '',\r\n interrupted: false,\r\n erroredInBand: false,\r\n threadCreateFired: false,\r\n toolNames: new Map(),\r\n nodeMeta: new Map(),\r\n };\r\n}\r\n\r\n/** Applies one event's effect on the running accumulator and fires any lifecycle hooks it triggers. */\r\nasync function processEvent(\r\n event: AguiEvent,\r\n acc: Accumulator,\r\n runCtx: RunContext,\r\n hooks: RuntimeHooks | undefined\r\n): Promise<void> {\r\n const e = event as Record<string, unknown> & { type: string };\r\n\r\n switch (e.type) {\r\n case EventType.RUN_STARTED: {\r\n const threadId = typeof e.threadId === 'string' ? e.threadId : undefined;\r\n // Only chat runs have threads; the Architect co-pilot doesn't.\r\n if (\r\n runCtx.kind === 'chat' &&\r\n runCtx.agentId &&\r\n !acc.threadCreateFired &&\r\n !runCtx.threadId &&\r\n threadId\r\n ) {\r\n acc.threadCreateFired = true;\r\n await hooks?.onThreadCreate?.({ userId: runCtx.userId, agentId: runCtx.agentId, threadId });\r\n }\r\n break;\r\n }\r\n case EventType.TEXT_MESSAGE_CHUNK: {\r\n const delta = e.delta;\r\n if (typeof delta === 'string') acc.text += delta;\r\n break;\r\n }\r\n case EventType.CUSTOM: {\r\n if (e.name === 'hitl_request' || e.name === 'clarification_request') {\r\n acc.interrupted = true;\r\n } else if (e.name === 'workflow_node_started') {\r\n const val = (e.value ?? {}) as Record<string, unknown>;\r\n const nodeId = String(val.nodeId ?? '');\r\n const nodeType = String(val.nodeType ?? '');\r\n const nodeLabel = String(val.nodeLabel ?? '');\r\n if (nodeId) acc.nodeMeta.set(nodeId, { nodeType, nodeLabel });\r\n if (runCtx.workflowId) {\r\n await hooks?.beforeWorkflowNode?.({\r\n userId: runCtx.userId,\r\n workflowId: runCtx.workflowId,\r\n nodeId,\r\n nodeType,\r\n nodeLabel,\r\n input: val.input,\r\n });\r\n }\r\n } else if (e.name === 'workflow_node_completed') {\r\n const val = (e.value ?? {}) as Record<string, unknown>;\r\n const nodeId = String(val.nodeId ?? '');\r\n const meta = acc.nodeMeta.get(nodeId);\r\n const nodeType = String(val.nodeType ?? meta?.nodeType ?? '');\r\n const nodeLabel = String(val.nodeLabel ?? meta?.nodeLabel ?? '');\r\n if (runCtx.workflowId) {\r\n await hooks?.afterWorkflowNode?.(\r\n {\r\n userId: runCtx.userId,\r\n workflowId: runCtx.workflowId,\r\n nodeId,\r\n nodeType,\r\n nodeLabel,\r\n },\r\n val.output ?? (val as Record<string, unknown>)\r\n );\r\n }\r\n } else if (e.name === 'workflow_node_failed') {\r\n acc.erroredInBand = true;\r\n }\r\n break;\r\n }\r\n case EventType.RUN_ERROR: {\r\n acc.erroredInBand = true;\r\n break;\r\n }\r\n case EventType.TOOL_CALL_START: {\r\n const toolCallId = typeof e.toolCallId === 'string' ? e.toolCallId : undefined;\r\n const toolCallName = typeof e.toolCallName === 'string' ? e.toolCallName : 'unknown_tool';\r\n if (toolCallId) {\r\n acc.toolNames.set(toolCallId, toolCallName);\r\n await hooks?.beforeToolCall?.({\r\n userId: runCtx.userId,\r\n agentId: runCtx.agentId,\r\n threadId: runCtx.threadId,\r\n toolName: toolCallName,\r\n toolCallId,\r\n });\r\n }\r\n break;\r\n }\r\n case EventType.TOOL_CALL_RESULT: {\r\n const toolCallId = typeof e.toolCallId === 'string' ? e.toolCallId : undefined;\r\n if (toolCallId) {\r\n await hooks?.afterToolCall?.(\r\n {\r\n userId: runCtx.userId,\r\n agentId: runCtx.agentId,\r\n threadId: runCtx.threadId,\r\n toolName: acc.toolNames.get(toolCallId) ?? 'unknown_tool',\r\n toolCallId,\r\n },\r\n e.content\r\n );\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n}\r\n\r\ntype FrameListener = (seq: number, frame: string) => void;\r\ntype DoneListener = () => void;\r\n\r\n/**\r\n * Owns pumping one chat run's AG-UI events out of `@personaai/sdk`,\r\n * independent of any single HTTP response. Created once per run and kept\r\n * running (buffering every formatted SSE frame, with a sequence number)\r\n * regardless of whether the original request's connection is still\r\n * attached — this is what makes reconnect possible: a later request can\r\n * `subscribe()` to the SAME driver, replay the frames it missed, and pick\r\n * up the live tail.\r\n *\r\n * Lifecycle hooks (`beforeRun` is fired by the caller before construction;\r\n * everything else) fire exactly once here, regardless of how many\r\n * subscribers ever attach — never once per subscriber.\r\n */\r\nexport class RunDriver {\r\n readonly runId: string;\r\n readonly runCtx: RunContext;\r\n createdAt = Date.now();\r\n finishedAt: number | undefined;\r\n\r\n private frames: string[] = [];\r\n private listeners = new Set<FrameListener>();\r\n private doneListeners = new Set<DoneListener>();\r\n private finished = false;\r\n private firstFrameSettled = false;\r\n private firstFramePromise: Promise<void>;\r\n private resolveFirstFrame!: () => void;\r\n private rejectFirstFrame!: (err: unknown) => void;\r\n\r\n constructor(\r\n runId: string,\r\n runCtx: RunContext,\r\n source: AsyncGenerator<AguiEvent>,\r\n hooks: RuntimeHooks | undefined,\r\n mode: 'development' | 'production'\r\n ) {\r\n this.runId = runId;\r\n this.runCtx = runCtx;\r\n this.firstFramePromise = new Promise((resolve, reject) => {\r\n this.resolveFirstFrame = resolve;\r\n this.rejectFirstFrame = reject;\r\n });\r\n void this.pump(source, hooks, mode);\r\n }\r\n\r\n private push(frame: string): void {\r\n const seq = this.frames.length;\r\n this.frames.push(frame);\r\n for (const listener of this.listeners) listener(seq, frame);\r\n if (!this.firstFrameSettled) {\r\n this.firstFrameSettled = true;\r\n this.resolveFirstFrame();\r\n }\r\n }\r\n\r\n private finish(): void {\r\n this.finished = true;\r\n this.finishedAt = Date.now();\r\n for (const listener of this.doneListeners) listener();\r\n }\r\n\r\n private async pump(\r\n source: AsyncGenerator<AguiEvent>,\r\n hooks: RuntimeHooks | undefined,\r\n mode: 'development' | 'production'\r\n ): Promise<void> {\r\n const acc = newAccumulator();\r\n let count = 0;\r\n\r\n try {\r\n for await (const event of source) {\r\n await processEvent(event, acc, this.runCtx, hooks);\r\n count += 1;\r\n this.push(formatSseFrame(event));\r\n }\r\n\r\n if (!this.firstFrameSettled) {\r\n // The upstream stream completed successfully but produced zero\r\n // events — a valid empty run, not an error. Resolve rather than\r\n // leaving `waitForFirstFrame()` hanging forever.\r\n this.firstFrameSettled = true;\r\n this.resolveFirstFrame();\r\n }\r\n\r\n const result: RunResult = {\r\n text: acc.text,\r\n eventCount: count,\r\n interrupted: acc.interrupted,\r\n erroredInBand: acc.erroredInBand,\r\n };\r\n try {\r\n await hooks?.afterRun?.(this.runCtx, result);\r\n } catch {\r\n // afterRun is a post-hoc side-effect listener — the run itself\r\n // already succeeded. Its failure must not be conflated with a run\r\n // failure (onError) or corrupt an already-finished stream with a\r\n // synthesized RUN_ERROR frame.\r\n }\r\n } catch (err) {\r\n await hooks?.onError?.(\r\n {\r\n userId: this.runCtx.userId,\r\n phase: this.runCtx.kind,\r\n agentId: this.runCtx.agentId,\r\n workflowId: this.runCtx.workflowId,\r\n threadId: this.runCtx.threadId,\r\n },\r\n err\r\n );\r\n\r\n if (!this.firstFrameSettled) {\r\n // Nothing was ever buffered — the very first upstream call failed\r\n // (auth/validation/network). The caller hasn't committed to a\r\n // streaming response yet and can still return a clean buffered\r\n // error instead.\r\n this.firstFrameSettled = true;\r\n this.rejectFirstFrame(err);\r\n return;\r\n }\r\n // Headers are already committed for every existing/future\r\n // subscriber — surface the failure as an in-band RUN_ERROR frame.\r\n this.push(runErrorFrame(err, mode));\r\n } finally {\r\n this.finish();\r\n }\r\n }\r\n\r\n /** Resolves once the first frame has been buffered, or rejects if the run failed before producing any frame at all. */\r\n waitForFirstFrame(): Promise<void> {\r\n return this.firstFramePromise;\r\n }\r\n\r\n isFinished(): boolean {\r\n return this.finished;\r\n }\r\n\r\n /** Total frames buffered so far — also the highest valid `since` a caller can request without missing anything. */\r\n get frameCount(): number {\r\n return this.frames.length;\r\n }\r\n\r\n /** Number of currently-live subscriptions (each `subscribe()` iterator that's been started but not yet exhausted/torn down). Exposed for tests verifying subscriptions clean up after themselves. */\r\n get subscriberCount(): number {\r\n return this.listeners.size;\r\n }\r\n\r\n /**\r\n * An async iterable that replays every buffered frame after `sinceSeq`\r\n * (`-1` for \"from the start\"), then continues yielding new frames live\r\n * as the run produces them, until the run finishes. Each call returns an\r\n * independent subscription — multiple concurrent subscribers (e.g. the\r\n * original connection plus a reconnect that raced it) are supported.\r\n */\r\n subscribe(sinceSeq: number): AsyncIterable<string> {\r\n const buffered = this.frames.slice(Math.max(sinceSeq + 1, 0));\r\n const finishedAtSubscribeTime = this.finished;\r\n const listeners = this.listeners;\r\n const doneListeners = this.doneListeners;\r\n\r\n return {\r\n [Symbol.asyncIterator](): AsyncIterator<string> {\r\n const queue: string[] = [...buffered];\r\n let live = !finishedAtSubscribeTime;\r\n let wake: (() => void) | null = null;\r\n\r\n const onFrame: FrameListener = (_seq, frame) => {\r\n queue.push(frame);\r\n wake?.();\r\n };\r\n const onDone: DoneListener = () => {\r\n live = false;\r\n wake?.();\r\n };\r\n\r\n if (live) {\r\n listeners.add(onFrame);\r\n doneListeners.add(onDone);\r\n }\r\n\r\n const cleanup = () => {\r\n listeners.delete(onFrame);\r\n doneListeners.delete(onDone);\r\n };\r\n\r\n return {\r\n async next(): Promise<IteratorResult<string>> {\r\n for (;;) {\r\n if (queue.length > 0) return { done: false, value: queue.shift()! };\r\n if (!live) {\r\n cleanup();\r\n return { done: true, value: undefined };\r\n }\r\n await new Promise<void>((resolve) => (wake = resolve));\r\n }\r\n },\r\n async return(): Promise<IteratorResult<string>> {\r\n cleanup();\r\n return { done: true, value: undefined };\r\n },\r\n };\r\n },\r\n };\r\n }\r\n}\r\n","/** An SSE comment line — ignored by any `data:`-only parser (including `@personaai/sdk`'s own), never changes the AG-UI event sequence a consumer sees. */\r\nconst HEARTBEAT_FRAME = ': heartbeat\\n\\n';\r\n\r\nconst TIMEOUT = Symbol('heartbeat-timeout');\r\n\r\nfunction heartbeatTimer(ms: number): { promise: Promise<typeof TIMEOUT>; cancel: () => void } {\r\n let handle: ReturnType<typeof setTimeout>;\r\n const promise = new Promise<typeof TIMEOUT>((resolve) => {\r\n handle = setTimeout(() => resolve(TIMEOUT), ms);\r\n });\r\n return { promise, cancel: () => clearTimeout(handle) };\r\n}\r\n\r\n/**\r\n * Interleaves `HEARTBEAT_FRAME`s into any SSE frame source during a gap\r\n * longer than `intervalMs` between real frames, without breaking pull-based\r\n * backpressure: `source`'s iterator's `next()` is only ever called once per\r\n * real frame — a heartbeat firing just re-races the *same* pending `next()`\r\n * promise against a fresh timer, it never issues an extra pull ahead of\r\n * what the consumer has actually asked for.\r\n *\r\n * Always calls the underlying iterator's `return()` on the way out — via\r\n * the `finally` block, which fires whether this generator runs to\r\n * completion, throws, or is torn down early by its own consumer (e.g. an\r\n * adapter cancelling because the client disconnected). This matters when\r\n * `source` is a `RunDriver.subscribe()` iterable: skipping it would leak\r\n * that subscription's listener registration for the lifetime of the run.\r\n */\r\nexport async function* withHeartbeats(\r\n source: AsyncIterable<string>,\r\n intervalMs = 15000\r\n): AsyncGenerator<string> {\r\n const iterator = source[Symbol.asyncIterator]();\r\n\r\n try {\r\n let pending: Promise<IteratorResult<string>> | null = null;\r\n\r\n for (;;) {\r\n pending ??= iterator.next();\r\n const timer = heartbeatTimer(intervalMs);\r\n const winner = await Promise.race([pending, timer.promise]);\r\n timer.cancel();\r\n\r\n if (winner === TIMEOUT) {\r\n yield HEARTBEAT_FRAME;\r\n continue; // re-race the same pending next() call, no extra pull\r\n }\r\n\r\n pending = null;\r\n if (winner.done) return;\r\n yield winner.value;\r\n }\r\n } finally {\r\n await iterator.return?.();\r\n }\r\n}\r\n","import type {\r\n ChatAttachmentInput,\r\n ChatMessageInput,\r\n ChatResume,\r\n FrontendToolDefinition,\r\n} from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { RunDriver } from '../runDriver.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport { parseFrontendTools, validateTurnContext } from '../routeHelpers.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\ninterface ChatBody {\r\n agentId: string;\r\n messages: ChatMessageInput[];\r\n threadId?: string;\r\n resume?: ChatResume;\r\n contextOverride?: string;\r\n context?: Record<string, unknown>;\r\n tools?: FrontendToolDefinition[];\r\n attachments?: ChatAttachmentInput[];\r\n}\r\n\r\n// Same cap as the backend (IMAGE_ATTACHMENT_LIMITS.maxImagesPerMessage) —\r\n// rejected here so an oversized request never reaches the API.\r\nconst MAX_ATTACHMENTS = 4;\r\n\r\n/**\r\n * Images for this turn (`@personaai/react`'s useAttachments): ids of files\r\n * this same end user uploaded through `POST /files`. The backend checks\r\n * ownership, type and size, and ignores them unless the Agent has\r\n * `imageInputEnabled`.\r\n */\r\nfunction parseAttachments(value: unknown): ChatAttachmentInput[] | undefined {\r\n if (value === undefined || value === null) return undefined;\r\n if (\r\n !Array.isArray(value) ||\r\n !value.every(\r\n (a) =>\r\n typeof a === 'object' &&\r\n a !== null &&\r\n typeof a.fileId === 'string' &&\r\n a.fileId.length > 0 &&\r\n a.fileId.length <= 64\r\n )\r\n ) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"attachments\" must be an array of { fileId } objects.'\r\n );\r\n }\r\n if (value.length > MAX_ATTACHMENTS) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `At most ${MAX_ATTACHMENTS} attachments per message.`\r\n );\r\n }\r\n return value.length > 0\r\n ? value.map((a: { fileId: string }) => ({ fileId: a.fileId }))\r\n : undefined;\r\n}\r\n\r\n\r\nfunction parseChatBody(body: unknown): ChatBody {\r\n if (typeof body !== 'object' || body === null) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\r\n }\r\n const b = body as Record<string, unknown>;\r\n\r\n if (typeof b.agentId !== 'string' || b.agentId.length === 0) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"agentId\" is required and must be a string.'\r\n );\r\n }\r\n if (!Array.isArray(b.messages)) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"messages\" is required and must be an array.'\r\n );\r\n }\r\n\r\n return {\r\n agentId: b.agentId,\r\n messages: b.messages as ChatMessageInput[],\r\n threadId: typeof b.threadId === 'string' ? b.threadId : undefined,\r\n resume: (b.resume as ChatResume | undefined) ?? undefined,\r\n contextOverride: typeof b.contextOverride === 'string' ? b.contextOverride : undefined,\r\n // Distinct from contextOverride above — never shown to the model, only\r\n // ever read live by an RCP tool's resolver. validateTurnContext throws\r\n // a 400 on any shape violation (not a flat string/number/boolean\r\n // object, or over the byte cap) rather than coercing/dropping it.\r\n context: validateTurnContext(b.context),\r\n tools: parseFrontendTools(b.tools),\r\n attachments: parseAttachments(b.attachments),\r\n };\r\n}\r\n\r\n/**\r\n * Starts a new chat run. The run is driven by a `RunDriver` registered\r\n * under a fresh `runId` (returned via the `x-persona-run-id` response\r\n * header) independent of this specific HTTP response — if the connection\r\n * drops, `GET /chat/:runId/resume` can reattach to the same driver and pick\r\n * up where it left off. See `routes/chatResume.ts`.\r\n */\r\nexport const chatRoute: RouteHandler = async (request, ctx) => {\r\n const logger = ctx.logger.child('chat');\r\n logger.debug('chatRoute start', { userId: request.userId, hasBody: !!request.body });\r\n const body = parseChatBody(request.body);\r\n logger.trace('chatRoute body', {\r\n agentId: body.agentId,\r\n threadId: body.threadId,\r\n messageCount: body.messages?.length ?? 0,\r\n hasResume: !!body.resume,\r\n hasContextOverride: !!body.contextOverride,\r\n hasContext: !!body.context,\r\n });\r\n // `requiresAuth: true` guarantees request.userId is resolved by the time a route handler runs.\r\n const userId = request.userId as string;\r\n\r\n const runCtx: RunContext = {\r\n userId,\r\n kind: 'chat',\r\n agentId: body.agentId,\r\n threadId: body.threadId,\r\n messages: body.messages,\r\n };\r\n\r\n logger.debug('beforeRun hook', { agentId: body.agentId, threadId: body.threadId });\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n logger.trace('beforeRun completed', { agentId: body.agentId });\r\n\r\n logger.debug('starting chat stream', { agentId: body.agentId, threadId: body.threadId });\r\n const stream = ctx.client.chat.stream(body.agentId, {\r\n messages: body.messages,\r\n threadId: body.threadId,\r\n resume: body.resume,\r\n contextOverride: body.contextOverride,\r\n context: body.context,\r\n tools: body.tools,\r\n attachments: body.attachments,\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n logger.info('chat run created', {\r\n runId,\r\n agentId: body.agentId,\r\n threadId: body.threadId,\r\n userId,\r\n });\r\n const driver = new RunDriver(runId, runCtx, stream, ctx.hooks, ctx.mode);\r\n ctx.runs.set(runId, driver);\r\n logger.debug('run driver registered', { runId, trackedRuns: ctx.runs.size });\r\n\r\n // Rejects only if the very first upstream call failed before producing\r\n // any frame at all — nothing has been buffered yet, so bubbling this up\r\n // (through runtime.ts's centralized error mapping) to a clean buffered\r\n // error response is correct; there's no partial stream to preserve.\r\n try {\r\n await driver.waitForFirstFrame();\r\n logger.debug('chat run first frame ready', { runId });\r\n } catch (err) {\r\n logger.warn('chat run failed before first frame', {\r\n runId,\r\n agentId: body.agentId,\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n ctx.runs.delete(runId);\r\n throw err;\r\n }\r\n\r\n logger.info('chat stream ready', { runId, agentId: body.agentId });\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(-1), ctx.heartbeatIntervalMs),\r\n };\r\n};\r\n","import type { ChatMessageInput, ChatResume } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { RunDriver } from '../runDriver.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\ninterface ArchitectBody {\r\n messages: ChatMessageInput[];\r\n threadId?: string;\r\n resume?: ChatResume;\r\n}\r\n\r\nfunction parseArchitectBody(body: unknown): ArchitectBody {\r\n if (typeof body !== 'object' || body === null) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\r\n }\r\n const b = body as Record<string, unknown>;\r\n if (!Array.isArray(b.messages)) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"messages\" is required and must be an array.'\r\n );\r\n }\r\n return {\r\n messages: b.messages as ChatMessageInput[],\r\n threadId: typeof b.threadId === 'string' ? b.threadId : undefined,\r\n resume: (b.resume as ChatResume | undefined) ?? undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Starts a run against the Architect — a co-pilot that creates/edits Agents\r\n * on the caller's behalf via tool calls, as the asserted external user (so\r\n * it builds/edits *their* agents, not the Project's shared roster). Requires\r\n * capabilities.architect. Reuses the exact same RunDriver/reconnect/\r\n * heartbeat mechanics as `POST /chat` (see routes/chat.ts) — the Architect\r\n * just has no `agentId` of its own to pass through. An optional `threadId`\r\n * resumes a named Architect conversation instead of the implicit\r\n * deterministic one — `ArchitectClient.stream()` silently ignores it when\r\n * the underlying credential has no asserted external user, same as the\r\n * backend route it calls.\r\n */\r\nexport const architectRoute: RouteHandler = async (request, ctx) => {\r\n const logger = ctx.logger.child('architect');\r\n logger.debug('architectRoute start', { userId: request.userId });\r\n const body = parseArchitectBody(request.body);\r\n logger.trace('architectRoute body', {\r\n threadId: body.threadId,\r\n messageCount: body.messages?.length ?? 0,\r\n hasResume: !!body.resume,\r\n });\r\n const userId = request.userId as string;\r\n\r\n const runCtx: RunContext = {\r\n userId,\r\n kind: 'architect',\r\n threadId: body.threadId,\r\n messages: body.messages,\r\n };\r\n\r\n logger.debug('beforeRun hook (architect)', { userId, threadId: body.threadId });\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n logger.trace('beforeRun completed (architect)');\r\n\r\n logger.debug('starting architect stream', { threadId: body.threadId });\r\n const stream = ctx.client.architect.stream({\r\n messages: body.messages,\r\n threadId: body.threadId,\r\n resume: body.resume,\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n logger.info('architect run created', { runId, userId, threadId: body.threadId });\r\n const driver = new RunDriver(runId, runCtx, stream, ctx.hooks, ctx.mode);\r\n ctx.runs.set(runId, driver);\r\n logger.debug('architect driver registered', { runId, trackedRuns: ctx.runs.size });\r\n\r\n try {\r\n await driver.waitForFirstFrame();\r\n logger.debug('architect first frame ready', { runId });\r\n } catch (err) {\r\n logger.warn('architect run failed before first frame', {\r\n runId,\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n ctx.runs.delete(runId);\r\n throw err;\r\n }\r\n\r\n logger.info('architect stream ready', { runId });\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(-1), ctx.heartbeatIntervalMs),\r\n };\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\n/**\r\n * Builds a `GET /:resource/:runId/resume` handler — reattaches to an\r\n * in-flight or recently-finished run started by `POST /chat` or\r\n * `POST /architect` (its `runId`, from the `x-persona-run-id` response\r\n * header), replaying every frame after `?since=<seq>` (default `-1`, i.e.\r\n * from the start) and then continuing to stream live frames until the run\r\n * finishes.\r\n *\r\n * This is what makes a dropped connection recoverable without losing\r\n * generated content or duplicating the turn: the run itself was never tied\r\n * to the original HTTP response (see `RunDriver`), so a new response can\r\n * pick up exactly where the old one left off. `expectedKind` keeps a chat\r\n * run's id from being resumable via `/architect/.../resume` and vice versa.\r\n */\r\nexport function createResumeRoute(expectedKind: RunContext['kind']): RouteHandler {\r\n return async (request, ctx) => {\r\n const runId = ctx.params.runId;\r\n if (!runId) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', '\"runId\" path parameter is required.');\r\n }\r\n\r\n const driver = ctx.runs.get(runId);\r\n // A run that belongs to a different user, or the wrong kind of run, is\r\n // reported identically to one that doesn't exist — never confirm\r\n // another user's run id is valid.\r\n if (!driver || driver.runCtx.userId !== request.userId || driver.runCtx.kind !== expectedKind) {\r\n throw new RuntimeHttpError(\r\n 404,\r\n 'RUN_NOT_FOUND',\r\n `No resumable run found for id \"${runId}\". It may have finished and been evicted, or never existed.`\r\n );\r\n }\r\n\r\n const sinceRaw = request.query.since;\r\n const parsed = sinceRaw !== undefined ? Number.parseInt(sinceRaw, 10) : -1;\r\n const sinceSeq = Number.isNaN(parsed) ? -1 : parsed;\r\n\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(sinceSeq), ctx.heartbeatIntervalMs),\r\n };\r\n };\r\n}\r\n","import type { UpdateThreadInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\nexport const listThreads: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.threads.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createThread: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const agentId = requireStringField(body, 'agentId');\r\n const thread = await ctx.client.threads.create({ agentId });\r\n\r\n await ctx.hooks?.onThreadCreate?.({\r\n userId: request.userId as string,\r\n agentId,\r\n threadId: thread._id,\r\n });\r\n\r\n return json(201, thread);\r\n};\r\n\r\nexport const getThread: RouteHandler = async (_request, ctx) => {\r\n const thread = await ctx.client.threads.get(requireParam(ctx.params, 'id'));\r\n return json(200, thread);\r\n};\r\n\r\nexport const updateThread: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateThreadInput | undefined) ?? {};\r\n const thread = await ctx.client.threads.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, thread);\r\n};\r\n\r\nexport const deleteThread: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.threads.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteThreads: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.threads.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\n/** The same message history + graph state `chat.stream()` would resume from — load a past conversation on page reopen. */\r\nexport const getThreadMessages: RouteHandler = async (_request, ctx) => {\r\n const messages = await ctx.client.threads.getMessages(requireParam(ctx.params, 'id'));\r\n return json(200, messages);\r\n};\r\n\r\n/** Clears a Thread's conversation content in place (same id/title) — see `@personaai/sdk`'s `threads.reset()`. */\r\nexport const resetThread: RouteHandler = async (_request, ctx) => {\r\n const thread = await ctx.client.threads.reset(requireParam(ctx.params, 'id'));\r\n return json(200, thread);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n parseFrontendTools,\r\n requireBodyObject,\r\n requireStringField,\r\n validateTurnContext,\r\n} from '../routeHelpers.js';\r\n\r\n/**\r\n * Mints a single-use voice session ticket via `@personaai/sdk`'s\r\n * `client.voice.createSession(agentId)`. Always on (like `chat`/`threads`)\r\n * — voice is an end-user chat-session action, not Project-level admin\r\n * configuration, so it isn't gated behind a `RuntimeCapabilities` flag.\r\n *\r\n * The host's own frontend takes the returned `wsUrl` (ticket already\r\n * embedded) and opens `new WebSocket(wsUrl)` directly — this runtime never\r\n * proxies the WebSocket itself, only the one-time ticket mint, so the\r\n * Project credential never needs to sit in front of an open connection.\r\n */\r\nexport const createVoiceSession: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const agentId = requireStringField(body, 'agentId');\r\n const threadId =\r\n typeof body.threadId === 'string' && body.threadId ? body.threadId : undefined;\r\n // Same field/cap/contract as `chat`'s contextOverride — appended to the\r\n // Agent's system instruction once at connect (voice has no per-turn\r\n // re-application; see @personaai/sdk's VoiceResource doc comment).\r\n const contextOverride =\r\n typeof body.contextOverride === 'string' && body.contextOverride ? body.contextOverride : undefined;\r\n // At-connect seed only — a voice call is one continuous session, so\r\n // refreshing this mid-call means the frontend sends `{ type:\r\n // 'voice.context', context }` directly over the already-open WebSocket,\r\n // never back through this route (see @personaai/sdk's VoiceResource doc\r\n // comment).\r\n const context = validateTurnContext(body.context);\r\n // Frontend tools the model may call during the call (useVoice runs them in\r\n // the browser). Same check as chat: malformed → 400 before any API call.\r\n const tools = parseFrontendTools(body.tools);\r\n const ticket = await ctx.client.voice.createSession(agentId, {\r\n ...(threadId ? { threadId } : {}),\r\n ...(contextOverride ? { contextOverride } : {}),\r\n ...(context ? { context } : {}),\r\n ...(tools ? { tools } : {}),\r\n });\r\n\r\n await ctx.hooks?.onVoiceSessionCreate?.({\r\n userId: request.userId as string,\r\n agentId,\r\n threadId,\r\n });\r\n\r\n return json(201, ticket);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\nimport { RuntimeHttpError } from '../errors.js';\nimport { json, requireBodyObject, requireStringField } from '../routeHelpers.js';\n\n/**\n * Outbound SMS / WhatsApp routes — thin proxies over `@personaai/sdk`'s\n * `client.messages.send()` / `sendFromAgent()`.\n *\n * Unlike voice, these are NOT end-user-scoped: `to` is any E.164 number and\n * the send spends this Project's Twilio balance, so the routes are gated\n * behind `capabilities.messages` (off by default) rather than being always\n * on. The resolved user still has to authenticate, but the host should turn\n * this on only for callers it actually wants to be able to text people.\n */\n\nconst MESSAGE_CHANNELS = new Set(['sms', 'whatsapp']);\n\nfunction optionalChannel(body: Record<string, unknown>): 'sms' | 'whatsapp' | undefined {\n const value = body.channel;\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || !MESSAGE_CHANNELS.has(value)) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', '\"channel\" must be \"sms\" or \"whatsapp\".');\n }\n return value as 'sms' | 'whatsapp';\n}\n\nfunction optionalStringField(body: Record<string, unknown>, field: string): string | undefined {\n const value = body[field];\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || value.length === 0) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `\"${field}\" must be a non-empty string.`);\n }\n return value;\n}\n\nfunction optionalMediaUrl(body: Record<string, unknown>): string | string[] | undefined {\n const value = body.mediaUrl;\n if (value === undefined) return undefined;\n if (typeof value === 'string' && value.length > 0) return value;\n if (\n Array.isArray(value) &&\n value.every((entry) => typeof entry === 'string' && entry.length > 0)\n ) {\n return value as string[];\n }\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"mediaUrl\" must be a string or an array of strings.'\n );\n}\n\nfunction optionalContentVariables(\n body: Record<string, unknown>\n): Record<string, string> | string | undefined {\n const value = body.contentVariables;\n if (value === undefined) return undefined;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return value as Record<string, string>;\n }\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"contentVariables\" must be an object or a JSON string.'\n );\n}\n\n/** `POST /messages` — plain message, no Agent involved. */\nexport const sendMessage: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const to = requireStringField(body, 'to');\n const channel = optionalChannel(body);\n const text = optionalStringField(body, 'body');\n const mediaUrl = optionalMediaUrl(body);\n const contentSid = optionalStringField(body, 'contentSid');\n const contentVariables = optionalContentVariables(body);\n\n if (text === undefined && contentSid === undefined) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"body\" is required unless \"contentSid\" is provided.'\n );\n }\n\n const delivery = await ctx.client.messages.send({\n to,\n ...(channel ? { channel } : {}),\n ...(text ? { body: text } : {}),\n ...(mediaUrl ? { mediaUrl } : {}),\n ...(contentSid ? { contentSid } : {}),\n ...(contentVariables ? { contentVariables } : {}),\n });\n\n return json(200, delivery);\n};\n\n/** `POST /messages/agent` — the Agent composes the reply on the shared thread. */\nexport const sendAgentMessage: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const agentId = requireStringField(body, 'agentId');\n const to = requireStringField(body, 'to');\n const prompt = requireStringField(body, 'prompt');\n const channel = optionalChannel(body);\n const displayName = optionalStringField(body, 'displayName');\n\n const delivery = await ctx.client.messages.sendFromAgent({\n agentId,\n to,\n prompt,\n ...(channel ? { channel } : {}),\n ...(displayName ? { displayName } : {}),\n });\n\n return json(200, delivery);\n};\n","import type { AgentCategory, CreateAgentInput, UpdateAgentInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n/** Always on — read-only discovery, e.g. \"let the user pick an agent to chat with\". */\r\nexport const listAgents: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.agents.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n category: request.query.category as AgentCategory | undefined,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\n/**\r\n * Always on, read-only, end-user-scoped — same tier as the MCP OAuth\r\n * routes below, not the agentsWrite-gated Agent CRUD routes further down.\r\n * A chat-only consumer needs this to show \"connect your account\" for a\r\n * tool it can't otherwise reach: mcp.tools.js silently drops a user-mode\r\n * MCP's tools from an Agent's toolset when the calling user hasn't\r\n * connected yet, with no other signal anywhere.\r\n */\r\nexport const getAgentMcpConnections: RouteHandler = async (request, ctx) => {\r\n const connections = await ctx.client.agents.getMcpConnections(\r\n requireParam(ctx.params, 'id'),\r\n request.query.returnTo\r\n );\r\n return json(200, connections);\r\n};\r\n\r\n// Everything below requires capabilities.agentsWrite — provisioning agents\r\n// is Project-admin work, not something an end-user chat session does.\r\n\r\nexport const createAgent: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateAgentInput = {\r\n name: requireStringField(body, 'name'),\r\n systemPrompt: requireStringField(body, 'systemPrompt'),\r\n providerId: requireStringField(body, 'providerId'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n avatar: typeof body.avatar === 'string' ? body.avatar : undefined,\r\n tags: Array.isArray(body.tags) ? (body.tags as string[]) : undefined,\r\n tagline: typeof body.tagline === 'string' ? body.tagline : undefined,\r\n bio: typeof body.bio === 'string' ? body.bio : undefined,\r\n socialLinks: (body.socialLinks as CreateAgentInput['socialLinks']) ?? undefined,\r\n modelName: typeof body.modelName === 'string' ? body.modelName : undefined,\r\n webSearchEnabled:\r\n typeof body.webSearchEnabled === 'boolean' ? body.webSearchEnabled : undefined,\r\n sandboxEnabled:\r\n typeof body.sandboxEnabled === 'boolean' ? body.sandboxEnabled : undefined,\r\n frontendToolsEnabled:\r\n typeof body.frontendToolsEnabled === 'boolean' ? body.frontendToolsEnabled : undefined,\r\n imageInputEnabled:\r\n typeof body.imageInputEnabled === 'boolean' ? body.imageInputEnabled : undefined,\r\n visibility: body.visibility as CreateAgentInput['visibility'],\r\n category: body.category as AgentCategory | undefined,\r\n skills: Array.isArray(body.skills) ? (body.skills as string[]) : undefined,\r\n mcps: Array.isArray(body.mcps) ? (body.mcps as string[]) : undefined,\r\n knowledgeBases: Array.isArray(body.knowledgeBases)\r\n ? (body.knowledgeBases as string[])\r\n : undefined,\r\n storeMounts: Array.isArray(body.storeMounts) ? (body.storeMounts as string[]) : undefined,\r\n interruptOn: (body.interruptOn as Record<string, boolean>) ?? undefined,\r\n isActive: typeof body.isActive === 'boolean' ? body.isActive : undefined,\r\n };\r\n const agent = await ctx.client.agents.create(input);\r\n return json(201, agent);\r\n};\r\n\r\nexport const getAgent: RouteHandler = async (_request, ctx) => {\r\n const agent = await ctx.client.agents.get(requireParam(ctx.params, 'id'));\r\n return json(200, agent);\r\n};\r\n\r\nexport const updateAgent: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateAgentInput | undefined) ?? {};\r\n const agent = await ctx.client.agents.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, agent);\r\n};\r\n\r\nexport const deleteAgent: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.agents.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteAgents: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.agents.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { json, noContent, requireParam, requireBodyObject, toInt } from '../routeHelpers.js';\r\n\r\nexport const listFiles: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.files.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const uploadFile: RouteHandler = async (request, ctx) => {\r\n if (!request.file) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n 'A \"file\" part is required on this request.'\r\n );\r\n }\r\n const fields = (request.body as Record<string, unknown> | undefined) ?? {};\r\n const agentId = typeof fields.agentId === 'string' ? fields.agentId : undefined;\r\n const threadId = typeof fields.threadId === 'string' ? fields.threadId : undefined;\r\n\r\n const file = await ctx.client.files.upload({\r\n filename: request.file.filename,\r\n content: request.file.content,\r\n contentType: request.file.contentType,\r\n agentId,\r\n threadId,\r\n });\r\n\r\n await ctx.hooks?.onFileUpload?.({\r\n userId: request.userId as string,\r\n fileName: request.file.filename,\r\n mimeType: request.file.contentType,\r\n });\r\n\r\n return json(201, file);\r\n};\r\n\r\nexport const downloadFile: RouteHandler = async (_request, ctx) => {\r\n const response = await ctx.client.files.download(requireParam(ctx.params, 'id'));\r\n\r\n const headers: Record<string, string> = {};\r\n const contentType = response.headers.get('content-type');\r\n const contentDisposition = response.headers.get('content-disposition');\r\n if (contentType) headers['content-type'] = contentType;\r\n if (contentDisposition) headers['content-disposition'] = contentDisposition;\r\n\r\n if (!response.body) {\r\n return { kind: 'binary', status: response.status, headers, body: (async function* () {})() };\r\n }\r\n\r\n return {\r\n kind: 'binary',\r\n status: response.status,\r\n headers,\r\n body: response.body as unknown as AsyncIterable<Uint8Array>,\r\n };\r\n};\r\n\r\nexport const deleteFile: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.files.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteFiles: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.files.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireQueryParam,\r\n requireBodyObject,\r\n requireStringField,\r\n} from '../routeHelpers.js';\r\n\r\nfunction requireScope(query: Record<string, string | undefined>): {\r\n scope: 'user' | 'agent' | 'workspace' | undefined;\r\n agentId: string | undefined;\r\n} {\r\n const scope =\r\n query.scope === 'agent' ? 'agent' : query.scope === 'workspace' ? 'workspace' : query.scope === 'user' ? 'user' : undefined;\r\n if ((scope === 'agent' || scope === 'workspace') && !query.agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `\"agentId\" is required when scope is \"${scope}\".`\r\n );\r\n }\r\n return { scope, agentId: query.agentId };\r\n}\r\n\r\nexport const listMemory: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.memory.list();\r\n return json(200, result);\r\n};\r\n\r\nexport const getMemoryFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n const { scope, agentId } = requireScope(request.query);\r\n\r\n const file = await ctx.client.memory.getFile({ path, scope, agentId });\r\n return json(200, file);\r\n};\r\n\r\nexport const writeMemoryFile: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const path = requireStringField(body, 'path');\r\n const content = requireStringField(body, 'content');\r\n const scope =\r\n body.scope === 'agent' ? 'agent' : body.scope === 'workspace' ? 'workspace' : body.scope === 'user' ? 'user' : undefined;\r\n const agentId = typeof body.agentId === 'string' ? body.agentId : undefined;\r\n if ((scope === 'agent' || scope === 'workspace') && !agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `\"agentId\" is required when scope is \"${scope}\".`\r\n );\r\n }\r\n\r\n const file = await ctx.client.memory.writeFile({ path, content, scope, agentId });\r\n\r\n await ctx.hooks?.onMemoryWrite?.({ userId: request.userId as string, agentId, path });\r\n\r\n return json(200, file);\r\n};\r\n\r\nexport const deleteMemoryFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n const { scope, agentId } = requireScope(request.query);\r\n\r\n await ctx.client.memory.deleteFile({ path, scope, agentId });\r\n return noContent();\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json, noContent, requireParam } from '../routeHelpers.js';\r\n\r\n/**\r\n * MCP OAuth — deliberately narrow. The SDK's `McpOAuthResource` has no\r\n * \"handle the OAuth provider's callback\" method at all: Persona's own\r\n * backend receives that redirect directly (the OAuth dance is explicitly\r\n * something Persona owns, per the vision doc), so there is no callback\r\n * route for this runtime to expose. What a host actually needs is: get a\r\n * URL to redirect a browser to, check status, and disconnect.\r\n *\r\n * Owner-mode routes affect the shared MCP config for the whole Project —\r\n * this runtime has no concept of roles/permissions beyond \"is there a\r\n * resolved user\" (RBAC is explicitly the host's own business decision, not\r\n * Persona's); a production host should gate these behind its own\r\n * authorization check before calling them, e.g. inside `resolveUser` or a\r\n * wrapping middleware in front of the mount point.\r\n */\r\n\r\nexport const getOwnerAuthorizeUrl: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.mcps.oauth.getOwnerAuthorizeUrl(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const getUserAuthorizeUrl: RouteHandler = async (request, ctx) => {\r\n const result = await ctx.client.mcps.oauth.getUserAuthorizeUrl(\r\n requireParam(ctx.params, 'id'),\r\n request.query.returnTo\r\n );\r\n return json(200, result);\r\n};\r\n\r\nexport const getUserConnectionStatus: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.mcps.oauth.getUserConnectionStatus(\r\n requireParam(ctx.params, 'id')\r\n );\r\n return json(200, result);\r\n};\r\n\r\nexport const disconnectUserConnection: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.mcps.oauth.disconnectUserConnection(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const disconnectOwnerConnection: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.mcps.oauth.disconnectOwnerConnection(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n","import type { CreateMcpInput, DiscoverMcpsParams, UpdateMcpInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n requireQueryParam,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.mcps — registering/managing MCP\r\n// server connections is Project-admin work. The always-on `/mcps/:id/oauth/*`\r\n// routes (routes/mcpOAuth.ts) are separate and unaffected by this flag.\r\n\r\nexport const listMcps: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.mcps.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n } satisfies DiscoverMcpsParams);\r\n return json(200, items);\r\n};\r\n\r\nexport const createMcp: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateMcpInput = {\r\n name: requireStringField(body, 'name'),\r\n transport: requireStringField(body, 'transport') as CreateMcpInput['transport'],\r\n url: requireStringField(body, 'url'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n authType: body.authType as CreateMcpInput['authType'],\r\n authMode: body.authMode as CreateMcpInput['authMode'],\r\n oauth: body.oauth as CreateMcpInput['oauth'],\r\n apiKey: typeof body.apiKey === 'string' ? body.apiKey : undefined,\r\n };\r\n const mcp = await ctx.client.mcps.create(input);\r\n return json(201, mcp);\r\n};\r\n\r\nexport const getMcp: RouteHandler = async (_request, ctx) => {\r\n const mcp = await ctx.client.mcps.get(requireParam(ctx.params, 'id'));\r\n return json(200, mcp);\r\n};\r\n\r\nexport const updateMcp: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateMcpInput | undefined) ?? {};\r\n const mcp = await ctx.client.mcps.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, mcp);\r\n};\r\n\r\nexport const deleteMcp: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.mcps.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteMcps: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.mcps.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getMcpUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.mcps.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n\r\nexport const testMcpConnection: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.mcps.testConnection(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const readMcpResource: RouteHandler = async (request, ctx) => {\r\n const uri = requireQueryParam(request.query, 'uri');\r\n const result = await ctx.client.mcps.readResource(requireParam(ctx.params, 'id'), uri);\r\n return json(200, result);\r\n};\r\n\r\nexport const callMcpTool: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const name = requireStringField(body, 'name');\r\n const args = (body.arguments as Record<string, unknown> | undefined) ?? undefined;\r\n const result = await ctx.client.mcps.callTool(requireParam(ctx.params, 'id'), name, args);\r\n return json(200, result);\r\n};\r\n","import type { CreateProviderInput, UpdateProviderInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.providers — these routes touch LLM\r\n// API keys. Off by default; see CreateRuntimeOptions.capabilities' doc\r\n// comment before ever enabling this.\r\n\r\nexport const listProviders: RouteHandler = async (_request, ctx) => {\r\n const items = await ctx.client.providers.list();\r\n return json(200, items);\r\n};\r\n\r\nexport const createProvider: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateProviderInput = {\r\n label: requireStringField(body, 'label'),\r\n baseURL: requireStringField(body, 'baseURL'),\r\n apiKey: requireStringField(body, 'apiKey'),\r\n defaultModel: requireStringField(body, 'defaultModel'),\r\n isDefault: typeof body.isDefault === 'boolean' ? body.isDefault : undefined,\r\n };\r\n const provider = await ctx.client.providers.create(input);\r\n return json(201, provider);\r\n};\r\n\r\nexport const getProvider: RouteHandler = async (_request, ctx) => {\r\n const provider = await ctx.client.providers.get(requireParam(ctx.params, 'id'));\r\n return json(200, provider);\r\n};\r\n\r\nexport const updateProvider: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateProviderInput | undefined) ?? {};\r\n const provider = await ctx.client.providers.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, provider);\r\n};\r\n\r\nexport const deleteProvider: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.providers.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteProviders: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.providers.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const testProviderConnection: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.providers.testConnection(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const getProviderModels: RouteHandler = async (_request, ctx) => {\r\n const models = await ctx.client.providers.getModels(requireParam(ctx.params, 'id'));\r\n return json(200, models);\r\n};\r\n\r\nexport const getProviderUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.providers.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n","import type { CreateSkillInput, UpdateSkillInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.skills — skill authoring is\r\n// Project-level content management, not an end-user chat operation.\r\n\r\nexport const listSkills: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.skills.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createSkill: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateSkillInput = {\r\n name: requireStringField(body, 'name'),\r\n description: requireStringField(body, 'description'),\r\n instructions: requireStringField(body, 'instructions'),\r\n isPublic: typeof body.isPublic === 'boolean' ? body.isPublic : undefined,\r\n files: Array.isArray(body.files) ? (body.files as CreateSkillInput['files']) : undefined,\r\n };\r\n const skill = await ctx.client.skills.create(input);\r\n return json(201, skill);\r\n};\r\n\r\nexport const getSkill: RouteHandler = async (_request, ctx) => {\r\n const skill = await ctx.client.skills.get(requireParam(ctx.params, 'id'));\r\n return json(200, skill);\r\n};\r\n\r\nexport const updateSkill: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateSkillInput | undefined) ?? {};\r\n const skill = await ctx.client.skills.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, skill);\r\n};\r\n\r\nexport const deleteSkill: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.skills.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteSkills: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.skills.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getSkillUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.skills.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n","import type { CreateKnowledgeBaseInput, UpdateKnowledgeBaseInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.knowledge — knowledge base\r\n// provisioning and document management is Project-level content\r\n// management, not an end-user chat operation. (`search` is arguably closer\r\n// to an end-user-facing read, but it's gated the same as the rest of this\r\n// resource for consistency — a host that wants search only can still wire\r\n// that up itself via the raw SDK.)\r\n\r\nexport const listKnowledgeBases: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.knowledge.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createKnowledgeBase: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateKnowledgeBaseInput = {\r\n name: requireStringField(body, 'name'),\r\n providerId: requireStringField(body, 'providerId'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n isPublic: typeof body.isPublic === 'boolean' ? body.isPublic : undefined,\r\n embeddingModel: typeof body.embeddingModel === 'string' ? body.embeddingModel : undefined,\r\n chunkSize: typeof body.chunkSize === 'number' ? body.chunkSize : undefined,\r\n chunkOverlap: typeof body.chunkOverlap === 'number' ? body.chunkOverlap : undefined,\r\n topK: typeof body.topK === 'number' ? body.topK : undefined,\r\n };\r\n const kb = await ctx.client.knowledge.create(input);\r\n return json(201, kb);\r\n};\r\n\r\nexport const getKnowledgeBase: RouteHandler = async (_request, ctx) => {\r\n const kb = await ctx.client.knowledge.get(requireParam(ctx.params, 'id'));\r\n return json(200, kb);\r\n};\r\n\r\nexport const updateKnowledgeBase: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateKnowledgeBaseInput | undefined) ?? {};\r\n const kb = await ctx.client.knowledge.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, kb);\r\n};\r\n\r\nexport const deleteKnowledgeBase: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.knowledge.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteKnowledgeBases: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.knowledge.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getKnowledgeBaseUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.knowledge.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n\r\nexport const uploadKnowledgeDocuments: RouteHandler = async (request, ctx) => {\r\n if (!request.files || request.files.length === 0) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n 'At least one \"files\" part is required on this request.'\r\n );\r\n }\r\n const result = await ctx.client.knowledge.uploadDocuments(\r\n requireParam(ctx.params, 'id'),\r\n request.files.map((file) => ({\r\n filename: file.filename,\r\n content: file.content,\r\n contentType: file.contentType,\r\n }))\r\n );\r\n return json(201, result);\r\n};\r\n\r\nexport const listKnowledgeDocuments: RouteHandler = async (_request, ctx) => {\r\n const documents = await ctx.client.knowledge.listDocuments(requireParam(ctx.params, 'id'));\r\n return json(200, documents);\r\n};\r\n\r\nexport const deleteKnowledgeDocument: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.knowledge.deleteDocument(\r\n requireParam(ctx.params, 'id'),\r\n requireParam(ctx.params, 'sourceName')\r\n );\r\n return json(200, result);\r\n};\r\n\r\nexport const searchKnowledgeBase: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const query = requireStringField(body, 'query');\r\n const topK = typeof body.topK === 'number' ? body.topK : undefined;\r\n const results = await ctx.client.knowledge.search(requireParam(ctx.params, 'id'), query, {\r\n topK,\r\n });\r\n return json(200, results);\r\n};\r\n","import type { CreateStoreInput, UpdateStoreInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireQueryParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.stores — vector store provisioning\r\n// is Project-level configuration, not an end-user chat operation.\r\n\r\nexport const listStores: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.stores.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createStore: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateStoreInput = {\r\n name: requireStringField(body, 'name'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n scope: requireStringField(body, 'scope') as CreateStoreInput['scope'],\r\n accessMode: body.accessMode as CreateStoreInput['accessMode'],\r\n };\r\n const store = await ctx.client.stores.create(input);\r\n return json(201, store);\r\n};\r\n\r\nexport const getStore: RouteHandler = async (_request, ctx) => {\r\n const store = await ctx.client.stores.get(requireParam(ctx.params, 'id'));\r\n return json(200, store);\r\n};\r\n\r\nexport const updateStore: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateStoreInput | undefined) ?? {};\r\n const store = await ctx.client.stores.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, store);\r\n};\r\n\r\nexport const deleteStore: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.stores.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const listStoreFiles: RouteHandler = async (_request, ctx) => {\r\n const files = await ctx.client.stores.listFiles(requireParam(ctx.params, 'id'));\r\n return json(200, files);\r\n};\r\n\r\nexport const getStoreFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n const file = await ctx.client.stores.getFile(requireParam(ctx.params, 'id'), { path });\r\n return json(200, file);\r\n};\r\n\r\nexport const writeStoreFile: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input = {\r\n path: requireStringField(body, 'path'),\r\n content: requireStringField(body, 'content'),\r\n };\r\n const file = await ctx.client.stores.writeFile(requireParam(ctx.params, 'id'), input);\r\n return json(200, file);\r\n};\r\n\r\nexport const deleteStoreFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n await ctx.client.stores.deleteFile(requireParam(ctx.params, 'id'), { path });\r\n return noContent();\r\n};\r\n","import type { CreateRcpSourceInput, UpdateRcpSourceInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.rcpSources — RCP source management\r\n// is Project-level tool-source configuration, not an end-user chat operation.\r\n\r\nexport const listRcpSources: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.rcpSources.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createRcpSource: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateRcpSourceInput = {\r\n name: requireStringField(body, 'name'),\r\n url: requireStringField(body, 'url'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n authType: body.authType as CreateRcpSourceInput['authType'],\r\n secretRef: typeof body.secretRef === 'string' ? body.secretRef : undefined,\r\n isEnabled: typeof body.isEnabled === 'boolean' ? body.isEnabled : undefined,\r\n paramContextMap: Array.isArray(body.paramContextMap)\r\n ? (body.paramContextMap as CreateRcpSourceInput['paramContextMap'])\r\n : undefined,\r\n };\r\n const source = await ctx.client.rcpSources.create(input);\r\n return json(201, source);\r\n};\r\n\r\nexport const getRcpSource: RouteHandler = async (_request, ctx) => {\r\n const source = await ctx.client.rcpSources.get(requireParam(ctx.params, 'id'));\r\n return json(200, source);\r\n};\r\n\r\nexport const updateRcpSource: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateRcpSourceInput | undefined) ?? {};\r\n const source = await ctx.client.rcpSources.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, source);\r\n};\r\n\r\nexport const deleteRcpSource: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.rcpSources.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteRcpSources: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.rcpSources.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getRcpSourceUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.rcpSources.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n\r\nexport const testRcpSourceConnection: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.rcpSources.testConnection(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json, toInt } from '../routeHelpers.js';\r\n\r\n// Requires capabilities.auditLogs — a security/compliance log almost never\r\n// belongs behind the same auth gate as end-user chat sessions.\r\n\r\nexport const listAuditLogs: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.auditLogs.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n eventType: request.query.eventType,\r\n });\r\n return json(200, items);\r\n};\r\n","import type {\r\n CreateWorkflowInput,\r\n UpdateWorkflowInput,\r\n WorkflowDraft,\r\n WorkflowRunStatus,\r\n WorkflowVisibility,\r\n} from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireBodyObject,\r\n requireParam,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n/** Always on — read-only discovery of available workflows. */\r\nexport const listWorkflows: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.workflows.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope as 'mine' | 'public' | 'all' | undefined,\r\n visibility: request.query.visibility as WorkflowVisibility | undefined,\r\n isEnabled:\r\n request.query.isEnabled !== undefined\r\n ? request.query.isEnabled === 'true'\r\n : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\n// Everything below requires capabilities.workflowsWrite — authoring workflows\r\n// is Project-admin/builder work, not something an ordinary end-user session does.\r\n\r\nexport const createWorkflow: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateWorkflowInput = {\r\n name: requireStringField(body, 'name'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n visibility: body.visibility as WorkflowVisibility | undefined,\r\n isEnabled: typeof body.isEnabled === 'boolean' ? body.isEnabled : undefined,\r\n draft: (body.draft as WorkflowDraft) ?? undefined,\r\n };\r\n const idempotencyKey = request.headers['idempotency-key'];\r\n const workflow = await ctx.client.workflows.create(input, idempotencyKey);\r\n return json(201, workflow);\r\n};\r\n\r\nexport const getWorkflow: RouteHandler = async (_request, ctx) => {\r\n const workflow = await ctx.client.workflows.get(requireParam(ctx.params, 'id'));\r\n return json(200, workflow);\r\n};\r\n\r\nexport const updateWorkflow: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: UpdateWorkflowInput = {\r\n name: typeof body.name === 'string' ? body.name : undefined,\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n visibility: body.visibility as WorkflowVisibility | undefined,\r\n isEnabled: typeof body.isEnabled === 'boolean' ? body.isEnabled : undefined,\r\n draft: (body.draft as WorkflowDraft) ?? undefined,\r\n };\r\n const updated = await ctx.client.workflows.update(\r\n requireParam(ctx.params, 'id'),\r\n input\r\n );\r\n return json(200, updated);\r\n};\r\n\r\nexport const deleteWorkflow: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.workflows.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const saveWorkflowDraft: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const draft = body as unknown as WorkflowDraft;\r\n const updated = await ctx.client.workflows.saveDraft(\r\n requireParam(ctx.params, 'id'),\r\n draft\r\n );\r\n return json(200, updated);\r\n};\r\n\r\nexport const publishWorkflow: RouteHandler = async (_request, ctx) => {\r\n const version = await ctx.client.workflows.publish(requireParam(ctx.params, 'id'));\r\n return json(201, version);\r\n};\r\n\r\nexport const listWorkflowVersions: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.workflows.listVersions(\r\n requireParam(ctx.params, 'id'),\r\n {\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n }\r\n );\r\n return json(200, items);\r\n};\r\n\r\nexport const getWorkflowVersion: RouteHandler = async (_request, ctx) => {\r\n const versionNum = toInt(ctx.params.version);\r\n const version = await ctx.client.workflows.getVersion(\r\n requireParam(ctx.params, 'id'),\r\n versionNum ?? 1\r\n );\r\n return json(200, version);\r\n};\r\n\r\nexport const getWorkflowMermaid: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.workflows.getMermaid(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const listWorkflowRuns: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.workflows.listRuns(requireParam(ctx.params, 'id'), {\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n status: request.query.status as WorkflowRunStatus | undefined,\r\n isDryRun:\r\n request.query.isDryRun !== undefined\r\n ? request.query.isDryRun === 'true'\r\n : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const getWorkflowRun: RouteHandler = async (_request, ctx) => {\r\n const run = await ctx.client.workflows.getRun(requireParam(ctx.params, 'runId'));\r\n return json(200, run);\r\n};\r\n\r\nexport const cancelWorkflowRun: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.workflows.cancel(requireParam(ctx.params, 'runId'));\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { RunDriver } from '../runDriver.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport { requireParam } from '../routeHelpers.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\ninterface WorkflowStreamBody {\r\n input?: unknown;\r\n dryRun?: boolean;\r\n version?: number;\r\n}\r\n\r\nfunction parseWorkflowStreamBody(body: unknown): WorkflowStreamBody {\r\n if (body === undefined || body === null) return {};\r\n if (typeof body !== 'object') {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\r\n }\r\n const b = body as Record<string, unknown>;\r\n return {\r\n input: b.input,\r\n dryRun: typeof b.dryRun === 'boolean' ? b.dryRun : undefined,\r\n version: typeof b.version === 'number' ? b.version : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Executes a workflow and streams AG-UI events back. Driven by RunDriver,\r\n * registered under a fresh `runId` (returned via `x-persona-run-id`)\r\n * allowing reconnections via `GET /workflows/runs/:runId/resume`.\r\n */\r\nexport const workflowStreamRoute: RouteHandler = async (request, ctx) => {\r\n const workflowId = requireParam(ctx.params, 'id');\r\n const body = parseWorkflowStreamBody(request.body);\r\n const userId = request.userId as string;\r\n\r\n const runCtx: RunContext = {\r\n userId,\r\n kind: 'workflow',\r\n workflowId,\r\n input: body.input,\r\n };\r\n\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n\r\n const stream = ctx.client.workflows.stream(workflowId, {\r\n input: body.input,\r\n dryRun: body.dryRun,\r\n version: body.version,\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n const driver = new RunDriver(runId, runCtx, stream, ctx.hooks, ctx.mode);\r\n ctx.runs.set(runId, driver);\r\n\r\n try {\r\n await driver.waitForFirstFrame();\r\n } catch (err) {\r\n ctx.runs.delete(runId);\r\n throw err;\r\n }\r\n\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(-1), ctx.heartbeatIntervalMs),\r\n };\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport type { RuntimeRequest } from '../types/request.js';\r\nimport type {\r\n TwilioChannelOptions,\r\n TwilioChannelRequest,\r\n TwilioChannelUser,\r\n} from '../types/options.js';\r\nimport type { RuntimeBufferedResponse } from '../types/response.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\n\r\n/**\r\n * Bring-your-own-Twilio-number channel webhooks.\r\n *\r\n * These are the only routes in this runtime that are `requiresAuth: false`\r\n * (besides `/health`): Twilio does not send an end-user session, it sends a\r\n * signature. Authentication is therefore two-step and entirely\r\n * host-configured: verify `X-Twilio-Signature` with the host's own auth\r\n * token, then resolve the sender to one of the host's users. Persona is\r\n * reached with the Project credential for that resolved user.\r\n *\r\n * Nothing here ever sends a message from Persona's Twilio account, and the\r\n * voice path only mints a ticket — the audio stream goes from Twilio\r\n * straight to Persona.\r\n */\r\n\r\nconst SIGNATURE_HEADER = 'x-twilio-signature';\r\n\r\nconst DEFAULT_VOICE_FALLBACK =\r\n 'Sorry, this assistant is unavailable right now. Please try again later.';\r\nconst DEFAULT_MESSAGE_FALLBACK =\r\n 'Sorry, something went wrong while handling your message. Please try again.';\r\n\r\nfunction firstHeader(value: string | undefined): string | undefined {\r\n return value?.split(',')[0]?.trim() || undefined;\r\n}\r\n\r\n/** Twilio signs the exact public URL, including the query string. */\r\nexport function resolveSignedUrl(\r\n request: RuntimeRequest,\r\n publicUrl?: string\r\n): string | null {\r\n const search = new URLSearchParams();\r\n for (const [key, value] of Object.entries(request.query)) {\r\n if (value !== undefined) search.set(key, value);\r\n }\r\n const query = search.toString();\r\n const pathWithQuery = request.path + (query ? `?${query}` : '');\r\n\r\n if (publicUrl) {\r\n return `${publicUrl.replace(/\\/+$/, '')}${pathWithQuery}`;\r\n }\r\n\r\n const host =\r\n firstHeader(request.headers['x-forwarded-host']) ?? firstHeader(request.headers.host);\r\n const proto = firstHeader(request.headers['x-forwarded-proto']) ?? 'https';\r\n if (!host) return null;\r\n return `${proto}://${host}${pathWithQuery}`;\r\n}\r\n\r\n/** `base64(HMAC-SHA1(authToken, url + concat(sortedParamKeys + values)))`. */\r\nexport async function computeTwilioSignature(\r\n authToken: string,\r\n url: string,\r\n params: Record<string, string>\r\n): Promise<string> {\r\n const payload =\r\n url +\r\n Object.keys(params)\r\n .sort()\r\n .map((key) => `${key}${params[key]}`)\r\n .join('');\r\n\r\n const encoder = new TextEncoder();\r\n const key = await crypto.subtle.importKey(\r\n 'raw',\r\n encoder.encode(authToken),\r\n { name: 'HMAC', hash: 'SHA-1' },\r\n false,\r\n ['sign']\r\n );\r\n const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));\r\n const bytes = new Uint8Array(signature);\r\n let binary = '';\r\n for (const byte of bytes) binary += String.fromCharCode(byte);\r\n return btoa(binary);\r\n}\r\n\r\nfunction constantTimeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) return false;\r\n let diff = 0;\r\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\r\n return diff === 0;\r\n}\r\n\r\nexport async function verifyTwilioSignature(\r\n request: RuntimeRequest,\r\n options: TwilioChannelOptions\r\n): Promise<boolean> {\r\n const provided = request.headers[SIGNATURE_HEADER];\r\n if (!provided || !options.authToken) return false;\r\n\r\n const url = resolveSignedUrl(request, options.publicUrl);\r\n if (!url) return false;\r\n\r\n const expected = await computeTwilioSignature(options.authToken, url, formParams(request));\r\n return constantTimeEqual(expected, provided);\r\n}\r\n\r\n/** Flattens a urlencoded body into Twilio's string-only param map. */\r\nexport function formParams(request: RuntimeRequest): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n const body = request.body;\r\n if (!body || typeof body !== 'object' || Array.isArray(body)) return params;\r\n\r\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\r\n if (typeof value === 'string') params[key] = value;\r\n else if (typeof value === 'number' || typeof value === 'boolean') params[key] = String(value);\r\n }\r\n return params;\r\n}\r\n\r\nfunction escapeXml(value: string): string {\r\n return value\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n}\r\n\r\n/** A 200 TwiML response — Twilio only executes TwiML on a 2xx. */\r\nexport function twiml(body: string): RuntimeBufferedResponse {\r\n return {\r\n kind: 'buffered',\r\n status: 200,\r\n headers: { 'content-type': 'text/xml; charset=utf-8' },\r\n body: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${body}`,\r\n };\r\n}\r\n\r\nfunction forbidden(message: string): RuntimeBufferedResponse {\r\n return {\r\n kind: 'buffered',\r\n status: 403,\r\n headers: { 'content-type': 'text/plain; charset=utf-8' },\r\n body: message,\r\n };\r\n}\r\n\r\nfunction channelKind(from: string): 'whatsapp' | 'sms' {\r\n return from.trim().toLowerCase().startsWith('whatsapp:') ? 'whatsapp' : 'sms';\r\n}\r\n\r\nfunction toUser(result: string | TwilioChannelUser | null): TwilioChannelUser | null {\r\n if (!result) return null;\r\n if (typeof result === 'string') return result ? { externalUserId: result } : null;\r\n if (typeof result.externalUserId !== 'string' || !result.externalUserId) return null;\r\n return result;\r\n}\r\n\r\n/**\r\n * Verifies the signature, then runs the host's resolver. Returns either the\r\n * resolved user or a response that must be returned immediately.\r\n */\r\nasync function authenticate(\r\n request: RuntimeRequest,\r\n options: TwilioChannelOptions,\r\n channelRequest: TwilioChannelRequest\r\n): Promise<{ user: TwilioChannelUser } | { response: RuntimeBufferedResponse }> {\r\n if (!(await verifyTwilioSignature(request, options))) {\r\n return { response: forbidden('Invalid Twilio signature') };\r\n }\r\n\r\n let resolved: TwilioChannelUser | string | null = null;\r\n try {\r\n resolved = await options.resolveUser(channelRequest);\r\n } catch {\r\n resolved = null;\r\n }\r\n\r\n const user = toUser(resolved);\r\n if (!user) {\r\n // Unknown sender: end the call (voice) / send nothing (message). Never\r\n // reveal whether the number is known.\r\n return {\r\n response:\r\n channelRequest.channel === 'voice'\r\n ? twiml('<Response><Reject/></Response>')\r\n : twiml('<Response></Response>'),\r\n };\r\n }\r\n\r\n return { user };\r\n}\r\n\r\n/** `POST /channels/twilio/voice` — answer a call with a Persona media stream. */\r\nexport const twilioVoiceChannel: RouteHandler = async (request, ctx) => {\r\n const options = ctx.channels?.twilio;\r\n if (!options) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'Twilio voice channel is not configured.');\r\n }\r\n\r\n const params = formParams(request);\r\n const channelRequest: TwilioChannelRequest = {\r\n channel: 'voice',\r\n from: params.From ?? '',\r\n to: params.To ?? '',\r\n ...(params.CallSid ? { callSid: params.CallSid } : {}),\r\n };\r\n\r\n const auth = await authenticate(request, options, channelRequest);\r\n if ('response' in auth) return auth.response;\r\n\r\n const agentId = auth.user.agentId ?? options.agentId;\r\n const fallback = options.voiceFallback ?? DEFAULT_VOICE_FALLBACK;\r\n\r\n if (!agentId) {\r\n ctx.logger.warn('twilio voice channel has no agent configured', {\r\n hasDefault: false,\r\n resolverProvided: false,\r\n });\r\n return twiml(`<Response><Say>${escapeXml(fallback)}</Say><Hangup/></Response>`);\r\n }\r\n\r\n try {\r\n const session = await ctx.client.voice.createTelephonySession({\r\n agentId,\r\n externalUserId: auth.user.externalUserId,\r\n ...(auth.user.threadId ? { threadId: auth.user.threadId } : {}),\r\n ...(channelRequest.from ? { from: channelRequest.from } : {}),\r\n ...(channelRequest.to ? { to: channelRequest.to } : {}),\r\n ...(channelRequest.callSid ? { callSid: channelRequest.callSid } : {}),\r\n });\r\n\r\n await ctx.hooks?.onVoiceSessionCreate?.({\r\n userId: auth.user.externalUserId,\r\n agentId,\r\n });\r\n\r\n return twiml(\r\n `<Response><Connect><Stream url=\"${escapeXml(session.streamUrl)}\"/></Connect></Response>`\r\n );\r\n } catch (err) {\r\n ctx.logger.error('twilio voice channel failed to start a session', {\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n return twiml(`<Response><Say>${escapeXml(fallback)}</Say><Hangup/></Response>`);\r\n }\r\n};\r\n\r\n/** `POST /channels/twilio/message` — reply to an SMS/WhatsApp message inline. */\r\nexport const twilioMessageChannel: RouteHandler = async (request, ctx) => {\r\n const options = ctx.channels?.twilio;\r\n if (!options) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'Twilio messaging channel is not configured.');\r\n }\r\n\r\n const params = formParams(request);\r\n const channelRequest: TwilioChannelRequest = {\r\n channel: channelKind(params.From ?? ''),\r\n from: params.From ?? '',\r\n to: params.To ?? '',\r\n ...(params.MessageSid ? { messageSid: params.MessageSid } : {}),\r\n ...(params.Body ? { body: params.Body } : {}),\r\n ...(params.ProfileName ? { profileName: params.ProfileName } : {}),\r\n };\r\n\r\n const auth = await authenticate(request, options, channelRequest);\r\n if ('response' in auth) return auth.response;\r\n\r\n const agentId = auth.user.agentId ?? options.agentId;\r\n const fallback =\r\n options.messageFallback === undefined ? DEFAULT_MESSAGE_FALLBACK : options.messageFallback;\r\n\r\n if (!agentId) {\r\n ctx.logger.warn('twilio message channel has no agent configured');\r\n return fallback\r\n ? twiml(`<Response><Message>${escapeXml(fallback)}</Message></Response>`)\r\n : twiml('<Response></Response>');\r\n }\r\n\r\n const text = channelRequest.body ?? '';\r\n if (!text.trim()) {\r\n // Media-only or empty message: acknowledge with no reply rather than\r\n // paying for an agent turn on nothing.\r\n return twiml('<Response></Response>');\r\n }\r\n\r\n try {\r\n const result = await ctx.client.messages.generateReply({\r\n agentId,\r\n externalUserId: auth.user.externalUserId,\r\n text,\r\n ...(auth.user.threadId ? { threadId: auth.user.threadId } : {}),\r\n ...(channelRequest.profileName ? { displayName: channelRequest.profileName } : {}),\r\n });\r\n\r\n return twiml(`<Response><Message>${escapeXml(result.reply)}</Message></Response>`);\r\n } catch (err) {\r\n ctx.logger.error('twilio message channel failed to generate a reply', {\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n return fallback\r\n ? twiml(`<Response><Message>${escapeXml(fallback)}</Message></Response>`)\r\n : twiml('<Response></Response>');\r\n }\r\n};\r\n"],"mappings":"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","names":["PersonaApiError","key","response","PersonaApiError"]}
1
+ {"version":3,"sources":["../src/routing.ts","../src/client-factory.ts","../src/errors.ts","../src/runtime.ts","../src/runRegistry.ts","../src/version.ts","../src/routes/health.ts","../src/routeHelpers.ts","../src/routes/restToolsManifest.ts","../src/routes/rcpManifest.ts","../src/runDriver.ts","../src/heartbeat.ts","../src/routes/chat.ts","../src/routes/architect.ts","../src/routes/resume.ts","../src/routes/threads.ts","../src/routes/voice.ts","../src/routes/messages.ts","../src/routes/agents.ts","../src/routes/files.ts","../src/routes/memory.ts","../src/routes/mcpOAuth.ts","../src/routes/mcps.ts","../src/routes/providers.ts","../src/routes/skills.ts","../src/routes/knowledge.ts","../src/routes/stores.ts","../src/routes/rcpSources.ts","../src/routes/auditLogs.ts","../src/routes/workflows.ts","../src/routes/workflowStream.ts","../src/routes/channels.ts","../src/routes/feedback.ts","../src/routes/webhooks.ts","../src/routes/secrets.ts","../src/routes/restToolSources.ts","../src/routes/deploy.ts","../src/routes/traces.ts","../src/routes/evals.ts","../src/routes/observe.ts"],"sourcesContent":["import type { RuntimeMethod, RuntimeRequest } from './types/request.js';\r\nimport type { RuntimeResponse } from './types/response.js';\r\nimport type { RunDriver } from './runDriver.js';\r\nimport type {\r\n ChannelsOptions,\r\n CreateRuntimeOptions,\r\n RcpManifestOptions,\r\n RestToolsManifestOptions,\r\n RuntimeCapabilities,\r\n WebhooksOptions,\r\n} from './types/options.js';\r\n\r\nexport interface RouteContext {\r\n /** Scoped to the resolved end user (`externalUserId`). */\r\n client: import('@personaai/sdk').PersonaClient;\r\n /**\r\n * The same credential without an end user — for Project-wide admin\r\n * capabilities (deploy, traces, evals, observe), which Persona refuses for\r\n * a key that names an end user. Created on first use.\r\n */\r\n projectClient: () => import('@personaai/sdk').PersonaClient;\r\n hooks: import('./types/hooks.js').RuntimeHooks | undefined;\r\n mode: 'development' | 'production';\r\n params: Record<string, string>;\r\n heartbeatIntervalMs: number;\r\n /** In-flight/recently-finished chat runs, keyed by runId — backs POST /chat's reconnect support. */\r\n runs: Map<string, RunDriver>;\r\n /** The fully-resolved (all keys present) capabilities this runtime instance was created with. */\r\n capabilities: Required<RuntimeCapabilities>;\r\n logger: import('@personaai/sdk').Logger;\r\n /** Set only when `createRuntime({ restToolsManifest })` was configured — backs the manifest route. */\r\n restToolsManifest: RestToolsManifestOptions | undefined;\r\n /** Set only when `createRuntime({ rcpManifest })` was configured — backs the RCP manifest route. */\r\n rcpManifest: RcpManifestOptions | undefined;\r\n /** Set only when `createRuntime({ channels })` was configured — backs the channel webhook routes. */\r\n channels: ChannelsOptions | undefined;\r\n /** Set only when `createRuntime({ webhooks })` was configured — backs `POST /webhooks/persona`. */\r\n webhooks: WebhooksOptions | undefined;\r\n /** How runs pick a published version (`selectVersion`, `defaultEnvironment`, client choice). */\r\n versioning: Pick<\r\n CreateRuntimeOptions,\r\n 'selectVersion' | 'defaultEnvironment' | 'allowClientVersionSelection'\r\n >;\r\n /** @default true */\r\n forwardTraceparent: boolean;\r\n}\r\n\r\nexport type RouteHandler = (request: RuntimeRequest, ctx: RouteContext) => Promise<RuntimeResponse>;\r\n\r\nexport interface Route {\r\n method: RuntimeMethod;\r\n /** Segments split on '/': a literal string, or `:name` for a captured param. */\r\n pattern: string[];\r\n handler: RouteHandler;\r\n /** @default true — public routes (`/health`, manifests, channel and webhook receivers) set this to false. */\r\n requiresAuth?: boolean;\r\n}\r\n\r\nexport type MatchResult =\r\n | { kind: 'matched'; route: Route; params: Record<string, string> }\r\n | { kind: 'not-found' }\r\n | { kind: 'method-not-allowed'; allowed: RuntimeMethod[] };\r\n\r\nfunction splitPath(path: string): string[] {\r\n return path.split('/').filter((segment) => segment.length > 0);\r\n}\r\n\r\nexport function matchRoute(routes: Route[], method: RuntimeMethod, path: string): MatchResult {\r\n const requested = splitPath(path);\r\n let sawPathMatch = false;\r\n const allowed = new Set<RuntimeMethod>();\r\n\r\n for (const route of routes) {\r\n if (route.pattern.length !== requested.length) continue;\r\n\r\n const params: Record<string, string> = {};\r\n let matched = true;\r\n for (let i = 0; i < route.pattern.length; i++) {\r\n const patternSegment = route.pattern[i]!;\r\n const requestedSegment = requested[i]!;\r\n if (patternSegment.startsWith(':')) {\r\n params[patternSegment.slice(1)] = decodeURIComponent(requestedSegment);\r\n } else if (patternSegment !== requestedSegment) {\r\n matched = false;\r\n break;\r\n }\r\n }\r\n\r\n if (!matched) continue;\r\n\r\n sawPathMatch = true;\r\n allowed.add(route.method);\r\n if (route.method === method) {\r\n return { kind: 'matched', route, params };\r\n }\r\n }\r\n\r\n if (sawPathMatch) return { kind: 'method-not-allowed', allowed: [...allowed] };\r\n return { kind: 'not-found' };\r\n}\r\n\r\n/** Strips `mountPath` from `path` if present — tolerant of adapters that already stripped it themselves (e.g. a framework's own sub-router). */\r\nexport function stripMountPath(path: string, mountPath: string | undefined): string {\r\n if (!mountPath) return path;\r\n const normalizedMount = mountPath.endsWith('/') ? mountPath.slice(0, -1) : mountPath;\r\n if (!normalizedMount) return path;\r\n if (path === normalizedMount) return '/';\r\n if (path.startsWith(`${normalizedMount}/`)) return path.slice(normalizedMount.length);\r\n return path;\r\n}\r\n","import { PersonaClient, type Logger } from '@personaai/sdk';\r\nimport type { CreateRuntimeOptions } from './types/options.js';\r\n\r\n/**\r\n * One `PersonaClient` per request, scoped to the resolved user — the\r\n * pattern `@personaai/sdk`'s own README documents. Constructing a\r\n * `PersonaClient` does no I/O, so per-request construction has no\r\n * meaningful cost.\r\n */\r\nexport function createClientForRequest(\r\n options: CreateRuntimeOptions,\r\n userId: string | null,\r\n logger?: Logger\r\n): PersonaClient {\r\n const clientLogger = logger ? logger.child('sdk') : undefined;\r\n return new PersonaClient({\r\n baseUrl: options.baseUrl,\r\n credential: options.credential,\r\n // No end user (`null`) = a Project-scoped client: `/health` and the\r\n // Project-wide admin capabilities.\r\n externalUserId: userId ?? undefined,\r\n fetch: options.fetch,\r\n logger: clientLogger,\r\n });\r\n}\r\n","import {\r\n BudgetExceededError,\r\n EvalGateError,\r\n ForbiddenScopeError,\r\n PersonaApiError,\r\n} from '@personaai/sdk';\r\nimport type { RuntimeBufferedResponse } from './types/response.js';\r\n\r\n/** A runtime-originated HTTP error (routing, validation, auth) — as opposed to one surfaced from the Persona API itself. */\r\nexport class RuntimeHttpError extends Error {\r\n readonly status: number;\r\n readonly code: string;\r\n\r\n constructor(status: number, code: string, message: string) {\r\n super(message);\r\n this.name = 'RuntimeHttpError';\r\n this.status = status;\r\n this.code = code;\r\n Object.setPrototypeOf(this, RuntimeHttpError.prototype);\r\n }\r\n}\r\n\r\ninterface MappedError {\r\n status: number;\r\n code: string;\r\n message: string;\r\n /** Machine-readable extras that are safe for the browser (e.g. which budget ran out). */\r\n details?: Record<string, unknown>;\r\n detail?: unknown;\r\n}\r\n\r\n/**\r\n * Two-tier trust model: errors this runtime (or the Persona API) already\r\n * curated into a developer-facing message are safe to pass through as-is.\r\n * Anything else (a bug in host hook code, a raw network error, ...) is\r\n * untrusted and gets a fixed generic message in production — this is what\r\n * actually prevents internal implementation details (\"LangGraph\",\r\n * \"Qdrant\", stack traces) from ever reaching a runtime caller.\r\n */\r\nexport function mapErrorToRuntimeError(\r\n err: unknown,\r\n mode: 'development' | 'production'\r\n): MappedError {\r\n const dev = mode === 'development';\r\n\r\n if (err instanceof RuntimeHttpError) {\r\n return { status: err.status, code: err.code, message: err.message };\r\n }\r\n\r\n // The server's Persona key lacks a scope. That's the host's setup, not the\r\n // end user's login: a 403 here would read as \"you're not allowed\" in the UI.\r\n if (err instanceof ForbiddenScopeError) {\r\n return {\r\n status: 500,\r\n code: 'RUNTIME_MISCONFIGURED',\r\n message: dev\r\n ? `The runtime's Persona API key lacks the \"${err.requiredScope ?? 'unknown'}\" scope: ${err.message}`\r\n : \"The server's Persona API key can't do this.\",\r\n ...(dev\r\n ? { detail: { requiredScope: err.requiredScope, acceptedScopes: err.acceptedScopes } }\r\n : {}),\r\n };\r\n }\r\n\r\n // Which budget ran out is useful to show (\"this assistant's monthly\r\n // limit is reached\"); the agent id isn't needed, the client knows it.\r\n if (err instanceof BudgetExceededError) {\r\n return {\r\n status: 402,\r\n code: err.code,\r\n message: err.message,\r\n ...(err.scope ? { details: { scope: err.scope } } : {}),\r\n ...(dev ? { detail: err.response } : {}),\r\n };\r\n }\r\n\r\n // Admin `deploy` capability: publishing blocked by the eval gate.\r\n if (err instanceof EvalGateError) {\r\n return {\r\n status: err.statusCode,\r\n code: err.code,\r\n message: err.message,\r\n details: {\r\n ...(err.datasetId ? { datasetId: err.datasetId } : {}),\r\n ...(err.minPassRate !== undefined ? { minPassRate: err.minPassRate } : {}),\r\n ...(err.passRate !== undefined ? { passRate: err.passRate } : {}),\r\n ...(err.runId ? { runId: err.runId } : {}),\r\n },\r\n };\r\n }\r\n\r\n if (err instanceof PersonaApiError) {\r\n return {\r\n status: err.statusCode,\r\n code: err.code,\r\n message: err.message,\r\n ...(dev ? { detail: err.response } : {}),\r\n };\r\n }\r\n\r\n const message = err instanceof Error ? err.message : String(err);\r\n return {\r\n status: 500,\r\n code: 'INTERNAL_ERROR',\r\n message: dev ? message : 'An internal error occurred.',\r\n ...(dev\r\n ? {\r\n detail: {\r\n name: err instanceof Error ? err.name : typeof err,\r\n stack: err instanceof Error ? err.stack : undefined,\r\n },\r\n }\r\n : {}),\r\n };\r\n}\r\n\r\nexport function errorToResponse(\r\n err: unknown,\r\n mode: 'development' | 'production'\r\n): RuntimeBufferedResponse {\r\n const mapped = mapErrorToRuntimeError(err, mode);\r\n return {\r\n kind: 'buffered',\r\n status: mapped.status,\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n error: {\r\n code: mapped.code,\r\n message: mapped.message,\r\n ...(mapped.details !== undefined ? { details: mapped.details } : {}),\r\n ...(mapped.detail !== undefined ? { detail: mapped.detail } : {}),\r\n },\r\n }),\r\n };\r\n}\r\n","import type { CreateRuntimeOptions, Runtime, RuntimeCapabilities } from './types/options.js';\r\nimport type { RuntimeRequest } from './types/request.js';\r\nimport type { RuntimeResponse } from './types/response.js';\r\nimport { matchRoute, stripMountPath, type Route } from './routing.js';\r\nimport { createClientForRequest } from './client-factory.js';\r\nimport { errorToResponse, RuntimeHttpError } from './errors.js';\r\nimport { createLogger, PersonaApiError, type Logger } from '@personaai/sdk';\r\nimport type { RunDriver } from './runDriver.js';\r\nimport { evictStaleRuns, DEFAULT_RUN_GRACE_MS, DEFAULT_MAX_TRACKED_RUNS } from './runRegistry.js';\r\nimport { healthRoute } from './routes/health.js';\r\nimport { restToolsManifestRoute } from './routes/restToolsManifest.js';\r\nimport { rcpManifestRoute } from './routes/rcpManifest.js';\r\nimport { chatRoute } from './routes/chat.js';\r\nimport { architectRoute } from './routes/architect.js';\r\nimport { createResumeRoute } from './routes/resume.js';\r\nimport {\r\n listThreads,\r\n createThread,\r\n getThread,\r\n updateThread,\r\n deleteThread,\r\n bulkDeleteThreads,\r\n getThreadMessages,\r\n resetThread,\r\n} from './routes/threads.js';\r\nimport { createVoiceSession } from './routes/voice.js';\r\nimport { sendMessage, sendAgentMessage } from './routes/messages.js';\r\nimport {\r\n listAgents,\r\n createAgent,\r\n getAgent,\r\n updateAgent,\r\n deleteAgent,\r\n bulkDeleteAgents,\r\n getAgentMcpConnections,\r\n} from './routes/agents.js';\r\nimport {\r\n listFiles,\r\n uploadFile,\r\n downloadFile,\r\n deleteFile,\r\n bulkDeleteFiles,\r\n} from './routes/files.js';\r\nimport { listMemory, getMemoryFile, writeMemoryFile, deleteMemoryFile } from './routes/memory.js';\r\nimport {\r\n getOwnerAuthorizeUrl,\r\n getUserAuthorizeUrl,\r\n getUserConnectionStatus,\r\n disconnectUserConnection,\r\n disconnectOwnerConnection,\r\n} from './routes/mcpOAuth.js';\r\nimport {\r\n listMcps,\r\n createMcp,\r\n getMcp,\r\n updateMcp,\r\n deleteMcp,\r\n bulkDeleteMcps,\r\n getMcpUsage,\r\n testMcpConnection,\r\n readMcpResource,\r\n callMcpTool,\r\n} from './routes/mcps.js';\r\nimport {\r\n listProviders,\r\n createProvider,\r\n getProvider,\r\n updateProvider,\r\n deleteProvider,\r\n bulkDeleteProviders,\r\n testProviderConnection,\r\n getProviderModels,\r\n getProviderUsage,\r\n} from './routes/providers.js';\r\nimport {\r\n listSkills,\r\n createSkill,\r\n getSkill,\r\n updateSkill,\r\n deleteSkill,\r\n bulkDeleteSkills,\r\n getSkillUsage,\r\n} from './routes/skills.js';\r\nimport {\r\n listKnowledgeBases,\r\n createKnowledgeBase,\r\n getKnowledgeBase,\r\n updateKnowledgeBase,\r\n deleteKnowledgeBase,\r\n bulkDeleteKnowledgeBases,\r\n getKnowledgeBaseUsage,\r\n uploadKnowledgeDocuments,\r\n listKnowledgeDocuments,\r\n deleteKnowledgeDocument,\r\n searchKnowledgeBase,\r\n} from './routes/knowledge.js';\r\nimport {\r\n listStores,\r\n createStore,\r\n getStore,\r\n updateStore,\r\n deleteStore,\r\n listStoreFiles,\r\n getStoreFile,\r\n writeStoreFile,\r\n deleteStoreFile,\r\n} from './routes/stores.js';\r\nimport {\r\n listRcpSources,\r\n createRcpSource,\r\n getRcpSource,\r\n updateRcpSource,\r\n deleteRcpSource,\r\n bulkDeleteRcpSources,\r\n getRcpSourceUsage,\r\n testRcpSourceConnection,\r\n} from './routes/rcpSources.js';\r\nimport { listAuditLogs } from './routes/auditLogs.js';\r\nimport {\r\n listWorkflows,\r\n createWorkflow,\r\n getWorkflow,\r\n updateWorkflow,\r\n deleteWorkflow,\r\n saveWorkflowDraft,\r\n publishWorkflow,\r\n listWorkflowVersions,\r\n getWorkflowVersion,\r\n getWorkflowMermaid,\r\n listWorkflowRuns,\r\n getWorkflowRun,\r\n cancelWorkflowRun,\r\n} from './routes/workflows.js';\r\nimport { workflowStreamRoute } from './routes/workflowStream.js';\r\nimport { twilioVoiceChannel, twilioMessageChannel } from './routes/channels.js';\r\nimport { createFeedback } from './routes/feedback.js';\r\nimport { createWebhookRoute } from './routes/webhooks.js';\r\nimport {\r\n listSecrets,\r\n createSecret,\r\n getSecret,\r\n updateSecret,\r\n deleteSecret,\r\n getSecretUsage,\r\n bulkDeleteSecrets,\r\n} from './routes/secrets.js';\r\nimport {\r\n listRestToolSources,\r\n createRestToolSource,\r\n getRestToolSource,\r\n updateRestToolSource,\r\n deleteRestToolSource,\r\n getRestToolSourceUsage,\r\n testRestToolSource,\r\n bulkDeleteRestToolSources,\r\n} from './routes/restToolSources.js';\r\nimport {\r\n listAgentVersions,\r\n publishAgentVersion,\r\n agentVersionStats,\r\n getAgentVersion,\r\n diffAgentVersion,\r\n getAgentDeployments,\r\n setAgentServePolicy,\r\n deployAgentVersion,\r\n rollbackAgentDeployment,\r\n} from './routes/deploy.js';\r\nimport {\r\n listTraces,\r\n getTrace,\r\n getTraceFeedback,\r\n getReplayPlan,\r\n replayTrace,\r\n listTraceReplays,\r\n} from './routes/traces.js';\r\nimport {\r\n listDatasets,\r\n createDataset,\r\n getDataset,\r\n updateDataset,\r\n deleteDataset,\r\n listDatasetItems,\r\n addDatasetItems,\r\n addDatasetItemFromTrace,\r\n updateDatasetItem,\r\n deleteDatasetItem,\r\n listEvalRuns,\r\n startEvalRun,\r\n compareEvalRuns,\r\n getEvalRun,\r\n deleteEvalRun,\r\n listEvalResults,\r\n cancelEvalRun,\r\n} from './routes/evals.js';\r\nimport { getBudget, getUsage } from './routes/observe.js';\r\nimport { CAPABILITY_SCOPES } from './routes/health.js';\r\n\r\nfunction resolveCapabilities(\r\n capabilities: RuntimeCapabilities | undefined\r\n): Required<RuntimeCapabilities> {\r\n return {\r\n agentsWrite: capabilities?.agentsWrite ?? false,\r\n mcps: capabilities?.mcps ?? false,\r\n providers: capabilities?.providers ?? false,\r\n skills: capabilities?.skills ?? false,\r\n knowledge: capabilities?.knowledge ?? false,\r\n stores: capabilities?.stores ?? false,\r\n rcpSources: capabilities?.rcpSources ?? false,\r\n auditLogs: capabilities?.auditLogs ?? false,\r\n architect: capabilities?.architect ?? false,\r\n workflowsWrite: capabilities?.workflowsWrite ?? false,\r\n messages: capabilities?.messages ?? false,\r\n secrets: capabilities?.secrets ?? false,\r\n restToolSources: capabilities?.restToolSources ?? false,\r\n deploy: capabilities?.deploy ?? false,\r\n traces: capabilities?.traces ?? false,\r\n evals: capabilities?.evals ?? false,\r\n observe: capabilities?.observe ?? false,\r\n };\r\n}\r\n\r\nfunction buildRoutes(capabilities: Required<RuntimeCapabilities>): Route[] {\r\n const routes: Route[] = [\r\n { method: 'GET', pattern: ['health'], handler: healthRoute, requiresAuth: false },\r\n\r\n // Chat — always on, the core runtime feature.\r\n { method: 'POST', pattern: ['chat'], handler: chatRoute },\r\n { method: 'GET', pattern: ['chat', ':runId', 'resume'], handler: createResumeRoute('chat') },\r\n\r\n // Threads — always on, end-user-scoped conversation history.\r\n { method: 'GET', pattern: ['threads'], handler: listThreads },\r\n { method: 'POST', pattern: ['threads'], handler: createThread },\r\n { method: 'POST', pattern: ['threads', 'bulk-delete'], handler: bulkDeleteThreads },\r\n { method: 'GET', pattern: ['threads', ':id'], handler: getThread },\r\n { method: 'PATCH', pattern: ['threads', ':id'], handler: updateThread },\r\n { method: 'DELETE', pattern: ['threads', ':id'], handler: deleteThread },\r\n { method: 'GET', pattern: ['threads', ':id', 'messages'], handler: getThreadMessages },\r\n { method: 'POST', pattern: ['threads', ':id', 'reset'], handler: resetThread },\r\n\r\n // Voice — always on, end-user-scoped real-time voice sessions\r\n // (powered by Gemini Live). Mints a ticket only; the host's own\r\n // frontend opens the WebSocket directly, this runtime never proxies it.\r\n { method: 'POST', pattern: ['voice', 'sessions'], handler: createVoiceSession },\r\n\r\n // Feedback — always on: an end user rates one of their own runs\r\n // (Persona refuses ratings on anyone else's).\r\n { method: 'POST', pattern: ['feedback'], handler: createFeedback },\r\n\r\n // Agents — read-only discovery always on; write ops behind agentsWrite.\r\n { method: 'GET', pattern: ['agents'], handler: listAgents },\r\n\r\n // Files — always on, end-user-scoped uploads.\r\n { method: 'GET', pattern: ['files'], handler: listFiles },\r\n { method: 'POST', pattern: ['files'], handler: uploadFile },\r\n { method: 'POST', pattern: ['files', 'bulk-delete'], handler: bulkDeleteFiles },\r\n { method: 'GET', pattern: ['files', ':id'], handler: downloadFile },\r\n { method: 'DELETE', pattern: ['files', ':id'], handler: deleteFile },\r\n\r\n // Memory — always on, end-user-scoped.\r\n { method: 'GET', pattern: ['memory'], handler: listMemory },\r\n { method: 'GET', pattern: ['memory', 'file'], handler: getMemoryFile },\r\n { method: 'PUT', pattern: ['memory', 'file'], handler: writeMemoryFile },\r\n { method: 'DELETE', pattern: ['memory', 'file'], handler: deleteMemoryFile },\r\n\r\n // MCP OAuth — always on, end-user connects their own account.\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'oauth', 'owner', 'authorize'],\r\n handler: getOwnerAuthorizeUrl,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'oauth', 'user', 'authorize'],\r\n handler: getUserAuthorizeUrl,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'oauth', 'user', 'status'],\r\n handler: getUserConnectionStatus,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['mcps', ':id', 'oauth', 'user', 'connection'],\r\n handler: disconnectUserConnection,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['mcps', ':id', 'oauth', 'owner', 'connection'],\r\n handler: disconnectOwnerConnection,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['agents', ':id', 'mcp-connections'],\r\n handler: getAgentMcpConnections,\r\n },\r\n // MCP App resources and widget tool calls — always on for conversational widgets.\r\n {\r\n method: 'GET',\r\n pattern: ['mcps', ':id', 'resource'],\r\n handler: readMcpResource,\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['mcps', ':id', 'call-tool'],\r\n handler: callMcpTool,\r\n },\r\n\r\n // Workflows — read-only discovery & execution always on; authoring ops behind workflowsWrite.\r\n { method: 'GET', pattern: ['workflows'], handler: listWorkflows },\r\n { method: 'POST', pattern: ['workflows', ':id', 'stream'], handler: workflowStreamRoute },\r\n {\r\n method: 'GET',\r\n pattern: ['workflows', 'runs', ':runId', 'resume'],\r\n handler: createResumeRoute('workflow'),\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['workflows', 'runs', ':runId', 'cancel'],\r\n handler: cancelWorkflowRun,\r\n },\r\n ];\r\n\r\n // Messaging — opt-in, unlike voice: a send reaches any number the caller\r\n // names and spends this Project's Twilio balance, so it isn't\r\n // end-user-scoped even though the caller must still authenticate.\r\n if (capabilities.messages) {\r\n routes.push(\r\n { method: 'POST', pattern: ['messages'], handler: sendMessage },\r\n { method: 'POST', pattern: ['messages', 'agent'], handler: sendAgentMessage }\r\n );\r\n }\r\n\r\n if (capabilities.agentsWrite) {\r\n routes.push(\r\n { method: 'POST', pattern: ['agents'], handler: createAgent },\r\n { method: 'POST', pattern: ['agents', 'bulk-delete'], handler: bulkDeleteAgents },\r\n { method: 'GET', pattern: ['agents', ':id'], handler: getAgent },\r\n { method: 'PATCH', pattern: ['agents', ':id'], handler: updateAgent },\r\n { method: 'DELETE', pattern: ['agents', ':id'], handler: deleteAgent }\r\n );\r\n }\r\n\r\n if (capabilities.mcps) {\r\n routes.push(\r\n { method: 'GET', pattern: ['mcps'], handler: listMcps },\r\n { method: 'POST', pattern: ['mcps'], handler: createMcp },\r\n { method: 'POST', pattern: ['mcps', 'bulk-delete'], handler: bulkDeleteMcps },\r\n { method: 'GET', pattern: ['mcps', ':id'], handler: getMcp },\r\n { method: 'PATCH', pattern: ['mcps', ':id'], handler: updateMcp },\r\n { method: 'DELETE', pattern: ['mcps', ':id'], handler: deleteMcp },\r\n { method: 'GET', pattern: ['mcps', ':id', 'usage'], handler: getMcpUsage },\r\n { method: 'POST', pattern: ['mcps', ':id', 'test'], handler: testMcpConnection }\r\n );\r\n }\r\n\r\n if (capabilities.providers) {\r\n routes.push(\r\n { method: 'GET', pattern: ['providers'], handler: listProviders },\r\n { method: 'POST', pattern: ['providers'], handler: createProvider },\r\n { method: 'POST', pattern: ['providers', 'bulk-delete'], handler: bulkDeleteProviders },\r\n { method: 'GET', pattern: ['providers', ':id'], handler: getProvider },\r\n { method: 'PATCH', pattern: ['providers', ':id'], handler: updateProvider },\r\n { method: 'DELETE', pattern: ['providers', ':id'], handler: deleteProvider },\r\n { method: 'POST', pattern: ['providers', ':id', 'test'], handler: testProviderConnection },\r\n { method: 'GET', pattern: ['providers', ':id', 'models'], handler: getProviderModels },\r\n { method: 'GET', pattern: ['providers', ':id', 'usage'], handler: getProviderUsage }\r\n );\r\n }\r\n\r\n if (capabilities.skills) {\r\n routes.push(\r\n { method: 'GET', pattern: ['skills'], handler: listSkills },\r\n { method: 'POST', pattern: ['skills'], handler: createSkill },\r\n { method: 'POST', pattern: ['skills', 'bulk-delete'], handler: bulkDeleteSkills },\r\n { method: 'GET', pattern: ['skills', ':id'], handler: getSkill },\r\n { method: 'PATCH', pattern: ['skills', ':id'], handler: updateSkill },\r\n { method: 'DELETE', pattern: ['skills', ':id'], handler: deleteSkill },\r\n { method: 'GET', pattern: ['skills', ':id', 'usage'], handler: getSkillUsage }\r\n );\r\n }\r\n\r\n if (capabilities.knowledge) {\r\n routes.push(\r\n { method: 'GET', pattern: ['knowledge'], handler: listKnowledgeBases },\r\n { method: 'POST', pattern: ['knowledge'], handler: createKnowledgeBase },\r\n { method: 'POST', pattern: ['knowledge', 'bulk-delete'], handler: bulkDeleteKnowledgeBases },\r\n { method: 'GET', pattern: ['knowledge', ':id'], handler: getKnowledgeBase },\r\n { method: 'PATCH', pattern: ['knowledge', ':id'], handler: updateKnowledgeBase },\r\n { method: 'DELETE', pattern: ['knowledge', ':id'], handler: deleteKnowledgeBase },\r\n { method: 'GET', pattern: ['knowledge', ':id', 'usage'], handler: getKnowledgeBaseUsage },\r\n {\r\n method: 'POST',\r\n pattern: ['knowledge', ':id', 'documents'],\r\n handler: uploadKnowledgeDocuments,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['knowledge', ':id', 'documents'],\r\n handler: listKnowledgeDocuments,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['knowledge', ':id', 'documents', ':sourceName'],\r\n handler: deleteKnowledgeDocument,\r\n },\r\n { method: 'POST', pattern: ['knowledge', ':id', 'search'], handler: searchKnowledgeBase }\r\n );\r\n }\r\n\r\n if (capabilities.stores) {\r\n routes.push(\r\n { method: 'GET', pattern: ['stores'], handler: listStores },\r\n { method: 'POST', pattern: ['stores'], handler: createStore },\r\n { method: 'GET', pattern: ['stores', ':id'], handler: getStore },\r\n { method: 'PATCH', pattern: ['stores', ':id'], handler: updateStore },\r\n { method: 'DELETE', pattern: ['stores', ':id'], handler: deleteStore },\r\n { method: 'GET', pattern: ['stores', ':id', 'files'], handler: listStoreFiles },\r\n { method: 'GET', pattern: ['stores', ':id', 'file'], handler: getStoreFile },\r\n { method: 'PUT', pattern: ['stores', ':id', 'file'], handler: writeStoreFile },\r\n { method: 'DELETE', pattern: ['stores', ':id', 'file'], handler: deleteStoreFile }\r\n );\r\n }\r\n\r\n if (capabilities.rcpSources) {\r\n routes.push(\r\n { method: 'GET', pattern: ['rcp-sources'], handler: listRcpSources },\r\n { method: 'POST', pattern: ['rcp-sources'], handler: createRcpSource },\r\n { method: 'POST', pattern: ['rcp-sources', 'bulk-delete'], handler: bulkDeleteRcpSources },\r\n { method: 'GET', pattern: ['rcp-sources', ':id'], handler: getRcpSource },\r\n { method: 'PATCH', pattern: ['rcp-sources', ':id'], handler: updateRcpSource },\r\n { method: 'DELETE', pattern: ['rcp-sources', ':id'], handler: deleteRcpSource },\r\n { method: 'GET', pattern: ['rcp-sources', ':id', 'usage'], handler: getRcpSourceUsage },\r\n { method: 'POST', pattern: ['rcp-sources', ':id', 'test'], handler: testRcpSourceConnection }\r\n );\r\n }\r\n\r\n if (capabilities.auditLogs) {\r\n routes.push({ method: 'GET', pattern: ['audit-logs'], handler: listAuditLogs });\r\n }\r\n\r\n if (capabilities.architect) {\r\n routes.push(\r\n { method: 'POST', pattern: ['architect'], handler: architectRoute },\r\n {\r\n method: 'GET',\r\n pattern: ['architect', ':runId', 'resume'],\r\n handler: createResumeRoute('architect'),\r\n }\r\n );\r\n }\r\n\r\n if (capabilities.workflowsWrite) {\r\n routes.push(\r\n { method: 'POST', pattern: ['workflows'], handler: createWorkflow },\r\n { method: 'GET', pattern: ['workflows', ':id'], handler: getWorkflow },\r\n { method: 'PATCH', pattern: ['workflows', ':id'], handler: updateWorkflow },\r\n { method: 'DELETE', pattern: ['workflows', ':id'], handler: deleteWorkflow },\r\n { method: 'PUT', pattern: ['workflows', ':id', 'draft'], handler: saveWorkflowDraft },\r\n { method: 'POST', pattern: ['workflows', ':id', 'publish'], handler: publishWorkflow },\r\n { method: 'GET', pattern: ['workflows', ':id', 'versions'], handler: listWorkflowVersions },\r\n {\r\n method: 'GET',\r\n pattern: ['workflows', ':id', 'versions', ':version'],\r\n handler: getWorkflowVersion,\r\n },\r\n { method: 'GET', pattern: ['workflows', ':id', 'mermaid'], handler: getWorkflowMermaid },\r\n { method: 'GET', pattern: ['workflows', ':id', 'runs'], handler: listWorkflowRuns },\r\n { method: 'GET', pattern: ['workflows', 'runs', ':runId'], handler: getWorkflowRun }\r\n );\r\n }\r\n\r\n if (capabilities.secrets) {\r\n routes.push(\r\n { method: 'GET', pattern: ['secrets'], handler: listSecrets },\r\n { method: 'POST', pattern: ['secrets'], handler: createSecret },\r\n { method: 'POST', pattern: ['secrets', 'bulk-delete'], handler: bulkDeleteSecrets },\r\n { method: 'GET', pattern: ['secrets', ':id'], handler: getSecret },\r\n { method: 'PATCH', pattern: ['secrets', ':id'], handler: updateSecret },\r\n { method: 'DELETE', pattern: ['secrets', ':id'], handler: deleteSecret },\r\n { method: 'GET', pattern: ['secrets', ':id', 'usage'], handler: getSecretUsage }\r\n );\r\n }\r\n\r\n if (capabilities.restToolSources) {\r\n routes.push(\r\n { method: 'GET', pattern: ['rest-tool-sources'], handler: listRestToolSources },\r\n { method: 'POST', pattern: ['rest-tool-sources'], handler: createRestToolSource },\r\n {\r\n method: 'POST',\r\n pattern: ['rest-tool-sources', 'bulk-delete'],\r\n handler: bulkDeleteRestToolSources,\r\n },\r\n { method: 'GET', pattern: ['rest-tool-sources', ':id'], handler: getRestToolSource },\r\n { method: 'PATCH', pattern: ['rest-tool-sources', ':id'], handler: updateRestToolSource },\r\n { method: 'DELETE', pattern: ['rest-tool-sources', ':id'], handler: deleteRestToolSource },\r\n {\r\n method: 'GET',\r\n pattern: ['rest-tool-sources', ':id', 'usage'],\r\n handler: getRestToolSourceUsage,\r\n },\r\n { method: 'POST', pattern: ['rest-tool-sources', ':id', 'test'], handler: testRestToolSource }\r\n );\r\n }\r\n\r\n // Project-wide admin surface (Project-scoped client, no end user).\r\n\r\n if (capabilities.deploy) {\r\n routes.push(\r\n { method: 'GET', pattern: ['agents', ':id', 'versions'], handler: listAgentVersions },\r\n { method: 'POST', pattern: ['agents', ':id', 'versions'], handler: publishAgentVersion },\r\n // Before `versions/:version`, which would otherwise capture \"stats\".\r\n {\r\n method: 'GET',\r\n pattern: ['agents', ':id', 'versions', 'stats'],\r\n handler: agentVersionStats,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['agents', ':id', 'versions', ':version'],\r\n handler: getAgentVersion,\r\n },\r\n {\r\n method: 'GET',\r\n pattern: ['agents', ':id', 'versions', ':version', 'diff'],\r\n handler: diffAgentVersion,\r\n },\r\n { method: 'GET', pattern: ['agents', ':id', 'deployments'], handler: getAgentDeployments },\r\n {\r\n method: 'PUT',\r\n pattern: ['agents', ':id', 'deployments', 'policy'],\r\n handler: setAgentServePolicy,\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['agents', ':id', 'deployments', ':environment'],\r\n handler: deployAgentVersion,\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['agents', ':id', 'deployments', ':environment', 'rollback'],\r\n handler: rollbackAgentDeployment,\r\n }\r\n );\r\n }\r\n\r\n if (capabilities.traces) {\r\n routes.push(\r\n { method: 'GET', pattern: ['traces'], handler: listTraces },\r\n { method: 'GET', pattern: ['traces', ':id'], handler: getTrace },\r\n { method: 'GET', pattern: ['traces', ':id', 'feedback'], handler: getTraceFeedback },\r\n { method: 'GET', pattern: ['traces', ':id', 'replay'], handler: getReplayPlan },\r\n { method: 'POST', pattern: ['traces', ':id', 'replay'], handler: replayTrace },\r\n { method: 'GET', pattern: ['traces', ':id', 'replays'], handler: listTraceReplays }\r\n );\r\n }\r\n\r\n if (capabilities.evals) {\r\n routes.push(\r\n { method: 'GET', pattern: ['datasets'], handler: listDatasets },\r\n { method: 'POST', pattern: ['datasets'], handler: createDataset },\r\n { method: 'GET', pattern: ['datasets', ':id'], handler: getDataset },\r\n { method: 'PATCH', pattern: ['datasets', ':id'], handler: updateDataset },\r\n { method: 'DELETE', pattern: ['datasets', ':id'], handler: deleteDataset },\r\n { method: 'GET', pattern: ['datasets', ':id', 'items'], handler: listDatasetItems },\r\n { method: 'POST', pattern: ['datasets', ':id', 'items'], handler: addDatasetItems },\r\n {\r\n method: 'POST',\r\n pattern: ['datasets', ':id', 'items', 'from-trace'],\r\n handler: addDatasetItemFromTrace,\r\n },\r\n {\r\n method: 'PATCH',\r\n pattern: ['datasets', ':id', 'items', ':itemId'],\r\n handler: updateDatasetItem,\r\n },\r\n {\r\n method: 'DELETE',\r\n pattern: ['datasets', ':id', 'items', ':itemId'],\r\n handler: deleteDatasetItem,\r\n },\r\n { method: 'GET', pattern: ['eval-runs'], handler: listEvalRuns },\r\n { method: 'POST', pattern: ['eval-runs'], handler: startEvalRun },\r\n // Before `eval-runs/:id`, which would otherwise capture \"compare\".\r\n { method: 'GET', pattern: ['eval-runs', 'compare'], handler: compareEvalRuns },\r\n { method: 'GET', pattern: ['eval-runs', ':id'], handler: getEvalRun },\r\n { method: 'DELETE', pattern: ['eval-runs', ':id'], handler: deleteEvalRun },\r\n { method: 'GET', pattern: ['eval-runs', ':id', 'results'], handler: listEvalResults },\r\n { method: 'POST', pattern: ['eval-runs', ':id', 'cancel'], handler: cancelEvalRun }\r\n );\r\n }\r\n\r\n if (capabilities.observe) {\r\n routes.push(\r\n { method: 'GET', pattern: ['observe', 'budget'], handler: getBudget },\r\n { method: 'GET', pattern: ['observe', 'usage'], handler: getUsage }\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\nconst ADMIN_CAPABILITIES = ['deploy', 'traces', 'evals', 'observe'];\r\n\r\nfunction resolveMode(options: CreateRuntimeOptions): 'development' | 'production' {\r\n if (options.mode) return options.mode;\r\n return process.env.NODE_ENV === 'development' ? 'development' : 'production';\r\n}\r\n\r\nexport function createRuntime(options: CreateRuntimeOptions): Runtime {\r\n if (!options.baseUrl) throw new Error('createRuntime: \"baseUrl\" is required');\r\n if (!options.credential) throw new Error('createRuntime: \"credential\" is required');\r\n if (!options.resolveUser) throw new Error('createRuntime: \"resolveUser\" is required');\r\n\r\n const logger: Logger =\r\n options.logger ??\r\n createLogger(\r\n 'runtime',\r\n options.logLevel !== undefined ? { level: options.logLevel } : undefined\r\n );\r\n\r\n const capabilities = resolveCapabilities(options.capabilities);\r\n const routes = buildRoutes(capabilities);\r\n if (options.restToolsManifest) {\r\n // Not capability-gated — this route serves the host's own static data\r\n // (never calls PersonaClient) and is only added when configured at all.\r\n routes.push({\r\n method: 'GET',\r\n pattern: ['rest-tools', 'manifest'],\r\n handler: restToolsManifestRoute,\r\n requiresAuth: false,\r\n });\r\n }\r\n if (options.rcpManifest) {\r\n // Independent of restToolsManifest above — unrelated protocols, both\r\n // servable from the same runtime instance.\r\n routes.push({\r\n method: 'GET',\r\n pattern: ['rcp', 'manifest'],\r\n handler: rcpManifestRoute,\r\n requiresAuth: false,\r\n });\r\n }\r\n if (options.channels?.twilio) {\r\n // Bring-your-own-Twilio-number webhooks. Public by design: Twilio carries\r\n // no end-user session, so each handler verifies X-Twilio-Signature with\r\n // the host's own auth token and resolves the sender itself. Only exist\r\n // when configured at all.\r\n routes.push(\r\n {\r\n method: 'POST',\r\n pattern: ['channels', 'twilio', 'voice'],\r\n handler: twilioVoiceChannel,\r\n requiresAuth: false,\r\n },\r\n {\r\n method: 'POST',\r\n pattern: ['channels', 'twilio', 'message'],\r\n handler: twilioMessageChannel,\r\n requiresAuth: false,\r\n }\r\n );\r\n }\r\n if (options.webhooks) {\r\n if (!options.webhooks.secret) throw new Error('createRuntime: \"webhooks.secret\" is required');\r\n // Public like the Twilio channels: Persona carries no end-user session,\r\n // the handler checks X-Persona-Signature instead.\r\n routes.push({\r\n method: 'POST',\r\n pattern: ['webhooks', 'persona'],\r\n handler: createWebhookRoute(),\r\n requiresAuth: false,\r\n });\r\n }\r\n const mode = resolveMode(options);\r\n const heartbeatIntervalMs = options.heartbeatIntervalMs ?? 15000;\r\n\r\n const runGraceMs = options.runGraceMs ?? DEFAULT_RUN_GRACE_MS;\r\n const maxTrackedRuns = options.maxTrackedRuns ?? DEFAULT_MAX_TRACKED_RUNS;\r\n\r\n logger.debug('runtime init', {\r\n mode,\r\n mountPath: options.mountPath ?? '',\r\n capabilities,\r\n heartbeatIntervalMs,\r\n runGraceMs,\r\n maxTrackedRuns,\r\n });\r\n const enabledCaps = Object.entries(capabilities)\r\n .filter(([, v]) => v)\r\n .map(([k]) => k);\r\n logger.info('runtime created', {\r\n mode,\r\n mountPath: options.mountPath ?? '',\r\n enabledCapabilities: enabledCaps.length ? enabledCaps : ['(core only)'],\r\n });\r\n const adminCaps = enabledCaps.filter((c) => ADMIN_CAPABILITIES.includes(c));\r\n if (adminCaps.length) {\r\n logger.warn(\r\n 'Project-wide admin capabilities are on: they act for the whole Project, not the resolved user. ' +\r\n 'Serve them only behind a resolveUser that admits your own team.',\r\n {\r\n capabilities: adminCaps,\r\n scopes: Object.fromEntries(\r\n adminCaps.map((c) => [c, CAPABILITY_SCOPES[c as keyof typeof CAPABILITY_SCOPES]])\r\n ),\r\n }\r\n );\r\n }\r\n logger.trace('runtime config', {\r\n baseUrl: options.baseUrl,\r\n hasHooks: !!options.hooks,\r\n routeCount: routes.length,\r\n });\r\n\r\n const runs = new Map<string, RunDriver>();\r\n const evictionTimer = setInterval(() => {\r\n const before = runs.size;\r\n evictStaleRuns(runs, Date.now(), runGraceMs, maxTrackedRuns);\r\n if (runs.size !== before) {\r\n logger.debug('run eviction sweep', { before, after: runs.size, runGraceMs, maxTrackedRuns });\r\n } else {\r\n logger.trace('run eviction sweep — no evictions', { before });\r\n }\r\n }, 60_000);\r\n evictionTimer.unref?.();\r\n\r\n function getRequestPreview(req: RuntimeRequest): Record<string, unknown> {\r\n const preview: Record<string, unknown> = {\r\n method: req.method,\r\n path: req.path,\r\n hasQuery: req.query && Object.keys(req.query).length > 0,\r\n hasBody: req.body !== undefined,\r\n hasFile: !!req.file,\r\n fileCount: req.files?.length ?? 0,\r\n userId: req.userId ?? null,\r\n };\r\n // Redact sensitive header values at trace level only\r\n if (req.headers) {\r\n const redacted: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(req.headers)) {\r\n if (v === undefined) continue;\r\n if (k.toLowerCase() === 'authorization') redacted[k] = '***';\r\n else redacted[k] = v;\r\n }\r\n preview.headers = redacted;\r\n }\r\n if (req.query && Object.keys(req.query).length) preview.query = req.query;\r\n return preview;\r\n }\r\n\r\n async function handle(request: RuntimeRequest): Promise<RuntimeResponse> {\r\n const startMs = Date.now();\r\n logger.debug('handle start', { method: request.method, path: request.path });\r\n logger.trace('handle request details', getRequestPreview(request));\r\n\r\n try {\r\n const path = stripMountPath(request.path, options.mountPath);\r\n logger.trace('stripMountPath', {\r\n originalPath: request.path,\r\n mountPath: options.mountPath ?? '',\r\n strippedPath: path,\r\n });\r\n\r\n const match = matchRoute(routes, request.method, path);\r\n\r\n if (match.kind === 'not-found') {\r\n logger.warn('route not found', {\r\n method: request.method,\r\n path: request.path,\r\n strippedPath: path,\r\n });\r\n throw new RuntimeHttpError(\r\n 404,\r\n 'NOT_FOUND',\r\n `No route for ${request.method} ${request.path}`\r\n );\r\n }\r\n if (match.kind === 'method-not-allowed') {\r\n logger.warn('method not allowed', {\r\n method: request.method,\r\n path: request.path,\r\n strippedPath: path,\r\n allowed: match.allowed,\r\n });\r\n const err = new RuntimeHttpError(\r\n 405,\r\n 'METHOD_NOT_ALLOWED',\r\n `${request.method} not allowed on ${request.path}. Allowed: ${match.allowed.join(', ')}.`\r\n );\r\n const response = errorToResponse(err, mode);\r\n logger.debug('handle completed — 405', {\r\n method: request.method,\r\n path: request.path,\r\n allowed: match.allowed,\r\n durationMs: Date.now() - startMs,\r\n });\r\n return { ...response, headers: { ...response.headers, Allow: match.allowed.join(', ') } };\r\n }\r\n\r\n logger.info('route matched', {\r\n method: request.method,\r\n path: request.path,\r\n strippedPath: path,\r\n pattern: match.route.pattern.join('/'),\r\n params: match.params,\r\n requiresAuth: match.route.requiresAuth !== false,\r\n });\r\n logger.debug('route matched', {\r\n method: request.method,\r\n path,\r\n pattern: match.route.pattern,\r\n params: match.params,\r\n });\r\n logger.trace('route handler', {\r\n handler: match.route.handler.name || 'anonymous',\r\n pattern: match.route.pattern,\r\n });\r\n\r\n let userId: string | null = null;\r\n if (match.route.requiresAuth !== false) {\r\n logger.debug('resolving user', { path: request.path });\r\n try {\r\n const resolved = await options.resolveUser(request);\r\n userId = typeof resolved === 'string' && resolved.length > 0 ? resolved : null;\r\n logger.trace('resolveUser result', { userId: userId ?? null, hasResult: !!userId });\r\n } catch (err) {\r\n userId = null;\r\n logger.warn('resolveUser threw', {\r\n path: request.path,\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n }\r\n if (userId === null) {\r\n logger.warn('unauthorized — could not resolve user', {\r\n method: request.method,\r\n path: request.path,\r\n });\r\n throw new RuntimeHttpError(\r\n 401,\r\n 'UNAUTHORIZED',\r\n 'Could not resolve an authenticated user for this request.'\r\n );\r\n }\r\n logger.debug('user resolved', { userId });\r\n } else {\r\n logger.debug('skipping auth for public route', { path: request.path });\r\n }\r\n\r\n const resolvedRequest: RuntimeRequest = { ...request, userId };\r\n const client = createClientForRequest(options, userId, logger);\r\n let projectClient: ReturnType<typeof createClientForRequest> | undefined;\r\n const routeLogger = logger.child('route');\r\n\r\n logger.debug('handler start', {\r\n method: request.method,\r\n path: request.path,\r\n handler: match.route.handler.name || 'anonymous',\r\n userId,\r\n });\r\n\r\n const response = await match.route.handler(resolvedRequest, {\r\n client,\r\n hooks: options.hooks,\r\n mode,\r\n params: match.params,\r\n heartbeatIntervalMs,\r\n runs,\r\n capabilities,\r\n logger: routeLogger,\r\n restToolsManifest: options.restToolsManifest,\r\n rcpManifest: options.rcpManifest,\r\n channels: options.channels,\r\n projectClient: () =>\r\n userId === null\r\n ? client\r\n : (projectClient ??= createClientForRequest(options, null, logger)),\r\n webhooks: options.webhooks,\r\n versioning: {\r\n selectVersion: options.selectVersion,\r\n defaultEnvironment: options.defaultEnvironment,\r\n allowClientVersionSelection: options.allowClientVersionSelection,\r\n },\r\n forwardTraceparent: options.forwardTraceparent ?? true,\r\n });\r\n\r\n const durationMs = Date.now() - startMs;\r\n logger.info('handle succeeded', {\r\n method: request.method,\r\n path: request.path,\r\n status: response.status,\r\n kind: response.kind,\r\n durationMs,\r\n userId,\r\n });\r\n logger.debug('handle completed', {\r\n method: request.method,\r\n path: request.path,\r\n status: response.status,\r\n durationMs,\r\n });\r\n logger.trace('handle response details', {\r\n method: request.method,\r\n path: request.path,\r\n status: response.status,\r\n headers: response.headers,\r\n kind: response.kind,\r\n durationMs,\r\n });\r\n\r\n return response;\r\n } catch (err) {\r\n const durationMs = Date.now() - startMs;\r\n const isHttpError = err instanceof RuntimeHttpError;\r\n // Upstream failures surface as PersonaApiError (from the SDK HTTP\r\n // client), not RuntimeHttpError — they were previously misclassified\r\n // as \"unexpected\" with code/status dropped, so the log said\r\n // `code: undefined, status: undefined` even when the exact upstream\r\n // status and code were known. Both shapes are recognized now.\r\n const isApiError = !isHttpError && err instanceof PersonaApiError;\r\n const failureStatus = isHttpError\r\n ? (err as RuntimeHttpError).status\r\n : isApiError\r\n ? err.statusCode\r\n : undefined;\r\n const meta = {\r\n method: request.method,\r\n path: request.path,\r\n durationMs,\r\n error: err instanceof Error ? err.message : String(err),\r\n code: isHttpError ? (err as RuntimeHttpError).code : isApiError ? err.code : undefined,\r\n status: failureStatus,\r\n };\r\n if (failureStatus !== undefined && failureStatus >= 500) {\r\n logger.error('handle failed — server error', meta);\r\n } else if (failureStatus !== undefined && failureStatus >= 400) {\r\n logger.warn('handle failed — client error', meta);\r\n } else {\r\n logger.error('handle failed — unexpected error', meta);\r\n }\r\n logger.trace('handle error details', { error: err, durationMs });\r\n return errorToResponse(err, mode);\r\n }\r\n }\r\n\r\n return {\r\n handle,\r\n close() {\r\n logger.debug('runtime close', { trackedRuns: runs.size });\r\n clearInterval(evictionTimer);\r\n logger.info('runtime closed', { trackedRuns: runs.size });\r\n },\r\n };\r\n}\r\n","import type { RunDriver } from './runDriver.js';\r\n\r\n/** How long a finished run stays resumable before it's evicted. */\r\nexport const DEFAULT_RUN_GRACE_MS = 5 * 60 * 1000;\r\n/** Safety valve against unbounded growth from many short-lived runs whose clients never reconnect. */\r\nexport const DEFAULT_MAX_TRACKED_RUNS = 1000;\r\n\r\n/**\r\n * Removes finished runs older than `graceMs`, then (if still over\r\n * `maxTracked`) evicts the oldest-finished runs until back under the cap.\r\n * Still-in-flight runs are never evicted by the cap — only completed ones.\r\n * Pure function over the registry Map so it's directly unit-testable\r\n * without waiting on a real timer.\r\n */\r\nexport function evictStaleRuns(\r\n runs: Map<string, RunDriver>,\r\n now: number,\r\n graceMs: number = DEFAULT_RUN_GRACE_MS,\r\n maxTracked: number = DEFAULT_MAX_TRACKED_RUNS\r\n): void {\r\n for (const [id, driver] of runs) {\r\n if (\r\n driver.isFinished() &&\r\n driver.finishedAt !== undefined &&\r\n now - driver.finishedAt > graceMs\r\n ) {\r\n runs.delete(id);\r\n }\r\n }\r\n\r\n const overBy = runs.size - maxTracked;\r\n if (overBy <= 0) return;\r\n\r\n const finished = [...runs.entries()]\r\n .filter(([, driver]) => driver.isFinished())\r\n .sort((a, b) => (a[1].finishedAt ?? 0) - (b[1].finishedAt ?? 0));\r\n\r\n let remaining = overBy;\r\n for (const [id] of finished) {\r\n if (remaining <= 0) break;\r\n runs.delete(id);\r\n remaining -= 1;\r\n }\r\n}\r\n","export const RUNTIME_VERSION = '0.24.0';\n","import type { RouteHandler } from '../routing.js';\r\nimport type { RuntimeCapabilities } from '../types/options.js';\r\nimport { errorToResponse } from '../errors.js';\r\nimport { RUNTIME_VERSION } from '../version.js';\r\n\r\nconst alwaysOnCapabilities = {\r\n chat: true,\r\n threads: true,\r\n agents: true,\r\n files: true,\r\n memory: true,\r\n mcpOAuth: true,\r\n workflows: true,\r\n voice: true,\r\n feedback: true,\r\n};\r\n\r\n/** The API key scope each capability needs (`*` covers everything). */\r\nexport const CAPABILITY_SCOPES: Record<keyof RuntimeCapabilities, string[]> = {\r\n agentsWrite: ['*'],\r\n mcps: ['*'],\r\n providers: ['*'],\r\n skills: ['*'],\r\n knowledge: ['*'],\r\n stores: ['*'],\r\n rcpSources: ['*'],\r\n auditLogs: ['*'],\r\n architect: ['*'],\r\n workflowsWrite: ['*'],\r\n secrets: ['*'],\r\n restToolSources: ['*'],\r\n messages: ['agent:invoke'],\r\n deploy: ['deploy:write'],\r\n traces: ['traces:read', 'agent:invoke'],\r\n evals: ['eval:run'],\r\n observe: ['traces:read'],\r\n};\r\n\r\n/** What's missing for the always-on routes and each enabled capability. */\r\nexport function scopeWarnings(\r\n scopes: string[] | undefined,\r\n capabilities: Required<RuntimeCapabilities>\r\n): string[] {\r\n if (!scopes || scopes.includes('*')) return [];\r\n const has = (s: string) => scopes.includes(s);\r\n const warnings: string[] = [];\r\n if (!has('agent:invoke')) {\r\n warnings.push(\r\n 'The API key lacks \"agent:invoke\": chat, threads, files, memory and voice will fail.'\r\n );\r\n }\r\n for (const [cap, needed] of Object.entries(CAPABILITY_SCOPES)) {\r\n if (!capabilities[cap as keyof RuntimeCapabilities]) continue;\r\n const missing = needed.filter((s) => !has(s));\r\n if (missing.length) {\r\n warnings.push(\r\n `capabilities.${cap} is on but the API key lacks ${missing.map((s) => `\"${s}\"`).join(' and ')}.`\r\n );\r\n }\r\n }\r\n return warnings;\r\n}\r\n\r\n/**\r\n * Liveness/capability probe — deliberately does not require `resolveUser`\r\n * (this route's `requiresAuth: false`, so `request.userId` stays `null` and\r\n * `ctx.client` is naturally a bare, Project-scoped client). It's for\r\n * monitoring/status pages, not a user-scoped call; a host that wants it\r\n * gated behind auth can do so in its own router before mounting.\r\n *\r\n * `capabilities` reflects the *actual* resolved `RuntimeCapabilities` this\r\n * instance was created with. `scopes` is the API key's scopes, and\r\n * `warnings` lists enabled capabilities the key can't serve (also logged),\r\n * so a misconfigured deployment shows up here instead of as 500s.\r\n */\r\nexport const healthRoute: RouteHandler = async (_request, ctx) => {\r\n let principal: unknown;\r\n try {\r\n principal = await ctx.client.whoami();\r\n } catch (err) {\r\n const failed = errorToResponse(err, ctx.mode);\r\n return { ...failed, status: 503 };\r\n }\r\n\r\n const raw = (principal as { scopes?: unknown } | undefined)?.scopes;\r\n const scopes = Array.isArray(raw)\r\n ? raw.filter((s): s is string => typeof s === 'string')\r\n : undefined;\r\n const warnings = scopeWarnings(scopes, ctx.capabilities);\r\n for (const w of warnings) ctx.logger.warn(w);\r\n\r\n return {\r\n kind: 'buffered',\r\n status: 200,\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n status: 'ok',\r\n version: RUNTIME_VERSION,\r\n capabilities: { ...alwaysOnCapabilities, ...ctx.capabilities },\r\n ...(scopes ? { scopes } : {}),\r\n ...(warnings.length ? { warnings } : {}),\r\n }),\r\n };\r\n};\r\n","import type { FrontendToolDefinition } from '@personaai/sdk';\nimport type { RouteContext } from './routing.js';\nimport { RuntimeHttpError } from './errors.js';\nimport type { RuntimeBufferedResponse } from './types/response.js';\n\n/**\n * Frontend tools from the browser (`@personaai/react`'s useFrontendTool &\n * co.) — on `POST /chat` and `POST /voice/session`. Only the outer shape is\n * checked here (a 400 otherwise); each entry's name/schema is validated (and\n * invalid ones dropped) by the backend, which also ignores them entirely\n * unless the Agent has `frontendToolsEnabled`. Empty → undefined.\n */\nexport function parseFrontendTools(value: unknown): FrontendToolDefinition[] | undefined {\n if (value === undefined || value === null) return undefined;\n if (\n !Array.isArray(value) ||\n !value.every((t) => typeof t === 'object' && t !== null && typeof t.name === 'string')\n ) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"tools\" must be an array of { name, description?, parameters? } objects.'\n );\n }\n return value.length > 0 ? (value as FrontendToolDefinition[]) : undefined;\n}\n\nexport function json(status: number, value: unknown): RuntimeBufferedResponse {\n return {\n kind: 'buffered',\n status,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(value),\n };\n}\n\nexport function noContent(): RuntimeBufferedResponse {\n return { kind: 'buffered', status: 204, headers: {}, body: '' };\n}\n\nexport function requireParam(params: Record<string, string>, name: string): string {\n const value = params[name];\n if (!value) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `\"${name}\" path parameter is required.`);\n }\n return value;\n}\n\nexport function requireQueryParam(query: Record<string, string | undefined>, name: string): string {\n const value = query[name];\n if (!value) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `\"${name}\" query parameter is required.`);\n }\n return value;\n}\n\nexport function toInt(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nexport function requireBodyObject(body: unknown): Record<string, unknown> {\n if (typeof body !== 'object' || body === null) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\n }\n return body as Record<string, unknown>;\n}\n\nexport function requireStringField(body: Record<string, unknown>, field: string): string {\n const value = body[field];\n if (typeof value !== 'string' || value.length === 0) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n `\"${field}\" is required and must be a string.`\n );\n }\n return value;\n}\n\n// TURN_CONTEXT_RCP_RESOLVERS_PLAN.md — mirrors agent-backend's\n// agui/turnContext.js#validateTurnContext exactly, so a bad `context` body\n// field fails fast here rather than round-tripping to the backend first.\n// Distinct from `contextOverride` (a plain string, no shape validation\n// beyond length): `context` is never shown to the model, only ever read\n// live by an RCP tool's resolver.\nconst MAX_TURN_CONTEXT_BYTES = 2000;\n\nexport function validateTurnContext(value: unknown): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new RuntimeHttpError(400, 'INVALID_CONTEXT', 'context must be a flat object.');\n }\n\n const context = value as Record<string, unknown>;\n for (const [key, entry] of Object.entries(context)) {\n const entryType = typeof entry;\n if (entryType !== 'string' && entryType !== 'number' && entryType !== 'boolean') {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_CONTEXT',\n `context.${key} must be a string, number, or boolean.`\n );\n }\n }\n\n // TextEncoder, not Buffer — this package must stay Edge-runtime\n // compatible (no node:* imports, no Node-only globals).\n const byteLength = new TextEncoder().encode(JSON.stringify(context)).length;\n if (byteLength > MAX_TURN_CONTEXT_BYTES) {\n throw new RuntimeHttpError(\n 400,\n 'CONTEXT_TOO_LARGE',\n `context must be ${MAX_TURN_CONTEXT_BYTES} bytes or fewer when serialized.`\n );\n }\n\n return context;\n}\n\n// ── Which published version a run uses ─────────────────────────────────\n\nconst ENVIRONMENTS = ['development', 'production'] as const;\ntype Environment = (typeof ENVIRONMENTS)[number];\n\nexport interface ResolvedVersion {\n environment?: Environment;\n agentVersion?: number;\n}\n\n/** `environment` / `agentVersion` from a request body; 400 when malformed. */\nfunction clientVersionFields(\n body: Record<string, unknown>,\n envField: string = 'environment'\n): ResolvedVersion {\n const out: ResolvedVersion = {};\n const env = body[envField];\n if (env !== undefined && env !== null) {\n if (!ENVIRONMENTS.includes(env as Environment)) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n `\"${envField}\" must be \"development\" or \"production\".`\n );\n }\n out.environment = env as Environment;\n }\n if (body.agentVersion !== undefined && body.agentVersion !== null) {\n const v = body.agentVersion;\n if (typeof v !== 'number' || !Number.isInteger(v) || v < 1) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"agentVersion\" must be a positive integer.'\n );\n }\n out.agentVersion = v;\n }\n return out;\n}\n\n/**\n * The version a `/chat`, `/voice/sessions`, `/messages/agent` or workflow\n * run (its agent steps) asks Persona for, in order:\n * the browser's own choice (only with `allowClientVersionSelection`), then\n * `selectVersion`, then `defaultEnvironment`. Empty = the Agent's default\n * (its draft, unless \"serve only deployed versions\" is on).\n */\nexport async function resolveRunVersion(\n body: Record<string, unknown>,\n ctx: Pick<RouteContext, 'versioning'>,\n selection: {\n userId: string;\n kind: 'chat' | 'voice' | 'messages' | 'workflow';\n agentId?: string;\n workflowId?: string;\n },\n /** Body field the browser names the environment with (`agentEnvironment` for workflows). */\n envField: string = 'environment'\n): Promise<ResolvedVersion> {\n const { selectVersion, defaultEnvironment, allowClientVersionSelection } = ctx.versioning;\n if (allowClientVersionSelection) {\n const fromClient = clientVersionFields(body, envField);\n if (fromClient.environment || fromClient.agentVersion) return fromClient;\n }\n if (selectVersion) {\n const picked = await selectVersion(selection);\n if (picked && (picked.environment || picked.agentVersion)) {\n return {\n ...(picked.environment ? { environment: picked.environment } : {}),\n ...(picked.agentVersion ? { agentVersion: picked.agentVersion } : {}),\n };\n }\n }\n return defaultEnvironment ? { environment: defaultEnvironment } : {};\n}\n\n/** A W3C `traceparent` header worth forwarding (`00-<32 hex>-<16 hex>-<2 hex>`), else undefined. */\nexport function incomingTraceparent(\n headers: Record<string, string | undefined>,\n enabled: boolean\n): string | undefined {\n if (!enabled) return undefined;\n const value = headers.traceparent ?? headers.Traceparent;\n return value && /^[0-9a-f]{2}-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$/i.test(value.trim())\n ? value.trim()\n : undefined;\n}\n","import type { RouteHandler } from '../routing.js';\r\nimport { json } from '../routeHelpers.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\n\r\n/**\r\n * Serves the configured `restToolsManifest.tools` list as\r\n * `{ tools: [...] }` — the shape a Persona REST Tool Source's Test\r\n * Connection expects. Never touches `PersonaClient`; this is pure host-side\r\n * data. `requiresAuth: false` at the route-table level (see `runtime.ts`) —\r\n * this is Persona-to-server traffic authenticated by its own bearer token\r\n * below, not an end-user request needing `resolveUser`.\r\n */\r\nexport const restToolsManifestRoute: RouteHandler = async (request, ctx) => {\r\n const manifest = ctx.restToolsManifest;\r\n if (!manifest) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'No REST tools manifest is configured.');\r\n }\r\n\r\n if (manifest.authToken) {\r\n const header = request.headers.authorization;\r\n const expected = `Bearer ${manifest.authToken}`;\r\n if (header !== expected) {\r\n throw new RuntimeHttpError(401, 'UNAUTHORIZED', 'Invalid or missing manifest bearer token.');\r\n }\r\n }\r\n\r\n return json(200, { tools: manifest.tools });\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json } from '../routeHelpers.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\n\r\n/**\r\n * Serves the configured `rcpManifest.tools` list as a conformant RCP\r\n * manifest — `{ rcpVersion, auth, tools }` — the shape any RCP client's\r\n * `discover()` expects. Never touches `PersonaClient`; this is pure\r\n * host-side data, unrelated to `restToolsManifestRoute`.\r\n * `requiresAuth: false` at the route-table level (see `runtime.ts`) — this\r\n * is client-to-server traffic authenticated by its own bearer token below,\r\n * not an end-user request needing `resolveUser`.\r\n */\r\nexport const rcpManifestRoute: RouteHandler = async (request, ctx) => {\r\n const manifest = ctx.rcpManifest;\r\n if (!manifest) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'No RCP manifest is configured.');\r\n }\r\n\r\n if (manifest.authToken) {\r\n const header = request.headers.authorization;\r\n const expected = `Bearer ${manifest.authToken}`;\r\n if (header !== expected) {\r\n throw new RuntimeHttpError(401, 'UNAUTHORIZED', 'Invalid or missing manifest bearer token.');\r\n }\r\n }\r\n\r\n return json(200, {\r\n rcpVersion: '0.1',\r\n auth: manifest.authToken\r\n ? { type: 'header', header: 'Authorization', scheme: 'Bearer' }\r\n : { type: 'none' },\r\n tools: manifest.tools,\r\n });\r\n};\r\n","import { EventType, type AguiEvent } from '@personaai/sdk';\r\nimport type { RunContext, RunResult, RuntimeHooks } from './types/hooks.js';\r\nimport { mapErrorToRuntimeError } from './errors.js';\r\n\r\n/**\r\n * Serializes one AG-UI event back out as an SSE frame — matches\r\n * `@personaai/sdk`'s own inbound `parseAguiEventStream` format byte-for-byte\r\n * (`data: <json>\\n\\n`, no `event:`/`id:` line), so a consumer using this SDK\r\n * to read the runtime's output round-trips cleanly.\r\n */\r\nexport function formatSseFrame(event: AguiEvent): string {\r\n return `data: ${JSON.stringify(event)}\\n\\n`;\r\n}\r\n\r\n/** A sanitized in-band RUN_ERROR frame for a failure that happens mid-stream, after headers are already committed. */\r\nexport function runErrorFrame(err: unknown, mode: 'development' | 'production'): string {\r\n const mapped = mapErrorToRuntimeError(err, mode);\r\n return formatSseFrame({\r\n type: EventType.RUN_ERROR,\r\n code: mapped.code,\r\n message: mapped.message,\r\n } as AguiEvent);\r\n}\r\n\r\ninterface Accumulator {\r\n text: string;\r\n interrupted: boolean;\r\n erroredInBand: boolean;\r\n threadCreateFired: boolean;\r\n personaRunId: string | undefined;\r\n threadId: string | undefined;\r\n toolNames: Map<string, string>;\r\n nodeMeta: Map<string, { nodeType: string; nodeLabel: string }>;\r\n}\r\n\r\nfunction newAccumulator(): Accumulator {\r\n return {\r\n text: '',\r\n interrupted: false,\r\n erroredInBand: false,\r\n threadCreateFired: false,\r\n personaRunId: undefined,\r\n threadId: undefined,\r\n toolNames: new Map(),\r\n nodeMeta: new Map(),\r\n };\r\n}\r\n\r\n/** Applies one event's effect on the running accumulator and fires any lifecycle hooks it triggers. */\r\nasync function processEvent(\r\n event: AguiEvent,\r\n acc: Accumulator,\r\n runCtx: RunContext,\r\n hooks: RuntimeHooks | undefined\r\n): Promise<void> {\r\n const e = event as Record<string, unknown> & { type: string };\r\n\r\n switch (e.type) {\r\n case EventType.RUN_STARTED: {\r\n const threadId = typeof e.threadId === 'string' ? e.threadId : undefined;\r\n // The first RUN_STARTED is the run itself (sub-runs may follow).\r\n if (!acc.personaRunId && typeof e.runId === 'string') acc.personaRunId = e.runId;\r\n if (!acc.threadId && threadId) acc.threadId = threadId;\r\n // Only chat runs have threads; the Architect co-pilot doesn't.\r\n if (\r\n runCtx.kind === 'chat' &&\r\n runCtx.agentId &&\r\n !acc.threadCreateFired &&\r\n !runCtx.threadId &&\r\n threadId\r\n ) {\r\n acc.threadCreateFired = true;\r\n await hooks?.onThreadCreate?.({ userId: runCtx.userId, agentId: runCtx.agentId, threadId });\r\n }\r\n break;\r\n }\r\n case EventType.TEXT_MESSAGE_CHUNK: {\r\n const delta = e.delta;\r\n if (typeof delta === 'string') acc.text += delta;\r\n break;\r\n }\r\n case EventType.CUSTOM: {\r\n if (e.name === 'hitl_request' || e.name === 'clarification_request') {\r\n acc.interrupted = true;\r\n } else if (e.name === 'workflow_node_started') {\r\n const val = (e.value ?? {}) as Record<string, unknown>;\r\n const nodeId = String(val.nodeId ?? '');\r\n const nodeType = String(val.nodeType ?? '');\r\n const nodeLabel = String(val.nodeLabel ?? '');\r\n if (nodeId) acc.nodeMeta.set(nodeId, { nodeType, nodeLabel });\r\n if (runCtx.workflowId) {\r\n await hooks?.beforeWorkflowNode?.({\r\n userId: runCtx.userId,\r\n workflowId: runCtx.workflowId,\r\n nodeId,\r\n nodeType,\r\n nodeLabel,\r\n input: val.input,\r\n });\r\n }\r\n } else if (e.name === 'workflow_node_completed') {\r\n const val = (e.value ?? {}) as Record<string, unknown>;\r\n const nodeId = String(val.nodeId ?? '');\r\n const meta = acc.nodeMeta.get(nodeId);\r\n const nodeType = String(val.nodeType ?? meta?.nodeType ?? '');\r\n const nodeLabel = String(val.nodeLabel ?? meta?.nodeLabel ?? '');\r\n if (runCtx.workflowId) {\r\n await hooks?.afterWorkflowNode?.(\r\n {\r\n userId: runCtx.userId,\r\n workflowId: runCtx.workflowId,\r\n nodeId,\r\n nodeType,\r\n nodeLabel,\r\n },\r\n val.output ?? (val as Record<string, unknown>)\r\n );\r\n }\r\n } else if (e.name === 'workflow_node_failed') {\r\n acc.erroredInBand = true;\r\n }\r\n break;\r\n }\r\n case EventType.RUN_ERROR: {\r\n acc.erroredInBand = true;\r\n break;\r\n }\r\n case EventType.TOOL_CALL_START: {\r\n const toolCallId = typeof e.toolCallId === 'string' ? e.toolCallId : undefined;\r\n const toolCallName = typeof e.toolCallName === 'string' ? e.toolCallName : 'unknown_tool';\r\n if (toolCallId) {\r\n acc.toolNames.set(toolCallId, toolCallName);\r\n await hooks?.beforeToolCall?.({\r\n userId: runCtx.userId,\r\n agentId: runCtx.agentId,\r\n threadId: runCtx.threadId,\r\n toolName: toolCallName,\r\n toolCallId,\r\n });\r\n }\r\n break;\r\n }\r\n case EventType.TOOL_CALL_RESULT: {\r\n const toolCallId = typeof e.toolCallId === 'string' ? e.toolCallId : undefined;\r\n if (toolCallId) {\r\n await hooks?.afterToolCall?.(\r\n {\r\n userId: runCtx.userId,\r\n agentId: runCtx.agentId,\r\n threadId: runCtx.threadId,\r\n toolName: acc.toolNames.get(toolCallId) ?? 'unknown_tool',\r\n toolCallId,\r\n },\r\n e.content\r\n );\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n}\r\n\r\ntype FrameListener = (seq: number, frame: string) => void;\r\ntype DoneListener = () => void;\r\n\r\n/**\r\n * Owns pumping one chat run's AG-UI events out of `@personaai/sdk`,\r\n * independent of any single HTTP response. Created once per run and kept\r\n * running (buffering every formatted SSE frame, with a sequence number)\r\n * regardless of whether the original request's connection is still\r\n * attached — this is what makes reconnect possible: a later request can\r\n * `subscribe()` to the SAME driver, replay the frames it missed, and pick\r\n * up the live tail.\r\n *\r\n * Lifecycle hooks (`beforeRun` is fired by the caller before construction;\r\n * everything else) fire exactly once here, regardless of how many\r\n * subscribers ever attach — never once per subscriber.\r\n */\r\nexport class RunDriver {\r\n readonly runId: string;\r\n readonly runCtx: RunContext;\r\n createdAt = Date.now();\r\n finishedAt: number | undefined;\r\n\r\n private frames: string[] = [];\r\n private listeners = new Set<FrameListener>();\r\n private doneListeners = new Set<DoneListener>();\r\n private finished = false;\r\n private firstFrameSettled = false;\r\n private firstFramePromise: Promise<void>;\r\n private resolveFirstFrame!: () => void;\r\n private rejectFirstFrame!: (err: unknown) => void;\r\n\r\n constructor(\r\n runId: string,\r\n runCtx: RunContext,\r\n source: AsyncGenerator<AguiEvent>,\r\n hooks: RuntimeHooks | undefined,\r\n mode: 'development' | 'production'\r\n ) {\r\n this.runId = runId;\r\n this.runCtx = runCtx;\r\n this.firstFramePromise = new Promise((resolve, reject) => {\r\n this.resolveFirstFrame = resolve;\r\n this.rejectFirstFrame = reject;\r\n });\r\n void this.pump(source, hooks, mode);\r\n }\r\n\r\n private push(frame: string): void {\r\n const seq = this.frames.length;\r\n this.frames.push(frame);\r\n for (const listener of this.listeners) listener(seq, frame);\r\n if (!this.firstFrameSettled) {\r\n this.firstFrameSettled = true;\r\n this.resolveFirstFrame();\r\n }\r\n }\r\n\r\n private finish(): void {\r\n this.finished = true;\r\n this.finishedAt = Date.now();\r\n for (const listener of this.doneListeners) listener();\r\n }\r\n\r\n private async pump(\r\n source: AsyncGenerator<AguiEvent>,\r\n hooks: RuntimeHooks | undefined,\r\n mode: 'development' | 'production'\r\n ): Promise<void> {\r\n const acc = newAccumulator();\r\n let count = 0;\r\n\r\n try {\r\n for await (const event of source) {\r\n await processEvent(event, acc, this.runCtx, hooks);\r\n count += 1;\r\n this.push(formatSseFrame(event));\r\n }\r\n\r\n if (!this.firstFrameSettled) {\r\n // The upstream stream completed successfully but produced zero\r\n // events — a valid empty run, not an error. Resolve rather than\r\n // leaving `waitForFirstFrame()` hanging forever.\r\n this.firstFrameSettled = true;\r\n this.resolveFirstFrame();\r\n }\r\n\r\n const result: RunResult = {\r\n text: acc.text,\r\n eventCount: count,\r\n interrupted: acc.interrupted,\r\n erroredInBand: acc.erroredInBand,\r\n ...(acc.personaRunId ? { personaRunId: acc.personaRunId } : {}),\r\n ...(acc.threadId || this.runCtx.threadId\r\n ? { threadId: acc.threadId ?? this.runCtx.threadId }\r\n : {}),\r\n };\r\n try {\r\n await hooks?.afterRun?.(this.runCtx, result);\r\n } catch {\r\n // afterRun is a post-hoc side-effect listener — the run itself\r\n // already succeeded. Its failure must not be conflated with a run\r\n // failure (onError) or corrupt an already-finished stream with a\r\n // synthesized RUN_ERROR frame.\r\n }\r\n } catch (err) {\r\n await hooks?.onError?.(\r\n {\r\n userId: this.runCtx.userId,\r\n phase: this.runCtx.kind,\r\n agentId: this.runCtx.agentId,\r\n workflowId: this.runCtx.workflowId,\r\n threadId: this.runCtx.threadId,\r\n },\r\n err\r\n );\r\n\r\n if (!this.firstFrameSettled) {\r\n // Nothing was ever buffered — the very first upstream call failed\r\n // (auth/validation/network). The caller hasn't committed to a\r\n // streaming response yet and can still return a clean buffered\r\n // error instead.\r\n this.firstFrameSettled = true;\r\n this.rejectFirstFrame(err);\r\n return;\r\n }\r\n // Headers are already committed for every existing/future\r\n // subscriber — surface the failure as an in-band RUN_ERROR frame.\r\n this.push(runErrorFrame(err, mode));\r\n } finally {\r\n this.finish();\r\n }\r\n }\r\n\r\n /** Resolves once the first frame has been buffered, or rejects if the run failed before producing any frame at all. */\r\n waitForFirstFrame(): Promise<void> {\r\n return this.firstFramePromise;\r\n }\r\n\r\n isFinished(): boolean {\r\n return this.finished;\r\n }\r\n\r\n /** Total frames buffered so far — also the highest valid `since` a caller can request without missing anything. */\r\n get frameCount(): number {\r\n return this.frames.length;\r\n }\r\n\r\n /** Number of currently-live subscriptions (each `subscribe()` iterator that's been started but not yet exhausted/torn down). Exposed for tests verifying subscriptions clean up after themselves. */\r\n get subscriberCount(): number {\r\n return this.listeners.size;\r\n }\r\n\r\n /**\r\n * An async iterable that replays every buffered frame after `sinceSeq`\r\n * (`-1` for \"from the start\"), then continues yielding new frames live\r\n * as the run produces them, until the run finishes. Each call returns an\r\n * independent subscription — multiple concurrent subscribers (e.g. the\r\n * original connection plus a reconnect that raced it) are supported.\r\n */\r\n subscribe(sinceSeq: number): AsyncIterable<string> {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const driver = this;\r\n const listeners = this.listeners;\r\n const doneListeners = this.doneListeners;\r\n\r\n return {\r\n [Symbol.asyncIterator](): AsyncIterator<string> {\r\n // Read the buffer and the finished flag when iteration starts, in the\r\n // same tick the listeners are attached. Reading them at subscribe()\r\n // time instead left a gap: a run that finished before the consumer\r\n // started iterating never woke it (the stream hung, frames missed).\r\n const queue: string[] = driver.frames.slice(Math.max(sinceSeq + 1, 0));\r\n let live = !driver.finished;\r\n let wake: (() => void) | null = null;\r\n\r\n const onFrame: FrameListener = (_seq, frame) => {\r\n queue.push(frame);\r\n wake?.();\r\n };\r\n const onDone: DoneListener = () => {\r\n live = false;\r\n wake?.();\r\n };\r\n\r\n if (live) {\r\n listeners.add(onFrame);\r\n doneListeners.add(onDone);\r\n }\r\n\r\n const cleanup = () => {\r\n listeners.delete(onFrame);\r\n doneListeners.delete(onDone);\r\n };\r\n\r\n return {\r\n async next(): Promise<IteratorResult<string>> {\r\n for (;;) {\r\n if (queue.length > 0) return { done: false, value: queue.shift()! };\r\n if (!live) {\r\n cleanup();\r\n return { done: true, value: undefined };\r\n }\r\n await new Promise<void>((resolve) => (wake = resolve));\r\n }\r\n },\r\n async return(): Promise<IteratorResult<string>> {\r\n cleanup();\r\n return { done: true, value: undefined };\r\n },\r\n };\r\n },\r\n };\r\n }\r\n}\r\n","/** An SSE comment line — ignored by any `data:`-only parser (including `@personaai/sdk`'s own), never changes the AG-UI event sequence a consumer sees. */\r\nconst HEARTBEAT_FRAME = ': heartbeat\\n\\n';\r\n\r\nconst TIMEOUT = Symbol('heartbeat-timeout');\r\n\r\nfunction heartbeatTimer(ms: number): { promise: Promise<typeof TIMEOUT>; cancel: () => void } {\r\n let handle: ReturnType<typeof setTimeout>;\r\n const promise = new Promise<typeof TIMEOUT>((resolve) => {\r\n handle = setTimeout(() => resolve(TIMEOUT), ms);\r\n });\r\n return { promise, cancel: () => clearTimeout(handle) };\r\n}\r\n\r\n/**\r\n * Interleaves `HEARTBEAT_FRAME`s into any SSE frame source during a gap\r\n * longer than `intervalMs` between real frames, without breaking pull-based\r\n * backpressure: `source`'s iterator's `next()` is only ever called once per\r\n * real frame — a heartbeat firing just re-races the *same* pending `next()`\r\n * promise against a fresh timer, it never issues an extra pull ahead of\r\n * what the consumer has actually asked for.\r\n *\r\n * Always calls the underlying iterator's `return()` on the way out — via\r\n * the `finally` block, which fires whether this generator runs to\r\n * completion, throws, or is torn down early by its own consumer (e.g. an\r\n * adapter cancelling because the client disconnected). This matters when\r\n * `source` is a `RunDriver.subscribe()` iterable: skipping it would leak\r\n * that subscription's listener registration for the lifetime of the run.\r\n */\r\nexport async function* withHeartbeats(\r\n source: AsyncIterable<string>,\r\n intervalMs = 15000\r\n): AsyncGenerator<string> {\r\n const iterator = source[Symbol.asyncIterator]();\r\n\r\n try {\r\n let pending: Promise<IteratorResult<string>> | null = null;\r\n\r\n for (;;) {\r\n pending ??= iterator.next();\r\n const timer = heartbeatTimer(intervalMs);\r\n const winner = await Promise.race([pending, timer.promise]);\r\n timer.cancel();\r\n\r\n if (winner === TIMEOUT) {\r\n yield HEARTBEAT_FRAME;\r\n continue; // re-race the same pending next() call, no extra pull\r\n }\r\n\r\n pending = null;\r\n if (winner.done) return;\r\n yield winner.value;\r\n }\r\n } finally {\r\n await iterator.return?.();\r\n }\r\n}\r\n","import type {\r\n ChatAttachmentInput,\r\n ChatMessageInput,\r\n ChatResume,\r\n FrontendToolDefinition,\r\n} from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { RunDriver } from '../runDriver.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport {\r\n incomingTraceparent,\r\n parseFrontendTools,\r\n resolveRunVersion,\r\n validateTurnContext,\r\n} from '../routeHelpers.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\ninterface ChatBody {\r\n agentId: string;\r\n messages: ChatMessageInput[];\r\n threadId?: string;\r\n resume?: ChatResume;\r\n contextOverride?: string;\r\n context?: Record<string, unknown>;\r\n tools?: FrontendToolDefinition[];\r\n attachments?: ChatAttachmentInput[];\r\n}\r\n\r\n// Same cap as the backend (IMAGE_ATTACHMENT_LIMITS.maxImagesPerMessage) —\r\n// rejected here so an oversized request never reaches the API.\r\nconst MAX_ATTACHMENTS = 4;\r\n\r\n/**\r\n * Images for this turn (`@personaai/react`'s useAttachments): ids of files\r\n * this same end user uploaded through `POST /files`. The backend checks\r\n * ownership, type and size, and ignores them unless the Agent has\r\n * `imageInputEnabled`.\r\n */\r\nfunction parseAttachments(value: unknown): ChatAttachmentInput[] | undefined {\r\n if (value === undefined || value === null) return undefined;\r\n if (\r\n !Array.isArray(value) ||\r\n !value.every(\r\n (a) =>\r\n typeof a === 'object' &&\r\n a !== null &&\r\n typeof a.fileId === 'string' &&\r\n a.fileId.length > 0 &&\r\n a.fileId.length <= 64\r\n )\r\n ) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"attachments\" must be an array of { fileId } objects.'\r\n );\r\n }\r\n if (value.length > MAX_ATTACHMENTS) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `At most ${MAX_ATTACHMENTS} attachments per message.`\r\n );\r\n }\r\n return value.length > 0\r\n ? value.map((a: { fileId: string }) => ({ fileId: a.fileId }))\r\n : undefined;\r\n}\r\n\r\nfunction parseChatBody(body: unknown): ChatBody {\r\n if (typeof body !== 'object' || body === null) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\r\n }\r\n const b = body as Record<string, unknown>;\r\n\r\n if (typeof b.agentId !== 'string' || b.agentId.length === 0) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"agentId\" is required and must be a string.'\r\n );\r\n }\r\n if (!Array.isArray(b.messages)) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"messages\" is required and must be an array.'\r\n );\r\n }\r\n\r\n return {\r\n agentId: b.agentId,\r\n messages: b.messages as ChatMessageInput[],\r\n threadId: typeof b.threadId === 'string' ? b.threadId : undefined,\r\n resume: (b.resume as ChatResume | undefined) ?? undefined,\r\n contextOverride: typeof b.contextOverride === 'string' ? b.contextOverride : undefined,\r\n // Distinct from contextOverride above — never shown to the model, only\r\n // ever read live by an RCP tool's resolver. validateTurnContext throws\r\n // a 400 on any shape violation (not a flat string/number/boolean\r\n // object, or over the byte cap) rather than coercing/dropping it.\r\n context: validateTurnContext(b.context),\r\n tools: parseFrontendTools(b.tools),\r\n attachments: parseAttachments(b.attachments),\r\n };\r\n}\r\n\r\n/**\r\n * Starts a new chat run. The run is driven by a `RunDriver` registered\r\n * under a fresh `runId` (returned via the `x-persona-run-id` response\r\n * header) independent of this specific HTTP response — if the connection\r\n * drops, `GET /chat/:runId/resume` can reattach to the same driver and pick\r\n * up where it left off. See `routes/chatResume.ts`.\r\n */\r\nexport const chatRoute: RouteHandler = async (request, ctx) => {\r\n const logger = ctx.logger.child('chat');\r\n logger.debug('chatRoute start', { userId: request.userId, hasBody: !!request.body });\r\n const body = parseChatBody(request.body);\r\n logger.trace('chatRoute body', {\r\n agentId: body.agentId,\r\n threadId: body.threadId,\r\n messageCount: body.messages?.length ?? 0,\r\n hasResume: !!body.resume,\r\n hasContextOverride: !!body.contextOverride,\r\n hasContext: !!body.context,\r\n });\r\n // `requiresAuth: true` guarantees request.userId is resolved by the time a route handler runs.\r\n const userId = request.userId as string;\r\n\r\n const version = await resolveRunVersion(request.body as Record<string, unknown>, ctx, {\r\n userId,\r\n agentId: body.agentId,\r\n kind: 'chat',\r\n });\r\n const traceparent = incomingTraceparent(request.headers, ctx.forwardTraceparent);\r\n\r\n const runCtx: RunContext = {\r\n userId,\r\n kind: 'chat',\r\n agentId: body.agentId,\r\n threadId: body.threadId,\r\n messages: body.messages,\r\n ...version,\r\n };\r\n\r\n logger.debug('beforeRun hook', { agentId: body.agentId, threadId: body.threadId });\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n logger.trace('beforeRun completed', { agentId: body.agentId });\r\n\r\n logger.debug('starting chat stream', { agentId: body.agentId, threadId: body.threadId });\r\n const stream = ctx.client.chat.stream(body.agentId, {\r\n messages: body.messages,\r\n threadId: body.threadId,\r\n resume: body.resume,\r\n contextOverride: body.contextOverride,\r\n context: body.context,\r\n tools: body.tools,\r\n attachments: body.attachments,\r\n ...version,\r\n ...(traceparent ? { traceparent } : {}),\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n logger.info('chat run created', {\r\n runId,\r\n agentId: body.agentId,\r\n threadId: body.threadId,\r\n userId,\r\n });\r\n const driver = new RunDriver(runId, runCtx, stream, ctx.hooks, ctx.mode);\r\n ctx.runs.set(runId, driver);\r\n logger.debug('run driver registered', { runId, trackedRuns: ctx.runs.size });\r\n\r\n // Rejects only if the very first upstream call failed before producing\r\n // any frame at all — nothing has been buffered yet, so bubbling this up\r\n // (through runtime.ts's centralized error mapping) to a clean buffered\r\n // error response is correct; there's no partial stream to preserve.\r\n try {\r\n await driver.waitForFirstFrame();\r\n logger.debug('chat run first frame ready', { runId });\r\n } catch (err) {\r\n logger.warn('chat run failed before first frame', {\r\n runId,\r\n agentId: body.agentId,\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n ctx.runs.delete(runId);\r\n throw err;\r\n }\r\n\r\n logger.info('chat stream ready', { runId, agentId: body.agentId });\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(-1), ctx.heartbeatIntervalMs),\r\n };\r\n};\r\n","import type { ChatMessageInput, ChatResume } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { RunDriver } from '../runDriver.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\ninterface ArchitectBody {\r\n messages: ChatMessageInput[];\r\n threadId?: string;\r\n resume?: ChatResume;\r\n}\r\n\r\nfunction parseArchitectBody(body: unknown): ArchitectBody {\r\n if (typeof body !== 'object' || body === null) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\r\n }\r\n const b = body as Record<string, unknown>;\r\n if (!Array.isArray(b.messages)) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"messages\" is required and must be an array.'\r\n );\r\n }\r\n return {\r\n messages: b.messages as ChatMessageInput[],\r\n threadId: typeof b.threadId === 'string' ? b.threadId : undefined,\r\n resume: (b.resume as ChatResume | undefined) ?? undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Starts a run against the Architect — a co-pilot that creates/edits Agents\r\n * on the caller's behalf via tool calls, as the asserted external user (so\r\n * it builds/edits *their* agents, not the Project's shared roster). Requires\r\n * capabilities.architect. Reuses the exact same RunDriver/reconnect/\r\n * heartbeat mechanics as `POST /chat` (see routes/chat.ts) — the Architect\r\n * just has no `agentId` of its own to pass through. An optional `threadId`\r\n * resumes a named Architect conversation instead of the implicit\r\n * deterministic one — `ArchitectClient.stream()` silently ignores it when\r\n * the underlying credential has no asserted external user, same as the\r\n * backend route it calls.\r\n */\r\nexport const architectRoute: RouteHandler = async (request, ctx) => {\r\n const logger = ctx.logger.child('architect');\r\n logger.debug('architectRoute start', { userId: request.userId });\r\n const body = parseArchitectBody(request.body);\r\n logger.trace('architectRoute body', {\r\n threadId: body.threadId,\r\n messageCount: body.messages?.length ?? 0,\r\n hasResume: !!body.resume,\r\n });\r\n const userId = request.userId as string;\r\n\r\n const runCtx: RunContext = {\r\n userId,\r\n kind: 'architect',\r\n threadId: body.threadId,\r\n messages: body.messages,\r\n };\r\n\r\n logger.debug('beforeRun hook (architect)', { userId, threadId: body.threadId });\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n logger.trace('beforeRun completed (architect)');\r\n\r\n logger.debug('starting architect stream', { threadId: body.threadId });\r\n const stream = ctx.client.architect.stream({\r\n messages: body.messages,\r\n threadId: body.threadId,\r\n resume: body.resume,\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n logger.info('architect run created', { runId, userId, threadId: body.threadId });\r\n const driver = new RunDriver(runId, runCtx, stream, ctx.hooks, ctx.mode);\r\n ctx.runs.set(runId, driver);\r\n logger.debug('architect driver registered', { runId, trackedRuns: ctx.runs.size });\r\n\r\n try {\r\n await driver.waitForFirstFrame();\r\n logger.debug('architect first frame ready', { runId });\r\n } catch (err) {\r\n logger.warn('architect run failed before first frame', {\r\n runId,\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n ctx.runs.delete(runId);\r\n throw err;\r\n }\r\n\r\n logger.info('architect stream ready', { runId });\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(-1), ctx.heartbeatIntervalMs),\r\n };\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { withHeartbeats } from '../heartbeat.js';\r\nimport type { RunContext } from '../types/hooks.js';\r\n\r\n/**\r\n * Builds a `GET /:resource/:runId/resume` handler — reattaches to an\r\n * in-flight or recently-finished run started by `POST /chat` or\r\n * `POST /architect` (its `runId`, from the `x-persona-run-id` response\r\n * header), replaying every frame after `?since=<seq>` (default `-1`, i.e.\r\n * from the start) and then continuing to stream live frames until the run\r\n * finishes.\r\n *\r\n * This is what makes a dropped connection recoverable without losing\r\n * generated content or duplicating the turn: the run itself was never tied\r\n * to the original HTTP response (see `RunDriver`), so a new response can\r\n * pick up exactly where the old one left off. `expectedKind` keeps a chat\r\n * run's id from being resumable via `/architect/.../resume` and vice versa.\r\n */\r\nexport function createResumeRoute(expectedKind: RunContext['kind']): RouteHandler {\r\n return async (request, ctx) => {\r\n const runId = ctx.params.runId;\r\n if (!runId) {\r\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', '\"runId\" path parameter is required.');\r\n }\r\n\r\n const driver = ctx.runs.get(runId);\r\n // A run that belongs to a different user, or the wrong kind of run, is\r\n // reported identically to one that doesn't exist — never confirm\r\n // another user's run id is valid.\r\n if (!driver || driver.runCtx.userId !== request.userId || driver.runCtx.kind !== expectedKind) {\r\n throw new RuntimeHttpError(\r\n 404,\r\n 'RUN_NOT_FOUND',\r\n `No resumable run found for id \"${runId}\". It may have finished and been evicted, or never existed.`\r\n );\r\n }\r\n\r\n const sinceRaw = request.query.since;\r\n const parsed = sinceRaw !== undefined ? Number.parseInt(sinceRaw, 10) : -1;\r\n const sinceSeq = Number.isNaN(parsed) ? -1 : parsed;\r\n\r\n return {\r\n kind: 'stream',\r\n status: 200,\r\n headers: {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n connection: 'keep-alive',\r\n 'x-persona-run-id': runId,\r\n },\r\n body: withHeartbeats(driver.subscribe(sinceSeq), ctx.heartbeatIntervalMs),\r\n };\r\n };\r\n}\r\n","import type { UpdateThreadInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\nexport const listThreads: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.threads.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createThread: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const agentId = requireStringField(body, 'agentId');\r\n const thread = await ctx.client.threads.create({ agentId });\r\n\r\n await ctx.hooks?.onThreadCreate?.({\r\n userId: request.userId as string,\r\n agentId,\r\n threadId: thread._id,\r\n });\r\n\r\n return json(201, thread);\r\n};\r\n\r\nexport const getThread: RouteHandler = async (_request, ctx) => {\r\n const thread = await ctx.client.threads.get(requireParam(ctx.params, 'id'));\r\n return json(200, thread);\r\n};\r\n\r\nexport const updateThread: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateThreadInput | undefined) ?? {};\r\n const thread = await ctx.client.threads.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, thread);\r\n};\r\n\r\nexport const deleteThread: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.threads.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteThreads: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.threads.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\n/** The same message history + graph state `chat.stream()` would resume from — load a past conversation on page reopen. */\r\nexport const getThreadMessages: RouteHandler = async (_request, ctx) => {\r\n const messages = await ctx.client.threads.getMessages(requireParam(ctx.params, 'id'));\r\n return json(200, messages);\r\n};\r\n\r\n/** Clears a Thread's conversation content in place (same id/title) — see `@personaai/sdk`'s `threads.reset()`. */\r\nexport const resetThread: RouteHandler = async (_request, ctx) => {\r\n const thread = await ctx.client.threads.reset(requireParam(ctx.params, 'id'));\r\n return json(200, thread);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\nimport {\n json,\n parseFrontendTools,\n requireBodyObject,\n incomingTraceparent,\n requireStringField,\n resolveRunVersion,\n validateTurnContext,\n} from '../routeHelpers.js';\n\n/**\n * Mints a single-use voice session ticket via `@personaai/sdk`'s\n * `client.voice.createSession(agentId)`. Always on (like `chat`/`threads`)\n * — voice is an end-user chat-session action, not Project-level admin\n * configuration, so it isn't gated behind a `RuntimeCapabilities` flag.\n *\n * The host's own frontend takes the returned `wsUrl` (ticket already\n * embedded) and opens `new WebSocket(wsUrl)` directly — this runtime never\n * proxies the WebSocket itself, only the one-time ticket mint, so the\n * Project credential never needs to sit in front of an open connection.\n */\nexport const createVoiceSession: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const agentId = requireStringField(body, 'agentId');\n const threadId = typeof body.threadId === 'string' && body.threadId ? body.threadId : undefined;\n // Same field/cap/contract as `chat`'s contextOverride — appended to the\n // Agent's system instruction once at connect (voice has no per-turn\n // re-application; see @personaai/sdk's VoiceResource doc comment).\n const contextOverride =\n typeof body.contextOverride === 'string' && body.contextOverride\n ? body.contextOverride\n : undefined;\n // At-connect seed only — a voice call is one continuous session, so\n // refreshing this mid-call means the frontend sends `{ type:\n // 'voice.context', context }` directly over the already-open WebSocket,\n // never back through this route (see @personaai/sdk's VoiceResource doc\n // comment).\n const context = validateTurnContext(body.context);\n // Frontend tools the model may call during the call (useVoice runs them in\n // the browser). Same check as chat: malformed → 400 before any API call.\n const tools = parseFrontendTools(body.tools);\n // Same version choice as /chat (selectVersion / defaultEnvironment / the client).\n const version = await resolveRunVersion(body, ctx, {\n userId: request.userId as string,\n agentId,\n kind: 'voice',\n });\n const traceparent = incomingTraceparent(request.headers, ctx.forwardTraceparent);\n const ticket = await ctx.client.voice.createSession(agentId, {\n ...version,\n // `traceparent` needs @personaai/sdk >= 0.27 (older SDKs ignore it).\n ...(traceparent ? ({ traceparent } as Record<string, string>) : {}),\n ...(threadId ? { threadId } : {}),\n ...(contextOverride ? { contextOverride } : {}),\n ...(context ? { context } : {}),\n ...(tools ? { tools } : {}),\n });\n\n await ctx.hooks?.onVoiceSessionCreate?.({\n userId: request.userId as string,\n agentId,\n threadId,\n ...version,\n });\n\n return json(201, ticket);\n};\n","import type { RouteHandler } from '../routing.js';\nimport { RuntimeHttpError } from '../errors.js';\nimport {\n incomingTraceparent,\n json,\n requireBodyObject,\n requireStringField,\n resolveRunVersion,\n} from '../routeHelpers.js';\n\n/**\n * Outbound SMS / WhatsApp routes — thin proxies over `@personaai/sdk`'s\n * `client.messages.send()` / `sendFromAgent()`.\n *\n * Unlike voice, these are NOT end-user-scoped: `to` is any E.164 number and\n * the send spends this Project's Twilio balance, so the routes are gated\n * behind `capabilities.messages` (off by default) rather than being always\n * on. The resolved user still has to authenticate, but the host should turn\n * this on only for callers it actually wants to be able to text people.\n */\n\nconst MESSAGE_CHANNELS = new Set(['sms', 'whatsapp']);\n\nfunction optionalChannel(body: Record<string, unknown>): 'sms' | 'whatsapp' | undefined {\n const value = body.channel;\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || !MESSAGE_CHANNELS.has(value)) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', '\"channel\" must be \"sms\" or \"whatsapp\".');\n }\n return value as 'sms' | 'whatsapp';\n}\n\nfunction optionalStringField(body: Record<string, unknown>, field: string): string | undefined {\n const value = body[field];\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || value.length === 0) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `\"${field}\" must be a non-empty string.`);\n }\n return value;\n}\n\nfunction optionalMediaUrl(body: Record<string, unknown>): string | string[] | undefined {\n const value = body.mediaUrl;\n if (value === undefined) return undefined;\n if (typeof value === 'string' && value.length > 0) return value;\n if (\n Array.isArray(value) &&\n value.every((entry) => typeof entry === 'string' && entry.length > 0)\n ) {\n return value as string[];\n }\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"mediaUrl\" must be a string or an array of strings.'\n );\n}\n\nfunction optionalContentVariables(\n body: Record<string, unknown>\n): Record<string, string> | string | undefined {\n const value = body.contentVariables;\n if (value === undefined) return undefined;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return value as Record<string, string>;\n }\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"contentVariables\" must be an object or a JSON string.'\n );\n}\n\n/** `POST /messages` — plain message, no Agent involved. */\nexport const sendMessage: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const to = requireStringField(body, 'to');\n const channel = optionalChannel(body);\n const text = optionalStringField(body, 'body');\n const mediaUrl = optionalMediaUrl(body);\n const contentSid = optionalStringField(body, 'contentSid');\n const contentVariables = optionalContentVariables(body);\n\n if (text === undefined && contentSid === undefined) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"body\" is required unless \"contentSid\" is provided.'\n );\n }\n\n const delivery = await ctx.client.messages.send({\n to,\n ...(channel ? { channel } : {}),\n ...(text ? { body: text } : {}),\n ...(mediaUrl ? { mediaUrl } : {}),\n ...(contentSid ? { contentSid } : {}),\n ...(contentVariables ? { contentVariables } : {}),\n });\n\n return json(200, delivery);\n};\n\n/** `POST /messages/agent` — the Agent composes the reply on the shared thread. */\nexport const sendAgentMessage: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const agentId = requireStringField(body, 'agentId');\n const to = requireStringField(body, 'to');\n const prompt = requireStringField(body, 'prompt');\n const channel = optionalChannel(body);\n const displayName = optionalStringField(body, 'displayName');\n const version = await resolveRunVersion(body, ctx, {\n userId: request.userId as string,\n agentId,\n kind: 'messages',\n });\n const traceparent = incomingTraceparent(request.headers, ctx.forwardTraceparent);\n\n // `environment` / `agentVersion` / `traceparent` need @personaai/sdk >= 0.27.\n const runOptions: Record<string, unknown> = {\n ...version,\n ...(traceparent ? { traceparent } : {}),\n };\n const delivery = await ctx.client.messages.sendFromAgent({\n agentId,\n to,\n prompt,\n ...(channel ? { channel } : {}),\n ...(displayName ? { displayName } : {}),\n ...runOptions,\n });\n\n return json(200, delivery);\n};\n","import type { AgentCategory, CreateAgentInput, UpdateAgentInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n/** Always on — read-only discovery, e.g. \"let the user pick an agent to chat with\". */\r\nexport const listAgents: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.agents.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n category: request.query.category as AgentCategory | undefined,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\n/**\r\n * Always on, read-only, end-user-scoped — same tier as the MCP OAuth\r\n * routes below, not the agentsWrite-gated Agent CRUD routes further down.\r\n * A chat-only consumer needs this to show \"connect your account\" for a\r\n * tool it can't otherwise reach: mcp.tools.js silently drops a user-mode\r\n * MCP's tools from an Agent's toolset when the calling user hasn't\r\n * connected yet, with no other signal anywhere.\r\n */\r\nexport const getAgentMcpConnections: RouteHandler = async (request, ctx) => {\r\n const connections = await ctx.client.agents.getMcpConnections(\r\n requireParam(ctx.params, 'id'),\r\n request.query.returnTo\r\n );\r\n return json(200, connections);\r\n};\r\n\r\n// Everything below requires capabilities.agentsWrite — provisioning agents\r\n// is Project-admin work, not something an end-user chat session does.\r\n\r\nexport const createAgent: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateAgentInput = {\r\n name: requireStringField(body, 'name'),\r\n systemPrompt: requireStringField(body, 'systemPrompt'),\r\n providerId: requireStringField(body, 'providerId'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n avatar: typeof body.avatar === 'string' ? body.avatar : undefined,\r\n tags: Array.isArray(body.tags) ? (body.tags as string[]) : undefined,\r\n tagline: typeof body.tagline === 'string' ? body.tagline : undefined,\r\n bio: typeof body.bio === 'string' ? body.bio : undefined,\r\n socialLinks: (body.socialLinks as CreateAgentInput['socialLinks']) ?? undefined,\r\n modelName: typeof body.modelName === 'string' ? body.modelName : undefined,\r\n webSearchEnabled:\r\n typeof body.webSearchEnabled === 'boolean' ? body.webSearchEnabled : undefined,\r\n sandboxEnabled:\r\n typeof body.sandboxEnabled === 'boolean' ? body.sandboxEnabled : undefined,\r\n frontendToolsEnabled:\r\n typeof body.frontendToolsEnabled === 'boolean' ? body.frontendToolsEnabled : undefined,\r\n imageInputEnabled:\r\n typeof body.imageInputEnabled === 'boolean' ? body.imageInputEnabled : undefined,\r\n visibility: body.visibility as CreateAgentInput['visibility'],\r\n category: body.category as AgentCategory | undefined,\r\n skills: Array.isArray(body.skills) ? (body.skills as string[]) : undefined,\r\n mcps: Array.isArray(body.mcps) ? (body.mcps as string[]) : undefined,\r\n knowledgeBases: Array.isArray(body.knowledgeBases)\r\n ? (body.knowledgeBases as string[])\r\n : undefined,\r\n storeMounts: Array.isArray(body.storeMounts) ? (body.storeMounts as string[]) : undefined,\r\n interruptOn: (body.interruptOn as Record<string, boolean>) ?? undefined,\r\n isActive: typeof body.isActive === 'boolean' ? body.isActive : undefined,\r\n };\r\n const agent = await ctx.client.agents.create(input);\r\n return json(201, agent);\r\n};\r\n\r\nexport const getAgent: RouteHandler = async (_request, ctx) => {\r\n const agent = await ctx.client.agents.get(requireParam(ctx.params, 'id'));\r\n return json(200, agent);\r\n};\r\n\r\nexport const updateAgent: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateAgentInput | undefined) ?? {};\r\n const agent = await ctx.client.agents.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, agent);\r\n};\r\n\r\nexport const deleteAgent: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.agents.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteAgents: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.agents.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport { json, noContent, requireParam, requireBodyObject, toInt } from '../routeHelpers.js';\r\n\r\nexport const listFiles: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.files.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const uploadFile: RouteHandler = async (request, ctx) => {\r\n if (!request.file) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n 'A \"file\" part is required on this request.'\r\n );\r\n }\r\n const fields = (request.body as Record<string, unknown> | undefined) ?? {};\r\n const agentId = typeof fields.agentId === 'string' ? fields.agentId : undefined;\r\n const threadId = typeof fields.threadId === 'string' ? fields.threadId : undefined;\r\n\r\n const file = await ctx.client.files.upload({\r\n filename: request.file.filename,\r\n content: request.file.content,\r\n contentType: request.file.contentType,\r\n agentId,\r\n threadId,\r\n });\r\n\r\n await ctx.hooks?.onFileUpload?.({\r\n userId: request.userId as string,\r\n fileName: request.file.filename,\r\n mimeType: request.file.contentType,\r\n });\r\n\r\n return json(201, file);\r\n};\r\n\r\nexport const downloadFile: RouteHandler = async (_request, ctx) => {\r\n const response = await ctx.client.files.download(requireParam(ctx.params, 'id'));\r\n\r\n const headers: Record<string, string> = {};\r\n const contentType = response.headers.get('content-type');\r\n const contentDisposition = response.headers.get('content-disposition');\r\n if (contentType) headers['content-type'] = contentType;\r\n if (contentDisposition) headers['content-disposition'] = contentDisposition;\r\n\r\n if (!response.body) {\r\n return { kind: 'binary', status: response.status, headers, body: (async function* () {})() };\r\n }\r\n\r\n return {\r\n kind: 'binary',\r\n status: response.status,\r\n headers,\r\n body: response.body as unknown as AsyncIterable<Uint8Array>,\r\n };\r\n};\r\n\r\nexport const deleteFile: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.files.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteFiles: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.files.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireQueryParam,\r\n requireBodyObject,\r\n requireStringField,\r\n} from '../routeHelpers.js';\r\n\r\nfunction requireScope(query: Record<string, string | undefined>): {\r\n scope: 'user' | 'agent' | 'workspace' | undefined;\r\n agentId: string | undefined;\r\n} {\r\n const scope =\r\n query.scope === 'agent' ? 'agent' : query.scope === 'workspace' ? 'workspace' : query.scope === 'user' ? 'user' : undefined;\r\n if ((scope === 'agent' || scope === 'workspace') && !query.agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `\"agentId\" is required when scope is \"${scope}\".`\r\n );\r\n }\r\n return { scope, agentId: query.agentId };\r\n}\r\n\r\nexport const listMemory: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.memory.list();\r\n return json(200, result);\r\n};\r\n\r\nexport const getMemoryFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n const { scope, agentId } = requireScope(request.query);\r\n\r\n const file = await ctx.client.memory.getFile({ path, scope, agentId });\r\n return json(200, file);\r\n};\r\n\r\nexport const writeMemoryFile: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const path = requireStringField(body, 'path');\r\n const content = requireStringField(body, 'content');\r\n const scope =\r\n body.scope === 'agent' ? 'agent' : body.scope === 'workspace' ? 'workspace' : body.scope === 'user' ? 'user' : undefined;\r\n const agentId = typeof body.agentId === 'string' ? body.agentId : undefined;\r\n if ((scope === 'agent' || scope === 'workspace') && !agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n `\"agentId\" is required when scope is \"${scope}\".`\r\n );\r\n }\r\n\r\n const file = await ctx.client.memory.writeFile({ path, content, scope, agentId });\r\n\r\n await ctx.hooks?.onMemoryWrite?.({ userId: request.userId as string, agentId, path });\r\n\r\n return json(200, file);\r\n};\r\n\r\nexport const deleteMemoryFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n const { scope, agentId } = requireScope(request.query);\r\n\r\n await ctx.client.memory.deleteFile({ path, scope, agentId });\r\n return noContent();\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json, noContent, requireParam } from '../routeHelpers.js';\r\n\r\n/**\r\n * MCP OAuth — deliberately narrow. The SDK's `McpOAuthResource` has no\r\n * \"handle the OAuth provider's callback\" method at all: Persona's own\r\n * backend receives that redirect directly (the OAuth dance is explicitly\r\n * something Persona owns, per the vision doc), so there is no callback\r\n * route for this runtime to expose. What a host actually needs is: get a\r\n * URL to redirect a browser to, check status, and disconnect.\r\n *\r\n * Owner-mode routes affect the shared MCP config for the whole Project —\r\n * this runtime has no concept of roles/permissions beyond \"is there a\r\n * resolved user\" (RBAC is explicitly the host's own business decision, not\r\n * Persona's); a production host should gate these behind its own\r\n * authorization check before calling them, e.g. inside `resolveUser` or a\r\n * wrapping middleware in front of the mount point.\r\n */\r\n\r\nexport const getOwnerAuthorizeUrl: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.mcps.oauth.getOwnerAuthorizeUrl(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const getUserAuthorizeUrl: RouteHandler = async (request, ctx) => {\r\n const result = await ctx.client.mcps.oauth.getUserAuthorizeUrl(\r\n requireParam(ctx.params, 'id'),\r\n request.query.returnTo\r\n );\r\n return json(200, result);\r\n};\r\n\r\nexport const getUserConnectionStatus: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.mcps.oauth.getUserConnectionStatus(\r\n requireParam(ctx.params, 'id')\r\n );\r\n return json(200, result);\r\n};\r\n\r\nexport const disconnectUserConnection: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.mcps.oauth.disconnectUserConnection(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const disconnectOwnerConnection: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.mcps.oauth.disconnectOwnerConnection(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n","import type { CreateMcpInput, DiscoverMcpsParams, UpdateMcpInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n requireQueryParam,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.mcps — registering/managing MCP\r\n// server connections is Project-admin work. The always-on `/mcps/:id/oauth/*`\r\n// routes (routes/mcpOAuth.ts) are separate and unaffected by this flag.\r\n\r\nexport const listMcps: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.mcps.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n } satisfies DiscoverMcpsParams);\r\n return json(200, items);\r\n};\r\n\r\nexport const createMcp: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateMcpInput = {\r\n name: requireStringField(body, 'name'),\r\n transport: requireStringField(body, 'transport') as CreateMcpInput['transport'],\r\n url: requireStringField(body, 'url'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n authType: body.authType as CreateMcpInput['authType'],\r\n authMode: body.authMode as CreateMcpInput['authMode'],\r\n oauth: body.oauth as CreateMcpInput['oauth'],\r\n apiKey: typeof body.apiKey === 'string' ? body.apiKey : undefined,\r\n };\r\n const mcp = await ctx.client.mcps.create(input);\r\n return json(201, mcp);\r\n};\r\n\r\nexport const getMcp: RouteHandler = async (_request, ctx) => {\r\n const mcp = await ctx.client.mcps.get(requireParam(ctx.params, 'id'));\r\n return json(200, mcp);\r\n};\r\n\r\nexport const updateMcp: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateMcpInput | undefined) ?? {};\r\n const mcp = await ctx.client.mcps.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, mcp);\r\n};\r\n\r\nexport const deleteMcp: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.mcps.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteMcps: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.mcps.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getMcpUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.mcps.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n\r\nexport const testMcpConnection: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.mcps.testConnection(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const readMcpResource: RouteHandler = async (request, ctx) => {\r\n const uri = requireQueryParam(request.query, 'uri');\r\n const result = await ctx.client.mcps.readResource(requireParam(ctx.params, 'id'), uri);\r\n return json(200, result);\r\n};\r\n\r\nexport const callMcpTool: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const name = requireStringField(body, 'name');\r\n const args = (body.arguments as Record<string, unknown> | undefined) ?? undefined;\r\n const result = await ctx.client.mcps.callTool(requireParam(ctx.params, 'id'), name, args);\r\n return json(200, result);\r\n};\r\n","import type { CreateProviderInput, UpdateProviderInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.providers — these routes touch LLM\r\n// API keys. Off by default; see CreateRuntimeOptions.capabilities' doc\r\n// comment before ever enabling this.\r\n\r\nexport const listProviders: RouteHandler = async (_request, ctx) => {\r\n const items = await ctx.client.providers.list();\r\n return json(200, items);\r\n};\r\n\r\nexport const createProvider: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateProviderInput = {\r\n label: requireStringField(body, 'label'),\r\n baseURL: requireStringField(body, 'baseURL'),\r\n apiKey: requireStringField(body, 'apiKey'),\r\n defaultModel: requireStringField(body, 'defaultModel'),\r\n isDefault: typeof body.isDefault === 'boolean' ? body.isDefault : undefined,\r\n };\r\n const provider = await ctx.client.providers.create(input);\r\n return json(201, provider);\r\n};\r\n\r\nexport const getProvider: RouteHandler = async (_request, ctx) => {\r\n const provider = await ctx.client.providers.get(requireParam(ctx.params, 'id'));\r\n return json(200, provider);\r\n};\r\n\r\nexport const updateProvider: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateProviderInput | undefined) ?? {};\r\n const provider = await ctx.client.providers.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, provider);\r\n};\r\n\r\nexport const deleteProvider: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.providers.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteProviders: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.providers.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const testProviderConnection: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.providers.testConnection(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const getProviderModels: RouteHandler = async (_request, ctx) => {\r\n const models = await ctx.client.providers.getModels(requireParam(ctx.params, 'id'));\r\n return json(200, models);\r\n};\r\n\r\nexport const getProviderUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.providers.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n","import type { CreateSkillInput, UpdateSkillInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.skills — skill authoring is\r\n// Project-level content management, not an end-user chat operation.\r\n\r\nexport const listSkills: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.skills.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createSkill: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateSkillInput = {\r\n name: requireStringField(body, 'name'),\r\n description: requireStringField(body, 'description'),\r\n instructions: requireStringField(body, 'instructions'),\r\n isPublic: typeof body.isPublic === 'boolean' ? body.isPublic : undefined,\r\n files: Array.isArray(body.files) ? (body.files as CreateSkillInput['files']) : undefined,\r\n };\r\n const skill = await ctx.client.skills.create(input);\r\n return json(201, skill);\r\n};\r\n\r\nexport const getSkill: RouteHandler = async (_request, ctx) => {\r\n const skill = await ctx.client.skills.get(requireParam(ctx.params, 'id'));\r\n return json(200, skill);\r\n};\r\n\r\nexport const updateSkill: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateSkillInput | undefined) ?? {};\r\n const skill = await ctx.client.skills.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, skill);\r\n};\r\n\r\nexport const deleteSkill: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.skills.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteSkills: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.skills.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getSkillUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.skills.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n","import type { CreateKnowledgeBaseInput, UpdateKnowledgeBaseInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.knowledge — knowledge base\r\n// provisioning and document management is Project-level content\r\n// management, not an end-user chat operation. (`search` is arguably closer\r\n// to an end-user-facing read, but it's gated the same as the rest of this\r\n// resource for consistency — a host that wants search only can still wire\r\n// that up itself via the raw SDK.)\r\n\r\nexport const listKnowledgeBases: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.knowledge.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope === 'mine' ? 'mine' : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createKnowledgeBase: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateKnowledgeBaseInput = {\r\n name: requireStringField(body, 'name'),\r\n providerId: requireStringField(body, 'providerId'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n isPublic: typeof body.isPublic === 'boolean' ? body.isPublic : undefined,\r\n embeddingModel: typeof body.embeddingModel === 'string' ? body.embeddingModel : undefined,\r\n chunkSize: typeof body.chunkSize === 'number' ? body.chunkSize : undefined,\r\n chunkOverlap: typeof body.chunkOverlap === 'number' ? body.chunkOverlap : undefined,\r\n topK: typeof body.topK === 'number' ? body.topK : undefined,\r\n };\r\n const kb = await ctx.client.knowledge.create(input);\r\n return json(201, kb);\r\n};\r\n\r\nexport const getKnowledgeBase: RouteHandler = async (_request, ctx) => {\r\n const kb = await ctx.client.knowledge.get(requireParam(ctx.params, 'id'));\r\n return json(200, kb);\r\n};\r\n\r\nexport const updateKnowledgeBase: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateKnowledgeBaseInput | undefined) ?? {};\r\n const kb = await ctx.client.knowledge.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, kb);\r\n};\r\n\r\nexport const deleteKnowledgeBase: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.knowledge.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteKnowledgeBases: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.knowledge.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getKnowledgeBaseUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.knowledge.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n\r\nexport const uploadKnowledgeDocuments: RouteHandler = async (request, ctx) => {\r\n if (!request.files || request.files.length === 0) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n 'At least one \"files\" part is required on this request.'\r\n );\r\n }\r\n const result = await ctx.client.knowledge.uploadDocuments(\r\n requireParam(ctx.params, 'id'),\r\n request.files.map((file) => ({\r\n filename: file.filename,\r\n content: file.content,\r\n contentType: file.contentType,\r\n }))\r\n );\r\n return json(201, result);\r\n};\r\n\r\nexport const listKnowledgeDocuments: RouteHandler = async (_request, ctx) => {\r\n const documents = await ctx.client.knowledge.listDocuments(requireParam(ctx.params, 'id'));\r\n return json(200, documents);\r\n};\r\n\r\nexport const deleteKnowledgeDocument: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.knowledge.deleteDocument(\r\n requireParam(ctx.params, 'id'),\r\n requireParam(ctx.params, 'sourceName')\r\n );\r\n return json(200, result);\r\n};\r\n\r\nexport const searchKnowledgeBase: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const query = requireStringField(body, 'query');\r\n const topK = typeof body.topK === 'number' ? body.topK : undefined;\r\n const results = await ctx.client.knowledge.search(requireParam(ctx.params, 'id'), query, {\r\n topK,\r\n });\r\n return json(200, results);\r\n};\r\n","import type { CreateStoreInput, UpdateStoreInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireQueryParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.stores — vector store provisioning\r\n// is Project-level configuration, not an end-user chat operation.\r\n\r\nexport const listStores: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.stores.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createStore: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateStoreInput = {\r\n name: requireStringField(body, 'name'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n scope: requireStringField(body, 'scope') as CreateStoreInput['scope'],\r\n accessMode: body.accessMode as CreateStoreInput['accessMode'],\r\n };\r\n const store = await ctx.client.stores.create(input);\r\n return json(201, store);\r\n};\r\n\r\nexport const getStore: RouteHandler = async (_request, ctx) => {\r\n const store = await ctx.client.stores.get(requireParam(ctx.params, 'id'));\r\n return json(200, store);\r\n};\r\n\r\nexport const updateStore: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateStoreInput | undefined) ?? {};\r\n const store = await ctx.client.stores.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, store);\r\n};\r\n\r\nexport const deleteStore: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.stores.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const listStoreFiles: RouteHandler = async (_request, ctx) => {\r\n const files = await ctx.client.stores.listFiles(requireParam(ctx.params, 'id'));\r\n return json(200, files);\r\n};\r\n\r\nexport const getStoreFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n const file = await ctx.client.stores.getFile(requireParam(ctx.params, 'id'), { path });\r\n return json(200, file);\r\n};\r\n\r\nexport const writeStoreFile: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input = {\r\n path: requireStringField(body, 'path'),\r\n content: requireStringField(body, 'content'),\r\n };\r\n const file = await ctx.client.stores.writeFile(requireParam(ctx.params, 'id'), input);\r\n return json(200, file);\r\n};\r\n\r\nexport const deleteStoreFile: RouteHandler = async (request, ctx) => {\r\n const path = requireQueryParam(request.query, 'path');\r\n await ctx.client.stores.deleteFile(requireParam(ctx.params, 'id'), { path });\r\n return noContent();\r\n};\r\n","import type { CreateRcpSourceInput, UpdateRcpSourceInput } from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireParam,\r\n requireBodyObject,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n// Everything here requires capabilities.rcpSources — RCP source management\r\n// is Project-level tool-source configuration, not an end-user chat operation.\r\n\r\nexport const listRcpSources: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.rcpSources.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const createRcpSource: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateRcpSourceInput = {\r\n name: requireStringField(body, 'name'),\r\n url: requireStringField(body, 'url'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n authType: body.authType as CreateRcpSourceInput['authType'],\r\n secretRef: typeof body.secretRef === 'string' ? body.secretRef : undefined,\r\n isEnabled: typeof body.isEnabled === 'boolean' ? body.isEnabled : undefined,\r\n paramContextMap: Array.isArray(body.paramContextMap)\r\n ? (body.paramContextMap as CreateRcpSourceInput['paramContextMap'])\r\n : undefined,\r\n };\r\n const source = await ctx.client.rcpSources.create(input);\r\n return json(201, source);\r\n};\r\n\r\nexport const getRcpSource: RouteHandler = async (_request, ctx) => {\r\n const source = await ctx.client.rcpSources.get(requireParam(ctx.params, 'id'));\r\n return json(200, source);\r\n};\r\n\r\nexport const updateRcpSource: RouteHandler = async (request, ctx) => {\r\n const body = (request.body as UpdateRcpSourceInput | undefined) ?? {};\r\n const source = await ctx.client.rcpSources.update(requireParam(ctx.params, 'id'), body);\r\n return json(200, source);\r\n};\r\n\r\nexport const deleteRcpSource: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.rcpSources.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const bulkDeleteRcpSources: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\r\n const result = await ctx.client.rcpSources.bulkDelete(ids);\r\n return json(200, result);\r\n};\r\n\r\nexport const getRcpSourceUsage: RouteHandler = async (_request, ctx) => {\r\n const usage = await ctx.client.rcpSources.getUsage(requireParam(ctx.params, 'id'));\r\n return json(200, usage);\r\n};\r\n\r\nexport const testRcpSourceConnection: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.rcpSources.testConnection(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\r\nimport { json, toInt } from '../routeHelpers.js';\r\n\r\n// Requires capabilities.auditLogs — a security/compliance log almost never\r\n// belongs behind the same auth gate as end-user chat sessions.\r\n\r\nexport const listAuditLogs: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.auditLogs.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n eventType: request.query.eventType,\r\n });\r\n return json(200, items);\r\n};\r\n","import type {\r\n CreateWorkflowInput,\r\n UpdateWorkflowInput,\r\n WorkflowDraft,\r\n WorkflowRunStatus,\r\n WorkflowVisibility,\r\n} from '@personaai/sdk';\r\nimport type { RouteHandler } from '../routing.js';\r\nimport {\r\n json,\r\n noContent,\r\n requireBodyObject,\r\n requireParam,\r\n requireStringField,\r\n toInt,\r\n} from '../routeHelpers.js';\r\n\r\n/** Always on — read-only discovery of available workflows. */\r\nexport const listWorkflows: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.workflows.list({\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n search: request.query.search,\r\n scope: request.query.scope as 'mine' | 'public' | 'all' | undefined,\r\n visibility: request.query.visibility as WorkflowVisibility | undefined,\r\n isEnabled:\r\n request.query.isEnabled !== undefined\r\n ? request.query.isEnabled === 'true'\r\n : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\n// Everything below requires capabilities.workflowsWrite — authoring workflows\r\n// is Project-admin/builder work, not something an ordinary end-user session does.\r\n\r\nexport const createWorkflow: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: CreateWorkflowInput = {\r\n name: requireStringField(body, 'name'),\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n visibility: body.visibility as WorkflowVisibility | undefined,\r\n isEnabled: typeof body.isEnabled === 'boolean' ? body.isEnabled : undefined,\r\n draft: (body.draft as WorkflowDraft) ?? undefined,\r\n };\r\n const idempotencyKey = request.headers['idempotency-key'];\r\n const workflow = await ctx.client.workflows.create(input, idempotencyKey);\r\n return json(201, workflow);\r\n};\r\n\r\nexport const getWorkflow: RouteHandler = async (_request, ctx) => {\r\n const workflow = await ctx.client.workflows.get(requireParam(ctx.params, 'id'));\r\n return json(200, workflow);\r\n};\r\n\r\nexport const updateWorkflow: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const input: UpdateWorkflowInput = {\r\n name: typeof body.name === 'string' ? body.name : undefined,\r\n description: typeof body.description === 'string' ? body.description : undefined,\r\n visibility: body.visibility as WorkflowVisibility | undefined,\r\n isEnabled: typeof body.isEnabled === 'boolean' ? body.isEnabled : undefined,\r\n draft: (body.draft as WorkflowDraft) ?? undefined,\r\n };\r\n const updated = await ctx.client.workflows.update(\r\n requireParam(ctx.params, 'id'),\r\n input\r\n );\r\n return json(200, updated);\r\n};\r\n\r\nexport const deleteWorkflow: RouteHandler = async (_request, ctx) => {\r\n await ctx.client.workflows.delete(requireParam(ctx.params, 'id'));\r\n return noContent();\r\n};\r\n\r\nexport const saveWorkflowDraft: RouteHandler = async (request, ctx) => {\r\n const body = requireBodyObject(request.body);\r\n const draft = body as unknown as WorkflowDraft;\r\n const updated = await ctx.client.workflows.saveDraft(\r\n requireParam(ctx.params, 'id'),\r\n draft\r\n );\r\n return json(200, updated);\r\n};\r\n\r\nexport const publishWorkflow: RouteHandler = async (_request, ctx) => {\r\n const version = await ctx.client.workflows.publish(requireParam(ctx.params, 'id'));\r\n return json(201, version);\r\n};\r\n\r\nexport const listWorkflowVersions: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.workflows.listVersions(\r\n requireParam(ctx.params, 'id'),\r\n {\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n }\r\n );\r\n return json(200, items);\r\n};\r\n\r\nexport const getWorkflowVersion: RouteHandler = async (_request, ctx) => {\r\n const versionNum = toInt(ctx.params.version);\r\n const version = await ctx.client.workflows.getVersion(\r\n requireParam(ctx.params, 'id'),\r\n versionNum ?? 1\r\n );\r\n return json(200, version);\r\n};\r\n\r\nexport const getWorkflowMermaid: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.workflows.getMermaid(requireParam(ctx.params, 'id'));\r\n return json(200, result);\r\n};\r\n\r\nexport const listWorkflowRuns: RouteHandler = async (request, ctx) => {\r\n const items = await ctx.client.workflows.listRuns(requireParam(ctx.params, 'id'), {\r\n page: toInt(request.query.page),\r\n limit: toInt(request.query.limit),\r\n status: request.query.status as WorkflowRunStatus | undefined,\r\n isDryRun:\r\n request.query.isDryRun !== undefined\r\n ? request.query.isDryRun === 'true'\r\n : undefined,\r\n });\r\n return json(200, items);\r\n};\r\n\r\nexport const getWorkflowRun: RouteHandler = async (_request, ctx) => {\r\n const run = await ctx.client.workflows.getRun(requireParam(ctx.params, 'runId'));\r\n return json(200, run);\r\n};\r\n\r\nexport const cancelWorkflowRun: RouteHandler = async (_request, ctx) => {\r\n const result = await ctx.client.workflows.cancel(requireParam(ctx.params, 'runId'));\r\n return json(200, result);\r\n};\r\n","import type { RouteHandler } from '../routing.js';\nimport { RuntimeHttpError } from '../errors.js';\nimport { RunDriver } from '../runDriver.js';\nimport { withHeartbeats } from '../heartbeat.js';\nimport { incomingTraceparent, requireParam, resolveRunVersion } from '../routeHelpers.js';\nimport type { RunContext } from '../types/hooks.js';\n\ninterface WorkflowStreamBody {\n input?: unknown;\n dryRun?: boolean;\n version?: number;\n}\n\nfunction parseWorkflowStreamBody(body: unknown): WorkflowStreamBody {\n if (body === undefined || body === null) return {};\n if (typeof body !== 'object') {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', 'Request body must be a JSON object.');\n }\n const b = body as Record<string, unknown>;\n return {\n input: b.input,\n dryRun: typeof b.dryRun === 'boolean' ? b.dryRun : undefined,\n version: typeof b.version === 'number' ? b.version : undefined,\n };\n}\n\n/**\n * Executes a workflow and streams AG-UI events back. Driven by RunDriver,\n * registered under a fresh `runId` (returned via `x-persona-run-id`)\n * allowing reconnections via `GET /workflows/runs/:runId/resume`.\n */\nexport const workflowStreamRoute: RouteHandler = async (request, ctx) => {\n const workflowId = requireParam(ctx.params, 'id');\n const body = parseWorkflowStreamBody(request.body);\n const userId = request.userId as string;\n\n const runCtx: RunContext = {\n userId,\n kind: 'workflow',\n workflowId,\n input: body.input,\n };\n\n // Which agent version the run's agent steps use (`version` above is the\n // workflow's own). The browser names it `agentEnvironment` / `agentVersion`.\n const agentVersion = await resolveRunVersion(\n (request.body ?? {}) as Record<string, unknown>,\n ctx,\n { userId, workflowId, kind: 'workflow' },\n 'agentEnvironment'\n );\n if (agentVersion.environment) runCtx.environment = agentVersion.environment;\n if (agentVersion.agentVersion) runCtx.agentVersion = agentVersion.agentVersion;\n const traceparent = incomingTraceparent(request.headers, ctx.forwardTraceparent);\n\n await ctx.hooks?.beforeRun?.(runCtx);\n\n // `agentEnvironment` / `agentVersion` / `traceparent` need @personaai/sdk >= 0.27.\n const runOptions: Record<string, unknown> = {\n ...(agentVersion.environment ? { agentEnvironment: agentVersion.environment } : {}),\n ...(agentVersion.agentVersion ? { agentVersion: agentVersion.agentVersion } : {}),\n ...(traceparent ? { traceparent } : {}),\n };\n const stream = ctx.client.workflows.stream(workflowId, {\n input: body.input,\n dryRun: body.dryRun,\n version: body.version,\n ...runOptions,\n });\n\n const runId = crypto.randomUUID();\n const driver = new RunDriver(runId, runCtx, stream, ctx.hooks, ctx.mode);\n ctx.runs.set(runId, driver);\n\n try {\n await driver.waitForFirstFrame();\n } catch (err) {\n ctx.runs.delete(runId);\n throw err;\n }\n\n return {\n kind: 'stream',\n status: 200,\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n connection: 'keep-alive',\n 'x-persona-run-id': runId,\n },\n body: withHeartbeats(driver.subscribe(-1), ctx.heartbeatIntervalMs),\n };\n};\n","import type { RouteHandler } from '../routing.js';\r\nimport type { RuntimeRequest } from '../types/request.js';\r\nimport type {\r\n TwilioChannelOptions,\r\n TwilioChannelRequest,\r\n TwilioChannelUser,\r\n} from '../types/options.js';\r\nimport type { RuntimeBufferedResponse } from '../types/response.js';\r\nimport { RuntimeHttpError } from '../errors.js';\r\n\r\n/**\r\n * Bring-your-own-Twilio-number channel webhooks.\r\n *\r\n * These are the only routes in this runtime that are `requiresAuth: false`\r\n * (besides `/health`): Twilio does not send an end-user session, it sends a\r\n * signature. Authentication is therefore two-step and entirely\r\n * host-configured: verify `X-Twilio-Signature` with the host's own auth\r\n * token, then resolve the sender to one of the host's users. Persona is\r\n * reached with the Project credential for that resolved user.\r\n *\r\n * Nothing here ever sends a message from Persona's Twilio account, and the\r\n * voice path only mints a ticket — the audio stream goes from Twilio\r\n * straight to Persona.\r\n */\r\n\r\nconst SIGNATURE_HEADER = 'x-twilio-signature';\r\n\r\nconst DEFAULT_VOICE_FALLBACK =\r\n 'Sorry, this assistant is unavailable right now. Please try again later.';\r\nconst DEFAULT_MESSAGE_FALLBACK =\r\n 'Sorry, something went wrong while handling your message. Please try again.';\r\n\r\nfunction firstHeader(value: string | undefined): string | undefined {\r\n return value?.split(',')[0]?.trim() || undefined;\r\n}\r\n\r\n/** Twilio signs the exact public URL, including the query string. */\r\nexport function resolveSignedUrl(\r\n request: RuntimeRequest,\r\n publicUrl?: string\r\n): string | null {\r\n const search = new URLSearchParams();\r\n for (const [key, value] of Object.entries(request.query)) {\r\n if (value !== undefined) search.set(key, value);\r\n }\r\n const query = search.toString();\r\n const pathWithQuery = request.path + (query ? `?${query}` : '');\r\n\r\n if (publicUrl) {\r\n return `${publicUrl.replace(/\\/+$/, '')}${pathWithQuery}`;\r\n }\r\n\r\n const host =\r\n firstHeader(request.headers['x-forwarded-host']) ?? firstHeader(request.headers.host);\r\n const proto = firstHeader(request.headers['x-forwarded-proto']) ?? 'https';\r\n if (!host) return null;\r\n return `${proto}://${host}${pathWithQuery}`;\r\n}\r\n\r\n/** `base64(HMAC-SHA1(authToken, url + concat(sortedParamKeys + values)))`. */\r\nexport async function computeTwilioSignature(\r\n authToken: string,\r\n url: string,\r\n params: Record<string, string>\r\n): Promise<string> {\r\n const payload =\r\n url +\r\n Object.keys(params)\r\n .sort()\r\n .map((key) => `${key}${params[key]}`)\r\n .join('');\r\n\r\n const encoder = new TextEncoder();\r\n const key = await crypto.subtle.importKey(\r\n 'raw',\r\n encoder.encode(authToken),\r\n { name: 'HMAC', hash: 'SHA-1' },\r\n false,\r\n ['sign']\r\n );\r\n const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));\r\n const bytes = new Uint8Array(signature);\r\n let binary = '';\r\n for (const byte of bytes) binary += String.fromCharCode(byte);\r\n return btoa(binary);\r\n}\r\n\r\nfunction constantTimeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) return false;\r\n let diff = 0;\r\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\r\n return diff === 0;\r\n}\r\n\r\nexport async function verifyTwilioSignature(\r\n request: RuntimeRequest,\r\n options: TwilioChannelOptions\r\n): Promise<boolean> {\r\n const provided = request.headers[SIGNATURE_HEADER];\r\n if (!provided || !options.authToken) return false;\r\n\r\n const url = resolveSignedUrl(request, options.publicUrl);\r\n if (!url) return false;\r\n\r\n const expected = await computeTwilioSignature(options.authToken, url, formParams(request));\r\n return constantTimeEqual(expected, provided);\r\n}\r\n\r\n/** Flattens a urlencoded body into Twilio's string-only param map. */\r\nexport function formParams(request: RuntimeRequest): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n const body = request.body;\r\n if (!body || typeof body !== 'object' || Array.isArray(body)) return params;\r\n\r\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\r\n if (typeof value === 'string') params[key] = value;\r\n else if (typeof value === 'number' || typeof value === 'boolean') params[key] = String(value);\r\n }\r\n return params;\r\n}\r\n\r\nfunction escapeXml(value: string): string {\r\n return value\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n}\r\n\r\n/** A 200 TwiML response — Twilio only executes TwiML on a 2xx. */\r\nexport function twiml(body: string): RuntimeBufferedResponse {\r\n return {\r\n kind: 'buffered',\r\n status: 200,\r\n headers: { 'content-type': 'text/xml; charset=utf-8' },\r\n body: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${body}`,\r\n };\r\n}\r\n\r\nfunction forbidden(message: string): RuntimeBufferedResponse {\r\n return {\r\n kind: 'buffered',\r\n status: 403,\r\n headers: { 'content-type': 'text/plain; charset=utf-8' },\r\n body: message,\r\n };\r\n}\r\n\r\nfunction channelKind(from: string): 'whatsapp' | 'sms' {\r\n return from.trim().toLowerCase().startsWith('whatsapp:') ? 'whatsapp' : 'sms';\r\n}\r\n\r\nfunction toUser(result: string | TwilioChannelUser | null): TwilioChannelUser | null {\r\n if (!result) return null;\r\n if (typeof result === 'string') return result ? { externalUserId: result } : null;\r\n if (typeof result.externalUserId !== 'string' || !result.externalUserId) return null;\r\n return result;\r\n}\r\n\r\n/**\r\n * Verifies the signature, then runs the host's resolver. Returns either the\r\n * resolved user or a response that must be returned immediately.\r\n */\r\nasync function authenticate(\r\n request: RuntimeRequest,\r\n options: TwilioChannelOptions,\r\n channelRequest: TwilioChannelRequest\r\n): Promise<{ user: TwilioChannelUser } | { response: RuntimeBufferedResponse }> {\r\n if (!(await verifyTwilioSignature(request, options))) {\r\n return { response: forbidden('Invalid Twilio signature') };\r\n }\r\n\r\n let resolved: TwilioChannelUser | string | null = null;\r\n try {\r\n resolved = await options.resolveUser(channelRequest);\r\n } catch {\r\n resolved = null;\r\n }\r\n\r\n const user = toUser(resolved);\r\n if (!user) {\r\n // Unknown sender: end the call (voice) / send nothing (message). Never\r\n // reveal whether the number is known.\r\n return {\r\n response:\r\n channelRequest.channel === 'voice'\r\n ? twiml('<Response><Reject/></Response>')\r\n : twiml('<Response></Response>'),\r\n };\r\n }\r\n\r\n return { user };\r\n}\r\n\r\n/** `POST /channels/twilio/voice` — answer a call with a Persona media stream. */\r\nexport const twilioVoiceChannel: RouteHandler = async (request, ctx) => {\r\n const options = ctx.channels?.twilio;\r\n if (!options) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'Twilio voice channel is not configured.');\r\n }\r\n\r\n const params = formParams(request);\r\n const channelRequest: TwilioChannelRequest = {\r\n channel: 'voice',\r\n from: params.From ?? '',\r\n to: params.To ?? '',\r\n ...(params.CallSid ? { callSid: params.CallSid } : {}),\r\n };\r\n\r\n const auth = await authenticate(request, options, channelRequest);\r\n if ('response' in auth) return auth.response;\r\n\r\n const agentId = auth.user.agentId ?? options.agentId;\r\n const fallback = options.voiceFallback ?? DEFAULT_VOICE_FALLBACK;\r\n\r\n if (!agentId) {\r\n ctx.logger.warn('twilio voice channel has no agent configured', {\r\n hasDefault: false,\r\n resolverProvided: false,\r\n });\r\n return twiml(`<Response><Say>${escapeXml(fallback)}</Say><Hangup/></Response>`);\r\n }\r\n\r\n try {\r\n const session = await ctx.client.voice.createTelephonySession({\r\n agentId,\r\n externalUserId: auth.user.externalUserId,\r\n ...(auth.user.threadId ? { threadId: auth.user.threadId } : {}),\r\n ...(channelRequest.from ? { from: channelRequest.from } : {}),\r\n ...(channelRequest.to ? { to: channelRequest.to } : {}),\r\n ...(channelRequest.callSid ? { callSid: channelRequest.callSid } : {}),\r\n });\r\n\r\n await ctx.hooks?.onVoiceSessionCreate?.({\r\n userId: auth.user.externalUserId,\r\n agentId,\r\n });\r\n\r\n return twiml(\r\n `<Response><Connect><Stream url=\"${escapeXml(session.streamUrl)}\"/></Connect></Response>`\r\n );\r\n } catch (err) {\r\n ctx.logger.error('twilio voice channel failed to start a session', {\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n return twiml(`<Response><Say>${escapeXml(fallback)}</Say><Hangup/></Response>`);\r\n }\r\n};\r\n\r\n/** `POST /channels/twilio/message` — reply to an SMS/WhatsApp message inline. */\r\nexport const twilioMessageChannel: RouteHandler = async (request, ctx) => {\r\n const options = ctx.channels?.twilio;\r\n if (!options) {\r\n throw new RuntimeHttpError(404, 'NOT_FOUND', 'Twilio messaging channel is not configured.');\r\n }\r\n\r\n const params = formParams(request);\r\n const channelRequest: TwilioChannelRequest = {\r\n channel: channelKind(params.From ?? ''),\r\n from: params.From ?? '',\r\n to: params.To ?? '',\r\n ...(params.MessageSid ? { messageSid: params.MessageSid } : {}),\r\n ...(params.Body ? { body: params.Body } : {}),\r\n ...(params.ProfileName ? { profileName: params.ProfileName } : {}),\r\n };\r\n\r\n const auth = await authenticate(request, options, channelRequest);\r\n if ('response' in auth) return auth.response;\r\n\r\n const agentId = auth.user.agentId ?? options.agentId;\r\n const fallback =\r\n options.messageFallback === undefined ? DEFAULT_MESSAGE_FALLBACK : options.messageFallback;\r\n\r\n if (!agentId) {\r\n ctx.logger.warn('twilio message channel has no agent configured');\r\n return fallback\r\n ? twiml(`<Response><Message>${escapeXml(fallback)}</Message></Response>`)\r\n : twiml('<Response></Response>');\r\n }\r\n\r\n const text = channelRequest.body ?? '';\r\n if (!text.trim()) {\r\n // Media-only or empty message: acknowledge with no reply rather than\r\n // paying for an agent turn on nothing.\r\n return twiml('<Response></Response>');\r\n }\r\n\r\n try {\r\n const result = await ctx.client.messages.generateReply({\r\n agentId,\r\n externalUserId: auth.user.externalUserId,\r\n text,\r\n ...(auth.user.threadId ? { threadId: auth.user.threadId } : {}),\r\n ...(channelRequest.profileName ? { displayName: channelRequest.profileName } : {}),\r\n });\r\n\r\n return twiml(`<Response><Message>${escapeXml(result.reply)}</Message></Response>`);\r\n } catch (err) {\r\n ctx.logger.error('twilio message channel failed to generate a reply', {\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n return fallback\r\n ? twiml(`<Response><Message>${escapeXml(fallback)}</Message></Response>`)\r\n : twiml('<Response></Response>');\r\n }\r\n};\r\n","import type { RouteHandler } from '../routing.js';\nimport { RuntimeHttpError } from '../errors.js';\nimport { json, requireBodyObject, requireStringField } from '../routeHelpers.js';\n\nconst MAX_COMMENT = 2000;\nconst MAX_TAGS = 10;\nconst MAX_TAG = 50;\n\n/**\n * `POST /feedback` — the end user rates one of their own runs (👍/👎, with\n * an optional comment and tags). Always on: Persona only accepts feedback\n * from the end user the run belongs to, so this can't touch anyone else's\n * runs. `runId` is Persona's run id (`RUN_STARTED.runId` in the stream).\n */\nexport const createFeedback: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const runId = requireStringField(body, 'runId');\n if (body.score !== 1 && body.score !== -1) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', '\"score\" must be 1 or -1.');\n }\n const score = body.score;\n let comment: string | undefined;\n if (body.comment !== undefined && body.comment !== null) {\n if (typeof body.comment !== 'string' || body.comment.length > MAX_COMMENT) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n `\"comment\" must be a string of at most ${MAX_COMMENT} characters.`\n );\n }\n comment = body.comment.trim() || undefined;\n }\n let tags: string[] | undefined;\n if (body.tags !== undefined && body.tags !== null) {\n if (\n !Array.isArray(body.tags) ||\n body.tags.length > MAX_TAGS ||\n !body.tags.every((t) => typeof t === 'string' && t.length > 0 && t.length <= MAX_TAG)\n ) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n `\"tags\" must be up to ${MAX_TAGS} strings of at most ${MAX_TAG} characters.`\n );\n }\n tags = body.tags as string[];\n }\n\n const result = await ctx.client.feedback.create({\n runId,\n score,\n ...(comment ? { comment } : {}),\n ...(tags?.length ? { tags } : {}),\n });\n\n await ctx.hooks?.onFeedback?.({\n userId: request.userId as string,\n runId,\n score,\n ...(comment ? { comment } : {}),\n ...(tags?.length ? { tags } : {}),\n });\n\n return json(200, result);\n};\n","import type { WebhookEvent, WebhookEventType } from '@personaai/sdk/webhooks';\nimport type { RouteHandler } from '../routing.js';\nimport type { RuntimeRequest } from '../types/request.js';\nimport { json } from '../routeHelpers.js';\n\n/**\n * `POST /webhooks/persona` — Persona's outgoing webhooks, verified the same\n * way as `verifyWebhook()` from `@personaai/sdk/webhooks`\n * (`X-Persona-Signature: t=<unix>,v1=<HMAC-SHA256(secret, \"<t>.<raw body>\")>`),\n * but with WebCrypto instead of `node:crypto`, so the runtime keeps working\n * on edge runtimes.\n *\n * Answers: 400 for a bad signature / body (Persona retries, but a retry\n * won't fix it), 200 when the handler resolves or nobody handles the event,\n * 500 when the handler throws (Persona retries with backoff).\n */\n\nconst encoder = new TextEncoder();\nconst DEFAULT_SEEN_LIMIT = 1000;\n\nfunction rawBodyBytes(request: RuntimeRequest): Uint8Array | null {\n const raw = request.rawBody;\n if (raw === undefined || raw === null) return null;\n return typeof raw === 'string' ? encoder.encode(raw) : raw;\n}\n\nfunction parseSignature(header: string): { timestamp: number; signatures: string[] } | null {\n let timestamp: number | null = null;\n const signatures: string[] = [];\n for (const part of header.split(',')) {\n const eq = part.indexOf('=');\n if (eq <= 0) continue;\n const key = part.slice(0, eq).trim();\n const value = part.slice(eq + 1).trim();\n if (key === 't' && /^\\d+$/.test(value)) timestamp = Number(value);\n else if (key === 'v1' && /^[0-9a-f]{64}$/i.test(value)) signatures.push(value.toLowerCase());\n }\n return timestamp === null || signatures.length === 0 ? null : { timestamp, signatures };\n}\n\nfunction toHex(bytes: ArrayBuffer): string {\n return [...new Uint8Array(bytes)].map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/** Constant-time for equal-length inputs (both are 64 hex chars here). */\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n\nasync function hmacHex(secret: string, message: Uint8Array): Promise<string> {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n return toHex(await crypto.subtle.sign('HMAC', key, message));\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\nconst reject = (code: string, message: string) => json(400, { error: { code, message } });\n\n/** In-memory \"already handled\" set: the last `limit` delivery ids, oldest dropped first. */\nexport function createSeenSet(limit = DEFAULT_SEEN_LIMIT) {\n const ids = new Set<string>();\n return {\n has: (id: string) => ids.has(id),\n add(id: string) {\n ids.add(id);\n if (ids.size > limit) ids.delete(ids.values().next().value as string);\n },\n };\n}\n\nexport function createWebhookRoute(): RouteHandler {\n const memory = createSeenSet();\n\n return async (request, ctx) => {\n const options = ctx.webhooks;\n if (!options) return json(404, { error: { code: 'NOT_FOUND', message: 'Not found' } });\n const logger = ctx.logger.child('webhooks');\n\n const body = rawBodyBytes(request);\n if (!body) {\n logger.error('webhook request has no rawBody: the adapter must pass the raw bytes');\n return json(500, {\n error: {\n code: 'RUNTIME_MISCONFIGURED',\n message: 'The server did not keep the raw request body for webhook verification.',\n },\n });\n }\n\n const header = request.headers['x-persona-signature'];\n if (!header) return reject('MISSING_SIGNATURE', 'Missing X-Persona-Signature header');\n const parsed = parseSignature(header);\n if (!parsed) return reject('INVALID_SIGNATURE', 'Malformed X-Persona-Signature header');\n\n const expected = await hmacHex(\n options.secret,\n concat(encoder.encode(`${parsed.timestamp}.`), body)\n );\n if (!parsed.signatures.some((sig) => safeEqual(sig, expected))) {\n logger.warn('webhook signature does not match');\n return reject('INVALID_SIGNATURE', 'Webhook signature does not match');\n }\n\n const tolerance = options.toleranceSec ?? 300;\n if (tolerance > 0 && Math.abs(Math.floor(Date.now() / 1000) - parsed.timestamp) > tolerance) {\n return reject('TIMESTAMP_OUT_OF_RANGE', 'Webhook timestamp is outside the allowed tolerance');\n }\n\n let event: WebhookEvent;\n try {\n event = JSON.parse(new TextDecoder().decode(body)) as WebhookEvent;\n } catch {\n return reject('INVALID_PAYLOAD', 'Webhook body is not valid JSON');\n }\n if (!event || typeof event !== 'object' || typeof event.type !== 'string') {\n return reject('INVALID_PAYLOAD', 'Webhook body is not a Persona event');\n }\n\n const deliveryId = request.headers['x-persona-delivery'];\n if (deliveryId) {\n const store = options.dedupe ?? memory;\n if (await store.has(deliveryId)) {\n logger.debug('duplicate webhook delivery ignored', { deliveryId, type: event.type });\n return json(200, { received: true, duplicate: true });\n }\n }\n\n const type = event.type as WebhookEventType;\n const handlers = [options.on[type], options.on['*']].filter(\n (h): h is NonNullable<typeof h> => typeof h === 'function'\n );\n try {\n for (const handler of handlers) await handler(event, { id: deliveryId, type });\n } catch (err) {\n logger.error('webhook handler failed', {\n type,\n deliveryId,\n error: err instanceof Error ? err.message : String(err),\n });\n return json(500, { error: { code: 'HANDLER_FAILED', message: 'Webhook handler failed' } });\n }\n // Only a handled delivery counts as seen, so a failed one is retried.\n if (deliveryId) await (options.dedupe ?? memory).add(deliveryId);\n logger.info('webhook handled', { type, deliveryId, handlers: handlers.length });\n return json(200, { received: true });\n };\n}\n","import type { UpdateSecretInput } from '@personaai/sdk';\nimport type { RouteHandler } from '../routing.js';\nimport {\n json,\n noContent,\n requireBodyObject,\n requireParam,\n requireStringField,\n} from '../routeHelpers.js';\n\n// Everything here requires capabilities.secrets — Project configuration.\n// Values are write-only: Persona never returns them.\n\nexport const listSecrets: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.client.secrets.list());\n};\n\nexport const createSecret: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const secret = await ctx.client.secrets.create(\n {\n label: requireStringField(body, 'label'),\n value: requireStringField(body, 'value'),\n },\n request.headers['idempotency-key']\n );\n return json(201, secret);\n};\n\nexport const getSecret: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.client.secrets.get(requireParam(ctx.params, 'id')));\n};\n\nexport const updateSecret: RouteHandler = async (request, ctx) => {\n const body = (request.body as UpdateSecretInput | undefined) ?? {};\n return json(200, await ctx.client.secrets.update(requireParam(ctx.params, 'id'), body));\n};\n\nexport const deleteSecret: RouteHandler = async (_request, ctx) => {\n await ctx.client.secrets.delete(requireParam(ctx.params, 'id'));\n return noContent();\n};\n\nexport const getSecretUsage: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.client.secrets.getUsage(requireParam(ctx.params, 'id')));\n};\n\nexport const bulkDeleteSecrets: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\n return json(200, await ctx.client.secrets.bulkDelete(ids));\n};\n","import type { CreateRestToolSourceInput, UpdateRestToolSourceInput } from '@personaai/sdk';\nimport type { RouteHandler } from '../routing.js';\nimport { json, noContent, requireBodyObject, requireParam, toInt } from '../routeHelpers.js';\n\n// Everything here requires capabilities.restToolSources — Project-level\n// tool-source configuration, not an end-user chat operation.\n\nexport const listRestToolSources: RouteHandler = async (request, ctx) => {\n const items = await ctx.client.restToolSources.list({\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n search: request.query.search,\n });\n return json(200, items);\n};\n\nexport const createRestToolSource: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body) as unknown as CreateRestToolSourceInput;\n const source = await ctx.client.restToolSources.create(body, request.headers['idempotency-key']);\n return json(201, source);\n};\n\nexport const getRestToolSource: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.client.restToolSources.get(requireParam(ctx.params, 'id')));\n};\n\nexport const updateRestToolSource: RouteHandler = async (request, ctx) => {\n const body = (request.body as UpdateRestToolSourceInput | undefined) ?? {};\n return json(200, await ctx.client.restToolSources.update(requireParam(ctx.params, 'id'), body));\n};\n\nexport const deleteRestToolSource: RouteHandler = async (_request, ctx) => {\n await ctx.client.restToolSources.delete(requireParam(ctx.params, 'id'));\n return noContent();\n};\n\nexport const getRestToolSourceUsage: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.client.restToolSources.getUsage(requireParam(ctx.params, 'id')));\n};\n\nexport const testRestToolSource: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.client.restToolSources.testConnection(requireParam(ctx.params, 'id')));\n};\n\nexport const bulkDeleteRestToolSources: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\n return json(200, await ctx.client.restToolSources.bulkDelete(ids));\n};\n","import type { AgentEnvironment, TraceSource } from '@personaai/sdk';\nimport type { RouteContext, RouteHandler } from '../routing.js';\nimport type { RuntimeRequest } from '../types/request.js';\nimport { RuntimeHttpError } from '../errors.js';\nimport { json, requireBodyObject, requireParam, toInt } from '../routeHelpers.js';\n\n// Everything here requires capabilities.deploy and runs with the\n// Project-scoped client (no end user): Persona's audit log names the API\n// key, and `onAdminAction` lets the host record which of its users did it.\n\nfunction environmentParam(ctx: RouteContext): AgentEnvironment {\n const env = requireParam(ctx.params, 'environment');\n if (env !== 'development' && env !== 'production') {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n 'environment must be \"development\" or \"production\".'\n );\n }\n return env;\n}\n\nfunction positiveInt(raw: string, name: string): number {\n const v = Number(raw);\n if (!Number.isInteger(v) || v < 1) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', `${name} must be a positive integer.`);\n }\n return v;\n}\n\nfunction versionOrDraft(raw: string | undefined, name: string): number | 'draft' {\n if (!raw || raw === 'draft') return 'draft';\n return positiveInt(raw, name);\n}\n\nasync function audit(\n request: RuntimeRequest,\n ctx: RouteContext,\n action: string,\n target: Record<string, unknown>\n): Promise<void> {\n await ctx.hooks?.onAdminAction?.({\n userId: request.userId as string,\n capability: 'deploy',\n action,\n target,\n });\n}\n\nexport const listAgentVersions: RouteHandler = async (request, ctx) => {\n return json(\n 200,\n await ctx.projectClient().agents.versions.list(requireParam(ctx.params, 'id'), {\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n })\n );\n};\n\nexport const publishAgentVersion: RouteHandler = async (request, ctx) => {\n const agentId = requireParam(ctx.params, 'id');\n const body = (request.body ?? {}) as Record<string, unknown>;\n const changelog = typeof body.changelog === 'string' ? body.changelog : undefined;\n const version = await ctx\n .projectClient()\n .agents.versions.publish(agentId, changelog ? { changelog } : {});\n await audit(request, ctx, 'agent.version.publish', { agentId, version: version.version });\n return json(201, version);\n};\n\nexport const agentVersionStats: RouteHandler = async (request, ctx) => {\n const source = request.query.source as TraceSource | undefined;\n return json(\n 200,\n await ctx.projectClient().agents.versions.stats(requireParam(ctx.params, 'id'), {\n days: toInt(request.query.days),\n ...(source ? { source } : {}),\n })\n );\n};\n\nexport const getAgentVersion: RouteHandler = async (_request, ctx) => {\n const version = positiveInt(requireParam(ctx.params, 'version'), 'version');\n return json(\n 200,\n await ctx.projectClient().agents.versions.get(requireParam(ctx.params, 'id'), version)\n );\n};\n\nexport const diffAgentVersion: RouteHandler = async (request, ctx) => {\n const from = versionOrDraft(requireParam(ctx.params, 'version'), 'version');\n const to = versionOrDraft(request.query.against, '\"against\"');\n return json(\n 200,\n await ctx.projectClient().agents.versions.diff(requireParam(ctx.params, 'id'), from, to)\n );\n};\n\nexport const getAgentDeployments: RouteHandler = async (_request, ctx) => {\n return json(\n 200,\n await ctx.projectClient().agents.versions.deployments(requireParam(ctx.params, 'id'))\n );\n};\n\nexport const setAgentServePolicy: RouteHandler = async (request, ctx) => {\n const agentId = requireParam(ctx.params, 'id');\n const body = requireBodyObject(request.body);\n if (typeof body.serveDeployedVersion !== 'boolean') {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"serveDeployedVersion\" is required and must be a boolean.'\n );\n }\n const result = await ctx\n .projectClient()\n .agents.versions.setServePolicy(agentId, body.serveDeployedVersion);\n await audit(request, ctx, 'agent.serve_policy.set', { agentId, ...result });\n return json(200, result);\n};\n\nexport const deployAgentVersion: RouteHandler = async (request, ctx) => {\n const agentId = requireParam(ctx.params, 'id');\n const environment = environmentParam(ctx);\n const body = (request.body ?? {}) as Record<string, unknown>;\n let version: number | undefined;\n if (body.version !== undefined && body.version !== null) {\n if (typeof body.version !== 'number' || !Number.isInteger(body.version) || body.version < 1) {\n throw new RuntimeHttpError(400, 'INVALID_REQUEST', '\"version\" must be a positive integer.');\n }\n version = body.version;\n }\n const deployment = await ctx\n .projectClient()\n .agents.versions.deploy(agentId, { environment, ...(version ? { version } : {}) });\n await audit(request, ctx, 'agent.version.deploy', {\n agentId,\n environment,\n version: deployment.version,\n });\n return json(200, deployment);\n};\n\nexport const rollbackAgentDeployment: RouteHandler = async (request, ctx) => {\n const agentId = requireParam(ctx.params, 'id');\n const environment = environmentParam(ctx);\n const deployment = await ctx.projectClient().agents.versions.rollback(agentId, environment);\n await audit(request, ctx, 'agent.version.rollback', {\n agentId,\n environment,\n version: deployment.version,\n });\n return json(200, deployment);\n};\n","import type { ListTracesParams, ReplayOptions } from '@personaai/sdk';\nimport type { RouteHandler } from '../routing.js';\nimport { json, requireParam, toInt } from '../routeHelpers.js';\n\n// Everything here requires capabilities.traces and runs with the\n// Project-scoped client: traces hold every end user's conversations.\n// Starting a replay runs the agent (the key needs `agent:invoke` too).\n\nconst STRING_FILTERS = [\n 'agentId',\n 'threadId',\n 'runId',\n 'status',\n 'source',\n 'channel',\n 'environment',\n 'feedback',\n 'from',\n 'to',\n] as const;\n\nexport const listTraces: RouteHandler = async (request, ctx) => {\n const params: Record<string, unknown> = {\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n agentVersion: toInt(request.query.agentVersion),\n };\n for (const key of STRING_FILTERS) {\n const value = request.query[key];\n if (value) params[key] = value;\n }\n return json(200, await ctx.projectClient().traces.list(params as ListTracesParams));\n};\n\nexport const getTrace: RouteHandler = async (request, ctx) => {\n return json(\n 200,\n await ctx.projectClient().traces.get(requireParam(ctx.params, 'id'), {\n spans: request.query.spans !== 'false',\n })\n );\n};\n\nexport const getTraceFeedback: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().traces.feedback(requireParam(ctx.params, 'id')));\n};\n\nexport const getReplayPlan: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().traces.replayPlan(requireParam(ctx.params, 'id')));\n};\n\nexport const replayTrace: RouteHandler = async (request, ctx) => {\n const traceId = requireParam(ctx.params, 'id');\n // Validated by Persona (the same schema as the Platform's replay).\n const options = (request.body ?? {}) as ReplayOptions;\n const result = await ctx.projectClient().traces.replay(traceId, options);\n await ctx.hooks?.onAdminAction?.({\n userId: request.userId as string,\n capability: 'traces',\n action: 'trace.replay',\n target: { traceId, replayTraceId: result.traceId },\n });\n return json(201, result);\n};\n\nexport const listTraceReplays: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().traces.replays(requireParam(ctx.params, 'id')));\n};\n","import type {\n CreateDatasetInput,\n DatasetItemInput,\n StartEvalRunInput,\n UpdateDatasetInput,\n} from '@personaai/sdk';\nimport type { RouteContext, RouteHandler } from '../routing.js';\nimport type { RuntimeRequest } from '../types/request.js';\nimport { RuntimeHttpError } from '../errors.js';\nimport {\n json,\n requireBodyObject,\n requireParam,\n requireStringField,\n toInt,\n} from '../routeHelpers.js';\n\n// Everything here requires capabilities.evals and runs with the\n// Project-scoped client. Bodies are validated by Persona (the same schemas\n// as the Platform); only the outer shape is checked here.\n\nasync function audit(\n request: RuntimeRequest,\n ctx: RouteContext,\n action: string,\n target: Record<string, unknown>\n): Promise<void> {\n await ctx.hooks?.onAdminAction?.({\n userId: request.userId as string,\n capability: 'evals',\n action,\n target,\n });\n}\n\n// ── Datasets ──────────────────────────────────────────────────────────\n\nexport const listDatasets: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().datasets.list());\n};\n\nexport const createDataset: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body) as unknown as CreateDatasetInput;\n const dataset = await ctx.projectClient().datasets.create(body);\n await audit(request, ctx, 'dataset.create', { datasetId: dataset._id });\n return json(201, dataset);\n};\n\nexport const getDataset: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().datasets.get(requireParam(ctx.params, 'id')));\n};\n\nexport const updateDataset: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body) as UpdateDatasetInput;\n return json(200, await ctx.projectClient().datasets.update(requireParam(ctx.params, 'id'), body));\n};\n\nexport const deleteDataset: RouteHandler = async (request, ctx) => {\n const datasetId = requireParam(ctx.params, 'id');\n const result = await ctx.projectClient().datasets.delete(datasetId);\n await audit(request, ctx, 'dataset.delete', { datasetId });\n return json(200, result);\n};\n\nexport const listDatasetItems: RouteHandler = async (request, ctx) => {\n return json(\n 200,\n await ctx.projectClient().datasets.items.list(requireParam(ctx.params, 'id'), {\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n })\n );\n};\n\n/**\n * `POST /datasets/:id/items` takes `{ items: [...] }` (any number; sent 500\n * per request) or `{ text: \"<CSV / JSON / JSON lines>\" }`, parsed the same\n * way as the Platform's import box.\n */\nexport const addDatasetItems: RouteHandler = async (request, ctx) => {\n const datasetId = requireParam(ctx.params, 'id');\n const body = requireBodyObject(request.body);\n let cases: string | DatasetItemInput[];\n if (typeof body.text === 'string') cases = body.text;\n else if (Array.isArray(body.items)) cases = body.items as DatasetItemInput[];\n else {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n 'Send \"items\" (an array of cases) or \"text\" (CSV / JSON).'\n );\n }\n try {\n return json(201, await ctx.projectClient().datasets.import(datasetId, cases));\n } catch (err) {\n // parseDatasetCases' own errors (bad CSV / JSON) are the caller's input.\n if (err instanceof Error && err.message.startsWith('parseDatasetCases:')) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n err.message.replace('parseDatasetCases: ', '')\n );\n }\n throw err;\n }\n};\n\nexport const addDatasetItemFromTrace: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const traceId = requireStringField(body, 'traceId');\n const options =\n body.expected === null\n ? { expected: null }\n : typeof body.expected === 'string'\n ? { expected: body.expected }\n : {};\n return json(\n 201,\n await ctx\n .projectClient()\n .datasets.items.addFromTrace(requireParam(ctx.params, 'id'), traceId, options)\n );\n};\n\nexport const updateDatasetItem: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body) as Partial<DatasetItemInput>;\n return json(\n 200,\n await ctx\n .projectClient()\n .datasets.items.update(\n requireParam(ctx.params, 'id'),\n requireParam(ctx.params, 'itemId'),\n body\n )\n );\n};\n\nexport const deleteDatasetItem: RouteHandler = async (_request, ctx) => {\n return json(\n 200,\n await ctx\n .projectClient()\n .datasets.items.delete(requireParam(ctx.params, 'id'), requireParam(ctx.params, 'itemId'))\n );\n};\n\n// ── Eval runs ─────────────────────────────────────────────────────────\n\nexport const listEvalRuns: RouteHandler = async (request, ctx) => {\n return json(\n 200,\n await ctx.projectClient().evals.list({\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n ...(request.query.agentId ? { agentId: request.query.agentId } : {}),\n ...(request.query.datasetId ? { datasetId: request.query.datasetId } : {}),\n })\n );\n};\n\nexport const startEvalRun: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body) as unknown as StartEvalRunInput;\n const run = await ctx.projectClient().evals.create(body);\n await audit(request, ctx, 'eval_run.start', {\n runId: run.id,\n agentId: run.agentId,\n datasetId: run.datasetId,\n });\n return json(201, run);\n};\n\nexport const compareEvalRuns: RouteHandler = async (request, ctx) => {\n const { a, b } = request.query;\n if (!a || !b) {\n throw new RuntimeHttpError(\n 400,\n 'INVALID_REQUEST',\n '\"a\" and \"b\" query parameters are required.'\n );\n }\n return json(200, await ctx.projectClient().evals.compare(a, b));\n};\n\nexport const getEvalRun: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().evals.get(requireParam(ctx.params, 'id')));\n};\n\nexport const deleteEvalRun: RouteHandler = async (request, ctx) => {\n const runId = requireParam(ctx.params, 'id');\n const result = await ctx.projectClient().evals.delete(runId);\n await audit(request, ctx, 'eval_run.delete', { runId });\n return json(200, result);\n};\n\nexport const listEvalResults: RouteHandler = async (request, ctx) => {\n return json(\n 200,\n await ctx.projectClient().evals.results(requireParam(ctx.params, 'id'), {\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n ...(request.query.failed === 'true' ? { failed: true } : {}),\n })\n );\n};\n\nexport const cancelEvalRun: RouteHandler = async (request, ctx) => {\n const runId = requireParam(ctx.params, 'id');\n const run = await ctx.projectClient().evals.cancel(runId);\n await audit(request, ctx, 'eval_run.cancel', { runId });\n return json(200, run);\n};\n","import type { TraceSource } from '@personaai/sdk';\nimport type { RouteHandler } from '../routing.js';\nimport { json, toInt } from '../routeHelpers.js';\n\n// Requires capabilities.observe. Read-only, Project-scoped client.\n\nexport const getBudget: RouteHandler = async (_request, ctx) => {\n return json(200, await ctx.projectClient().observe.budget());\n};\n\nexport const getUsage: RouteHandler = async (request, ctx) => {\n const source = request.query.source as TraceSource | undefined;\n return json(\n 200,\n await ctx.projectClient().observe.usage({\n days: toInt(request.query.days),\n ...(request.query.agentId ? { agentId: request.query.agentId } : {}),\n ...(source ? { source } : {}),\n })\n );\n};\n"],"mappings":"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","names":["PersonaApiError","reject","key","encoder","audit","response","PersonaApiError"]}