@personaai/runtime 0.5.4 → 0.7.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/runDriver.ts","../src/heartbeat.ts","../src/routes/chat.ts","../src/routes/architect.ts","../src/routes/resume.ts","../src/routeHelpers.ts","../src/routes/threads.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/auditLogs.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 { RuntimeCapabilities } 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}\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, 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 { 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} from './routes/threads.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 { listAuditLogs } from './routes/auditLogs.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 auditLogs: capabilities?.auditLogs ?? false,\r\n architect: capabilities?.architect ?? 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\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 ];\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 { method: 'GET', pattern: ['mcps', ':id', 'resource'], handler: readMcpResource },\r\n { method: 'POST', pattern: ['mcps', ':id', 'call-tool'], handler: callMcpTool }\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.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 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 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 });\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 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 : undefined,\r\n status: isHttpError ? (err as RuntimeHttpError).status : undefined,\r\n };\r\n if (isHttpError && (err as RuntimeHttpError).status >= 500) {\r\n logger.error('handle failed — server error', meta);\r\n } else if (isHttpError && (err as RuntimeHttpError).status >= 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","// Kept in sync with package.json's \"version\" manually — importing package.json\r\n// across a dual ESM/CJS tsup build isn't worth the trouble for one string.\r\nexport const RUNTIME_VERSION = '0.5.3';\r\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};\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 { 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}\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 };\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') acc.interrupted = true;\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 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 { 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 ChatBody {\r\n agentId: string;\r\n messages: ChatMessageInput[];\r\n threadId?: string;\r\n resume?: ChatResume;\r\n contextOverride?: string;\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 };\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 });\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 });\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 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 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`/`threadId` of its own to pass through.\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 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 messages: body.messages,\r\n };\r\n\r\n logger.debug('beforeRun hook (architect)', { userId });\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n logger.trace('beforeRun completed (architect)');\r\n\r\n logger.debug('starting architect stream');\r\n const stream = ctx.client.architect.stream({\r\n messages: body.messages,\r\n resume: body.resume,\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n logger.info('architect run created', { runId, userId });\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 { RuntimeHttpError } from './errors.js';\r\nimport type { RuntimeBufferedResponse } from './types/response.js';\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","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","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 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' | undefined;\r\n agentId: string | undefined;\r\n} {\r\n const scope = query.scope === 'agent' ? 'agent' : query.scope === 'user' ? 'user' : undefined;\r\n if (scope === 'agent' && !query.agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"agentId\" is required when scope is \"agent\".'\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 = body.scope === 'agent' ? 'agent' : body.scope === 'user' ? 'user' : undefined;\r\n const agentId = typeof body.agentId === 'string' ? body.agentId : undefined;\r\n if (scope === 'agent' && !agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"agentId\" is required when scope is \"agent\".'\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 { 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"],"mappings":"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","names":["response"]}
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/runDriver.ts","../src/heartbeat.ts","../src/routes/chat.ts","../src/routes/architect.ts","../src/routes/resume.ts","../src/routeHelpers.ts","../src/routes/threads.ts","../src/routes/voice.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/auditLogs.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 { RuntimeCapabilities } 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}\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, 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 { 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 {\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 { listAuditLogs } from './routes/auditLogs.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 auditLogs: capabilities?.auditLogs ?? false,\r\n architect: capabilities?.architect ?? 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 ];\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 { method: 'GET', pattern: ['mcps', ':id', 'resource'], handler: readMcpResource },\r\n { method: 'POST', pattern: ['mcps', ':id', 'call-tool'], handler: callMcpTool }\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.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 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 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 });\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 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 : undefined,\r\n status: isHttpError ? (err as RuntimeHttpError).status : undefined,\r\n };\r\n if (isHttpError && (err as RuntimeHttpError).status >= 500) {\r\n logger.error('handle failed — server error', meta);\r\n } else if (isHttpError && (err as RuntimeHttpError).status >= 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","// Kept in sync with package.json's \"version\" manually — importing package.json\r\n// across a dual ESM/CJS tsup build isn't worth the trouble for one string.\r\nexport const RUNTIME_VERSION = '0.5.4';\r\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};\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 { 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}\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 };\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') acc.interrupted = true;\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 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 { 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 ChatBody {\r\n agentId: string;\r\n messages: ChatMessageInput[];\r\n threadId?: string;\r\n resume?: ChatResume;\r\n contextOverride?: string;\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 };\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 });\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 });\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 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 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`/`threadId` of its own to pass through.\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 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 messages: body.messages,\r\n };\r\n\r\n logger.debug('beforeRun hook (architect)', { userId });\r\n await ctx.hooks?.beforeRun?.(runCtx);\r\n logger.trace('beforeRun completed (architect)');\r\n\r\n logger.debug('starting architect stream');\r\n const stream = ctx.client.architect.stream({\r\n messages: body.messages,\r\n resume: body.resume,\r\n });\r\n\r\n const runId = crypto.randomUUID();\r\n logger.info('architect run created', { runId, userId });\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 { RuntimeHttpError } from './errors.js';\r\nimport type { RuntimeBufferedResponse } from './types/response.js';\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","import type { UpdateThreadInput } from '@personaai/sdk';\nimport type { RouteHandler } from '../routing.js';\nimport {\n json,\n noContent,\n requireParam,\n requireBodyObject,\n requireStringField,\n toInt,\n} from '../routeHelpers.js';\n\nexport const listThreads: RouteHandler = async (request, ctx) => {\n const items = await ctx.client.threads.list({\n page: toInt(request.query.page),\n limit: toInt(request.query.limit),\n });\n return json(200, items);\n};\n\nexport const createThread: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const agentId = requireStringField(body, 'agentId');\n const thread = await ctx.client.threads.create({ agentId });\n\n await ctx.hooks?.onThreadCreate?.({\n userId: request.userId as string,\n agentId,\n threadId: thread._id,\n });\n\n return json(201, thread);\n};\n\nexport const getThread: RouteHandler = async (_request, ctx) => {\n const thread = await ctx.client.threads.get(requireParam(ctx.params, 'id'));\n return json(200, thread);\n};\n\nexport const updateThread: RouteHandler = async (request, ctx) => {\n const body = (request.body as UpdateThreadInput | undefined) ?? {};\n const thread = await ctx.client.threads.update(requireParam(ctx.params, 'id'), body);\n return json(200, thread);\n};\n\nexport const deleteThread: RouteHandler = async (_request, ctx) => {\n await ctx.client.threads.delete(requireParam(ctx.params, 'id'));\n return noContent();\n};\n\nexport const bulkDeleteThreads: RouteHandler = async (request, ctx) => {\n const body = requireBodyObject(request.body);\n const ids = Array.isArray(body.ids) ? (body.ids as string[]) : [];\n const result = await ctx.client.threads.bulkDelete(ids);\n return json(200, result);\n};\n\n/** The same message history + graph state `chat.stream()` would resume from — load a past conversation on page reopen. */\nexport const getThreadMessages: RouteHandler = async (_request, ctx) => {\n const messages = await ctx.client.threads.getMessages(requireParam(ctx.params, 'id'));\n return json(200, messages);\n};\n\n/** Clears a Thread's conversation content in place (same id/title) — see `@personaai/sdk`'s `threads.reset()`. */\nexport const resetThread: RouteHandler = async (_request, ctx) => {\n const thread = await ctx.client.threads.reset(requireParam(ctx.params, 'id'));\n return json(200, thread);\n};\n","import type { RouteHandler } from '../routing.js';\nimport { json, requireBodyObject, requireStringField } 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 ticket = await ctx.client.voice.createSession(agentId);\n\n await ctx.hooks?.onVoiceSessionCreate?.({\n userId: request.userId as string,\n agentId,\n });\n\n return json(201, ticket);\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 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' | undefined;\r\n agentId: string | undefined;\r\n} {\r\n const scope = query.scope === 'agent' ? 'agent' : query.scope === 'user' ? 'user' : undefined;\r\n if (scope === 'agent' && !query.agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"agentId\" is required when scope is \"agent\".'\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 = body.scope === 'agent' ? 'agent' : body.scope === 'user' ? 'user' : undefined;\r\n const agentId = typeof body.agentId === 'string' ? body.agentId : undefined;\r\n if (scope === 'agent' && !agentId) {\r\n throw new RuntimeHttpError(\r\n 400,\r\n 'INVALID_REQUEST',\r\n '\"agentId\" is required when scope is \"agent\".'\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 { 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"],"mappings":"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","names":["response"]}