@anvia/studio 1.1.0 → 1.1.2
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 +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/{graphs-page-D2jzO23K.js → graphs-page-vBCjLEva.js} +2 -2
- package/dist/ui/assets/{graphs-page-D2jzO23K.js.map → graphs-page-vBCjLEva.js.map} +1 -1
- package/dist/ui/assets/index-D7rMlAzl.js +61 -0
- package/dist/ui/assets/index-D7rMlAzl.js.map +1 -0
- package/dist/ui/assets/{knowledge-page-BSI_VDOp.js → knowledge-page-ZeAUXg01.js} +2 -2
- package/dist/ui/assets/{knowledge-page-BSI_VDOp.js.map → knowledge-page-ZeAUXg01.js.map} +1 -1
- package/dist/ui/assets/{mcps-page-BL1FLksQ.js → mcps-page-BSkygYJM.js} +2 -2
- package/dist/ui/assets/{mcps-page-BL1FLksQ.js.map → mcps-page-BSkygYJM.js.map} +1 -1
- package/dist/ui/assets/{memory-page-C20w55ut.js → memory-page-B2pWZ4in.js} +2 -2
- package/dist/ui/assets/{memory-page-C20w55ut.js.map → memory-page-B2pWZ4in.js.map} +1 -1
- package/dist/ui/assets/{pipelines-page-BPCS5mwc.js → pipelines-page-DAqa699J.js} +2 -2
- package/dist/ui/assets/{pipelines-page-BPCS5mwc.js.map → pipelines-page-DAqa699J.js.map} +1 -1
- package/dist/ui/assets/{renderers-CfrpUrJr.js → renderers-DRD34eUr.js} +4 -4
- package/dist/ui/assets/{renderers-CfrpUrJr.js.map → renderers-DRD34eUr.js.map} +1 -1
- package/dist/ui/assets/{status-page-B-57_iOR.js → status-page-CqmMMSo2.js} +2 -2
- package/dist/ui/assets/{status-page-B-57_iOR.js.map → status-page-CqmMMSo2.js.map} +1 -1
- package/dist/ui/assets/{style-BstB0PNS.js → style-FGiH1LIC.js} +4 -4
- package/dist/ui/assets/style-FGiH1LIC.js.map +1 -0
- package/dist/ui/assets/{tool-runner-DcuNII62.js → tool-runner-CExWna8k.js} +2 -2
- package/dist/ui/assets/{tool-runner-DcuNII62.js.map → tool-runner-CExWna8k.js.map} +1 -1
- package/dist/ui/assets/{tools-page-D4wQGPOl.js → tools-page-CdkExqNd.js} +2 -2
- package/dist/ui/assets/{tools-page-D4wQGPOl.js.map → tools-page-CdkExqNd.js.map} +1 -1
- package/dist/ui/assets/{transcript-item-B6OLwa1p.js → transcript-item-D9NWsnsD.js} +2 -2
- package/dist/ui/assets/{transcript-item-B6OLwa1p.js.map → transcript-item-D9NWsnsD.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/package.json +11 -11
- package/dist/ui/assets/index-C0DKDUvj.js +0 -75
- package/dist/ui/assets/index-C0DKDUvj.js.map +0 -1
- package/dist/ui/assets/style-BstB0PNS.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/studio.ts","../src/traces/trace-observer.ts","../src/runtime/json.ts","../src/ui/routes.tsx","../src/runtime/agent-context.ts","../src/runtime/agent-runs.ts","../src/runtime/agent-utils.ts","../src/runtime/errors.ts","../src/runtime/type-guards.ts","../src/runtime/http.ts","../src/runtime/models.ts","../src/runtime/streams.ts","../src/runtime/trace-summary.ts","../src/runtime/observability.ts","../src/runtime/runs.ts","../src/runtime/transcript.ts","../src/runtime/session-logs.ts","../src/runtime/config.ts","../src/runtime/eval-config.ts","../src/runtime/knowledge.ts","../src/runtime/query.ts","../src/runtime/tool-metadata.ts","../src/runtime/evals.ts","../src/runtime/graphs.ts","../src/runtime/interactions.ts","../src/runtime/mcps.ts","../src/runtime/memory.ts","../src/runtime/pipelines.ts","../src/runtime/pipeline-logs.ts","../src/runtime/run-lifecycle.ts","../src/runtime/sandbox-views.ts","../src/runtime/sandboxes.ts","../src/runtime/sessions.ts","../src/storage/memory-store.ts","../src/runtime/shared.ts","../src/runtime/status.ts","../src/runtime/tools.ts","../src/runtime/trace-routes.ts","../src/storage/sqlite-store.ts","../src/storage/compaction-state.ts"],"sourcesContent":["import type { JsonObject } from \"@anvia/core/completion\";\nimport { Agent, getAgentToolState } from \"@anvia/core/internal/agent\";\nimport { Pipeline } from \"@anvia/core/pipeline\";\nimport { serve, type WebSocketServerLike } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { Hono as HonoApp } from \"hono\";\nimport { WebSocketServer } from \"ws\";\nimport { StudioTraceObserver } from \"../traces/trace-observer\";\nimport type {\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioPipeline,\n StudioSandboxRegistration,\n StudioServeLifecycleOptions,\n StudioServeOptions,\n StudioSessionStore,\n StudioTarget,\n StudioTraceStore,\n} from \"../types\";\nimport {\n isStudioUiEnabled,\n registerStudioUi,\n resolveStudioUiOptions,\n studioUiEntryPath,\n} from \"../ui/routes\";\nimport { staticContextDocuments, vectorContexts } from \"./agent-context\";\nimport { type PreparedAgentRun, registerAgentRunRoute } from \"./agent-runs\";\nimport { cloneAgent } from \"./agent-utils\";\nimport {\n agentConfig,\n agentRuntimeSummary,\n buildConfig,\n runnerId,\n unsupportedCapabilities,\n} from \"./config\";\nimport { registerEvalRoutes } from \"./evals\";\nimport { registerGraphRoutes } from \"./graphs\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport { createStudioContinuationRegistry } from \"./interactions\";\nimport { registerKnowledgeRoutes } from \"./knowledge\";\nimport { registerMcpRoutes } from \"./mcps\";\nimport { createStudioMemorySourceRegistry, registerMemoryRoutes } from \"./memory\";\nimport { createStudioModelRegistry, registerModelRoutes } from \"./models\";\nimport {\n observeStores,\n registerObservabilityRoutes,\n StudioObservabilityHub,\n} from \"./observability\";\nimport type { StudioRuntimeOptions } from \"./options\";\nimport { registerPipelineRoutes } from \"./pipelines\";\nimport { StudioRunLifecycle } from \"./run-lifecycle\";\nimport { registerSandboxViewRoutes } from \"./sandbox-views\";\nimport { createStudioSandboxRegistry, registerSandboxRoutes } from \"./sandboxes\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport { normalizeAgents, normalizePipelines, resolveStores } from \"./shared\";\nimport { registerStatusRoutes } from \"./status\";\nimport { toolRequiresApproval } from \"./tool-metadata\";\nimport { registerToolRoutes } from \"./tools\";\nimport { registerTraceRoutes } from \"./trace-routes\";\n\ntype StudioApp = AnviaStudio & {\n readonly sessionStore?: StudioSessionStore;\n readonly traceStore?: StudioTraceStore;\n};\n\nexport class Studio implements AnviaStudio {\n private readonly options: StudioRuntimeOptions;\n private studio: StudioApp;\n private server: ReturnType<typeof serve> | undefined;\n private websocketServer: WebSocketServer | undefined;\n private signalHandlers: { readonly sigint: () => void; readonly sigterm: () => void } | undefined;\n private shutdownPromise: Promise<void> | undefined;\n\n constructor(targets: StudioTarget[] = [], options: StudioOptions = {}) {\n this.options = studioOptionsFromTargets(targets, options);\n this.studio = createStudioApp(this.options);\n }\n\n get app(): Hono {\n return this.studio.app;\n }\n\n fetch(request: Request): Response | Promise<Response> {\n return this.studio.fetch(request);\n }\n\n config(): StudioConfig {\n return this.studio.config();\n }\n\n traceObserver(): StudioTraceObserver {\n return new StudioTraceObserver({\n store: () => this.studio.traceStore,\n });\n }\n\n start(serveOptions: StudioServeOptions = {}): this {\n this.close();\n this.studio = createStudioApp(this.options);\n this.shutdownPromise = undefined;\n\n const port = serveOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n const serverOptions: Parameters<typeof serve>[0] = {\n fetch: (request, env) => this.studio.app.fetch(request, env),\n port,\n };\n this.websocketServer = new WebSocketServer({ noServer: true });\n serverOptions.websocket = {\n // @types/ws overloads are stricter than Hono's structural adapter, while Hono officially\n // supports ws.WebSocketServer. Keep the interop assertion at this single ownership boundary.\n server: this.websocketServer as unknown as WebSocketServerLike,\n };\n if (serveOptions.hostname !== undefined) serverOptions.hostname = serveOptions.hostname;\n this.server = serve(serverOptions);\n\n const log = serveOptions.log ?? true;\n if (log) {\n const host = serveOptions.hostname ?? \"localhost\";\n this.logAddress(host, port);\n }\n\n if (serveOptions.handleSignals ?? true) {\n const shutdownFor = (signal: \"SIGINT\" | \"SIGTERM\") => {\n process.exitCode = signal === \"SIGINT\" ? 130 : 143;\n void this.shutdown(shutdownOptions(serveOptions.shutdownTimeoutMs)).catch(\n (error: unknown) => {\n console.error(error);\n process.exitCode = 1;\n },\n );\n };\n this.signalHandlers = {\n sigint: () => shutdownFor(\"SIGINT\"),\n sigterm: () => shutdownFor(\"SIGTERM\"),\n };\n process.once(\"SIGINT\", this.signalHandlers.sigint);\n process.once(\"SIGTERM\", this.signalHandlers.sigterm);\n }\n\n return this;\n }\n\n async serve(serveOptions: StudioServeLifecycleOptions = {}): Promise<void> {\n const { onShutdown, shutdownTimeoutMs, signal, ...startOptions } = serveOptions;\n const failures: unknown[] = [];\n\n try {\n this.start({ ...startOptions, log: false, handleSignals: false });\n const server = this.server;\n if (server === undefined) {\n throw new Error(\"Studio server did not start\");\n }\n\n await waitForServerListening(server);\n\n if (startOptions.log ?? true) {\n const requestedPort = startOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n const address = server.address();\n const port = typeof address === \"object\" && address !== null ? address.port : requestedPort;\n this.logAddress(startOptions.hostname ?? \"localhost\", port);\n }\n\n await waitForShutdown(signal);\n } catch (error) {\n failures.push(error);\n }\n\n try {\n await this.shutdown(shutdownOptions(shutdownTimeoutMs));\n } catch (error) {\n failures.push(error);\n }\n try {\n await onShutdown?.();\n } catch (error) {\n failures.push(error);\n }\n\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) {\n throw new AggregateError(failures, \"Failed to run and shut down Anvia Studio.\");\n }\n }\n\n close(): void {\n this.removeSignalHandlers();\n this.closeNetwork();\n this.studio.close();\n }\n\n shutdown(options: { timeoutMs?: number } = {}): Promise<void> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return Promise.reject(\n new TypeError(\"Anvia Studio shutdown timeoutMs must be a positive number.\"),\n );\n }\n this.shutdownPromise ??= this.shutdownResources(timeoutMs);\n return this.shutdownPromise;\n }\n\n private async shutdownResources(timeoutMs: number): Promise<void> {\n this.removeSignalHandlers();\n this.closeNetwork();\n await this.studio.shutdown({ timeoutMs });\n }\n\n private removeSignalHandlers(): void {\n if (this.signalHandlers === undefined) return;\n process.off(\"SIGINT\", this.signalHandlers.sigint);\n process.off(\"SIGTERM\", this.signalHandlers.sigterm);\n this.signalHandlers = undefined;\n }\n\n private closeNetwork(): void {\n this.server?.close();\n this.server = undefined;\n this.websocketServer?.close();\n this.websocketServer = undefined;\n }\n\n private logAddress(host: string, port: number): void {\n if (isStudioUiEnabled(this.options.ui)) {\n const uiPath = studioUiEntryPath(resolveStudioUiOptions(this.options.ui));\n console.log(`Studio UI: http://${host}:${port}${uiPath}`);\n } else {\n console.log(`Studio API: http://${host}:${port}`);\n }\n }\n}\n\nfunction shutdownOptions(timeoutMs: number | undefined): { timeoutMs?: number } {\n return timeoutMs === undefined ? {} : { timeoutMs };\n}\n\ntype StudioServer = ReturnType<typeof serve>;\n\nfunction waitForServerListening(server: StudioServer): Promise<void> {\n if (server.listening) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n server.off(\"listening\", onListening);\n server.off(\"error\", onError);\n };\n const onListening = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n server.once(\"listening\", onListening);\n server.once(\"error\", onError);\n });\n}\n\nfunction waitForShutdown(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n\n return new Promise((resolve) => {\n const useRawInput = process.stdin.isTTY === true;\n const wasRaw = process.stdin.isRaw;\n const wasFlowing = process.stdin.readableFlowing;\n\n const cleanup = () => {\n process.off(\"SIGINT\", finish);\n process.off(\"SIGTERM\", finish);\n signal?.removeEventListener(\"abort\", finish);\n if (useRawInput) {\n process.stdin.off(\"data\", onInput);\n if (!wasRaw && process.stdin.isRaw) process.stdin.setRawMode(false);\n if (wasFlowing !== true) process.stdin.pause();\n }\n };\n const finish = () => {\n cleanup();\n resolve();\n };\n const onInput = (chunk: Buffer | string) => {\n const interrupted = typeof chunk === \"string\" ? chunk.includes(\"\\u0003\") : chunk.includes(3);\n if (interrupted) finish();\n };\n\n process.once(\"SIGINT\", finish);\n process.once(\"SIGTERM\", finish);\n signal?.addEventListener(\"abort\", finish, { once: true });\n if (useRawInput) {\n if (!wasRaw) process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", onInput);\n }\n });\n}\n\nfunction studioOptionsFromTargets(\n targets: StudioTarget[],\n options: StudioOptions,\n): StudioRuntimeOptions {\n const agents = targets.filter((target): target is Agent => target instanceof Agent);\n const pipelines = targets.filter(\n // oxlint-disable-next-line typescript/no-explicit-any -- Studio accepts heterogeneous user pipelines.\n (target): target is Pipeline<any, any> => target instanceof Pipeline,\n );\n const runtimeOptions: StudioRuntimeOptions = {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\n pipelines: inferStudioPipelines(pipelines),\n evals: options.evals ?? [],\n graphs: options.graphs === undefined ? [] : [...options.graphs],\n };\n if (options.models !== undefined) runtimeOptions.models = options.models;\n if (options.stores !== undefined) runtimeOptions.stores = options.stores;\n if (options.ui !== undefined) runtimeOptions.ui = options.ui;\n if (options.sandboxes !== undefined) {\n runtimeOptions.sandboxes = options.sandboxes.map((registration) => {\n let snapshot: StudioSandboxRegistration = { inspector: registration.inspector };\n if (registration.agentIds !== undefined) {\n snapshot = { ...snapshot, agentIds: [...registration.agentIds] };\n }\n if (registration.toolNames !== undefined) {\n snapshot = { ...snapshot, toolNames: [...registration.toolNames] };\n }\n if (registration.views !== undefined) {\n snapshot = { ...snapshot, views: [...registration.views] };\n }\n return snapshot;\n });\n }\n return runtimeOptions;\n}\n\nfunction inferStudioAgents(agents: Agent[], quickPrompts: Record<string, string[]>): StudioAgent[] {\n const ids = new Set<string>();\n return agents.map((agent) => {\n const id = uniqueAgentId(agent.id, ids);\n return {\n id,\n agent,\n quickPrompts: quickPrompts[id] ?? [],\n metadata: agentMetadata(agent),\n };\n });\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any -- Studio accepts heterogeneous user pipelines.\nfunction inferStudioPipelines(pipelines: Array<Pipeline<any, any>>): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = uniqueAgentId(pipeline.id || \"pipeline\", ids);\n const studioPipeline: StudioPipeline = {\n id,\n pipeline,\n };\n if (pipeline.name !== undefined) studioPipeline.name = pipeline.name;\n if (pipeline.description !== undefined) studioPipeline.description = pipeline.description;\n if (pipeline.metadata !== undefined) studioPipeline.metadata = pipeline.metadata;\n return studioPipeline;\n });\n}\n\nfunction uniqueAgentId(baseId: string, ids: Set<string>): string {\n let id = baseId;\n let suffix = 2;\n while (ids.has(id)) {\n id = `${baseId}-${suffix}`;\n suffix += 1;\n }\n ids.add(id);\n return id;\n}\n\nfunction agentMetadata(agent: Agent): JsonObject {\n const metadata: JsonObject = {\n staticContextCount: staticContextDocuments(agent).length,\n dynamicContextCount: vectorContexts(agent).length,\n dynamicToolCount: getAgentToolState(agent).toolIndexes.length,\n hasLifecycle: agent.lifecycle !== undefined,\n hasOutputSchema: agent.outputSchema !== undefined,\n observerCount: Object.keys(agent.observability?.observers ?? {}).length,\n approvalToolCount: agent.tools.filter(toolRequiresApproval).length,\n };\n if (agent.defaultMaxTurns !== undefined) metadata.defaultMaxTurns = agent.defaultMaxTurns;\n return metadata;\n}\n\nfunction createStudioApp(options: StudioRuntimeOptions): StudioApp {\n const observabilityHub = new StudioObservabilityHub();\n const stores = observeStores(resolveStores(options), observabilityHub);\n const agents = normalizeAgents(options.agents).map((agent) =>\n withStudioTraceObserver(agent, stores.traces),\n );\n const modelRegistry = createStudioModelRegistry(options.models);\n const pipelines = normalizePipelines(options.pipelines);\n const agentMap = new Map(agents.map((agent) => [agent.id, agent]));\n const pipelineMap = new Map(pipelines.map((pipeline) => [pipeline.id, pipeline]));\n const evalMap = new Map(options.evals.map((suite) => [suite.id ?? suite.name, suite]));\n const continuationRegistry = createStudioContinuationRegistry<PreparedAgentRun>();\n const runLifecycle = new StudioRunLifecycle();\n const sandboxRegistry = createStudioSandboxRegistry(agents, options.sandboxes ?? []);\n const memorySources = createStudioMemorySourceRegistry(agents, stores.sessions);\n const app = new HonoApp();\n const uiOptions = isStudioUiEnabled(options.ui) ? resolveStudioUiOptions(options.ui) : undefined;\n\n if (uiOptions !== undefined && !uiOptions.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n if (uiOptions?.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n app.get(\"/health\", (c) =>\n c.json({\n status: \"ok\",\n runner: {\n id: runnerId(options),\n name: options.name,\n version: options.version,\n },\n }),\n );\n\n app.get(\"/config\", (c) =>\n c.json(buildConfig(options, agents, pipelines, stores, sandboxRegistry.size)),\n );\n registerStatusRoutes(app, {\n options,\n agents,\n pipelines,\n stores,\n sandboxCount: sandboxRegistry.size,\n });\n\n app.get(\"/agents\", (c) => c.json({ agents: agents.map(agentConfig) }));\n\n app.get(\"/agents/:agentId\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentConfig(agent));\n });\n\n app.get(\"/agents/:agentId/runtime\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentRuntimeSummary(agent));\n });\n\n registerModelRoutes(app, { registry: modelRegistry, agentMap });\n registerMcpRoutes(app, { agentMap });\n registerToolRoutes(app, { agentMap });\n registerSandboxRoutes(app, sandboxRegistry);\n const closeSandboxViews = registerSandboxViewRoutes(app, sandboxRegistry);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\n registerGraphRoutes(app, options.graphs);\n const knowledgeOptions: Parameters<typeof registerKnowledgeRoutes>[1] = { agents };\n if (stores.traces !== undefined) knowledgeOptions.traceStore = stores.traces;\n registerKnowledgeRoutes(app, knowledgeOptions);\n const pipelineOptions: Parameters<typeof registerPipelineRoutes>[1] = {\n pipelines,\n pipelineMap,\n runLifecycle,\n };\n if (stores.pipelineLogs !== undefined) pipelineOptions.logStore = stores.pipelineLogs;\n if (stores.pipelineRuns !== undefined) pipelineOptions.runStore = stores.pipelineRuns;\n registerPipelineRoutes(app, pipelineOptions);\n\n registerAgentRunRoute(app, {\n agentMap,\n stores,\n modelRegistry,\n continuationRegistry,\n runLifecycle,\n });\n\n if (memorySources.size > 0 || stores.sessions !== undefined) {\n registerMemoryRoutes(app, {\n sources: memorySources,\n sessionStore: stores.sessions,\n });\n }\n\n if (stores.sessions !== undefined) {\n const sessionOptions: Parameters<typeof registerSessionRoutes>[1] = {\n agentMap,\n sessionStore: stores.sessions,\n };\n if (stores.traces !== undefined) sessionOptions.traceStore = stores.traces;\n registerSessionRoutes(app, sessionOptions);\n }\n\n if (stores.traces !== undefined) {\n registerTraceRoutes(app, stores.traces);\n }\n\n for (const capability of unsupportedCapabilities(stores)) {\n app.all(`/${capability}`, (c) => unsupportedCapability(c, capability));\n app.all(`/${capability}/*`, (c) => unsupportedCapability(c, capability));\n }\n\n let closing = false;\n const beginClose = () => {\n if (closing) return;\n closing = true;\n continuationRegistry.clear();\n closeSandboxViews();\n runLifecycle.close();\n };\n const studio: StudioApp = {\n app,\n fetch(request: Request): Response | Promise<Response> {\n return app.fetch(request);\n },\n config(): StudioConfig {\n return buildConfig(options, agents, pipelines, stores, sandboxRegistry.size);\n },\n close() {\n beginClose();\n },\n async shutdown(shutdownOptions = {}) {\n beginClose();\n await runLifecycle.drain(shutdownOptions.timeoutMs ?? 30_000);\n },\n };\n if (stores.sessions !== undefined) Object.assign(studio, { sessionStore: stores.sessions });\n if (stores.traces !== undefined) Object.assign(studio, { traceStore: stores.traces });\n return studio;\n}\n\nfunction withStudioTraceObserver(\n studioAgent: StudioAgent,\n traceStore: StudioTraceStore | undefined,\n): StudioAgent {\n if (traceStore === undefined) return studioAgent;\n const existing = studioAgent.agent.observability;\n const studioObserver = existing?.observers.studio;\n if (studioObserver !== undefined && !(studioObserver instanceof StudioTraceObserver)) {\n throw new TypeError('Studio reserves the observer name \"studio\" for local trace persistence.');\n }\n for (const [name, observer] of Object.entries(existing?.observers ?? {})) {\n if (observer instanceof StudioTraceObserver && name !== \"studio\") {\n throw new TypeError('StudioTraceObserver must be registered with the name \"studio\".');\n }\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n observability: {\n observers: {\n ...existing?.observers,\n studio: studioObserver ?? new StudioTraceObserver({ store: traceStore }),\n },\n primaryTrace: \"studio\",\n errorPolicy: existing?.errorPolicy ?? \"ignore\",\n },\n }),\n };\n}\n","import { AgentRunCancelledError } from \"@anvia/core/agent\";\nimport type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentObserver,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunObserver,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n AgentToolSuspendedArgs,\n} from \"@anvia/core/observability\";\nimport {\n compactJsonObject,\n serializeUnknown as serializeError,\n toJsonValue,\n} from \"../runtime/json\";\nimport type {\n StudioTrace,\n StudioTraceObservation,\n StudioTraceStatus,\n StudioTraceStore,\n} from \"../types\";\n\nexport type StudioTraceObserverOptions = {\n store: StudioTraceStore | (() => StudioTraceStore | undefined) | undefined;\n};\n\nexport class StudioTraceObserver implements AgentObserver {\n constructor(private readonly options: StudioTraceObserverOptions) {}\n\n startRun(args: AgentRunStartArgs): AgentRunObserver {\n const traceId = args.trace?.traceId ?? globalThis.crypto.randomUUID().replaceAll(\"-\", \"\");\n const observationId = globalThis.crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 16);\n return new StudioRunTraceObserver({\n id: traceId,\n observationId,\n args,\n store: this.store(),\n });\n }\n\n private store(): StudioTraceStore | undefined {\n return typeof this.options.store === \"function\" ? this.options.store() : this.options.store;\n }\n}\n\nclass StudioRunTraceObserver implements AgentRunObserver {\n readonly trace: { traceId: string; observationId: string };\n private readonly startedAt = new Date();\n private readonly observations: StudioTraceObservation[] = [];\n\n constructor(\n private readonly props: {\n id: string;\n observationId: string;\n args: AgentRunStartArgs;\n store: StudioTraceStore | undefined;\n },\n ) {\n this.trace = { traceId: props.id, observationId: props.observationId };\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n const startedAt = new Date();\n return {\n end: (endArgs: AgentGenerationEndArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n output: toJsonValue(endArgs.response),\n metadata: generationMetadata(args, endArgs),\n }),\n );\n },\n error: (errorArgs: AgentGenerationErrorArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n error: serializeError(errorArgs.error),\n metadata: generationMetadata(args),\n }),\n );\n },\n };\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const startedAt = new Date();\n const childTrace = new ChildAgentToolTraceAccumulator(args);\n return {\n streamEvent: (streamArgs: AgentToolStreamEventArgs) => {\n childTrace.accept(streamArgs);\n },\n end: (endArgs: AgentToolEndArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n output: parseOrString(endArgs.result),\n metadata: toolMetadata(args, endArgs.skipped, endArgs.result),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n suspend: (suspendArgs: AgentToolSuspendedArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"suspended\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n output: toJsonValue({ interaction: suspendArgs.interaction }),\n metadata: toolMetadata(args, false),\n }),\n );\n },\n error: (errorArgs: AgentToolErrorArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n error: serializeError(errorArgs.error),\n metadata: toolMetadata(args, false),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n };\n }\n\n async end(args: AgentRunEndArgs): Promise<void> {\n const result: JsonObject = {\n runId: this.props.args.runId,\n status: args.status,\n text: args.text,\n };\n if (args.resumedFrom !== undefined) result.resumedFrom = args.resumedFrom;\n if (args.status === \"completed\") {\n result.output = toJsonValue(args.output);\n } else if (args.status === \"blocked\") {\n result.stage = args.stage;\n } else {\n result.interaction = toJsonValue(args.interaction);\n }\n await this.save(args.status === \"suspended\" ? \"suspended\" : \"success\", {\n endedAt: new Date(),\n output: args.status === \"completed\" ? traceOutput(args.output) : args.text,\n result,\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n async error(args: AgentRunErrorArgs): Promise<void> {\n await this.save(args.status === \"cancelled\" ? \"cancelled\" : \"error\", {\n endedAt: new Date(),\n error: serializeError(args.error),\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n private async save(\n status: StudioTraceStatus,\n result: {\n endedAt: Date;\n output?: string;\n result?: JsonObject;\n error?: JsonValue;\n usage: StudioTrace[\"usage\"];\n messages: JsonValue;\n },\n ): Promise<void> {\n const sessionId = this.props.args.trace?.sessionId;\n const store = this.props.store;\n if (sessionId === undefined || store === undefined) {\n return;\n }\n\n const metadata = traceMetadata(this.props.args, result.messages);\n if (result.result !== undefined) metadata.result = result.result;\n const trace: StudioTrace = {\n id: this.props.id,\n runId: this.props.args.runId,\n sessionId,\n status,\n trace: { observer: \"studio\", ...this.trace },\n startedAt: this.startedAt.toISOString(),\n endedAt: result.endedAt.toISOString(),\n durationMs: durationMs(this.startedAt, result.endedAt),\n input: toJsonValue({\n instructions: this.props.args.instructions,\n prompt: this.props.args.prompt,\n history: this.props.args.history,\n }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n if (this.props.args.trace?.name !== undefined) trace.name = this.props.args.trace.name;\n if (result.output !== undefined) trace.output = result.output;\n if (result.error !== undefined) trace.error = result.error;\n if (result.usage !== undefined) trace.usage = result.usage;\n\n await store.saveTrace(trace);\n }\n}\n\ntype ChildAgentStart = {\n startedAt: Date;\n agentId: string;\n agentName?: string;\n};\n\ntype ChildGenerationStart = ChildAgentStart & {\n input?: JsonValue;\n childTurn: number;\n};\n\ntype ChildToolStart = ChildAgentStart & {\n childTurn: number;\n toolName: string;\n toolCallId?: string;\n internalCallId?: string;\n input?: JsonValue;\n completed: boolean;\n};\n\nclass ChildAgentToolTraceAccumulator {\n private readonly agentStarts = new Map<string, ChildAgentStart>();\n private readonly generationStarts = new Map<string, ChildGenerationStart>();\n private readonly toolStarts: ChildToolStart[] = [];\n private readonly completedObservations: StudioTraceObservation[] = [];\n\n constructor(private readonly parent: AgentToolStartArgs) {}\n\n accept(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : this.parent.turn;\n\n if (!this.agentStarts.has(agentId)) {\n const start: ChildAgentStart = {\n startedAt: new Date(),\n agentId,\n };\n if (agentName !== undefined) start.agentName = agentName;\n this.agentStarts.set(agentId, start);\n }\n\n if (child.type === \"turn_start\") {\n const start: ChildGenerationStart = {\n startedAt: new Date(),\n input: toJsonValue({\n prompt: child.prompt,\n history: child.history,\n }),\n agentId,\n childTurn,\n };\n if (agentName !== undefined) start.agentName = agentName;\n this.generationStarts.set(generationKey(agentId, childTurn), start);\n return;\n }\n\n if (child.type === \"turn_end\") {\n const key = generationKey(agentId, childTurn);\n const start = this.generationStarts.get(key);\n this.generationStarts.delete(key);\n const observation: Parameters<typeof traceObservation>[0] = {\n kind: \"generation\",\n name: `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n output: toJsonValue(child.response),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n };\n if (start?.input !== undefined) observation.input = start.input;\n this.completedObservations.push(traceObservation(observation));\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolName = typeof toolCall.toolName === \"string\" ? toolCall.toolName : \"tool\";\n const callId =\n typeof toolCall.toolCallId === \"string\"\n ? toolCall.toolCallId\n : typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : undefined;\n const start: (typeof this.toolStarts)[number] = {\n startedAt: new Date(),\n agentId,\n childTurn,\n toolName,\n input: toJsonValue(\"input\" in toolCall ? toolCall.input : {}),\n completed: false,\n };\n if (agentName !== undefined) start.agentName = agentName;\n if (callId !== undefined) start.toolCallId = callId;\n this.toolStarts.push(start);\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const internalCallId =\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined;\n const start = this.findToolStart(agentId, toolName, toolCallId);\n const input =\n start?.input ?? (typeof child.args === \"string\" ? parseOrString(child.args) : undefined);\n if (start !== undefined) {\n start.completed = true;\n }\n const metadata = this.childMetadata(agentId, agentName, childTurn);\n if (toolCallId !== undefined) metadata.toolCallId = toolCallId;\n if (internalCallId !== undefined) metadata.internalCallId = internalCallId;\n const observation: Parameters<typeof traceObservation>[0] = {\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.${toolName}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n metadata,\n };\n if (input !== undefined) observation.input = input;\n if (typeof child.result === \"string\") observation.output = parseOrString(child.result);\n this.completedObservations.push(traceObservation(observation));\n return;\n }\n\n if (child.type === \"error\") {\n const metadata = this.childMetadata(agentId, agentName, childTurn);\n if (isRecord(child.usage)) metadata.usage = toJsonValue(child.usage);\n const status = child.error instanceof AgentRunCancelledError ? \"cancelled\" : \"error\";\n this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.error`,\n status,\n turn: this.parent.turn,\n startedAt: new Date(),\n error: serializeError(child.error),\n metadata,\n }),\n );\n }\n }\n\n observations(parentObservationId: string): StudioTraceObservation[] {\n const observations: StudioTraceObservation[] = [];\n const agentObservationIds = new Map<string, string>();\n\n for (const agentStart of this.agentStarts.values()) {\n const agentChildren = this.completedObservations.filter(\n (observation) =>\n isRecord(observation.metadata) &&\n observation.metadata.childAgentId === agentStart.agentId,\n );\n const childStartTimes = agentChildren.map((observation) => Date.parse(observation.startedAt));\n const childEndTimes = agentChildren.map((observation) =>\n Date.parse(observation.endedAt ?? observation.startedAt),\n );\n const startedAt =\n childStartTimes.length === 0\n ? agentStart.startedAt\n : new Date(Math.min(agentStart.startedAt.getTime(), ...childStartTimes));\n const endedAt =\n childEndTimes.length === 0 ? new Date() : new Date(Math.max(...childEndTimes));\n const agentObservation = traceObservation({\n parentObservationId,\n kind: \"agent\",\n name: `${agentLabel(agentStart.agentId, agentStart.agentName)}.run`,\n status: agentChildren.some((observation) => observation.status === \"error\")\n ? \"error\"\n : agentChildren.some((observation) => observation.status === \"cancelled\")\n ? \"cancelled\"\n : \"success\",\n turn: this.parent.turn,\n startedAt,\n endedAt,\n metadata: this.childMetadata(agentStart.agentId, agentStart.agentName, this.parent.turn),\n });\n observations.push(agentObservation);\n agentObservationIds.set(agentStart.agentId, agentObservation.id);\n }\n\n for (const observation of this.completedObservations) {\n const childAgentId = isRecord(observation.metadata)\n ? stringValue(observation.metadata.childAgentId)\n : undefined;\n const childAgentObservationId =\n childAgentId === undefined ? undefined : agentObservationIds.get(childAgentId);\n observations.push({\n ...observation,\n parentObservationId: childAgentObservationId ?? parentObservationId,\n });\n }\n\n return observations;\n }\n\n private findToolStart(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.toolStarts)[number] | undefined {\n for (let index = this.toolStarts.length - 1; index >= 0; index -= 1) {\n const start = this.toolStarts[index];\n if (\n start === undefined ||\n start.completed ||\n start.agentId !== agentId ||\n start.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || start.toolCallId === toolCallId) {\n return start;\n }\n }\n return undefined;\n }\n\n private childMetadata(\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n ): JsonObject {\n return compactJsonObject({\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: this.parent.toolName,\n parentInternalCallId: this.parent.internalCallId,\n parentToolCallId: this.parent.toolCallId,\n });\n }\n}\n\nfunction generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nfunction agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nfunction traceObservation(props: {\n parentObservationId?: string;\n kind: StudioTraceObservation[\"kind\"];\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: Date;\n endedAt?: Date;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n}): StudioTraceObservation {\n const endedAt = props.endedAt ?? new Date();\n const observation: StudioTraceObservation = {\n id: globalThis.crypto.randomUUID(),\n kind: props.kind,\n name: props.name,\n status: props.status,\n turn: props.turn,\n startedAt: props.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: durationMs(props.startedAt, endedAt),\n };\n if (props.parentObservationId !== undefined) {\n observation.parentObservationId = props.parentObservationId;\n }\n if (props.input !== undefined) observation.input = props.input;\n if (props.output !== undefined) observation.output = props.output;\n if (props.error !== undefined) observation.error = props.error;\n if (props.metadata !== undefined) observation.metadata = props.metadata;\n return observation;\n}\n\nfunction traceMetadata(args: AgentRunStartArgs, messages: JsonValue): JsonObject {\n return compactJsonObject({\n runId: args.runId,\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n userId: args.trace?.userId,\n tags: args.trace?.tags,\n version: args.trace?.version,\n metadata: toJsonValue(args.trace?.metadata ?? {}),\n messages,\n });\n}\n\nfunction generationMetadata(\n args: AgentGenerationStartArgs,\n endArgs?: AgentGenerationEndArgs,\n): JsonObject {\n const request = args.request;\n const response = endArgs?.response;\n const rawResponse = isRecord(response?.rawResponse) ? response.rawResponse : undefined;\n const modelId = args.modelInfo?.modelId ?? stringValue(rawResponse?.model) ?? \"unknown\";\n const providerResponse = providerResponseSummary(rawResponse);\n const usage = response?.usage;\n\n return compactJsonObject({\n provider: args.modelInfo?.provider,\n modelId,\n messageId: response?.messageId,\n usage,\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n documentCount: request.documents.length,\n historyCount: request.chatHistory.length,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n controls: request.controls,\n reasoningEffort: request.controls?.reasoningEffort,\n toolChoice: request.toolChoice,\n providerOptionKeys: isRecord(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n firstDeltaMs: endArgs?.firstDeltaMs,\n providerResponse,\n modelInfo: compactJsonObject({\n provider: args.modelInfo?.provider,\n modelId,\n capabilities: args.modelInfo?.capabilities,\n }),\n modelCall: compactJsonObject({\n request: completionRequestSummary(request),\n providerRequest: args.providerRequest,\n }),\n response: compactJsonObject({\n messageId: response?.messageId,\n usage,\n contentTypes: response?.choice.map((item) => item.type),\n providerResponse,\n }),\n tools: compactJsonObject({\n count: request.tools.length,\n names: request.tools.map((tool) => tool.name),\n toolChoice: request.toolChoice,\n hasOutputSchema: request.outputSchema !== undefined,\n }),\n timing: compactJsonObject({\n firstDeltaMs: endArgs?.firstDeltaMs,\n }),\n });\n}\n\nfunction completionRequestSummary(request: AgentGenerationStartArgs[\"request\"]): JsonObject {\n return compactJsonObject({\n instructions: request.instructions === undefined ? undefined : { present: true },\n messageCount: request.chatHistory.length,\n documentCount: request.documents.length,\n documentIds: request.documents.map((document) => document.id),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n controls: request.controls,\n reasoningEffort: request.controls?.reasoningEffort,\n toolChoice: request.toolChoice,\n providerOptionKeys: isRecord(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n });\n}\n\nfunction providerResponseSummary(\n rawResponse: Record<string, unknown> | undefined,\n): JsonObject | undefined {\n if (rawResponse === undefined) {\n return undefined;\n }\n const reasoning = isRecord(rawResponse.reasoning) ? rawResponse.reasoning : undefined;\n const text = isRecord(rawResponse.text) ? rawResponse.text : undefined;\n const toolUsage = isRecord(rawResponse.tool_usage) ? rawResponse.tool_usage : undefined;\n const webSearch = isRecord(toolUsage?.web_search) ? toolUsage.web_search : undefined;\n const summary = compactJsonObject({\n id: rawResponse.id,\n status: rawResponse.status,\n serviceTier: rawResponse.service_tier,\n store: rawResponse.store,\n parallelToolCalls: rawResponse.parallel_tool_calls,\n promptCacheKey: rawResponse.prompt_cache_key,\n promptCacheRetention: rawResponse.prompt_cache_retention,\n reasoningEffort: reasoning?.effort,\n textVerbosity: text?.verbosity,\n webSearchRequestCount: webSearch?.num_requests,\n });\n return Object.keys(summary).length === 0 ? undefined : summary;\n}\n\nfunction toolMetadata(args: AgentToolStartArgs, skipped: boolean, result?: string): JsonObject {\n const schema = isRecord(args.toolDefinition?.parameters) ? args.toolDefinition.parameters : {};\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = Array.isArray(schema.required)\n ? schema.required.filter((item): item is string => typeof item === \"string\")\n : [];\n return compactJsonObject({\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n toolDescription: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n tools: compactJsonObject({\n name: args.toolName,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n description: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n }),\n });\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction durationMs(startedAt: Date, endedAt: Date): number {\n return Math.max(0, endedAt.getTime() - startedAt.getTime());\n}\n\nfunction parseOrString(value: string): JsonValue {\n try {\n return toJsonValue(JSON.parse(value));\n } catch {\n return value;\n }\n}\n\nfunction traceOutput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(toJsonValue(value));\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function toJsonValue(value: unknown): JsonValue {\n return toJsonValueInternal(value, new WeakSet<object>());\n}\n\nfunction toJsonValueInternal(value: unknown, seen: WeakSet<object>): JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : String(value);\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return value.map((item) => toJsonValueInternal(item, seen));\n } finally {\n seen.delete(value);\n }\n }\n if (typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return compactJsonObjectInternal(value as Record<string, unknown>, seen);\n } finally {\n seen.delete(value);\n }\n }\n return String(value);\n}\n\nexport function compactJsonObject(values: Record<string, unknown>): JsonObject {\n return compactJsonObjectInternal(values, new WeakSet<object>());\n}\n\nfunction compactJsonObjectInternal(\n values: Record<string, unknown>,\n seen: WeakSet<object>,\n): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValueInternal(value, seen)]],\n );\n return Object.fromEntries(entries) as JsonObject;\n}\n\nexport function serializeUnknown(error: unknown): JsonValue {\n if (error instanceof Error) {\n return compactJsonObject({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n }\n return toJsonValue(error);\n}\n\nexport function formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function formatUnknown(value: unknown): string | undefined {\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Context, Hono, Next } from \"hono\";\nimport type { StudioUiOptions } from \"../types\";\n\nexport type ResolvedStudioUiOptions = {\n path: string;\n title: string;\n rootRoutes: boolean;\n redirectRoot: boolean;\n clientScript?: string;\n protectShell: boolean;\n};\n\nexport function resolveStudioUiOptions(\n ui: boolean | StudioUiOptions | undefined,\n): ResolvedStudioUiOptions {\n const options = typeof ui === \"object\" ? ui : {};\n const resolved: ResolvedStudioUiOptions = {\n path: normalizeUiPath(options.path ?? \"/ui\"),\n title: options.title ?? \"Anvia Studio\",\n rootRoutes: options.rootRoutes ?? true,\n redirectRoot: options.redirectRoot ?? true,\n protectShell: options.protectShell ?? false,\n };\n if (options.clientScript !== undefined) resolved.clientScript = options.clientScript;\n return resolved;\n}\n\nexport function isStudioUiEnabled(ui: boolean | StudioUiOptions | undefined): boolean {\n return ui !== false;\n}\n\nexport function registerStudioUi(app: Hono, options: ResolvedStudioUiOptions): void {\n const scriptPath = `${options.path}/assets/client.js`;\n const stylePath = `${options.path}/assets/styles.css`;\n const renderShell = () =>\n renderStudioUi({\n options,\n routePath: \"\",\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n\n if (options.redirectRoot) {\n app.get(\"/\", (c) => c.redirect(studioUiEntryPath(options)));\n }\n\n const redirectWithQuery = (c: Context, target: string) => {\n const search = new URL(c.req.url).search;\n return c.redirect(search.length === 0 ? target : `${target}${search}`);\n };\n\n app.get(options.path, (c) => redirectWithQuery(c, studioUiEntryPath(options)));\n app.get(`${options.path}/playground`, (c) => redirectWithQuery(c, \"/playground\"));\n app.get(`${options.path}/playground/:sessionId`, (c) =>\n redirectWithQuery(c, `/playground/${encodeURIComponent(c.req.param(\"sessionId\"))}`),\n );\n app.get(`${options.path}/tracing`, (c) => redirectWithQuery(c, \"/tracing\"));\n app.get(`${options.path}/tracing/:traceId`, (c) =>\n redirectWithQuery(c, `/tracing/${encodeURIComponent(c.req.param(\"traceId\"))}`),\n );\n app.get(`${options.path}/tracing/sessions/:sessionId`, (c) =>\n redirectWithQuery(c, `/tracing/sessions/${encodeURIComponent(c.req.param(\"sessionId\"))}`),\n );\n app.get(`${options.path}/sessions`, (c) => redirectWithQuery(c, \"/sessions\"));\n app.get(`${options.path}/agents`, (c) => redirectWithQuery(c, \"/agents\"));\n app.get(`${options.path}/tools`, (c) => redirectWithQuery(c, \"/tools\"));\n app.get(`${options.path}/mcps`, (c) => redirectWithQuery(c, \"/mcps\"));\n app.get(`${options.path}/pipelines`, (c) => redirectWithQuery(c, \"/pipelines\"));\n app.get(`${options.path}/graphs`, (c) => redirectWithQuery(c, \"/graphs\"));\n app.get(`${options.path}/sandboxes`, (c) => redirectWithQuery(c, \"/sandboxes\"));\n app.get(`${options.path}/sandboxes/:sandboxRef`, (c) =>\n redirectWithQuery(c, `/sandboxes/${encodeURIComponent(c.req.param(\"sandboxRef\"))}`),\n );\n app.get(`${options.path}/memory`, (c) => redirectWithQuery(c, \"/memory\"));\n app.get(`${options.path}/status`, (c) => redirectWithQuery(c, \"/status\"));\n app.get(`${options.path}/knowledge`, (c) => redirectWithQuery(c, \"/knowledge\"));\n app.get(`${options.path}/knowledge/:tab`, (c) =>\n redirectWithQuery(c, `/knowledge/${encodeURIComponent(c.req.param(\"tab\"))}`),\n );\n\n if (options.rootRoutes) {\n app.get(\"/playground\", async (c) => c.html(await renderShell()));\n app.get(\"/playground/:sessionId\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing/:traceId\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing/sessions/:sessionId\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing/*\", async (c) => c.html(await renderShell()));\n app.get(\"/sessions\", shellWhenHtml(renderShell));\n app.get(\"/agents\", shellWhenHtml(renderShell));\n app.get(\"/tools\", async (c) => c.html(await renderShell()));\n app.get(\"/mcps\", async (c) => c.html(await renderShell()));\n app.get(\"/pipelines\", shellWhenHtml(renderShell));\n app.get(\"/graphs\", shellWhenHtml(renderShell));\n app.get(\"/sandboxes\", shellWhenHtml(renderShell));\n app.get(\"/sandboxes/:sandboxRef\", shellWhenHtml(renderShell));\n app.get(\"/memory\", async (c) => c.html(await renderShell()));\n app.get(\"/status\", shellWhenHtml(renderShell));\n app.get(\"/knowledge\", shellWhenHtml(renderShell));\n app.get(\"/knowledge/:tab\", shellWhenKnowledgeTab(renderShell));\n app.get(\"/knowledge/*\", shellWhenHtml(renderShell));\n }\n\n app.get(scriptPath, async () => {\n if (options.clientScript === undefined) {\n return new Response(null, { status: 404 });\n }\n return new Response(options.clientScript, {\n headers: {\n \"content-type\": \"text/javascript; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n },\n });\n });\n\n app.get(stylePath, async () => {\n const source = await readBundledLegacyStylesheet();\n return new Response(source, {\n headers: {\n \"content-type\": \"text/css; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n },\n });\n });\n\n app.get(`${options.path}/assets/:asset`, async (c) => {\n const asset = c.req.param(\"asset\");\n if (asset.includes(\"/\") || asset.includes(\"..\")) {\n return new Response(null, { status: 404 });\n }\n const source = await readBundledUiAsset(asset);\n if (source === undefined) {\n return new Response(null, { status: 404 });\n }\n const body = new ArrayBuffer(source.byteLength);\n new Uint8Array(body).set(source);\n return new Response(body, {\n headers: {\n \"content-type\": contentTypeForAsset(asset),\n \"cache-control\": \"no-cache\",\n },\n });\n });\n}\n\nfunction shellWhenHtml(renderShell: () => Promise<string>) {\n return async (c: Context, next: Next) => {\n const accept = c.req.header(\"accept\") ?? \"\";\n if (!accept.includes(\"text/html\")) {\n return next();\n }\n return c.html(await renderShell());\n };\n}\n\nfunction shellWhenKnowledgeTab(renderShell: () => Promise<string>) {\n return async (c: Context, next: Next) => {\n if (!isKnowledgeTabRoute(c.req.param(\"tab\"))) {\n return next();\n }\n return c.html(await renderShell());\n };\n}\n\nfunction isKnowledgeTabRoute(tab: string | undefined): boolean {\n return (\n tab === \"static-context\" ||\n tab === \"dynamic-context\" ||\n tab === \"dynamic-tools\" ||\n tab === \"retrieval-log\"\n );\n}\n\nasync function renderStudioUi(props: {\n options: ResolvedStudioUiOptions;\n routePath: string;\n clientScript: string;\n stylesheet: string;\n}): Promise<string> {\n const { options } = props;\n if (options.clientScript !== undefined) {\n return renderLegacyStudioUiShell({\n title: options.title,\n uiPath: props.routePath,\n compatUiPath: options.path,\n clientScript: props.clientScript,\n stylesheet: props.stylesheet,\n });\n }\n const index = await readBundledUiIndex();\n return index\n .replace(/<title>.*?<\\/title>/, `<title>${escapeHtml(options.title)}</title>`)\n .replace(\n 'data-ui-path=\"/ui\"',\n `data-ui-path=\"${escapeHtml(props.routePath)}\" data-ui-compat-path=\"${escapeHtml(options.path)}\"`,\n )\n .replaceAll('\"/ui/', `\"${escapeHtml(options.path)}/`);\n}\n\nfunction renderLegacyStudioUiShell(props: {\n title: string;\n uiPath: string;\n compatUiPath: string;\n clientScript: string;\n stylesheet: string;\n}): string {\n const title = escapeHtml(props.title);\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n `<title>${title}</title>`,\n '<meta name=\"theme-color\" content=\"#09090b\">',\n `<link data-anvia-favicon rel=\"icon\" type=\"image/svg+xml\" href=\"${escapeHtml(props.compatUiPath)}/assets/favicon-dark.svg\">`,\n '<script>(()=>{let m=\"dark\";try{const t=localStorage.getItem(\"anvia-theme\");const l=localStorage.getItem(\"anvia-studio-theme\");if(t===\"light\"||(t!==\"dark\"&&l===\"light\"))m=\"light\"}catch{}const r=document.documentElement;r.classList.toggle(\"dark\",m===\"dark\");r.dataset.theme=m;r.style.colorScheme=m;document.querySelector(\\'meta[name=\"theme-color\"]\\')?.setAttribute(\"content\",m===\"dark\"?\"#09090b\":\"#f4f4f5\");const f=document.querySelector(\"link[data-anvia-favicon]\");if(f)f.href=f.href.replace(\"favicon-dark.svg\",`favicon-${m}.svg`)})();</script>',\n `<link rel=\"stylesheet\" href=\"${escapeHtml(props.stylesheet)}\">`,\n \"</head>\",\n \"<body>\",\n `<div id=\"anvia-ui\" data-ui-path=\"${escapeHtml(props.uiPath)}\" data-ui-compat-path=\"${escapeHtml(props.compatUiPath)}\">`,\n '<main class=\"shell-loading\">',\n '<div class=\"studio-logo-lockup\">',\n `<img class=\"studio-logo-image\" src=\"${escapeHtml(props.compatUiPath)}/assets/logo.png\" alt=\"Anvia\" width=\"984\" height=\"206\">`,\n '<span class=\"studio-logo-badge\">Studio</span>',\n \"</div>\",\n \"</main>\",\n \"</div>\",\n `<script type=\"module\" src=\"${escapeHtml(props.clientScript)}\"></script>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\nfunction normalizeUiPath(path: string): string {\n const trimmed = path.trim();\n const withSlash = trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n const withoutTrailingSlash = withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n if (withoutTrailingSlash.length === 0 || withoutTrailingSlash === \"/\") {\n return \"/ui\";\n }\n return withoutTrailingSlash;\n}\n\nexport function studioUiEntryPath(_options: ResolvedStudioUiOptions): string {\n return \"/playground\";\n}\n\nasync function readBundledUiIndex(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/index.html\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/index.html\", import.meta.url)),\n \"utf8\",\n );\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n return readFile(fileURLToPath(new URL(\"./app/index.html\", import.meta.url)), \"utf8\");\n }\n}\n\nasync function readBundledUiAsset(asset: string): Promise<Uint8Array | undefined> {\n try {\n return await readFile(fileURLToPath(new URL(`./assets/${asset}`, import.meta.url)));\n } catch (sourceError) {\n if (!isNotFoundError(sourceError)) {\n throw sourceError;\n }\n }\n try {\n return await readFile(fileURLToPath(new URL(`./ui/assets/${asset}`, import.meta.url)));\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(`../../dist/ui/assets/${asset}`, import.meta.url)),\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return undefined;\n }\n }\n}\n\nasync function readBundledLegacyStylesheet(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/styles.css\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/styles.css\", import.meta.url)),\n \"utf8\",\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return \"\";\n }\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction contentTypeForAsset(asset: string): string {\n if (asset.endsWith(\".js\")) {\n return \"text/javascript; charset=utf-8\";\n }\n if (asset.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (asset.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (asset.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (asset.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n return \"application/octet-stream\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n","import { type Agent, isVectorContext, type VectorContext } from \"@anvia/core/agent\";\nimport type { Document } from \"@anvia/core/completion\";\n\nexport function staticContextDocuments(agent: Agent): Document[] {\n return agent.context.filter((input): input is Document => !isVectorContext(input));\n}\n\nexport function vectorContexts(agent: Agent): VectorContext[] {\n return agent.context.filter(isVectorContext);\n}\n","import type { AgentOutcome, AgentRunSettings, AgentStream } from \"@anvia/core/agent\";\nimport type {\n CompletionModel,\n Message as CoreMessage,\n JsonObject,\n UserMessage,\n} from \"@anvia/core/completion\";\nimport {\n type Agent,\n type InternalAgentRunOptions,\n withInternalAgentRunOptions,\n} from \"@anvia/core/internal/agent\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunResponse,\n AgentRunStreamEvent,\n StudioAgent,\n StudioSession,\n StudioSessionStore,\n} from \"../types\";\nimport { cloneAgent } from \"./agent-utils\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport type { StudioContinuationRegistry } from \"./interactions\";\nimport {\n type createStudioModelRegistry,\n ModelSelectionError,\n resolveStudioModel,\n sessionControlValues,\n STUDIO_CONTROLS_METADATA_KEY,\n STUDIO_MODEL_METADATA_KEY,\n sessionModelRef,\n} from \"./models\";\nimport { rawObservedStore } from \"./observability\";\nimport type { ResolvedStores } from \"./options\";\nimport type { StudioRunLease, StudioRunLifecycle } from \"./run-lifecycle\";\nimport {\n assignTranscriptRunDuration,\n createPersistedStreamingSessionTranscript,\n optionalTitle,\n parseRunRequest,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\n memoryCompactedLog,\n memoryLoadedLog,\n memorySavedLog,\n runCancelledLog,\n runCompletedLog,\n runFailedLog,\n runReceivedLog,\n runStartedLog,\n streamSessionRunLogs,\n} from \"./session-logs\";\n\ntype AgentRunRouteProps = {\n agentMap: Map<string, StudioAgent>;\n stores: ResolvedStores;\n modelRegistry: ReturnType<typeof createStudioModelRegistry>;\n continuationRegistry: StudioContinuationRegistry<PreparedAgentRun>;\n runLifecycle: StudioRunLifecycle;\n};\n\ntype SelectedModel = ReturnType<typeof resolveStudioModel>;\ntype RunExecution = {\n generate(options: AgentRunSettings): Promise<AgentOutcome>;\n stream(options: AgentRunSettings): AgentStream;\n};\n\nexport type PreparedAgentRun = {\n agentId: string;\n agent: StudioAgent;\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n memoryMetadata: JsonObject;\n execution: RunExecution;\n failureMessages: readonly CoreMessage[] | undefined;\n memoryCompactionLogged: boolean;\n options: AgentRunSettings;\n runAgent: Agent;\n runId: string;\n runStartedAt: number;\n generatedMessagesStartIndex: 0 | 1;\n selectedModel: SelectedModel;\n session: StudioSession | undefined;\n sessionStore: StudioSessionStore | undefined;\n shouldPersistSessionMessages: boolean;\n};\n\nexport function registerAgentRunRoute(app: Hono, props: AgentRunRouteProps): void {\n app.post(\"/agents/:agentId/runs\", (c) => handleAgentRun(c, props));\n}\n\nasync function handleAgentRun(c: Context, props: AgentRunRouteProps): Promise<Response> {\n const lease = props.runLifecycle.start(c.req.raw.signal);\n if (lease === undefined) {\n return errorResponse(c, 503, \"service_unavailable\", \"Anvia Studio is shutting down\");\n }\n\n try {\n const prepared = await prepareAgentRun(c, props, lease.abortSignal);\n if (prepared instanceof Response) {\n lease.finish();\n return prepared;\n }\n\n if (prepared.body.stream === true) {\n return handleStreamingAgentRun(c, prepared, props, lease);\n }\n try {\n return await handleBufferedAgentRun(c, prepared, props);\n } finally {\n lease.finish();\n }\n } catch (error) {\n lease.finish();\n throw error;\n }\n}\n\nasync function prepareAgentRun(\n c: Context,\n props: AgentRunRouteProps,\n abortSignal: AbortSignal,\n): Promise<PreparedAgentRun | Response> {\n const agentId = c.req.param(\"agentId\") as string;\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const body = await parseRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n if (body.type === \"interaction_response\") {\n const registration = props.continuationRegistry.take(\n body.interactionId,\n agentId,\n body.response,\n );\n if (registration.status === \"missing\") {\n return errorResponse(c, 404, \"not_found\", \"Interaction continuation is unavailable\");\n }\n if (registration.status === \"claimed\") {\n return errorResponse(c, 409, \"conflict\", \"Interaction response was already claimed\");\n }\n if (registration.status === \"invalid\") {\n return errorResponse(c, 400, \"bad_request\", registration.error.message);\n }\n const { registration: claimed } = registration;\n const source = claimed.context;\n const runId = globalThis.crypto.randomUUID();\n let resumedBody: PreparedAgentRun[\"body\"] = {\n ...source.body,\n };\n if (body.stream !== undefined) resumedBody = { ...resumedBody, stream: body.stream };\n if (body.metadata !== undefined) resumedBody = { ...resumedBody, metadata: body.metadata };\n if (body.trace !== undefined) resumedBody = { ...resumedBody, trace: body.trace };\n const runOptions = createRunOptions(resumedBody, agentId, source.session, abortSignal);\n const execution: RunExecution = {\n generate: (options) =>\n source.runAgent.generate({\n continuation: claimed.continuation,\n response: body.response,\n ...options,\n }),\n stream: (options) =>\n source.runAgent.stream({\n continuation: claimed.continuation,\n response: body.response,\n ...options,\n }),\n };\n return {\n ...source,\n body: resumedBody,\n execution,\n failureMessages: undefined,\n memoryCompactionLogged: false,\n options: runOptions,\n runId,\n runStartedAt: Date.now(),\n generatedMessagesStartIndex: 0,\n shouldPersistSessionMessages: source.shouldPersistSessionMessages,\n };\n }\n\n const session = await resolveRunSession(c, body, agentId, props.stores);\n if (session instanceof Response) {\n return session;\n }\n\n const persistedControls = sessionControlValues(session?.metadata);\n const runBody =\n body.controls === undefined && persistedControls !== undefined\n ? { ...body, controls: persistedControls }\n : body;\n const selectedModel = selectRunModel(c, props, agent, runBody, session);\n if (selectedModel instanceof Response) {\n return selectedModel;\n }\n const runAgent =\n selectedModel.model === undefined\n ? agent.agent\n : cloneAgent(agent.agent, {\n model: selectedModel.model,\n controls: compatibleAgentControls(agent.agent.controls, selectedModel.model),\n });\n const runId = globalThis.crypto.randomUUID();\n const runStartedAt = Date.now();\n\n await recordRunReceived({\n agentId,\n body: runBody,\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n await recordSelectedModelWarnings({\n body: runBody,\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n\n const memoryMetadata = runMemoryMetadata(agentId, runBody, selectedModel, runId);\n const promptMessage = runBody.messages.at(-1) as UserMessage;\n const sessionStore = props.stores.sessions;\n const shouldPersistSessionMessages =\n session !== undefined &&\n sessionStore !== undefined &&\n !usesStoreAsAgentMemory(runAgent, sessionStore);\n if (shouldPersistSessionMessages) {\n await sessionStore.append({\n scope: { sessionId: session.id, metadata: memoryMetadata },\n runId,\n turn: 1,\n messages: [promptMessage],\n });\n }\n\n const execution = createRunExecution({\n agentId,\n body: runBody,\n memoryMetadata,\n promptMessage,\n runAgent,\n session,\n });\n\n return {\n agentId,\n agent,\n body: runBody,\n memoryMetadata,\n execution,\n failureMessages: undefined,\n memoryCompactionLogged: false,\n options: createRunOptions(runBody, agentId, session, abortSignal),\n runAgent,\n runId,\n runStartedAt,\n generatedMessagesStartIndex: 1,\n selectedModel,\n session,\n sessionStore,\n shouldPersistSessionMessages,\n };\n}\n\nfunction compatibleAgentControls(\n controls: Readonly<Record<string, string | undefined>> | undefined,\n model: CompletionModel,\n): Readonly<Record<string, string>> | undefined {\n const modelControls = model.controls;\n const compatible = Object.fromEntries(\n Object.entries(controls ?? {}).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\" &&\n modelControls !== undefined &&\n Object.hasOwn(modelControls, entry[0]) &&\n modelControls[entry[0]]?.options.includes(entry[1]) === true,\n ),\n );\n return Object.keys(compatible).length === 0 ? undefined : compatible;\n}\n\nasync function resolveRunSession(\n c: Context,\n body: Extract<AgentRunRequest, { type: \"messages\" }>,\n agentId: string,\n stores: ResolvedStores,\n): Promise<StudioSession | undefined | Response> {\n if (body.sessionId !== undefined && stores.sessions === undefined) {\n return unsupportedCapability(c, \"sessions\");\n }\n\n const session =\n body.sessionId === undefined ? undefined : await stores.sessions?.getSession(body.sessionId);\n if (body.sessionId !== undefined && session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n if (session !== undefined && session.agentId !== agentId) {\n return errorResponse(c, 400, \"bad_request\", \"Session belongs to another agent\");\n }\n return session;\n}\n\nfunction selectRunModel(\n c: Context,\n props: AgentRunRouteProps,\n agent: StudioAgent,\n body: Extract<AgentRunRequest, { type: \"messages\" }>,\n session: StudioSession | undefined,\n): SelectedModel | Response {\n try {\n return resolveStudioModel(props.modelRegistry, {\n agent,\n request: body,\n sessionMetadata: session?.metadata,\n });\n } catch (error) {\n if (error instanceof ModelSelectionError) {\n return errorResponse(c, 400, \"bad_request\", error.message);\n }\n throw error;\n }\n}\n\nasync function recordRunReceived(props: {\n agentId: string;\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n runId: string;\n selectedModel: SelectedModel;\n session: StudioSession | undefined;\n store: StudioSessionStore | undefined;\n}): Promise<void> {\n if (props.session === undefined) {\n return;\n }\n\n const input: Parameters<typeof runReceivedLog>[0] = {\n sessionId: props.session.id,\n runId: props.runId,\n agentId: props.agentId,\n message: props.body.messages.at(-1) as UserMessage,\n stream: props.body.stream === true,\n hasTrace: props.body.trace !== undefined,\n };\n if (props.body.maxTurns !== undefined) input.maxTurns = props.body.maxTurns;\n if (props.body.toolConcurrency !== undefined) {\n input.toolConcurrency = props.body.toolConcurrency;\n }\n if (\n props.body.metadata !== undefined ||\n props.selectedModel.ref !== undefined ||\n props.body.controls !== undefined\n ) {\n const metadata: JsonObject = {};\n Object.assign(metadata, props.body.metadata);\n if (props.selectedModel.ref !== undefined) {\n metadata[STUDIO_MODEL_METADATA_KEY] = props.selectedModel.ref;\n }\n if (props.body.controls !== undefined) {\n metadata[STUDIO_CONTROLS_METADATA_KEY] = props.body.controls;\n }\n input.metadata = metadata;\n }\n await appendSessionLog(props.store, runReceivedLog(input));\n}\n\nasync function recordSelectedModelWarnings(props: {\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n runId: string;\n selectedModel: SelectedModel;\n session: StudioSession | undefined;\n store: StudioSessionStore | undefined;\n}): Promise<void> {\n if (props.session === undefined || props.selectedModel.ref === undefined) {\n return;\n }\n\n for (const warning of props.selectedModel.warnings) {\n await appendSessionLog(props.store, {\n sessionId: props.session.id,\n runId: props.runId,\n level: \"warn\",\n category: \"model\",\n event: \"model.warning\",\n message: typeof warning.message === \"string\" ? warning.message : \"Model warning\",\n metadata: warning,\n });\n }\n if (\n sessionModelRef(props.session.metadata) !== props.selectedModel.ref ||\n props.body.controls !== undefined\n ) {\n const metadata: JsonObject = {};\n Object.assign(metadata, props.session.metadata);\n metadata[STUDIO_MODEL_METADATA_KEY] = props.selectedModel.ref;\n if (props.body.controls !== undefined) {\n metadata[STUDIO_CONTROLS_METADATA_KEY] = props.body.controls;\n }\n await props.store?.updateSessionMetadata?.(props.session.id, metadata);\n }\n}\n\nfunction runMemoryMetadata(\n agentId: string,\n body: Extract<AgentRunRequest, { type: \"messages\" }>,\n selectedModel: SelectedModel,\n runId: string,\n): JsonObject {\n const metadata: JsonObject = { agentId };\n Object.assign(metadata, body.metadata);\n if (selectedModel.ref !== undefined) metadata[STUDIO_MODEL_METADATA_KEY] = selectedModel.ref;\n if (body.controls !== undefined) metadata[STUDIO_CONTROLS_METADATA_KEY] = body.controls;\n metadata.studioRunId = runId;\n return metadata;\n}\n\nfunction createRunExecution(props: {\n agentId: string;\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n memoryMetadata: JsonObject;\n promptMessage: UserMessage;\n runAgent: Agent;\n session: StudioSession | undefined;\n}): RunExecution {\n const session = props.session;\n if (session !== undefined && props.runAgent.memory !== undefined) {\n return {\n generate: (options) =>\n props.runAgent.generate({\n prompt: props.promptMessage,\n session: { sessionId: session.id, metadata: props.memoryMetadata },\n ...options,\n }),\n stream: (options) =>\n props.runAgent.stream({\n prompt: props.promptMessage,\n session: { sessionId: session.id, metadata: props.memoryMetadata },\n ...options,\n }),\n };\n }\n\n const transcript =\n session !== undefined ? [...session.messages, props.promptMessage] : props.body.messages;\n return {\n generate: (options) => props.runAgent.generate({ messages: transcript, ...options }),\n stream: (options) => props.runAgent.stream({ messages: transcript, ...options }),\n };\n}\n\nfunction createRunOptions(\n body: AgentRunRequest,\n agentId: string,\n session: StudioSession | undefined,\n abortSignal: AbortSignal,\n): AgentRunSettings {\n const options: AgentRunSettings = { abortSignal };\n if (body.type === \"messages\" && body.maxTurns !== undefined) options.maxTurns = body.maxTurns;\n if (body.type === \"messages\" && body.toolConcurrency !== undefined) {\n options.toolConcurrency = body.toolConcurrency;\n }\n if (body.type === \"messages\" && body.controls !== undefined) options.controls = body.controls;\n if (body.trace !== undefined) {\n options.trace = traceForRun(body.trace, agentId, session);\n } else if (session !== undefined) {\n options.trace = traceForRun(undefined, agentId, session);\n }\n return options;\n}\n\nfunction handleStreamingAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n lease: StudioRunLease,\n): Response {\n const streamOptions = withInternalAgentRunOptions({ ...run.options }, { runId: run.runId });\n const runStream = registerStreamingContinuation(\n run.execution.stream(streamOptions),\n props.continuationRegistry,\n run,\n );\n let stream: AsyncIterable<AgentRunStreamEvent> = runStream;\n let persistedRun: ReturnType<typeof createPersistedStreamingSessionTranscript> | undefined;\n if (run.session !== undefined && run.sessionStore !== undefined) {\n persistedRun = createPersistedStreamingSessionTranscript({\n stream: streamSessionRunLogs({\n stream: runStream,\n store: run.sessionStore,\n session: run.session,\n runId: run.runId,\n startedAt: run.runStartedAt,\n }),\n store: run.sessionStore,\n session: run.session,\n message: run.body.messages.at(-1) as UserMessage,\n runId: run.runId,\n startedAt: run.runStartedAt,\n persistGeneratedMessages: run.shouldPersistSessionMessages,\n generatedMessagesStartIndex: run.generatedMessagesStartIndex,\n });\n stream = persistedRun.events;\n }\n\n return streamAgentRunEvents(c, finishRunLease(stream, lease), {\n runId: run.runId,\n onCancel: async () => {\n const persistence: Promise<unknown>[] = [];\n if (persistedRun !== undefined) {\n persistence.push(persistedRun.cancel());\n }\n if (run.session !== undefined && run.sessionStore !== undefined) {\n persistence.push(\n appendSessionLog(\n run.sessionStore,\n runCancelledLog(run.session.id, run.runId, run.runStartedAt),\n ),\n );\n }\n await Promise.all(persistence);\n },\n });\n}\n\nasync function* finishRunLease(\n events: AsyncIterable<AgentRunStreamEvent>,\n lease: StudioRunLease,\n): AsyncIterable<AgentRunStreamEvent> {\n try {\n yield* events;\n } finally {\n lease.finish();\n }\n}\n\nasync function handleBufferedAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Promise<Response> {\n try {\n const runtimeOptions = await startBufferedSessionRun(run);\n const result = await run.execution.generate(runtimeOptions);\n if (result.type === \"interaction\") {\n props.continuationRegistry.register({ continuation: result.continuation, context: run });\n }\n await completeBufferedSessionRun(run, result);\n return c.json(agentRunResponse(result));\n } catch (error) {\n await failBufferedSessionRun(run, error);\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n}\n\nfunction agentRunResponse(result: AgentOutcome): AgentRunResponse {\n if (result.type !== \"interaction\") return result;\n const { continuation: _continuation, messages: _messages, ...response } = result;\n return response;\n}\n\nasync function startBufferedSessionRun(run: PreparedAgentRun): Promise<AgentRunSettings> {\n if (run.session !== undefined) {\n await appendSessionLog(run.sessionStore, runStartedLog(run.session, run.runId));\n await appendSessionLog(run.sessionStore, memoryLoadedLog(run.session, run.runId));\n }\n const internalOptions: InternalAgentRunOptions = {\n onFailure: ({ messages }) => {\n run.failureMessages = structuredClone(messages);\n },\n runId: run.runId,\n };\n if (run.session !== undefined && run.sessionStore !== undefined) {\n const sessionId = run.session.id;\n const sessionStore = run.sessionStore;\n internalOptions.onMemoryCompaction = async (compaction) => {\n await appendSessionLog(\n sessionStore,\n memoryCompactedLog({\n sessionId,\n runId: run.runId,\n ...compaction,\n }),\n );\n run.memoryCompactionLogged = true;\n };\n }\n return withInternalAgentRunOptions({ ...run.options }, internalOptions);\n}\n\nasync function* registerStreamingContinuation(\n stream: AgentStream,\n registry: StudioContinuationRegistry<PreparedAgentRun>,\n run: PreparedAgentRun,\n): AsyncIterable<AgentRunStreamEvent> {\n for await (const event of stream) {\n if (event.type === \"interaction\") {\n registry.register({ continuation: event.continuation, context: run });\n }\n yield event;\n }\n}\n\nasync function completeBufferedSessionRun(\n run: PreparedAgentRun,\n response: AgentOutcome,\n): Promise<void> {\n if (run.session === undefined || run.sessionStore === undefined) {\n return;\n }\n if (run.shouldPersistSessionMessages) {\n const generatedMessages = response.messages.slice(run.generatedMessagesStartIndex);\n if (generatedMessages.length > 0) {\n await run.sessionStore.append({\n scope: { sessionId: run.session.id, metadata: run.memoryMetadata },\n runId: run.runId,\n turn: 1,\n messages: generatedMessages,\n });\n }\n }\n const durationMs = Date.now() - run.runStartedAt;\n const transcript = transcriptFromMessages(response.messages);\n assignTranscriptRunDuration(transcript, durationMs);\n await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.messages.at(-1) as UserMessage),\n transcript,\n status: response.type === \"interaction\" ? \"suspended\" : \"success\",\n });\n if (response.memoryCompaction !== undefined && !run.memoryCompactionLogged) {\n await appendSessionLog(\n run.sessionStore,\n memoryCompactedLog({\n sessionId: run.session.id,\n runId: run.runId,\n ...response.memoryCompaction,\n }),\n );\n run.memoryCompactionLogged = true;\n }\n await appendSessionLog(\n run.sessionStore,\n response.type === \"interaction\"\n ? {\n sessionId: run.session.id,\n runId: run.runId,\n level: \"info\",\n category: \"run\",\n event: \"run.suspended\",\n message: `Run suspended for ${response.interaction.type}`,\n metadata: {\n interactionId: response.interaction.id,\n interactionType: response.interaction.type,\n toolName: response.interaction.toolName,\n sourceRunId: response.continuation.sourceRunId,\n },\n }\n : runCompletedLog({\n sessionId: run.session.id,\n runId: run.runId,\n durationMs,\n usage: response.usage,\n output: response.text,\n messageCount: response.messages.length,\n }),\n );\n if (response.resumedFrom !== undefined) {\n const responseMessage = response.messages[0];\n const responsePart = responseMessage?.role === \"tool\" ? responseMessage.content[0] : undefined;\n if (responsePart !== undefined && responsePart.type !== \"tool-result\") {\n const metadata: JsonObject = {\n interactionId: responsePart.interactionId,\n interactionType:\n responsePart.type === \"tool-approval-response\" ? \"tool-approval\" : \"tool-question\",\n toolName: responsePart.toolName,\n sourceRunId: response.resumedFrom.runId,\n };\n if (responsePart.type === \"tool-approval-response\") {\n metadata.approved = responsePart.approved;\n metadata.hasReason = responsePart.reason !== undefined;\n } else {\n metadata.answerCount = responsePart.answers.length;\n }\n await appendSessionLog(run.sessionStore, {\n sessionId: run.session.id,\n runId: run.runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.responded\",\n message: `Interaction response received for ${responsePart.toolName}`,\n metadata,\n });\n }\n await appendSessionLog(run.sessionStore, {\n sessionId: run.session.id,\n runId: run.runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.resumed\",\n message: \"Interaction resumed in a linked run\",\n metadata: {\n interactionId: response.resumedFrom.interactionId,\n sourceRunId: response.resumedFrom.runId,\n resumedRunId: response.runId,\n },\n });\n }\n await appendSessionLog(\n run.sessionStore,\n memorySavedLog({\n sessionId: run.session.id,\n runId: run.runId,\n messageCount: response.messages.length,\n }),\n );\n}\n\nasync function failBufferedSessionRun(run: PreparedAgentRun, error: unknown): Promise<void> {\n if (run.session === undefined || run.sessionStore === undefined) {\n return;\n }\n\n const durationMs = Date.now() - run.runStartedAt;\n const messages = run.failureMessages ?? [run.body.messages.at(-1) as UserMessage];\n const transcript = transcriptFromMessages([...messages]);\n assignTranscriptRunDuration(transcript, durationMs);\n await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.messages.at(-1) as UserMessage),\n transcript,\n status: \"error\",\n error: serializeError(error),\n });\n await appendSessionLog(\n run.sessionStore,\n runFailedLog(run.session.id, run.runId, error, run.runStartedAt),\n );\n}\n\nfunction usesStoreAsAgentMemory(agent: Agent, store: StudioSessionStore): boolean {\n const memoryStore = agent.memory?.store;\n return memoryStore !== undefined && rawObservedStore(memoryStore) === rawObservedStore(store);\n}\n","import {\n type Agent,\n createResolvedAgent,\n getResolvedAgentOptions,\n type ResolvedAgentOptions,\n} from \"@anvia/core/internal/agent\";\n\nexport function cloneAgent(agent: Agent, overrides: Partial<ResolvedAgentOptions> = {}): Agent {\n return createResolvedAgent({\n ...getResolvedAgentOptions(agent),\n ...overrides,\n });\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { serializeUnknown } from \"./json\";\n\nexport function serializeError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n return serializeUnknown(error);\n}\n","import {\n isJsonValue as isCoreJsonValue,\n isMessage,\n type JsonObject,\n type JsonValue,\n} from \"@anvia/core/completion\";\nimport type { AgentTraceOptions } from \"../types\";\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return isObject(value) && isCoreJsonValue(value);\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n return isCoreJsonValue(value);\n}\n\nexport { isMessage };\n\nexport function isAgentTraceOptions(value: unknown): value is AgentTraceOptions {\n if (!isObject(value)) {\n return false;\n }\n if (\n !Object.keys(value).every((key) =>\n [\"name\", \"userId\", \"sessionId\", \"metadata\", \"tags\", \"version\", \"traceId\"].includes(key),\n )\n ) {\n return false;\n }\n return (\n optionalString(value.name) &&\n optionalString(value.userId) &&\n optionalString(value.sessionId) &&\n optionalString(value.version) &&\n optionalString(value.traceId) &&\n optionalStringArray(value.tags) &&\n (value.metadata === undefined || isJsonObject(value.metadata))\n );\n}\n\nexport function isNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === \"number\" && value >= 0;\n}\n\nexport function isPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === \"number\" && value > 0;\n}\n\nfunction optionalString(value: unknown): boolean {\n return value === undefined || typeof value === \"string\";\n}\n\nfunction optionalStringArray(value: unknown): boolean {\n return (\n value === undefined || (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { Context } from \"hono\";\nimport type { StudioCapability, StudioErrorCode, StudioErrorResponse } from \"../types\";\nimport { isObject } from \"./type-guards\";\n\nexport function errorResponse(\n c: Context,\n status: 400 | 403 | 404 | 409 | 413 | 500 | 501 | 502 | 503,\n code: StudioErrorCode,\n message: string,\n details?: JsonValue,\n): Response {\n const body: StudioErrorResponse = {\n error: {\n code,\n message,\n },\n };\n if (details !== undefined) {\n body.error.details = details;\n }\n return c.json(body, status);\n}\n\nexport function unsupportedCapability(c: Context, capability: StudioCapability): Response {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n `Capability \"${capability}\" is not implemented by this runner`,\n { capability },\n );\n}\n\n/**\n * Parse and validate a JSON request body.\n *\n * Returns the validated result from `validate`, or an error response\n * if the body is not valid JSON or fails validation.\n */\nexport async function parseJsonBody<T>(\n c: Context,\n validate: (body: unknown) => T | { error: Response },\n): Promise<T | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n return validate(body);\n}\n","import {\n assertCompletionControlsSupported,\n CompletionCapabilityError,\n type CompletionModel,\n type JsonObject,\n type Message,\n} from \"@anvia/core/completion\";\nimport type { Hono } from \"hono\";\nimport type {\n AgentRunRequest,\n StudioAgent,\n StudioAgentModelPolicy,\n StudioAgentModelPolicyConfig,\n StudioAgentModelsSummary,\n StudioModelConfig,\n StudioModelDefinition,\n StudioModelModality,\n StudioModelProvider,\n StudioModelProviderConfig,\n StudioModelRef,\n StudioModelSummary,\n StudioModelsConfig,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\n\nexport const STUDIO_MODEL_METADATA_KEY = \"studioModel\";\nexport const STUDIO_CONTROLS_METADATA_KEY = \"studioControls\";\n\ntype RuntimeProvider = StudioModelProvider & {\n staticModels: Map<string, StudioModelDefinition>;\n};\n\nexport type StudioModelRegistry = {\n readonly defaultModelRef?: string;\n readonly providers: Map<string, RuntimeProvider>;\n readonly agentPolicies: Map<string, NormalizedAgentModelPolicy>;\n readonly modelCache: Map<string, CompletionModel>;\n};\n\ntype NormalizedAgentModelPolicy = {\n defaultModelRef?: string;\n allowed?: string[];\n};\n\ntype ResolveModelInput = {\n agent: StudioAgent;\n request: AgentRunRequest;\n sessionMetadata?: JsonObject | undefined;\n};\n\nexport type StudioResolvedModel = {\n ref?: string;\n model?: CompletionModel;\n warnings: JsonObject[];\n};\n\nexport function createStudioModelRegistry(\n config: StudioModelConfig | undefined,\n): StudioModelRegistry | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n const providers = new Map<string, RuntimeProvider>();\n for (const provider of config.providers) {\n const id = normalizeProviderId(provider.id);\n if (providers.has(id)) {\n throw new Error(`Duplicate Studio model provider id: ${id}`);\n }\n const staticModels = new Map<string, StudioModelDefinition>();\n for (const model of provider.models ?? []) {\n const modelId = normalizeModelId(model.id);\n if (staticModels.has(modelId)) {\n throw new Error(`Duplicate Studio model id for provider ${id}: ${modelId}`);\n }\n staticModels.set(modelId, { ...model, id: modelId });\n }\n const runtimeProvider: RuntimeProvider = {\n ...provider,\n id,\n staticModels,\n };\n if (provider.defaultModelId !== undefined) {\n runtimeProvider.defaultModelId = normalizeModelId(provider.defaultModelId);\n }\n providers.set(id, runtimeProvider);\n }\n\n const registry: StudioModelRegistry = {\n providers,\n agentPolicies: normalizeAgentPolicies(config.agents ?? {}),\n modelCache: new Map(),\n };\n if (config.defaultModelRef !== undefined) {\n Object.assign(registry, {\n defaultModelRef: normalizeModelRef(config.defaultModelRef),\n });\n }\n return registry;\n}\n\nexport function studioModelsConfig(\n registry: StudioModelRegistry | undefined,\n agents: StudioAgent[],\n): StudioModelsConfig | undefined {\n if (registry === undefined) {\n return undefined;\n }\n\n const providers = [...registry.providers.values()].map((provider): StudioModelProviderConfig => {\n const models = [...provider.staticModels.values()].map((model) =>\n staticModelSummary(provider, model.id, model),\n );\n const config: StudioModelProviderConfig = {\n id: provider.id,\n models,\n };\n if (provider.name !== undefined) config.name = provider.name;\n if (provider.defaultModelId !== undefined) config.defaultModelId = provider.defaultModelId;\n if (provider.metadata !== undefined) config.metadata = provider.metadata;\n return config;\n });\n\n const agentIds = new Set(agents.map((agent) => agent.id));\n const agentsConfig = Object.fromEntries(\n [...registry.agentPolicies.entries()]\n .filter(([agentId]) => agentIds.has(agentId))\n .map(([agentId, policy]) => [agentId, publicPolicy(policy)]),\n );\n\n const config: StudioModelsConfig = {\n providers,\n agents: agentsConfig,\n };\n if (registry.defaultModelRef !== undefined) config.defaultModelRef = registry.defaultModelRef;\n return config;\n}\n\nexport function registerModelRoutes(\n app: Hono,\n props: { registry?: StudioModelRegistry | undefined; agentMap: Map<string, StudioAgent> },\n): void {\n app.get(\"/models\", async (c) => {\n const registry = props.registry;\n if (registry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model registry not configured\");\n }\n const providers = await Promise.all(\n [...registry.providers.values()].map((provider) => providerCatalog(registry, provider)),\n );\n const response: { providers: StudioModelProviderConfig[]; defaultModelRef?: string } = {\n providers,\n };\n if (registry.defaultModelRef !== undefined) {\n response.defaultModelRef = registry.defaultModelRef;\n }\n return c.json(response);\n });\n\n app.get(\"/models/:providerId\", async (c) => {\n if (props.registry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model registry not configured\");\n }\n const provider = props.registry.providers.get(c.req.param(\"providerId\"));\n if (provider === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model provider not found\");\n }\n return c.json(await providerCatalog(props.registry, provider));\n });\n\n app.get(\"/agents/:agentId/models\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n if (props.registry === undefined) {\n return c.json({\n agentId,\n models: [],\n } satisfies StudioAgentModelsSummary);\n }\n return c.json(await agentModelsCatalog(props.registry, agent));\n });\n}\n\nexport function resolveStudioModel(\n registry: StudioModelRegistry | undefined,\n input: ResolveModelInput,\n): StudioResolvedModel {\n if (registry === undefined) {\n return { warnings: [] };\n }\n\n const selectedRef =\n normalizeOptionalModelRef(input.request.model) ??\n sessionModelRef(input.sessionMetadata) ??\n registry.agentPolicies.get(input.agent.id)?.defaultModelRef ??\n registry.defaultModelRef;\n if (selectedRef === undefined) {\n return { warnings: [] };\n }\n\n ensureModelAllowed(registry, input.agent.id, selectedRef);\n const { providerId, modelId } = parseModelRef(selectedRef);\n const provider = registry.providers.get(providerId);\n if (provider === undefined) {\n throw new ModelSelectionError(`Unknown model provider: ${providerId}`);\n }\n\n let model = registry.modelCache.get(selectedRef);\n if (model === undefined) {\n model = provider.createCompletionModel({ modelId });\n registry.modelCache.set(selectedRef, model);\n }\n\n try {\n assertCompletionControlsSupported(model, input.request.controls);\n } catch (error) {\n if (error instanceof CompletionCapabilityError) {\n throw new ModelSelectionError(error.message);\n }\n throw error;\n }\n\n const metadata = provider.staticModels.get(modelId);\n return {\n ref: selectedRef,\n model,\n warnings: modelWarnings(selectedRef, metadata, input.request),\n };\n}\n\nexport function sessionModelRef(metadata: JsonObject | undefined): string | undefined {\n const value = metadata?.[STUDIO_MODEL_METADATA_KEY];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport function sessionControlValues(\n metadata: JsonObject | undefined,\n): Readonly<Record<string, string>> | undefined {\n const value = metadata?.[STUDIO_CONTROLS_METADATA_KEY];\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const controls = Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n return Object.freeze(controls);\n}\n\nexport function normalizeOptionalModelRef(ref: StudioModelRef | undefined): string | undefined {\n return ref === undefined ? undefined : normalizeModelRef(ref);\n}\n\nexport function normalizeModelRef(ref: StudioModelRef): string {\n return `${normalizeProviderId(ref.providerId)}:${normalizeModelId(ref.modelId)}`;\n}\n\nexport function parseModelRef(ref: string): { providerId: string; modelId: string } {\n const index = ref.indexOf(\":\");\n if (index <= 0 || index === ref.length - 1) {\n throw new ModelSelectionError(`Model ref must use provider:model format: ${ref}`);\n }\n return {\n providerId: normalizeProviderId(ref.slice(0, index)),\n modelId: normalizeModelId(ref.slice(index + 1)),\n };\n}\n\nexport class ModelSelectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelSelectionError\";\n }\n}\n\nasync function agentModelsCatalog(\n registry: StudioModelRegistry,\n agent: StudioAgent,\n): Promise<StudioAgentModelsSummary> {\n const policy = registry.agentPolicies.get(agent.id);\n const catalogs = await Promise.all(\n [...registry.providers.values()].map((provider) => providerCatalog(registry, provider)),\n );\n const warnings = catalogs.flatMap((catalog) =>\n catalog.warning === undefined\n ? []\n : [{ providerId: catalog.id, warning: catalog.warning } satisfies JsonObject],\n );\n const models = catalogs\n .flatMap((catalog) => catalog.models)\n .filter((model) => {\n if (policy?.allowed === undefined) {\n return true;\n }\n return allowedByPolicy(policy.allowed, model.ref);\n });\n const exactPolicyModels = (policy?.allowed ?? [])\n .filter((allowed) => !allowed.endsWith(\":*\"))\n .filter((allowed) => models.every((model) => model.ref !== allowed))\n .flatMap((ref) => {\n try {\n const { providerId, modelId } = parseModelRef(ref);\n const provider = registry.providers.get(providerId);\n return provider === undefined\n ? []\n : [\n modelSummary(registry, provider, modelId, {\n id: modelId,\n }),\n ];\n } catch {\n return [];\n }\n });\n\n const defaultModelRef = policy?.defaultModelRef ?? registry.defaultModelRef;\n const summary: StudioAgentModelsSummary = {\n agentId: agent.id,\n models: [...models, ...exactPolicyModels].map((model) =>\n withAgentControlDefaults(model, agent.agent.controls),\n ),\n };\n if (defaultModelRef !== undefined) summary.defaultModelRef = defaultModelRef;\n if (warnings.length > 0) summary.warnings = warnings;\n return summary;\n}\n\nfunction withAgentControlDefaults(\n model: StudioModelSummary,\n defaults: Readonly<Record<string, string | undefined>> | undefined,\n): StudioModelSummary {\n if (model.controls === undefined || defaults === undefined) return model;\n let changed = false;\n const controls = Object.fromEntries(\n Object.entries(model.controls).map(([id, control]) => {\n const defaultValue = defaults[id];\n if (\n typeof defaultValue !== \"string\" ||\n !control.options.includes(defaultValue) ||\n control.defaultValue === defaultValue\n ) {\n return [id, control];\n }\n changed = true;\n return [id, { ...control, defaultValue }];\n }),\n );\n return changed ? { ...model, controls } : model;\n}\n\nasync function providerCatalog(\n registry: StudioModelRegistry,\n provider: RuntimeProvider,\n): Promise<StudioModelProviderConfig> {\n const models = new Map<string, StudioModelSummary>();\n for (const model of provider.staticModels.values()) {\n models.set(model.id, modelSummary(registry, provider, model.id, model));\n }\n\n let warning: string | undefined;\n if (provider.listModels !== undefined) {\n try {\n const listed = await provider.listModels();\n for (const model of listed.data) {\n const staticModel = provider.staticModels.get(model.id);\n const definition: StudioModelDefinition = { id: model.id };\n if (model.name !== undefined) definition.name = model.name;\n if (model.description !== undefined) definition.description = model.description;\n Object.assign(definition, staticModel);\n const metadata: JsonObject = {};\n if (model.type !== undefined) metadata.type = model.type;\n if (model.createdAt !== undefined) metadata.createdAt = model.createdAt;\n if (model.ownedBy !== undefined) metadata.ownedBy = model.ownedBy;\n if (model.contextLength !== undefined) metadata.contextLength = model.contextLength;\n Object.assign(metadata, staticModel?.metadata);\n definition.metadata = metadata;\n models.set(model.id, modelSummary(registry, provider, model.id, definition));\n }\n } catch (error) {\n const serialized = serializeError(error);\n warning =\n typeof serialized === \"object\" && serialized !== null && \"message\" in serialized\n ? String(serialized.message)\n : String(error);\n }\n }\n\n const catalog: StudioModelProviderConfig = {\n id: provider.id,\n models: [...models.values()].sort((left, right) => left.ref.localeCompare(right.ref)),\n };\n if (provider.name !== undefined) catalog.name = provider.name;\n if (provider.defaultModelId !== undefined) catalog.defaultModelId = provider.defaultModelId;\n if (provider.metadata !== undefined) catalog.metadata = provider.metadata;\n if (warning !== undefined) catalog.warning = warning;\n return catalog;\n}\n\nfunction modelSummary(\n registry: StudioModelRegistry,\n provider: RuntimeProvider,\n modelId: string,\n model: StudioModelDefinition,\n): StudioModelSummary {\n const summary = staticModelSummary(provider, modelId, model);\n const controls = completionModelFor(registry, provider, modelId).controls;\n if (controls !== undefined) summary.controls = controls;\n return summary;\n}\n\nfunction staticModelSummary(\n provider: RuntimeProvider,\n modelId: string,\n model: StudioModelDefinition,\n): StudioModelSummary {\n const summary: StudioModelSummary = {\n ...model,\n id: modelId,\n ref: `${provider.id}:${modelId}`,\n providerId: provider.id,\n };\n if (provider.name !== undefined) summary.providerName = provider.name;\n return summary;\n}\n\nfunction completionModelFor(\n registry: StudioModelRegistry,\n provider: RuntimeProvider,\n modelId: string,\n): CompletionModel {\n const ref = `${provider.id}:${modelId}`;\n let model = registry.modelCache.get(ref);\n if (model === undefined) {\n model = provider.createCompletionModel({ modelId });\n registry.modelCache.set(ref, model);\n }\n return model;\n}\n\nfunction ensureModelAllowed(registry: StudioModelRegistry, agentId: string, ref: string): void {\n const { providerId } = parseModelRef(ref);\n if (!registry.providers.has(providerId)) {\n throw new ModelSelectionError(`Unknown model provider: ${providerId}`);\n }\n const policy = registry.agentPolicies.get(agentId);\n if (policy?.allowed !== undefined && !allowedByPolicy(policy.allowed, ref)) {\n throw new ModelSelectionError(`Model ${ref} is not allowed for agent ${agentId}`);\n }\n}\n\nfunction allowedByPolicy(allowed: string[], ref: string): boolean {\n return allowed.some((entry) =>\n entry.endsWith(\":*\") ? ref.startsWith(entry.slice(0, -1)) : entry === ref,\n );\n}\n\nfunction normalizeAgentPolicies(\n policies: Record<string, StudioAgentModelPolicy>,\n): Map<string, NormalizedAgentModelPolicy> {\n return new Map(\n Object.entries(policies).map(([agentId, policy]) => {\n const normalized: NormalizedAgentModelPolicy = {};\n if (policy.defaultModelRef !== undefined) {\n normalized.defaultModelRef = normalizeModelRef(policy.defaultModelRef);\n }\n if (policy.allowed !== undefined) {\n normalized.allowed = policy.allowed.map((entry) => {\n if (typeof entry === \"string\") {\n return normalizeWildcardModelRef(entry);\n }\n return normalizeModelRef(entry);\n });\n }\n return [agentId.trim(), normalized];\n }),\n );\n}\n\nfunction normalizeWildcardModelRef(ref: string): string {\n const normalized = ref.trim();\n if (!normalized.endsWith(\":*\")) {\n throw new ModelSelectionError(`Invalid wildcard model reference: ${ref}`);\n }\n return `${normalizeProviderId(normalized.slice(0, -2))}:*`;\n}\n\nfunction publicPolicy(policy: NormalizedAgentModelPolicy): StudioAgentModelPolicyConfig {\n const config: StudioAgentModelPolicyConfig = {};\n if (policy.defaultModelRef !== undefined) {\n config.defaultModelRef = policy.defaultModelRef;\n }\n if (policy.allowed !== undefined) config.allowed = policy.allowed;\n return config;\n}\n\nfunction modelWarnings(\n ref: string,\n model: StudioModelDefinition | undefined,\n request: AgentRunRequest,\n): JsonObject[] {\n const warnings: JsonObject[] = [];\n const modalities = requestModalities(request);\n const missingModalities = [...modalities].filter(\n (modality) => !model?.modalities?.input.includes(modality),\n );\n if (model?.modalities !== undefined && missingModalities.length > 0) {\n warnings.push({\n model: ref,\n kind: \"modality\",\n message: `Model ${ref} does not declare input support for ${missingModalities.join(\", \")}`,\n missing: missingModalities,\n });\n }\n\n if (request.stream === true && model?.capabilities?.streaming === false) {\n warnings.push({\n model: ref,\n kind: \"capability\",\n message: `Model ${ref} is configured as non-streaming but the run requested streaming`,\n capability: \"streaming\",\n });\n }\n\n return warnings;\n}\n\nfunction requestModalities(request: AgentRunRequest): Set<StudioModelModality> {\n const modalities = new Set<StudioModelModality>([\"text\"]);\n for (const message of requestMessages(request)) {\n if (message.role === \"user\" || message.role === \"assistant\") {\n if (typeof message.content === \"string\") continue;\n for (const content of message.content) {\n if (content.type === \"image\") {\n modalities.add(\"image\");\n }\n if (content.type === \"file\") {\n modalities.add(\"document\");\n }\n }\n }\n }\n return modalities;\n}\n\nfunction requestMessages(request: AgentRunRequest): readonly Message[] {\n return request.type === \"messages\" ? request.messages : [];\n}\n\nfunction normalizeProviderId(id: string): string {\n const trimmed = id.trim();\n if (trimmed.length === 0 || trimmed.includes(\":\")) {\n throw new ModelSelectionError(\"Model provider id must be non-empty and cannot contain ':'\");\n }\n return trimmed;\n}\n\nfunction normalizeModelId(id: string): string {\n const trimmed = id.trim();\n if (trimmed.length === 0) {\n throw new ModelSelectionError(\"Model id cannot be empty\");\n }\n return trimmed;\n}\n","import type { ClientDataMap, ClientMetadata, ClientStream } from \"@anvia/client\";\nimport { createClientStreamResponse, createEventStreamResponse } from \"@anvia/server\";\nimport { serializeError } from \"./errors\";\n\ntype StudioStreamErrorEvent = {\n type: \"error\";\n error: unknown;\n};\n\nconst studioJsonlHeaders: HeadersInit = {\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"transfer-encoding\": \"chunked\",\n \"x-accel-buffering\": \"no\",\n};\n\nexport function streamStudioJsonl<TEvent>(events: AsyncIterable<TEvent>): Response {\n return createEventStreamResponse({\n events: withStudioStreamErrors(events),\n format: \"jsonl\",\n headers: studioJsonlHeaders,\n });\n}\n\nexport function streamStudioClient<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n>(options: { events: ClientStream<Metadata, Data> }): Response {\n return createClientStreamResponse({\n events: options.events,\n format: \"jsonl\",\n headers: studioJsonlHeaders,\n });\n}\n\nfunction withStudioStreamErrors<TEvent>(\n events: AsyncIterable<TEvent>,\n): AsyncIterable<TEvent | StudioStreamErrorEvent> {\n const iterator = events[Symbol.asyncIterator]();\n let done = false;\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<TEvent | StudioStreamErrorEvent> {\n return {\n async next(): Promise<IteratorResult<TEvent | StudioStreamErrorEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n\n try {\n const next = await iterator.next();\n if (next.done === true) {\n done = true;\n return next;\n }\n return { done: false, value: serializeStreamError(next.value) };\n } catch (error) {\n done = true;\n return {\n done: false,\n value: studioStreamError(error),\n };\n }\n },\n async return(): Promise<IteratorResult<TEvent | StudioStreamErrorEvent>> {\n done = true;\n await iterator.return?.();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nfunction serializeStreamError<TEvent>(event: TEvent): TEvent {\n if (\n typeof event !== \"object\" ||\n event === null ||\n !(\"type\" in event) ||\n event.type !== \"error\" ||\n !(\"error\" in event)\n ) {\n return event;\n }\n return { ...event, error: serializeError(event.error) } as TEvent;\n}\n\nfunction studioStreamError(error: unknown): StudioStreamErrorEvent {\n return {\n type: \"error\",\n error: serializeError(error),\n };\n}\n","import type { StudioTrace, StudioTraceSummary } from \"../types\";\nexport function traceSummary(trace: StudioTrace): StudioTraceSummary {\n const summary: StudioTraceSummary = {\n id: trace.id,\n sessionId: trace.sessionId,\n status: trace.status,\n startedAt: trace.startedAt,\n observationCount: trace.observations.length,\n };\n if (trace.runId !== undefined) summary.runId = trace.runId;\n if (trace.name !== undefined) summary.name = trace.name;\n if (trace.endedAt !== undefined) summary.endedAt = trace.endedAt;\n if (trace.durationMs !== undefined) summary.durationMs = trace.durationMs;\n if (trace.output !== undefined) summary.output = trace.output;\n if (trace.error !== undefined) summary.error = trace.error;\n if (trace.usage !== undefined) summary.usage = trace.usage;\n if (trace.metadata !== undefined) summary.metadata = trace.metadata;\n return summary;\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioObservabilityEvent,\n StudioObservabilityEventType,\n StudioPipelineLogStore,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport type { ResolvedStores } from \"./options\";\nimport { streamStudioJsonl } from \"./streams\";\nimport { traceSummary } from \"./trace-summary\";\n\ntype ObservabilitySubscription = {\n close: () => void;\n next: () => Promise<IteratorResult<StudioObservabilityEvent>>;\n push: (event: StudioObservabilityEvent) => void;\n};\n\nconst defaultBufferSize = 1000;\nconst observedStoreTargets = new WeakMap<object, object>();\n\nexport class StudioObservabilityHub {\n private readonly subscriptions = new Set<ObservabilitySubscription>();\n\n emit(event: StudioObservabilityEvent): void {\n for (const subscription of this.subscriptions) {\n subscription.push(event);\n }\n }\n\n subscribe(\n options: { types?: Set<StudioObservabilityEventType> } = {},\n ): ObservabilitySubscription {\n const subscription = createSubscription(options.types);\n this.subscriptions.add(subscription);\n return {\n close: () => {\n subscription.close();\n this.subscriptions.delete(subscription);\n },\n next: subscription.next,\n push: subscription.push,\n };\n }\n}\n\nexport function observeStores(stores: ResolvedStores, hub: StudioObservabilityHub): ResolvedStores {\n const observed: ResolvedStores = { ...stores };\n if (stores.sessions !== undefined) observed.sessions = observeSessionStore(stores.sessions, hub);\n if (stores.traces !== undefined) observed.traces = observeTraceStore(stores.traces, hub);\n if (stores.pipelineLogs !== undefined) {\n observed.pipelineLogs = observePipelineLogStore(stores.pipelineLogs, hub);\n }\n return observed;\n}\n\nexport function registerObservabilityRoutes(app: Hono, hub: StudioObservabilityHub): void {\n app.get(\"/observability/events\", (c) => {\n const types = parseEventTypes(c.req.query(\"type\"));\n if (types === false) {\n return c.json(\n {\n error: {\n code: \"bad_request\",\n message: \"type must include session_log, pipeline_log, or trace\",\n },\n },\n 400,\n );\n }\n\n return streamStudioJsonl(observabilityEvents(hub, types));\n });\n}\n\nfunction observabilityEvents(\n hub: StudioObservabilityHub,\n types: Set<StudioObservabilityEventType> | undefined,\n): AsyncIterable<StudioObservabilityEvent> {\n const options: { types?: Set<StudioObservabilityEventType> } = {};\n if (types !== undefined) options.types = types;\n const subscription = hub.subscribe(options);\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next: () => subscription.next(),\n async return() {\n subscription.close();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nfunction createSubscription(\n types: Set<StudioObservabilityEventType> | undefined,\n): ObservabilitySubscription {\n const values: StudioObservabilityEvent[] = [];\n const resolvers: Array<(value: IteratorResult<StudioObservabilityEvent>) => void> = [];\n let closed = false;\n\n return {\n close() {\n closed = true;\n for (const resolve of resolvers.splice(0)) {\n resolve({ done: true, value: undefined });\n }\n },\n next() {\n const value = values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => resolvers.push(resolve));\n },\n push(event) {\n if (closed || (types !== undefined && !types.has(event.type))) {\n return;\n }\n const resolve = resolvers.shift();\n if (resolve !== undefined) {\n resolve({ done: false, value: event });\n return;\n }\n if (values.length >= defaultBufferSize) {\n values.shift();\n }\n values.push(event);\n },\n };\n}\n\nfunction observeSessionStore(\n store: StudioSessionStore,\n hub: StudioObservabilityHub,\n): StudioSessionStore {\n const proxy = new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendSessionLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendSessionLog = target.appendSessionLog?.bind(target);\n if (appendSessionLog === undefined) {\n return undefined;\n }\n return async (...args: Parameters<NonNullable<StudioSessionStore[\"appendSessionLog\"]>>) => {\n const log = await appendSessionLog(...args);\n hub.emit({ type: \"session_log\", log });\n return log;\n };\n },\n });\n observedStoreTargets.set(proxy, store);\n return proxy;\n}\n\nfunction observePipelineLogStore(\n store: StudioPipelineLogStore,\n hub: StudioObservabilityHub,\n): StudioPipelineLogStore {\n const proxy = new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendPipelineLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendPipelineLog = target.appendPipelineLog.bind(target);\n return async (...args: Parameters<StudioPipelineLogStore[\"appendPipelineLog\"]>) => {\n const log = await appendPipelineLog(...args);\n hub.emit({ type: \"pipeline_log\", log });\n return log;\n };\n },\n });\n observedStoreTargets.set(proxy, store);\n return proxy;\n}\n\nfunction observeTraceStore(store: StudioTraceStore, hub: StudioObservabilityHub): StudioTraceStore {\n const proxy = new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"saveTrace\") {\n return boundProperty(target, property, receiver);\n }\n const saveTrace = target.saveTrace.bind(target);\n return async (...args: Parameters<StudioTraceStore[\"saveTrace\"]>) => {\n const trace = await saveTrace(...args);\n hub.emit({ type: \"trace\", trace: traceSummary(trace) });\n return trace;\n };\n },\n });\n observedStoreTargets.set(proxy, store);\n return proxy;\n}\n\nexport function rawObservedStore<T extends object>(store: T): T {\n return (observedStoreTargets.get(store) as T | undefined) ?? store;\n}\n\nfunction boundProperty<T extends object>(\n target: T,\n property: string | symbol,\n receiver: unknown,\n): unknown {\n const value = Reflect.get(target, property, receiver);\n return typeof value === \"function\" ? value.bind(target) : value;\n}\n\nfunction parseEventTypes(\n value: string | undefined,\n): Set<StudioObservabilityEventType> | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n const types = new Set<StudioObservabilityEventType>();\n for (const type of value.split(\",\")) {\n const trimmed = type.trim();\n if (!isEventType(trimmed)) {\n return false;\n }\n types.add(trimmed);\n }\n return types;\n}\n\nfunction isEventType(value: string): value is StudioObservabilityEventType {\n return value === \"session_log\" || value === \"pipeline_log\" || value === \"trace\";\n}\n","import {\n type AgentClientStreamContext,\n type ClientStreamEvent,\n customAgentEventsToClientStream,\n} from \"@anvia/client\";\nimport type { AgentStreamEvent } from \"@anvia/core/agent\";\nimport { parseAgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport {\n isJsonValue,\n type JsonObject,\n type Message,\n parseMessages,\n type ToolResultOutput,\n} from \"@anvia/core/completion\";\nimport type { Context } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n AgentTraceOptions,\n StudioSession,\n StudioSessionStore,\n StudioTranscriptAttachment,\n StudioTranscriptChildAgentEvent,\n StudioTranscriptEntry,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { formatJson } from \"./json\";\nimport { streamStudioClient } from \"./streams\";\nimport {\n isAgentTraceOptions,\n isJsonObject,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n} from \"./type-guards\";\n\nexport { transcriptFromMessages } from \"./transcript\";\n\nexport type TranslatedAgentStreamEvent = AgentStreamEvent;\n\nexport class AsyncEventQueue<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) {\n return;\n }\n const resolver = this.resolvers.shift();\n if (resolver !== undefined) {\n resolver({ done: false, value });\n return;\n }\n this.values.push(value);\n }\n\n close(): void {\n this.closed = true;\n for (const resolver of this.resolvers.splice(0)) {\n resolver({ done: true, value: undefined });\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n const value = this.values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (this.closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => this.resolvers.push(resolve));\n }\n}\n\nexport function streamAgentRunEvents(\n _c: Context,\n events: AsyncIterable<AgentRunStreamEvent>,\n options: { runId: string; onCancel?: () => void | Promise<void> },\n): Response {\n return streamStudioClient({\n events: customAgentEventsToClientStream<AgentRunStreamEvent>({\n events: withAgentRunCancellation(events, options.onCancel),\n runId: options.runId,\n mapCustomEvent: studioEventToClientEvent,\n }),\n });\n}\n\nfunction studioEventToClientEvent(\n event: AgentRunStreamEvent,\n context: AgentClientStreamContext,\n): ClientStreamEvent | undefined {\n if (event.type === \"session_log\" && isJsonValue(event.log)) {\n return {\n type: \"data\",\n runId: context.runId,\n name: \"studio.session_log\",\n data: event.log,\n transient: true,\n };\n }\n if (event.type === \"pipeline_log\" && isJsonValue(event.log)) {\n return {\n type: \"data\",\n runId: context.runId,\n name: \"studio.pipeline_log\",\n data: event.log,\n transient: true,\n };\n }\n if (event.type === \"pipeline_final\" && isJsonValue(event.output)) {\n return {\n type: \"data\",\n runId: context.runId,\n name: \"studio.pipeline_final\",\n data: event.output,\n };\n }\n return undefined;\n}\n\nfunction withAgentRunCancellation(\n events: AsyncIterable<AgentRunStreamEvent>,\n onCancel: (() => void | Promise<void>) | undefined,\n): AsyncIterable<AgentRunStreamEvent> {\n const iterator = events[Symbol.asyncIterator]();\n let done = false;\n let terminal = false;\n let cancellationHandled = false;\n\n const handleCancellation = async () => {\n if (cancellationHandled) {\n return;\n }\n cancellationHandled = true;\n await onCancel?.();\n };\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<AgentRunStreamEvent> {\n return {\n async next(): Promise<IteratorResult<AgentRunStreamEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n try {\n const next = await iterator.next();\n if (next.done === true) {\n done = true;\n if (!terminal) {\n await handleCancellation();\n }\n return next;\n }\n if (isTerminalAgentEvent(next.value)) {\n terminal = true;\n }\n return next;\n } catch (error) {\n done = true;\n terminal = true;\n throw error;\n }\n },\n async return(): Promise<IteratorResult<AgentRunStreamEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n done = true;\n let closeError: unknown;\n const closePromise = iterator.return?.().catch((error: unknown) => {\n closeError = error;\n return { done: true, value: undefined } as IteratorResult<AgentRunStreamEvent>;\n });\n if (!terminal) {\n await handleCancellation();\n }\n await closePromise;\n if (closeError !== undefined) {\n throw closeError;\n }\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nexport function traceForRun(\n trace: AgentTraceOptions | undefined,\n agentId: string,\n session: StudioSession | undefined,\n): AgentTraceOptions {\n const options: AgentTraceOptions = {};\n if (trace !== undefined) Object.assign(options, trace);\n const metadata: JsonObject = {};\n if (trace?.metadata !== undefined) Object.assign(metadata, trace.metadata);\n metadata.agentId = agentId;\n options.metadata = metadata;\n if (trace?.sessionId !== undefined) options.sessionId = trace.sessionId;\n else if (session !== undefined) options.sessionId = session.id;\n return options;\n}\n\nexport function createPersistedStreamingSessionTranscript(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n runId: string;\n startedAt: number;\n persistGeneratedMessages?: boolean;\n generatedMessagesStartIndex?: 0 | 1;\n}): {\n events: AsyncIterable<AgentRunStreamEvent>;\n cancel: () => Promise<void>;\n} {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n const title = optionalTitle(props.message);\n let status: \"running\" | \"success\" | \"suspended\" | \"error\" | \"cancelled\" = \"running\";\n let saveTail: Promise<void> = Promise.resolve();\n const isCancelled = () => status === \"cancelled\";\n\n const saveTranscript = (\n input: Parameters<typeof props.store.saveSessionRunTranscript>[0],\n ): Promise<void> => {\n const operation = saveTail.then(async () => {\n const nextSession = await props.store.saveSessionRunTranscript(input);\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\n });\n saveTail = operation.catch(() => undefined);\n return operation;\n };\n\n const events = (async function* (): AsyncIterable<AgentRunStreamEvent> {\n await saveTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"running\",\n });\n if (isCancelled()) {\n return;\n }\n\n try {\n for await (const event of props.stream) {\n if (isCancelled()) {\n return;\n }\n acceptTranscriptStreamEvent(transcript, event);\n if (isTerminalAgentEvent(event)) {\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n }\n const eventStatus =\n event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\"\n ? event.type === \"interaction\"\n ? \"suspended\"\n : \"success\"\n : event.type === \"error\"\n ? \"error\"\n : \"running\";\n\n const saveInput: Parameters<typeof props.store.saveSessionRunTranscript>[0] = {\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: eventStatus,\n };\n if (event.type === \"error\") saveInput.error = serializeError(event.error);\n await saveTranscript(saveInput);\n const generatedMessages =\n event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\"\n ? event.messages.slice(props.generatedMessagesStartIndex ?? 1)\n : [];\n if (props.persistGeneratedMessages === true && generatedMessages.length > 0) {\n await props.store.append({\n scope: { sessionId: props.session.id },\n runId: props.runId,\n turn: 1,\n messages: generatedMessages,\n });\n }\n if (isCancelled()) {\n return;\n }\n status = eventStatus;\n\n yield event;\n }\n } catch (error) {\n if (status !== \"running\") {\n throw error;\n }\n status = \"error\";\n appendTranscriptAssistantError(transcript, errorText(error));\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n await saveTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"error\",\n error: serializeError(error),\n });\n throw error;\n }\n })();\n\n return {\n events,\n async cancel() {\n if (status !== \"running\") {\n return;\n }\n status = \"cancelled\";\n cancelPendingTranscriptInputs(transcript, new Date().toISOString());\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n await saveTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"cancelled\",\n });\n },\n };\n}\n\nexport function assignTranscriptRunDuration(\n transcript: StudioTranscriptEntry[],\n durationMs: number,\n): void {\n const normalizedDurationMs = Math.max(0, durationMs);\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind === \"message\" && entry.role === \"assistant\") {\n entry.durationMs = normalizedDurationMs;\n return;\n }\n if (entry?.kind === \"message\" && entry.role === \"user\") {\n break;\n }\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: \"\",\n durationMs: normalizedDurationMs,\n });\n}\n\nfunction cancelPendingTranscriptInputs(\n transcript: StudioTranscriptEntry[],\n cancelledAt: string,\n): void {\n for (const entry of transcript) {\n if (entry.kind !== \"tool\") {\n continue;\n }\n if (entry.approval?.status === \"pending\") {\n entry.approval = {\n ...entry.approval,\n status: \"cancelled\",\n resolvedAt: cancelledAt,\n reason: \"Run cancelled in Anvia Studio.\",\n };\n }\n if (entry.question?.status === \"pending\") {\n entry.question = {\n ...entry.question,\n status: \"cancelled\",\n cancelledAt,\n };\n }\n }\n}\n\nfunction acceptTranscriptStreamEvent(\n transcript: StudioTranscriptEntry[],\n event: AgentRunStreamEvent,\n): void {\n if (event.type === \"text_delta\") {\n appendTranscriptAssistantText(transcript, event.delta);\n }\n if (event.type === \"reasoning_delta\") {\n appendTranscriptReasoningText(transcript, event.delta, event.id);\n }\n if (event.type === \"tool_call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolCall.toolName,\n callId: event.toolCall.callId ?? event.toolCall.toolCallId,\n args: formatJson(event.toolCall.input),\n });\n }\n if (event.type === \"tool_result\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n const entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }> = {\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n };\n if (event.toolCallId !== undefined) entry.callId = event.toolCallId;\n if (event.args !== undefined) entry.args = event.args;\n if (event.result !== undefined) entry.result = event.result;\n if (event.structuredResult !== undefined) entry.structuredResult = event.structuredResult;\n transcript.push(entry);\n return;\n }\n matched.args = matched.args ?? event.args;\n matched.result = event.result;\n if (event.structuredResult !== undefined) {\n matched.structuredResult = event.structuredResult;\n }\n }\n if (event.type === \"agent_tool_event\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n const entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }> = {\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\n };\n if (event.toolCallId !== undefined) entry.callId = event.toolCallId;\n transcript.push(entry);\n return;\n }\n appendChildAgentTranscriptEvent(matched, event);\n }\n if (event.type === \"interaction\") {\n const interaction = event.interaction;\n const matched = findTranscriptToolEntry(\n transcript,\n interaction.toolName,\n interaction.callId ?? interaction.toolCallId,\n );\n if (matched !== undefined && interaction.type === \"tool-approval\") {\n const approval: NonNullable<typeof matched.approval> = {\n id: interaction.id,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n };\n if (interaction.reason !== undefined) approval.reason = interaction.reason;\n matched.approval = approval;\n }\n if (matched !== undefined && interaction.type === \"tool-question\") {\n matched.question = {\n id: interaction.id,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n questions: interaction.questions.map((question) => ({\n id: question.id,\n question: question.text,\n choices: [...(question.choices ?? [])],\n allowCustom: question.choices === undefined || question.allowCustom === true,\n })),\n };\n }\n }\n if (event.type === \"interaction_response\") {\n const response = event.response;\n const matched = findTranscriptToolEntry(\n transcript,\n response.toolName,\n response.callId ?? response.toolCallId,\n );\n const respondedAt = new Date().toISOString();\n if (matched?.approval !== undefined && response.type === \"tool-approval-response\") {\n const approval: NonNullable<typeof matched.approval> = {\n ...matched.approval,\n status: response.approved ? \"approved\" : \"rejected\",\n resolvedAt: respondedAt,\n };\n if (response.reason !== undefined) approval.reason = response.reason;\n matched.approval = approval;\n }\n if (matched?.question !== undefined && response.type === \"tool-question-response\") {\n matched.question = {\n ...matched.question,\n status: \"answered\",\n answeredAt: respondedAt,\n answers: response.answers.map((answer) => ({\n questionId: answer.questionId,\n answer: answer.value,\n })),\n };\n }\n }\n if (\n (event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\") &&\n event.trace?.traceId !== undefined\n ) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\n }\n if (event.type === \"error\") {\n appendTranscriptAssistantError(transcript, errorText(event.error));\n }\n}\n\nfunction appendChildAgentTranscriptEvent(\n entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }>,\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): void {\n const childEvent = childAgentTranscriptEvent(event);\n if (childEvent === undefined) {\n return;\n }\n const childEvents = entry.childEvents ?? [];\n if (childEvent.kind === \"message\") {\n const last = childEvents.at(-1);\n if (last?.kind === \"message\" && last.agentId === childEvent.agentId) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else if (childEvent.kind === \"reasoning\") {\n const last = childEvents.at(-1);\n if (\n last?.kind === \"reasoning\" &&\n last.agentId === childEvent.agentId &&\n (last.reasoningId ?? \"\") === (childEvent.reasoningId ?? \"\")\n ) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else {\n const matched = findChildAgentToolEvent(childEvents, childEvent);\n if (matched === undefined) {\n childEvents.push(childEvent);\n } else {\n if (matched.args === undefined && childEvent.args !== undefined) {\n matched.args = childEvent.args;\n }\n if (childEvent.result !== undefined) {\n matched.result = childEvent.result;\n }\n }\n }\n entry.childEvents = childEvents;\n}\n\nfunction childAgentTranscriptEvent(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): StudioTranscriptChildAgentEvent | undefined {\n const child = event.event;\n if (child.type === \"text_delta\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"message\" }> = {\n kind: \"message\",\n agentId: event.agentId,\n text: child.delta,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n return entry;\n }\n if (child.type === \"reasoning_delta\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"reasoning\" }> = {\n kind: \"reasoning\",\n agentId: event.agentId,\n text: child.delta,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n if (child.id !== undefined) entry.reasoningId = child.id;\n return entry;\n }\n if (child.type === \"tool_call\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> = {\n kind: \"tool\",\n agentId: event.agentId,\n toolName: child.toolCall.toolName,\n callId: child.toolCall.callId ?? child.toolCall.toolCallId,\n args: formatJson(child.toolCall.input),\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n return entry;\n }\n if (child.type === \"tool_result\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> = {\n kind: \"tool\",\n agentId: event.agentId,\n toolName: child.toolName,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n if (child.toolCallId !== undefined) entry.callId = child.toolCallId;\n if (child.args !== undefined) entry.args = child.args;\n if (child.result !== undefined) entry.result = child.result;\n if (child.structuredResult !== undefined) entry.structuredResult = child.structuredResult;\n return entry;\n }\n if (child.type === \"error\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"message\" }> = {\n kind: \"message\",\n agentId: event.agentId,\n text: `Error: ${errorText(child.error)}`,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n return entry;\n }\n return undefined;\n}\n\nfunction errorText(error: unknown): string {\n if (typeof error === \"string\") {\n return error;\n }\n return JSON.stringify(serializeError(error));\n}\n\nfunction findChildAgentToolEvent(\n childEvents: StudioTranscriptChildAgentEvent[],\n event: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }>,\n): Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> | undefined {\n for (let index = childEvents.length - 1; index >= 0; index -= 1) {\n const childEvent = childEvents[index];\n if (\n childEvent?.kind !== \"tool\" ||\n childEvent.agentId !== event.agentId ||\n childEvent.toolName !== event.toolName ||\n childEvent.result !== undefined\n ) {\n continue;\n }\n if (event.callId === undefined || childEvent.callId === event.callId) {\n return childEvent;\n }\n }\n return undefined;\n}\n\nfunction messageToTranscriptEntry(\n message: string | Message,\n entryId: number,\n): StudioTranscriptEntry {\n const role = typeof message === \"string\" || message.role !== \"assistant\" ? \"user\" : \"assistant\";\n const entry: Extract<StudioTranscriptEntry, { kind: \"message\" }> = {\n entryId,\n kind: \"message\",\n role,\n text: extractMessageText(message),\n };\n if (role === \"user\") Object.assign(entry, optionalTranscriptAttachments(message));\n return entry;\n}\n\nfunction appendTranscriptAssistantText(transcript: StudioTranscriptEntry[], delta: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\" && last.tone !== \"error\") {\n last.text = `${last.text}${delta}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: delta,\n });\n}\n\nfunction appendTranscriptAssistantError(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (\n last?.kind === \"message\" &&\n last.role === \"assistant\" &&\n last.tone === \"error\" &&\n last.text === text\n ) {\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n tone: \"error\",\n });\n}\n\nfunction assignTranscriptTraceId(transcript: StudioTranscriptEntry[], traceId: string): void {\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind === \"message\" && entry.role === \"assistant\") {\n transcript[index] = { ...entry, traceId };\n return;\n }\n }\n}\n\nfunction appendTranscriptReasoningText(\n transcript: StudioTranscriptEntry[],\n delta: string,\n reasoningId: string | undefined,\n): void {\n const last = transcript.at(-1);\n if (last?.kind === \"reasoning\" && (last.reasoningId ?? \"\") === (reasoningId ?? \"\")) {\n last.text = `${last.text}${delta}`;\n return;\n }\n const entry: Extract<StudioTranscriptEntry, { kind: \"reasoning\" }> = {\n entryId: transcript.length,\n kind: \"reasoning\",\n text: delta,\n };\n if (reasoningId !== undefined) entry.reasoningId = reasoningId;\n transcript.push(entry);\n}\n\nfunction findTranscriptToolEntry(\n transcript: StudioTranscriptEntry[],\n toolName: string,\n callId: string | undefined,\n): Extract<StudioTranscriptEntry, { kind: \"tool\" }> | undefined {\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind !== \"tool\" || entry.toolName !== toolName || entry.result !== undefined) {\n continue;\n }\n if (callId === undefined || entry.callId === callId) {\n return entry;\n }\n }\n return undefined;\n}\n\nfunction titleFromMessage(message: string | Message): string | undefined {\n const text = extractMessageText(message).replace(/\\s+/g, \" \").trim();\n if (text.length === 0) {\n return undefined;\n }\n return text.length > 72 ? `${text.slice(0, 69)}...` : text;\n}\n\nexport function optionalTitle(message: string | Message): { title?: string } {\n const title = titleFromMessage(message);\n return title === undefined ? {} : { title };\n}\n\nfunction extractMessageText(message: string | Message): string {\n if (typeof message === \"string\") {\n return message;\n }\n if (message.role === \"system\") {\n return message.content;\n }\n if (typeof message.content === \"string\") {\n return message.content;\n }\n return message.content\n .flatMap((item) => {\n if (item.type === \"text\" || item.type === \"reasoning\") {\n return [item.text];\n }\n if (item.type === \"tool-call\") {\n return [`${item.toolName}(${formatJson(item.input)})`];\n }\n if (item.type === \"tool-result\") {\n return [toolResultOutputText(item.output)];\n }\n return [];\n })\n .join(\"\\n\");\n}\n\nfunction optionalTranscriptAttachments(message: string | Message): {\n attachments?: StudioTranscriptAttachment[];\n} {\n if (typeof message === \"string\" || message.role !== \"user\") {\n return {};\n }\n if (typeof message.content === \"string\") {\n return {};\n }\n const attachments = message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.image.type === \"data\") {\n attachment.data = content.image.data;\n if (content.mediaType !== undefined) attachment.mediaType = content.mediaType;\n } else {\n attachment.url = content.image.url;\n }\n return [attachment];\n }\n if (content.type === \"file\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.filename !== undefined) attachment.name = content.filename;\n attachment.mediaType = content.mediaType;\n if (content.data.type === \"data\") attachment.data = content.data.data;\n if (content.data.type === \"url\") attachment.url = content.data.url;\n return [attachment];\n }\n return [];\n });\n return attachments.length === 0 ? {} : { attachments };\n}\n\nexport async function parseRunRequest(c: Context): Promise<AgentRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n if (\"message\" in body || \"history\" in body) {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"Legacy message/history requests are not supported; use messages\",\n ),\n };\n }\n\n const request = parseRunRequestBody(c, body);\n if (\"error\" in request) {\n return request;\n }\n\n return parseRunRequestOptions(c, body, request);\n}\n\nfunction parseRunRequestBody(\n c: Context,\n body: Record<string, unknown>,\n): AgentRunRequest | { error: Response } {\n if (body.type === \"interaction_response\") {\n if (typeof body.interactionId !== \"string\" || body.interactionId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"interactionId must be a string\") };\n }\n if (\n body.messages !== undefined ||\n body.sessionId !== undefined ||\n body.model !== undefined ||\n body.controls !== undefined\n ) {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"Interaction responses cannot include messages, sessionId, model, or controls\",\n ),\n };\n }\n try {\n return {\n type: \"interaction_response\",\n interactionId: body.interactionId,\n response: parseAgentInteractionResponse(body.response),\n };\n } catch {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"response must be an interaction response\"),\n };\n }\n }\n if (body.type !== \"messages\") {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n 'type must be \"messages\" or \"interaction_response\"',\n ),\n };\n }\n let messages: Message[];\n try {\n messages = parseMessages(body.messages);\n } catch {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"messages must be a non-empty Message array\"),\n };\n }\n\n if (messages.length === 0) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"messages must be a non-empty Message array\"),\n };\n }\n\n const message = messages.at(-1);\n if (message === undefined) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"messages must be a non-empty Message array\"),\n };\n }\n if (message.role !== \"user\") {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"The final message must be user-authored\"),\n };\n }\n\n return { type: \"messages\", messages };\n}\n\nfunction parseRunRequestOptions(\n c: Context,\n body: Record<string, unknown>,\n request: AgentRunRequest,\n): AgentRunRequest | { error: Response } {\n if (request.type === \"messages\" && \"sessionId\" in body) {\n if (typeof body.sessionId !== \"string\" || body.sessionId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"sessionId must be a string\") };\n }\n if (request.messages.length !== 1 || request.messages[0]?.role !== \"user\") {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"sessionId requires exactly one user message\"),\n };\n }\n request.sessionId = body.sessionId;\n }\n\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n\n if (request.type === \"messages\" && \"maxTurns\" in body) {\n if (!isNonNegativeInteger(body.maxTurns)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"maxTurns must be a non-negative integer\"),\n };\n }\n request.maxTurns = body.maxTurns;\n }\n\n if (request.type === \"messages\" && \"toolConcurrency\" in body) {\n if (!isPositiveInteger(body.toolConcurrency)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"toolConcurrency must be a positive integer\"),\n };\n }\n request.toolConcurrency = body.toolConcurrency;\n }\n\n if (request.type === \"messages\" && \"model\" in body) {\n if (\n isObject(body.model) &&\n typeof body.model.providerId === \"string\" &&\n typeof body.model.modelId === \"string\"\n ) {\n request.model = {\n providerId: body.model.providerId,\n modelId: body.model.modelId,\n };\n } else {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"model must be a { providerId, modelId } object\",\n ),\n };\n }\n }\n\n if (request.type === \"messages\" && \"controls\" in body) {\n if (\n !isObject(body.controls) ||\n Object.values(body.controls).some((value) => typeof value !== \"string\")\n ) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"controls must be an object of string values\"),\n };\n }\n request.controls = body.controls as Record<string, string>;\n }\n\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n\n if (\"trace\" in body) {\n if (!isAgentTraceOptions(body.trace)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"trace must be an AgentTraceOptions object\"),\n };\n }\n request.trace = body.trace;\n }\n\n return request;\n}\n\nfunction toolResultOutputText(output: ToolResultOutput): string {\n if (output.type === \"text\" || output.type === \"error-text\") return output.value;\n if (output.type === \"json\" || output.type === \"error-json\") return formatJson(output.value);\n if (output.type === \"execution-denied\") return output.reason ?? \"Execution denied\";\n return output.value\n .map((part) =>\n part.type === \"text\"\n ? part.text\n : `[file:${part.mediaType}${part.filename === undefined ? \"\" : `:${part.filename}`}]`,\n )\n .join(\"\\n\");\n}\n\nfunction isTerminalAgentEvent(event: AgentRunStreamEvent): boolean {\n return (\n event.type === \"response\" ||\n event.type === \"interaction\" ||\n event.type === \"blocked\" ||\n event.type === \"error\"\n );\n}\n","import type { Message, ToolResultOutput } from \"@anvia/core/completion\";\nimport type { StudioTranscriptAttachment, StudioTranscriptEntry } from \"../types\";\nimport { formatJson } from \"./json\";\n\nexport function renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n\nexport function transcriptFromMessages(messages: readonly Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n const attachments = attachmentsFromMessage(message);\n let textEntryAdded = false;\n const contents =\n typeof message.content === \"string\"\n ? [{ type: \"text\" as const, text: message.content }]\n : message.content;\n for (const content of contents) {\n if (content.type === \"text\") {\n const entry: StudioTranscriptEntry = {\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n };\n if (!textEntryAdded && attachments.length > 0) entry.attachments = attachments;\n transcript.push(entry);\n textEntryAdded = true;\n }\n }\n if (!textEntryAdded && attachments.length > 0) {\n const entry: StudioTranscriptEntry = {\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: \"\",\n attachments,\n };\n transcript.push(entry);\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n if (content.type !== \"tool-result\") {\n continue;\n }\n const entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }> = {\n entryId: transcript.length,\n kind: \"tool\",\n toolName: content.toolName,\n callId: content.callId ?? content.toolCallId,\n result: toolResultText(content.output),\n };\n if (content.output.type === \"content\") entry.structuredResult = content.output.value;\n transcript.push(entry);\n }\n continue;\n }\n\n const contents =\n typeof message.content === \"string\"\n ? [{ type: \"text\" as const, text: message.content }]\n : message.content;\n for (const content of contents) {\n if (content.type === \"text\") {\n appendAssistantTranscriptText(transcript, content.text);\n } else if (content.type === \"reasoning\") {\n const entry: StudioTranscriptEntry = {\n entryId: transcript.length,\n kind: \"reasoning\",\n text: content.text,\n };\n if (content.id !== undefined) entry.reasoningId = content.id;\n transcript.push(entry);\n } else if (content.type === \"tool-call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: content.toolName,\n callId: content.callId ?? content.toolCallId,\n args: formatJson(content.input),\n });\n }\n }\n }\n return transcript;\n}\n\nfunction attachmentsFromMessage(message: Message): StudioTranscriptAttachment[] {\n if (message.role !== \"user\" && message.role !== \"assistant\") {\n return [];\n }\n if (typeof message.content === \"string\") return [];\n return message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.image.type === \"data\") {\n attachment.data = content.image.data;\n if (content.mediaType !== undefined) attachment.mediaType = content.mediaType;\n } else {\n attachment.url = content.image.url;\n }\n return [attachment];\n }\n if (content.type === \"file\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.filename !== undefined) attachment.name = content.filename;\n attachment.mediaType = content.mediaType;\n if (content.data.type === \"data\") attachment.data = content.data.data;\n if (content.data.type === \"url\") attachment.url = content.data.url;\n return [attachment];\n }\n return [];\n });\n}\n\nfunction toolResultText(output: ToolResultOutput): string {\n if (output.type === \"text\" || output.type === \"error-text\") return output.value;\n if (output.type === \"json\" || output.type === \"error-json\") return formatJson(output.value);\n if (output.type === \"execution-denied\") return output.reason ?? \"Execution denied\";\n return output.value\n .map((part) =>\n part.type === \"text\"\n ? part.text\n : `[file:${part.mediaType}${part.filename === undefined ? \"\" : `:${part.filename}`}]`,\n )\n .join(\"\\n\");\n}\n\nfunction appendAssistantTranscriptText(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\") {\n last.text = `${last.text}${text}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n });\n}\n","import type { JsonObject, Message } from \"@anvia/core/completion\";\nimport type {\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionStore,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { formatUnknown } from \"./json\";\n\nexport async function appendSessionLog(\n store: StudioSessionStore | undefined,\n input: StudioSessionLogAppendInput,\n): Promise<StudioSessionLogEntry | undefined> {\n return store?.appendSessionLog?.(input);\n}\n\nexport async function* streamSessionRunLogs(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n runId: string;\n startedAt: number;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitLog(props.store, runStartedLog(props.session, props.runId));\n yield* emitLog(props.store, memoryLoadedLog(props.session, props.runId));\n\n try {\n for await (const event of props.stream) {\n for (const input of logsFromStreamEvent({\n event,\n runId: props.runId,\n sessionId: props.session.id,\n startedAt: props.startedAt,\n })) {\n yield* emitLog(props.store, input);\n }\n yield event;\n }\n } catch (error) {\n yield* emitLog(\n props.store,\n runFailedLog(props.session.id, props.runId, error, props.startedAt),\n );\n throw error;\n }\n}\n\nexport function sessionCreatedLog(\n session: StudioSession | { id: string; agentId: string; title?: string },\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n level: \"info\",\n category: \"session\",\n event: \"session.created\",\n message: \"Session created\",\n metadata: {\n agentId: session.agentId,\n hasTitle: session.title !== undefined,\n titleLength: session.title?.length ?? 0,\n },\n };\n}\n\nexport function runReceivedLog(props: {\n sessionId: string;\n runId: string;\n agentId: string;\n message: string | Message;\n stream: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n hasTrace: boolean;\n metadata?: JsonObject;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {\n agentId: props.agentId,\n stream: props.stream,\n message: messageSummary(props.message),\n hasTrace: props.hasTrace,\n metadataKeys: Object.keys(props.metadata ?? {}),\n };\n if (props.maxTurns !== undefined) metadata.maxTurns = props.maxTurns;\n if (props.toolConcurrency !== undefined) metadata.toolConcurrency = props.toolConcurrency;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"run.received\",\n message: \"Run request received\",\n metadata,\n };\n}\n\nexport function runStartedLog(session: StudioSession, runId: string): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.started\",\n message: \"Run started\",\n metadata: {\n agentId: session.agentId,\n existingMessageCount: session.messageCount,\n },\n };\n}\n\nexport function memoryLoadedLog(\n session: StudioSession,\n runId: string,\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.loaded\",\n message: \"Session memory loaded\",\n metadata: {\n messageCount: session.messageCount,\n transcriptEntries: session.transcript.length,\n },\n };\n}\n\nexport function runCompletedLog(props: {\n sessionId: string;\n runId: string;\n durationMs: number;\n usage?: unknown;\n output?: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {\n durationMs: props.durationMs,\n outputBytes: byteLength(props.output),\n };\n const usage = usageSummary(props.usage);\n if (usage !== undefined) metadata.usage = usage;\n if (props.messageCount !== undefined) metadata.messageCount = props.messageCount;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"run.completed\",\n message: \"Run completed\",\n metadata,\n };\n}\n\nexport function runCancelledLog(\n sessionId: string,\n runId: string,\n startedAt: number,\n): StudioSessionLogAppendInput {\n return {\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.cancelled\",\n message: \"Run cancelled\",\n metadata: {\n durationMs: Date.now() - startedAt,\n },\n };\n}\n\nexport function memorySavedLog(props: {\n sessionId: string;\n runId: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {};\n if (props.messageCount !== undefined) metadata.messageCount = props.messageCount;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.saved\",\n message: \"Session memory saved\",\n metadata,\n };\n}\n\nexport function memoryCompactedLog(props: {\n sessionId: string;\n runId: string;\n originalMessageCount: number;\n compactedMessageCount: number;\n retainedMessageCount: number;\n originalTokenCount: number;\n compactedTokenCount: number;\n retainedTokenCount: number;\n resultTokenCount: number;\n attempts: number;\n usage: unknown;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {\n originalMessageCount: props.originalMessageCount,\n compactedMessageCount: props.compactedMessageCount,\n retainedMessageCount: props.retainedMessageCount,\n originalTokenCount: props.originalTokenCount,\n compactedTokenCount: props.compactedTokenCount,\n retainedTokenCount: props.retainedTokenCount,\n resultTokenCount: props.resultTokenCount,\n attempts: props.attempts,\n };\n const usage = usageSummary(props.usage);\n if (usage !== undefined) metadata.usage = usage;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"memory\",\n event: \"memory.compacted\",\n message: \"Session memory compacted\",\n metadata,\n };\n}\n\nexport function runFailedLog(\n sessionId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioSessionLogAppendInput {\n return {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"run.failed\",\n message: \"Run failed\",\n metadata: {\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n },\n };\n}\n\nfunction logsFromStreamEvent(props: {\n event: AgentRunStreamEvent;\n sessionId: string;\n runId: string;\n startedAt: number;\n}): StudioSessionLogAppendInput[] {\n const { event, sessionId, runId } = props;\n if (event.type === \"memory_compaction\") {\n return [memoryCompactedLog({ sessionId, runId, ...event })];\n }\n if (event.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"prompt\",\n event: \"prompt.prepared\",\n message: `Turn ${event.turn} prompt prepared`,\n metadata: {\n turn: event.turn,\n prompt: messageSummary(event.prompt),\n historyCount: event.history.length,\n },\n },\n ];\n }\n if (event.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.called\",\n message: `Tool ${event.toolCall.toolName} called`,\n metadata: {\n turn: event.turn,\n toolName: event.toolCall.toolName,\n callId: event.toolCall.callId ?? event.toolCall.toolCallId,\n argumentBytes: byteLength(formatUnknown(event.toolCall.input)),\n },\n },\n ];\n }\n if (event.type === \"tool_result\") {\n const metadata: JsonObject = {\n turn: event.turn,\n toolName: event.toolName,\n argumentBytes: byteLength(event.args),\n resultBytes: byteLength(event.result),\n };\n if (event.toolCallId !== undefined) metadata.callId = event.toolCallId;\n if (event.internalCallId !== undefined) metadata.internalCallId = event.internalCallId;\n if (event.structuredResult !== undefined) {\n metadata.structuredResultBytes = byteLength(JSON.stringify(event.structuredResult));\n }\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.completed\",\n message: `Tool ${event.toolName} completed`,\n metadata,\n },\n ];\n }\n if (event.type === \"turn_end\") {\n const metadata: JsonObject = {\n turn: event.turn,\n contentCount: event.response.choice.length,\n };\n const usage = usageSummary(event.response.usage);\n if (usage !== undefined) metadata.usage = usage;\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"model\",\n event: \"model.turn.completed\",\n message: `Model turn ${event.turn} completed`,\n metadata,\n },\n ];\n }\n if (event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\") {\n const result = event;\n const logs: StudioSessionLogAppendInput[] = [];\n if (result.type === \"interaction\") {\n logs.push({\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.suspended\",\n message: `Run suspended for ${result.interaction.type}`,\n metadata: {\n interactionId: result.interaction.id,\n interactionType: result.interaction.type,\n toolName: result.interaction.toolName,\n sourceRunId: result.continuation.sourceRunId,\n },\n });\n } else {\n logs.push(\n runCompletedLog({\n sessionId,\n runId,\n durationMs: Date.now() - props.startedAt,\n usage: result.usage,\n output: result.text,\n messageCount: result.messages.length,\n }),\n );\n }\n if (result.resumedFrom !== undefined) {\n logs.push({\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.resumed\",\n message: \"Interaction resumed in a linked run\",\n metadata: {\n interactionId: result.resumedFrom.interactionId,\n sourceRunId: result.resumedFrom.runId,\n resumedRunId: result.runId,\n },\n });\n }\n logs.push(memorySavedLog({ sessionId, runId, messageCount: result.messages.length }));\n return logs;\n }\n if (event.type === \"error\") {\n return [runFailedLog(sessionId, runId, event.error, props.startedAt)];\n }\n if (event.type === \"interaction_response\") {\n const response = event.response;\n const metadata: JsonObject = {\n interactionId: response.interactionId,\n interactionType:\n response.type === \"tool-approval-response\" ? \"tool-approval\" : \"tool-question\",\n toolName: response.toolName,\n sourceRunId: event.sourceRunId,\n };\n if (response.callId !== undefined) metadata.callId = response.callId;\n if (response.type === \"tool-approval-response\") {\n metadata.approved = response.approved;\n metadata.hasReason = response.reason !== undefined;\n } else {\n metadata.answerCount = response.answers.length;\n }\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.responded\",\n message: `Interaction response received for ${response.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"agent_tool_event\") {\n return childAgentLog(event, sessionId, runId);\n }\n return [];\n}\n\nasync function* emitLog(\n store: StudioSessionStore,\n input: StudioSessionLogAppendInput,\n): AsyncIterable<AgentRunStreamEvent> {\n const log = await appendSessionLog(store, input);\n if (log !== undefined) {\n yield { type: \"session_log\", log };\n }\n}\n\nfunction childAgentLog(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n sessionId: string,\n runId: string,\n): StudioSessionLogAppendInput[] {\n const child = event.event;\n if (child.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.called\",\n message: `Child agent ${event.agentName ?? event.agentId} called ${child.toolCall.toolName}`,\n metadata: {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolCall.toolName,\n callId: child.toolCall.callId ?? child.toolCall.toolCallId,\n argumentBytes: byteLength(formatUnknown(child.toolCall.input)),\n },\n },\n ];\n }\n if (child.type === \"tool_result\") {\n const metadata: JsonObject = {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolName,\n resultBytes: byteLength(child.result),\n };\n if (child.toolCallId !== undefined) metadata.callId = child.toolCallId;\n if (child.structuredResult !== undefined) {\n metadata.structuredResultBytes = byteLength(JSON.stringify(child.structuredResult));\n }\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed ${child.toolName}`,\n metadata,\n },\n ];\n }\n if (child.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.turn_started\",\n message: `Child agent ${event.agentName ?? event.agentId} turn ${child.turn} started`,\n metadata: {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n childTurn: child.turn,\n historyCount: child.history.length,\n },\n },\n ];\n }\n if (child.type === \"response\" || child.type === \"interaction\" || child.type === \"blocked\") {\n const result = child;\n const metadata: JsonObject = {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n outputBytes: byteLength(result.text),\n messageCount: result.messages.length,\n status: result.type,\n };\n const usage = usageSummary(result.usage);\n if (usage !== undefined) metadata.usage = usage;\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed`,\n metadata,\n },\n ];\n }\n if (child.type === \"error\") {\n return [\n {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"child_agent.failed\",\n message: `Child agent ${event.agentName ?? event.agentId} failed`,\n metadata: {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n error: serializeError(child.error),\n },\n },\n ];\n }\n return [];\n}\n\nfunction messageSummary(message: string | Message): JsonObject {\n if (typeof message === \"string\") {\n return {\n role: \"user\",\n contentKind: \"text\",\n byteLength: byteLength(message),\n };\n }\n return {\n role: message.role,\n contentKind: Array.isArray(message.content) ? \"parts\" : \"text\",\n partCount: Array.isArray(message.content) ? message.content.length : 1,\n byteLength: byteLength(formatUnknown(message.content)),\n };\n}\n\nfunction usageSummary(value: unknown): JsonObject | undefined {\n if (value === undefined || value === null || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n const summary: JsonObject = {};\n const inputTokens = numericValue(record.inputTokens);\n const outputTokens = numericValue(record.outputTokens);\n const totalTokens = numericValue(record.totalTokens);\n const cachedInputTokens = numericValue(record.cachedInputTokens);\n const cacheCreationInputTokens = numericValue(record.cacheCreationInputTokens);\n if (inputTokens !== undefined) summary.inputTokens = inputTokens;\n if (outputTokens !== undefined) summary.outputTokens = outputTokens;\n if (totalTokens !== undefined) summary.totalTokens = totalTokens;\n if (cachedInputTokens !== undefined) summary.cachedInputTokens = cachedInputTokens;\n if (cacheCreationInputTokens !== undefined) {\n summary.cacheCreationInputTokens = cacheCreationInputTokens;\n }\n return summary;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction byteLength(value: string | undefined): number {\n return value === undefined ? 0 : new TextEncoder().encode(value).byteLength;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { isQuestionTool } from \"@anvia/core/tool\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioAgentRuntimeSummary,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioGraphConfig,\n StudioGraphRegistration,\n StudioPipeline,\n StudioPipelineConfig,\n} from \"../types\";\nimport { staticContextDocuments, vectorContexts } from \"./agent-context\";\nimport { evalConfig } from \"./eval-config\";\nimport { serializeUnknown } from \"./json\";\nimport { agentHasKnowledge } from \"./knowledge\";\nimport { createStudioModelRegistry, studioModelsConfig } from \"./models\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\nimport {\n agentHasMcpServers,\n agentToolItems,\n mcpServerName,\n toolRequiresApproval,\n} from \"./tool-metadata\";\n\nexport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport function runnerId(options: StudioRuntimeOptions): string {\n return options.id ?? \"anvia-studio\";\n}\n\nexport function agentConfig(agent: StudioAgent): StudioAgentConfig {\n const name = agent.name ?? agent.agent.name;\n const description = agent.description ?? agent.agent.description;\n const config: StudioAgentConfig = {\n id: agent.id,\n quickPrompts: agent.quickPrompts ?? [],\n };\n if (name !== undefined) config.name = name;\n if (description !== undefined) config.description = description;\n if (agent.metadata !== undefined) config.metadata = agent.metadata;\n return config;\n}\n\nexport function agentRuntimeSummary(agent: StudioAgent): StudioAgentRuntimeSummary {\n const tools = agentToolItems(agent);\n const staticContext = staticContextDocuments(agent.agent);\n const indexedContext = vectorContexts(agent.agent);\n const name = agent.name ?? agent.agent.name;\n const description = agent.description ?? agent.agent.description;\n const summary: StudioAgentRuntimeSummary = {\n id: agent.id,\n model: toJsonValue(agent.agent.model),\n toolCount: tools.length,\n staticToolCount: tools.filter((item) => item.source === \"static\").length,\n dynamicToolCount: tools.filter((item) => item.source === \"dynamic\").length,\n approvalToolCount: tools.filter((item) => toolRequiresApproval(item.tool)).length,\n mcpToolCount: tools.filter((item) => mcpServerName(item.tool) !== undefined).length,\n staticContextCount: staticContext.length,\n dynamicContextCount: indexedContext.length,\n observerCount: Object.keys(agent.agent.observability?.observers ?? {}).length,\n hasMemory: agent.agent.memory !== undefined,\n hasLifecycle: agent.agent.lifecycle !== undefined,\n hasOutputSchema: agent.agent.outputSchema !== undefined,\n };\n if (name !== undefined) summary.name = name;\n if (description !== undefined) summary.description = description;\n if (agent.agent.defaultMaxTurns !== undefined) {\n summary.defaultMaxTurns = agent.agent.defaultMaxTurns;\n }\n if (agent.metadata !== undefined) summary.metadata = agent.metadata;\n return summary;\n}\n\nexport function pipelineConfig(pipeline: StudioPipeline): StudioPipelineConfig {\n const graph = pipeline.pipeline.graph();\n const stageNodes = graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\");\n const config: StudioPipelineConfig = {\n id: pipeline.id,\n stageCount: stageNodes.length,\n edgeCount: graph.edges.length,\n hasParallelStages: graph.nodes.some((node) => node.kind === \"parallel\"),\n agentCount: graph.nodes.filter((node) => node.kind === \"agent\").length,\n extractorCount: graph.nodes.filter((node) => node.kind === \"extractor\").length,\n };\n if (pipeline.name !== undefined) config.name = pipeline.name;\n if (pipeline.description !== undefined) config.description = pipeline.description;\n if (pipeline.metadata !== undefined) config.metadata = pipeline.metadata;\n return config;\n}\n\nexport function graphConfig(registration: StudioGraphRegistration): StudioGraphConfig {\n const config: StudioGraphConfig = {\n id: registration.id,\n nodeTypes: Object.entries(registration.graph.schema.nodes).map(([name, definition]) => ({\n name,\n description: definition.description,\n })),\n relationshipTypes: Object.entries(registration.graph.schema.relationships).map(\n ([name, definition]) => ({\n name,\n description: definition.description,\n from: definition.from,\n to: definition.to,\n }),\n ),\n };\n if (registration.name !== undefined) config.name = registration.name;\n if (registration.description !== undefined) config.description = registration.description;\n return config;\n}\n\nexport function buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n sandboxCount = 0,\n): StudioConfig {\n const models =\n options.models === undefined\n ? undefined\n : studioModelsConfig(createStudioModelRegistry(options.models), agents);\n const config: StudioConfig = {\n id: runnerId(options),\n agents: agents.map(agentConfig),\n pipelines: pipelines.map(pipelineConfig),\n graphs: options.graphs.map(graphConfig),\n evals: options.evals.map(evalConfig),\n chat: {\n quickPrompts: Object.fromEntries(agents.map((agent) => [agent.id, agent.quickPrompts ?? []])),\n },\n capabilities: capabilityConfig(options, agents, pipelines, stores, sandboxCount),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n };\n if (options.name !== undefined) config.name = options.name;\n if (options.description !== undefined) config.description = options.description;\n if (options.version !== undefined) config.version = options.version;\n if (models !== undefined) config.models = models;\n return config;\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n sandboxCount = 0,\n): Partial<Record<StudioCapability, StudioCapabilityConfig>> {\n const capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>> = {\n agents: { enabled: true },\n observability: { enabled: true },\n status: { enabled: true },\n };\n\n if (stores.sessions !== undefined) {\n capabilities.sessions = { enabled: true };\n }\n if (stores.sessions !== undefined || agents.some((agent) => agent.agent.memory !== undefined)) {\n capabilities.memory = { enabled: true };\n }\n if (stores.traces !== undefined) {\n capabilities.traces = { enabled: true };\n }\n if (pipelines.length > 0) {\n capabilities.pipelines = { enabled: true };\n }\n if (_options.graphs.length > 0) {\n capabilities.graphs = { enabled: true };\n }\n if (_options.evals.length > 0) {\n capabilities.evals = { enabled: true };\n }\n if (agents.some((agent) => agent.agent.tools.length > 0)) {\n capabilities.tools = { enabled: true };\n }\n if (agents.some(agentHasMcpServers)) {\n capabilities.mcps = { enabled: true };\n }\n if (sandboxCount > 0) {\n capabilities.sandboxes = { enabled: true };\n }\n\n if (\n agents.some((agent) =>\n agent.agent.tools.some((tool) => toolRequiresApproval(tool) || isQuestionTool(tool)),\n )\n ) {\n capabilities.interactions = { enabled: true };\n }\n if (agents.some(agentHasKnowledge)) {\n capabilities.knowledge = { enabled: true };\n }\n return capabilities;\n}\n\nexport function unsupportedCapabilities(\n stores: ResolvedStores,\n): import(\"../types\").StudioCapability[] {\n const capabilities: import(\"../types\").StudioCapability[] = [];\n if (stores.sessions === undefined) capabilities.push(\"sessions\");\n if (stores.traces === undefined) capabilities.push(\"traces\");\n return capabilities;\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n return serializeUnknown(value);\n}\n","import type {\n StudioEvalCasePreview,\n StudioEvalMetricSummary,\n StudioEvalSuite,\n StudioEvalSuiteConfig,\n} from \"../types\";\nimport { toJsonValue } from \"./json\";\n\nconst CASE_PREVIEW_LIMIT = 5;\nconst PREVIEW_VALUE_MAX_LENGTH = 500;\n\nexport function evalConfig(suite: StudioEvalSuite): StudioEvalSuiteConfig {\n const casePreviews = suite.cases.slice(0, CASE_PREVIEW_LIMIT).map(casePreview);\n const metricSummaries = suite.metrics.map(metricSummary);\n\n const config: StudioEvalSuiteConfig = {\n id: suite.id ?? suite.name,\n name: suite.name,\n caseCount: suite.cases.length,\n metricNames: suite.metrics.map((metric) => metric.name),\n casePreviewCount: casePreviews.length,\n casePreviews,\n metricSummaries,\n };\n if (suite.description !== undefined) config.description = suite.description;\n if (suite.concurrency !== undefined) config.concurrency = suite.concurrency;\n if (suite.metadata !== undefined) config.metadata = suite.metadata;\n return config;\n}\n\nfunction casePreview(testCase: unknown, index: number): StudioEvalCasePreview {\n if (!isRecord(testCase)) {\n return {\n id: `case-${index + 1}`,\n input: previewValue(testCase),\n };\n }\n\n const preview: StudioEvalCasePreview = {\n id:\n typeof testCase.id === \"string\" && testCase.id.length > 0 ? testCase.id : `case-${index + 1}`,\n };\n if (\"input\" in testCase) preview.input = previewValue(testCase.input);\n if (\"expected\" in testCase) preview.expected = previewValue(testCase.expected);\n const keys = metadataKeys(testCase.metadata);\n if (keys !== undefined) preview.metadataKeys = keys;\n return preview;\n}\n\nfunction metricSummary(metric: unknown, index: number): StudioEvalMetricSummary {\n if (!isRecord(metric)) {\n return { name: `metric-${index + 1}` };\n }\n\n const summary: StudioEvalMetricSummary = {\n name:\n typeof metric.name === \"string\" && metric.name.length > 0\n ? metric.name\n : `metric-${index + 1}`,\n };\n const dataType = metricDataType(metric.dataType);\n if (dataType !== undefined) summary.dataType = dataType;\n if (typeof metric.required === \"boolean\") summary.required = metric.required;\n if (metric.direction === \"higher_is_better\" || metric.direction === \"lower_is_better\") {\n summary.direction = metric.direction;\n }\n if (typeof metric.threshold === \"number\") summary.threshold = metric.threshold;\n if (typeof metric.configId === \"string\") summary.configId = metric.configId;\n if (typeof metric.scoreConfigId === \"string\") summary.scoreConfigId = metric.scoreConfigId;\n const keys = metadataKeys(metric.metadata);\n if (keys !== undefined) summary.metadataKeys = keys;\n return summary;\n}\n\nfunction previewValue(value: unknown) {\n const jsonValue = toJsonValue(value);\n const serialized = JSON.stringify(jsonValue);\n if (serialized.length <= PREVIEW_VALUE_MAX_LENGTH) {\n return jsonValue;\n }\n return `${serialized.slice(0, PREVIEW_VALUE_MAX_LENGTH)}...`;\n}\n\nfunction metadataKeys(value: unknown): string[] | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const keys = Object.keys(value).filter((key) => value[key] !== undefined);\n return keys.length > 0 ? keys : undefined;\n}\n\nfunction metricDataType(value: unknown): StudioEvalMetricSummary[\"dataType\"] | undefined {\n return value === \"NUMERIC\" || value === \"CATEGORICAL\" || value === \"BOOLEAN\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport { getAgentToolState } from \"@anvia/core/internal/agent\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentKnowledgeConfig,\n StudioKnowledgeEvidence,\n StudioKnowledgeEvidenceDocument,\n StudioKnowledgeItem,\n StudioKnowledgeItemsPage,\n StudioKnowledgeSourceKind,\n StudioKnowledgeSourceSummary,\n StudioKnowledgeSummary,\n StudioStaticKnowledgeDocument,\n StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { staticContextDocuments, vectorContexts } from \"./agent-context\";\nimport { errorResponse } from \"./http\";\nimport { compactJsonObject, toJsonValue } from \"./json\";\nimport { optionalQueryString, parseLimit } from \"./query\";\n\ntype InspectableStore = {\n inspect?: (request: { limit: number; cursor?: string | undefined; filter?: unknown }) => Promise<{\n items: Array<{ id: string; document: unknown; metadata?: Record<string, unknown> }>;\n nextCursor?: string | undefined;\n totalCount?: number | undefined;\n }>;\n};\n\nexport function registerKnowledgeRoutes(\n app: Hono,\n props: {\n agents: StudioAgent[];\n traceStore?: StudioTraceStore;\n },\n): void {\n app.get(\"/knowledge\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const summary: StudioKnowledgeSummary = {\n agents: await Promise.all(props.agents.map(agentKnowledgeConfig)),\n evidence: await recentKnowledgeEvidence(props.traceStore, limit),\n };\n return c.json(summary);\n });\n\n app.get(\"/knowledge/items\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sourceId = optionalQueryString(c.req.query(\"sourceId\"));\n if (agentId === undefined || sourceId === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"agentId and sourceId are required\");\n }\n\n const agent = props.agents.find((item) => item.id === agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const page = await knowledgeItemsPage(agent, sourceId, {\n limit,\n cursor: optionalQueryString(c.req.query(\"cursor\")),\n });\n if (page === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Knowledge source not found\");\n }\n\n return c.json(page);\n });\n}\n\nexport function agentHasKnowledge(agent: StudioAgent): boolean {\n const toolIndexes = getAgentToolState(agent.agent).toolIndexes;\n return agent.agent.context.length > 0 || toolIndexes.length > 0;\n}\n\nasync function agentKnowledgeConfig(agent: StudioAgent): Promise<StudioAgentKnowledgeConfig> {\n const agentName = agent.name ?? agent.agent.name;\n const staticContext = staticContextDocuments(agent.agent);\n const config: StudioAgentKnowledgeConfig = {\n agentId: agent.id,\n sources: await knowledgeSources(agent),\n staticContext: staticContext.map((document) => {\n const item: StudioStaticKnowledgeDocument = { id: document.id, text: document.text };\n if (document.additionalProps !== undefined) {\n item.additionalProps = jsonObjectFromRecord(document.additionalProps);\n }\n return item;\n }),\n };\n if (agentName !== undefined) config.agentName = agentName;\n return config;\n}\n\nasync function knowledgeSources(agent: StudioAgent): Promise<StudioKnowledgeSourceSummary[]> {\n const toolIndexes = getAgentToolState(agent.agent).toolIndexes;\n const staticContext = staticContextDocuments(agent.agent);\n const indexedContext = vectorContexts(agent.agent);\n const sources: StudioKnowledgeSourceSummary[] = [\n {\n sourceId: staticSourceId(),\n kind: \"static_context\",\n label: \"Static context\",\n count: staticContext.length,\n inspectable: true,\n itemCount: staticContext.length,\n },\n ];\n\n const dynamicContextSources = await Promise.all(\n indexedContext.map(async (vectorContext, index) => {\n const inspect = inspectFn(vectorContext.store);\n const count = await inspectableCount(inspect, vectorContext.filter);\n const source: StudioKnowledgeSourceSummary = {\n sourceId: dynamicContextSourceId(index),\n kind: \"dynamic_context\",\n label: `Dynamic context ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: vectorContext.topK,\n inspectable: inspect !== undefined,\n };\n if (vectorContext.minScore !== undefined) {\n source.minScore = vectorContext.minScore;\n }\n if (count !== undefined) source.itemCount = count;\n return source;\n }),\n );\n\n const dynamicToolSources = await Promise.all(\n toolIndexes.map(async (toolIndex, index) => {\n const inspect = inspectFn(toolIndex);\n const count = await inspectableCount(inspect, toolIndex.filter);\n const source: StudioKnowledgeSourceSummary = {\n sourceId: dynamicToolsSourceId(index),\n kind: \"dynamic_tools\",\n label: `Dynamic tools ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: toolIndex.topK,\n inspectable: inspect !== undefined,\n };\n if (toolIndex.minScore !== undefined) {\n source.minScore = toolIndex.minScore;\n }\n if (count !== undefined) source.itemCount = count;\n return source;\n }),\n );\n\n return [...sources, ...dynamicContextSources, ...dynamicToolSources];\n}\n\nasync function inspectableCount(\n inspect: InspectableStore[\"inspect\"] | undefined,\n filter?: unknown,\n): Promise<number | undefined> {\n if (inspect === undefined) {\n return undefined;\n }\n const page = await inspect({ limit: 1, filter });\n return page.totalCount;\n}\n\nasync function knowledgeItemsPage(\n agent: StudioAgent,\n sourceId: string,\n request: { limit: number; cursor?: string | undefined },\n): Promise<StudioKnowledgeItemsPage | undefined> {\n if (sourceId === staticSourceId()) {\n return staticKnowledgeItemsPage(agent, request);\n }\n\n const vectorContextIndex = dynamicSourceIndex(sourceId, \"dynamic_context\");\n if (vectorContextIndex !== undefined) {\n const vectorContext = vectorContexts(agent.agent)[vectorContextIndex];\n if (vectorContext === undefined) {\n return undefined;\n }\n const inspect = inspectFn(vectorContext.store);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_context\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: vectorContext.filter,\n });\n const result: StudioKnowledgeItemsPage = {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_context\",\n inspectable: true,\n items: page.items.map((item) => dynamicContextItem(item)),\n };\n if (page.nextCursor !== undefined) result.nextCursor = page.nextCursor;\n if (page.totalCount !== undefined) result.totalCount = page.totalCount;\n return result;\n }\n\n const dynamicToolsIndex = dynamicSourceIndex(sourceId, \"dynamic_tools\");\n if (dynamicToolsIndex !== undefined) {\n const toolIndex = getAgentToolState(agent.agent).toolIndexes[dynamicToolsIndex];\n if (toolIndex === undefined) {\n return undefined;\n }\n const inspect = inspectFn(toolIndex);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_tools\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: toolIndex.filter,\n });\n const result: StudioKnowledgeItemsPage = {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_tools\",\n inspectable: true,\n items: page.items.map((item) => dynamicToolItem(item)),\n };\n if (page.nextCursor !== undefined) result.nextCursor = page.nextCursor;\n if (page.totalCount !== undefined) result.totalCount = page.totalCount;\n return result;\n }\n\n return undefined;\n}\n\nfunction inspectFn(store: unknown): InspectableStore[\"inspect\"] | undefined {\n if (!isRecord(store) || typeof store.inspect !== \"function\") {\n return undefined;\n }\n const inspect = store.inspect;\n return (request) =>\n inspect.call(store, request) as ReturnType<NonNullable<InspectableStore[\"inspect\"]>>;\n}\n\nfunction staticKnowledgeItemsPage(\n agent: StudioAgent,\n request: { limit: number; cursor?: string | undefined },\n): StudioKnowledgeItemsPage {\n const staticContext = staticContextDocuments(agent.agent);\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const page = staticContext.slice(start, start + request.limit);\n const nextOffset = start + page.length;\n const result: StudioKnowledgeItemsPage = {\n agentId: agent.id,\n sourceId: staticSourceId(),\n kind: \"static_context\",\n inspectable: true,\n items: page.map((document) => {\n const item: StudioKnowledgeItem = {\n id: document.id,\n kind: \"static_context\",\n text: document.text,\n };\n if (document.additionalProps !== undefined) {\n item.metadata = jsonObjectFromRecord(document.additionalProps);\n }\n return item;\n }),\n totalCount: staticContext.length,\n };\n if (nextOffset < staticContext.length) result.nextCursor = String(nextOffset);\n return result;\n}\n\nfunction nonInspectablePage(\n agentId: string,\n sourceId: string,\n kind: StudioKnowledgeSourceKind,\n): StudioKnowledgeItemsPage {\n return {\n agentId,\n sourceId,\n kind,\n inspectable: false,\n items: [],\n message: \"This source can be searched at runtime, but it does not expose browseable chunks.\",\n };\n}\n\nfunction dynamicContextItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const text =\n isRecord(item.document) && typeof item.document.text === \"string\"\n ? item.document.text\n : typeof item.document === \"string\"\n ? item.document\n : undefined;\n const result: StudioKnowledgeItem = {\n id: item.id,\n kind: \"dynamic_context\",\n };\n if (text === undefined) result.document = toJsonValue(item.document);\n else result.text = text;\n if (item.metadata !== undefined) result.metadata = jsonObjectFromRecord(item.metadata);\n return result;\n}\n\nfunction dynamicToolItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const document = isRecord(item.document) ? item.document : {};\n const definition = isRecord(document.definition) ? document.definition : {};\n const toolName =\n typeof document.toolName === \"string\"\n ? document.toolName\n : typeof definition.name === \"string\"\n ? definition.name\n : item.id;\n const description = typeof definition.description === \"string\" ? definition.description : \"\";\n const result: StudioKnowledgeItem = {\n id: item.id,\n kind: \"dynamic_tool\",\n toolName,\n description,\n parameterKeys: parameterKeys(definition.parameters),\n document: toJsonValue(item.document),\n };\n if (item.metadata !== undefined) result.metadata = jsonObjectFromRecord(item.metadata);\n return result;\n}\n\nfunction parameterKeys(parameters: unknown): string[] {\n if (!isRecord(parameters) || !isRecord(parameters.properties)) {\n return [];\n }\n return Object.keys(parameters.properties);\n}\n\nfunction staticSourceId(): string {\n return \"static-context\";\n}\n\nfunction dynamicContextSourceId(index: number): string {\n return `dynamic-context-${index}`;\n}\n\nfunction dynamicToolsSourceId(index: number): string {\n return `dynamic-tools-${index}`;\n}\n\nfunction dynamicSourceIndex(\n sourceId: string,\n kind: \"dynamic_context\" | \"dynamic_tools\",\n): number | undefined {\n const prefix = kind === \"dynamic_context\" ? \"dynamic-context-\" : \"dynamic-tools-\";\n if (!sourceId.startsWith(prefix)) {\n return undefined;\n }\n const index = Number(sourceId.slice(prefix.length));\n return Number.isInteger(index) && index >= 0 ? index : undefined;\n}\n\nasync function recentKnowledgeEvidence(\n traceStore: StudioTraceStore | undefined,\n limit: number,\n): Promise<StudioKnowledgeEvidence[]> {\n if (traceStore?.listTraces === undefined) {\n return [];\n }\n\n const store = traceStore;\n const listTraces = store.listTraces;\n if (listTraces === undefined) {\n return [];\n }\n const summaries = await listTraces.call(store, { limit });\n const traces = await Promise.all(\n summaries.map((summary) => Promise.resolve(store.getTrace(summary.id)).catch(() => undefined)),\n );\n return traces.flatMap((trace: StudioTrace | undefined) =>\n trace === undefined ? [] : evidenceFromTrace(trace),\n );\n}\n\nfunction evidenceFromTrace(trace: StudioTrace): StudioKnowledgeEvidence[] {\n return trace.observations.flatMap((observation) => {\n if (observation.kind !== \"generation\" || !isRecord(observation.input)) {\n return [];\n }\n\n const documents = Array.isArray(observation.input.documents)\n ? observation.input.documents.flatMap((document) => evidenceDocument(document))\n : [];\n const tools = Array.isArray(observation.input.tools)\n ? observation.input.tools.flatMap((tool) => evidenceToolName(tool))\n : [];\n if (documents.length === 0 && tools.length === 0) {\n return [];\n }\n\n const query = queryFromGenerationInput(observation.input);\n const evidence: StudioKnowledgeEvidence = {\n traceId: trace.id,\n sessionId: trace.sessionId,\n observationId: observation.id,\n observationName: observation.name,\n turn: observation.turn,\n startedAt: observation.startedAt,\n documentCount: documents.length,\n toolCount: tools.length,\n documents,\n tools,\n };\n if (query !== undefined) evidence.query = query;\n return [evidence];\n });\n}\n\nfunction queryFromGenerationInput(value: Record<string, unknown>): string | undefined {\n const promptText = messageText(value.prompt);\n if (promptText.length > 0) {\n return promptText;\n }\n\n if (Array.isArray(value.chatHistory)) {\n for (let index = value.chatHistory.length - 1; index >= 0; index -= 1) {\n const text = messageText(value.chatHistory[index]);\n if (text.length > 0) {\n return text;\n }\n }\n }\n\n if (Array.isArray(value.history)) {\n for (let index = value.history.length - 1; index >= 0; index -= 1) {\n const text = messageText(value.history[index]);\n if (text.length > 0) {\n return text;\n }\n }\n }\n\n return undefined;\n}\n\nfunction messageText(value: unknown): string {\n if (typeof value === \"string\") {\n return value.trim();\n }\n if (!isRecord(value)) {\n return \"\";\n }\n if (typeof value.text === \"string\") {\n return value.text.trim();\n }\n if (typeof value.content === \"string\") {\n return value.content.trim();\n }\n if (Array.isArray(value.content)) {\n return value.content.map(contentText).filter(Boolean).join(\"\\n\").trim();\n }\n return \"\";\n}\n\nfunction contentText(value: unknown): string {\n if (typeof value === \"string\") {\n return value.trim();\n }\n if (!isRecord(value)) {\n return \"\";\n }\n if (typeof value.text === \"string\") {\n return value.text.trim();\n }\n return \"\";\n}\n\nfunction evidenceDocument(value: unknown): StudioKnowledgeEvidenceDocument[] {\n if (!isRecord(value)) {\n return [];\n }\n const id = typeof value.id === \"string\" ? value.id : undefined;\n const text = typeof value.text === \"string\" ? value.text : undefined;\n const additionalProps = isRecord(value.additionalProps)\n ? jsonObjectFromRecord(value.additionalProps)\n : undefined;\n if (id === undefined && text === undefined && additionalProps === undefined) {\n return [];\n }\n const document: StudioKnowledgeEvidenceDocument = {};\n if (id !== undefined) document.id = id;\n if (text !== undefined) document.text = text;\n if (additionalProps !== undefined) document.additionalProps = additionalProps;\n return [document];\n}\n\nfunction evidenceToolName(value: unknown): string[] {\n if (!isRecord(value) || typeof value.name !== \"string\") {\n return [];\n }\n return [value.name];\n}\n\nfunction jsonObjectFromRecord(value: Record<string, unknown>): JsonObject {\n return compactJsonObject(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, JsonValue | unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { StudioTraceStatus } from \"../types\";\n\nexport function optionalQueryString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\n/**\n * Parse a `limit` query parameter.\n *\n * @param value Raw query-string value.\n * @param defaultMax Default when the parameter is absent.\n * @param max Upper bound (values above are clamped).\n */\nexport function parseLimit(\n value: string | undefined,\n defaultMax = 50,\n max = 100,\n): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return defaultMax;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, max);\n}\n\nexport function parseTraceStatus(value: string | undefined): StudioTraceStatus | undefined | false {\n const status = optionalQueryString(value);\n if (status === undefined) {\n return undefined;\n }\n return status === \"running\" ||\n status === \"success\" ||\n status === \"suspended\" ||\n status === \"error\" ||\n status === \"cancelled\"\n ? status\n : false;\n}\n\n/**\n * Parse an `after` (cursor / sequence) query parameter.\n *\n * Returns `undefined` when absent, `false` when invalid, or the\n * parsed non-negative integer.\n */\nexport function parseAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n","import { getAgentToolState } from \"@anvia/core/internal/agent\";\nimport { isMcpTool } from \"@anvia/core/mcp\";\nimport type { AnyTool } from \"@anvia/core/tool\";\nimport type { StudioAgent, StudioAgentToolApprovalMetadata, StudioAgentToolSource } from \"../types\";\n\nexport type AgentToolItem = {\n tool: AnyTool;\n source: StudioAgentToolSource;\n};\n\nexport function agentToolItems(agent: StudioAgent): AgentToolItem[] {\n const state = getAgentToolState(agent.agent);\n const items: AgentToolItem[] = state.staticTools.map((tool) => ({ tool, source: \"static\" }));\n const names = new Set(items.map(({ tool }) => tool.name));\n\n for (const index of state.toolIndexes) {\n for (const tool of index.tools) {\n if (!names.has(tool.name)) {\n names.add(tool.name);\n items.push({ tool, source: \"dynamic\" });\n }\n }\n }\n\n return items;\n}\n\nexport function approvalMetadata(tool: AnyTool): StudioAgentToolApprovalMetadata {\n const approval = tool.requiresApproval;\n if (approval === undefined || approval === false) {\n return { required: false };\n }\n\n if (typeof approval !== \"object\" || approval === null) {\n return { required: true };\n }\n\n const policy = approval as { reason?: unknown };\n const metadata: StudioAgentToolApprovalMetadata = { required: true };\n if (typeof policy.reason === \"string\") metadata.reason = policy.reason;\n return metadata;\n}\n\nexport function toolRequiresApproval(tool: AnyTool): boolean {\n const approval = tool.requiresApproval;\n return approval !== undefined && approval !== false;\n}\n\nexport function mcpServerName(tool: AnyTool): string | undefined {\n return isMcpTool(tool) ? tool.mcp.serverName : undefined;\n}\n\nexport function agentHasMcpServers(agent: StudioAgent): boolean {\n return agent.agent.mcpServers.length > 0;\n}\n","import { runEvalSuite } from \"@anvia/core/evals\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioEvalRunRequest, StudioEvalRunResponse, StudioEvalSuite } from \"../types\";\nimport { evalConfig } from \"./eval-config\";\nimport { errorResponse } from \"./http\";\nimport { toJsonValue } from \"./json\";\nimport { isJsonObject, isObject, isPositiveInteger } from \"./type-guards\";\n\nexport function registerEvalRoutes(\n app: Hono,\n props: {\n evals: StudioEvalSuite[];\n evalMap: Map<string, StudioEvalSuite>;\n },\n): void {\n app.get(\"/evals\", (c) =>\n c.json({\n evals: props.evals.map(evalConfig),\n }),\n );\n\n app.get(\"/evals/:evalId\", (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n return c.json(evalConfig(suite));\n });\n\n app.post(\"/evals/:evalId/runs\", async (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n\n const body = await parseEvalRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const runOptions: Parameters<typeof runEvalSuite>[0] = { ...suite };\n if (body.concurrency !== undefined) runOptions.concurrency = body.concurrency;\n const result = await runEvalSuite(runOptions);\n const endedAt = Date.now();\n const jsonResult = toJsonValue(result);\n const response: StudioEvalRunResponse = {\n runId,\n suiteId: suite.id ?? suite.name,\n startedAt: new Date(startedAt).toISOString(),\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n result: isJsonObject(jsonResult) ? jsonResult : { value: jsonResult },\n };\n return c.json(response);\n });\n}\n\nasync function parseEvalRunRequest(\n c: Context,\n): Promise<StudioEvalRunRequest | { error: Response }> {\n let body: unknown = {};\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioEvalRunRequest = {};\n if (\"concurrency\" in body) {\n if (!isPositiveInteger(body.concurrency)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"concurrency must be a positive integer\"),\n };\n }\n request.concurrency = body.concurrency;\n }\n return request;\n}\n","import type { GraphExploreOptions, GraphSchemaLike } from \"@anvia/graph\";\nimport { resolveGraphExploreOptions } from \"@anvia/graph/explore\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioGraphExploreRequest, StudioGraphRegistration } from \"../types\";\nimport { graphConfig } from \"./config\";\nimport { errorResponse, parseJsonBody } from \"./http\";\nimport { isObject } from \"./type-guards\";\n\nexport function registerGraphRoutes(\n app: Hono,\n registrations: readonly StudioGraphRegistration[],\n): void {\n const graphs = graphRegistry(registrations);\n app.get(\"/graphs\", (c) => c.json({ graphs: [...graphs.values()].map(graphConfig) }));\n app.post(\"/graphs/:graphId/explore\", async (c) => {\n const registration = graphs.get(c.req.param(\"graphId\"));\n if (registration === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Graph not found\");\n }\n const body = await parseJsonBody(c, (value) => parseExploreRequest(c, value));\n if (\"error\" in body) return body.error;\n const input = exploreOptionsWithSignal(body, c.req.raw.signal);\n let options: ReturnType<typeof resolveGraphExploreOptions>;\n try {\n options = resolveGraphExploreOptions(registration.graph.schema, input);\n } catch (error) {\n return errorResponse(\n c,\n 400,\n \"bad_request\",\n error instanceof Error ? error.message : \"Invalid graph exploration request\",\n );\n }\n return c.json(await registration.graph.explore(options));\n });\n}\n\nfunction graphRegistry(\n registrations: readonly StudioGraphRegistration[],\n): Map<string, StudioGraphRegistration> {\n const graphs = new Map<string, StudioGraphRegistration>();\n for (const registration of registrations) {\n if (typeof registration.id !== \"string\" || registration.id.length === 0) {\n throw new TypeError(\"Studio graph id must be a non-empty string.\");\n }\n if (graphs.has(registration.id)) {\n throw new TypeError(`Duplicate Studio graph id: ${registration.id}.`);\n }\n graphs.set(registration.id, registration);\n }\n return graphs;\n}\n\nfunction parseExploreRequest(\n c: Context,\n value: unknown,\n): StudioGraphExploreRequest | { error: Response } {\n if (!isObject(value) || (value.mode !== \"overview\" && value.mode !== \"expand\")) {\n return { error: errorResponse(c, 400, \"bad_request\", \"mode must be overview or expand\") };\n }\n const common = parseCommonOptions(c, value);\n if (\"error\" in common) return common;\n if (value.mode === \"overview\") return { ...common, mode: \"overview\" };\n const nodeIds = stringList(value.nodeIds);\n if (nodeIds === undefined) {\n return { error: errorResponse(c, 400, \"bad_request\", \"nodeIds must be a string array\") };\n }\n const request: Extract<StudioGraphExploreRequest, { mode: \"expand\" }> = {\n ...common,\n mode: \"expand\",\n nodeIds,\n };\n if (\n value.direction === \"outgoing\" ||\n value.direction === \"incoming\" ||\n value.direction === \"both\"\n ) {\n request.direction = value.direction;\n } else if (value.direction !== undefined) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"direction must be outgoing, incoming, or both\"),\n };\n }\n if (typeof value.maxDepth === \"number\") request.maxDepth = value.maxDepth;\n else if (value.maxDepth !== undefined) {\n return { error: errorResponse(c, 400, \"bad_request\", \"maxDepth must be a number\") };\n }\n return request;\n}\n\nfunction parseCommonOptions(\n c: Context,\n value: Record<string, unknown>,\n):\n | Omit<StudioGraphExploreRequest, \"mode\" | \"nodeIds\" | \"direction\" | \"maxDepth\">\n | {\n error: Response;\n } {\n const request: {\n nodeTypes?: string[];\n relationships?: string[];\n maxNodes?: number;\n maxRelationships?: number;\n } = {};\n for (const [key, label] of [\n [\"nodeTypes\", \"nodeTypes\"],\n [\"relationships\", \"relationships\"],\n ] as const) {\n const selected = value[key];\n if (selected === undefined) continue;\n const values = stringList(selected);\n if (values === undefined) {\n return { error: errorResponse(c, 400, \"bad_request\", `${label} must be a string array`) };\n }\n request[key] = values;\n }\n for (const [key, label] of [\n [\"maxNodes\", \"maxNodes\"],\n [\"maxRelationships\", \"maxRelationships\"],\n ] as const) {\n const selected = value[key];\n if (selected === undefined) continue;\n if (typeof selected !== \"number\") {\n return { error: errorResponse(c, 400, \"bad_request\", `${label} must be a number`) };\n }\n request[key] = selected;\n }\n return request;\n}\n\nfunction exploreOptionsWithSignal(\n request: StudioGraphExploreRequest,\n abortSignal: AbortSignal,\n): GraphExploreOptions<GraphSchemaLike> {\n return { ...request, abortSignal };\n}\n\nfunction stringList(value: unknown): string[] | undefined {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) return undefined;\n return value;\n}\n","import {\n type AgentContinuation,\n type AgentInteractionResponse,\n assertAgentInteractionResponse,\n} from \"@anvia/core/agent/interactions\";\n\nexport type StudioContinuationRegistration<Context> = Readonly<{\n continuation: AgentContinuation;\n context: Context;\n}>;\n\nexport type StudioContinuationRegistry<Context> = {\n register(registration: StudioContinuationRegistration<Context>): void;\n take(\n interactionId: string,\n agentId: string,\n response: AgentInteractionResponse,\n ):\n | Readonly<{ status: \"missing\" }>\n | Readonly<{ status: \"claimed\" }>\n | Readonly<{ status: \"invalid\"; error: TypeError }>\n | Readonly<{\n status: \"ready\";\n registration: StudioContinuationRegistration<Context>;\n }>;\n clear(): void;\n};\n\nexport function createStudioContinuationRegistry<Context>(): StudioContinuationRegistry<Context> {\n const pending = new Map<string, StudioContinuationRegistration<Context>>();\n const claimed = new Set<string>();\n return {\n register(registration) {\n const id = registration.continuation.interaction.id;\n if (pending.has(id) || claimed.has(id)) {\n throw new TypeError(`Duplicate Studio interaction ID \"${id}\".`);\n }\n pending.set(id, registration);\n },\n take(interactionId, agentId, response) {\n if (claimed.has(interactionId)) return { status: \"claimed\" };\n const registration = pending.get(interactionId);\n if (registration === undefined || registration.continuation.agentId !== agentId) {\n return { status: \"missing\" };\n }\n const request = registration.continuation.interaction;\n try {\n assertAgentInteractionResponse(request, response);\n } catch (error) {\n return {\n status: \"invalid\",\n error: error instanceof TypeError ? error : new TypeError(String(error)),\n };\n }\n pending.delete(interactionId);\n claimed.add(interactionId);\n return { status: \"ready\", registration };\n },\n clear() {\n pending.clear();\n claimed.clear();\n },\n };\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentMcpServerMetadata,\n StudioAgentMcpToolMetadata,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { approvalMetadata } from \"./tool-metadata\";\n\nexport function registerMcpRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/mcps\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n servers: await agentMcpMetadata(agent),\n });\n });\n}\n\nexport async function agentMcpMetadata(\n agent: StudioAgent,\n): Promise<StudioAgentMcpServerMetadata[]> {\n return Promise.all(\n agent.agent.mcpServers.map(async (server) => {\n const tools: StudioAgentMcpToolMetadata[] = await Promise.all(\n server.tools.map(async (tool) => {\n const definition = await tool.definition(\"\");\n return {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source: \"static\" as const,\n approval: approvalMetadata(tool),\n };\n }),\n );\n const sortedTools = tools.sort((left, right) => left.name.localeCompare(right.name));\n return {\n agentId: agent.id,\n name: server.name,\n toolCount: sortedTools.length,\n tools: sortedTools,\n };\n }),\n ).then((servers) => servers.sort((left, right) => left.name.localeCompare(right.name)));\n}\n","import type {\n MemoryConversation,\n MemoryConversationListOptions,\n MemoryConversationSummary,\n MemoryInspector,\n MemoryStore,\n} from \"@anvia/core/memory\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioMemoryConversationMessages,\n StudioMemoryConversationSteps,\n StudioMemoryConversationSummary,\n StudioMemoryConversationsPage,\n StudioMemoryMessageRecord,\n StudioMemorySourceConversationMessages,\n StudioMemorySourceConversationSteps,\n StudioMemorySourceConversationSummary,\n StudioMemorySourceConversationsPage,\n StudioMemorySourceSummary,\n StudioMemorySourcesPage,\n StudioMemorySourceUsersPage,\n StudioMemoryUsersPage,\n StudioSession,\n StudioSessionStore,\n StudioSessionSummary,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString, parseLimit } from \"./query\";\nimport { transcriptFromMessages } from \"./transcript\";\n\nconst DEFAULT_USER_ID = \"default\";\nconst USER_DISCOVERY_LIMIT = 1_000;\n\ntype StudioMemorySourceDetail = {\n conversation: StudioMemorySourceConversationSummary;\n records: StudioMemoryMessageRecord[];\n};\n\ntype StudioMemorySource = {\n summary: StudioMemorySourceSummary;\n listConversations(\n options: MemoryConversationListOptions,\n ): Promise<StudioMemorySourceConversationSummary[]>;\n getConversation(ref: string): Promise<StudioMemorySourceDetail | undefined>;\n};\n\nexport type StudioMemorySourceRegistry = {\n readonly size: number;\n list(): StudioMemorySourceSummary[];\n get(ref: string): StudioMemorySource | undefined;\n};\n\nexport function createStudioMemorySourceRegistry(\n agents: StudioAgent[],\n sessionStore: StudioSessionStore | undefined,\n): StudioMemorySourceRegistry {\n const sources: StudioMemorySource[] = [];\n const byStore = new Map<MemoryStore, StudioMemorySource>();\n const agentsWithoutMemory: StudioAgent[] = [];\n\n for (const agent of agents) {\n const store = agent.agent.memory?.store;\n if (store === undefined) {\n agentsWithoutMemory.push(agent);\n continue;\n }\n\n const existing = byStore.get(store);\n if (existing !== undefined) {\n existing.summary.agentIds.push(agent.id);\n existing.summary.label = \"Shared agent memory\";\n continue;\n }\n\n const ref = `agent-memory-${sources.length + 1}`;\n const label = `${agent.name ?? agent.agent.name ?? agent.id} memory`;\n const kind = storeKind(store);\n const source =\n store.inspector === undefined\n ? unavailableAgentSource(ref, label, agent.id, kind)\n : agentMemorySource(ref, label, agent.id, kind, store.inspector);\n sources.push(source);\n byStore.set(store, source);\n }\n\n if (sessionStore !== undefined && (agentsWithoutMemory.length > 0 || agents.length === 0)) {\n sources.push(\n studioSessionSource(\n sessionStore,\n agentsWithoutMemory.map((agent) => agent.id),\n ),\n );\n }\n\n const byRef = new Map(sources.map((source) => [source.summary.ref, source]));\n return {\n size: sources.length,\n list: () =>\n sources.map((source) => ({ ...source.summary, agentIds: [...source.summary.agentIds] })),\n get: (ref) => byRef.get(ref),\n };\n}\n\nexport function registerMemoryRoutes(\n app: Hono,\n props: {\n sources: StudioMemorySourceRegistry;\n sessionStore?: StudioSessionStore | undefined;\n },\n): void {\n registerMemorySourceRoutes(app, props.sources);\n if (props.sessionStore !== undefined) {\n registerLegacyMemoryRoutes(app, props.sessionStore);\n }\n}\n\nfunction registerMemorySourceRoutes(app: Hono, registry: StudioMemorySourceRegistry): void {\n app.get(\"/memory/sources\", (c) =>\n c.json({ sources: registry.list() } satisfies StudioMemorySourcesPage),\n );\n\n app.get(\"/memory/sources/:sourceRef/users\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const conversations = await source.listConversations({ limit: USER_DISCOVERY_LIMIT });\n const userPage = memoryUsers(conversations, limit);\n return c.json({\n source: source.summary,\n users: userPage.users,\n total: userPage.total,\n } satisfies StudioMemorySourceUsersPage);\n });\n\n app.get(\"/memory/sources/:sourceRef/conversations\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const userId = optionalQueryString(c.req.query(\"userId\"));\n const listOptions: MemoryConversationListOptions = { limit };\n if (userId !== undefined) listOptions.userId = userId;\n const conversations = await source.listConversations(listOptions);\n return c.json({\n source: source.summary,\n conversations,\n total: conversations.length,\n } satisfies StudioMemorySourceConversationsPage);\n });\n\n app.get(\"/memory/sources/:sourceRef/conversations/:conversationRef/messages\", async (c) => {\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const detail = await source.getConversation(c.req.param(\"conversationRef\"));\n if (detail === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n const messages = detail.records.map((record) => record.message);\n return c.json({\n source: source.summary,\n conversation: detail.conversation,\n messages,\n records: detail.records,\n transcript: transcriptFromMessages(messages),\n } satisfies StudioMemorySourceConversationMessages);\n });\n\n app.get(\"/memory/sources/:sourceRef/conversations/:conversationRef/steps\", async (c) => {\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const detail = await source.getConversation(c.req.param(\"conversationRef\"));\n if (detail === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n source: source.summary,\n conversation: detail.conversation,\n steps: transcriptFromMessages(detail.records.map((record) => record.message)),\n } satisfies StudioMemorySourceConversationSteps);\n });\n}\n\nfunction registerLegacyMemoryRoutes(app: Hono, sessionStore: StudioSessionStore): void {\n app.get(\"/memory/users\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const sessions = await sessionStore.listSessions({ limit: 100 });\n const users = new Map<string, StudioMemoryUsersPage[\"users\"][number]>();\n for (const session of sessions) {\n const userId = sessionUserId(session);\n const existing = users.get(userId);\n if (existing === undefined) {\n users.set(userId, {\n userId,\n conversationCount: 1,\n agentIds: [session.agentId],\n lastInteractionAt: session.updatedAt,\n });\n continue;\n }\n existing.conversationCount += 1;\n if (!existing.agentIds.includes(session.agentId)) existing.agentIds.push(session.agentId);\n if (new Date(session.updatedAt).getTime() > new Date(existing.lastInteractionAt).getTime()) {\n existing.lastInteractionAt = session.updatedAt;\n }\n }\n\n const page = [...users.values()]\n .sort(\n (left, right) =>\n new Date(right.lastInteractionAt).getTime() - new Date(left.lastInteractionAt).getTime(),\n )\n .slice(0, limit);\n return c.json({ users: page, total: users.size } satisfies StudioMemoryUsersPage);\n });\n\n app.get(\"/memory/conversations\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const userId = optionalQueryString(c.req.query(\"userId\"));\n const listInput: Parameters<typeof sessionStore.listSessions>[0] = { limit: 100 };\n if (agentId !== undefined) listInput.agentId = agentId;\n const sessions = await sessionStore.listSessions(listInput);\n const conversations = sessions\n .map(memoryConversationSummary)\n .filter((session) => userId === undefined || session.userId === userId)\n .slice(0, limit);\n\n return c.json({\n conversations,\n total: conversations.length,\n } satisfies StudioMemoryConversationsPage);\n });\n\n app.get(\"/memory/conversations/:conversationId/messages\", async (c) => {\n const session = await sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n messages: session.messages,\n transcript: session.transcript,\n } satisfies StudioMemoryConversationMessages);\n });\n\n app.get(\"/memory/conversations/:conversationId/steps\", async (c) => {\n const session = await sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n steps: session.transcript,\n } satisfies StudioMemoryConversationSteps);\n });\n}\n\nfunction agentMemorySource(\n ref: string,\n label: string,\n agentId: string,\n storeKindValue: string | undefined,\n inspector: MemoryInspector,\n): StudioMemorySource {\n const summary: StudioMemorySourceSummary = {\n ref,\n kind: \"agent\",\n label,\n agentIds: [agentId],\n available: true,\n };\n if (storeKindValue !== undefined) summary.storeKind = storeKindValue;\n\n return {\n summary,\n async listConversations(options) {\n const inspectorOptions: MemoryConversationListOptions = {\n limit: options.userId === DEFAULT_USER_ID ? USER_DISCOVERY_LIMIT : options.limit,\n };\n if (options.userId !== undefined && options.userId !== DEFAULT_USER_ID) {\n inspectorOptions.userId = options.userId;\n }\n const conversations = await inspector.listConversations(inspectorOptions);\n return conversations\n .map((conversation) => sourceConversationSummary(conversation, summary.agentIds))\n .filter(\n (conversation) => options.userId === undefined || conversation.userId === options.userId,\n )\n .slice(0, options.limit);\n },\n async getConversation(conversationRef) {\n const conversation = await inspector.getConversation({ ref: conversationRef });\n return conversation === undefined\n ? undefined\n : inspectorConversationDetail(conversation, summary.agentIds);\n },\n };\n}\n\nfunction unavailableAgentSource(\n ref: string,\n label: string,\n agentId: string,\n storeKindValue: string | undefined,\n): StudioMemorySource {\n const summary: StudioMemorySourceSummary = {\n ref,\n kind: \"agent\",\n label,\n agentIds: [agentId],\n available: false,\n reason: \"This memory store does not expose the optional inspector capability.\",\n };\n if (storeKindValue !== undefined) summary.storeKind = storeKindValue;\n return {\n summary,\n listConversations: async () => [],\n getConversation: async () => undefined,\n };\n}\n\nfunction studioSessionSource(\n sessionStore: StudioSessionStore,\n agentIds: string[],\n): StudioMemorySource {\n const summary: StudioMemorySourceSummary = {\n ref: \"studio-sessions\",\n kind: \"studio\",\n label: \"Studio sessions\",\n agentIds: [...agentIds],\n available: true,\n storeKind: sessionStore.kind ?? \"studio\",\n };\n const allowedAgents = new Set(agentIds);\n const restrictAgents = allowedAgents.size > 0;\n\n return {\n summary,\n async listConversations(options) {\n const sessions = await sessionStore.listSessions({ limit: USER_DISCOVERY_LIMIT });\n return sessions\n .filter((session) => !restrictAgents || allowedAgents.has(session.agentId))\n .map(studioSourceConversationSummary)\n .filter(\n (conversation) => options.userId === undefined || conversation.userId === options.userId,\n )\n .slice(0, options.limit);\n },\n async getConversation(conversationRef) {\n const session = await sessionStore.getSession(conversationRef);\n if (session === undefined || (restrictAgents && !allowedAgents.has(session.agentId))) {\n return undefined;\n }\n return {\n conversation: studioSourceConversationSummary(session),\n records: session.messages.map((message, position) => ({\n position,\n runId: \"studio-session\",\n turn: 0,\n createdAt: session.updatedAt,\n message,\n })),\n };\n },\n };\n}\n\nfunction sourceConversationSummary(\n conversation: MemoryConversationSummary,\n agentIds: string[],\n): StudioMemorySourceConversationSummary {\n const summary: StudioMemorySourceConversationSummary = {\n ref: conversation.ref,\n sessionId: conversation.sessionId,\n userId: conversation.userId ?? DEFAULT_USER_ID,\n agentIds: [...agentIds],\n createdAt: conversation.createdAt,\n updatedAt: conversation.updatedAt,\n messageCount: conversation.messageCount,\n };\n if (conversation.metadata !== undefined) summary.metadata = conversation.metadata;\n return summary;\n}\n\nfunction inspectorConversationDetail(\n conversation: MemoryConversation,\n agentIds: string[],\n): StudioMemorySourceDetail {\n return {\n conversation: sourceConversationSummary(conversation, agentIds),\n records: conversation.messages,\n };\n}\n\nfunction studioSourceConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemorySourceConversationSummary {\n const summary: StudioMemorySourceConversationSummary = {\n ref: session.id,\n sessionId: session.id,\n userId: sessionUserId(session),\n agentIds: [session.agentId],\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n };\n if (session.title !== undefined) summary.title = session.title;\n if (session.metadata !== undefined) summary.metadata = session.metadata;\n return summary;\n}\n\nfunction memoryUsers(\n conversations: StudioMemorySourceConversationSummary[],\n limit: number,\n): { users: StudioMemoryUsersPage[\"users\"]; total: number } {\n const users = new Map<string, StudioMemoryUsersPage[\"users\"][number]>();\n for (const conversation of conversations) {\n const existing = users.get(conversation.userId);\n if (existing === undefined) {\n users.set(conversation.userId, {\n userId: conversation.userId,\n conversationCount: 1,\n agentIds: [...conversation.agentIds],\n lastInteractionAt: conversation.updatedAt,\n });\n continue;\n }\n existing.conversationCount += 1;\n for (const agentId of conversation.agentIds) {\n if (!existing.agentIds.includes(agentId)) existing.agentIds.push(agentId);\n }\n if (\n new Date(conversation.updatedAt).getTime() > new Date(existing.lastInteractionAt).getTime()\n ) {\n existing.lastInteractionAt = conversation.updatedAt;\n }\n }\n return {\n users: [...users.values()]\n .sort(\n (left, right) =>\n new Date(right.lastInteractionAt).getTime() - new Date(left.lastInteractionAt).getTime(),\n )\n .slice(0, limit),\n total: users.size,\n };\n}\n\nfunction memoryConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemoryConversationSummary {\n const summary: StudioMemoryConversationSummary = {\n id: session.id,\n userId: sessionUserId(session),\n agentId: session.agentId,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n };\n if (session.title !== undefined) summary.title = session.title;\n if (session.metadata !== undefined) summary.metadata = session.metadata;\n return summary;\n}\n\nfunction sessionUserId(session: Pick<StudioSession, \"metadata\">): string {\n const userId = session.metadata?.userId;\n return typeof userId === \"string\" && userId.trim().length > 0 ? userId : DEFAULT_USER_ID;\n}\n\nfunction storeKind(store: MemoryStore): string | undefined {\n const kind = (store as MemoryStore & { readonly kind?: unknown }).kind;\n return typeof kind === \"string\" && kind.length > 0 ? kind : undefined;\n}\n\nfunction unavailableSourceResponse(\n c: Parameters<typeof errorResponse>[0],\n source: StudioMemorySourceSummary,\n): Response {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n source.reason ?? \"Memory source is not inspectable\",\n { sourceRef: source.ref },\n );\n}\n","import { type JsonObject, type JsonValue, Usage } from \"@anvia/core/completion\";\nimport type { PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioPipeline,\n StudioPipelineDetail,\n StudioPipelineLogStore,\n StudioPipelineReplayRequest,\n StudioPipelineRunRequest,\n StudioPipelineRunResponse,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n} from \"../types\";\nimport { pipelineConfig } from \"./config\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { toJsonValue } from \"./json\";\nimport {\n appendPipelineLog,\n emitPipelineLog,\n pipelineRunCompletedLog,\n pipelineRunFailedLog,\n pipelineRunReceivedLog,\n pipelineRunStartedLog,\n pipelineStageLog,\n} from \"./pipeline-logs\";\nimport { AsyncEventQueue } from \"./runs\";\nimport type { StudioRunLease, StudioRunLifecycle } from \"./run-lifecycle\";\nimport { streamStudioJsonl } from \"./streams\";\nimport { isJsonObject, isJsonValue, isObject } from \"./type-guards\";\n\nexport function registerPipelineRoutes(\n app: Hono,\n props: {\n pipelines: StudioPipeline[];\n pipelineMap: Map<string, StudioPipeline>;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n runLifecycle: StudioRunLifecycle;\n },\n): void {\n app.get(\"/pipelines\", (c) =>\n c.json({\n pipelines: props.pipelines.map(pipelineConfig),\n }),\n );\n\n app.get(\"/pipelines/:pipelineId\", (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n return c.json(pipelineDetail(pipeline));\n });\n\n app.get(\"/pipelines/:pipelineId/logs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.logStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.logs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"logs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parsePipelineLogAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const listInput: Parameters<typeof props.logStore.listPipelineLogs>[0] = {\n pipelineId,\n limit,\n };\n if (after !== undefined) listInput.after = after;\n const logs = await props.logStore.listPipelineLogs(listInput);\n const last = logs.at(-1);\n const response: { logs: typeof logs; nextCursor?: number } = { logs };\n if (logs.length === limit && last !== undefined) response.nextCursor = last.sequence;\n return c.json(response);\n });\n\n app.get(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const runs = await props.runStore.listPipelineRuns({ pipelineId, limit });\n return c.json({ runs });\n });\n\n app.post(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n\n const body = await parsePipelineRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n return executeTrackedPipelineRun(c, props, pipeline, body);\n });\n\n app.post(\"/pipelines/:pipelineId/runs/:runId/replay\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const body = await parsePipelineReplayRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const sourceRunId = c.req.param(\"runId\");\n const sourceRun = await props.runStore.getPipelineRun({\n pipelineId: pipeline.id,\n runId: sourceRunId,\n });\n if (sourceRun === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline run not found\");\n }\n if (sourceRun.status === \"running\") {\n return errorResponse(c, 409, \"conflict\", \"Cannot replay a running pipeline run\");\n }\n\n const replayRequest: StudioPipelineRunRequest = {\n input: sourceRun.input,\n metadata: replayMetadata(sourceRun.metadata, body.metadata, sourceRun.runId),\n };\n if (body.stream !== undefined) replayRequest.stream = body.stream;\n return executeTrackedPipelineRun(c, props, pipeline, replayRequest);\n });\n}\n\nasync function executeTrackedPipelineRun(\n c: Context,\n props: {\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n runLifecycle: StudioRunLifecycle;\n },\n pipeline: StudioPipeline,\n body: StudioPipelineRunRequest,\n): Promise<Response> {\n const lease = props.runLifecycle.start(c.req.raw.signal);\n if (lease === undefined) {\n return errorResponse(c, 503, \"service_unavailable\", \"Anvia Studio is shutting down\");\n }\n try {\n return await executePipelineRun(c, props, pipeline, body, lease);\n } catch (error) {\n lease.finish();\n throw error;\n }\n}\n\nasync function executePipelineRun(\n c: Context,\n props: {\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n pipeline: StudioPipeline,\n body: StudioPipelineRunRequest,\n lease: StudioRunLease,\n): Promise<Response> {\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const startedAtIso = new Date(startedAt).toISOString();\n const receivedInput: Parameters<typeof pipelineRunReceivedLog>[0] = {\n pipeline,\n runId,\n stream: body.stream === true,\n input: body.input,\n };\n if (body.metadata !== undefined) receivedInput.metadata = body.metadata;\n await appendPipelineLog(props.logStore, pipelineRunReceivedLog(receivedInput));\n const runningRecord: StudioPipelineRunSaveInput = {\n runId,\n pipelineId: pipeline.id,\n status: \"running\",\n input: body.input,\n startedAt: startedAtIso,\n };\n if (body.metadata !== undefined) runningRecord.metadata = body.metadata;\n await savePipelineRun(props.runStore, runningRecord);\n\n if (body.stream === true) {\n const streamOptions: Parameters<typeof streamPipelineRun>[1] = {\n pipeline,\n runId,\n input: body.input,\n startedAt,\n startedAtIso,\n onFinish: lease.finish,\n };\n if (body.metadata !== undefined) streamOptions.metadata = body.metadata;\n if (props.logStore !== undefined) streamOptions.logStore = props.logStore;\n if (props.runStore !== undefined) streamOptions.runStore = props.runStore;\n streamOptions.abortSignal = lease.abortSignal;\n return streamPipelineRun(c, streamOptions);\n }\n\n try {\n await appendPipelineLog(props.logStore, pipelineRunStartedLog(pipeline, runId));\n const result = await pipeline.pipeline.run({\n input: body.input,\n runId,\n metadata: body.metadata,\n abortSignal: lease.abortSignal,\n observer: {\n async onEvent(event) {\n await appendPipelineLog(props.logStore, pipelineStageLog(event, pipeline.id));\n },\n },\n failOnObserverError: true,\n });\n const output = result.output;\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n const successRecord: StudioPipelineRunSaveInput = {\n runId,\n pipelineId: pipeline.id,\n status: \"success\",\n input: body.input,\n output: jsonOutput,\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n };\n if (body.metadata !== undefined) successRecord.metadata = body.metadata;\n await savePipelineRun(props.runStore, successRecord);\n await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: pipeline.id,\n runId,\n durationMs: endedAt - startedAt,\n output: jsonOutput,\n }),\n );\n const response: StudioPipelineRunResponse = {\n runId,\n pipelineId: pipeline.id,\n output: jsonOutput,\n };\n return c.json(response);\n } catch (error) {\n const endedAt = Date.now();\n const errorRecord: StudioPipelineRunSaveInput = {\n runId,\n pipelineId: pipeline.id,\n status: \"error\",\n input: body.input,\n error: serializeError(error),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n };\n if (body.metadata !== undefined) errorRecord.metadata = body.metadata;\n await savePipelineRun(props.runStore, errorRecord);\n await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(pipeline.id, runId, error, startedAt),\n );\n return errorResponse(c, 500, \"internal_error\", \"Pipeline run failed\", serializeError(error));\n } finally {\n lease.finish();\n }\n}\n\nfunction pipelineDetail(pipeline: StudioPipeline): StudioPipelineDetail {\n const graph = pipeline.pipeline.graph();\n graph.id = pipeline.id;\n return {\n ...pipelineConfig(pipeline),\n graph,\n };\n}\n\nfunction streamPipelineRun(\n _c: Context,\n props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n abortSignal?: AbortSignal;\n onFinish: () => void;\n },\n): Response {\n return streamStudioJsonl(pipelineRunEvents(props));\n}\n\nasync function* pipelineRunEvents(props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n abortSignal?: AbortSignal;\n onFinish: () => void;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitPipelineLog(props.logStore, pipelineRunStartedLog(props.pipeline, props.runId));\n\n const events = new AsyncEventQueue<AgentRunStreamEvent>();\n const run = props.pipeline.pipeline\n .run({\n input: props.input,\n runId: props.runId,\n metadata: props.metadata,\n abortSignal: props.abortSignal,\n observer: {\n async onEvent(event: PipelineRunEvent) {\n const log = await appendPipelineLog(\n props.logStore,\n pipelineStageLog(event, props.pipeline.id),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n },\n },\n failOnObserverError: true,\n })\n .then(async ({ output }) => {\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n const successRecord: StudioPipelineRunSaveInput = {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"success\",\n input: props.input,\n output: jsonOutput,\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n };\n if (props.metadata !== undefined) successRecord.metadata = props.metadata;\n await savePipelineRun(props.runStore, successRecord);\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: props.pipeline.id,\n runId: props.runId,\n durationMs: endedAt - props.startedAt,\n output: jsonOutput,\n }),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({\n type: \"pipeline_final\",\n runId: props.runId,\n pipelineId: props.pipeline.id,\n output: jsonOutput,\n });\n })\n .catch(async (error) => {\n const endedAt = Date.now();\n const errorRecord: StudioPipelineRunSaveInput = {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"error\",\n input: props.input,\n error: serializeError(error),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n };\n if (props.metadata !== undefined) errorRecord.metadata = props.metadata;\n await savePipelineRun(props.runStore, errorRecord);\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(props.pipeline.id, props.runId, error, props.startedAt),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({ type: \"error\", error: serializeError(error), usage: Usage.empty() });\n })\n .finally(() => events.close());\n\n try {\n while (true) {\n const next = await events.next();\n if (next.done === true) {\n break;\n }\n yield next.value;\n }\n } finally {\n try {\n await run;\n } finally {\n props.onFinish();\n }\n }\n}\n\nasync function savePipelineRun(\n store: StudioPipelineRunStore | undefined,\n input: StudioPipelineRunSaveInput,\n) {\n return store?.savePipelineRun(input);\n}\n\nasync function parsePipelineRunRequest(\n c: Context,\n): Promise<StudioPipelineRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n if (!(\"input\" in body) || !isJsonValue(body.input)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"input must be JSON-compatible\") };\n }\n\n const request: StudioPipelineRunRequest = {\n input: body.input,\n };\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nasync function parsePipelineReplayRequest(\n c: Context,\n): Promise<StudioPipelineReplayRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioPipelineReplayRequest = {};\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nfunction replayMetadata(\n sourceMetadata: JsonObject | undefined,\n requestMetadata: JsonObject | undefined,\n sourceRunId: string,\n): JsonObject {\n const metadata: JsonObject = {};\n Object.assign(metadata, sourceMetadata, requestMetadata);\n metadata.replayOf = sourceRunId;\n return metadata;\n}\n\nfunction parsePipelineLogLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 200;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 1000);\n}\n\nfunction parsePipelineLogAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { PipelineGraphNode, PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type {\n StudioPipeline,\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogStore,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { formatUnknown } from \"./json\";\n\nexport async function appendPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): Promise<StudioPipelineLogEntry | undefined> {\n return store?.appendPipelineLog(input);\n}\n\nexport async function* emitPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): AsyncIterable<{ type: \"pipeline_log\"; log: StudioPipelineLogEntry }> {\n const log = await appendPipelineLog(store, input);\n if (log !== undefined) {\n yield { type: \"pipeline_log\", log };\n }\n}\n\nexport function pipelineRunReceivedLog(props: {\n pipeline: StudioPipeline;\n runId: string;\n stream: boolean;\n input: unknown;\n metadata?: JsonObject;\n}): StudioPipelineLogAppendInput {\n const metadata: JsonObject = {\n stream: props.stream,\n metadataKeys: Object.keys(props.metadata ?? {}),\n };\n const inputBytes = byteLength(formatUnknown(props.input));\n if (inputBytes !== undefined) metadata.inputBytes = inputBytes;\n return {\n pipelineId: props.pipeline.id,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"pipeline.run_received\",\n message: \"Pipeline run request received\",\n metadata,\n };\n}\n\nexport function pipelineRunStartedLog(\n pipeline: StudioPipeline,\n runId: string,\n): StudioPipelineLogAppendInput {\n const graph = pipeline.pipeline.graph();\n return {\n pipelineId: pipeline.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_started\",\n message: \"Pipeline run started\",\n metadata: {\n stageCount: graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\")\n .length,\n edgeCount: graph.edges.length,\n },\n };\n}\n\nexport function pipelineRunCompletedLog(props: {\n pipelineId: string;\n runId: string;\n durationMs: number;\n output: unknown;\n}): StudioPipelineLogAppendInput {\n const metadata: JsonObject = { durationMs: props.durationMs };\n const outputBytes = byteLength(formatUnknown(props.output));\n if (outputBytes !== undefined) metadata.outputBytes = outputBytes;\n return {\n pipelineId: props.pipelineId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_completed\",\n message: \"Pipeline run completed\",\n metadata,\n };\n}\n\nexport function pipelineRunFailedLog(\n pipelineId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioPipelineLogAppendInput {\n return {\n pipelineId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"pipeline.run_failed\",\n message: \"Pipeline run failed\",\n metadata: {\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n },\n };\n}\n\nexport function pipelineStageLog(\n event: PipelineRunEvent,\n studioPipelineId: string = event.pipelineId,\n): StudioPipelineLogAppendInput {\n const category = stageCategory(event.node);\n if (event.type === \"stage_started\") {\n return {\n pipelineId: studioPipelineId,\n runId: event.runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.started`,\n message: `${event.node.label} started`,\n metadata: nodeMetadata(event.node),\n };\n }\n if (event.type === \"stage_completed\") {\n return {\n pipelineId: studioPipelineId,\n runId: event.runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.completed`,\n message: `${event.node.label} completed`,\n metadata: {\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n },\n };\n }\n return {\n pipelineId: studioPipelineId,\n runId: event.runId,\n level: \"error\",\n category,\n event: `${event.node.kind}.failed`,\n message: `${event.node.label} failed`,\n metadata: {\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n error: serializeError(event.error),\n },\n };\n}\n\nfunction stageCategory(node: PipelineGraphNode): StudioPipelineLogAppendInput[\"category\"] {\n if (node.kind === \"parallel\" || node.kind === \"branch\") {\n return \"parallel\";\n }\n if (node.kind === \"agent\") {\n return \"agent\";\n }\n if (node.kind === \"extractor\") {\n return \"extractor\";\n }\n return \"stage\";\n}\n\nfunction nodeMetadata(node: PipelineGraphNode): JsonObject {\n const metadata: JsonObject = {\n nodeId: node.id,\n nodePath: [...node.path],\n kind: node.kind,\n label: node.label,\n };\n if (node.agentId !== undefined) metadata.agentId = node.agentId;\n if (node.pipelineId !== undefined) metadata.pipelineId = node.pipelineId;\n if (node.branchKey !== undefined) metadata.branchKey = node.branchKey;\n return metadata;\n}\n\nfunction byteLength(value: string | undefined): number | undefined {\n return value === undefined ? undefined : new TextEncoder().encode(value).length;\n}\n","export type StudioRunLease = {\n readonly abortSignal: AbortSignal;\n finish(): void;\n};\n\nexport class StudioRunLifecycle {\n private readonly shutdownController = new AbortController();\n private readonly active = new Set<symbol>();\n private drainPromise: Promise<void> | undefined;\n private resolveDrain: (() => void) | undefined;\n private closed = false;\n\n start(requestSignal: AbortSignal): StudioRunLease | undefined {\n if (this.closed) return undefined;\n\n const token = Symbol(\"studio-run\");\n this.active.add(token);\n let finished = false;\n return {\n abortSignal: AbortSignal.any([requestSignal, this.shutdownController.signal]),\n finish: () => {\n if (finished) return;\n finished = true;\n this.active.delete(token);\n if (this.active.size === 0) {\n this.resolveDrain?.();\n this.resolveDrain = undefined;\n this.drainPromise = undefined;\n }\n },\n };\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.shutdownController.abort(new Error(\"Anvia Studio is shutting down.\"));\n }\n\n async drain(timeoutMs: number): Promise<void> {\n this.close();\n if (this.active.size === 0) return;\n\n this.drainPromise ??= new Promise<void>((resolve) => {\n this.resolveDrain = resolve;\n });\n await withTimeout(this.drainPromise, timeoutMs);\n }\n}\n\nasync function withTimeout(promise: Promise<void>, timeoutMs: number): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Anvia Studio shutdown timed out after ${timeoutMs}ms.`)),\n timeoutMs,\n );\n });\n try {\n await Promise.race([promise, timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n","import { upgradeWebSocket } from \"@hono/node-server\";\nimport { getConnInfo } from \"@hono/node-server/conninfo\";\nimport type { Context, Hono } from \"hono\";\nimport type { WSContext, WSEvents } from \"hono/ws\";\nimport { WebSocket } from \"ws\";\nimport type {\n StudioSandboxViewConnection,\n StudioSandboxViewControlLease,\n StudioSandboxViewRegistration,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport type { StudioSandboxRegistry, StudioSandboxRegistryEntry } from \"./sandboxes\";\n\nconst minLeaseTimeoutMs = 5_000;\nconst maxLeaseTimeoutMs = 120_000;\nconst maxPendingWebSocketBytes = 1024 * 1024;\n\ntype ResolvedView = {\n entry: StudioSandboxRegistryEntry;\n view: StudioSandboxViewRegistration;\n host: string;\n port: number;\n};\n\nexport function registerSandboxViewRoutes(app: Hono, registry: StudioSandboxRegistry): () => void {\n const leases = new Map<string, StudioSandboxViewControlLease>();\n const upstreamSockets = new Set<WebSocket>();\n\n app.get(\"/sandboxes/:sandboxRef/views/:viewId/control\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n pruneExpiredLease(leases, viewKey(resolved));\n return c.json(resolved.view.source.control.snapshot());\n });\n\n app.get(\"/sandboxes/:sandboxRef/views/:viewId/connection\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const response: StudioSandboxViewConnection = {\n sandboxRef: resolved.entry.summary.ref,\n viewId: resolved.view.id,\n protocol: \"novnc\",\n websocketPath: `/sandboxes/${encodeURIComponent(resolved.entry.summary.ref)}/views/${encodeURIComponent(resolved.view.id)}/ws`,\n authentication:\n resolved.view.authentication.type === \"password\"\n ? { type: \"password\", password: resolved.view.authentication.password }\n : { type: \"none\" },\n };\n c.header(\"cache-control\", \"no-store\");\n return c.json(response);\n });\n\n app.post(\"/sandboxes/:sandboxRef/views/:viewId/control/acquire\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const body = await readControlBody(c);\n if (body instanceof Response) return body;\n const key = viewKey(resolved);\n pruneExpiredLease(leases, key);\n if (leases.has(key)) {\n return errorResponse(c, 409, \"conflict\", \"Browser view is already controlled\");\n }\n try {\n const lease = await resolved.view.source.control.acquireHumanControl({\n ownerId: body.ownerId,\n leaseTimeoutMs: body.leaseTimeoutMs,\n abortSignal: c.req.raw.signal,\n });\n leases.set(key, lease);\n return c.json(leaseResponse(lease), 201);\n } catch (error) {\n return controlErrorResponse(c, error);\n }\n });\n\n app.post(\"/sandboxes/:sandboxRef/views/:viewId/control/renew\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const body = await readLeaseBody(c);\n if (body instanceof Response) return body;\n const key = viewKey(resolved);\n pruneExpiredLease(leases, key);\n const lease = leases.get(key);\n if (lease === undefined || lease.id !== body.leaseId) {\n return errorResponse(c, 409, \"conflict\", \"Browser control lease is not active\");\n }\n try {\n lease.renew({ leaseTimeoutMs: body.leaseTimeoutMs });\n return c.json(leaseResponse(lease));\n } catch (error) {\n leases.delete(key);\n return controlErrorResponse(c, error);\n }\n });\n\n app.post(\"/sandboxes/:sandboxRef/views/:viewId/control/release\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const body = await readReleaseBody(c);\n if (body instanceof Response) return body;\n const key = viewKey(resolved);\n const lease = leases.get(key);\n if (lease === undefined || lease.id !== body.leaseId) {\n return errorResponse(c, 409, \"conflict\", \"Browser control lease is not active\");\n }\n lease.release();\n leases.delete(key);\n return c.json({ released: true });\n });\n\n app.get(\"/sandboxes/:sandboxRef/views/:viewId/ws\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const upstreamUrl = `ws://${hostForUrl(resolved.host)}:${resolved.port}/websockify`;\n return upgradeWebSocket(c, createProxyEvents(upstreamUrl, upstreamSockets), {\n onError: () => undefined,\n });\n });\n\n return () => {\n for (const lease of leases.values()) lease.release();\n leases.clear();\n for (const socket of upstreamSockets) socket.close(1001, \"Studio closed\");\n upstreamSockets.clear();\n };\n}\n\nfunction createProxyEvents(upstreamUrl: string, sockets: Set<WebSocket>): WSEvents {\n let upstream: WebSocket | undefined;\n let pendingBytes = 0;\n const pending: Array<string | Uint8Array> = [];\n return {\n onOpen(_event: Event, downstream: WSContext) {\n const protocols =\n downstream.protocol === null || downstream.protocol.length === 0\n ? undefined\n : [downstream.protocol];\n upstream = new WebSocket(upstreamUrl, protocols, {\n headers: { origin: \"http://127.0.0.1\" },\n });\n sockets.add(upstream);\n upstream.binaryType = \"arraybuffer\";\n upstream.once(\"open\", () => {\n for (const message of pending) upstream?.send(message);\n pending.length = 0;\n pendingBytes = 0;\n });\n upstream.on(\"message\", (data, isBinary) => {\n const value = isBinary ? Uint8Array.from(Buffer.from(data as never)) : data.toString();\n downstream.send(value);\n });\n upstream.once(\"close\", (code, reason) => {\n sockets.delete(upstream as WebSocket);\n downstream.close(normalizeCloseCode(code), reason.toString(\"utf8\").slice(0, 123));\n });\n upstream.once(\"error\", () => downstream.close(1011, \"noVNC upstream failed\"));\n },\n onMessage(event, downstream) {\n void normalizeWebSocketMessage(event.data)\n .then((message) => {\n if (upstream?.readyState === WebSocket.OPEN) {\n upstream.send(message);\n return;\n }\n pendingBytes +=\n typeof message === \"string\" ? Buffer.byteLength(message) : message.byteLength;\n if (pendingBytes > maxPendingWebSocketBytes) {\n downstream.close(1009, \"Pending noVNC messages exceeded the limit\");\n return;\n }\n pending.push(message);\n })\n .catch(() => downstream.close(1003, \"Unsupported noVNC message\"));\n },\n onClose() {\n upstream?.close(1000, \"Viewer disconnected\");\n if (upstream !== undefined) sockets.delete(upstream);\n },\n onError() {\n upstream?.close(1011, \"Viewer connection failed\");\n },\n };\n}\n\nasync function authorizedView(\n c: Context,\n registry: StudioSandboxRegistry,\n): Promise<ResolvedView | Response> {\n const entry = registry.get(c.req.param(\"sandboxRef\") ?? \"\");\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n const view = entry.views.get(c.req.param(\"viewId\") ?? \"\");\n if (view === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox view not found\");\n if (!(await authorize(c, entry, view))) {\n return errorResponse(c, 403, \"forbidden\", \"Sandbox view access denied\");\n }\n const published = entry.inspector.publishedPorts?.find(\n (port) =>\n port.containerPort === view.source.containerPort &&\n port.protocol === \"tcp\" &&\n isLoopbackAddress(port.host),\n );\n if (published === undefined) {\n return errorResponse(c, 503, \"internal_error\", \"Sandbox view port is unavailable\");\n }\n return { entry, view, host: published.host, port: published.hostPort };\n}\n\nasync function authorize(\n c: Context,\n entry: StudioSandboxRegistryEntry,\n view: StudioSandboxViewRegistration,\n): Promise<boolean> {\n if (view.access.mode === \"authorize\") {\n try {\n return (\n (await view.access.authorize({\n request: c.req.raw,\n sandboxRef: entry.summary.ref,\n viewId: view.id,\n })) === true\n );\n } catch {\n return false;\n }\n }\n let remoteAddress: string;\n try {\n const address = getConnInfo(c).remote.address;\n if (address === undefined) return false;\n remoteAddress = address;\n } catch {\n return false;\n }\n if (!isLoopbackAddress(remoteAddress)) return false;\n const expectedOrigin = new URL(c.req.url).origin;\n const origin = c.req.header(\"origin\");\n return (\n origin === expectedOrigin ||\n (origin === undefined && c.req.header(\"sec-fetch-site\") === \"same-origin\")\n );\n}\n\nasync function readControlBody(\n c: Context,\n): Promise<{ ownerId: string; leaseTimeoutMs: number } | Response> {\n const body = await readJsonObject(c);\n if (body instanceof Response) return body;\n if (typeof body.ownerId !== \"string\" || body.ownerId.length === 0 || body.ownerId.length > 200) {\n return errorResponse(c, 400, \"bad_request\", \"ownerId must be a non-empty string\");\n }\n if (!isLeaseTimeout(body.leaseTimeoutMs)) {\n return errorResponse(c, 400, \"bad_request\", \"leaseTimeoutMs is outside the allowed range\");\n }\n return { ownerId: body.ownerId, leaseTimeoutMs: body.leaseTimeoutMs };\n}\n\nasync function readLeaseBody(\n c: Context,\n): Promise<{ leaseId: string; leaseTimeoutMs: number } | Response> {\n const body = await readJsonObject(c);\n if (body instanceof Response) return body;\n if (typeof body.leaseId !== \"string\" || body.leaseId.length === 0) {\n return errorResponse(c, 400, \"bad_request\", \"leaseId must be a non-empty string\");\n }\n if (!isLeaseTimeout(body.leaseTimeoutMs)) {\n return errorResponse(c, 400, \"bad_request\", \"leaseTimeoutMs is outside the allowed range\");\n }\n return { leaseId: body.leaseId, leaseTimeoutMs: body.leaseTimeoutMs };\n}\n\nasync function readReleaseBody(c: Context): Promise<{ leaseId: string } | Response> {\n const body = await readJsonObject(c);\n if (body instanceof Response) return body;\n if (typeof body.leaseId !== \"string\" || body.leaseId.length === 0) {\n return errorResponse(c, 400, \"bad_request\", \"leaseId must be a non-empty string\");\n }\n return { leaseId: body.leaseId };\n}\n\nasync function readJsonObject(c: Context): Promise<Record<string, unknown> | Response> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return errorResponse(c, 400, \"bad_request\", \"Request body must be valid JSON\");\n }\n return isRecord(body)\n ? body\n : errorResponse(c, 400, \"bad_request\", \"Request body must be an object\");\n}\n\nfunction controlErrorResponse(c: Context, error: unknown): Response {\n if (isRecord(error) && error.code === \"human_controlled\") {\n return errorResponse(c, 409, \"conflict\", \"Browser view is already controlled\");\n }\n if (isRecord(error) && error.code === \"invalid_state\") {\n return errorResponse(c, 409, \"conflict\", \"Browser control lease is no longer active\");\n }\n return errorResponse(c, 500, \"internal_error\", \"Browser control operation failed\");\n}\n\nfunction leaseResponse(lease: StudioSandboxViewControlLease) {\n return { id: lease.id, ownerId: lease.ownerId, expiresAt: lease.expiresAt };\n}\n\nfunction pruneExpiredLease(leases: Map<string, StudioSandboxViewControlLease>, key: string): void {\n const lease = leases.get(key);\n if (lease !== undefined && Date.parse(lease.expiresAt) <= Date.now()) {\n lease.release();\n leases.delete(key);\n }\n}\n\nfunction viewKey(resolved: ResolvedView): string {\n return `${resolved.entry.summary.ref}\\0${resolved.view.id}`;\n}\n\nfunction isLeaseTimeout(value: unknown): value is number {\n return (\n Number.isSafeInteger(value) &&\n Number(value) >= minLeaseTimeoutMs &&\n Number(value) <= maxLeaseTimeoutMs\n );\n}\n\nfunction isLoopbackAddress(value: string): boolean {\n return (\n value === \"localhost\" ||\n value === \"127.0.0.1\" ||\n value === \"::1\" ||\n value.startsWith(\"127.\") ||\n value.startsWith(\"::ffff:127.\")\n );\n}\n\nfunction hostForUrl(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\n\nasync function normalizeWebSocketMessage(\n value: unknown,\n): Promise<string | Uint8Array<ArrayBuffer>> {\n if (typeof value === \"string\") return value;\n if (value instanceof ArrayBuffer) return Uint8Array.from(new Uint8Array(value));\n if (ArrayBuffer.isView(value)) {\n return Uint8Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n }\n if (value instanceof Blob) return Uint8Array.from(new Uint8Array(await value.arrayBuffer()));\n throw new TypeError(\"Unsupported noVNC WebSocket message type.\");\n}\n\nfunction normalizeCloseCode(code: number): number {\n return code >= 1000 && code <= 4999 && code !== 1004 && code !== 1005 && code !== 1006\n ? code\n : 1001;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import path from \"node:path\";\nimport type { Context, Hono, Next } from \"hono\";\nimport type {\n StudioAgent,\n StudioErrorCode,\n StudioSandboxFileEntry,\n StudioSandboxFileType,\n StudioSandboxInspector,\n StudioSandboxProcess,\n StudioSandboxProcessLogsResponse,\n StudioSandboxProcessStatus,\n StudioSandboxRegistration,\n StudioSandboxSummary,\n StudioSandboxViewRegistration,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\n\nconst maxFileResponseBytes = 10 * 1024 * 1024;\nconst defaultProcessLogBytes = 64 * 1024;\nconst maxProcessLogBytes = 1024 * 1024;\n\nexport type StudioSandboxRegistryEntry = {\n inspector: StudioSandboxInspector;\n summary: StudioSandboxSummary;\n views: ReadonlyMap<string, StudioSandboxViewRegistration>;\n};\n\nexport class StudioSandboxRegistry {\n private readonly entries: Map<string, StudioSandboxRegistryEntry>;\n\n constructor(entries: StudioSandboxRegistryEntry[]) {\n this.entries = new Map(entries.map((entry) => [entry.summary.ref, entry]));\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n list(): StudioSandboxSummary[] {\n return [...this.entries.values()].map((entry) => copySummary(entry.summary));\n }\n\n get(ref: string): StudioSandboxRegistryEntry | undefined {\n return this.entries.get(ref);\n }\n}\n\nexport function createStudioSandboxRegistry(\n agents: StudioAgent[],\n registrations: readonly StudioSandboxRegistration[],\n): StudioSandboxRegistry {\n const agentIds = new Set(agents.map((agent) => agent.id));\n const refs = new Set<string>();\n const entries = registrations.map((registration, index): StudioSandboxRegistryEntry => {\n validateRegistration(registration, index, agentIds);\n const inspector = registration.inspector;\n const ref = sandboxRef(inspector.provider, inspector.id);\n if (refs.has(ref)) {\n throw new TypeError(\n `sandboxes contains a duplicate provider/id registration: ${inspector.provider}/${inspector.id}`,\n );\n }\n refs.add(ref);\n const views = new Map((registration.views ?? []).map((view) => [view.id, view]));\n return {\n inspector,\n views,\n summary: {\n ref,\n id: inspector.id,\n provider: inspector.provider,\n workdir: inspector.workdir,\n agentIds: sortedUnique(registration.agentIds ?? []),\n toolNames: sortedUnique(registration.toolNames ?? []),\n views: [...views.values()]\n .map((view) => ({ id: view.id, label: view.label, protocol: view.source.protocol }))\n .sort((left, right) => left.id.localeCompare(right.id)),\n capabilities: {\n files: supportsFiles(inspector),\n ports: supportsPorts(inspector),\n processes: supportsProcesses(inspector),\n views: views.size > 0,\n },\n },\n };\n });\n entries.sort((left, right) => left.summary.ref.localeCompare(right.summary.ref));\n return new StudioSandboxRegistry(entries);\n}\n\nexport function registerSandboxRoutes(app: Hono, registry: StudioSandboxRegistry): void {\n app.use(\"/sandboxes\", sandboxNoStore);\n app.use(\"/sandboxes/*\", sandboxNoStore);\n\n app.get(\"/sandboxes\", (c) => c.json({ sandboxes: registry.list() }));\n\n app.get(\"/sandboxes/:sandboxRef\", (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n return entry === undefined\n ? errorResponse(c, 404, \"not_found\", \"Sandbox not found\")\n : c.json(copySummary(entry.summary));\n });\n\n app.get(\"/sandboxes/:sandboxRef/files\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsFiles(entry.inspector)) return unsupportedSandboxOperation(c, \"files\");\n try {\n const requestedPath = c.req.query(\"path\") ?? \".\";\n const normalizedPath = normalizeSandboxPath(requestedPath, true);\n return c.json({\n sandboxRef: entry.summary.ref,\n path: normalizedPath,\n entries: await listSandboxFiles(entry.inspector, normalizedPath, c.req.raw.signal),\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/files/content\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsFiles(entry.inspector)) return unsupportedSandboxOperation(c, \"files.content\");\n try {\n const requestedPath = c.req.query(\"path\");\n if (requestedPath === undefined) {\n throw new SandboxRouteError(400, \"bad_request\", \"path query parameter is required\");\n }\n const download = c.req.query(\"download\");\n if (download !== undefined && download !== \"1\") {\n throw new SandboxRouteError(400, \"bad_request\", \"download must be 1 when provided\");\n }\n const normalizedPath = normalizeSandboxPath(requestedPath, false);\n const siblings = await listSandboxFiles(\n entry.inspector,\n path.posix.dirname(normalizedPath),\n c.req.raw.signal,\n );\n const file = siblings.find((candidate) => candidate.path === normalizedPath);\n if (file === undefined) {\n throw new SandboxRouteError(404, \"not_found\", \"Sandbox file not found\");\n }\n if (file.type !== \"file\") {\n throw new SandboxRouteError(\n 400,\n \"bad_request\",\n \"Sandbox content path must refer to a regular file\",\n );\n }\n if (file.size !== undefined && file.size > maxFileResponseBytes)\n throw fileTooLarge(file.size);\n const rawBytes = await entry.inspector.readFile({\n path: normalizedPath,\n abortSignal: c.req.raw.signal,\n });\n if (!(rawBytes instanceof Uint8Array)) {\n throw new TypeError(\"Sandbox readFile returned an invalid byte payload\");\n }\n if (rawBytes.byteLength > maxFileResponseBytes) throw fileTooLarge(rawBytes.byteLength);\n const bytes = rawBytes.slice();\n const disposition = download === \"1\" ? \"attachment\" : \"inline\";\n const filename = encodeURIComponent(path.posix.basename(normalizedPath));\n return new Response(bytes, {\n headers: {\n \"cache-control\": \"no-store\",\n \"content-disposition\": `${disposition}; filename*=UTF-8''${filename}`,\n \"content-length\": `${bytes.byteLength}`,\n \"content-type\": \"application/octet-stream\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/ports\", (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsPorts(entry.inspector)) return unsupportedSandboxOperation(c, \"ports\");\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n ports: normalizePorts(entry.inspector.publishedPorts),\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/processes\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsProcesses(entry.inspector)) {\n return unsupportedSandboxOperation(c, \"processes\");\n }\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n processes: normalizeProcesses(\n await entry.inspector.listProcesses({ abortSignal: c.req.raw.signal }),\n ),\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/processes/:processId/logs\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsProcesses(entry.inspector)) {\n return unsupportedSandboxOperation(c, \"processes.logs\");\n }\n try {\n const tailBytes = parseTailBytes(c.req.query(\"tailBytes\"));\n const processId = c.req.param(\"processId\");\n const processes = normalizeProcesses(\n await entry.inspector.listProcesses({ abortSignal: c.req.raw.signal }),\n );\n if (!processes.some((process) => process.id === processId)) {\n throw new SandboxRouteError(404, \"not_found\", \"Sandbox process not found\");\n }\n const logs = normalizeProcessLogs(\n await entry.inspector.readProcessLogs({\n processId,\n tailBytes,\n abortSignal: c.req.raw.signal,\n }),\n tailBytes,\n );\n return c.json({\n sandboxRef: entry.summary.ref,\n processId,\n ...logs,\n } satisfies StudioSandboxProcessLogsResponse);\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n}\n\nasync function sandboxNoStore(c: Context, next: Next): Promise<void> {\n c.header(\"cache-control\", \"no-store\");\n await next();\n}\n\nfunction validateRegistration(\n registration: StudioSandboxRegistration,\n index: number,\n knownAgentIds: Set<string>,\n): void {\n if (!isRecord(registration) || !isInspector(registration.inspector)) {\n throw new TypeError(`sandboxes[${index}] must contain a valid inspector.`);\n }\n const inspector = registration.inspector;\n const files = supportsFiles(inspector);\n if ((inspector.listFiles === undefined) !== (inspector.readFile === undefined)) {\n throw new TypeError(`sandboxes[${index}] must register both file inspector methods.`);\n }\n const processes = supportsProcesses(inspector);\n if ((inspector.listProcesses === undefined) !== (inspector.readProcessLogs === undefined)) {\n throw new TypeError(`sandboxes[${index}] must register both process inspector methods.`);\n }\n if (!files && !supportsPorts(inspector) && !processes) {\n throw new TypeError(`sandboxes[${index}] inspector exposes no capabilities.`);\n }\n for (const agentId of sortedUnique(registration.agentIds ?? [])) {\n if (!knownAgentIds.has(agentId)) {\n throw new TypeError(`sandboxes[${index}] references an unknown agent: ${agentId}`);\n }\n }\n sortedUnique(registration.toolNames ?? []);\n validateViews(registration.views, inspector, index);\n}\n\nfunction validateViews(\n views: readonly StudioSandboxViewRegistration[] | undefined,\n inspector: StudioSandboxInspector,\n registrationIndex: number,\n): void {\n if (views === undefined) return;\n if (!Array.isArray(views))\n throw new TypeError(`sandboxes[${registrationIndex}].views must be an array.`);\n if (!supportsPorts(inspector)) {\n throw new TypeError(`sandboxes[${registrationIndex}] views require published port inspection.`);\n }\n const ids = new Set<string>();\n for (const [viewIndex, view] of views.entries()) {\n const prefix = `sandboxes[${registrationIndex}].views[${viewIndex}]`;\n const candidate: unknown = view;\n if (\n !isRecord(candidate) ||\n typeof candidate.id !== \"string\" ||\n !/^[a-z0-9](?:[a-z0-9_-]{0,62})$/.test(candidate.id)\n ) {\n throw new TypeError(`${prefix}.id must be a stable lowercase identifier.`);\n }\n if (ids.has(candidate.id)) throw new TypeError(`${prefix}.id is duplicated: ${candidate.id}`);\n ids.add(candidate.id);\n if (typeof candidate.label !== \"string\" || candidate.label.length === 0) {\n throw new TypeError(`${prefix}.label must be a non-empty string.`);\n }\n const source = candidate.source;\n if (\n !isRecord(source) ||\n source.protocol !== \"novnc\" ||\n !isPort(source.containerPort) ||\n !isRecord(source.control) ||\n typeof source.control.snapshot !== \"function\" ||\n typeof source.control.acquireHumanControl !== \"function\"\n ) {\n throw new TypeError(`${prefix}.source must be a valid noVNC view source.`);\n }\n const port = inspector.publishedPorts?.find(\n (candidate) =>\n candidate.containerPort === source.containerPort && candidate.protocol === \"tcp\",\n );\n if (port === undefined || !isLoopbackHost(port.host)) {\n throw new TypeError(`${prefix}.source must resolve to a loopback-published TCP port.`);\n }\n const access = candidate.access;\n if (!isRecord(access) || (access.mode !== \"local\" && access.mode !== \"authorize\")) {\n throw new TypeError(`${prefix}.access must explicitly select local or authorize mode.`);\n }\n if (access.mode === \"authorize\" && typeof access.authorize !== \"function\") {\n throw new TypeError(`${prefix}.access.authorize must be a function.`);\n }\n const authentication = candidate.authentication;\n if (\n !isRecord(authentication) ||\n (authentication.type !== \"none\" && authentication.type !== \"password\")\n ) {\n throw new TypeError(`${prefix}.authentication must explicitly select none or password.`);\n }\n if (\n authentication.type === \"password\" &&\n (typeof authentication.password !== \"string\" || authentication.password.length === 0)\n ) {\n throw new TypeError(`${prefix}.authentication.password must be a non-empty string.`);\n }\n }\n}\n\nfunction isInspector(value: unknown): value is StudioSandboxInspector {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n typeof value.provider === \"string\" &&\n value.provider.length > 0 &&\n typeof value.workdir === \"string\" &&\n value.workdir.length > 0\n );\n}\n\nfunction supportsFiles(\n inspector: StudioSandboxInspector,\n): inspector is StudioSandboxInspector &\n Required<Pick<StudioSandboxInspector, \"listFiles\" | \"readFile\">> {\n return typeof inspector.listFiles === \"function\" && typeof inspector.readFile === \"function\";\n}\n\nfunction supportsPorts(inspector: StudioSandboxInspector): boolean {\n return Array.isArray(inspector.publishedPorts);\n}\n\nfunction supportsProcesses(\n inspector: StudioSandboxInspector,\n): inspector is StudioSandboxInspector &\n Required<Pick<StudioSandboxInspector, \"listProcesses\" | \"readProcessLogs\">> {\n return (\n typeof inspector.listProcesses === \"function\" && typeof inspector.readProcessLogs === \"function\"\n );\n}\n\nfunction sandboxRef(provider: string, id: string): string {\n return Buffer.from(JSON.stringify([provider, id]), \"utf8\").toString(\"base64url\");\n}\n\nfunction copySummary(summary: StudioSandboxSummary): StudioSandboxSummary {\n return {\n ...summary,\n agentIds: [...summary.agentIds],\n toolNames: [...summary.toolNames],\n views: summary.views.map((view) => ({ ...view })),\n capabilities: { ...summary.capabilities },\n };\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"127.0.0.1\" || host === \"::1\" || host === \"localhost\";\n}\n\nasync function listSandboxFiles(\n inspector: StudioSandboxInspector &\n Required<Pick<StudioSandboxInspector, \"listFiles\" | \"readFile\">>,\n filePath: string,\n abortSignal: AbortSignal,\n): Promise<StudioSandboxFileEntry[]> {\n return normalizeFileEntries(await inspector.listFiles({ path: filePath, abortSignal })).sort(\n (left, right) => {\n if (left.type === \"directory\" && right.type !== \"directory\") return -1;\n if (left.type !== \"directory\" && right.type === \"directory\") return 1;\n return left.path.localeCompare(right.path);\n },\n );\n}\n\nfunction normalizeFileEntries(value: unknown): StudioSandboxFileEntry[] {\n if (!Array.isArray(value)) throw new TypeError(\"Sandbox listFiles returned an invalid payload\");\n return value.map((item) => {\n if (!isRecord(item) || typeof item.path !== \"string\" || !isFileType(item.type)) {\n throw new TypeError(\"Sandbox listFiles returned an invalid entry\");\n }\n let entryPath: string;\n try {\n entryPath = normalizeSandboxPath(item.path, false);\n } catch {\n throw new TypeError(\"Sandbox listFiles returned an invalid entry path\");\n }\n const entry: StudioSandboxFileEntry = { path: entryPath, type: item.type };\n if (item.size !== undefined) {\n if (!Number.isSafeInteger(item.size) || Number(item.size) < 0) {\n throw new TypeError(\"Sandbox listFiles returned an invalid file size\");\n }\n entry.size = item.size as number;\n }\n return entry;\n });\n}\n\nfunction normalizePorts(value: unknown) {\n if (!Array.isArray(value))\n throw new TypeError(\"Sandbox publishedPorts returned an invalid payload\");\n return value.map((item) => {\n if (\n !isRecord(item) ||\n !isPort(item.containerPort) ||\n typeof item.host !== \"string\" ||\n !isPort(item.hostPort) ||\n typeof item.protocol !== \"string\"\n ) {\n throw new TypeError(\"Sandbox publishedPorts returned an invalid entry\");\n }\n return {\n containerPort: item.containerPort,\n host: item.host,\n hostPort: item.hostPort,\n protocol: item.protocol,\n };\n });\n}\n\nfunction normalizeProcesses(value: unknown): StudioSandboxProcess[] {\n if (!Array.isArray(value))\n throw new TypeError(\"Sandbox listProcesses returned an invalid payload\");\n return value.map((item) => {\n if (\n !isRecord(item) ||\n typeof item.id !== \"string\" ||\n typeof item.command !== \"string\" ||\n !Array.isArray(item.args) ||\n !item.args.every((arg) => typeof arg === \"string\") ||\n !isProcessStatus(item.status) ||\n typeof item.startedAt !== \"string\"\n ) {\n throw new TypeError(\"Sandbox listProcesses returned an invalid entry\");\n }\n const process: StudioSandboxProcess = {\n id: item.id,\n command: item.command,\n args: [...item.args],\n status: item.status,\n startedAt: item.startedAt,\n };\n if (typeof item.cwd === \"string\") process.cwd = item.cwd;\n if (typeof item.exitCode === \"number\") process.exitCode = item.exitCode;\n if (typeof item.endedAt === \"string\") process.endedAt = item.endedAt;\n return process;\n });\n}\n\nfunction normalizeProcessLogs(\n value: unknown,\n maxBytes: number,\n): Omit<StudioSandboxProcessLogsResponse, \"sandboxRef\" | \"processId\"> {\n if (\n !isRecord(value) ||\n !(value.stdout instanceof Uint8Array) ||\n !(value.stderr instanceof Uint8Array) ||\n typeof value.stdoutTruncated !== \"boolean\" ||\n typeof value.stderrTruncated !== \"boolean\"\n ) {\n throw new TypeError(\"Sandbox readProcessLogs returned an invalid payload\");\n }\n const stdout = boundedLogBytes(value.stdout, maxBytes);\n const stderr = boundedLogBytes(value.stderr, maxBytes);\n return {\n stdout: stdout.text,\n stderr: stderr.text,\n stdoutTruncated: value.stdoutTruncated || stdout.truncated,\n stderrTruncated: value.stderrTruncated || stderr.truncated,\n };\n}\n\nfunction boundedLogBytes(\n value: Uint8Array,\n maxBytes: number,\n): { text: string; truncated: boolean } {\n if (maxBytes === 0) return { text: \"\", truncated: value.byteLength > 0 };\n let start = Math.max(0, value.byteLength - maxBytes);\n while (start < value.byteLength && ((value[start] ?? 0) & 0xc0) === 0x80) start += 1;\n return {\n text: new TextDecoder(\"utf-8\", { fatal: true }).decode(value.subarray(start)),\n truncated: start > 0,\n };\n}\n\nfunction normalizeSandboxPath(input: string, allowRoot: boolean): string {\n if (input.length === 0) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path cannot be empty\");\n }\n if (input.includes(\"\\0\")) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path cannot contain null bytes\");\n }\n const normalized = path.posix.normalize(input.replaceAll(\"\\\\\", \"/\"));\n if (path.posix.isAbsolute(normalized)) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path must be relative\");\n }\n if (normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path cannot leave the workspace\");\n }\n if (normalized === \".\" && !allowRoot) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path must refer to a file\");\n }\n return normalized;\n}\n\nfunction parseTailBytes(value: string | undefined): number {\n if (value === undefined) return defaultProcessLogBytes;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed > maxProcessLogBytes) {\n throw new SandboxRouteError(\n 400,\n \"bad_request\",\n `tailBytes must be an integer from 0 through ${maxProcessLogBytes}`,\n );\n }\n return parsed;\n}\n\nfunction unsupportedSandboxOperation(c: Context, operation: string): Response {\n return errorResponse(c, 501, \"unsupported_capability\", `Sandbox does not support ${operation}`, {\n capability: \"sandboxes\",\n operation,\n });\n}\n\nfunction sandboxErrorResponse(c: Context, error: unknown): Response {\n if (error instanceof SandboxRouteError) {\n return errorResponse(c, error.status, error.code, error.message);\n }\n const code = errorCode(error);\n if (code === \"invalid_path\") return errorResponse(c, 400, \"bad_request\", errorMessage(error));\n if (code === \"file_too_large\") {\n return errorResponse(c, 413, \"payload_too_large\", errorMessage(error));\n }\n if (code === \"invalid_state\" || code === \"sandbox_not_found\") {\n return errorResponse(c, 409, \"conflict\", \"Sandbox is no longer available\");\n }\n return errorResponse(\n c,\n 500,\n \"internal_error\",\n \"Sandbox inspection failed\",\n serializeError(error),\n );\n}\n\nfunction fileTooLarge(size: number): SandboxRouteError {\n return new SandboxRouteError(\n 413,\n \"payload_too_large\",\n `Sandbox file exceeds the ${maxFileResponseBytes}-byte response limit (${size} bytes)`,\n );\n}\n\nclass SandboxRouteError extends Error {\n constructor(\n readonly status: 400 | 404 | 409 | 413 | 500 | 501,\n readonly code: StudioErrorCode,\n message: string,\n ) {\n super(message);\n }\n}\n\nfunction sortedUnique(values: readonly string[]): string[] {\n if (!Array.isArray(values)) throw new TypeError(\"Sandbox associations must be arrays.\");\n const result = new Set<string>();\n for (const value of values as readonly unknown[]) {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(\"Sandbox associations must contain non-empty strings.\");\n }\n if (result.has(value)) throw new TypeError(`Sandbox association is duplicated: ${value}`);\n result.add(value);\n }\n return [...result].sort();\n}\n\nfunction isFileType(value: unknown): value is StudioSandboxFileType {\n return value === \"file\" || value === \"directory\" || value === \"symlink\" || value === \"other\";\n}\n\nfunction isProcessStatus(value: unknown): value is StudioSandboxProcessStatus {\n return value === \"running\" || value === \"exited\" || value === \"stopped\";\n}\n\nfunction isPort(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) >= 1 && Number(value) <= 65_535;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return isRecord(error) && typeof error.code === \"string\" ? error.code : undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n return isRecord(error) && typeof error.message === \"string\" ? error.message : \"Sandbox failed\";\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport { optionalQueryString, parseAfter, parseLimit } from \"./query\";\nimport { appendSessionLog, sessionCreatedLog } from \"./session-logs\";\nimport { isJsonObject, isObject } from \"./type-guards\";\n\nexport function registerSessionRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n sessionStore: StudioSessionStore;\n traceStore?: StudioTraceStore;\n },\n): void {\n app.get(\"/sessions\", async (c) => {\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n if (agentId !== undefined && !props.agentMap.has(agentId)) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const listInput: Parameters<typeof props.sessionStore.listSessions>[0] = { limit };\n if (agentId !== undefined) listInput.agentId = agentId;\n const sessions = await props.sessionStore.listSessions(listInput);\n return c.json({ sessions });\n });\n\n app.post(\"/sessions\", async (c) => {\n const body = await parseCreateSessionRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n if (!props.agentMap.has(body.agentId)) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const createInput: Parameters<typeof props.sessionStore.createSession>[0] = {\n id: globalThis.crypto.randomUUID(),\n agentId: body.agentId,\n };\n if (body.title !== undefined) createInput.title = body.title;\n if (body.metadata !== undefined) createInput.metadata = body.metadata;\n const session = await props.sessionStore.createSession(createInput);\n await appendSessionLog(props.sessionStore, sessionCreatedLog(session));\n return c.json(session, 201);\n });\n\n app.get(\"/sessions/:sessionId\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"sessionId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.json(session);\n });\n\n app.get(\"/sessions/:sessionId/logs\", async (c) => {\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n if (props.sessionStore.listSessionLogs === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.logs\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"logs\" },\n );\n }\n\n const limit = parseLimit(c.req.query(\"limit\"), 200, 1000);\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parseAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const listInput: Parameters<NonNullable<typeof props.sessionStore.listSessionLogs>>[0] = {\n sessionId,\n limit,\n };\n if (after !== undefined) listInput.after = after;\n const logs = await props.sessionStore.listSessionLogs(listInput);\n const last = logs.at(-1);\n const response: { logs: typeof logs; nextCursor?: number } = { logs };\n if (logs.length === limit && last !== undefined) response.nextCursor = last.sequence;\n return c.json(response);\n });\n\n app.delete(\"/sessions/:sessionId\", async (c) => {\n if (props.sessionStore.deleteSession === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.delete\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"delete\" },\n );\n }\n\n const deleted = await props.sessionStore.deleteSession(c.req.param(\"sessionId\"));\n if (!deleted) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.body(null, 204);\n });\n\n app.get(\"/sessions/:sessionId/traces\", async (c) => {\n if (props.traceStore === undefined) {\n return unsupportedCapability(c, \"traces\");\n }\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const traces = await props.traceStore.listSessionTraces({ sessionId, limit });\n return c.json({ traces });\n });\n}\n\nasync function parseCreateSessionRequest(c: Context): Promise<\n | {\n agentId: string;\n title?: string;\n metadata?: JsonObject;\n }\n | { error: Response }\n> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n if (typeof body.agentId !== \"string\" || body.agentId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"agentId must be a string\") };\n }\n\n const request: { agentId: string; title?: string; metadata?: JsonObject } = {\n agentId: body.agentId.trim(),\n };\n if (\"title\" in body) {\n if (typeof body.title !== \"string\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"title must be a string\") };\n }\n const title = body.title.trim();\n if (title.length > 0) {\n request.title = title;\n }\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n","import type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type {\n MemoryAppendOptions,\n MemoryCompactionCapability,\n MemoryCompactionMessage,\n MemoryCompactionReplacePrefixOptions,\n MemoryErrorOptions,\n MemoryScope,\n} from \"@anvia/core/memory\";\nimport { traceSummary } from \"../runtime/trace-summary\";\nimport { renumberTranscript, transcriptFromMessages } from \"../runtime/transcript\";\nimport { isJsonObject, isJsonValue } from \"../runtime/type-guards\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n} from \"../types\";\n\ntype MemorySessionRecord = StudioSessionSummary & {\n messages: Message[];\n compactionState?: StudioCompactionState | undefined;\n storeRevision: number;\n runs: Array<StudioSessionRunTranscriptInput & { createdAt: string; updatedAt: string }>;\n logs: StudioSessionLogEntry[];\n};\n\ntype StudioCompactionState = {\n generation: number;\n summary: MemoryCompactionMessage;\n summarizedThroughPosition: number;\n};\n\nexport function createInMemoryStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n return new InMemoryStudioStore();\n}\n\nclass InMemoryStudioStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"memory\";\n readonly compaction: MemoryCompactionCapability = {\n snapshot: ({ scope }) => {\n const session = this.sessions.get(scope.sessionId);\n const messages = session?.messages ?? [];\n return Promise.resolve({\n revision: String(session?.storeRevision ?? 0),\n messages: projectedMessages(messages, session?.compactionState),\n });\n },\n replacePrefix: (options) => this.replaceCompactionPrefix(options),\n };\n private readonly sessions = new Map<string, MemorySessionRecord>();\n private readonly traces = new Map<string, StudioTrace>();\n private readonly pipelineLogs = new Map<string, StudioPipelineLogEntry[]>();\n private readonly pipelineRuns = new Map<string, StudioPipelineRunRecord>();\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n return [...this.sessions.values()]\n .filter((session) => options.agentId === undefined || session.agentId === options.agentId)\n .sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt))\n .slice(0, options.limit)\n .map(sessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const now = new Date().toISOString();\n const session: MemorySessionRecord = {\n id: input.id,\n agentId: input.agentId,\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n messages: [],\n storeRevision: 0,\n runs: [],\n logs: [],\n };\n if (input.title !== undefined) session.title = input.title;\n if (input.metadata !== undefined) session.metadata = input.metadata;\n this.sessions.set(input.id, session);\n return sessionSummary(session);\n }\n\n getSession(id: string): StudioSession | undefined {\n const session = this.sessions.get(id);\n return session === undefined ? undefined : materializeSession(session);\n }\n\n updateSessionMetadata(id: string, metadata: JsonObject | undefined): StudioSession | undefined {\n const session = this.sessions.get(id);\n if (session === undefined) {\n return undefined;\n }\n if (metadata === undefined) {\n delete session.metadata;\n } else {\n session.metadata = metadata;\n }\n session.updatedAt = new Date().toISOString();\n return materializeSession(session);\n }\n\n load({ scope }: { scope: MemoryScope }): Promise<Message[]> {\n return Promise.resolve(cloneMessages(this.sessions.get(scope.sessionId)?.messages ?? []));\n }\n\n append(input: MemoryAppendOptions): Promise<void> {\n const session = this.sessions.get(input.scope.sessionId);\n if (session !== undefined) {\n session.messages.push(...cloneMessages(input.messages));\n session.storeRevision += 1;\n session.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n clear({ scope }: { scope: MemoryScope }): Promise<void> {\n const session = this.sessions.get(scope.sessionId);\n if (session !== undefined) {\n session.messages = [];\n delete session.compactionState;\n session.storeRevision += 1;\n session.runs = [];\n session.messageCount = 0;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n async recordError(input: MemoryErrorOptions): Promise<void> {\n await this.saveSessionRunTranscript({\n id: input.scope.sessionId,\n runId: studioRunId(input.scope) ?? input.runId,\n transcript: transcriptFromMessages(input.messages),\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n private replaceCompactionPrefix(\n input: MemoryCompactionReplacePrefixOptions,\n ): Promise<{ status: \"committed\" | \"conflict\" }> {\n if (!Number.isSafeInteger(input.messageCount) || input.messageCount < 1) {\n throw new RangeError(\"messageCount must be a positive integer.\");\n }\n const session = this.sessions.get(input.scope.sessionId);\n if (session === undefined || String(session.storeRevision) !== input.revision) {\n return Promise.resolve({ status: \"conflict\" });\n }\n const physicalPrefixCount =\n input.messageCount - (session.compactionState === undefined ? 0 : 1);\n const activeMessageCount =\n session.messages.length - (session.compactionState?.summarizedThroughPosition ?? -1) - 1;\n if (physicalPrefixCount < 0 || physicalPrefixCount > activeMessageCount) {\n return Promise.resolve({ status: \"conflict\" });\n }\n session.compactionState = {\n generation: (session.compactionState?.generation ?? 0) + 1,\n summary: structuredClone(input.replacement),\n summarizedThroughPosition:\n (session.compactionState?.summarizedThroughPosition ?? -1) + physicalPrefixCount,\n };\n session.storeRevision += 1;\n session.updatedAt = new Date().toISOString();\n return Promise.resolve({ status: \"committed\" });\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const session = this.sessions.get(input.id);\n if (session === undefined) {\n return undefined;\n }\n const now = new Date().toISOString();\n const existingIndex = session.runs.findIndex((run) => run.runId === input.runId);\n const run = {\n ...input,\n transcript: renumberTranscript(input.transcript),\n createdAt: existingIndex === -1 ? now : (session.runs[existingIndex]?.createdAt ?? now),\n updatedAt: now,\n };\n if (existingIndex === -1) {\n session.runs.push(run);\n } else {\n session.runs[existingIndex] = run;\n }\n session.updatedAt = now;\n return materializeSession(session);\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const session = this.sessions.get(input.sessionId);\n const logs = session?.logs ?? [];\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n if (session !== undefined) {\n session.logs.push(entry);\n session.updatedAt = entry.timestamp;\n }\n return entry;\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n return (this.sessions.get(options.sessionId)?.logs ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n deleteSession(id: string): boolean {\n for (const trace of this.traces.values()) {\n if (trace.sessionId === id) {\n this.traces.delete(trace.id);\n }\n }\n return this.sessions.delete(id);\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n return [...this.traces.values()]\n .filter((trace) => options.sessionId === undefined || trace.sessionId === options.sessionId)\n .filter((trace) => options.status === undefined || trace.status === options.status)\n .filter((trace) => options.agentId === undefined || traceAgentId(trace) === options.agentId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit)\n .map(traceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n return this.listTraces({ sessionId: options.sessionId, limit: options.limit });\n }\n\n getTrace(id: string): StudioTrace | undefined {\n return this.traces.get(id);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n this.traces.set(trace.id, trace);\n return trace;\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const logs = this.pipelineLogs.get(input.pipelineId) ?? [];\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n this.pipelineLogs.set(input.pipelineId, [...logs, entry]);\n return entry;\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n return (this.pipelineLogs.get(options.pipelineId) ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const record: StudioPipelineRunRecord = {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n startedAt: input.startedAt,\n };\n if (input.output !== undefined) record.output = input.output;\n if (input.error !== undefined) record.error = input.error;\n if (input.metadata !== undefined) record.metadata = input.metadata;\n if (input.endedAt !== undefined) record.endedAt = input.endedAt;\n if (input.durationMs !== undefined) record.durationMs = input.durationMs;\n this.pipelineRuns.set(input.runId, record);\n return record;\n }\n\n getPipelineRun(options: {\n pipelineId: string;\n runId: string;\n }): StudioPipelineRunRecord | undefined {\n const run = this.pipelineRuns.get(options.runId);\n return run?.pipelineId === options.pipelineId ? run : undefined;\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n return [...this.pipelineRuns.values()]\n .filter((run) => run.pipelineId === options.pipelineId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit);\n }\n}\n\nfunction sessionSummary(session: MemorySessionRecord): StudioSessionSummary {\n const summary: StudioSessionSummary = {\n id: session.id,\n agentId: session.agentId,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messages.length,\n };\n if (session.title !== undefined) summary.title = session.title;\n if (session.metadata !== undefined) summary.metadata = session.metadata;\n return summary;\n}\n\nfunction materializeSession(session: MemorySessionRecord): StudioSession {\n return {\n ...sessionSummary(session),\n messages: cloneMessages(session.messages),\n transcript: renumberTranscript(session.runs.flatMap((run) => run.transcript)),\n };\n}\n\nfunction cloneMessages(messages: readonly Message[]): Message[] {\n return structuredClone([...messages]);\n}\n\nfunction traceAgentId(trace: StudioTrace): string | undefined {\n const nestedMetadata = trace.metadata?.metadata;\n return isJsonObject(nestedMetadata) && typeof nestedMetadata.agentId === \"string\"\n ? nestedMetadata.agentId\n : undefined;\n}\n\nfunction studioRunId(scope: MemoryScope): string | undefined {\n const value = scope.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction projectedMessages(\n messages: Message[],\n state: StudioCompactionState | undefined,\n): Message[] {\n if (state === undefined) return cloneMessages(messages);\n return [\n structuredClone(state.summary),\n ...cloneMessages(messages.slice(state.summarizedThroughPosition + 1)),\n ];\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n return isJsonValue(error) ? error : String(error);\n}\n","import { createInMemoryStudioStore } from \"../storage/memory-store\";\nimport type {\n StudioAgent,\n StudioPipeline,\n StudioPipelineLogStore,\n StudioPipelineRunStore,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport function resolveStores(options: StudioRuntimeOptions): ResolvedStores {\n const defaultStore = defaultStudioStore();\n const sessions = resolveSessionStore(options, defaultStore);\n const traces = resolveTraceStore(options, sessions, defaultStore);\n const pipelineLogs = resolvePipelineLogStore(options, sessions, defaultStore);\n const pipelineRuns = resolvePipelineRunStore(options, sessions, pipelineLogs, defaultStore);\n const stores: ResolvedStores = {};\n if (sessions !== undefined) stores.sessions = sessions;\n if (traces !== undefined) stores.traces = traces;\n if (pipelineLogs !== undefined) stores.pipelineLogs = pipelineLogs;\n if (pipelineRuns !== undefined) stores.pipelineRuns = pipelineRuns;\n return stores;\n}\n\nfunction defaultStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n return createInMemoryStudioStore();\n}\n\nfunction resolveSessionStore(\n options: StudioRuntimeOptions,\n defaultStore: StudioSessionStore,\n): StudioSessionStore | undefined {\n if (options.stores?.sessions === false) {\n return undefined;\n }\n if (options.stores?.sessions !== undefined) {\n return options.stores.sessions;\n }\n\n return defaultStore;\n}\n\nfunction resolveTraceStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioTraceStore,\n): StudioTraceStore | undefined {\n if (options.stores?.traces !== undefined) {\n return options.stores.traces;\n }\n if (sessionStore === undefined) {\n return undefined;\n }\n if (isTraceStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineLogStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioPipelineLogStore,\n): StudioPipelineLogStore | undefined {\n if (options.stores?.pipelineLogs === false) {\n return undefined;\n }\n if (options.stores?.pipelineLogs !== undefined) {\n return options.stores.pipelineLogs;\n }\n if (sessionStore !== undefined && isPipelineLogStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineRunStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n pipelineLogStore: StudioPipelineLogStore | undefined,\n defaultStore: StudioPipelineRunStore,\n): StudioPipelineRunStore | undefined {\n if (options.stores?.pipelineRuns === false) {\n return undefined;\n }\n if (options.stores?.pipelineRuns !== undefined) {\n return options.stores.pipelineRuns;\n }\n if (sessionStore !== undefined && isPipelineRunStore(sessionStore)) {\n return sessionStore;\n }\n if (pipelineLogStore !== undefined && isPipelineRunStore(pipelineLogStore)) {\n return pipelineLogStore;\n }\n return defaultStore;\n}\n\nfunction isTraceStore(store: StudioSessionStore): store is StudioSessionStore & StudioTraceStore {\n const candidate = store as Partial<StudioTraceStore>;\n return (\n typeof candidate.listSessionTraces === \"function\" &&\n typeof candidate.getTrace === \"function\" &&\n typeof candidate.saveTrace === \"function\"\n );\n}\n\nfunction isPipelineLogStore(\n store: StudioSessionStore,\n): store is StudioSessionStore & StudioPipelineLogStore {\n const candidate = store as Partial<StudioPipelineLogStore>;\n return (\n typeof candidate.appendPipelineLog === \"function\" &&\n typeof candidate.listPipelineLogs === \"function\"\n );\n}\n\nfunction isPipelineRunStore(store: object): store is object & StudioPipelineRunStore {\n const candidate = store as Partial<StudioPipelineRunStore>;\n return (\n typeof candidate.savePipelineRun === \"function\" &&\n typeof candidate.getPipelineRun === \"function\" &&\n typeof candidate.listPipelineRuns === \"function\"\n );\n}\n\nexport function normalizeAgents(agents: StudioAgent[]): StudioAgent[] {\n const ids = new Set<string>();\n return agents.map((agent) => {\n const id = agent.id.trim();\n if (id.length === 0) {\n throw new Error(\"Studio agent id cannot be empty\");\n }\n if (ids.has(id)) {\n throw new Error(`Duplicate runner agent id: ${id}`);\n }\n ids.add(id);\n return { ...agent, id };\n });\n}\n\nexport function normalizePipelines(pipelines: StudioPipeline[]): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = pipeline.id.trim();\n if (id.length === 0) {\n throw new Error(\"Studio pipeline id cannot be empty\");\n }\n if (ids.has(id)) {\n throw new Error(`Duplicate Studio pipeline id: ${id}`);\n }\n ids.add(id);\n return { ...pipeline, id };\n });\n}\n","import type { Hono } from \"hono\";\nimport type { StudioAgent, StudioPipeline, StudioStatusSummary } from \"../types\";\nimport { capabilityConfig, runnerId } from \"./config\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport function registerStatusRoutes(\n app: Hono,\n props: {\n options: StudioRuntimeOptions;\n agents: StudioAgent[];\n pipelines: StudioPipeline[];\n stores: ResolvedStores;\n sandboxCount: number;\n },\n): void {\n app.get(\"/status\", async (c) => {\n const runner: StudioStatusSummary[\"runner\"] = { id: runnerId(props.options) };\n if (props.options.name !== undefined) runner.name = props.options.name;\n if (props.options.version !== undefined) runner.version = props.options.version;\n\n const storage: StudioStatusSummary[\"storage\"] = {};\n if (props.stores.sessions?.kind !== undefined) storage.sessions = props.stores.sessions.kind;\n if (props.stores.traces?.kind !== undefined) storage.traces = props.stores.traces.kind;\n if (props.stores.pipelineLogs !== undefined) storage.pipelineLogs = \"available\";\n if (props.stores.pipelineRuns !== undefined) storage.pipelineRuns = \"available\";\n\n const counts: StudioStatusSummary[\"counts\"] = {\n agents: props.agents.length,\n pipelines: props.pipelines.length,\n };\n if (props.sandboxCount > 0) counts.sandboxes = props.sandboxCount;\n if (props.stores.sessions !== undefined) {\n counts.sessions = (await props.stores.sessions.listSessions({ limit: 100 })).length;\n }\n if (props.stores.traces?.listTraces !== undefined) {\n counts.traces = (await props.stores.traces.listTraces({ limit: 100 })).length;\n }\n if (props.stores.pipelineRuns !== undefined && props.pipelines.length > 0) {\n counts.pipelineRuns = (\n await Promise.all(\n props.pipelines.map((pipeline) =>\n props.stores.pipelineRuns?.listPipelineRuns({\n pipelineId: pipeline.id,\n limit: 100,\n }),\n ),\n )\n ).reduce((sum, runs) => sum + (runs?.length ?? 0), 0);\n }\n\n const summary: StudioStatusSummary = {\n runner,\n storage,\n counts,\n capabilities: capabilityConfig(\n props.options,\n props.agents,\n props.pipelines,\n props.stores,\n props.sandboxCount,\n ),\n generatedAt: new Date().toISOString(),\n };\n return c.json(summary);\n });\n}\n","import type { Context, Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentToolMetadata,\n StudioToolRunRequest,\n StudioToolRunResponse,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { serializeUnknown, toJsonValue } from \"./json\";\nimport { agentToolItems, approvalMetadata, mcpServerName } from \"./tool-metadata\";\nimport { isJsonObject, isJsonValue } from \"./type-guards\";\n\nexport function registerToolRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/tools\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n tools: await agentToolMetadata(agent),\n });\n });\n\n app.post(\"/agents/:agentId/tools/:toolName/runs\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const toolName = c.req.param(\"toolName\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n if (agent.agent.getTool(toolName) === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Tool not found\");\n }\n\n const body = await parseToolRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const started = Date.now();\n const startedAt = new Date(started).toISOString();\n const events: unknown[] = [];\n try {\n const result = await agent.agent.callTool(toolName, JSON.stringify(body.args), {\n emitStreamEvent(event) {\n events.push(event);\n },\n });\n const ended = Date.now();\n return c.json({\n agentId,\n toolName,\n status: \"success\",\n result: toJsonValue(result),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse);\n } catch (error) {\n const ended = Date.now();\n return c.json(\n {\n agentId,\n toolName,\n status: \"error\",\n error: serializeUnknown(error),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse,\n 500,\n );\n }\n });\n}\n\nasync function parseToolRunRequest(\n c: Context,\n): Promise<StudioToolRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n if (body === undefined || body === null) {\n return { args: {} } satisfies StudioToolRunRequest;\n }\n if (!isJsonObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n const args = Object.hasOwn(body, \"args\") ? body.args : {};\n if (!isJsonValue(args)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"args must be JSON-compatible\") };\n }\n const request: StudioToolRunRequest = { args };\n if (Object.hasOwn(body, \"context\")) {\n if (!isJsonObject(body.context)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"context must be an object\") };\n }\n request.context = body.context;\n }\n return request;\n}\n\nexport async function agentToolMetadata(agent: StudioAgent): Promise<StudioAgentToolMetadata[]> {\n const seen = new Set<string>();\n const metadata: StudioAgentToolMetadata[] = [];\n for (const { tool, source } of agentToolItems(agent)) {\n const key = `${source}:${tool.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n const definition = await tool.definition(\"\");\n const serverName = mcpServerName(tool);\n const item: StudioAgentToolMetadata = {\n agentId: agent.id,\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n approval: approvalMetadata(tool),\n };\n if (serverName !== undefined) item.mcpServerName = serverName;\n metadata.push(item);\n }\n\n return metadata.sort((left, right) => {\n if (left.source !== right.source) {\n return left.source === \"static\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n}\n","import type { Hono } from \"hono\";\nimport type { StudioTraceStore } from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString, parseLimit, parseTraceStatus } from \"./query\";\n\nexport function registerTraceRoutes(app: Hono, traceStore: StudioTraceStore): void {\n app.get(\"/traces\", async (c) => {\n if (traceStore.listTraces === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"traces.list\" is not implemented by this runner',\n { capability: \"traces\", operation: \"list\" },\n );\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const status = parseTraceStatus(c.req.query(\"status\"));\n if (status === false) {\n return errorResponse(c, 400, \"bad_request\", \"status must be running, success, or error\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sessionId = optionalQueryString(c.req.query(\"sessionId\"));\n const input: Parameters<NonNullable<typeof traceStore.listTraces>>[0] = { limit };\n if (agentId !== undefined) input.agentId = agentId;\n if (sessionId !== undefined) input.sessionId = sessionId;\n if (status !== undefined) input.status = status;\n const traces = await traceStore.listTraces(input);\n if (c.req.query(\"include\") === \"detail\") {\n const detailed = await Promise.all(\n traces.map((trace) => Promise.resolve(traceStore.getTrace(trace.id))),\n );\n return c.json({ traces: detailed.filter((trace) => trace !== undefined) });\n }\n return c.json({ traces });\n });\n\n app.get(\"/traces/:traceId\", async (c) => {\n const trace = await traceStore.getTrace(c.req.param(\"traceId\"));\n if (trace === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Trace not found\");\n }\n return c.json(trace);\n });\n}\n","import { mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport type { DatabaseSync as DatabaseSyncType } from \"node:sqlite\";\nimport { isJsonValue, type JsonObject, type JsonValue, type Message } from \"@anvia/core/completion\";\nimport type {\n MemoryAppendOptions,\n MemoryCompactionCapability,\n MemoryCompactionReplacePrefixOptions,\n MemoryErrorOptions,\n MemoryScope,\n} from \"@anvia/core/memory\";\nimport {\n activeStudioCompactionMessages,\n parseStudioCompactionState,\n projectStudioCompactionMessages,\n studioCompactionRevision,\n type StoredStudioCompactionState,\n type StudioCompactionMessageRow,\n} from \"./compaction-state\";\nimport { renumberTranscript, transcriptFromMessages } from \"../runtime/transcript\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunStatus,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\nexport type SqliteSessionStoreOptions = {\n path?: string;\n};\n\ntype DatabaseSyncConstructor = typeof DatabaseSyncType;\n\nlet DatabaseSync: DatabaseSyncConstructor | undefined;\n\ntype SessionRow = {\n id: string;\n agent_id: string;\n title: string | null;\n metadata_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype CompactionSessionRow = {\n id: string;\n compaction_state_json: string | null;\n};\n\ntype SessionSummaryRow = SessionRow & {\n message_count: number;\n};\n\ntype MessageRow = {\n session_id: string;\n message_index: number;\n role: Message[\"role\"];\n message_id: string | null;\n metadata_json: string | null;\n created_at: string;\n};\n\ntype MessagePartRow = {\n session_id: string;\n message_index: number;\n part_index: number;\n type: string;\n part_json: string;\n};\n\ntype StoredMessagePart = {\n type: string;\n value: unknown;\n};\n\ntype TableInfoRow = {\n name: string;\n};\n\ntype TraceRow = {\n id: string;\n session_id: string;\n name: string | null;\n status: StudioTrace[\"status\"];\n trace_json: string | null;\n input_json: string | null;\n output: string | null;\n error_json: string | null;\n usage_json: string | null;\n metadata_json: string | null;\n observations_json: string;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\ntype SessionRunRow = {\n run_id: string;\n session_id: string;\n status: StudioSessionRunStatus;\n title: string | null;\n transcript_json: string;\n error_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype SessionLogRow = {\n id: string;\n session_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioSessionLogEntry[\"level\"];\n category: StudioSessionLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineLogRow = {\n id: string;\n pipeline_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioPipelineLogEntry[\"level\"];\n category: StudioPipelineLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineRunRow = {\n run_id: string;\n pipeline_id: string;\n status: StudioPipelineRunRecord[\"status\"];\n input_json: string;\n output_json: string | null;\n error_json: string | null;\n metadata_json: string | null;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\nexport function createSqliteSessionStore(\n options: SqliteSessionStoreOptions = {},\n): StudioSessionStore & StudioTraceStore & StudioPipelineLogStore & StudioPipelineRunStore {\n return new SqliteSessionStore(options.path ?? \":memory:\");\n}\n\nclass SqliteSessionStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"sqlite\";\n readonly compaction: MemoryCompactionCapability = {\n snapshot: ({ scope }) => {\n const session = this.getCompactionSessionRow(scope.sessionId);\n const state = parseStudioCompactionState(session?.compaction_state_json ?? null);\n const rows = this.listCompactionMessages(scope.sessionId, state);\n return Promise.resolve({\n revision: studioCompactionRevision(rows, state),\n messages: projectStudioCompactionMessages(rows, state),\n });\n },\n replacePrefix: (options) => this.replaceCompactionPrefix(options),\n };\n private db: DatabaseSyncType | undefined;\n\n constructor(private readonly path: string) {}\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n const db = this.database();\n const agentClause = options.agentId === undefined ? \"\" : \"WHERE s.agent_id = $agentId\";\n const rows = db\n .prepare(\n `SELECT s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at,\n COUNT(m.message_index) AS message_count\n FROM anvia_studio_sessions s\n LEFT JOIN anvia_studio_session_messages m ON m.session_id = s.id\n ${agentClause}\n GROUP BY s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at\n ORDER BY s.updated_at DESC\n LIMIT $limit`,\n )\n .all({\n $agentId: options.agentId ?? null,\n $limit: options.limit,\n }) as SessionSummaryRow[];\n\n return rows.map(toSessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const db = this.database();\n const now = new Date().toISOString();\n db.prepare(\n `INSERT INTO anvia_studio_sessions (\n id,\n agent_id,\n title,\n metadata_json,\n created_at,\n updated_at\n ) VALUES ($id, $agentId, $title, $metadata, $now, $now)`,\n ).run({\n $id: input.id,\n $agentId: input.agentId,\n $title: input.title ?? null,\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $now: now,\n });\n\n const session: StudioSessionSummary = {\n id: input.id,\n agentId: input.agentId,\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n };\n if (input.title !== undefined) session.title = input.title;\n if (input.metadata !== undefined) session.metadata = input.metadata;\n return session;\n }\n\n getSession(id: string): StudioSession | undefined {\n const row = this.getSessionRow(id);\n\n return row === undefined\n ? undefined\n : toSession(row, this.listSessionMessages(id), this.listSessionRunRows(id));\n }\n\n updateSessionMetadata(id: string, metadata: JsonObject | undefined): StudioSession | undefined {\n const db = this.database();\n const now = new Date().toISOString();\n const result = db\n .prepare(\n `UPDATE anvia_studio_sessions\n SET metadata_json = $metadata,\n updated_at = $now\n WHERE id = $id`,\n )\n .run({\n $id: id,\n $metadata: metadata === undefined ? null : JSON.stringify(metadata),\n $now: now,\n });\n if (result.changes === 0) {\n return undefined;\n }\n return this.getSession(id);\n }\n\n load({ scope }: { scope: MemoryScope }): Promise<Message[]> {\n const session = this.getSession(scope.sessionId);\n return Promise.resolve(session?.messages ?? []);\n }\n\n append(input: MemoryAppendOptions): Promise<void> {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: input.scope.sessionId }) as SessionRow | undefined;\n\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve();\n }\n\n const updatedAt = new Date().toISOString();\n const nextIndex = this.nextMessageIndex(input.scope.sessionId);\n\n this.insertMessages(input.scope.sessionId, input.messages, nextIndex, updatedAt);\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.scope.sessionId,\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n clear({ scope }: { scope: MemoryScope }): Promise<void> {\n const db = this.database();\n const updatedAt = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET compaction_state_json = NULL,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: scope.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_messages WHERE session_id = $id\").run({\n $id: scope.sessionId,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({\n $id: scope.sessionId,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n async recordError(input: MemoryErrorOptions): Promise<void> {\n const runId = studioRunId(input.scope) ?? input.runId;\n const existing = this.getSessionRun(input.scope.sessionId, runId);\n const transcript =\n existing === undefined ||\n parseJsonArray<StudioTranscriptEntry>(existing.transcript_json).length === 0\n ? transcriptFromMessages(input.messages)\n : parseJsonArray<StudioTranscriptEntry>(existing.transcript_json);\n await this.saveSessionRunTranscript({\n id: input.scope.sessionId,\n runId,\n transcript,\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n private replaceCompactionPrefix(\n input: MemoryCompactionReplacePrefixOptions,\n ): Promise<{ status: \"committed\" | \"conflict\" }> {\n if (!Number.isSafeInteger(input.messageCount) || input.messageCount < 1) {\n throw new RangeError(\"messageCount must be a positive integer.\");\n }\n const db = this.database();\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const session = this.getCompactionSessionRow(input.scope.sessionId);\n const state = parseStudioCompactionState(session?.compaction_state_json ?? null);\n const rows = this.listCompactionMessages(input.scope.sessionId, state);\n if (session === undefined || studioCompactionRevision(rows, state) !== input.revision) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve({ status: \"conflict\" });\n }\n const physicalPrefixCount = input.messageCount - (state === undefined ? 0 : 1);\n const activeRows = activeStudioCompactionMessages(rows, state);\n if (physicalPrefixCount < 0 || physicalPrefixCount > activeRows.length) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve({ status: \"conflict\" });\n }\n const summarizedThroughPosition =\n physicalPrefixCount === 0\n ? state?.summarizedThroughPosition\n : activeRows[physicalPrefixCount - 1]?.position;\n if (summarizedThroughPosition === undefined) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve({ status: \"conflict\" });\n }\n const nextState: StoredStudioCompactionState = {\n version: 1,\n generation: (state?.generation ?? 0) + 1,\n summary: input.replacement,\n summarizedThroughPosition,\n };\n const updatedAt = new Date().toISOString();\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET compaction_state_json = $compactionState,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.scope.sessionId,\n $compactionState: JSON.stringify(nextState),\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve({ status: \"committed\" });\n } catch (error) {\n if (db.isTransaction) db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.id);\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return undefined;\n }\n const current = toSession(\n row,\n this.listSessionMessages(input.id),\n this.listSessionRunRows(input.id),\n );\n const title = current.title ?? input.title;\n\n db.prepare(\n `INSERT INTO anvia_studio_session_runs (\n run_id,\n session_id,\n status,\n title,\n transcript_json,\n error_json,\n created_at,\n updated_at\n ) VALUES (\n $runId,\n $sessionId,\n $status,\n $title,\n $transcript,\n $error,\n $now,\n $now\n )\n ON CONFLICT(run_id) DO UPDATE SET\n status = excluded.status,\n title = COALESCE(anvia_studio_session_runs.title, excluded.title),\n transcript_json = excluded.transcript_json,\n error_json = excluded.error_json,\n updated_at = excluded.updated_at`,\n ).run({\n $runId: input.runId,\n $sessionId: input.id,\n $status: input.status,\n $title: input.title ?? null,\n $transcript: JSON.stringify(renumberTranscript(input.transcript)),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $now: now,\n });\n\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET title = $title,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.id,\n $title: title ?? null,\n $updatedAt: now,\n });\n db.exec(\"COMMIT\");\n\n const updated = this.getSession(input.id);\n return updated;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.sessionId);\n if (row === undefined) {\n throw new Error(\"Session not found\");\n }\n const sequence = this.nextSessionLogSequence(input.sessionId);\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n\n db.prepare(\n `INSERT INTO anvia_studio_session_logs (\n id,\n session_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $sessionId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $sessionId: entry.sessionId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, session_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as SessionLogRow[];\n\n return rows.map(toSessionLog);\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const sequence = this.nextPipelineLogSequence(input.pipelineId);\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_logs (\n id,\n pipeline_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $pipelineId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $pipelineId: entry.pipelineId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, pipeline_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as PipelineLogRow[];\n\n return rows.map(toPipelineLog);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_runs (\n run_id,\n pipeline_id,\n status,\n input_json,\n output_json,\n error_json,\n metadata_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $runId,\n $pipelineId,\n $status,\n $input,\n $output,\n $error,\n $metadata,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(run_id) DO UPDATE SET\n pipeline_id = excluded.pipeline_id,\n status = excluded.status,\n input_json = excluded.input_json,\n output_json = excluded.output_json,\n error_json = excluded.error_json,\n metadata_json = excluded.metadata_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $runId: input.runId,\n $pipelineId: input.pipelineId,\n $status: input.status,\n $input: JSON.stringify(input.input),\n $output: input.output === undefined ? null : JSON.stringify(input.output),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $startedAt: input.startedAt,\n $endedAt: input.endedAt ?? null,\n $durationMs: input.durationMs ?? null,\n });\n\n const record: StudioPipelineRunRecord = {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n startedAt: input.startedAt,\n };\n if (input.output !== undefined) record.output = input.output;\n if (input.error !== undefined) record.error = input.error;\n if (input.metadata !== undefined) record.metadata = input.metadata;\n if (input.endedAt !== undefined) record.endedAt = input.endedAt;\n if (input.durationMs !== undefined) record.durationMs = input.durationMs;\n return record;\n }\n\n getPipelineRun(options: {\n pipelineId: string;\n runId: string;\n }): StudioPipelineRunRecord | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT run_id, pipeline_id, status, input_json, output_json, error_json,\n metadata_json, started_at, ended_at, duration_ms\n FROM anvia_studio_pipeline_runs\n WHERE pipeline_id = $pipelineId AND run_id = $runId`,\n )\n .get({\n $pipelineId: options.pipelineId,\n $runId: options.runId,\n }) as PipelineRunRow | undefined;\n\n return row === undefined ? undefined : toPipelineRun(row);\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT run_id, pipeline_id, status, input_json, output_json, error_json,\n metadata_json, started_at, ended_at, duration_ms\n FROM anvia_studio_pipeline_runs\n WHERE pipeline_id = $pipelineId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $limit: options.limit,\n }) as PipelineRunRow[];\n\n return rows.map(toPipelineRun);\n }\n\n deleteSession(id: string): boolean {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\"DELETE FROM anvia_studio_traces WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_logs WHERE session_id = $id\").run({ $id: id });\n const result = db\n .prepare(\"DELETE FROM anvia_studio_sessions WHERE id = $id\")\n .run({ $id: id }) as {\n changes: number | bigint;\n };\n db.exec(\"COMMIT\");\n return Number(result.changes) > 0;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const filters: string[] = [];\n const values: Record<string, string | number | null> = {\n $limit: options.limit,\n };\n\n if (options.agentId !== undefined) {\n filters.push(\n \"(s.agent_id = $agentId OR json_extract(t.metadata_json, '$.metadata.agentId') = $agentId)\",\n );\n values.$agentId = options.agentId;\n }\n if (options.sessionId !== undefined) {\n filters.push(\"t.session_id = $sessionId\");\n values.$sessionId = options.sessionId;\n }\n if (options.status !== undefined) {\n filters.push(\"t.status = $status\");\n values.$status = options.status;\n }\n\n const whereClause = filters.length === 0 ? \"\" : `WHERE ${filters.join(\" AND \")}`;\n const rows = db\n .prepare(\n `SELECT t.id, t.session_id, t.name, t.status, t.trace_json, t.input_json, t.output,\n t.error_json, t.usage_json, t.metadata_json, t.observations_json,\n t.started_at, t.ended_at, t.duration_ms\n FROM anvia_studio_traces t\n LEFT JOIN anvia_studio_sessions s ON s.id = t.session_id\n ${whereClause}\n ORDER BY t.started_at DESC\n LIMIT $limit`,\n )\n .all(values) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE session_id = $sessionId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $limit: options.limit,\n }) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n getTrace(id: string): StudioTrace | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE id = $id`,\n )\n .get({ $id: id }) as TraceRow | undefined;\n\n return row === undefined ? undefined : toTrace(row);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_traces (\n id,\n session_id,\n name,\n status,\n trace_json,\n input_json,\n output,\n error_json,\n usage_json,\n metadata_json,\n observations_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $id,\n $sessionId,\n $name,\n $status,\n $trace,\n $input,\n $output,\n $error,\n $usage,\n $metadata,\n $observations,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n name = excluded.name,\n status = excluded.status,\n trace_json = excluded.trace_json,\n input_json = excluded.input_json,\n output = excluded.output,\n error_json = excluded.error_json,\n usage_json = excluded.usage_json,\n metadata_json = excluded.metadata_json,\n observations_json = excluded.observations_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $id: trace.id,\n $sessionId: trace.sessionId,\n $name: trace.name ?? null,\n $status: trace.status,\n $trace: trace.trace === undefined ? null : JSON.stringify(trace.trace),\n $input: trace.input === undefined ? null : JSON.stringify(trace.input),\n $output: trace.output ?? null,\n $error: trace.error === undefined ? null : JSON.stringify(trace.error),\n $usage: trace.usage === undefined ? null : JSON.stringify(trace.usage),\n $metadata: trace.metadata === undefined ? null : JSON.stringify(trace.metadata),\n $observations: JSON.stringify(trace.observations),\n $startedAt: trace.startedAt,\n $endedAt: trace.endedAt ?? null,\n $durationMs: trace.durationMs ?? null,\n });\n\n return trace;\n }\n\n private database(): DatabaseSyncType {\n if (this.db !== undefined) {\n return this.db;\n }\n\n if (this.path !== \":memory:\") {\n mkdirSync(dirname(resolve(this.path)), { recursive: true });\n }\n\n const db = new (loadDatabaseSync())(this.path, {\n allowUnknownNamedParameters: true,\n timeout: 5000,\n });\n db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n `);\n guardAgainstLegacySessionSchema(db);\n db.exec(`\n CREATE TABLE IF NOT EXISTS anvia_studio_sessions (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n title TEXT,\n metadata_json TEXT,\n compaction_state_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_sessions_agent_updated_idx\n ON anvia_studio_sessions(agent_id, updated_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_messages (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n role TEXT NOT NULL,\n message_id TEXT,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_messages_session_idx\n ON anvia_studio_session_messages(session_id, message_index ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_message_parts (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n part_index INTEGER NOT NULL,\n type TEXT NOT NULL,\n part_json TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index, part_index),\n FOREIGN KEY(session_id, message_index)\n REFERENCES anvia_studio_session_messages(session_id, message_index)\n ON DELETE CASCADE\n ) STRICT;\n CREATE TABLE IF NOT EXISTS anvia_studio_session_runs (\n run_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n title TEXT,\n transcript_json TEXT NOT NULL,\n error_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_runs_session_created_idx\n ON anvia_studio_session_runs(session_id, created_at ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_logs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(session_id, sequence),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_logs_session_sequence_idx\n ON anvia_studio_session_logs(session_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_logs (\n id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(pipeline_id, sequence)\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_logs_pipeline_sequence_idx\n ON anvia_studio_pipeline_logs(pipeline_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_runs (\n run_id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n status TEXT NOT NULL,\n input_json TEXT NOT NULL,\n output_json TEXT,\n error_json TEXT,\n metadata_json TEXT,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_runs_pipeline_started_idx\n ON anvia_studio_pipeline_runs(pipeline_id, started_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_traces (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n name TEXT,\n status TEXT NOT NULL,\n trace_json TEXT,\n input_json TEXT,\n output TEXT,\n error_json TEXT,\n usage_json TEXT,\n metadata_json TEXT,\n observations_json TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_traces_session_started_idx\n ON anvia_studio_traces(session_id, started_at DESC);\n `);\n ensureSessionCompactionStateColumn(db);\n ensureMessageMetadataColumn(db);\n\n this.db = db;\n return db;\n }\n\n private getSessionRow(id: string): SessionRow | undefined {\n return this.database()\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as SessionRow | undefined;\n }\n\n private getCompactionSessionRow(id: string): CompactionSessionRow | undefined {\n return this.database()\n .prepare(\n `SELECT id, compaction_state_json\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as CompactionSessionRow | undefined;\n }\n\n private getSessionRun(sessionId: string, runId: string): SessionRunRow | undefined {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId AND run_id = $runId`,\n )\n .get({ $sessionId: sessionId, $runId: runId }) as SessionRunRow | undefined;\n }\n\n private listSessionRunRows(sessionId: string): SessionRunRow[] {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId\n ORDER BY created_at ASC`,\n )\n .all({ $sessionId: sessionId }) as SessionRunRow[];\n }\n\n private nextSessionLogSequence(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private nextPipelineLogSequence(pipelineId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId`,\n )\n .get({ $pipelineId: pipelineId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private listSessionMessages(sessionId: string): Message[] {\n return this.listSessionMessageEntries(sessionId).map((entry) => entry.message);\n }\n\n private listCompactionMessages(\n sessionId: string,\n state: StoredStudioCompactionState | undefined,\n ): StudioCompactionMessageRow[] {\n return this.listSessionMessageEntries(sessionId, state?.summarizedThroughPosition);\n }\n\n private listSessionMessageEntries(\n sessionId: string,\n minimumIndex?: number,\n ): StudioCompactionMessageRow[] {\n const db = this.database();\n const boundaryClause = minimumIndex === undefined ? \"\" : \"AND message_index >= $minimumIndex\";\n const parameters =\n minimumIndex === undefined\n ? { $sessionId: sessionId }\n : { $sessionId: sessionId, $minimumIndex: minimumIndex };\n const messageRows = db\n .prepare(\n `SELECT session_id, message_index, role, message_id, metadata_json, created_at\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId\n ${boundaryClause}\n ORDER BY message_index ASC`,\n )\n .all(parameters) as MessageRow[];\n\n if (messageRows.length === 0) {\n return [];\n }\n\n const partRows = db\n .prepare(\n `SELECT session_id, message_index, part_index, type, part_json\n FROM anvia_studio_session_message_parts\n WHERE session_id = $sessionId\n ${boundaryClause}\n ORDER BY message_index ASC, part_index ASC`,\n )\n .all(parameters) as MessagePartRow[];\n const partsByMessage = new Map<number, MessagePartRow[]>();\n for (const partRow of partRows) {\n const parts = partsByMessage.get(partRow.message_index) ?? [];\n parts.push(partRow);\n partsByMessage.set(partRow.message_index, parts);\n }\n\n return messageRows.map((row) => ({\n position: row.message_index,\n message: messageFromRows(row, partsByMessage.get(row.message_index) ?? []),\n }));\n }\n\n private nextMessageIndex(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(message_index) + 1, 0) AS next_index\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_index: number };\n return row.next_index;\n }\n\n private insertMessages(\n sessionId: string,\n messages: Message[],\n startIndex: number,\n createdAt: string,\n ): void {\n const db = this.database();\n const insertMessage = db.prepare(\n `INSERT INTO anvia_studio_session_messages (\n session_id,\n message_index,\n role,\n message_id,\n metadata_json,\n created_at\n ) VALUES ($sessionId, $messageIndex, $role, $messageId, $metadata, $createdAt)`,\n );\n const insertPart = db.prepare(\n `INSERT INTO anvia_studio_session_message_parts (\n session_id,\n message_index,\n part_index,\n type,\n part_json\n ) VALUES ($sessionId, $messageIndex, $partIndex, $type, $partJson)`,\n );\n\n messages.forEach((message, messageOffset) => {\n const messageIndex = startIndex + messageOffset;\n if (message.metadata !== undefined && !isJsonValue(message.metadata)) {\n throw new TypeError(\"Studio message metadata must be a strict JSON value.\");\n }\n insertMessage.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $role: message.role,\n $messageId: message.role === \"assistant\" ? (message.id ?? null) : null,\n $metadata: message.metadata === undefined ? null : JSON.stringify(message.metadata),\n $createdAt: createdAt,\n });\n\n messageParts(message).forEach((part, partIndex) => {\n insertPart.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $partIndex: partIndex,\n $type: part.type,\n $partJson: JSON.stringify(part.value),\n });\n });\n });\n }\n}\n\nfunction toSession(\n row: SessionRow,\n messages: Message[],\n runRows: SessionRunRow[] = [],\n): StudioSession {\n const summary = toSessionSummary({ ...row, message_count: messages.length });\n const runTranscript = runRows.flatMap((runRow) =>\n parseJsonArray<StudioTranscriptEntry>(runRow.transcript_json),\n );\n return {\n ...summary,\n messages,\n transcript: renumberTranscript(runTranscript),\n };\n}\n\nfunction toSessionSummary(row: SessionSummaryRow): StudioSessionSummary {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const summary: StudioSessionSummary = {\n id: row.id,\n agentId: row.agent_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: row.message_count,\n };\n if (row.title !== null) summary.title = row.title;\n if (metadata !== undefined) summary.metadata = metadata;\n return summary;\n}\n\nfunction toSessionLog(row: SessionLogRow): StudioSessionLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const entry: StudioSessionLogEntry = {\n id: row.id,\n sessionId: row.session_id,\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n };\n if (row.run_id !== null) entry.runId = row.run_id;\n if (metadata !== undefined) entry.metadata = metadata;\n return entry;\n}\n\nfunction toPipelineLog(row: PipelineLogRow): StudioPipelineLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const entry: StudioPipelineLogEntry = {\n id: row.id,\n pipelineId: row.pipeline_id,\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n };\n if (row.run_id !== null) entry.runId = row.run_id;\n if (metadata !== undefined) entry.metadata = metadata;\n return entry;\n}\n\nfunction toPipelineRun(row: PipelineRunRow): StudioPipelineRunRecord {\n const output = parseJsonValue<JsonValue>(row.output_json);\n const error = parseJsonValue<JsonValue>(row.error_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const record: StudioPipelineRunRecord = {\n runId: row.run_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n input: JSON.parse(row.input_json) as JsonValue,\n startedAt: row.started_at,\n };\n if (output !== undefined) record.output = output;\n if (error !== undefined) record.error = error;\n if (metadata !== undefined) record.metadata = metadata;\n if (row.ended_at !== null) record.endedAt = row.ended_at;\n if (row.duration_ms !== null) record.durationMs = row.duration_ms;\n return record;\n}\n\nfunction messageParts(message: Message): StoredMessagePart[] {\n if (message.role === \"system\") {\n return [{ type: \"text\", value: { type: \"text\", text: message.content } }];\n }\n\n if (typeof message.content === \"string\") {\n return [{ type: \"text\", value: { type: \"text\", text: message.content } }];\n }\n return message.content.map((content) => ({\n type: content.type,\n value: content,\n }));\n}\n\nfunction messageFromRows(row: MessageRow, partRows: MessagePartRow[]): Message {\n const parts = partRows.map((partRow) => JSON.parse(partRow.part_json) as unknown);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n if (\n metadata !== undefined &&\n (!isJsonValue(metadata) ||\n typeof metadata !== \"object\" ||\n metadata === null ||\n Array.isArray(metadata))\n ) {\n throw new TypeError(\"Stored Studio message metadata is not a strict JSON object.\");\n }\n if (row.role === \"system\") {\n let message: Extract<Message, { role: \"system\" }> = {\n role: \"system\",\n content: systemContentFromParts(parts),\n };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n if (row.role === \"user\") {\n let message: Extract<Message, { role: \"user\" }> = {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n if (row.role === \"assistant\") {\n let message: Extract<Message, { role: \"assistant\" }> = {\n role: \"assistant\",\n content: parts as Extract<Message, { role: \"assistant\" }>[\"content\"],\n };\n if (row.message_id !== null) message = { ...message, id: row.message_id };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n if (row.role === \"tool\") {\n let message: Extract<Message, { role: \"tool\" }> = {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n\n throw new Error(`Unsupported stored message role: ${row.role}`);\n}\n\nfunction systemContentFromParts(parts: unknown[]): string {\n const first = parts[0];\n if (\n typeof first === \"object\" &&\n first !== null &&\n \"type\" in first &&\n first.type === \"text\" &&\n \"text\" in first &&\n typeof first.text === \"string\"\n ) {\n return first.text;\n }\n return \"\";\n}\n\nfunction guardAgainstLegacySessionSchema(db: DatabaseSyncType): void {\n const columns = db.prepare(\"PRAGMA table_info('anvia_studio_sessions')\").all() as TableInfoRow[];\n if (columns.some((column) => column.name === \"messages_json\")) {\n throw new Error(\n \"Existing Studio SQLite DB uses the legacy messages_json schema. Delete or recreate the Studio SQLite DB to use normalized session messages.\",\n );\n }\n}\n\nfunction ensureMessageMetadataColumn(db: DatabaseSyncType): void {\n const columns = db\n .prepare(\"PRAGMA table_info('anvia_studio_session_messages')\")\n .all() as TableInfoRow[];\n if (!columns.some((column) => column.name === \"metadata_json\")) {\n db.exec(\"ALTER TABLE anvia_studio_session_messages ADD COLUMN metadata_json TEXT\");\n }\n}\n\nfunction ensureSessionCompactionStateColumn(db: DatabaseSyncType): void {\n const columns = db.prepare(\"PRAGMA table_info('anvia_studio_sessions')\").all() as TableInfoRow[];\n if (!columns.some((column) => column.name === \"compaction_state_json\")) {\n db.exec(\"ALTER TABLE anvia_studio_sessions ADD COLUMN compaction_state_json TEXT\");\n }\n}\n\nfunction loadDatabaseSync(): DatabaseSyncConstructor {\n if (DatabaseSync !== undefined) {\n return DatabaseSync;\n }\n\n try {\n ({ DatabaseSync } = createRequire(import.meta.url)(\n \"node:sqlite\",\n ) as typeof import(\"node:sqlite\"));\n return DatabaseSync;\n } catch (error) {\n throw new Error(\n \"The default Studio SQLite store requires Node.js with node:sqlite support. Provide custom Studio stores or disable persisted stores when running Studio in a runtime without node:sqlite.\",\n { cause: error },\n );\n }\n}\n\nfunction toTrace(row: TraceRow): StudioTrace {\n const trace = parseJsonValue<StudioTrace[\"trace\"]>(row.trace_json);\n const input = parseJsonValue<StudioTrace[\"input\"]>(row.input_json);\n const result: StudioTrace = {\n ...toTraceSummary(row),\n observations: parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json),\n };\n if (trace !== undefined) result.trace = trace;\n if (input !== undefined) result.input = input;\n return result;\n}\n\nfunction toTraceSummary(row: TraceRow): StudioTraceSummary {\n const observations = parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json);\n const error = parseJsonValue<StudioTraceSummary[\"error\"]>(row.error_json);\n const usage = parseJsonValue<StudioTraceSummary[\"usage\"]>(row.usage_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const summary: StudioTraceSummary = {\n id: row.id,\n sessionId: row.session_id,\n status: row.status,\n startedAt: row.started_at,\n observationCount: observations.length,\n };\n if (row.name !== null) summary.name = row.name;\n if (row.ended_at !== null) summary.endedAt = row.ended_at;\n if (row.duration_ms !== null) summary.durationMs = row.duration_ms;\n if (row.output !== null) summary.output = row.output;\n if (error !== undefined) summary.error = error;\n if (usage !== undefined) summary.usage = usage;\n if (metadata !== undefined) summary.metadata = metadata;\n if (typeof metadata?.runId === \"string\") summary.runId = metadata.runId;\n return summary;\n}\n\nfunction parseJsonArray<T>(value: string): T[] {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as T[]) : [];\n}\n\nfunction parseJsonValue<T>(value: string | null): T | undefined {\n if (value === null) {\n return undefined;\n }\n return JSON.parse(value) as T;\n}\n\nfunction studioRunId(scope: MemoryScope): string | undefined {\n const value = scope.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n if (\n error === null ||\n typeof error === \"string\" ||\n typeof error === \"number\" ||\n typeof error === \"boolean\"\n ) {\n return error;\n }\n return String(error);\n}\n","import { parseMessage, type Message } from \"@anvia/core/completion\";\nimport { isMemoryCompactionMessage, type MemoryCompactionMessage } from \"@anvia/core/memory\";\n\nexport type StoredStudioCompactionState = {\n version: 1;\n generation: number;\n summary: MemoryCompactionMessage;\n summarizedThroughPosition: number;\n};\n\nexport type StudioCompactionMessageRow = {\n position: number;\n message: Message;\n};\n\nexport function parseStudioCompactionState(\n value: string | null,\n): StoredStudioCompactionState | undefined {\n if (value === null) return undefined;\n const parsed: unknown = JSON.parse(value);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Stored Studio memory compaction state is invalid.\");\n }\n const record = parsed as Record<string, unknown>;\n let summary: Message;\n try {\n summary = parseMessage(record.summary);\n } catch (cause) {\n throw new Error(\"Stored Studio memory compaction state summary is invalid.\", { cause });\n }\n if (\n record.version !== 1 ||\n !Number.isSafeInteger(record.generation) ||\n (record.generation as number) < 1 ||\n !isMemoryCompactionMessage(summary) ||\n !Number.isSafeInteger(record.summarizedThroughPosition) ||\n (record.summarizedThroughPosition as number) < 0\n ) {\n throw new Error(\"Stored Studio memory compaction state is invalid.\");\n }\n return {\n version: 1,\n generation: record.generation as number,\n summary,\n summarizedThroughPosition: record.summarizedThroughPosition as number,\n };\n}\n\nexport function projectStudioCompactionMessages(\n rows: StudioCompactionMessageRow[],\n state: StoredStudioCompactionState | undefined,\n): Message[] {\n if (state === undefined) return rows.map((row) => row.message);\n return [state.summary, ...activeStudioCompactionMessages(rows, state).map((row) => row.message)];\n}\n\nexport function activeStudioCompactionMessages(\n rows: StudioCompactionMessageRow[],\n state: StoredStudioCompactionState | undefined,\n): StudioCompactionMessageRow[] {\n if (state === undefined) return rows;\n const boundaryIndex = rows.findIndex((row) => row.position === state.summarizedThroughPosition);\n if (boundaryIndex === -1) {\n throw new Error(\"Stored Studio memory compaction state boundary is invalid.\");\n }\n return rows.slice(boundaryIndex + 1);\n}\n\nexport function studioCompactionRevision(\n rows: StudioCompactionMessageRow[],\n state: StoredStudioCompactionState | undefined,\n): string {\n return JSON.stringify([state?.generation ?? 0, rows]);\n}\n"],"mappings":"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","names":["getAgentToolState","path","config","resolve","appendSessionLog","appendPipelineLog","isJsonValue","contents","resolve","isJsonValue","durationMs","byteLength","runId","execution","durationMs","isRecord","isRecord","getAgentToolState","toJsonValue","byteLength","resolve","isRecord","process","isRecord","candidate","run","resolve","getAgentToolState","shutdownOptions","isJsonValue","path","studioRunId","serializeJsonError","isJsonValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/studio.ts","../src/traces/trace-observer.ts","../src/runtime/json.ts","../src/ui/routes.tsx","../src/runtime/agent-context.ts","../src/runtime/agent-runs.ts","../src/runtime/agent-utils.ts","../src/runtime/errors.ts","../src/runtime/type-guards.ts","../src/runtime/http.ts","../src/runtime/models.ts","../src/runtime/streams.ts","../src/runtime/trace-summary.ts","../src/runtime/observability.ts","../src/runtime/runs.ts","../src/runtime/transcript.ts","../src/runtime/session-logs.ts","../src/runtime/config.ts","../src/runtime/eval-config.ts","../src/runtime/knowledge.ts","../src/runtime/query.ts","../src/runtime/tool-metadata.ts","../src/runtime/evals.ts","../src/runtime/graphs.ts","../src/runtime/interactions.ts","../src/runtime/mcps.ts","../src/runtime/memory.ts","../src/runtime/pipelines.ts","../src/runtime/pipeline-logs.ts","../src/runtime/run-lifecycle.ts","../src/runtime/sandbox-views.ts","../src/runtime/sandboxes.ts","../src/runtime/sessions.ts","../src/storage/memory-store.ts","../src/runtime/shared.ts","../src/runtime/status.ts","../src/runtime/tools.ts","../src/runtime/trace-routes.ts","../src/storage/sqlite-store.ts","../src/storage/compaction-state.ts"],"sourcesContent":["import type { JsonObject } from \"@anvia/core/completion\";\nimport { Agent, getAgentToolState } from \"@anvia/core/internal/agent\";\nimport { Pipeline } from \"@anvia/core/pipeline\";\nimport { serve, type WebSocketServerLike } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { Hono as HonoApp } from \"hono\";\nimport { WebSocketServer } from \"ws\";\nimport { StudioTraceObserver } from \"../traces/trace-observer\";\nimport type {\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioPipeline,\n StudioSandboxRegistration,\n StudioServeLifecycleOptions,\n StudioServeOptions,\n StudioSessionStore,\n StudioTarget,\n StudioTraceStore,\n} from \"../types\";\nimport {\n isStudioUiEnabled,\n registerStudioUi,\n resolveStudioUiOptions,\n studioUiEntryPath,\n} from \"../ui/routes\";\nimport { staticContextDocuments, vectorContexts } from \"./agent-context\";\nimport { type PreparedAgentRun, registerAgentRunRoute } from \"./agent-runs\";\nimport { cloneAgent } from \"./agent-utils\";\nimport {\n agentConfig,\n agentRuntimeSummary,\n buildConfig,\n runnerId,\n unsupportedCapabilities,\n} from \"./config\";\nimport { registerEvalRoutes } from \"./evals\";\nimport { registerGraphRoutes } from \"./graphs\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport { createStudioContinuationRegistry } from \"./interactions\";\nimport { registerKnowledgeRoutes } from \"./knowledge\";\nimport { registerMcpRoutes } from \"./mcps\";\nimport { createStudioMemorySourceRegistry, registerMemoryRoutes } from \"./memory\";\nimport { createStudioModelRegistry, registerModelRoutes } from \"./models\";\nimport {\n observeStores,\n registerObservabilityRoutes,\n StudioObservabilityHub,\n} from \"./observability\";\nimport type { StudioRuntimeOptions } from \"./options\";\nimport { registerPipelineRoutes } from \"./pipelines\";\nimport { StudioRunLifecycle } from \"./run-lifecycle\";\nimport { registerSandboxViewRoutes } from \"./sandbox-views\";\nimport { createStudioSandboxRegistry, registerSandboxRoutes } from \"./sandboxes\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport { normalizeAgents, normalizePipelines, resolveStores } from \"./shared\";\nimport { registerStatusRoutes } from \"./status\";\nimport { toolRequiresApproval } from \"./tool-metadata\";\nimport { registerToolRoutes } from \"./tools\";\nimport { registerTraceRoutes } from \"./trace-routes\";\n\ntype StudioApp = AnviaStudio & {\n readonly sessionStore?: StudioSessionStore;\n readonly traceStore?: StudioTraceStore;\n};\n\nexport class Studio implements AnviaStudio {\n private readonly options: StudioRuntimeOptions;\n private studio: StudioApp;\n private server: ReturnType<typeof serve> | undefined;\n private websocketServer: WebSocketServer | undefined;\n private signalHandlers: { readonly sigint: () => void; readonly sigterm: () => void } | undefined;\n private shutdownPromise: Promise<void> | undefined;\n\n constructor(targets: StudioTarget[] = [], options: StudioOptions = {}) {\n this.options = studioOptionsFromTargets(targets, options);\n this.studio = createStudioApp(this.options);\n }\n\n get app(): Hono {\n return this.studio.app;\n }\n\n fetch(request: Request): Response | Promise<Response> {\n return this.studio.fetch(request);\n }\n\n config(): StudioConfig {\n return this.studio.config();\n }\n\n traceObserver(): StudioTraceObserver {\n return new StudioTraceObserver({\n store: () => this.studio.traceStore,\n });\n }\n\n start(serveOptions: StudioServeOptions = {}): this {\n this.close();\n this.studio = createStudioApp(this.options);\n this.shutdownPromise = undefined;\n\n const port = serveOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n const serverOptions: Parameters<typeof serve>[0] = {\n fetch: (request, env) => this.studio.app.fetch(request, env),\n port,\n };\n this.websocketServer = new WebSocketServer({ noServer: true });\n serverOptions.websocket = {\n // @types/ws overloads are stricter than Hono's structural adapter, while Hono officially\n // supports ws.WebSocketServer. Keep the interop assertion at this single ownership boundary.\n server: this.websocketServer as unknown as WebSocketServerLike,\n };\n if (serveOptions.hostname !== undefined) serverOptions.hostname = serveOptions.hostname;\n this.server = serve(serverOptions);\n\n const log = serveOptions.log ?? true;\n if (log) {\n const host = serveOptions.hostname ?? \"localhost\";\n this.logAddress(host, port);\n }\n\n if (serveOptions.handleSignals ?? true) {\n const shutdownFor = (signal: \"SIGINT\" | \"SIGTERM\") => {\n process.exitCode = signal === \"SIGINT\" ? 130 : 143;\n void this.shutdown(shutdownOptions(serveOptions.shutdownTimeoutMs)).catch(\n (error: unknown) => {\n console.error(error);\n process.exitCode = 1;\n },\n );\n };\n this.signalHandlers = {\n sigint: () => shutdownFor(\"SIGINT\"),\n sigterm: () => shutdownFor(\"SIGTERM\"),\n };\n process.once(\"SIGINT\", this.signalHandlers.sigint);\n process.once(\"SIGTERM\", this.signalHandlers.sigterm);\n }\n\n return this;\n }\n\n async serve(serveOptions: StudioServeLifecycleOptions = {}): Promise<void> {\n const { onShutdown, shutdownTimeoutMs, signal, ...startOptions } = serveOptions;\n const failures: unknown[] = [];\n\n try {\n this.start({ ...startOptions, log: false, handleSignals: false });\n const server = this.server;\n if (server === undefined) {\n throw new Error(\"Studio server did not start\");\n }\n\n await waitForServerListening(server);\n\n if (startOptions.log ?? true) {\n const requestedPort = startOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n const address = server.address();\n const port = typeof address === \"object\" && address !== null ? address.port : requestedPort;\n this.logAddress(startOptions.hostname ?? \"localhost\", port);\n }\n\n await waitForShutdown(signal);\n } catch (error) {\n failures.push(error);\n }\n\n try {\n await this.shutdown(shutdownOptions(shutdownTimeoutMs));\n } catch (error) {\n failures.push(error);\n }\n try {\n await onShutdown?.();\n } catch (error) {\n failures.push(error);\n }\n\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) {\n throw new AggregateError(failures, \"Failed to run and shut down Anvia Studio.\");\n }\n }\n\n close(): void {\n this.removeSignalHandlers();\n this.closeNetwork();\n this.studio.close();\n }\n\n shutdown(options: { timeoutMs?: number } = {}): Promise<void> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return Promise.reject(\n new TypeError(\"Anvia Studio shutdown timeoutMs must be a positive number.\"),\n );\n }\n this.shutdownPromise ??= this.shutdownResources(timeoutMs);\n return this.shutdownPromise;\n }\n\n private async shutdownResources(timeoutMs: number): Promise<void> {\n this.removeSignalHandlers();\n this.closeNetwork();\n await this.studio.shutdown({ timeoutMs });\n }\n\n private removeSignalHandlers(): void {\n if (this.signalHandlers === undefined) return;\n process.off(\"SIGINT\", this.signalHandlers.sigint);\n process.off(\"SIGTERM\", this.signalHandlers.sigterm);\n this.signalHandlers = undefined;\n }\n\n private closeNetwork(): void {\n this.server?.close();\n this.server = undefined;\n this.websocketServer?.close();\n this.websocketServer = undefined;\n }\n\n private logAddress(host: string, port: number): void {\n if (isStudioUiEnabled(this.options.ui)) {\n const uiPath = studioUiEntryPath(resolveStudioUiOptions(this.options.ui));\n console.log(`Studio UI: http://${host}:${port}${uiPath}`);\n } else {\n console.log(`Studio API: http://${host}:${port}`);\n }\n }\n}\n\nfunction shutdownOptions(timeoutMs: number | undefined): { timeoutMs?: number } {\n return timeoutMs === undefined ? {} : { timeoutMs };\n}\n\ntype StudioServer = ReturnType<typeof serve>;\n\nfunction waitForServerListening(server: StudioServer): Promise<void> {\n if (server.listening) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n server.off(\"listening\", onListening);\n server.off(\"error\", onError);\n };\n const onListening = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n server.once(\"listening\", onListening);\n server.once(\"error\", onError);\n });\n}\n\nfunction waitForShutdown(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n\n return new Promise((resolve) => {\n const useRawInput = process.stdin.isTTY === true;\n const wasRaw = process.stdin.isRaw;\n const wasFlowing = process.stdin.readableFlowing;\n\n const cleanup = () => {\n process.off(\"SIGINT\", finish);\n process.off(\"SIGTERM\", finish);\n signal?.removeEventListener(\"abort\", finish);\n if (useRawInput) {\n process.stdin.off(\"data\", onInput);\n if (!wasRaw && process.stdin.isRaw) process.stdin.setRawMode(false);\n if (wasFlowing !== true) process.stdin.pause();\n }\n };\n const finish = () => {\n cleanup();\n resolve();\n };\n const onInput = (chunk: Buffer | string) => {\n const interrupted = typeof chunk === \"string\" ? chunk.includes(\"\\u0003\") : chunk.includes(3);\n if (interrupted) finish();\n };\n\n process.once(\"SIGINT\", finish);\n process.once(\"SIGTERM\", finish);\n signal?.addEventListener(\"abort\", finish, { once: true });\n if (useRawInput) {\n if (!wasRaw) process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", onInput);\n }\n });\n}\n\nfunction studioOptionsFromTargets(\n targets: StudioTarget[],\n options: StudioOptions,\n): StudioRuntimeOptions {\n const agents = targets.filter((target): target is Agent => target instanceof Agent);\n const pipelines = targets.filter(\n // oxlint-disable-next-line typescript/no-explicit-any -- Studio accepts heterogeneous user pipelines.\n (target): target is Pipeline<any, any> => target instanceof Pipeline,\n );\n const runtimeOptions: StudioRuntimeOptions = {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\n pipelines: inferStudioPipelines(pipelines),\n evals: options.evals ?? [],\n graphs: options.graphs === undefined ? [] : [...options.graphs],\n };\n if (options.models !== undefined) runtimeOptions.models = options.models;\n if (options.stores !== undefined) runtimeOptions.stores = options.stores;\n if (options.ui !== undefined) runtimeOptions.ui = options.ui;\n if (options.sandboxes !== undefined) {\n runtimeOptions.sandboxes = options.sandboxes.map((registration) => {\n let snapshot: StudioSandboxRegistration = { inspector: registration.inspector };\n if (registration.agentIds !== undefined) {\n snapshot = { ...snapshot, agentIds: [...registration.agentIds] };\n }\n if (registration.toolNames !== undefined) {\n snapshot = { ...snapshot, toolNames: [...registration.toolNames] };\n }\n if (registration.views !== undefined) {\n snapshot = { ...snapshot, views: [...registration.views] };\n }\n return snapshot;\n });\n }\n return runtimeOptions;\n}\n\nfunction inferStudioAgents(agents: Agent[], quickPrompts: Record<string, string[]>): StudioAgent[] {\n const ids = new Set<string>();\n return agents.map((agent) => {\n const id = uniqueAgentId(agent.id, ids);\n return {\n id,\n agent,\n quickPrompts: quickPrompts[id] ?? [],\n metadata: agentMetadata(agent),\n };\n });\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any -- Studio accepts heterogeneous user pipelines.\nfunction inferStudioPipelines(pipelines: Array<Pipeline<any, any>>): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = uniqueAgentId(pipeline.id || \"pipeline\", ids);\n const studioPipeline: StudioPipeline = {\n id,\n pipeline,\n };\n if (pipeline.name !== undefined) studioPipeline.name = pipeline.name;\n if (pipeline.description !== undefined) studioPipeline.description = pipeline.description;\n if (pipeline.metadata !== undefined) studioPipeline.metadata = pipeline.metadata;\n return studioPipeline;\n });\n}\n\nfunction uniqueAgentId(baseId: string, ids: Set<string>): string {\n let id = baseId;\n let suffix = 2;\n while (ids.has(id)) {\n id = `${baseId}-${suffix}`;\n suffix += 1;\n }\n ids.add(id);\n return id;\n}\n\nfunction agentMetadata(agent: Agent): JsonObject {\n const metadata: JsonObject = {\n staticContextCount: staticContextDocuments(agent).length,\n dynamicContextCount: vectorContexts(agent).length,\n dynamicToolCount: getAgentToolState(agent).toolIndexes.length,\n hasLifecycle: agent.lifecycle !== undefined,\n hasOutputSchema: agent.outputSchema !== undefined,\n observerCount: Object.keys(agent.observability?.observers ?? {}).length,\n approvalToolCount: agent.tools.filter(toolRequiresApproval).length,\n };\n if (agent.defaultMaxTurns !== undefined) metadata.defaultMaxTurns = agent.defaultMaxTurns;\n return metadata;\n}\n\nfunction createStudioApp(options: StudioRuntimeOptions): StudioApp {\n const observabilityHub = new StudioObservabilityHub();\n const stores = observeStores(resolveStores(options), observabilityHub);\n const agents = normalizeAgents(options.agents).map((agent) =>\n withStudioTraceObserver(agent, stores.traces),\n );\n const modelRegistry = createStudioModelRegistry(options.models);\n const pipelines = normalizePipelines(options.pipelines);\n const agentMap = new Map(agents.map((agent) => [agent.id, agent]));\n const pipelineMap = new Map(pipelines.map((pipeline) => [pipeline.id, pipeline]));\n const evalMap = new Map(options.evals.map((suite) => [suite.id ?? suite.name, suite]));\n const continuationRegistry = createStudioContinuationRegistry<PreparedAgentRun>();\n const runLifecycle = new StudioRunLifecycle();\n const sandboxRegistry = createStudioSandboxRegistry(agents, options.sandboxes ?? []);\n const memorySources = createStudioMemorySourceRegistry(agents, stores.sessions);\n const app = new HonoApp();\n const uiOptions = isStudioUiEnabled(options.ui) ? resolveStudioUiOptions(options.ui) : undefined;\n\n if (uiOptions !== undefined && !uiOptions.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n if (uiOptions?.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n app.get(\"/health\", (c) =>\n c.json({\n status: \"ok\",\n runner: {\n id: runnerId(options),\n name: options.name,\n version: options.version,\n },\n }),\n );\n\n app.get(\"/config\", (c) =>\n c.json(buildConfig(options, agents, pipelines, stores, sandboxRegistry.size)),\n );\n registerStatusRoutes(app, {\n options,\n agents,\n pipelines,\n stores,\n sandboxCount: sandboxRegistry.size,\n });\n\n app.get(\"/agents\", (c) => c.json({ agents: agents.map(agentConfig) }));\n\n app.get(\"/agents/:agentId\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentConfig(agent));\n });\n\n app.get(\"/agents/:agentId/runtime\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentRuntimeSummary(agent));\n });\n\n registerModelRoutes(app, { registry: modelRegistry, agentMap });\n registerMcpRoutes(app, { agentMap });\n registerToolRoutes(app, { agentMap });\n registerSandboxRoutes(app, sandboxRegistry);\n const closeSandboxViews = registerSandboxViewRoutes(app, sandboxRegistry);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\n registerGraphRoutes(app, options.graphs);\n const knowledgeOptions: Parameters<typeof registerKnowledgeRoutes>[1] = { agents };\n if (stores.traces !== undefined) knowledgeOptions.traceStore = stores.traces;\n registerKnowledgeRoutes(app, knowledgeOptions);\n const pipelineOptions: Parameters<typeof registerPipelineRoutes>[1] = {\n pipelines,\n pipelineMap,\n runLifecycle,\n };\n if (stores.pipelineLogs !== undefined) pipelineOptions.logStore = stores.pipelineLogs;\n if (stores.pipelineRuns !== undefined) pipelineOptions.runStore = stores.pipelineRuns;\n registerPipelineRoutes(app, pipelineOptions);\n\n registerAgentRunRoute(app, {\n agentMap,\n stores,\n modelRegistry,\n continuationRegistry,\n runLifecycle,\n });\n\n if (memorySources.size > 0 || stores.sessions !== undefined) {\n registerMemoryRoutes(app, {\n sources: memorySources,\n sessionStore: stores.sessions,\n });\n }\n\n if (stores.sessions !== undefined) {\n const sessionOptions: Parameters<typeof registerSessionRoutes>[1] = {\n agentMap,\n sessionStore: stores.sessions,\n };\n if (stores.traces !== undefined) sessionOptions.traceStore = stores.traces;\n registerSessionRoutes(app, sessionOptions);\n }\n\n if (stores.traces !== undefined) {\n registerTraceRoutes(app, stores.traces);\n }\n\n for (const capability of unsupportedCapabilities(stores)) {\n app.all(`/${capability}`, (c) => unsupportedCapability(c, capability));\n app.all(`/${capability}/*`, (c) => unsupportedCapability(c, capability));\n }\n\n let closing = false;\n const beginClose = () => {\n if (closing) return;\n closing = true;\n continuationRegistry.clear();\n closeSandboxViews();\n runLifecycle.close();\n };\n const studio: StudioApp = {\n app,\n fetch(request: Request): Response | Promise<Response> {\n return app.fetch(request);\n },\n config(): StudioConfig {\n return buildConfig(options, agents, pipelines, stores, sandboxRegistry.size);\n },\n close() {\n beginClose();\n },\n async shutdown(shutdownOptions = {}) {\n beginClose();\n await runLifecycle.drain(shutdownOptions.timeoutMs ?? 30_000);\n },\n };\n if (stores.sessions !== undefined) Object.assign(studio, { sessionStore: stores.sessions });\n if (stores.traces !== undefined) Object.assign(studio, { traceStore: stores.traces });\n return studio;\n}\n\nfunction withStudioTraceObserver(\n studioAgent: StudioAgent,\n traceStore: StudioTraceStore | undefined,\n): StudioAgent {\n if (traceStore === undefined) return studioAgent;\n const existing = studioAgent.agent.observability;\n const studioObserver = existing?.observers.studio;\n if (studioObserver !== undefined && !(studioObserver instanceof StudioTraceObserver)) {\n throw new TypeError('Studio reserves the observer name \"studio\" for local trace persistence.');\n }\n for (const [name, observer] of Object.entries(existing?.observers ?? {})) {\n if (observer instanceof StudioTraceObserver && name !== \"studio\") {\n throw new TypeError('StudioTraceObserver must be registered with the name \"studio\".');\n }\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n observability: {\n observers: {\n ...existing?.observers,\n studio: studioObserver ?? new StudioTraceObserver({ store: traceStore }),\n },\n primaryTrace: \"studio\",\n errorPolicy: existing?.errorPolicy ?? \"ignore\",\n },\n }),\n };\n}\n","import { AgentRunCancelledError } from \"@anvia/core/agent\";\nimport type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentObserver,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunObserver,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n AgentToolSuspendedArgs,\n} from \"@anvia/core/observability\";\nimport {\n compactJsonObject,\n serializeUnknown as serializeError,\n toJsonValue,\n} from \"../runtime/json\";\nimport type {\n StudioTrace,\n StudioTraceObservation,\n StudioTraceStatus,\n StudioTraceStore,\n} from \"../types\";\n\nexport type StudioTraceObserverOptions = {\n store: StudioTraceStore | (() => StudioTraceStore | undefined) | undefined;\n};\n\nexport class StudioTraceObserver implements AgentObserver {\n constructor(private readonly options: StudioTraceObserverOptions) {}\n\n startRun(args: AgentRunStartArgs): AgentRunObserver {\n const traceId = args.trace?.traceId ?? globalThis.crypto.randomUUID().replaceAll(\"-\", \"\");\n const observationId = globalThis.crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 16);\n return new StudioRunTraceObserver({\n id: traceId,\n observationId,\n args,\n store: this.store(),\n });\n }\n\n private store(): StudioTraceStore | undefined {\n return typeof this.options.store === \"function\" ? this.options.store() : this.options.store;\n }\n}\n\nclass StudioRunTraceObserver implements AgentRunObserver {\n readonly trace: { traceId: string; observationId: string };\n private readonly startedAt = new Date();\n private readonly observations: StudioTraceObservation[] = [];\n\n constructor(\n private readonly props: {\n id: string;\n observationId: string;\n args: AgentRunStartArgs;\n store: StudioTraceStore | undefined;\n },\n ) {\n this.trace = { traceId: props.id, observationId: props.observationId };\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n const startedAt = new Date();\n return {\n end: (endArgs: AgentGenerationEndArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n output: toJsonValue(endArgs.response),\n metadata: generationMetadata(args, endArgs),\n }),\n );\n },\n error: (errorArgs: AgentGenerationErrorArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n error: serializeError(errorArgs.error),\n metadata: generationMetadata(args),\n }),\n );\n },\n };\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const startedAt = new Date();\n const childTrace = new ChildAgentToolTraceAccumulator(args);\n return {\n streamEvent: (streamArgs: AgentToolStreamEventArgs) => {\n childTrace.accept(streamArgs);\n },\n end: (endArgs: AgentToolEndArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n output: parseOrString(endArgs.result),\n metadata: toolMetadata(args, endArgs.skipped, endArgs.result),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n suspend: (suspendArgs: AgentToolSuspendedArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"suspended\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n output: toJsonValue({ interaction: suspendArgs.interaction }),\n metadata: toolMetadata(args, false),\n }),\n );\n },\n error: (errorArgs: AgentToolErrorArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n error: serializeError(errorArgs.error),\n metadata: toolMetadata(args, false),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n };\n }\n\n async end(args: AgentRunEndArgs): Promise<void> {\n const result: JsonObject = {\n runId: this.props.args.runId,\n status: args.status,\n text: args.text,\n };\n if (args.resumedFrom !== undefined) result.resumedFrom = args.resumedFrom;\n if (args.status === \"completed\") {\n result.output = toJsonValue(args.output);\n } else if (args.status === \"blocked\") {\n result.stage = args.stage;\n } else {\n result.interaction = toJsonValue(args.interaction);\n }\n await this.save(args.status === \"suspended\" ? \"suspended\" : \"success\", {\n endedAt: new Date(),\n output: args.status === \"completed\" ? traceOutput(args.output) : args.text,\n result,\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n async error(args: AgentRunErrorArgs): Promise<void> {\n await this.save(args.status === \"cancelled\" ? \"cancelled\" : \"error\", {\n endedAt: new Date(),\n error: serializeError(args.error),\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n private async save(\n status: StudioTraceStatus,\n result: {\n endedAt: Date;\n output?: string;\n result?: JsonObject;\n error?: JsonValue;\n usage: StudioTrace[\"usage\"];\n messages: JsonValue;\n },\n ): Promise<void> {\n const sessionId = this.props.args.trace?.sessionId;\n const store = this.props.store;\n if (sessionId === undefined || store === undefined) {\n return;\n }\n\n const metadata = traceMetadata(this.props.args, result.messages);\n if (result.result !== undefined) metadata.result = result.result;\n const trace: StudioTrace = {\n id: this.props.id,\n runId: this.props.args.runId,\n sessionId,\n status,\n trace: { observer: \"studio\", ...this.trace },\n startedAt: this.startedAt.toISOString(),\n endedAt: result.endedAt.toISOString(),\n durationMs: durationMs(this.startedAt, result.endedAt),\n input: toJsonValue({\n instructions: this.props.args.instructions,\n prompt: this.props.args.prompt,\n history: this.props.args.history,\n }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n if (this.props.args.trace?.name !== undefined) trace.name = this.props.args.trace.name;\n if (result.output !== undefined) trace.output = result.output;\n if (result.error !== undefined) trace.error = result.error;\n if (result.usage !== undefined) trace.usage = result.usage;\n\n await store.saveTrace(trace);\n }\n}\n\ntype ChildAgentStart = {\n startedAt: Date;\n agentId: string;\n agentName?: string;\n};\n\ntype ChildGenerationStart = ChildAgentStart & {\n input?: JsonValue;\n childTurn: number;\n};\n\ntype ChildToolStart = ChildAgentStart & {\n childTurn: number;\n toolName: string;\n toolCallId?: string;\n internalCallId?: string;\n input?: JsonValue;\n completed: boolean;\n};\n\nclass ChildAgentToolTraceAccumulator {\n private readonly agentStarts = new Map<string, ChildAgentStart>();\n private readonly generationStarts = new Map<string, ChildGenerationStart>();\n private readonly toolStarts: ChildToolStart[] = [];\n private readonly completedObservations: StudioTraceObservation[] = [];\n\n constructor(private readonly parent: AgentToolStartArgs) {}\n\n accept(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : this.parent.turn;\n\n if (!this.agentStarts.has(agentId)) {\n const start: ChildAgentStart = {\n startedAt: new Date(),\n agentId,\n };\n if (agentName !== undefined) start.agentName = agentName;\n this.agentStarts.set(agentId, start);\n }\n\n if (child.type === \"turn_start\") {\n const start: ChildGenerationStart = {\n startedAt: new Date(),\n input: toJsonValue({\n prompt: child.prompt,\n history: child.history,\n }),\n agentId,\n childTurn,\n };\n if (agentName !== undefined) start.agentName = agentName;\n this.generationStarts.set(generationKey(agentId, childTurn), start);\n return;\n }\n\n if (child.type === \"turn_end\") {\n const key = generationKey(agentId, childTurn);\n const start = this.generationStarts.get(key);\n this.generationStarts.delete(key);\n const observation: Parameters<typeof traceObservation>[0] = {\n kind: \"generation\",\n name: `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n output: toJsonValue(child.response),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n };\n if (start?.input !== undefined) observation.input = start.input;\n this.completedObservations.push(traceObservation(observation));\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolName = typeof toolCall.toolName === \"string\" ? toolCall.toolName : \"tool\";\n const callId =\n typeof toolCall.toolCallId === \"string\"\n ? toolCall.toolCallId\n : typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : undefined;\n const start: (typeof this.toolStarts)[number] = {\n startedAt: new Date(),\n agentId,\n childTurn,\n toolName,\n input: toJsonValue(\"input\" in toolCall ? toolCall.input : {}),\n completed: false,\n };\n if (agentName !== undefined) start.agentName = agentName;\n if (callId !== undefined) start.toolCallId = callId;\n this.toolStarts.push(start);\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const internalCallId =\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined;\n const start = this.findToolStart(agentId, toolName, toolCallId);\n const input =\n start?.input ?? (typeof child.args === \"string\" ? parseOrString(child.args) : undefined);\n if (start !== undefined) {\n start.completed = true;\n }\n const metadata = this.childMetadata(agentId, agentName, childTurn);\n if (toolCallId !== undefined) metadata.toolCallId = toolCallId;\n if (internalCallId !== undefined) metadata.internalCallId = internalCallId;\n const observation: Parameters<typeof traceObservation>[0] = {\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.${toolName}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n metadata,\n };\n if (input !== undefined) observation.input = input;\n if (typeof child.result === \"string\") observation.output = parseOrString(child.result);\n this.completedObservations.push(traceObservation(observation));\n return;\n }\n\n if (child.type === \"error\") {\n const metadata = this.childMetadata(agentId, agentName, childTurn);\n if (isRecord(child.usage)) metadata.usage = toJsonValue(child.usage);\n const status = child.error instanceof AgentRunCancelledError ? \"cancelled\" : \"error\";\n this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.error`,\n status,\n turn: this.parent.turn,\n startedAt: new Date(),\n error: serializeError(child.error),\n metadata,\n }),\n );\n }\n }\n\n observations(parentObservationId: string): StudioTraceObservation[] {\n const observations: StudioTraceObservation[] = [];\n const agentObservationIds = new Map<string, string>();\n\n for (const agentStart of this.agentStarts.values()) {\n const agentChildren = this.completedObservations.filter(\n (observation) =>\n isRecord(observation.metadata) &&\n observation.metadata.childAgentId === agentStart.agentId,\n );\n const childStartTimes = agentChildren.map((observation) => Date.parse(observation.startedAt));\n const childEndTimes = agentChildren.map((observation) =>\n Date.parse(observation.endedAt ?? observation.startedAt),\n );\n const startedAt =\n childStartTimes.length === 0\n ? agentStart.startedAt\n : new Date(Math.min(agentStart.startedAt.getTime(), ...childStartTimes));\n const endedAt =\n childEndTimes.length === 0 ? new Date() : new Date(Math.max(...childEndTimes));\n const agentObservation = traceObservation({\n parentObservationId,\n kind: \"agent\",\n name: `${agentLabel(agentStart.agentId, agentStart.agentName)}.run`,\n status: agentChildren.some((observation) => observation.status === \"error\")\n ? \"error\"\n : agentChildren.some((observation) => observation.status === \"cancelled\")\n ? \"cancelled\"\n : \"success\",\n turn: this.parent.turn,\n startedAt,\n endedAt,\n metadata: this.childMetadata(agentStart.agentId, agentStart.agentName, this.parent.turn),\n });\n observations.push(agentObservation);\n agentObservationIds.set(agentStart.agentId, agentObservation.id);\n }\n\n for (const observation of this.completedObservations) {\n const childAgentId = isRecord(observation.metadata)\n ? stringValue(observation.metadata.childAgentId)\n : undefined;\n const childAgentObservationId =\n childAgentId === undefined ? undefined : agentObservationIds.get(childAgentId);\n observations.push({\n ...observation,\n parentObservationId: childAgentObservationId ?? parentObservationId,\n });\n }\n\n return observations;\n }\n\n private findToolStart(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.toolStarts)[number] | undefined {\n for (let index = this.toolStarts.length - 1; index >= 0; index -= 1) {\n const start = this.toolStarts[index];\n if (\n start === undefined ||\n start.completed ||\n start.agentId !== agentId ||\n start.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || start.toolCallId === toolCallId) {\n return start;\n }\n }\n return undefined;\n }\n\n private childMetadata(\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n ): JsonObject {\n return compactJsonObject({\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: this.parent.toolName,\n parentInternalCallId: this.parent.internalCallId,\n parentToolCallId: this.parent.toolCallId,\n });\n }\n}\n\nfunction generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nfunction agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nfunction traceObservation(props: {\n parentObservationId?: string;\n kind: StudioTraceObservation[\"kind\"];\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: Date;\n endedAt?: Date;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n}): StudioTraceObservation {\n const endedAt = props.endedAt ?? new Date();\n const observation: StudioTraceObservation = {\n id: globalThis.crypto.randomUUID(),\n kind: props.kind,\n name: props.name,\n status: props.status,\n turn: props.turn,\n startedAt: props.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: durationMs(props.startedAt, endedAt),\n };\n if (props.parentObservationId !== undefined) {\n observation.parentObservationId = props.parentObservationId;\n }\n if (props.input !== undefined) observation.input = props.input;\n if (props.output !== undefined) observation.output = props.output;\n if (props.error !== undefined) observation.error = props.error;\n if (props.metadata !== undefined) observation.metadata = props.metadata;\n return observation;\n}\n\nfunction traceMetadata(args: AgentRunStartArgs, messages: JsonValue): JsonObject {\n return compactJsonObject({\n runId: args.runId,\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n userId: args.trace?.userId,\n tags: args.trace?.tags,\n version: args.trace?.version,\n metadata: toJsonValue(args.trace?.metadata ?? {}),\n messages,\n });\n}\n\nfunction generationMetadata(\n args: AgentGenerationStartArgs,\n endArgs?: AgentGenerationEndArgs,\n): JsonObject {\n const request = args.request;\n const response = endArgs?.response;\n const rawResponse = isRecord(response?.rawResponse) ? response.rawResponse : undefined;\n const modelId = args.modelInfo?.modelId ?? stringValue(rawResponse?.model) ?? \"unknown\";\n const providerResponse = providerResponseSummary(rawResponse);\n const usage = response?.usage;\n\n return compactJsonObject({\n provider: args.modelInfo?.provider,\n modelId,\n messageId: response?.messageId,\n usage,\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n documentCount: request.documents.length,\n historyCount: request.chatHistory.length,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n controls: request.controls,\n reasoningEffort: request.controls?.reasoningEffort,\n toolChoice: request.toolChoice,\n providerOptionKeys: isRecord(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n firstDeltaMs: endArgs?.firstDeltaMs,\n providerResponse,\n modelInfo: compactJsonObject({\n provider: args.modelInfo?.provider,\n modelId,\n capabilities: args.modelInfo?.capabilities,\n }),\n modelCall: compactJsonObject({\n request: completionRequestSummary(request),\n providerRequest: args.providerRequest,\n }),\n response: compactJsonObject({\n messageId: response?.messageId,\n usage,\n contentTypes: response?.choice.map((item) => item.type),\n providerResponse,\n }),\n tools: compactJsonObject({\n count: request.tools.length,\n names: request.tools.map((tool) => tool.name),\n toolChoice: request.toolChoice,\n hasOutputSchema: request.outputSchema !== undefined,\n }),\n timing: compactJsonObject({\n firstDeltaMs: endArgs?.firstDeltaMs,\n }),\n });\n}\n\nfunction completionRequestSummary(request: AgentGenerationStartArgs[\"request\"]): JsonObject {\n return compactJsonObject({\n instructions: request.instructions === undefined ? undefined : { present: true },\n messageCount: request.chatHistory.length,\n documentCount: request.documents.length,\n documentIds: request.documents.map((document) => document.id),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n controls: request.controls,\n reasoningEffort: request.controls?.reasoningEffort,\n toolChoice: request.toolChoice,\n providerOptionKeys: isRecord(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n });\n}\n\nfunction providerResponseSummary(\n rawResponse: Record<string, unknown> | undefined,\n): JsonObject | undefined {\n if (rawResponse === undefined) {\n return undefined;\n }\n const reasoning = isRecord(rawResponse.reasoning) ? rawResponse.reasoning : undefined;\n const text = isRecord(rawResponse.text) ? rawResponse.text : undefined;\n const toolUsage = isRecord(rawResponse.tool_usage) ? rawResponse.tool_usage : undefined;\n const webSearch = isRecord(toolUsage?.web_search) ? toolUsage.web_search : undefined;\n const summary = compactJsonObject({\n id: rawResponse.id,\n status: rawResponse.status,\n serviceTier: rawResponse.service_tier,\n store: rawResponse.store,\n parallelToolCalls: rawResponse.parallel_tool_calls,\n promptCacheKey: rawResponse.prompt_cache_key,\n promptCacheRetention: rawResponse.prompt_cache_retention,\n reasoningEffort: reasoning?.effort,\n textVerbosity: text?.verbosity,\n webSearchRequestCount: webSearch?.num_requests,\n });\n return Object.keys(summary).length === 0 ? undefined : summary;\n}\n\nfunction toolMetadata(args: AgentToolStartArgs, skipped: boolean, result?: string): JsonObject {\n const schema = isRecord(args.toolDefinition?.parameters) ? args.toolDefinition.parameters : {};\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = Array.isArray(schema.required)\n ? schema.required.filter((item): item is string => typeof item === \"string\")\n : [];\n return compactJsonObject({\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n toolDescription: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n tools: compactJsonObject({\n name: args.toolName,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n description: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n }),\n });\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction durationMs(startedAt: Date, endedAt: Date): number {\n return Math.max(0, endedAt.getTime() - startedAt.getTime());\n}\n\nfunction parseOrString(value: string): JsonValue {\n try {\n return toJsonValue(JSON.parse(value));\n } catch {\n return value;\n }\n}\n\nfunction traceOutput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(toJsonValue(value));\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function toJsonValue(value: unknown): JsonValue {\n return toJsonValueInternal(value, new WeakSet<object>());\n}\n\nfunction toJsonValueInternal(value: unknown, seen: WeakSet<object>): JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : String(value);\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return value.map((item) => toJsonValueInternal(item, seen));\n } finally {\n seen.delete(value);\n }\n }\n if (typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return compactJsonObjectInternal(value as Record<string, unknown>, seen);\n } finally {\n seen.delete(value);\n }\n }\n return String(value);\n}\n\nexport function compactJsonObject(values: Record<string, unknown>): JsonObject {\n return compactJsonObjectInternal(values, new WeakSet<object>());\n}\n\nfunction compactJsonObjectInternal(\n values: Record<string, unknown>,\n seen: WeakSet<object>,\n): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValueInternal(value, seen)]],\n );\n return Object.fromEntries(entries) as JsonObject;\n}\n\nexport function serializeUnknown(error: unknown): JsonValue {\n if (error instanceof Error) {\n return compactJsonObject({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n }\n return toJsonValue(error);\n}\n\nexport function formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function formatUnknown(value: unknown): string | undefined {\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Context, Hono, Next } from \"hono\";\nimport type { StudioUiOptions } from \"../types\";\n\nexport type ResolvedStudioUiOptions = {\n path: string;\n title: string;\n rootRoutes: boolean;\n redirectRoot: boolean;\n clientScript?: string;\n protectShell: boolean;\n};\n\nexport function resolveStudioUiOptions(\n ui: boolean | StudioUiOptions | undefined,\n): ResolvedStudioUiOptions {\n const options = typeof ui === \"object\" ? ui : {};\n const resolved: ResolvedStudioUiOptions = {\n path: normalizeUiPath(options.path ?? \"/ui\"),\n title: options.title ?? \"Anvia Studio\",\n rootRoutes: options.rootRoutes ?? true,\n redirectRoot: options.redirectRoot ?? true,\n protectShell: options.protectShell ?? false,\n };\n if (options.clientScript !== undefined) resolved.clientScript = options.clientScript;\n return resolved;\n}\n\nexport function isStudioUiEnabled(ui: boolean | StudioUiOptions | undefined): boolean {\n return ui !== false;\n}\n\nexport function registerStudioUi(app: Hono, options: ResolvedStudioUiOptions): void {\n const scriptPath = `${options.path}/assets/client.js`;\n const stylePath = `${options.path}/assets/styles.css`;\n const renderShell = () =>\n renderStudioUi({\n options,\n routePath: \"\",\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n\n if (options.redirectRoot) {\n app.get(\"/\", (c) => c.redirect(studioUiEntryPath(options)));\n }\n\n const redirectWithQuery = (c: Context, target: string) => {\n const search = new URL(c.req.url).search;\n return c.redirect(search.length === 0 ? target : `${target}${search}`);\n };\n\n app.get(options.path, (c) => redirectWithQuery(c, studioUiEntryPath(options)));\n app.get(`${options.path}/playground`, (c) => redirectWithQuery(c, \"/playground\"));\n app.get(`${options.path}/playground/:sessionId`, (c) =>\n redirectWithQuery(c, `/playground/${encodeURIComponent(c.req.param(\"sessionId\"))}`),\n );\n app.get(`${options.path}/tracing`, (c) => redirectWithQuery(c, \"/tracing\"));\n app.get(`${options.path}/tracing/:traceId`, (c) =>\n redirectWithQuery(c, `/tracing/${encodeURIComponent(c.req.param(\"traceId\"))}`),\n );\n app.get(`${options.path}/tracing/sessions/:sessionId`, (c) =>\n redirectWithQuery(c, `/tracing/sessions/${encodeURIComponent(c.req.param(\"sessionId\"))}`),\n );\n app.get(`${options.path}/sessions`, (c) => redirectWithQuery(c, \"/sessions\"));\n app.get(`${options.path}/agents`, (c) => redirectWithQuery(c, \"/agents\"));\n app.get(`${options.path}/tools`, (c) => redirectWithQuery(c, \"/tools\"));\n app.get(`${options.path}/mcps`, (c) => redirectWithQuery(c, \"/mcps\"));\n app.get(`${options.path}/pipelines`, (c) => redirectWithQuery(c, \"/pipelines\"));\n app.get(`${options.path}/graphs`, (c) => redirectWithQuery(c, \"/graphs\"));\n app.get(`${options.path}/sandboxes`, (c) => redirectWithQuery(c, \"/sandboxes\"));\n app.get(`${options.path}/sandboxes/:sandboxRef`, (c) =>\n redirectWithQuery(c, `/sandboxes/${encodeURIComponent(c.req.param(\"sandboxRef\"))}`),\n );\n app.get(`${options.path}/memory`, (c) => redirectWithQuery(c, \"/memory\"));\n app.get(`${options.path}/status`, (c) => redirectWithQuery(c, \"/status\"));\n app.get(`${options.path}/knowledge`, (c) => redirectWithQuery(c, \"/knowledge\"));\n app.get(`${options.path}/knowledge/:tab`, (c) =>\n redirectWithQuery(c, `/knowledge/${encodeURIComponent(c.req.param(\"tab\"))}`),\n );\n\n if (options.rootRoutes) {\n app.get(\"/playground\", async (c) => c.html(await renderShell()));\n app.get(\"/playground/:sessionId\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing/:traceId\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing/sessions/:sessionId\", async (c) => c.html(await renderShell()));\n app.get(\"/tracing/*\", async (c) => c.html(await renderShell()));\n app.get(\"/sessions\", shellWhenHtml(renderShell));\n app.get(\"/agents\", shellWhenHtml(renderShell));\n app.get(\"/tools\", async (c) => c.html(await renderShell()));\n app.get(\"/mcps\", async (c) => c.html(await renderShell()));\n app.get(\"/pipelines\", shellWhenHtml(renderShell));\n app.get(\"/graphs\", shellWhenHtml(renderShell));\n app.get(\"/sandboxes\", shellWhenHtml(renderShell));\n app.get(\"/sandboxes/:sandboxRef\", shellWhenHtml(renderShell));\n app.get(\"/memory\", async (c) => c.html(await renderShell()));\n app.get(\"/status\", shellWhenHtml(renderShell));\n app.get(\"/knowledge\", shellWhenHtml(renderShell));\n app.get(\"/knowledge/:tab\", shellWhenKnowledgeTab(renderShell));\n app.get(\"/knowledge/*\", shellWhenHtml(renderShell));\n }\n\n app.get(scriptPath, async () => {\n if (options.clientScript === undefined) {\n return new Response(null, { status: 404 });\n }\n return new Response(options.clientScript, {\n headers: {\n \"content-type\": \"text/javascript; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n },\n });\n });\n\n app.get(stylePath, async () => {\n const source = await readBundledLegacyStylesheet();\n return new Response(source, {\n headers: {\n \"content-type\": \"text/css; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n },\n });\n });\n\n app.get(`${options.path}/assets/:asset`, async (c) => {\n const asset = c.req.param(\"asset\");\n if (asset.includes(\"/\") || asset.includes(\"..\")) {\n return new Response(null, { status: 404 });\n }\n const source = await readBundledUiAsset(asset);\n if (source === undefined) {\n return new Response(null, { status: 404 });\n }\n const body = new ArrayBuffer(source.byteLength);\n new Uint8Array(body).set(source);\n return new Response(body, {\n headers: {\n \"content-type\": contentTypeForAsset(asset),\n \"cache-control\": \"no-cache\",\n },\n });\n });\n}\n\nfunction shellWhenHtml(renderShell: () => Promise<string>) {\n return async (c: Context, next: Next) => {\n const accept = c.req.header(\"accept\") ?? \"\";\n if (!accept.includes(\"text/html\")) {\n return next();\n }\n return c.html(await renderShell());\n };\n}\n\nfunction shellWhenKnowledgeTab(renderShell: () => Promise<string>) {\n return async (c: Context, next: Next) => {\n if (!isKnowledgeTabRoute(c.req.param(\"tab\"))) {\n return next();\n }\n return c.html(await renderShell());\n };\n}\n\nfunction isKnowledgeTabRoute(tab: string | undefined): boolean {\n return (\n tab === \"static-context\" ||\n tab === \"dynamic-context\" ||\n tab === \"dynamic-tools\" ||\n tab === \"retrieval-log\"\n );\n}\n\nasync function renderStudioUi(props: {\n options: ResolvedStudioUiOptions;\n routePath: string;\n clientScript: string;\n stylesheet: string;\n}): Promise<string> {\n const { options } = props;\n if (options.clientScript !== undefined) {\n return renderLegacyStudioUiShell({\n title: options.title,\n uiPath: props.routePath,\n compatUiPath: options.path,\n clientScript: props.clientScript,\n stylesheet: props.stylesheet,\n });\n }\n const index = await readBundledUiIndex();\n return index\n .replace(/<title>.*?<\\/title>/, `<title>${escapeHtml(options.title)}</title>`)\n .replace(\n 'data-ui-path=\"/ui\"',\n `data-ui-path=\"${escapeHtml(props.routePath)}\" data-ui-compat-path=\"${escapeHtml(options.path)}\"`,\n )\n .replaceAll('\"/ui/', `\"${escapeHtml(options.path)}/`);\n}\n\nfunction renderLegacyStudioUiShell(props: {\n title: string;\n uiPath: string;\n compatUiPath: string;\n clientScript: string;\n stylesheet: string;\n}): string {\n const title = escapeHtml(props.title);\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n `<title>${title}</title>`,\n '<meta name=\"theme-color\" content=\"#09090b\">',\n `<link data-anvia-favicon rel=\"icon\" type=\"image/svg+xml\" href=\"${escapeHtml(props.compatUiPath)}/assets/favicon-dark.svg\">`,\n '<script>(()=>{let m=\"dark\";try{const t=localStorage.getItem(\"anvia-theme\");const l=localStorage.getItem(\"anvia-studio-theme\");if(t===\"light\"||(t!==\"dark\"&&l===\"light\"))m=\"light\"}catch{}const r=document.documentElement;r.classList.toggle(\"dark\",m===\"dark\");r.dataset.theme=m;r.style.colorScheme=m;document.querySelector(\\'meta[name=\"theme-color\"]\\')?.setAttribute(\"content\",m===\"dark\"?\"#09090b\":\"#f4f4f5\");const f=document.querySelector(\"link[data-anvia-favicon]\");if(f)f.href=f.href.replace(\"favicon-dark.svg\",`favicon-${m}.svg`)})();</script>',\n `<link rel=\"stylesheet\" href=\"${escapeHtml(props.stylesheet)}\">`,\n \"</head>\",\n \"<body>\",\n `<div id=\"anvia-ui\" data-ui-path=\"${escapeHtml(props.uiPath)}\" data-ui-compat-path=\"${escapeHtml(props.compatUiPath)}\">`,\n '<main class=\"shell-loading\">',\n '<div class=\"studio-logo-lockup\">',\n `<img class=\"studio-logo-image\" src=\"${escapeHtml(props.compatUiPath)}/assets/logo.png\" alt=\"Anvia\" width=\"984\" height=\"206\">`,\n '<span class=\"studio-logo-badge\">Studio</span>',\n \"</div>\",\n \"</main>\",\n \"</div>\",\n `<script type=\"module\" src=\"${escapeHtml(props.clientScript)}\"></script>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\nfunction normalizeUiPath(path: string): string {\n const trimmed = path.trim();\n const withSlash = trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n const withoutTrailingSlash = withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n if (withoutTrailingSlash.length === 0 || withoutTrailingSlash === \"/\") {\n return \"/ui\";\n }\n return withoutTrailingSlash;\n}\n\nexport function studioUiEntryPath(_options: ResolvedStudioUiOptions): string {\n return \"/playground\";\n}\n\nasync function readBundledUiIndex(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/index.html\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/index.html\", import.meta.url)),\n \"utf8\",\n );\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n return readFile(fileURLToPath(new URL(\"./app/index.html\", import.meta.url)), \"utf8\");\n }\n}\n\nasync function readBundledUiAsset(asset: string): Promise<Uint8Array | undefined> {\n try {\n return await readFile(fileURLToPath(new URL(`./assets/${asset}`, import.meta.url)));\n } catch (sourceError) {\n if (!isNotFoundError(sourceError)) {\n throw sourceError;\n }\n }\n try {\n return await readFile(fileURLToPath(new URL(`./ui/assets/${asset}`, import.meta.url)));\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(`../../dist/ui/assets/${asset}`, import.meta.url)),\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return undefined;\n }\n }\n}\n\nasync function readBundledLegacyStylesheet(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/styles.css\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/styles.css\", import.meta.url)),\n \"utf8\",\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return \"\";\n }\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction contentTypeForAsset(asset: string): string {\n if (asset.endsWith(\".js\")) {\n return \"text/javascript; charset=utf-8\";\n }\n if (asset.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (asset.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (asset.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (asset.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n return \"application/octet-stream\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n","import { type Agent, isVectorContext, type VectorContext } from \"@anvia/core/agent\";\nimport type { Document } from \"@anvia/core/completion\";\n\nexport function staticContextDocuments(agent: Agent): Document[] {\n return agent.context.filter((input): input is Document => !isVectorContext(input));\n}\n\nexport function vectorContexts(agent: Agent): VectorContext[] {\n return agent.context.filter(isVectorContext);\n}\n","import type { AgentOutcome, AgentRunSettings, AgentStream } from \"@anvia/core/agent\";\nimport type {\n CompletionModel,\n Message as CoreMessage,\n JsonObject,\n UserMessage,\n} from \"@anvia/core/completion\";\nimport {\n type Agent,\n type InternalAgentRunOptions,\n withInternalAgentRunOptions,\n} from \"@anvia/core/internal/agent\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunResponse,\n AgentRunStreamEvent,\n StudioAgent,\n StudioSession,\n StudioSessionStore,\n} from \"../types\";\nimport { cloneAgent } from \"./agent-utils\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport type { StudioContinuationRegistry } from \"./interactions\";\nimport {\n type createStudioModelRegistry,\n ModelSelectionError,\n resolveStudioModel,\n sessionControlValues,\n STUDIO_CONTROLS_METADATA_KEY,\n STUDIO_MODEL_METADATA_KEY,\n sessionModelRef,\n} from \"./models\";\nimport { rawObservedStore } from \"./observability\";\nimport type { ResolvedStores } from \"./options\";\nimport type { StudioRunLease, StudioRunLifecycle } from \"./run-lifecycle\";\nimport {\n assignTranscriptRunDuration,\n createPersistedStreamingSessionTranscript,\n optionalTitle,\n parseRunRequest,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\n memoryCompactedLog,\n memoryLoadedLog,\n memorySavedLog,\n runCancelledLog,\n runCompletedLog,\n runFailedLog,\n runReceivedLog,\n runStartedLog,\n streamSessionRunLogs,\n} from \"./session-logs\";\n\ntype AgentRunRouteProps = {\n agentMap: Map<string, StudioAgent>;\n stores: ResolvedStores;\n modelRegistry: ReturnType<typeof createStudioModelRegistry>;\n continuationRegistry: StudioContinuationRegistry<PreparedAgentRun>;\n runLifecycle: StudioRunLifecycle;\n};\n\ntype SelectedModel = ReturnType<typeof resolveStudioModel>;\ntype RunExecution = {\n generate(options: AgentRunSettings): Promise<AgentOutcome>;\n stream(options: AgentRunSettings): AgentStream;\n};\n\nexport type PreparedAgentRun = {\n agentId: string;\n agent: StudioAgent;\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n memoryMetadata: JsonObject;\n execution: RunExecution;\n failureMessages: readonly CoreMessage[] | undefined;\n memoryCompactionLogged: boolean;\n options: AgentRunSettings;\n runAgent: Agent;\n runId: string;\n runStartedAt: number;\n generatedMessagesStartIndex: 0 | 1;\n selectedModel: SelectedModel;\n session: StudioSession | undefined;\n sessionStore: StudioSessionStore | undefined;\n shouldPersistSessionMessages: boolean;\n};\n\nexport function registerAgentRunRoute(app: Hono, props: AgentRunRouteProps): void {\n app.post(\"/agents/:agentId/runs\", (c) => handleAgentRun(c, props));\n}\n\nasync function handleAgentRun(c: Context, props: AgentRunRouteProps): Promise<Response> {\n const lease = props.runLifecycle.start(c.req.raw.signal);\n if (lease === undefined) {\n return errorResponse(c, 503, \"service_unavailable\", \"Anvia Studio is shutting down\");\n }\n\n try {\n const prepared = await prepareAgentRun(c, props, lease.abortSignal);\n if (prepared instanceof Response) {\n lease.finish();\n return prepared;\n }\n\n if (prepared.body.stream === true) {\n return handleStreamingAgentRun(c, prepared, props, lease);\n }\n try {\n return await handleBufferedAgentRun(c, prepared, props);\n } finally {\n lease.finish();\n }\n } catch (error) {\n lease.finish();\n throw error;\n }\n}\n\nasync function prepareAgentRun(\n c: Context,\n props: AgentRunRouteProps,\n abortSignal: AbortSignal,\n): Promise<PreparedAgentRun | Response> {\n const agentId = c.req.param(\"agentId\") as string;\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const body = await parseRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n if (body.type === \"interaction_response\") {\n const registration = props.continuationRegistry.take(\n body.interactionId,\n agentId,\n body.response,\n );\n if (registration.status === \"missing\") {\n return errorResponse(c, 404, \"not_found\", \"Interaction continuation is unavailable\");\n }\n if (registration.status === \"claimed\") {\n return errorResponse(c, 409, \"conflict\", \"Interaction response was already claimed\");\n }\n if (registration.status === \"invalid\") {\n return errorResponse(c, 400, \"bad_request\", registration.error.message);\n }\n const { registration: claimed } = registration;\n const source = claimed.context;\n const runId = globalThis.crypto.randomUUID();\n let resumedBody: PreparedAgentRun[\"body\"] = {\n ...source.body,\n };\n if (body.stream !== undefined) resumedBody = { ...resumedBody, stream: body.stream };\n if (body.metadata !== undefined) resumedBody = { ...resumedBody, metadata: body.metadata };\n if (body.trace !== undefined) resumedBody = { ...resumedBody, trace: body.trace };\n const runOptions = createRunOptions(resumedBody, agentId, source.session, abortSignal);\n const execution: RunExecution = {\n generate: (options) =>\n source.runAgent.generate({\n continuation: claimed.continuation,\n response: body.response,\n ...options,\n }),\n stream: (options) =>\n source.runAgent.stream({\n continuation: claimed.continuation,\n response: body.response,\n ...options,\n }),\n };\n return {\n ...source,\n body: resumedBody,\n execution,\n failureMessages: undefined,\n memoryCompactionLogged: false,\n options: runOptions,\n runId,\n runStartedAt: Date.now(),\n generatedMessagesStartIndex: 0,\n shouldPersistSessionMessages: source.shouldPersistSessionMessages,\n };\n }\n\n const session = await resolveRunSession(c, body, agentId, props.stores);\n if (session instanceof Response) {\n return session;\n }\n\n const persistedControls = sessionControlValues(session?.metadata);\n const runBody =\n body.controls === undefined && persistedControls !== undefined\n ? { ...body, controls: persistedControls }\n : body;\n const selectedModel = selectRunModel(c, props, agent, runBody, session);\n if (selectedModel instanceof Response) {\n return selectedModel;\n }\n const runAgent =\n selectedModel.model === undefined\n ? agent.agent\n : cloneAgent(agent.agent, {\n model: selectedModel.model,\n controls: compatibleAgentControls(agent.agent.controls, selectedModel.model),\n });\n const runId = globalThis.crypto.randomUUID();\n const runStartedAt = Date.now();\n\n await recordRunReceived({\n agentId,\n body: runBody,\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n await recordSelectedModelWarnings({\n body: runBody,\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n\n const memoryMetadata = runMemoryMetadata(agentId, runBody, selectedModel, runId);\n const promptMessage = runBody.messages.at(-1) as UserMessage;\n const sessionStore = props.stores.sessions;\n const shouldPersistSessionMessages =\n session !== undefined &&\n sessionStore !== undefined &&\n !usesStoreAsAgentMemory(runAgent, sessionStore);\n if (shouldPersistSessionMessages) {\n await sessionStore.append({\n scope: { sessionId: session.id, metadata: memoryMetadata },\n runId,\n turn: 1,\n messages: [promptMessage],\n });\n }\n\n const execution = createRunExecution({\n agentId,\n body: runBody,\n memoryMetadata,\n promptMessage,\n runAgent,\n session,\n });\n\n return {\n agentId,\n agent,\n body: runBody,\n memoryMetadata,\n execution,\n failureMessages: undefined,\n memoryCompactionLogged: false,\n options: createRunOptions(runBody, agentId, session, abortSignal),\n runAgent,\n runId,\n runStartedAt,\n generatedMessagesStartIndex: 1,\n selectedModel,\n session,\n sessionStore,\n shouldPersistSessionMessages,\n };\n}\n\nfunction compatibleAgentControls(\n controls: Readonly<Record<string, string | undefined>> | undefined,\n model: CompletionModel,\n): Readonly<Record<string, string>> | undefined {\n const modelControls = model.controls;\n const compatible = Object.fromEntries(\n Object.entries(controls ?? {}).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\" &&\n modelControls !== undefined &&\n Object.hasOwn(modelControls, entry[0]) &&\n modelControls[entry[0]]?.options.includes(entry[1]) === true,\n ),\n );\n return Object.keys(compatible).length === 0 ? undefined : compatible;\n}\n\nasync function resolveRunSession(\n c: Context,\n body: Extract<AgentRunRequest, { type: \"messages\" }>,\n agentId: string,\n stores: ResolvedStores,\n): Promise<StudioSession | undefined | Response> {\n if (body.sessionId !== undefined && stores.sessions === undefined) {\n return unsupportedCapability(c, \"sessions\");\n }\n\n const session =\n body.sessionId === undefined ? undefined : await stores.sessions?.getSession(body.sessionId);\n if (body.sessionId !== undefined && session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n if (session !== undefined && session.agentId !== agentId) {\n return errorResponse(c, 400, \"bad_request\", \"Session belongs to another agent\");\n }\n return session;\n}\n\nfunction selectRunModel(\n c: Context,\n props: AgentRunRouteProps,\n agent: StudioAgent,\n body: Extract<AgentRunRequest, { type: \"messages\" }>,\n session: StudioSession | undefined,\n): SelectedModel | Response {\n try {\n return resolveStudioModel(props.modelRegistry, {\n agent,\n request: body,\n sessionMetadata: session?.metadata,\n });\n } catch (error) {\n if (error instanceof ModelSelectionError) {\n return errorResponse(c, 400, \"bad_request\", error.message);\n }\n throw error;\n }\n}\n\nasync function recordRunReceived(props: {\n agentId: string;\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n runId: string;\n selectedModel: SelectedModel;\n session: StudioSession | undefined;\n store: StudioSessionStore | undefined;\n}): Promise<void> {\n if (props.session === undefined) {\n return;\n }\n\n const input: Parameters<typeof runReceivedLog>[0] = {\n sessionId: props.session.id,\n runId: props.runId,\n agentId: props.agentId,\n message: props.body.messages.at(-1) as UserMessage,\n stream: props.body.stream === true,\n hasTrace: props.body.trace !== undefined,\n };\n if (props.body.maxTurns !== undefined) input.maxTurns = props.body.maxTurns;\n if (props.body.toolConcurrency !== undefined) {\n input.toolConcurrency = props.body.toolConcurrency;\n }\n if (\n props.body.metadata !== undefined ||\n props.selectedModel.ref !== undefined ||\n props.body.controls !== undefined\n ) {\n const metadata: JsonObject = {};\n Object.assign(metadata, props.body.metadata);\n if (props.selectedModel.ref !== undefined) {\n metadata[STUDIO_MODEL_METADATA_KEY] = props.selectedModel.ref;\n }\n if (props.body.controls !== undefined) {\n metadata[STUDIO_CONTROLS_METADATA_KEY] = props.body.controls;\n }\n input.metadata = metadata;\n }\n await appendSessionLog(props.store, runReceivedLog(input));\n}\n\nasync function recordSelectedModelWarnings(props: {\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n runId: string;\n selectedModel: SelectedModel;\n session: StudioSession | undefined;\n store: StudioSessionStore | undefined;\n}): Promise<void> {\n if (props.session === undefined || props.selectedModel.ref === undefined) {\n return;\n }\n\n for (const warning of props.selectedModel.warnings) {\n await appendSessionLog(props.store, {\n sessionId: props.session.id,\n runId: props.runId,\n level: \"warn\",\n category: \"model\",\n event: \"model.warning\",\n message: typeof warning.message === \"string\" ? warning.message : \"Model warning\",\n metadata: warning,\n });\n }\n if (\n sessionModelRef(props.session.metadata) !== props.selectedModel.ref ||\n props.body.controls !== undefined\n ) {\n const metadata: JsonObject = {};\n Object.assign(metadata, props.session.metadata);\n metadata[STUDIO_MODEL_METADATA_KEY] = props.selectedModel.ref;\n if (props.body.controls !== undefined) {\n metadata[STUDIO_CONTROLS_METADATA_KEY] = props.body.controls;\n }\n await props.store?.updateSessionMetadata?.(props.session.id, metadata);\n }\n}\n\nfunction runMemoryMetadata(\n agentId: string,\n body: Extract<AgentRunRequest, { type: \"messages\" }>,\n selectedModel: SelectedModel,\n runId: string,\n): JsonObject {\n const metadata: JsonObject = { agentId };\n Object.assign(metadata, body.metadata);\n if (selectedModel.ref !== undefined) metadata[STUDIO_MODEL_METADATA_KEY] = selectedModel.ref;\n if (body.controls !== undefined) metadata[STUDIO_CONTROLS_METADATA_KEY] = body.controls;\n metadata.studioRunId = runId;\n return metadata;\n}\n\nfunction createRunExecution(props: {\n agentId: string;\n body: Extract<AgentRunRequest, { type: \"messages\" }>;\n memoryMetadata: JsonObject;\n promptMessage: UserMessage;\n runAgent: Agent;\n session: StudioSession | undefined;\n}): RunExecution {\n const session = props.session;\n if (session !== undefined && props.runAgent.memory !== undefined) {\n return {\n generate: (options) =>\n props.runAgent.generate({\n prompt: props.promptMessage,\n session: { sessionId: session.id, metadata: props.memoryMetadata },\n ...options,\n }),\n stream: (options) =>\n props.runAgent.stream({\n prompt: props.promptMessage,\n session: { sessionId: session.id, metadata: props.memoryMetadata },\n ...options,\n }),\n };\n }\n\n const transcript =\n session !== undefined ? [...session.messages, props.promptMessage] : props.body.messages;\n return {\n generate: (options) => props.runAgent.generate({ messages: transcript, ...options }),\n stream: (options) => props.runAgent.stream({ messages: transcript, ...options }),\n };\n}\n\nfunction createRunOptions(\n body: AgentRunRequest,\n agentId: string,\n session: StudioSession | undefined,\n abortSignal: AbortSignal,\n): AgentRunSettings {\n const options: AgentRunSettings = { abortSignal };\n if (body.type === \"messages\" && body.maxTurns !== undefined) options.maxTurns = body.maxTurns;\n if (body.type === \"messages\" && body.toolConcurrency !== undefined) {\n options.toolConcurrency = body.toolConcurrency;\n }\n if (body.type === \"messages\" && body.controls !== undefined) options.controls = body.controls;\n if (body.trace !== undefined) {\n options.trace = traceForRun(body.trace, agentId, session);\n } else if (session !== undefined) {\n options.trace = traceForRun(undefined, agentId, session);\n }\n return options;\n}\n\nfunction handleStreamingAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n lease: StudioRunLease,\n): Response {\n const streamOptions = withInternalAgentRunOptions({ ...run.options }, { runId: run.runId });\n const runStream = registerStreamingContinuation(\n run.execution.stream(streamOptions),\n props.continuationRegistry,\n run,\n );\n let stream: AsyncIterable<AgentRunStreamEvent> = runStream;\n let persistedRun: ReturnType<typeof createPersistedStreamingSessionTranscript> | undefined;\n if (run.session !== undefined && run.sessionStore !== undefined) {\n persistedRun = createPersistedStreamingSessionTranscript({\n stream: streamSessionRunLogs({\n stream: runStream,\n store: run.sessionStore,\n session: run.session,\n runId: run.runId,\n startedAt: run.runStartedAt,\n }),\n store: run.sessionStore,\n session: run.session,\n message: run.body.messages.at(-1) as UserMessage,\n runId: run.runId,\n startedAt: run.runStartedAt,\n persistGeneratedMessages: run.shouldPersistSessionMessages,\n generatedMessagesStartIndex: run.generatedMessagesStartIndex,\n });\n stream = persistedRun.events;\n }\n\n return streamAgentRunEvents(c, finishRunLease(stream, lease), {\n runId: run.runId,\n onCancel: async () => {\n const persistence: Promise<unknown>[] = [];\n if (persistedRun !== undefined) {\n persistence.push(persistedRun.cancel());\n }\n if (run.session !== undefined && run.sessionStore !== undefined) {\n persistence.push(\n appendSessionLog(\n run.sessionStore,\n runCancelledLog(run.session.id, run.runId, run.runStartedAt),\n ),\n );\n }\n await Promise.all(persistence);\n },\n });\n}\n\nasync function* finishRunLease(\n events: AsyncIterable<AgentRunStreamEvent>,\n lease: StudioRunLease,\n): AsyncIterable<AgentRunStreamEvent> {\n try {\n yield* events;\n } finally {\n lease.finish();\n }\n}\n\nasync function handleBufferedAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Promise<Response> {\n try {\n const runtimeOptions = await startBufferedSessionRun(run);\n const result = await run.execution.generate(runtimeOptions);\n if (result.type === \"interaction\") {\n props.continuationRegistry.register({ continuation: result.continuation, context: run });\n }\n await completeBufferedSessionRun(run, result);\n return c.json(agentRunResponse(result));\n } catch (error) {\n await failBufferedSessionRun(run, error);\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n}\n\nfunction agentRunResponse(result: AgentOutcome): AgentRunResponse {\n if (result.type !== \"interaction\") return result;\n const { continuation: _continuation, messages: _messages, ...response } = result;\n return response;\n}\n\nasync function startBufferedSessionRun(run: PreparedAgentRun): Promise<AgentRunSettings> {\n if (run.session !== undefined) {\n await appendSessionLog(run.sessionStore, runStartedLog(run.session, run.runId));\n await appendSessionLog(run.sessionStore, memoryLoadedLog(run.session, run.runId));\n }\n const internalOptions: InternalAgentRunOptions = {\n onFailure: ({ messages }) => {\n run.failureMessages = structuredClone(messages);\n },\n runId: run.runId,\n };\n if (run.session !== undefined && run.sessionStore !== undefined) {\n const sessionId = run.session.id;\n const sessionStore = run.sessionStore;\n internalOptions.onMemoryCompaction = async (compaction) => {\n await appendSessionLog(\n sessionStore,\n memoryCompactedLog({\n sessionId,\n runId: run.runId,\n ...compaction,\n }),\n );\n run.memoryCompactionLogged = true;\n };\n }\n return withInternalAgentRunOptions({ ...run.options }, internalOptions);\n}\n\nasync function* registerStreamingContinuation(\n stream: AgentStream,\n registry: StudioContinuationRegistry<PreparedAgentRun>,\n run: PreparedAgentRun,\n): AsyncIterable<AgentRunStreamEvent> {\n for await (const event of stream) {\n if (event.type === \"interaction\") {\n registry.register({ continuation: event.continuation, context: run });\n }\n yield event;\n }\n}\n\nasync function completeBufferedSessionRun(\n run: PreparedAgentRun,\n response: AgentOutcome,\n): Promise<void> {\n if (run.session === undefined || run.sessionStore === undefined) {\n return;\n }\n if (run.shouldPersistSessionMessages) {\n const generatedMessages = response.messages.slice(run.generatedMessagesStartIndex);\n if (generatedMessages.length > 0) {\n await run.sessionStore.append({\n scope: { sessionId: run.session.id, metadata: run.memoryMetadata },\n runId: run.runId,\n turn: 1,\n messages: generatedMessages,\n });\n }\n }\n const durationMs = Date.now() - run.runStartedAt;\n const transcript = transcriptFromMessages(response.messages);\n assignTranscriptRunDuration(transcript, durationMs);\n await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.messages.at(-1) as UserMessage),\n transcript,\n status: response.type === \"interaction\" ? \"suspended\" : \"success\",\n });\n if (response.memoryCompaction !== undefined && !run.memoryCompactionLogged) {\n await appendSessionLog(\n run.sessionStore,\n memoryCompactedLog({\n sessionId: run.session.id,\n runId: run.runId,\n ...response.memoryCompaction,\n }),\n );\n run.memoryCompactionLogged = true;\n }\n await appendSessionLog(\n run.sessionStore,\n response.type === \"interaction\"\n ? {\n sessionId: run.session.id,\n runId: run.runId,\n level: \"info\",\n category: \"run\",\n event: \"run.suspended\",\n message: `Run suspended for ${response.interaction.type}`,\n metadata: {\n interactionId: response.interaction.id,\n interactionType: response.interaction.type,\n toolName: response.interaction.toolName,\n sourceRunId: response.continuation.sourceRunId,\n },\n }\n : runCompletedLog({\n sessionId: run.session.id,\n runId: run.runId,\n durationMs,\n usage: response.usage,\n output: response.text,\n messageCount: response.messages.length,\n }),\n );\n if (response.resumedFrom !== undefined) {\n const responseMessage = response.messages[0];\n const responsePart = responseMessage?.role === \"tool\" ? responseMessage.content[0] : undefined;\n if (responsePart !== undefined && responsePart.type !== \"tool-result\") {\n const metadata: JsonObject = {\n interactionId: responsePart.interactionId,\n interactionType:\n responsePart.type === \"tool-approval-response\" ? \"tool-approval\" : \"tool-question\",\n toolName: responsePart.toolName,\n sourceRunId: response.resumedFrom.runId,\n };\n if (responsePart.type === \"tool-approval-response\") {\n metadata.approved = responsePart.approved;\n metadata.hasReason = responsePart.reason !== undefined;\n } else {\n metadata.answerCount = responsePart.answers.length;\n }\n await appendSessionLog(run.sessionStore, {\n sessionId: run.session.id,\n runId: run.runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.responded\",\n message: `Interaction response received for ${responsePart.toolName}`,\n metadata,\n });\n }\n await appendSessionLog(run.sessionStore, {\n sessionId: run.session.id,\n runId: run.runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.resumed\",\n message: \"Interaction resumed in a linked run\",\n metadata: {\n interactionId: response.resumedFrom.interactionId,\n sourceRunId: response.resumedFrom.runId,\n resumedRunId: response.runId,\n },\n });\n }\n await appendSessionLog(\n run.sessionStore,\n memorySavedLog({\n sessionId: run.session.id,\n runId: run.runId,\n messageCount: response.messages.length,\n }),\n );\n}\n\nasync function failBufferedSessionRun(run: PreparedAgentRun, error: unknown): Promise<void> {\n if (run.session === undefined || run.sessionStore === undefined) {\n return;\n }\n\n const durationMs = Date.now() - run.runStartedAt;\n const messages = run.failureMessages ?? [run.body.messages.at(-1) as UserMessage];\n const transcript = transcriptFromMessages([...messages]);\n assignTranscriptRunDuration(transcript, durationMs);\n await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.messages.at(-1) as UserMessage),\n transcript,\n status: \"error\",\n error: serializeError(error),\n });\n await appendSessionLog(\n run.sessionStore,\n runFailedLog(run.session.id, run.runId, error, run.runStartedAt),\n );\n}\n\nfunction usesStoreAsAgentMemory(agent: Agent, store: StudioSessionStore): boolean {\n const memoryStore = agent.memory?.store;\n return memoryStore !== undefined && rawObservedStore(memoryStore) === rawObservedStore(store);\n}\n","import {\n type Agent,\n createResolvedAgent,\n getResolvedAgentOptions,\n type ResolvedAgentOptions,\n} from \"@anvia/core/internal/agent\";\n\nexport function cloneAgent(agent: Agent, overrides: Partial<ResolvedAgentOptions> = {}): Agent {\n return createResolvedAgent({\n ...getResolvedAgentOptions(agent),\n ...overrides,\n });\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { serializeUnknown } from \"./json\";\n\nexport function serializeError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n return serializeUnknown(error);\n}\n","import {\n isJsonValue as isCoreJsonValue,\n isMessage,\n type JsonObject,\n type JsonValue,\n} from \"@anvia/core/completion\";\nimport type { AgentTraceOptions } from \"../types\";\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return isObject(value) && isCoreJsonValue(value);\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n return isCoreJsonValue(value);\n}\n\nexport { isMessage };\n\nexport function isAgentTraceOptions(value: unknown): value is AgentTraceOptions {\n if (!isObject(value)) {\n return false;\n }\n if (\n !Object.keys(value).every((key) =>\n [\"name\", \"userId\", \"sessionId\", \"metadata\", \"tags\", \"version\", \"traceId\"].includes(key),\n )\n ) {\n return false;\n }\n return (\n optionalString(value.name) &&\n optionalString(value.userId) &&\n optionalString(value.sessionId) &&\n optionalString(value.version) &&\n optionalString(value.traceId) &&\n optionalStringArray(value.tags) &&\n (value.metadata === undefined || isJsonObject(value.metadata))\n );\n}\n\nexport function isNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === \"number\" && value >= 0;\n}\n\nexport function isPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === \"number\" && value > 0;\n}\n\nfunction optionalString(value: unknown): boolean {\n return value === undefined || typeof value === \"string\";\n}\n\nfunction optionalStringArray(value: unknown): boolean {\n return (\n value === undefined || (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { Context } from \"hono\";\nimport type { StudioCapability, StudioErrorCode, StudioErrorResponse } from \"../types\";\nimport { isObject } from \"./type-guards\";\n\nexport function errorResponse(\n c: Context,\n status: 400 | 403 | 404 | 409 | 413 | 500 | 501 | 502 | 503,\n code: StudioErrorCode,\n message: string,\n details?: JsonValue,\n): Response {\n const body: StudioErrorResponse = {\n error: {\n code,\n message,\n },\n };\n if (details !== undefined) {\n body.error.details = details;\n }\n return c.json(body, status);\n}\n\nexport function unsupportedCapability(c: Context, capability: StudioCapability): Response {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n `Capability \"${capability}\" is not implemented by this runner`,\n { capability },\n );\n}\n\n/**\n * Parse and validate a JSON request body.\n *\n * Returns the validated result from `validate`, or an error response\n * if the body is not valid JSON or fails validation.\n */\nexport async function parseJsonBody<T>(\n c: Context,\n validate: (body: unknown) => T | { error: Response },\n): Promise<T | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n return validate(body);\n}\n","import {\n assertCompletionControlsSupported,\n CompletionCapabilityError,\n type CompletionModel,\n type JsonObject,\n type Message,\n} from \"@anvia/core/completion\";\nimport type { Hono } from \"hono\";\nimport type {\n AgentRunRequest,\n StudioAgent,\n StudioAgentModelPolicy,\n StudioAgentModelPolicyConfig,\n StudioAgentModelsSummary,\n StudioModelConfig,\n StudioModelDefinition,\n StudioModelModality,\n StudioModelProvider,\n StudioModelProviderConfig,\n StudioModelRef,\n StudioModelSummary,\n StudioModelsConfig,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\n\nexport const STUDIO_MODEL_METADATA_KEY = \"studioModel\";\nexport const STUDIO_CONTROLS_METADATA_KEY = \"studioControls\";\n\ntype RuntimeProvider = StudioModelProvider & {\n staticModels: Map<string, StudioModelDefinition>;\n};\n\nexport type StudioModelRegistry = {\n readonly defaultModelRef?: string;\n readonly providers: Map<string, RuntimeProvider>;\n readonly agentPolicies: Map<string, NormalizedAgentModelPolicy>;\n readonly modelCache: Map<string, CompletionModel>;\n};\n\ntype NormalizedAgentModelPolicy = {\n defaultModelRef?: string;\n allowed?: string[];\n};\n\ntype ResolveModelInput = {\n agent: StudioAgent;\n request: AgentRunRequest;\n sessionMetadata?: JsonObject | undefined;\n};\n\nexport type StudioResolvedModel = {\n ref?: string;\n model?: CompletionModel;\n warnings: JsonObject[];\n};\n\nexport function createStudioModelRegistry(\n config: StudioModelConfig | undefined,\n): StudioModelRegistry | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n const providers = new Map<string, RuntimeProvider>();\n for (const provider of config.providers) {\n const id = normalizeProviderId(provider.id);\n if (providers.has(id)) {\n throw new Error(`Duplicate Studio model provider id: ${id}`);\n }\n const staticModels = new Map<string, StudioModelDefinition>();\n for (const model of provider.models ?? []) {\n const modelId = normalizeModelId(model.id);\n if (staticModels.has(modelId)) {\n throw new Error(`Duplicate Studio model id for provider ${id}: ${modelId}`);\n }\n staticModels.set(modelId, { ...model, id: modelId });\n }\n const runtimeProvider: RuntimeProvider = {\n ...provider,\n id,\n staticModels,\n };\n if (provider.defaultModelId !== undefined) {\n runtimeProvider.defaultModelId = normalizeModelId(provider.defaultModelId);\n }\n providers.set(id, runtimeProvider);\n }\n\n const registry: StudioModelRegistry = {\n providers,\n agentPolicies: normalizeAgentPolicies(config.agents ?? {}),\n modelCache: new Map(),\n };\n if (config.defaultModelRef !== undefined) {\n Object.assign(registry, {\n defaultModelRef: normalizeModelRef(config.defaultModelRef),\n });\n }\n return registry;\n}\n\nexport function studioModelsConfig(\n registry: StudioModelRegistry | undefined,\n agents: StudioAgent[],\n): StudioModelsConfig | undefined {\n if (registry === undefined) {\n return undefined;\n }\n\n const providers = [...registry.providers.values()].map((provider): StudioModelProviderConfig => {\n const models = [...provider.staticModels.values()].map((model) =>\n staticModelSummary(provider, model.id, model),\n );\n const config: StudioModelProviderConfig = {\n id: provider.id,\n models,\n };\n if (provider.name !== undefined) config.name = provider.name;\n if (provider.defaultModelId !== undefined) config.defaultModelId = provider.defaultModelId;\n if (provider.metadata !== undefined) config.metadata = provider.metadata;\n return config;\n });\n\n const agentIds = new Set(agents.map((agent) => agent.id));\n const agentsConfig = Object.fromEntries(\n [...registry.agentPolicies.entries()]\n .filter(([agentId]) => agentIds.has(agentId))\n .map(([agentId, policy]) => [agentId, publicPolicy(policy)]),\n );\n\n const config: StudioModelsConfig = {\n providers,\n agents: agentsConfig,\n };\n if (registry.defaultModelRef !== undefined) config.defaultModelRef = registry.defaultModelRef;\n return config;\n}\n\nexport function registerModelRoutes(\n app: Hono,\n props: { registry?: StudioModelRegistry | undefined; agentMap: Map<string, StudioAgent> },\n): void {\n app.get(\"/models\", async (c) => {\n const registry = props.registry;\n if (registry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model registry not configured\");\n }\n const providers = await Promise.all(\n [...registry.providers.values()].map((provider) => providerCatalog(registry, provider)),\n );\n const response: { providers: StudioModelProviderConfig[]; defaultModelRef?: string } = {\n providers,\n };\n if (registry.defaultModelRef !== undefined) {\n response.defaultModelRef = registry.defaultModelRef;\n }\n return c.json(response);\n });\n\n app.get(\"/models/:providerId\", async (c) => {\n if (props.registry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model registry not configured\");\n }\n const provider = props.registry.providers.get(c.req.param(\"providerId\"));\n if (provider === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model provider not found\");\n }\n return c.json(await providerCatalog(props.registry, provider));\n });\n\n app.get(\"/agents/:agentId/models\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n if (props.registry === undefined) {\n return c.json({\n agentId,\n models: [],\n } satisfies StudioAgentModelsSummary);\n }\n return c.json(await agentModelsCatalog(props.registry, agent));\n });\n}\n\nexport function resolveStudioModel(\n registry: StudioModelRegistry | undefined,\n input: ResolveModelInput,\n): StudioResolvedModel {\n if (registry === undefined) {\n return { warnings: [] };\n }\n\n const selectedRef =\n normalizeOptionalModelRef(input.request.model) ??\n sessionModelRef(input.sessionMetadata) ??\n registry.agentPolicies.get(input.agent.id)?.defaultModelRef ??\n registry.defaultModelRef;\n if (selectedRef === undefined) {\n return { warnings: [] };\n }\n\n ensureModelAllowed(registry, input.agent.id, selectedRef);\n const { providerId, modelId } = parseModelRef(selectedRef);\n const provider = registry.providers.get(providerId);\n if (provider === undefined) {\n throw new ModelSelectionError(`Unknown model provider: ${providerId}`);\n }\n\n let model = registry.modelCache.get(selectedRef);\n if (model === undefined) {\n model = provider.createCompletionModel({ modelId });\n registry.modelCache.set(selectedRef, model);\n }\n\n try {\n assertCompletionControlsSupported(model, input.request.controls);\n } catch (error) {\n if (error instanceof CompletionCapabilityError) {\n throw new ModelSelectionError(error.message);\n }\n throw error;\n }\n\n const metadata = provider.staticModels.get(modelId);\n return {\n ref: selectedRef,\n model,\n warnings: modelWarnings(selectedRef, metadata, input.request),\n };\n}\n\nexport function sessionModelRef(metadata: JsonObject | undefined): string | undefined {\n const value = metadata?.[STUDIO_MODEL_METADATA_KEY];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport function sessionControlValues(\n metadata: JsonObject | undefined,\n): Readonly<Record<string, string>> | undefined {\n const value = metadata?.[STUDIO_CONTROLS_METADATA_KEY];\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const controls = Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n return Object.freeze(controls);\n}\n\nexport function normalizeOptionalModelRef(ref: StudioModelRef | undefined): string | undefined {\n return ref === undefined ? undefined : normalizeModelRef(ref);\n}\n\nexport function normalizeModelRef(ref: StudioModelRef): string {\n return `${normalizeProviderId(ref.providerId)}:${normalizeModelId(ref.modelId)}`;\n}\n\nexport function parseModelRef(ref: string): { providerId: string; modelId: string } {\n const index = ref.indexOf(\":\");\n if (index <= 0 || index === ref.length - 1) {\n throw new ModelSelectionError(`Model ref must use provider:model format: ${ref}`);\n }\n return {\n providerId: normalizeProviderId(ref.slice(0, index)),\n modelId: normalizeModelId(ref.slice(index + 1)),\n };\n}\n\nexport class ModelSelectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelSelectionError\";\n }\n}\n\nasync function agentModelsCatalog(\n registry: StudioModelRegistry,\n agent: StudioAgent,\n): Promise<StudioAgentModelsSummary> {\n const policy = registry.agentPolicies.get(agent.id);\n const catalogs = await Promise.all(\n [...registry.providers.values()].map((provider) => providerCatalog(registry, provider)),\n );\n const warnings = catalogs.flatMap((catalog) =>\n catalog.warning === undefined\n ? []\n : [{ providerId: catalog.id, warning: catalog.warning } satisfies JsonObject],\n );\n const models = catalogs\n .flatMap((catalog) => catalog.models)\n .filter((model) => {\n if (policy?.allowed === undefined) {\n return true;\n }\n return allowedByPolicy(policy.allowed, model.ref);\n });\n const exactPolicyModels = (policy?.allowed ?? [])\n .filter((allowed) => !allowed.endsWith(\":*\"))\n .filter((allowed) => models.every((model) => model.ref !== allowed))\n .flatMap((ref) => {\n try {\n const { providerId, modelId } = parseModelRef(ref);\n const provider = registry.providers.get(providerId);\n return provider === undefined\n ? []\n : [\n modelSummary(registry, provider, modelId, {\n id: modelId,\n }),\n ];\n } catch {\n return [];\n }\n });\n\n const defaultModelRef = policy?.defaultModelRef ?? registry.defaultModelRef;\n const summary: StudioAgentModelsSummary = {\n agentId: agent.id,\n models: [...models, ...exactPolicyModels].map((model) =>\n withAgentControlDefaults(model, agent.agent.controls),\n ),\n };\n if (defaultModelRef !== undefined) summary.defaultModelRef = defaultModelRef;\n if (warnings.length > 0) summary.warnings = warnings;\n return summary;\n}\n\nfunction withAgentControlDefaults(\n model: StudioModelSummary,\n defaults: Readonly<Record<string, string | undefined>> | undefined,\n): StudioModelSummary {\n if (model.controls === undefined || defaults === undefined) return model;\n let changed = false;\n const controls = Object.fromEntries(\n Object.entries(model.controls).map(([id, control]) => {\n const defaultValue = defaults[id];\n if (\n typeof defaultValue !== \"string\" ||\n !control.options.includes(defaultValue) ||\n control.defaultValue === defaultValue\n ) {\n return [id, control];\n }\n changed = true;\n return [id, { ...control, defaultValue }];\n }),\n );\n return changed ? { ...model, controls } : model;\n}\n\nasync function providerCatalog(\n registry: StudioModelRegistry,\n provider: RuntimeProvider,\n): Promise<StudioModelProviderConfig> {\n const models = new Map<string, StudioModelSummary>();\n for (const model of provider.staticModels.values()) {\n models.set(model.id, modelSummary(registry, provider, model.id, model));\n }\n\n let warning: string | undefined;\n if (provider.listModels !== undefined) {\n try {\n const listed = await provider.listModels();\n for (const model of listed.data) {\n const staticModel = provider.staticModels.get(model.id);\n const definition: StudioModelDefinition = { id: model.id };\n if (model.name !== undefined) definition.name = model.name;\n if (model.description !== undefined) definition.description = model.description;\n Object.assign(definition, staticModel);\n const metadata: JsonObject = {};\n if (model.type !== undefined) metadata.type = model.type;\n if (model.createdAt !== undefined) metadata.createdAt = model.createdAt;\n if (model.ownedBy !== undefined) metadata.ownedBy = model.ownedBy;\n if (model.contextLength !== undefined) metadata.contextLength = model.contextLength;\n Object.assign(metadata, staticModel?.metadata);\n definition.metadata = metadata;\n models.set(model.id, modelSummary(registry, provider, model.id, definition));\n }\n } catch (error) {\n const serialized = serializeError(error);\n warning =\n typeof serialized === \"object\" && serialized !== null && \"message\" in serialized\n ? String(serialized.message)\n : String(error);\n }\n }\n\n const catalog: StudioModelProviderConfig = {\n id: provider.id,\n models: [...models.values()].sort((left, right) => left.ref.localeCompare(right.ref)),\n };\n if (provider.name !== undefined) catalog.name = provider.name;\n if (provider.defaultModelId !== undefined) catalog.defaultModelId = provider.defaultModelId;\n if (provider.metadata !== undefined) catalog.metadata = provider.metadata;\n if (warning !== undefined) catalog.warning = warning;\n return catalog;\n}\n\nfunction modelSummary(\n registry: StudioModelRegistry,\n provider: RuntimeProvider,\n modelId: string,\n model: StudioModelDefinition,\n): StudioModelSummary {\n const summary = staticModelSummary(provider, modelId, model);\n const controls = completionModelFor(registry, provider, modelId).controls;\n if (controls !== undefined) summary.controls = controls;\n return summary;\n}\n\nfunction staticModelSummary(\n provider: RuntimeProvider,\n modelId: string,\n model: StudioModelDefinition,\n): StudioModelSummary {\n const summary: StudioModelSummary = {\n ...model,\n id: modelId,\n ref: `${provider.id}:${modelId}`,\n providerId: provider.id,\n };\n if (provider.name !== undefined) summary.providerName = provider.name;\n return summary;\n}\n\nfunction completionModelFor(\n registry: StudioModelRegistry,\n provider: RuntimeProvider,\n modelId: string,\n): CompletionModel {\n const ref = `${provider.id}:${modelId}`;\n let model = registry.modelCache.get(ref);\n if (model === undefined) {\n model = provider.createCompletionModel({ modelId });\n registry.modelCache.set(ref, model);\n }\n return model;\n}\n\nfunction ensureModelAllowed(registry: StudioModelRegistry, agentId: string, ref: string): void {\n const { providerId } = parseModelRef(ref);\n if (!registry.providers.has(providerId)) {\n throw new ModelSelectionError(`Unknown model provider: ${providerId}`);\n }\n const policy = registry.agentPolicies.get(agentId);\n if (policy?.allowed !== undefined && !allowedByPolicy(policy.allowed, ref)) {\n throw new ModelSelectionError(`Model ${ref} is not allowed for agent ${agentId}`);\n }\n}\n\nfunction allowedByPolicy(allowed: string[], ref: string): boolean {\n return allowed.some((entry) =>\n entry.endsWith(\":*\") ? ref.startsWith(entry.slice(0, -1)) : entry === ref,\n );\n}\n\nfunction normalizeAgentPolicies(\n policies: Record<string, StudioAgentModelPolicy>,\n): Map<string, NormalizedAgentModelPolicy> {\n return new Map(\n Object.entries(policies).map(([agentId, policy]) => {\n const normalized: NormalizedAgentModelPolicy = {};\n if (policy.defaultModelRef !== undefined) {\n normalized.defaultModelRef = normalizeModelRef(policy.defaultModelRef);\n }\n if (policy.allowed !== undefined) {\n normalized.allowed = policy.allowed.map((entry) => {\n if (typeof entry === \"string\") {\n return normalizeWildcardModelRef(entry);\n }\n return normalizeModelRef(entry);\n });\n }\n return [agentId.trim(), normalized];\n }),\n );\n}\n\nfunction normalizeWildcardModelRef(ref: string): string {\n const normalized = ref.trim();\n if (!normalized.endsWith(\":*\")) {\n throw new ModelSelectionError(`Invalid wildcard model reference: ${ref}`);\n }\n return `${normalizeProviderId(normalized.slice(0, -2))}:*`;\n}\n\nfunction publicPolicy(policy: NormalizedAgentModelPolicy): StudioAgentModelPolicyConfig {\n const config: StudioAgentModelPolicyConfig = {};\n if (policy.defaultModelRef !== undefined) {\n config.defaultModelRef = policy.defaultModelRef;\n }\n if (policy.allowed !== undefined) config.allowed = policy.allowed;\n return config;\n}\n\nfunction modelWarnings(\n ref: string,\n model: StudioModelDefinition | undefined,\n request: AgentRunRequest,\n): JsonObject[] {\n const warnings: JsonObject[] = [];\n const modalities = requestModalities(request);\n const missingModalities = [...modalities].filter(\n (modality) => !model?.modalities?.input.includes(modality),\n );\n if (model?.modalities !== undefined && missingModalities.length > 0) {\n warnings.push({\n model: ref,\n kind: \"modality\",\n message: `Model ${ref} does not declare input support for ${missingModalities.join(\", \")}`,\n missing: missingModalities,\n });\n }\n\n if (request.stream === true && model?.capabilities?.streaming === false) {\n warnings.push({\n model: ref,\n kind: \"capability\",\n message: `Model ${ref} is configured as non-streaming but the run requested streaming`,\n capability: \"streaming\",\n });\n }\n\n return warnings;\n}\n\nfunction requestModalities(request: AgentRunRequest): Set<StudioModelModality> {\n const modalities = new Set<StudioModelModality>([\"text\"]);\n for (const message of requestMessages(request)) {\n if (message.role === \"user\" || message.role === \"assistant\") {\n if (typeof message.content === \"string\") continue;\n for (const content of message.content) {\n if (content.type === \"image\") {\n modalities.add(\"image\");\n }\n if (content.type === \"file\") {\n modalities.add(\"document\");\n }\n }\n }\n }\n return modalities;\n}\n\nfunction requestMessages(request: AgentRunRequest): readonly Message[] {\n return request.type === \"messages\" ? request.messages : [];\n}\n\nfunction normalizeProviderId(id: string): string {\n const trimmed = id.trim();\n if (trimmed.length === 0 || trimmed.includes(\":\")) {\n throw new ModelSelectionError(\"Model provider id must be non-empty and cannot contain ':'\");\n }\n return trimmed;\n}\n\nfunction normalizeModelId(id: string): string {\n const trimmed = id.trim();\n if (trimmed.length === 0) {\n throw new ModelSelectionError(\"Model id cannot be empty\");\n }\n return trimmed;\n}\n","import type { ClientDataMap, ClientMetadata, ClientStream } from \"@anvia/client\";\nimport { createClientStreamResponse, createEventStreamResponse } from \"@anvia/server\";\nimport { serializeError } from \"./errors\";\n\ntype StudioStreamErrorEvent = {\n type: \"error\";\n error: unknown;\n};\n\nconst studioJsonlHeaders: HeadersInit = {\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"transfer-encoding\": \"chunked\",\n \"x-accel-buffering\": \"no\",\n};\n\nexport function streamStudioJsonl<TEvent>(events: AsyncIterable<TEvent>): Response {\n return createEventStreamResponse({\n events: withStudioStreamErrors(events),\n format: \"jsonl\",\n headers: studioJsonlHeaders,\n });\n}\n\nexport function streamStudioClient<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n>(options: { events: ClientStream<Metadata, Data> }): Response {\n return createClientStreamResponse({\n events: options.events,\n format: \"jsonl\",\n headers: studioJsonlHeaders,\n });\n}\n\nfunction withStudioStreamErrors<TEvent>(\n events: AsyncIterable<TEvent>,\n): AsyncIterable<TEvent | StudioStreamErrorEvent> {\n const iterator = events[Symbol.asyncIterator]();\n let done = false;\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<TEvent | StudioStreamErrorEvent> {\n return {\n async next(): Promise<IteratorResult<TEvent | StudioStreamErrorEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n\n try {\n const next = await iterator.next();\n if (next.done === true) {\n done = true;\n return next;\n }\n return { done: false, value: serializeStreamError(next.value) };\n } catch (error) {\n done = true;\n return {\n done: false,\n value: studioStreamError(error),\n };\n }\n },\n async return(): Promise<IteratorResult<TEvent | StudioStreamErrorEvent>> {\n done = true;\n await iterator.return?.();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nfunction serializeStreamError<TEvent>(event: TEvent): TEvent {\n if (\n typeof event !== \"object\" ||\n event === null ||\n !(\"type\" in event) ||\n event.type !== \"error\" ||\n !(\"error\" in event)\n ) {\n return event;\n }\n return { ...event, error: serializeError(event.error) } as TEvent;\n}\n\nfunction studioStreamError(error: unknown): StudioStreamErrorEvent {\n return {\n type: \"error\",\n error: serializeError(error),\n };\n}\n","import type { StudioTrace, StudioTraceSummary } from \"../types\";\nexport function traceSummary(trace: StudioTrace): StudioTraceSummary {\n const summary: StudioTraceSummary = {\n id: trace.id,\n sessionId: trace.sessionId,\n status: trace.status,\n startedAt: trace.startedAt,\n observationCount: trace.observations.length,\n };\n if (trace.runId !== undefined) summary.runId = trace.runId;\n if (trace.name !== undefined) summary.name = trace.name;\n if (trace.endedAt !== undefined) summary.endedAt = trace.endedAt;\n if (trace.durationMs !== undefined) summary.durationMs = trace.durationMs;\n if (trace.output !== undefined) summary.output = trace.output;\n if (trace.error !== undefined) summary.error = trace.error;\n if (trace.usage !== undefined) summary.usage = trace.usage;\n if (trace.metadata !== undefined) summary.metadata = trace.metadata;\n return summary;\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioObservabilityEvent,\n StudioObservabilityEventType,\n StudioPipelineLogStore,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport type { ResolvedStores } from \"./options\";\nimport { streamStudioJsonl } from \"./streams\";\nimport { traceSummary } from \"./trace-summary\";\n\ntype ObservabilitySubscription = {\n close: () => void;\n next: () => Promise<IteratorResult<StudioObservabilityEvent>>;\n push: (event: StudioObservabilityEvent) => void;\n};\n\nconst defaultBufferSize = 1000;\nconst observedStoreTargets = new WeakMap<object, object>();\n\nexport class StudioObservabilityHub {\n private readonly subscriptions = new Set<ObservabilitySubscription>();\n\n emit(event: StudioObservabilityEvent): void {\n for (const subscription of this.subscriptions) {\n subscription.push(event);\n }\n }\n\n subscribe(\n options: { types?: Set<StudioObservabilityEventType> } = {},\n ): ObservabilitySubscription {\n const subscription = createSubscription(options.types);\n this.subscriptions.add(subscription);\n return {\n close: () => {\n subscription.close();\n this.subscriptions.delete(subscription);\n },\n next: subscription.next,\n push: subscription.push,\n };\n }\n}\n\nexport function observeStores(stores: ResolvedStores, hub: StudioObservabilityHub): ResolvedStores {\n const observed: ResolvedStores = { ...stores };\n if (stores.sessions !== undefined) observed.sessions = observeSessionStore(stores.sessions, hub);\n if (stores.traces !== undefined) observed.traces = observeTraceStore(stores.traces, hub);\n if (stores.pipelineLogs !== undefined) {\n observed.pipelineLogs = observePipelineLogStore(stores.pipelineLogs, hub);\n }\n return observed;\n}\n\nexport function registerObservabilityRoutes(app: Hono, hub: StudioObservabilityHub): void {\n app.get(\"/observability/events\", (c) => {\n const types = parseEventTypes(c.req.query(\"type\"));\n if (types === false) {\n return c.json(\n {\n error: {\n code: \"bad_request\",\n message: \"type must include session_log, pipeline_log, or trace\",\n },\n },\n 400,\n );\n }\n\n return streamStudioJsonl(observabilityEvents(hub, types));\n });\n}\n\nfunction observabilityEvents(\n hub: StudioObservabilityHub,\n types: Set<StudioObservabilityEventType> | undefined,\n): AsyncIterable<StudioObservabilityEvent> {\n const options: { types?: Set<StudioObservabilityEventType> } = {};\n if (types !== undefined) options.types = types;\n const subscription = hub.subscribe(options);\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next: () => subscription.next(),\n async return() {\n subscription.close();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nfunction createSubscription(\n types: Set<StudioObservabilityEventType> | undefined,\n): ObservabilitySubscription {\n const values: StudioObservabilityEvent[] = [];\n const resolvers: Array<(value: IteratorResult<StudioObservabilityEvent>) => void> = [];\n let closed = false;\n\n return {\n close() {\n closed = true;\n for (const resolve of resolvers.splice(0)) {\n resolve({ done: true, value: undefined });\n }\n },\n next() {\n const value = values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => resolvers.push(resolve));\n },\n push(event) {\n if (closed || (types !== undefined && !types.has(event.type))) {\n return;\n }\n const resolve = resolvers.shift();\n if (resolve !== undefined) {\n resolve({ done: false, value: event });\n return;\n }\n if (values.length >= defaultBufferSize) {\n values.shift();\n }\n values.push(event);\n },\n };\n}\n\nfunction observeSessionStore(\n store: StudioSessionStore,\n hub: StudioObservabilityHub,\n): StudioSessionStore {\n const proxy = new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendSessionLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendSessionLog = target.appendSessionLog?.bind(target);\n if (appendSessionLog === undefined) {\n return undefined;\n }\n return async (...args: Parameters<NonNullable<StudioSessionStore[\"appendSessionLog\"]>>) => {\n const log = await appendSessionLog(...args);\n hub.emit({ type: \"session_log\", log });\n return log;\n };\n },\n });\n observedStoreTargets.set(proxy, store);\n return proxy;\n}\n\nfunction observePipelineLogStore(\n store: StudioPipelineLogStore,\n hub: StudioObservabilityHub,\n): StudioPipelineLogStore {\n const proxy = new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendPipelineLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendPipelineLog = target.appendPipelineLog.bind(target);\n return async (...args: Parameters<StudioPipelineLogStore[\"appendPipelineLog\"]>) => {\n const log = await appendPipelineLog(...args);\n hub.emit({ type: \"pipeline_log\", log });\n return log;\n };\n },\n });\n observedStoreTargets.set(proxy, store);\n return proxy;\n}\n\nfunction observeTraceStore(store: StudioTraceStore, hub: StudioObservabilityHub): StudioTraceStore {\n const proxy = new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"saveTrace\") {\n return boundProperty(target, property, receiver);\n }\n const saveTrace = target.saveTrace.bind(target);\n return async (...args: Parameters<StudioTraceStore[\"saveTrace\"]>) => {\n const trace = await saveTrace(...args);\n hub.emit({ type: \"trace\", trace: traceSummary(trace) });\n return trace;\n };\n },\n });\n observedStoreTargets.set(proxy, store);\n return proxy;\n}\n\nexport function rawObservedStore<T extends object>(store: T): T {\n return (observedStoreTargets.get(store) as T | undefined) ?? store;\n}\n\nfunction boundProperty<T extends object>(\n target: T,\n property: string | symbol,\n receiver: unknown,\n): unknown {\n const value = Reflect.get(target, property, receiver);\n return typeof value === \"function\" ? value.bind(target) : value;\n}\n\nfunction parseEventTypes(\n value: string | undefined,\n): Set<StudioObservabilityEventType> | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n const types = new Set<StudioObservabilityEventType>();\n for (const type of value.split(\",\")) {\n const trimmed = type.trim();\n if (!isEventType(trimmed)) {\n return false;\n }\n types.add(trimmed);\n }\n return types;\n}\n\nfunction isEventType(value: string): value is StudioObservabilityEventType {\n return value === \"session_log\" || value === \"pipeline_log\" || value === \"trace\";\n}\n","import {\n type AgentClientStreamContext,\n type ClientStreamEvent,\n customAgentEventsToClientStream,\n} from \"@anvia/client\";\nimport type { AgentStreamEvent } from \"@anvia/core/agent\";\nimport { parseAgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport {\n isJsonValue,\n type JsonObject,\n type Message,\n parseMessages,\n type ToolResultOutput,\n} from \"@anvia/core/completion\";\nimport type { Context } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n AgentTraceOptions,\n StudioSession,\n StudioSessionStore,\n StudioTranscriptAttachment,\n StudioTranscriptChildAgentEvent,\n StudioTranscriptEntry,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { formatJson } from \"./json\";\nimport { streamStudioClient } from \"./streams\";\nimport {\n isAgentTraceOptions,\n isJsonObject,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n} from \"./type-guards\";\n\nexport { transcriptFromMessages } from \"./transcript\";\n\nexport type TranslatedAgentStreamEvent = AgentStreamEvent;\n\nexport class AsyncEventQueue<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) {\n return;\n }\n const resolver = this.resolvers.shift();\n if (resolver !== undefined) {\n resolver({ done: false, value });\n return;\n }\n this.values.push(value);\n }\n\n close(): void {\n this.closed = true;\n for (const resolver of this.resolvers.splice(0)) {\n resolver({ done: true, value: undefined });\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n const value = this.values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (this.closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => this.resolvers.push(resolve));\n }\n}\n\nexport function streamAgentRunEvents(\n _c: Context,\n events: AsyncIterable<AgentRunStreamEvent>,\n options: { runId: string; onCancel?: () => void | Promise<void> },\n): Response {\n return streamStudioClient({\n events: customAgentEventsToClientStream<AgentRunStreamEvent>({\n events: withAgentRunCancellation(events, options.onCancel),\n runId: options.runId,\n mapCustomEvent: studioEventToClientEvent,\n }),\n });\n}\n\nfunction studioEventToClientEvent(\n event: AgentRunStreamEvent,\n context: AgentClientStreamContext,\n): ClientStreamEvent | undefined {\n if (event.type === \"session_log\" && isJsonValue(event.log)) {\n return {\n type: \"data\",\n runId: context.runId,\n name: \"studio.session_log\",\n data: event.log,\n transient: true,\n };\n }\n if (event.type === \"pipeline_log\" && isJsonValue(event.log)) {\n return {\n type: \"data\",\n runId: context.runId,\n name: \"studio.pipeline_log\",\n data: event.log,\n transient: true,\n };\n }\n if (event.type === \"pipeline_final\" && isJsonValue(event.output)) {\n return {\n type: \"data\",\n runId: context.runId,\n name: \"studio.pipeline_final\",\n data: event.output,\n };\n }\n return undefined;\n}\n\nfunction withAgentRunCancellation(\n events: AsyncIterable<AgentRunStreamEvent>,\n onCancel: (() => void | Promise<void>) | undefined,\n): AsyncIterable<AgentRunStreamEvent> {\n const iterator = events[Symbol.asyncIterator]();\n let done = false;\n let terminal = false;\n let cancellationHandled = false;\n\n const handleCancellation = async () => {\n if (cancellationHandled) {\n return;\n }\n cancellationHandled = true;\n await onCancel?.();\n };\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<AgentRunStreamEvent> {\n return {\n async next(): Promise<IteratorResult<AgentRunStreamEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n try {\n const next = await iterator.next();\n if (next.done === true) {\n done = true;\n if (!terminal) {\n await handleCancellation();\n }\n return next;\n }\n if (isTerminalAgentEvent(next.value)) {\n terminal = true;\n }\n return next;\n } catch (error) {\n done = true;\n terminal = true;\n throw error;\n }\n },\n async return(): Promise<IteratorResult<AgentRunStreamEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n done = true;\n let closeError: unknown;\n const closePromise = iterator.return?.().catch((error: unknown) => {\n closeError = error;\n return { done: true, value: undefined } as IteratorResult<AgentRunStreamEvent>;\n });\n if (!terminal) {\n await handleCancellation();\n }\n await closePromise;\n if (closeError !== undefined) {\n throw closeError;\n }\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nexport function traceForRun(\n trace: AgentTraceOptions | undefined,\n agentId: string,\n session: StudioSession | undefined,\n): AgentTraceOptions {\n const options: AgentTraceOptions = {};\n if (trace !== undefined) Object.assign(options, trace);\n const metadata: JsonObject = {};\n if (trace?.metadata !== undefined) Object.assign(metadata, trace.metadata);\n metadata.agentId = agentId;\n options.metadata = metadata;\n if (trace?.sessionId !== undefined) options.sessionId = trace.sessionId;\n else if (session !== undefined) options.sessionId = session.id;\n return options;\n}\n\nexport function createPersistedStreamingSessionTranscript(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n runId: string;\n startedAt: number;\n persistGeneratedMessages?: boolean;\n generatedMessagesStartIndex?: 0 | 1;\n}): {\n events: AsyncIterable<AgentRunStreamEvent>;\n cancel: () => Promise<void>;\n} {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n const title = optionalTitle(props.message);\n let status: \"running\" | \"success\" | \"suspended\" | \"error\" | \"cancelled\" = \"running\";\n let saveTail: Promise<void> = Promise.resolve();\n const isCancelled = () => status === \"cancelled\";\n\n const saveTranscript = (\n input: Parameters<typeof props.store.saveSessionRunTranscript>[0],\n ): Promise<void> => {\n const operation = saveTail.then(async () => {\n const nextSession = await props.store.saveSessionRunTranscript(input);\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\n });\n saveTail = operation.catch(() => undefined);\n return operation;\n };\n\n const events = (async function* (): AsyncIterable<AgentRunStreamEvent> {\n await saveTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"running\",\n });\n if (isCancelled()) {\n return;\n }\n\n try {\n for await (const event of props.stream) {\n if (isCancelled()) {\n return;\n }\n acceptTranscriptStreamEvent(transcript, event);\n if (isTerminalAgentEvent(event)) {\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n }\n const eventStatus =\n event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\"\n ? event.type === \"interaction\"\n ? \"suspended\"\n : \"success\"\n : event.type === \"error\"\n ? \"error\"\n : \"running\";\n\n const saveInput: Parameters<typeof props.store.saveSessionRunTranscript>[0] = {\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: eventStatus,\n };\n if (event.type === \"error\") saveInput.error = serializeError(event.error);\n await saveTranscript(saveInput);\n const generatedMessages =\n event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\"\n ? event.messages.slice(props.generatedMessagesStartIndex ?? 1)\n : [];\n if (props.persistGeneratedMessages === true && generatedMessages.length > 0) {\n await props.store.append({\n scope: { sessionId: props.session.id },\n runId: props.runId,\n turn: 1,\n messages: generatedMessages,\n });\n }\n if (isCancelled()) {\n return;\n }\n status = eventStatus;\n\n yield event;\n }\n } catch (error) {\n if (status !== \"running\") {\n throw error;\n }\n status = \"error\";\n appendTranscriptAssistantError(transcript, errorText(error));\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n await saveTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"error\",\n error: serializeError(error),\n });\n throw error;\n }\n })();\n\n return {\n events,\n async cancel() {\n if (status !== \"running\") {\n return;\n }\n status = \"cancelled\";\n cancelPendingTranscriptInputs(transcript, new Date().toISOString());\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n await saveTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"cancelled\",\n });\n },\n };\n}\n\nexport function assignTranscriptRunDuration(\n transcript: StudioTranscriptEntry[],\n durationMs: number,\n): void {\n const normalizedDurationMs = Math.max(0, durationMs);\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind === \"message\" && entry.role === \"assistant\") {\n entry.durationMs = normalizedDurationMs;\n return;\n }\n if (entry?.kind === \"message\" && entry.role === \"user\") {\n break;\n }\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: \"\",\n durationMs: normalizedDurationMs,\n });\n}\n\nfunction cancelPendingTranscriptInputs(\n transcript: StudioTranscriptEntry[],\n cancelledAt: string,\n): void {\n for (const entry of transcript) {\n if (entry.kind !== \"tool\") {\n continue;\n }\n if (entry.approval?.status === \"pending\") {\n entry.approval = {\n ...entry.approval,\n status: \"cancelled\",\n resolvedAt: cancelledAt,\n reason: \"Run cancelled in Anvia Studio.\",\n };\n }\n if (entry.question?.status === \"pending\") {\n entry.question = {\n ...entry.question,\n status: \"cancelled\",\n cancelledAt,\n };\n }\n }\n}\n\nfunction acceptTranscriptStreamEvent(\n transcript: StudioTranscriptEntry[],\n event: AgentRunStreamEvent,\n): void {\n if (event.type === \"text_delta\") {\n appendTranscriptAssistantText(transcript, event.delta);\n }\n if (event.type === \"reasoning_delta\") {\n appendTranscriptReasoningText(transcript, event.delta, event.id);\n }\n if (event.type === \"tool_call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolCall.toolName,\n callId: event.toolCall.callId ?? event.toolCall.toolCallId,\n args: formatJson(event.toolCall.input),\n });\n }\n if (event.type === \"tool_result\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n const entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }> = {\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n };\n if (event.toolCallId !== undefined) entry.callId = event.toolCallId;\n if (event.args !== undefined) entry.args = event.args;\n if (event.result !== undefined) entry.result = event.result;\n if (event.structuredResult !== undefined) entry.structuredResult = event.structuredResult;\n transcript.push(entry);\n return;\n }\n matched.args = matched.args ?? event.args;\n matched.result = event.result;\n if (event.structuredResult !== undefined) {\n matched.structuredResult = event.structuredResult;\n }\n }\n if (event.type === \"agent_tool_event\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n const entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }> = {\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\n };\n if (event.toolCallId !== undefined) entry.callId = event.toolCallId;\n transcript.push(entry);\n return;\n }\n appendChildAgentTranscriptEvent(matched, event);\n }\n if (event.type === \"interaction\") {\n const interaction = event.interaction;\n const matched = findTranscriptToolEntry(\n transcript,\n interaction.toolName,\n interaction.callId ?? interaction.toolCallId,\n );\n if (matched !== undefined && interaction.type === \"tool-approval\") {\n const approval: NonNullable<typeof matched.approval> = {\n id: interaction.id,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n };\n if (interaction.reason !== undefined) approval.reason = interaction.reason;\n matched.approval = approval;\n }\n if (matched !== undefined && interaction.type === \"tool-question\") {\n matched.question = {\n id: interaction.id,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n questions: interaction.questions.map((question) => ({\n id: question.id,\n question: question.text,\n choices: [...(question.choices ?? [])],\n allowCustom: question.choices === undefined || question.allowCustom === true,\n })),\n };\n }\n }\n if (event.type === \"interaction_response\") {\n const response = event.response;\n const matched = findTranscriptToolEntry(\n transcript,\n response.toolName,\n response.callId ?? response.toolCallId,\n );\n const respondedAt = new Date().toISOString();\n if (matched?.approval !== undefined && response.type === \"tool-approval-response\") {\n const approval: NonNullable<typeof matched.approval> = {\n ...matched.approval,\n status: response.approved ? \"approved\" : \"rejected\",\n resolvedAt: respondedAt,\n };\n if (response.reason !== undefined) approval.reason = response.reason;\n matched.approval = approval;\n }\n if (matched?.question !== undefined && response.type === \"tool-question-response\") {\n matched.question = {\n ...matched.question,\n status: \"answered\",\n answeredAt: respondedAt,\n answers: response.answers.map((answer) => ({\n questionId: answer.questionId,\n answer: answer.value,\n })),\n };\n }\n }\n if (\n (event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\") &&\n event.trace?.traceId !== undefined\n ) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\n }\n if (event.type === \"error\") {\n appendTranscriptAssistantError(transcript, errorText(event.error));\n }\n}\n\nfunction appendChildAgentTranscriptEvent(\n entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }>,\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): void {\n const childEvent = childAgentTranscriptEvent(event);\n if (childEvent === undefined) {\n return;\n }\n const childEvents = entry.childEvents ?? [];\n if (childEvent.kind === \"message\") {\n const last = childEvents.at(-1);\n if (last?.kind === \"message\" && last.agentId === childEvent.agentId) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else if (childEvent.kind === \"reasoning\") {\n const last = childEvents.at(-1);\n if (\n last?.kind === \"reasoning\" &&\n last.agentId === childEvent.agentId &&\n (last.reasoningId ?? \"\") === (childEvent.reasoningId ?? \"\")\n ) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else {\n const matched = findChildAgentToolEvent(childEvents, childEvent);\n if (matched === undefined) {\n childEvents.push(childEvent);\n } else {\n if (matched.args === undefined && childEvent.args !== undefined) {\n matched.args = childEvent.args;\n }\n if (childEvent.result !== undefined) {\n matched.result = childEvent.result;\n }\n }\n }\n entry.childEvents = childEvents;\n}\n\nfunction childAgentTranscriptEvent(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): StudioTranscriptChildAgentEvent | undefined {\n const child = event.event;\n if (child.type === \"text_delta\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"message\" }> = {\n kind: \"message\",\n agentId: event.agentId,\n text: child.delta,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n return entry;\n }\n if (child.type === \"reasoning_delta\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"reasoning\" }> = {\n kind: \"reasoning\",\n agentId: event.agentId,\n text: child.delta,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n if (child.id !== undefined) entry.reasoningId = child.id;\n return entry;\n }\n if (child.type === \"tool_call\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> = {\n kind: \"tool\",\n agentId: event.agentId,\n toolName: child.toolCall.toolName,\n callId: child.toolCall.callId ?? child.toolCall.toolCallId,\n args: formatJson(child.toolCall.input),\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n return entry;\n }\n if (child.type === \"tool_result\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> = {\n kind: \"tool\",\n agentId: event.agentId,\n toolName: child.toolName,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n if (child.toolCallId !== undefined) entry.callId = child.toolCallId;\n if (child.args !== undefined) entry.args = child.args;\n if (child.result !== undefined) entry.result = child.result;\n if (child.structuredResult !== undefined) entry.structuredResult = child.structuredResult;\n return entry;\n }\n if (child.type === \"error\") {\n const entry: Extract<StudioTranscriptChildAgentEvent, { kind: \"message\" }> = {\n kind: \"message\",\n agentId: event.agentId,\n text: `Error: ${errorText(child.error)}`,\n };\n if (event.agentName !== undefined) entry.agentName = event.agentName;\n return entry;\n }\n return undefined;\n}\n\nfunction errorText(error: unknown): string {\n if (typeof error === \"string\") {\n return error;\n }\n return JSON.stringify(serializeError(error));\n}\n\nfunction findChildAgentToolEvent(\n childEvents: StudioTranscriptChildAgentEvent[],\n event: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }>,\n): Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> | undefined {\n for (let index = childEvents.length - 1; index >= 0; index -= 1) {\n const childEvent = childEvents[index];\n if (\n childEvent?.kind !== \"tool\" ||\n childEvent.agentId !== event.agentId ||\n childEvent.toolName !== event.toolName ||\n childEvent.result !== undefined\n ) {\n continue;\n }\n if (event.callId === undefined || childEvent.callId === event.callId) {\n return childEvent;\n }\n }\n return undefined;\n}\n\nfunction messageToTranscriptEntry(\n message: string | Message,\n entryId: number,\n): StudioTranscriptEntry {\n const role = typeof message === \"string\" || message.role !== \"assistant\" ? \"user\" : \"assistant\";\n const entry: Extract<StudioTranscriptEntry, { kind: \"message\" }> = {\n entryId,\n kind: \"message\",\n role,\n text: extractMessageText(message),\n };\n if (role === \"user\") Object.assign(entry, optionalTranscriptAttachments(message));\n return entry;\n}\n\nfunction appendTranscriptAssistantText(transcript: StudioTranscriptEntry[], delta: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\" && last.tone !== \"error\") {\n last.text = `${last.text}${delta}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: delta,\n });\n}\n\nfunction appendTranscriptAssistantError(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (\n last?.kind === \"message\" &&\n last.role === \"assistant\" &&\n last.tone === \"error\" &&\n last.text === text\n ) {\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n tone: \"error\",\n });\n}\n\nfunction assignTranscriptTraceId(transcript: StudioTranscriptEntry[], traceId: string): void {\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind === \"message\" && entry.role === \"assistant\") {\n transcript[index] = { ...entry, traceId };\n return;\n }\n }\n}\n\nfunction appendTranscriptReasoningText(\n transcript: StudioTranscriptEntry[],\n delta: string,\n reasoningId: string | undefined,\n): void {\n const last = transcript.at(-1);\n if (last?.kind === \"reasoning\" && (last.reasoningId ?? \"\") === (reasoningId ?? \"\")) {\n last.text = `${last.text}${delta}`;\n return;\n }\n const entry: Extract<StudioTranscriptEntry, { kind: \"reasoning\" }> = {\n entryId: transcript.length,\n kind: \"reasoning\",\n text: delta,\n };\n if (reasoningId !== undefined) entry.reasoningId = reasoningId;\n transcript.push(entry);\n}\n\nfunction findTranscriptToolEntry(\n transcript: StudioTranscriptEntry[],\n toolName: string,\n callId: string | undefined,\n): Extract<StudioTranscriptEntry, { kind: \"tool\" }> | undefined {\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind !== \"tool\" || entry.toolName !== toolName || entry.result !== undefined) {\n continue;\n }\n if (callId === undefined || entry.callId === callId) {\n return entry;\n }\n }\n return undefined;\n}\n\nfunction titleFromMessage(message: string | Message): string | undefined {\n const text = extractMessageText(message).replace(/\\s+/g, \" \").trim();\n if (text.length === 0) {\n return undefined;\n }\n return text.length > 72 ? `${text.slice(0, 69)}...` : text;\n}\n\nexport function optionalTitle(message: string | Message): { title?: string } {\n const title = titleFromMessage(message);\n return title === undefined ? {} : { title };\n}\n\nfunction extractMessageText(message: string | Message): string {\n if (typeof message === \"string\") {\n return message;\n }\n if (message.role === \"system\") {\n return message.content;\n }\n if (typeof message.content === \"string\") {\n return message.content;\n }\n return message.content\n .flatMap((item) => {\n if (item.type === \"text\" || item.type === \"reasoning\") {\n return [item.text];\n }\n if (item.type === \"tool-call\") {\n return [`${item.toolName}(${formatJson(item.input)})`];\n }\n if (item.type === \"tool-result\") {\n return [toolResultOutputText(item.output)];\n }\n return [];\n })\n .join(\"\\n\");\n}\n\nfunction optionalTranscriptAttachments(message: string | Message): {\n attachments?: StudioTranscriptAttachment[];\n} {\n if (typeof message === \"string\" || message.role !== \"user\") {\n return {};\n }\n if (typeof message.content === \"string\") {\n return {};\n }\n const attachments = message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.image.type === \"data\") {\n attachment.data = content.image.data;\n if (content.mediaType !== undefined) attachment.mediaType = content.mediaType;\n } else {\n attachment.url = content.image.url;\n }\n return [attachment];\n }\n if (content.type === \"file\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.filename !== undefined) attachment.name = content.filename;\n attachment.mediaType = content.mediaType;\n if (content.data.type === \"data\") attachment.data = content.data.data;\n if (content.data.type === \"url\") attachment.url = content.data.url;\n return [attachment];\n }\n return [];\n });\n return attachments.length === 0 ? {} : { attachments };\n}\n\nexport async function parseRunRequest(c: Context): Promise<AgentRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n if (\"message\" in body || \"history\" in body) {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"Legacy message/history requests are not supported; use messages\",\n ),\n };\n }\n\n const request = parseRunRequestBody(c, body);\n if (\"error\" in request) {\n return request;\n }\n\n return parseRunRequestOptions(c, body, request);\n}\n\nfunction parseRunRequestBody(\n c: Context,\n body: Record<string, unknown>,\n): AgentRunRequest | { error: Response } {\n if (body.type === \"interaction_response\") {\n if (typeof body.interactionId !== \"string\" || body.interactionId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"interactionId must be a string\") };\n }\n if (\n body.messages !== undefined ||\n body.sessionId !== undefined ||\n body.model !== undefined ||\n body.controls !== undefined\n ) {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"Interaction responses cannot include messages, sessionId, model, or controls\",\n ),\n };\n }\n try {\n return {\n type: \"interaction_response\",\n interactionId: body.interactionId,\n response: parseAgentInteractionResponse(body.response),\n };\n } catch {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"response must be an interaction response\"),\n };\n }\n }\n if (body.type !== \"messages\") {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n 'type must be \"messages\" or \"interaction_response\"',\n ),\n };\n }\n let messages: Message[];\n try {\n messages = parseMessages(body.messages);\n } catch {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"messages must be a non-empty Message array\"),\n };\n }\n\n if (messages.length === 0) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"messages must be a non-empty Message array\"),\n };\n }\n\n const message = messages.at(-1);\n if (message === undefined) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"messages must be a non-empty Message array\"),\n };\n }\n if (message.role !== \"user\") {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"The final message must be user-authored\"),\n };\n }\n\n return { type: \"messages\", messages };\n}\n\nfunction parseRunRequestOptions(\n c: Context,\n body: Record<string, unknown>,\n request: AgentRunRequest,\n): AgentRunRequest | { error: Response } {\n if (request.type === \"messages\" && \"sessionId\" in body) {\n if (typeof body.sessionId !== \"string\" || body.sessionId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"sessionId must be a string\") };\n }\n if (request.messages.length !== 1 || request.messages[0]?.role !== \"user\") {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"sessionId requires exactly one user message\"),\n };\n }\n request.sessionId = body.sessionId;\n }\n\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n\n if (request.type === \"messages\" && \"maxTurns\" in body) {\n if (!isNonNegativeInteger(body.maxTurns)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"maxTurns must be a non-negative integer\"),\n };\n }\n request.maxTurns = body.maxTurns;\n }\n\n if (request.type === \"messages\" && \"toolConcurrency\" in body) {\n if (!isPositiveInteger(body.toolConcurrency)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"toolConcurrency must be a positive integer\"),\n };\n }\n request.toolConcurrency = body.toolConcurrency;\n }\n\n if (request.type === \"messages\" && \"model\" in body) {\n if (\n isObject(body.model) &&\n typeof body.model.providerId === \"string\" &&\n typeof body.model.modelId === \"string\"\n ) {\n request.model = {\n providerId: body.model.providerId,\n modelId: body.model.modelId,\n };\n } else {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"model must be a { providerId, modelId } object\",\n ),\n };\n }\n }\n\n if (request.type === \"messages\" && \"controls\" in body) {\n if (\n !isObject(body.controls) ||\n Object.values(body.controls).some((value) => typeof value !== \"string\")\n ) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"controls must be an object of string values\"),\n };\n }\n request.controls = body.controls as Record<string, string>;\n }\n\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n\n if (\"trace\" in body) {\n if (!isAgentTraceOptions(body.trace)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"trace must be an AgentTraceOptions object\"),\n };\n }\n request.trace = body.trace;\n }\n\n return request;\n}\n\nfunction toolResultOutputText(output: ToolResultOutput): string {\n if (output.type === \"text\" || output.type === \"error-text\") return output.value;\n if (output.type === \"json\" || output.type === \"error-json\") return formatJson(output.value);\n if (output.type === \"execution-denied\") return output.reason ?? \"Execution denied\";\n return output.value\n .map((part) =>\n part.type === \"text\"\n ? part.text\n : `[file:${part.mediaType}${part.filename === undefined ? \"\" : `:${part.filename}`}]`,\n )\n .join(\"\\n\");\n}\n\nfunction isTerminalAgentEvent(event: AgentRunStreamEvent): boolean {\n return (\n event.type === \"response\" ||\n event.type === \"interaction\" ||\n event.type === \"blocked\" ||\n event.type === \"error\"\n );\n}\n","import type { Message, ToolResultOutput } from \"@anvia/core/completion\";\nimport type { StudioTranscriptAttachment, StudioTranscriptEntry } from \"../types\";\nimport { formatJson } from \"./json\";\n\nexport function renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n\nexport function transcriptFromMessages(messages: readonly Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n const attachments = attachmentsFromMessage(message);\n let textEntryAdded = false;\n const contents =\n typeof message.content === \"string\"\n ? [{ type: \"text\" as const, text: message.content }]\n : message.content;\n for (const content of contents) {\n if (content.type === \"text\") {\n const entry: StudioTranscriptEntry = {\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n };\n if (!textEntryAdded && attachments.length > 0) entry.attachments = attachments;\n transcript.push(entry);\n textEntryAdded = true;\n }\n }\n if (!textEntryAdded && attachments.length > 0) {\n const entry: StudioTranscriptEntry = {\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: \"\",\n attachments,\n };\n transcript.push(entry);\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n if (content.type !== \"tool-result\") {\n continue;\n }\n const entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }> = {\n entryId: transcript.length,\n kind: \"tool\",\n toolName: content.toolName,\n callId: content.callId ?? content.toolCallId,\n result: toolResultText(content.output),\n };\n if (content.output.type === \"content\") entry.structuredResult = content.output.value;\n transcript.push(entry);\n }\n continue;\n }\n\n const contents =\n typeof message.content === \"string\"\n ? [{ type: \"text\" as const, text: message.content }]\n : message.content;\n for (const content of contents) {\n if (content.type === \"text\") {\n appendAssistantTranscriptText(transcript, content.text);\n } else if (content.type === \"reasoning\") {\n const entry: StudioTranscriptEntry = {\n entryId: transcript.length,\n kind: \"reasoning\",\n text: content.text,\n };\n if (content.id !== undefined) entry.reasoningId = content.id;\n transcript.push(entry);\n } else if (content.type === \"tool-call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: content.toolName,\n callId: content.callId ?? content.toolCallId,\n args: formatJson(content.input),\n });\n }\n }\n }\n return transcript;\n}\n\nfunction attachmentsFromMessage(message: Message): StudioTranscriptAttachment[] {\n if (message.role !== \"user\" && message.role !== \"assistant\") {\n return [];\n }\n if (typeof message.content === \"string\") return [];\n return message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.image.type === \"data\") {\n attachment.data = content.image.data;\n if (content.mediaType !== undefined) attachment.mediaType = content.mediaType;\n } else {\n attachment.url = content.image.url;\n }\n return [attachment];\n }\n if (content.type === \"file\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.filename !== undefined) attachment.name = content.filename;\n attachment.mediaType = content.mediaType;\n if (content.data.type === \"data\") attachment.data = content.data.data;\n if (content.data.type === \"url\") attachment.url = content.data.url;\n return [attachment];\n }\n return [];\n });\n}\n\nfunction toolResultText(output: ToolResultOutput): string {\n if (output.type === \"text\" || output.type === \"error-text\") return output.value;\n if (output.type === \"json\" || output.type === \"error-json\") return formatJson(output.value);\n if (output.type === \"execution-denied\") return output.reason ?? \"Execution denied\";\n return output.value\n .map((part) =>\n part.type === \"text\"\n ? part.text\n : `[file:${part.mediaType}${part.filename === undefined ? \"\" : `:${part.filename}`}]`,\n )\n .join(\"\\n\");\n}\n\nfunction appendAssistantTranscriptText(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\") {\n last.text = `${last.text}${text}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n });\n}\n","import type { JsonObject, Message } from \"@anvia/core/completion\";\nimport type {\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionStore,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { formatUnknown } from \"./json\";\n\nexport async function appendSessionLog(\n store: StudioSessionStore | undefined,\n input: StudioSessionLogAppendInput,\n): Promise<StudioSessionLogEntry | undefined> {\n return store?.appendSessionLog?.(input);\n}\n\nexport async function* streamSessionRunLogs(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n runId: string;\n startedAt: number;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitLog(props.store, runStartedLog(props.session, props.runId));\n yield* emitLog(props.store, memoryLoadedLog(props.session, props.runId));\n\n try {\n for await (const event of props.stream) {\n for (const input of logsFromStreamEvent({\n event,\n runId: props.runId,\n sessionId: props.session.id,\n startedAt: props.startedAt,\n })) {\n yield* emitLog(props.store, input);\n }\n yield event;\n }\n } catch (error) {\n yield* emitLog(\n props.store,\n runFailedLog(props.session.id, props.runId, error, props.startedAt),\n );\n throw error;\n }\n}\n\nexport function sessionCreatedLog(\n session: StudioSession | { id: string; agentId: string; title?: string },\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n level: \"info\",\n category: \"session\",\n event: \"session.created\",\n message: \"Session created\",\n metadata: {\n agentId: session.agentId,\n hasTitle: session.title !== undefined,\n titleLength: session.title?.length ?? 0,\n },\n };\n}\n\nexport function runReceivedLog(props: {\n sessionId: string;\n runId: string;\n agentId: string;\n message: string | Message;\n stream: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n hasTrace: boolean;\n metadata?: JsonObject;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {\n agentId: props.agentId,\n stream: props.stream,\n message: messageSummary(props.message),\n hasTrace: props.hasTrace,\n metadataKeys: Object.keys(props.metadata ?? {}),\n };\n if (props.maxTurns !== undefined) metadata.maxTurns = props.maxTurns;\n if (props.toolConcurrency !== undefined) metadata.toolConcurrency = props.toolConcurrency;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"run.received\",\n message: \"Run request received\",\n metadata,\n };\n}\n\nexport function runStartedLog(session: StudioSession, runId: string): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.started\",\n message: \"Run started\",\n metadata: {\n agentId: session.agentId,\n existingMessageCount: session.messageCount,\n },\n };\n}\n\nexport function memoryLoadedLog(\n session: StudioSession,\n runId: string,\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.loaded\",\n message: \"Session memory loaded\",\n metadata: {\n messageCount: session.messageCount,\n transcriptEntries: session.transcript.length,\n },\n };\n}\n\nexport function runCompletedLog(props: {\n sessionId: string;\n runId: string;\n durationMs: number;\n usage?: unknown;\n output?: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {\n durationMs: props.durationMs,\n outputBytes: byteLength(props.output),\n };\n const usage = usageSummary(props.usage);\n if (usage !== undefined) metadata.usage = usage;\n if (props.messageCount !== undefined) metadata.messageCount = props.messageCount;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"run.completed\",\n message: \"Run completed\",\n metadata,\n };\n}\n\nexport function runCancelledLog(\n sessionId: string,\n runId: string,\n startedAt: number,\n): StudioSessionLogAppendInput {\n return {\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.cancelled\",\n message: \"Run cancelled\",\n metadata: {\n durationMs: Date.now() - startedAt,\n },\n };\n}\n\nexport function memorySavedLog(props: {\n sessionId: string;\n runId: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {};\n if (props.messageCount !== undefined) metadata.messageCount = props.messageCount;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.saved\",\n message: \"Session memory saved\",\n metadata,\n };\n}\n\nexport function memoryCompactedLog(props: {\n sessionId: string;\n runId: string;\n originalMessageCount: number;\n compactedMessageCount: number;\n retainedMessageCount: number;\n originalTokenCount: number;\n compactedTokenCount: number;\n retainedTokenCount: number;\n resultTokenCount: number;\n attempts: number;\n usage: unknown;\n}): StudioSessionLogAppendInput {\n const metadata: JsonObject = {\n originalMessageCount: props.originalMessageCount,\n compactedMessageCount: props.compactedMessageCount,\n retainedMessageCount: props.retainedMessageCount,\n originalTokenCount: props.originalTokenCount,\n compactedTokenCount: props.compactedTokenCount,\n retainedTokenCount: props.retainedTokenCount,\n resultTokenCount: props.resultTokenCount,\n attempts: props.attempts,\n };\n const usage = usageSummary(props.usage);\n if (usage !== undefined) metadata.usage = usage;\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"memory\",\n event: \"memory.compacted\",\n message: \"Session memory compacted\",\n metadata,\n };\n}\n\nexport function runFailedLog(\n sessionId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioSessionLogAppendInput {\n return {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"run.failed\",\n message: \"Run failed\",\n metadata: {\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n },\n };\n}\n\nfunction logsFromStreamEvent(props: {\n event: AgentRunStreamEvent;\n sessionId: string;\n runId: string;\n startedAt: number;\n}): StudioSessionLogAppendInput[] {\n const { event, sessionId, runId } = props;\n if (event.type === \"memory_compaction\") {\n return [memoryCompactedLog({ sessionId, runId, ...event })];\n }\n if (event.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"prompt\",\n event: \"prompt.prepared\",\n message: `Turn ${event.turn} prompt prepared`,\n metadata: {\n turn: event.turn,\n prompt: messageSummary(event.prompt),\n historyCount: event.history.length,\n },\n },\n ];\n }\n if (event.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.called\",\n message: `Tool ${event.toolCall.toolName} called`,\n metadata: {\n turn: event.turn,\n toolName: event.toolCall.toolName,\n callId: event.toolCall.callId ?? event.toolCall.toolCallId,\n argumentBytes: byteLength(formatUnknown(event.toolCall.input)),\n },\n },\n ];\n }\n if (event.type === \"tool_result\") {\n const metadata: JsonObject = {\n turn: event.turn,\n toolName: event.toolName,\n argumentBytes: byteLength(event.args),\n resultBytes: byteLength(event.result),\n };\n if (event.toolCallId !== undefined) metadata.callId = event.toolCallId;\n if (event.internalCallId !== undefined) metadata.internalCallId = event.internalCallId;\n if (event.structuredResult !== undefined) {\n metadata.structuredResultBytes = byteLength(JSON.stringify(event.structuredResult));\n }\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.completed\",\n message: `Tool ${event.toolName} completed`,\n metadata,\n },\n ];\n }\n if (event.type === \"turn_end\") {\n const metadata: JsonObject = {\n turn: event.turn,\n contentCount: event.response.choice.length,\n };\n const usage = usageSummary(event.response.usage);\n if (usage !== undefined) metadata.usage = usage;\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"model\",\n event: \"model.turn.completed\",\n message: `Model turn ${event.turn} completed`,\n metadata,\n },\n ];\n }\n if (event.type === \"response\" || event.type === \"interaction\" || event.type === \"blocked\") {\n const result = event;\n const logs: StudioSessionLogAppendInput[] = [];\n if (result.type === \"interaction\") {\n logs.push({\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.suspended\",\n message: `Run suspended for ${result.interaction.type}`,\n metadata: {\n interactionId: result.interaction.id,\n interactionType: result.interaction.type,\n toolName: result.interaction.toolName,\n sourceRunId: result.continuation.sourceRunId,\n },\n });\n } else {\n logs.push(\n runCompletedLog({\n sessionId,\n runId,\n durationMs: Date.now() - props.startedAt,\n usage: result.usage,\n output: result.text,\n messageCount: result.messages.length,\n }),\n );\n }\n if (result.resumedFrom !== undefined) {\n logs.push({\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.resumed\",\n message: \"Interaction resumed in a linked run\",\n metadata: {\n interactionId: result.resumedFrom.interactionId,\n sourceRunId: result.resumedFrom.runId,\n resumedRunId: result.runId,\n },\n });\n }\n logs.push(memorySavedLog({ sessionId, runId, messageCount: result.messages.length }));\n return logs;\n }\n if (event.type === \"error\") {\n return [runFailedLog(sessionId, runId, event.error, props.startedAt)];\n }\n if (event.type === \"interaction_response\") {\n const response = event.response;\n const metadata: JsonObject = {\n interactionId: response.interactionId,\n interactionType:\n response.type === \"tool-approval-response\" ? \"tool-approval\" : \"tool-question\",\n toolName: response.toolName,\n sourceRunId: event.sourceRunId,\n };\n if (response.callId !== undefined) metadata.callId = response.callId;\n if (response.type === \"tool-approval-response\") {\n metadata.approved = response.approved;\n metadata.hasReason = response.reason !== undefined;\n } else {\n metadata.answerCount = response.answers.length;\n }\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"interaction.responded\",\n message: `Interaction response received for ${response.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"agent_tool_event\") {\n return childAgentLog(event, sessionId, runId);\n }\n return [];\n}\n\nasync function* emitLog(\n store: StudioSessionStore,\n input: StudioSessionLogAppendInput,\n): AsyncIterable<AgentRunStreamEvent> {\n const log = await appendSessionLog(store, input);\n if (log !== undefined) {\n yield { type: \"session_log\", log };\n }\n}\n\nfunction childAgentLog(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n sessionId: string,\n runId: string,\n): StudioSessionLogAppendInput[] {\n const child = event.event;\n if (child.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.called\",\n message: `Child agent ${event.agentName ?? event.agentId} called ${child.toolCall.toolName}`,\n metadata: {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolCall.toolName,\n callId: child.toolCall.callId ?? child.toolCall.toolCallId,\n argumentBytes: byteLength(formatUnknown(child.toolCall.input)),\n },\n },\n ];\n }\n if (child.type === \"tool_result\") {\n const metadata: JsonObject = {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolName,\n resultBytes: byteLength(child.result),\n };\n if (child.toolCallId !== undefined) metadata.callId = child.toolCallId;\n if (child.structuredResult !== undefined) {\n metadata.structuredResultBytes = byteLength(JSON.stringify(child.structuredResult));\n }\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed ${child.toolName}`,\n metadata,\n },\n ];\n }\n if (child.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.turn_started\",\n message: `Child agent ${event.agentName ?? event.agentId} turn ${child.turn} started`,\n metadata: {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n childTurn: child.turn,\n historyCount: child.history.length,\n },\n },\n ];\n }\n if (child.type === \"response\" || child.type === \"interaction\" || child.type === \"blocked\") {\n const result = child;\n const metadata: JsonObject = {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n outputBytes: byteLength(result.text),\n messageCount: result.messages.length,\n status: result.type,\n };\n const usage = usageSummary(result.usage);\n if (usage !== undefined) metadata.usage = usage;\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed`,\n metadata,\n },\n ];\n }\n if (child.type === \"error\") {\n return [\n {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"child_agent.failed\",\n message: `Child agent ${event.agentName ?? event.agentId} failed`,\n metadata: {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n error: serializeError(child.error),\n },\n },\n ];\n }\n return [];\n}\n\nfunction messageSummary(message: string | Message): JsonObject {\n if (typeof message === \"string\") {\n return {\n role: \"user\",\n contentKind: \"text\",\n byteLength: byteLength(message),\n };\n }\n return {\n role: message.role,\n contentKind: Array.isArray(message.content) ? \"parts\" : \"text\",\n partCount: Array.isArray(message.content) ? message.content.length : 1,\n byteLength: byteLength(formatUnknown(message.content)),\n };\n}\n\nfunction usageSummary(value: unknown): JsonObject | undefined {\n if (value === undefined || value === null || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n const summary: JsonObject = {};\n const inputTokens = numericValue(record.inputTokens);\n const outputTokens = numericValue(record.outputTokens);\n const totalTokens = numericValue(record.totalTokens);\n const cachedInputTokens = numericValue(record.cachedInputTokens);\n const cacheCreationInputTokens = numericValue(record.cacheCreationInputTokens);\n if (inputTokens !== undefined) summary.inputTokens = inputTokens;\n if (outputTokens !== undefined) summary.outputTokens = outputTokens;\n if (totalTokens !== undefined) summary.totalTokens = totalTokens;\n if (cachedInputTokens !== undefined) summary.cachedInputTokens = cachedInputTokens;\n if (cacheCreationInputTokens !== undefined) {\n summary.cacheCreationInputTokens = cacheCreationInputTokens;\n }\n return summary;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction byteLength(value: string | undefined): number {\n return value === undefined ? 0 : new TextEncoder().encode(value).byteLength;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { isQuestionTool } from \"@anvia/core/tool\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioAgentRuntimeSummary,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioGraphConfig,\n StudioGraphRegistration,\n StudioPipeline,\n StudioPipelineConfig,\n} from \"../types\";\nimport { staticContextDocuments, vectorContexts } from \"./agent-context\";\nimport { evalConfig } from \"./eval-config\";\nimport { serializeUnknown } from \"./json\";\nimport { agentHasKnowledge } from \"./knowledge\";\nimport { createStudioModelRegistry, studioModelsConfig } from \"./models\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\nimport {\n agentHasMcpServers,\n agentToolItems,\n mcpServerName,\n toolRequiresApproval,\n} from \"./tool-metadata\";\n\nexport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport function runnerId(options: StudioRuntimeOptions): string {\n return options.id ?? \"anvia-studio\";\n}\n\nexport function agentConfig(agent: StudioAgent): StudioAgentConfig {\n const name = agent.name ?? agent.agent.name;\n const description = agent.description ?? agent.agent.description;\n const config: StudioAgentConfig = {\n id: agent.id,\n quickPrompts: agent.quickPrompts ?? [],\n };\n if (name !== undefined) config.name = name;\n if (description !== undefined) config.description = description;\n if (agent.metadata !== undefined) config.metadata = agent.metadata;\n return config;\n}\n\nexport function agentRuntimeSummary(agent: StudioAgent): StudioAgentRuntimeSummary {\n const tools = agentToolItems(agent);\n const staticContext = staticContextDocuments(agent.agent);\n const indexedContext = vectorContexts(agent.agent);\n const name = agent.name ?? agent.agent.name;\n const description = agent.description ?? agent.agent.description;\n const summary: StudioAgentRuntimeSummary = {\n id: agent.id,\n model: toJsonValue(agent.agent.model),\n toolCount: tools.length,\n staticToolCount: tools.filter((item) => item.source === \"static\").length,\n dynamicToolCount: tools.filter((item) => item.source === \"dynamic\").length,\n approvalToolCount: tools.filter((item) => toolRequiresApproval(item.tool)).length,\n mcpToolCount: tools.filter((item) => mcpServerName(item.tool) !== undefined).length,\n staticContextCount: staticContext.length,\n dynamicContextCount: indexedContext.length,\n observerCount: Object.keys(agent.agent.observability?.observers ?? {}).length,\n hasMemory: agent.agent.memory !== undefined,\n hasLifecycle: agent.agent.lifecycle !== undefined,\n hasOutputSchema: agent.agent.outputSchema !== undefined,\n };\n if (name !== undefined) summary.name = name;\n if (description !== undefined) summary.description = description;\n if (agent.agent.defaultMaxTurns !== undefined) {\n summary.defaultMaxTurns = agent.agent.defaultMaxTurns;\n }\n if (agent.metadata !== undefined) summary.metadata = agent.metadata;\n return summary;\n}\n\nexport function pipelineConfig(pipeline: StudioPipeline): StudioPipelineConfig {\n const graph = pipeline.pipeline.graph();\n const stageNodes = graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\");\n const config: StudioPipelineConfig = {\n id: pipeline.id,\n stageCount: stageNodes.length,\n edgeCount: graph.edges.length,\n hasParallelStages: graph.nodes.some((node) => node.kind === \"parallel\"),\n agentCount: graph.nodes.filter((node) => node.kind === \"agent\").length,\n extractorCount: graph.nodes.filter((node) => node.kind === \"extractor\").length,\n };\n if (pipeline.name !== undefined) config.name = pipeline.name;\n if (pipeline.description !== undefined) config.description = pipeline.description;\n if (pipeline.metadata !== undefined) config.metadata = pipeline.metadata;\n return config;\n}\n\nexport function graphConfig(registration: StudioGraphRegistration): StudioGraphConfig {\n const config: StudioGraphConfig = {\n id: registration.id,\n nodeTypes: Object.entries(registration.graph.schema.nodes).map(([name, definition]) => ({\n name,\n description: definition.description,\n })),\n relationshipTypes: Object.entries(registration.graph.schema.relationships).map(\n ([name, definition]) => ({\n name,\n description: definition.description,\n from: definition.from,\n to: definition.to,\n }),\n ),\n };\n if (registration.name !== undefined) config.name = registration.name;\n if (registration.description !== undefined) config.description = registration.description;\n return config;\n}\n\nexport function buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n sandboxCount = 0,\n): StudioConfig {\n const models =\n options.models === undefined\n ? undefined\n : studioModelsConfig(createStudioModelRegistry(options.models), agents);\n const config: StudioConfig = {\n id: runnerId(options),\n agents: agents.map(agentConfig),\n pipelines: pipelines.map(pipelineConfig),\n graphs: options.graphs.map(graphConfig),\n evals: options.evals.map(evalConfig),\n chat: {\n quickPrompts: Object.fromEntries(agents.map((agent) => [agent.id, agent.quickPrompts ?? []])),\n },\n capabilities: capabilityConfig(options, agents, pipelines, stores, sandboxCount),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n };\n if (options.name !== undefined) config.name = options.name;\n if (options.description !== undefined) config.description = options.description;\n if (options.version !== undefined) config.version = options.version;\n if (models !== undefined) config.models = models;\n return config;\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n sandboxCount = 0,\n): Partial<Record<StudioCapability, StudioCapabilityConfig>> {\n const capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>> = {\n agents: { enabled: true },\n observability: { enabled: true },\n status: { enabled: true },\n };\n\n if (stores.sessions !== undefined) {\n capabilities.sessions = { enabled: true };\n }\n if (stores.sessions !== undefined || agents.some((agent) => agent.agent.memory !== undefined)) {\n capabilities.memory = { enabled: true };\n }\n if (stores.traces !== undefined) {\n capabilities.traces = { enabled: true };\n }\n if (pipelines.length > 0) {\n capabilities.pipelines = { enabled: true };\n }\n if (_options.graphs.length > 0) {\n capabilities.graphs = { enabled: true };\n }\n if (_options.evals.length > 0) {\n capabilities.evals = { enabled: true };\n }\n if (agents.some((agent) => agent.agent.tools.length > 0)) {\n capabilities.tools = { enabled: true };\n }\n if (agents.some(agentHasMcpServers)) {\n capabilities.mcps = { enabled: true };\n }\n if (sandboxCount > 0) {\n capabilities.sandboxes = { enabled: true };\n }\n\n if (\n agents.some((agent) =>\n agent.agent.tools.some((tool) => toolRequiresApproval(tool) || isQuestionTool(tool)),\n )\n ) {\n capabilities.interactions = { enabled: true };\n }\n if (agents.some(agentHasKnowledge)) {\n capabilities.knowledge = { enabled: true };\n }\n return capabilities;\n}\n\nexport function unsupportedCapabilities(\n stores: ResolvedStores,\n): import(\"../types\").StudioCapability[] {\n const capabilities: import(\"../types\").StudioCapability[] = [];\n if (stores.sessions === undefined) capabilities.push(\"sessions\");\n if (stores.traces === undefined) capabilities.push(\"traces\");\n return capabilities;\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n return serializeUnknown(value);\n}\n","import type {\n StudioEvalCasePreview,\n StudioEvalMetricSummary,\n StudioEvalSuite,\n StudioEvalSuiteConfig,\n} from \"../types\";\nimport { toJsonValue } from \"./json\";\n\nconst CASE_PREVIEW_LIMIT = 5;\nconst PREVIEW_VALUE_MAX_LENGTH = 500;\n\nexport function evalConfig(suite: StudioEvalSuite): StudioEvalSuiteConfig {\n const casePreviews = suite.cases.slice(0, CASE_PREVIEW_LIMIT).map(casePreview);\n const metricSummaries = suite.metrics.map(metricSummary);\n\n const config: StudioEvalSuiteConfig = {\n id: suite.id ?? suite.name,\n name: suite.name,\n caseCount: suite.cases.length,\n metricNames: suite.metrics.map((metric) => metric.name),\n casePreviewCount: casePreviews.length,\n casePreviews,\n metricSummaries,\n };\n if (suite.description !== undefined) config.description = suite.description;\n if (suite.concurrency !== undefined) config.concurrency = suite.concurrency;\n if (suite.metadata !== undefined) config.metadata = suite.metadata;\n return config;\n}\n\nfunction casePreview(testCase: unknown, index: number): StudioEvalCasePreview {\n if (!isRecord(testCase)) {\n return {\n id: `case-${index + 1}`,\n input: previewValue(testCase),\n };\n }\n\n const preview: StudioEvalCasePreview = {\n id:\n typeof testCase.id === \"string\" && testCase.id.length > 0 ? testCase.id : `case-${index + 1}`,\n };\n if (\"input\" in testCase) preview.input = previewValue(testCase.input);\n if (\"expected\" in testCase) preview.expected = previewValue(testCase.expected);\n const keys = metadataKeys(testCase.metadata);\n if (keys !== undefined) preview.metadataKeys = keys;\n return preview;\n}\n\nfunction metricSummary(metric: unknown, index: number): StudioEvalMetricSummary {\n if (!isRecord(metric)) {\n return { name: `metric-${index + 1}` };\n }\n\n const summary: StudioEvalMetricSummary = {\n name:\n typeof metric.name === \"string\" && metric.name.length > 0\n ? metric.name\n : `metric-${index + 1}`,\n };\n const dataType = metricDataType(metric.dataType);\n if (dataType !== undefined) summary.dataType = dataType;\n if (typeof metric.required === \"boolean\") summary.required = metric.required;\n if (metric.direction === \"higher_is_better\" || metric.direction === \"lower_is_better\") {\n summary.direction = metric.direction;\n }\n if (typeof metric.threshold === \"number\") summary.threshold = metric.threshold;\n if (typeof metric.configId === \"string\") summary.configId = metric.configId;\n if (typeof metric.scoreConfigId === \"string\") summary.scoreConfigId = metric.scoreConfigId;\n const keys = metadataKeys(metric.metadata);\n if (keys !== undefined) summary.metadataKeys = keys;\n return summary;\n}\n\nfunction previewValue(value: unknown) {\n const jsonValue = toJsonValue(value);\n const serialized = JSON.stringify(jsonValue);\n if (serialized.length <= PREVIEW_VALUE_MAX_LENGTH) {\n return jsonValue;\n }\n return `${serialized.slice(0, PREVIEW_VALUE_MAX_LENGTH)}...`;\n}\n\nfunction metadataKeys(value: unknown): string[] | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const keys = Object.keys(value).filter((key) => value[key] !== undefined);\n return keys.length > 0 ? keys : undefined;\n}\n\nfunction metricDataType(value: unknown): StudioEvalMetricSummary[\"dataType\"] | undefined {\n return value === \"NUMERIC\" || value === \"CATEGORICAL\" || value === \"BOOLEAN\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport { getAgentToolState } from \"@anvia/core/internal/agent\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentKnowledgeConfig,\n StudioKnowledgeEvidence,\n StudioKnowledgeEvidenceDocument,\n StudioKnowledgeItem,\n StudioKnowledgeItemsPage,\n StudioKnowledgeSourceKind,\n StudioKnowledgeSourceSummary,\n StudioKnowledgeSummary,\n StudioStaticKnowledgeDocument,\n StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { staticContextDocuments, vectorContexts } from \"./agent-context\";\nimport { errorResponse } from \"./http\";\nimport { compactJsonObject, toJsonValue } from \"./json\";\nimport { optionalQueryString, parseLimit } from \"./query\";\n\ntype InspectableStore = {\n inspect?: (request: { limit: number; cursor?: string | undefined; filter?: unknown }) => Promise<{\n items: Array<{ id: string; document: unknown; metadata?: Record<string, unknown> }>;\n nextCursor?: string | undefined;\n totalCount?: number | undefined;\n }>;\n};\n\nexport function registerKnowledgeRoutes(\n app: Hono,\n props: {\n agents: StudioAgent[];\n traceStore?: StudioTraceStore;\n },\n): void {\n app.get(\"/knowledge\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const summary: StudioKnowledgeSummary = {\n agents: await Promise.all(props.agents.map(agentKnowledgeConfig)),\n evidence: await recentKnowledgeEvidence(props.traceStore, limit),\n };\n return c.json(summary);\n });\n\n app.get(\"/knowledge/items\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sourceId = optionalQueryString(c.req.query(\"sourceId\"));\n if (agentId === undefined || sourceId === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"agentId and sourceId are required\");\n }\n\n const agent = props.agents.find((item) => item.id === agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const page = await knowledgeItemsPage(agent, sourceId, {\n limit,\n cursor: optionalQueryString(c.req.query(\"cursor\")),\n });\n if (page === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Knowledge source not found\");\n }\n\n return c.json(page);\n });\n}\n\nexport function agentHasKnowledge(agent: StudioAgent): boolean {\n const toolIndexes = getAgentToolState(agent.agent).toolIndexes;\n return agent.agent.context.length > 0 || toolIndexes.length > 0;\n}\n\nasync function agentKnowledgeConfig(agent: StudioAgent): Promise<StudioAgentKnowledgeConfig> {\n const agentName = agent.name ?? agent.agent.name;\n const staticContext = staticContextDocuments(agent.agent);\n const config: StudioAgentKnowledgeConfig = {\n agentId: agent.id,\n sources: await knowledgeSources(agent),\n staticContext: staticContext.map((document) => {\n const item: StudioStaticKnowledgeDocument = { id: document.id, text: document.text };\n if (document.additionalProps !== undefined) {\n item.additionalProps = jsonObjectFromRecord(document.additionalProps);\n }\n return item;\n }),\n };\n if (agentName !== undefined) config.agentName = agentName;\n return config;\n}\n\nasync function knowledgeSources(agent: StudioAgent): Promise<StudioKnowledgeSourceSummary[]> {\n const toolIndexes = getAgentToolState(agent.agent).toolIndexes;\n const staticContext = staticContextDocuments(agent.agent);\n const indexedContext = vectorContexts(agent.agent);\n const sources: StudioKnowledgeSourceSummary[] = [\n {\n sourceId: staticSourceId(),\n kind: \"static_context\",\n label: \"Static context\",\n count: staticContext.length,\n inspectable: true,\n itemCount: staticContext.length,\n },\n ];\n\n const dynamicContextSources = await Promise.all(\n indexedContext.map(async (vectorContext, index) => {\n const inspect = inspectFn(vectorContext.store);\n const count = await inspectableCount(inspect, vectorContext.filter);\n const source: StudioKnowledgeSourceSummary = {\n sourceId: dynamicContextSourceId(index),\n kind: \"dynamic_context\",\n label: `Dynamic context ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: vectorContext.topK,\n inspectable: inspect !== undefined,\n };\n if (vectorContext.minScore !== undefined) {\n source.minScore = vectorContext.minScore;\n }\n if (count !== undefined) source.itemCount = count;\n return source;\n }),\n );\n\n const dynamicToolSources = await Promise.all(\n toolIndexes.map(async (toolIndex, index) => {\n const inspect = inspectFn(toolIndex);\n const count = await inspectableCount(inspect, toolIndex.filter);\n const source: StudioKnowledgeSourceSummary = {\n sourceId: dynamicToolsSourceId(index),\n kind: \"dynamic_tools\",\n label: `Dynamic tools ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: toolIndex.topK,\n inspectable: inspect !== undefined,\n };\n if (toolIndex.minScore !== undefined) {\n source.minScore = toolIndex.minScore;\n }\n if (count !== undefined) source.itemCount = count;\n return source;\n }),\n );\n\n return [...sources, ...dynamicContextSources, ...dynamicToolSources];\n}\n\nasync function inspectableCount(\n inspect: InspectableStore[\"inspect\"] | undefined,\n filter?: unknown,\n): Promise<number | undefined> {\n if (inspect === undefined) {\n return undefined;\n }\n const page = await inspect({ limit: 1, filter });\n return page.totalCount;\n}\n\nasync function knowledgeItemsPage(\n agent: StudioAgent,\n sourceId: string,\n request: { limit: number; cursor?: string | undefined },\n): Promise<StudioKnowledgeItemsPage | undefined> {\n if (sourceId === staticSourceId()) {\n return staticKnowledgeItemsPage(agent, request);\n }\n\n const vectorContextIndex = dynamicSourceIndex(sourceId, \"dynamic_context\");\n if (vectorContextIndex !== undefined) {\n const vectorContext = vectorContexts(agent.agent)[vectorContextIndex];\n if (vectorContext === undefined) {\n return undefined;\n }\n const inspect = inspectFn(vectorContext.store);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_context\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: vectorContext.filter,\n });\n const result: StudioKnowledgeItemsPage = {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_context\",\n inspectable: true,\n items: page.items.map((item) => dynamicContextItem(item)),\n };\n if (page.nextCursor !== undefined) result.nextCursor = page.nextCursor;\n if (page.totalCount !== undefined) result.totalCount = page.totalCount;\n return result;\n }\n\n const dynamicToolsIndex = dynamicSourceIndex(sourceId, \"dynamic_tools\");\n if (dynamicToolsIndex !== undefined) {\n const toolIndex = getAgentToolState(agent.agent).toolIndexes[dynamicToolsIndex];\n if (toolIndex === undefined) {\n return undefined;\n }\n const inspect = inspectFn(toolIndex);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_tools\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: toolIndex.filter,\n });\n const result: StudioKnowledgeItemsPage = {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_tools\",\n inspectable: true,\n items: page.items.map((item) => dynamicToolItem(item)),\n };\n if (page.nextCursor !== undefined) result.nextCursor = page.nextCursor;\n if (page.totalCount !== undefined) result.totalCount = page.totalCount;\n return result;\n }\n\n return undefined;\n}\n\nfunction inspectFn(store: unknown): InspectableStore[\"inspect\"] | undefined {\n if (!isRecord(store) || typeof store.inspect !== \"function\") {\n return undefined;\n }\n const inspect = store.inspect;\n return (request) =>\n inspect.call(store, request) as ReturnType<NonNullable<InspectableStore[\"inspect\"]>>;\n}\n\nfunction staticKnowledgeItemsPage(\n agent: StudioAgent,\n request: { limit: number; cursor?: string | undefined },\n): StudioKnowledgeItemsPage {\n const staticContext = staticContextDocuments(agent.agent);\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const page = staticContext.slice(start, start + request.limit);\n const nextOffset = start + page.length;\n const result: StudioKnowledgeItemsPage = {\n agentId: agent.id,\n sourceId: staticSourceId(),\n kind: \"static_context\",\n inspectable: true,\n items: page.map((document) => {\n const item: StudioKnowledgeItem = {\n id: document.id,\n kind: \"static_context\",\n text: document.text,\n };\n if (document.additionalProps !== undefined) {\n item.metadata = jsonObjectFromRecord(document.additionalProps);\n }\n return item;\n }),\n totalCount: staticContext.length,\n };\n if (nextOffset < staticContext.length) result.nextCursor = String(nextOffset);\n return result;\n}\n\nfunction nonInspectablePage(\n agentId: string,\n sourceId: string,\n kind: StudioKnowledgeSourceKind,\n): StudioKnowledgeItemsPage {\n return {\n agentId,\n sourceId,\n kind,\n inspectable: false,\n items: [],\n message: \"This source can be searched at runtime, but it does not expose browseable chunks.\",\n };\n}\n\nfunction dynamicContextItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const text =\n isRecord(item.document) && typeof item.document.text === \"string\"\n ? item.document.text\n : typeof item.document === \"string\"\n ? item.document\n : undefined;\n const result: StudioKnowledgeItem = {\n id: item.id,\n kind: \"dynamic_context\",\n };\n if (text === undefined) result.document = toJsonValue(item.document);\n else result.text = text;\n if (item.metadata !== undefined) result.metadata = jsonObjectFromRecord(item.metadata);\n return result;\n}\n\nfunction dynamicToolItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const document = isRecord(item.document) ? item.document : {};\n const definition = isRecord(document.definition) ? document.definition : {};\n const toolName =\n typeof document.toolName === \"string\"\n ? document.toolName\n : typeof definition.name === \"string\"\n ? definition.name\n : item.id;\n const description = typeof definition.description === \"string\" ? definition.description : \"\";\n const result: StudioKnowledgeItem = {\n id: item.id,\n kind: \"dynamic_tool\",\n toolName,\n description,\n parameterKeys: parameterKeys(definition.parameters),\n document: toJsonValue(item.document),\n };\n if (item.metadata !== undefined) result.metadata = jsonObjectFromRecord(item.metadata);\n return result;\n}\n\nfunction parameterKeys(parameters: unknown): string[] {\n if (!isRecord(parameters) || !isRecord(parameters.properties)) {\n return [];\n }\n return Object.keys(parameters.properties);\n}\n\nfunction staticSourceId(): string {\n return \"static-context\";\n}\n\nfunction dynamicContextSourceId(index: number): string {\n return `dynamic-context-${index}`;\n}\n\nfunction dynamicToolsSourceId(index: number): string {\n return `dynamic-tools-${index}`;\n}\n\nfunction dynamicSourceIndex(\n sourceId: string,\n kind: \"dynamic_context\" | \"dynamic_tools\",\n): number | undefined {\n const prefix = kind === \"dynamic_context\" ? \"dynamic-context-\" : \"dynamic-tools-\";\n if (!sourceId.startsWith(prefix)) {\n return undefined;\n }\n const index = Number(sourceId.slice(prefix.length));\n return Number.isInteger(index) && index >= 0 ? index : undefined;\n}\n\nasync function recentKnowledgeEvidence(\n traceStore: StudioTraceStore | undefined,\n limit: number,\n): Promise<StudioKnowledgeEvidence[]> {\n if (traceStore?.listTraces === undefined) {\n return [];\n }\n\n const store = traceStore;\n const listTraces = store.listTraces;\n if (listTraces === undefined) {\n return [];\n }\n const summaries = await listTraces.call(store, { limit });\n const traces = await Promise.all(\n summaries.map((summary) => Promise.resolve(store.getTrace(summary.id)).catch(() => undefined)),\n );\n return traces.flatMap((trace: StudioTrace | undefined) =>\n trace === undefined ? [] : evidenceFromTrace(trace),\n );\n}\n\nfunction evidenceFromTrace(trace: StudioTrace): StudioKnowledgeEvidence[] {\n return trace.observations.flatMap((observation) => {\n if (observation.kind !== \"generation\" || !isRecord(observation.input)) {\n return [];\n }\n\n const documents = Array.isArray(observation.input.documents)\n ? observation.input.documents.flatMap((document) => evidenceDocument(document))\n : [];\n const tools = Array.isArray(observation.input.tools)\n ? observation.input.tools.flatMap((tool) => evidenceToolName(tool))\n : [];\n if (documents.length === 0 && tools.length === 0) {\n return [];\n }\n\n const query = queryFromGenerationInput(observation.input);\n const evidence: StudioKnowledgeEvidence = {\n traceId: trace.id,\n sessionId: trace.sessionId,\n observationId: observation.id,\n observationName: observation.name,\n turn: observation.turn,\n startedAt: observation.startedAt,\n documentCount: documents.length,\n toolCount: tools.length,\n documents,\n tools,\n };\n if (query !== undefined) evidence.query = query;\n return [evidence];\n });\n}\n\nfunction queryFromGenerationInput(value: Record<string, unknown>): string | undefined {\n const promptText = messageText(value.prompt);\n if (promptText.length > 0) {\n return promptText;\n }\n\n if (Array.isArray(value.chatHistory)) {\n for (let index = value.chatHistory.length - 1; index >= 0; index -= 1) {\n const text = messageText(value.chatHistory[index]);\n if (text.length > 0) {\n return text;\n }\n }\n }\n\n if (Array.isArray(value.history)) {\n for (let index = value.history.length - 1; index >= 0; index -= 1) {\n const text = messageText(value.history[index]);\n if (text.length > 0) {\n return text;\n }\n }\n }\n\n return undefined;\n}\n\nfunction messageText(value: unknown): string {\n if (typeof value === \"string\") {\n return value.trim();\n }\n if (!isRecord(value)) {\n return \"\";\n }\n if (typeof value.text === \"string\") {\n return value.text.trim();\n }\n if (typeof value.content === \"string\") {\n return value.content.trim();\n }\n if (Array.isArray(value.content)) {\n return value.content.map(contentText).filter(Boolean).join(\"\\n\").trim();\n }\n return \"\";\n}\n\nfunction contentText(value: unknown): string {\n if (typeof value === \"string\") {\n return value.trim();\n }\n if (!isRecord(value)) {\n return \"\";\n }\n if (typeof value.text === \"string\") {\n return value.text.trim();\n }\n return \"\";\n}\n\nfunction evidenceDocument(value: unknown): StudioKnowledgeEvidenceDocument[] {\n if (!isRecord(value)) {\n return [];\n }\n const id = typeof value.id === \"string\" ? value.id : undefined;\n const text = typeof value.text === \"string\" ? value.text : undefined;\n const additionalProps = isRecord(value.additionalProps)\n ? jsonObjectFromRecord(value.additionalProps)\n : undefined;\n if (id === undefined && text === undefined && additionalProps === undefined) {\n return [];\n }\n const document: StudioKnowledgeEvidenceDocument = {};\n if (id !== undefined) document.id = id;\n if (text !== undefined) document.text = text;\n if (additionalProps !== undefined) document.additionalProps = additionalProps;\n return [document];\n}\n\nfunction evidenceToolName(value: unknown): string[] {\n if (!isRecord(value) || typeof value.name !== \"string\") {\n return [];\n }\n return [value.name];\n}\n\nfunction jsonObjectFromRecord(value: Record<string, unknown>): JsonObject {\n return compactJsonObject(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, JsonValue | unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { StudioTraceStatus } from \"../types\";\n\nexport function optionalQueryString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\n/**\n * Parse a `limit` query parameter.\n *\n * @param value Raw query-string value.\n * @param defaultMax Default when the parameter is absent.\n * @param max Upper bound (values above are clamped).\n */\nexport function parseLimit(\n value: string | undefined,\n defaultMax = 50,\n max = 100,\n): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return defaultMax;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, max);\n}\n\nexport function parseTraceStatus(value: string | undefined): StudioTraceStatus | undefined | false {\n const status = optionalQueryString(value);\n if (status === undefined) {\n return undefined;\n }\n return status === \"running\" ||\n status === \"success\" ||\n status === \"suspended\" ||\n status === \"error\" ||\n status === \"cancelled\"\n ? status\n : false;\n}\n\n/**\n * Parse an `after` (cursor / sequence) query parameter.\n *\n * Returns `undefined` when absent, `false` when invalid, or the\n * parsed non-negative integer.\n */\nexport function parseAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n","import { getAgentToolState } from \"@anvia/core/internal/agent\";\nimport { isMcpTool } from \"@anvia/core/mcp\";\nimport type { AnyTool } from \"@anvia/core/tool\";\nimport type { StudioAgent, StudioAgentToolApprovalMetadata, StudioAgentToolSource } from \"../types\";\n\nexport type AgentToolItem = {\n tool: AnyTool;\n source: StudioAgentToolSource;\n};\n\nexport function agentToolItems(agent: StudioAgent): AgentToolItem[] {\n const state = getAgentToolState(agent.agent);\n const items: AgentToolItem[] = state.staticTools.map((tool) => ({ tool, source: \"static\" }));\n const names = new Set(items.map(({ tool }) => tool.name));\n\n for (const index of state.toolIndexes) {\n for (const tool of index.tools) {\n if (!names.has(tool.name)) {\n names.add(tool.name);\n items.push({ tool, source: \"dynamic\" });\n }\n }\n }\n\n return items;\n}\n\nexport function approvalMetadata(tool: AnyTool): StudioAgentToolApprovalMetadata {\n const approval = tool.requiresApproval;\n if (approval === undefined || approval === false) {\n return { required: false };\n }\n\n if (typeof approval !== \"object\" || approval === null) {\n return { required: true };\n }\n\n const policy = approval as { reason?: unknown };\n const metadata: StudioAgentToolApprovalMetadata = { required: true };\n if (typeof policy.reason === \"string\") metadata.reason = policy.reason;\n return metadata;\n}\n\nexport function toolRequiresApproval(tool: AnyTool): boolean {\n const approval = tool.requiresApproval;\n return approval !== undefined && approval !== false;\n}\n\nexport function mcpServerName(tool: AnyTool): string | undefined {\n return isMcpTool(tool) ? tool.mcp.serverName : undefined;\n}\n\nexport function agentHasMcpServers(agent: StudioAgent): boolean {\n return agent.agent.mcpServers.length > 0;\n}\n","import { runEvalSuite } from \"@anvia/core/evals\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioEvalRunRequest, StudioEvalRunResponse, StudioEvalSuite } from \"../types\";\nimport { evalConfig } from \"./eval-config\";\nimport { errorResponse } from \"./http\";\nimport { toJsonValue } from \"./json\";\nimport { isJsonObject, isObject, isPositiveInteger } from \"./type-guards\";\n\nexport function registerEvalRoutes(\n app: Hono,\n props: {\n evals: StudioEvalSuite[];\n evalMap: Map<string, StudioEvalSuite>;\n },\n): void {\n app.get(\"/evals\", (c) =>\n c.json({\n evals: props.evals.map(evalConfig),\n }),\n );\n\n app.get(\"/evals/:evalId\", (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n return c.json(evalConfig(suite));\n });\n\n app.post(\"/evals/:evalId/runs\", async (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n\n const body = await parseEvalRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const runOptions: Parameters<typeof runEvalSuite>[0] = { ...suite };\n if (body.concurrency !== undefined) runOptions.concurrency = body.concurrency;\n const result = await runEvalSuite(runOptions);\n const endedAt = Date.now();\n const jsonResult = toJsonValue(result);\n const response: StudioEvalRunResponse = {\n runId,\n suiteId: suite.id ?? suite.name,\n startedAt: new Date(startedAt).toISOString(),\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n result: isJsonObject(jsonResult) ? jsonResult : { value: jsonResult },\n };\n return c.json(response);\n });\n}\n\nasync function parseEvalRunRequest(\n c: Context,\n): Promise<StudioEvalRunRequest | { error: Response }> {\n let body: unknown = {};\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioEvalRunRequest = {};\n if (\"concurrency\" in body) {\n if (!isPositiveInteger(body.concurrency)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"concurrency must be a positive integer\"),\n };\n }\n request.concurrency = body.concurrency;\n }\n return request;\n}\n","import type { GraphExploreOptions, GraphSchemaLike } from \"@anvia/graph\";\nimport { resolveGraphExploreOptions } from \"@anvia/graph/explore\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioGraphExploreRequest, StudioGraphRegistration } from \"../types\";\nimport { graphConfig } from \"./config\";\nimport { errorResponse, parseJsonBody } from \"./http\";\nimport { isObject } from \"./type-guards\";\n\nexport function registerGraphRoutes(\n app: Hono,\n registrations: readonly StudioGraphRegistration[],\n): void {\n const graphs = graphRegistry(registrations);\n app.get(\"/graphs\", (c) => c.json({ graphs: [...graphs.values()].map(graphConfig) }));\n app.post(\"/graphs/:graphId/explore\", async (c) => {\n const registration = graphs.get(c.req.param(\"graphId\"));\n if (registration === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Graph not found\");\n }\n const body = await parseJsonBody(c, (value) => parseExploreRequest(c, value));\n if (\"error\" in body) return body.error;\n const input = exploreOptionsWithSignal(body, c.req.raw.signal);\n let options: ReturnType<typeof resolveGraphExploreOptions>;\n try {\n options = resolveGraphExploreOptions(registration.graph.schema, input);\n } catch (error) {\n return errorResponse(\n c,\n 400,\n \"bad_request\",\n error instanceof Error ? error.message : \"Invalid graph exploration request\",\n );\n }\n return c.json(await registration.graph.explore(options));\n });\n}\n\nfunction graphRegistry(\n registrations: readonly StudioGraphRegistration[],\n): Map<string, StudioGraphRegistration> {\n const graphs = new Map<string, StudioGraphRegistration>();\n for (const registration of registrations) {\n if (typeof registration.id !== \"string\" || registration.id.length === 0) {\n throw new TypeError(\"Studio graph id must be a non-empty string.\");\n }\n if (graphs.has(registration.id)) {\n throw new TypeError(`Duplicate Studio graph id: ${registration.id}.`);\n }\n graphs.set(registration.id, registration);\n }\n return graphs;\n}\n\nfunction parseExploreRequest(\n c: Context,\n value: unknown,\n): StudioGraphExploreRequest | { error: Response } {\n if (!isObject(value) || (value.mode !== \"overview\" && value.mode !== \"expand\")) {\n return { error: errorResponse(c, 400, \"bad_request\", \"mode must be overview or expand\") };\n }\n const common = parseCommonOptions(c, value);\n if (\"error\" in common) return common;\n if (value.mode === \"overview\") return { ...common, mode: \"overview\" };\n const nodeIds = stringList(value.nodeIds);\n if (nodeIds === undefined) {\n return { error: errorResponse(c, 400, \"bad_request\", \"nodeIds must be a string array\") };\n }\n const request: Extract<StudioGraphExploreRequest, { mode: \"expand\" }> = {\n ...common,\n mode: \"expand\",\n nodeIds,\n };\n if (\n value.direction === \"outgoing\" ||\n value.direction === \"incoming\" ||\n value.direction === \"both\"\n ) {\n request.direction = value.direction;\n } else if (value.direction !== undefined) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"direction must be outgoing, incoming, or both\"),\n };\n }\n if (typeof value.maxDepth === \"number\") request.maxDepth = value.maxDepth;\n else if (value.maxDepth !== undefined) {\n return { error: errorResponse(c, 400, \"bad_request\", \"maxDepth must be a number\") };\n }\n return request;\n}\n\nfunction parseCommonOptions(\n c: Context,\n value: Record<string, unknown>,\n):\n | Omit<StudioGraphExploreRequest, \"mode\" | \"nodeIds\" | \"direction\" | \"maxDepth\">\n | {\n error: Response;\n } {\n const request: {\n nodeTypes?: string[];\n relationships?: string[];\n maxNodes?: number;\n maxRelationships?: number;\n } = {};\n for (const [key, label] of [\n [\"nodeTypes\", \"nodeTypes\"],\n [\"relationships\", \"relationships\"],\n ] as const) {\n const selected = value[key];\n if (selected === undefined) continue;\n const values = stringList(selected);\n if (values === undefined) {\n return { error: errorResponse(c, 400, \"bad_request\", `${label} must be a string array`) };\n }\n request[key] = values;\n }\n for (const [key, label] of [\n [\"maxNodes\", \"maxNodes\"],\n [\"maxRelationships\", \"maxRelationships\"],\n ] as const) {\n const selected = value[key];\n if (selected === undefined) continue;\n if (typeof selected !== \"number\") {\n return { error: errorResponse(c, 400, \"bad_request\", `${label} must be a number`) };\n }\n request[key] = selected;\n }\n return request;\n}\n\nfunction exploreOptionsWithSignal(\n request: StudioGraphExploreRequest,\n abortSignal: AbortSignal,\n): GraphExploreOptions<GraphSchemaLike> {\n return { ...request, abortSignal };\n}\n\nfunction stringList(value: unknown): string[] | undefined {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) return undefined;\n return value;\n}\n","import {\n type AgentContinuation,\n type AgentInteractionResponse,\n assertAgentInteractionResponse,\n} from \"@anvia/core/agent/interactions\";\n\nexport type StudioContinuationRegistration<Context> = Readonly<{\n continuation: AgentContinuation;\n context: Context;\n}>;\n\nexport type StudioContinuationRegistry<Context> = {\n register(registration: StudioContinuationRegistration<Context>): void;\n take(\n interactionId: string,\n agentId: string,\n response: AgentInteractionResponse,\n ):\n | Readonly<{ status: \"missing\" }>\n | Readonly<{ status: \"claimed\" }>\n | Readonly<{ status: \"invalid\"; error: TypeError }>\n | Readonly<{\n status: \"ready\";\n registration: StudioContinuationRegistration<Context>;\n }>;\n clear(): void;\n};\n\nexport function createStudioContinuationRegistry<Context>(): StudioContinuationRegistry<Context> {\n const pending = new Map<string, StudioContinuationRegistration<Context>>();\n const claimed = new Set<string>();\n return {\n register(registration) {\n const id = registration.continuation.interaction.id;\n if (pending.has(id) || claimed.has(id)) {\n throw new TypeError(`Duplicate Studio interaction ID \"${id}\".`);\n }\n pending.set(id, registration);\n },\n take(interactionId, agentId, response) {\n if (claimed.has(interactionId)) return { status: \"claimed\" };\n const registration = pending.get(interactionId);\n if (registration === undefined || registration.continuation.agentId !== agentId) {\n return { status: \"missing\" };\n }\n const request = registration.continuation.interaction;\n try {\n assertAgentInteractionResponse(request, response);\n } catch (error) {\n return {\n status: \"invalid\",\n error: error instanceof TypeError ? error : new TypeError(String(error)),\n };\n }\n pending.delete(interactionId);\n claimed.add(interactionId);\n return { status: \"ready\", registration };\n },\n clear() {\n pending.clear();\n claimed.clear();\n },\n };\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentMcpServerMetadata,\n StudioAgentMcpToolMetadata,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { approvalMetadata } from \"./tool-metadata\";\n\nexport function registerMcpRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/mcps\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n servers: await agentMcpMetadata(agent),\n });\n });\n}\n\nexport async function agentMcpMetadata(\n agent: StudioAgent,\n): Promise<StudioAgentMcpServerMetadata[]> {\n return Promise.all(\n agent.agent.mcpServers.map(async (server) => {\n const tools: StudioAgentMcpToolMetadata[] = await Promise.all(\n server.tools.map(async (tool) => {\n const definition = await tool.definition(\"\");\n return {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source: \"static\" as const,\n approval: approvalMetadata(tool),\n };\n }),\n );\n const sortedTools = tools.sort((left, right) => left.name.localeCompare(right.name));\n return {\n agentId: agent.id,\n name: server.name,\n toolCount: sortedTools.length,\n tools: sortedTools,\n };\n }),\n ).then((servers) => servers.sort((left, right) => left.name.localeCompare(right.name)));\n}\n","import type {\n MemoryConversation,\n MemoryConversationListOptions,\n MemoryConversationSummary,\n MemoryInspector,\n MemoryStore,\n} from \"@anvia/core/memory\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioMemoryConversationMessages,\n StudioMemoryConversationSteps,\n StudioMemoryConversationSummary,\n StudioMemoryConversationsPage,\n StudioMemoryMessageRecord,\n StudioMemorySourceConversationMessages,\n StudioMemorySourceConversationSteps,\n StudioMemorySourceConversationSummary,\n StudioMemorySourceConversationsPage,\n StudioMemorySourceSummary,\n StudioMemorySourcesPage,\n StudioMemorySourceUsersPage,\n StudioMemoryUsersPage,\n StudioSession,\n StudioSessionStore,\n StudioSessionSummary,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString, parseLimit } from \"./query\";\nimport { transcriptFromMessages } from \"./transcript\";\n\nconst DEFAULT_USER_ID = \"default\";\nconst USER_DISCOVERY_LIMIT = 1_000;\n\ntype StudioMemorySourceDetail = {\n conversation: StudioMemorySourceConversationSummary;\n records: StudioMemoryMessageRecord[];\n};\n\ntype StudioMemorySource = {\n summary: StudioMemorySourceSummary;\n listConversations(\n options: MemoryConversationListOptions,\n ): Promise<StudioMemorySourceConversationSummary[]>;\n getConversation(ref: string): Promise<StudioMemorySourceDetail | undefined>;\n};\n\nexport type StudioMemorySourceRegistry = {\n readonly size: number;\n list(): StudioMemorySourceSummary[];\n get(ref: string): StudioMemorySource | undefined;\n};\n\nexport function createStudioMemorySourceRegistry(\n agents: StudioAgent[],\n sessionStore: StudioSessionStore | undefined,\n): StudioMemorySourceRegistry {\n const sources: StudioMemorySource[] = [];\n const byStore = new Map<MemoryStore, StudioMemorySource>();\n const agentsWithoutMemory: StudioAgent[] = [];\n\n for (const agent of agents) {\n const store = agent.agent.memory?.store;\n if (store === undefined) {\n agentsWithoutMemory.push(agent);\n continue;\n }\n\n const existing = byStore.get(store);\n if (existing !== undefined) {\n existing.summary.agentIds.push(agent.id);\n existing.summary.label = \"Shared agent memory\";\n continue;\n }\n\n const ref = `agent-memory-${sources.length + 1}`;\n const label = `${agent.name ?? agent.agent.name ?? agent.id} memory`;\n const kind = storeKind(store);\n const source =\n store.inspector === undefined\n ? unavailableAgentSource(ref, label, agent.id, kind)\n : agentMemorySource(ref, label, agent.id, kind, store.inspector);\n sources.push(source);\n byStore.set(store, source);\n }\n\n if (sessionStore !== undefined && (agentsWithoutMemory.length > 0 || agents.length === 0)) {\n sources.push(\n studioSessionSource(\n sessionStore,\n agentsWithoutMemory.map((agent) => agent.id),\n ),\n );\n }\n\n const byRef = new Map(sources.map((source) => [source.summary.ref, source]));\n return {\n size: sources.length,\n list: () =>\n sources.map((source) => ({ ...source.summary, agentIds: [...source.summary.agentIds] })),\n get: (ref) => byRef.get(ref),\n };\n}\n\nexport function registerMemoryRoutes(\n app: Hono,\n props: {\n sources: StudioMemorySourceRegistry;\n sessionStore?: StudioSessionStore | undefined;\n },\n): void {\n registerMemorySourceRoutes(app, props.sources);\n if (props.sessionStore !== undefined) {\n registerLegacyMemoryRoutes(app, props.sessionStore);\n }\n}\n\nfunction registerMemorySourceRoutes(app: Hono, registry: StudioMemorySourceRegistry): void {\n app.get(\"/memory/sources\", (c) =>\n c.json({ sources: registry.list() } satisfies StudioMemorySourcesPage),\n );\n\n app.get(\"/memory/sources/:sourceRef/users\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const conversations = await source.listConversations({ limit: USER_DISCOVERY_LIMIT });\n const userPage = memoryUsers(conversations, limit);\n return c.json({\n source: source.summary,\n users: userPage.users,\n total: userPage.total,\n } satisfies StudioMemorySourceUsersPage);\n });\n\n app.get(\"/memory/sources/:sourceRef/conversations\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const userId = optionalQueryString(c.req.query(\"userId\"));\n const listOptions: MemoryConversationListOptions = { limit };\n if (userId !== undefined) listOptions.userId = userId;\n const conversations = await source.listConversations(listOptions);\n return c.json({\n source: source.summary,\n conversations,\n total: conversations.length,\n } satisfies StudioMemorySourceConversationsPage);\n });\n\n app.get(\"/memory/sources/:sourceRef/conversations/:conversationRef/messages\", async (c) => {\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const detail = await source.getConversation(c.req.param(\"conversationRef\"));\n if (detail === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n const messages = detail.records.map((record) => record.message);\n return c.json({\n source: source.summary,\n conversation: detail.conversation,\n messages,\n records: detail.records,\n transcript: transcriptFromMessages(messages),\n } satisfies StudioMemorySourceConversationMessages);\n });\n\n app.get(\"/memory/sources/:sourceRef/conversations/:conversationRef/steps\", async (c) => {\n const source = registry.get(c.req.param(\"sourceRef\"));\n if (source === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Memory source not found\");\n }\n if (!source.summary.available) return unavailableSourceResponse(c, source.summary);\n\n const detail = await source.getConversation(c.req.param(\"conversationRef\"));\n if (detail === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n source: source.summary,\n conversation: detail.conversation,\n steps: transcriptFromMessages(detail.records.map((record) => record.message)),\n } satisfies StudioMemorySourceConversationSteps);\n });\n}\n\nfunction registerLegacyMemoryRoutes(app: Hono, sessionStore: StudioSessionStore): void {\n app.get(\"/memory/users\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const sessions = await sessionStore.listSessions({ limit: 100 });\n const users = new Map<string, StudioMemoryUsersPage[\"users\"][number]>();\n for (const session of sessions) {\n const userId = sessionUserId(session);\n const existing = users.get(userId);\n if (existing === undefined) {\n users.set(userId, {\n userId,\n conversationCount: 1,\n agentIds: [session.agentId],\n lastInteractionAt: session.updatedAt,\n });\n continue;\n }\n existing.conversationCount += 1;\n if (!existing.agentIds.includes(session.agentId)) existing.agentIds.push(session.agentId);\n if (new Date(session.updatedAt).getTime() > new Date(existing.lastInteractionAt).getTime()) {\n existing.lastInteractionAt = session.updatedAt;\n }\n }\n\n const page = [...users.values()]\n .sort(\n (left, right) =>\n new Date(right.lastInteractionAt).getTime() - new Date(left.lastInteractionAt).getTime(),\n )\n .slice(0, limit);\n return c.json({ users: page, total: users.size } satisfies StudioMemoryUsersPage);\n });\n\n app.get(\"/memory/conversations\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const userId = optionalQueryString(c.req.query(\"userId\"));\n const listInput: Parameters<typeof sessionStore.listSessions>[0] = { limit: 100 };\n if (agentId !== undefined) listInput.agentId = agentId;\n const sessions = await sessionStore.listSessions(listInput);\n const conversations = sessions\n .map(memoryConversationSummary)\n .filter((session) => userId === undefined || session.userId === userId)\n .slice(0, limit);\n\n return c.json({\n conversations,\n total: conversations.length,\n } satisfies StudioMemoryConversationsPage);\n });\n\n app.get(\"/memory/conversations/:conversationId/messages\", async (c) => {\n const session = await sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n messages: session.messages,\n transcript: session.transcript,\n } satisfies StudioMemoryConversationMessages);\n });\n\n app.get(\"/memory/conversations/:conversationId/steps\", async (c) => {\n const session = await sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n steps: session.transcript,\n } satisfies StudioMemoryConversationSteps);\n });\n}\n\nfunction agentMemorySource(\n ref: string,\n label: string,\n agentId: string,\n storeKindValue: string | undefined,\n inspector: MemoryInspector,\n): StudioMemorySource {\n const summary: StudioMemorySourceSummary = {\n ref,\n kind: \"agent\",\n label,\n agentIds: [agentId],\n available: true,\n };\n if (storeKindValue !== undefined) summary.storeKind = storeKindValue;\n\n return {\n summary,\n async listConversations(options) {\n const inspectorOptions: MemoryConversationListOptions = {\n limit: options.userId === DEFAULT_USER_ID ? USER_DISCOVERY_LIMIT : options.limit,\n };\n if (options.userId !== undefined && options.userId !== DEFAULT_USER_ID) {\n inspectorOptions.userId = options.userId;\n }\n const conversations = await inspector.listConversations(inspectorOptions);\n return conversations\n .map((conversation) => sourceConversationSummary(conversation, summary.agentIds))\n .filter(\n (conversation) => options.userId === undefined || conversation.userId === options.userId,\n )\n .slice(0, options.limit);\n },\n async getConversation(conversationRef) {\n const conversation = await inspector.getConversation({ ref: conversationRef });\n return conversation === undefined\n ? undefined\n : inspectorConversationDetail(conversation, summary.agentIds);\n },\n };\n}\n\nfunction unavailableAgentSource(\n ref: string,\n label: string,\n agentId: string,\n storeKindValue: string | undefined,\n): StudioMemorySource {\n const summary: StudioMemorySourceSummary = {\n ref,\n kind: \"agent\",\n label,\n agentIds: [agentId],\n available: false,\n reason: \"This memory store does not expose the optional inspector capability.\",\n };\n if (storeKindValue !== undefined) summary.storeKind = storeKindValue;\n return {\n summary,\n listConversations: async () => [],\n getConversation: async () => undefined,\n };\n}\n\nfunction studioSessionSource(\n sessionStore: StudioSessionStore,\n agentIds: string[],\n): StudioMemorySource {\n const summary: StudioMemorySourceSummary = {\n ref: \"studio-sessions\",\n kind: \"studio\",\n label: \"Studio sessions\",\n agentIds: [...agentIds],\n available: true,\n storeKind: sessionStore.kind ?? \"studio\",\n };\n const allowedAgents = new Set(agentIds);\n const restrictAgents = allowedAgents.size > 0;\n\n return {\n summary,\n async listConversations(options) {\n const sessions = await sessionStore.listSessions({ limit: USER_DISCOVERY_LIMIT });\n return sessions\n .filter((session) => !restrictAgents || allowedAgents.has(session.agentId))\n .map(studioSourceConversationSummary)\n .filter(\n (conversation) => options.userId === undefined || conversation.userId === options.userId,\n )\n .slice(0, options.limit);\n },\n async getConversation(conversationRef) {\n const session = await sessionStore.getSession(conversationRef);\n if (session === undefined || (restrictAgents && !allowedAgents.has(session.agentId))) {\n return undefined;\n }\n return {\n conversation: studioSourceConversationSummary(session),\n records: session.messages.map((message, position) => ({\n position,\n runId: \"studio-session\",\n turn: 0,\n createdAt: session.updatedAt,\n message,\n })),\n };\n },\n };\n}\n\nfunction sourceConversationSummary(\n conversation: MemoryConversationSummary,\n agentIds: string[],\n): StudioMemorySourceConversationSummary {\n const summary: StudioMemorySourceConversationSummary = {\n ref: conversation.ref,\n sessionId: conversation.sessionId,\n userId: conversation.userId ?? DEFAULT_USER_ID,\n agentIds: [...agentIds],\n createdAt: conversation.createdAt,\n updatedAt: conversation.updatedAt,\n messageCount: conversation.messageCount,\n };\n if (conversation.metadata !== undefined) summary.metadata = conversation.metadata;\n return summary;\n}\n\nfunction inspectorConversationDetail(\n conversation: MemoryConversation,\n agentIds: string[],\n): StudioMemorySourceDetail {\n return {\n conversation: sourceConversationSummary(conversation, agentIds),\n records: conversation.messages,\n };\n}\n\nfunction studioSourceConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemorySourceConversationSummary {\n const summary: StudioMemorySourceConversationSummary = {\n ref: session.id,\n sessionId: session.id,\n userId: sessionUserId(session),\n agentIds: [session.agentId],\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n };\n if (session.title !== undefined) summary.title = session.title;\n if (session.metadata !== undefined) summary.metadata = session.metadata;\n return summary;\n}\n\nfunction memoryUsers(\n conversations: StudioMemorySourceConversationSummary[],\n limit: number,\n): { users: StudioMemoryUsersPage[\"users\"]; total: number } {\n const users = new Map<string, StudioMemoryUsersPage[\"users\"][number]>();\n for (const conversation of conversations) {\n const existing = users.get(conversation.userId);\n if (existing === undefined) {\n users.set(conversation.userId, {\n userId: conversation.userId,\n conversationCount: 1,\n agentIds: [...conversation.agentIds],\n lastInteractionAt: conversation.updatedAt,\n });\n continue;\n }\n existing.conversationCount += 1;\n for (const agentId of conversation.agentIds) {\n if (!existing.agentIds.includes(agentId)) existing.agentIds.push(agentId);\n }\n if (\n new Date(conversation.updatedAt).getTime() > new Date(existing.lastInteractionAt).getTime()\n ) {\n existing.lastInteractionAt = conversation.updatedAt;\n }\n }\n return {\n users: [...users.values()]\n .sort(\n (left, right) =>\n new Date(right.lastInteractionAt).getTime() - new Date(left.lastInteractionAt).getTime(),\n )\n .slice(0, limit),\n total: users.size,\n };\n}\n\nfunction memoryConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemoryConversationSummary {\n const summary: StudioMemoryConversationSummary = {\n id: session.id,\n userId: sessionUserId(session),\n agentId: session.agentId,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n };\n if (session.title !== undefined) summary.title = session.title;\n if (session.metadata !== undefined) summary.metadata = session.metadata;\n return summary;\n}\n\nfunction sessionUserId(session: Pick<StudioSession, \"metadata\">): string {\n const userId = session.metadata?.userId;\n return typeof userId === \"string\" && userId.trim().length > 0 ? userId : DEFAULT_USER_ID;\n}\n\nfunction storeKind(store: MemoryStore): string | undefined {\n const kind = (store as MemoryStore & { readonly kind?: unknown }).kind;\n return typeof kind === \"string\" && kind.length > 0 ? kind : undefined;\n}\n\nfunction unavailableSourceResponse(\n c: Parameters<typeof errorResponse>[0],\n source: StudioMemorySourceSummary,\n): Response {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n source.reason ?? \"Memory source is not inspectable\",\n { sourceRef: source.ref },\n );\n}\n","import { type JsonObject, type JsonValue, Usage } from \"@anvia/core/completion\";\nimport type { PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioPipeline,\n StudioPipelineDetail,\n StudioPipelineLogStore,\n StudioPipelineReplayRequest,\n StudioPipelineRunRequest,\n StudioPipelineRunResponse,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n} from \"../types\";\nimport { pipelineConfig } from \"./config\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { toJsonValue } from \"./json\";\nimport {\n appendPipelineLog,\n emitPipelineLog,\n pipelineRunCompletedLog,\n pipelineRunFailedLog,\n pipelineRunReceivedLog,\n pipelineRunStartedLog,\n pipelineStageLog,\n} from \"./pipeline-logs\";\nimport { AsyncEventQueue } from \"./runs\";\nimport type { StudioRunLease, StudioRunLifecycle } from \"./run-lifecycle\";\nimport { streamStudioJsonl } from \"./streams\";\nimport { isJsonObject, isJsonValue, isObject } from \"./type-guards\";\n\nexport function registerPipelineRoutes(\n app: Hono,\n props: {\n pipelines: StudioPipeline[];\n pipelineMap: Map<string, StudioPipeline>;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n runLifecycle: StudioRunLifecycle;\n },\n): void {\n app.get(\"/pipelines\", (c) =>\n c.json({\n pipelines: props.pipelines.map(pipelineConfig),\n }),\n );\n\n app.get(\"/pipelines/:pipelineId\", (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n return c.json(pipelineDetail(pipeline));\n });\n\n app.get(\"/pipelines/:pipelineId/logs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.logStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.logs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"logs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parsePipelineLogAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const listInput: Parameters<typeof props.logStore.listPipelineLogs>[0] = {\n pipelineId,\n limit,\n };\n if (after !== undefined) listInput.after = after;\n const logs = await props.logStore.listPipelineLogs(listInput);\n const last = logs.at(-1);\n const response: { logs: typeof logs; nextCursor?: number } = { logs };\n if (logs.length === limit && last !== undefined) response.nextCursor = last.sequence;\n return c.json(response);\n });\n\n app.get(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const runs = await props.runStore.listPipelineRuns({ pipelineId, limit });\n return c.json({ runs });\n });\n\n app.post(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n\n const body = await parsePipelineRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n return executeTrackedPipelineRun(c, props, pipeline, body);\n });\n\n app.post(\"/pipelines/:pipelineId/runs/:runId/replay\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const body = await parsePipelineReplayRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const sourceRunId = c.req.param(\"runId\");\n const sourceRun = await props.runStore.getPipelineRun({\n pipelineId: pipeline.id,\n runId: sourceRunId,\n });\n if (sourceRun === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline run not found\");\n }\n if (sourceRun.status === \"running\") {\n return errorResponse(c, 409, \"conflict\", \"Cannot replay a running pipeline run\");\n }\n\n const replayRequest: StudioPipelineRunRequest = {\n input: sourceRun.input,\n metadata: replayMetadata(sourceRun.metadata, body.metadata, sourceRun.runId),\n };\n if (body.stream !== undefined) replayRequest.stream = body.stream;\n return executeTrackedPipelineRun(c, props, pipeline, replayRequest);\n });\n}\n\nasync function executeTrackedPipelineRun(\n c: Context,\n props: {\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n runLifecycle: StudioRunLifecycle;\n },\n pipeline: StudioPipeline,\n body: StudioPipelineRunRequest,\n): Promise<Response> {\n const lease = props.runLifecycle.start(c.req.raw.signal);\n if (lease === undefined) {\n return errorResponse(c, 503, \"service_unavailable\", \"Anvia Studio is shutting down\");\n }\n try {\n return await executePipelineRun(c, props, pipeline, body, lease);\n } catch (error) {\n lease.finish();\n throw error;\n }\n}\n\nasync function executePipelineRun(\n c: Context,\n props: {\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n pipeline: StudioPipeline,\n body: StudioPipelineRunRequest,\n lease: StudioRunLease,\n): Promise<Response> {\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const startedAtIso = new Date(startedAt).toISOString();\n const receivedInput: Parameters<typeof pipelineRunReceivedLog>[0] = {\n pipeline,\n runId,\n stream: body.stream === true,\n input: body.input,\n };\n if (body.metadata !== undefined) receivedInput.metadata = body.metadata;\n await appendPipelineLog(props.logStore, pipelineRunReceivedLog(receivedInput));\n const runningRecord: StudioPipelineRunSaveInput = {\n runId,\n pipelineId: pipeline.id,\n status: \"running\",\n input: body.input,\n startedAt: startedAtIso,\n };\n if (body.metadata !== undefined) runningRecord.metadata = body.metadata;\n await savePipelineRun(props.runStore, runningRecord);\n\n if (body.stream === true) {\n const streamOptions: Parameters<typeof streamPipelineRun>[1] = {\n pipeline,\n runId,\n input: body.input,\n startedAt,\n startedAtIso,\n onFinish: lease.finish,\n };\n if (body.metadata !== undefined) streamOptions.metadata = body.metadata;\n if (props.logStore !== undefined) streamOptions.logStore = props.logStore;\n if (props.runStore !== undefined) streamOptions.runStore = props.runStore;\n streamOptions.abortSignal = lease.abortSignal;\n return streamPipelineRun(c, streamOptions);\n }\n\n try {\n await appendPipelineLog(props.logStore, pipelineRunStartedLog(pipeline, runId));\n const result = await pipeline.pipeline.run({\n input: body.input,\n runId,\n metadata: body.metadata,\n abortSignal: lease.abortSignal,\n observer: {\n async onEvent(event) {\n await appendPipelineLog(props.logStore, pipelineStageLog(event, pipeline.id));\n },\n },\n failOnObserverError: true,\n });\n const output = result.output;\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n const successRecord: StudioPipelineRunSaveInput = {\n runId,\n pipelineId: pipeline.id,\n status: \"success\",\n input: body.input,\n output: jsonOutput,\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n };\n if (body.metadata !== undefined) successRecord.metadata = body.metadata;\n await savePipelineRun(props.runStore, successRecord);\n await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: pipeline.id,\n runId,\n durationMs: endedAt - startedAt,\n output: jsonOutput,\n }),\n );\n const response: StudioPipelineRunResponse = {\n runId,\n pipelineId: pipeline.id,\n output: jsonOutput,\n };\n return c.json(response);\n } catch (error) {\n const endedAt = Date.now();\n const errorRecord: StudioPipelineRunSaveInput = {\n runId,\n pipelineId: pipeline.id,\n status: \"error\",\n input: body.input,\n error: serializeError(error),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n };\n if (body.metadata !== undefined) errorRecord.metadata = body.metadata;\n await savePipelineRun(props.runStore, errorRecord);\n await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(pipeline.id, runId, error, startedAt),\n );\n return errorResponse(c, 500, \"internal_error\", \"Pipeline run failed\", serializeError(error));\n } finally {\n lease.finish();\n }\n}\n\nfunction pipelineDetail(pipeline: StudioPipeline): StudioPipelineDetail {\n const graph = pipeline.pipeline.graph();\n graph.id = pipeline.id;\n return {\n ...pipelineConfig(pipeline),\n graph,\n };\n}\n\nfunction streamPipelineRun(\n _c: Context,\n props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n abortSignal?: AbortSignal;\n onFinish: () => void;\n },\n): Response {\n return streamStudioJsonl(pipelineRunEvents(props));\n}\n\nasync function* pipelineRunEvents(props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n abortSignal?: AbortSignal;\n onFinish: () => void;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitPipelineLog(props.logStore, pipelineRunStartedLog(props.pipeline, props.runId));\n\n const events = new AsyncEventQueue<AgentRunStreamEvent>();\n const run = props.pipeline.pipeline\n .run({\n input: props.input,\n runId: props.runId,\n metadata: props.metadata,\n abortSignal: props.abortSignal,\n observer: {\n async onEvent(event: PipelineRunEvent) {\n const log = await appendPipelineLog(\n props.logStore,\n pipelineStageLog(event, props.pipeline.id),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n },\n },\n failOnObserverError: true,\n })\n .then(async ({ output }) => {\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n const successRecord: StudioPipelineRunSaveInput = {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"success\",\n input: props.input,\n output: jsonOutput,\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n };\n if (props.metadata !== undefined) successRecord.metadata = props.metadata;\n await savePipelineRun(props.runStore, successRecord);\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: props.pipeline.id,\n runId: props.runId,\n durationMs: endedAt - props.startedAt,\n output: jsonOutput,\n }),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({\n type: \"pipeline_final\",\n runId: props.runId,\n pipelineId: props.pipeline.id,\n output: jsonOutput,\n });\n })\n .catch(async (error) => {\n const endedAt = Date.now();\n const errorRecord: StudioPipelineRunSaveInput = {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"error\",\n input: props.input,\n error: serializeError(error),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n };\n if (props.metadata !== undefined) errorRecord.metadata = props.metadata;\n await savePipelineRun(props.runStore, errorRecord);\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(props.pipeline.id, props.runId, error, props.startedAt),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({ type: \"error\", error: serializeError(error), usage: Usage.empty() });\n })\n .finally(() => events.close());\n\n try {\n while (true) {\n const next = await events.next();\n if (next.done === true) {\n break;\n }\n yield next.value;\n }\n } finally {\n try {\n await run;\n } finally {\n props.onFinish();\n }\n }\n}\n\nasync function savePipelineRun(\n store: StudioPipelineRunStore | undefined,\n input: StudioPipelineRunSaveInput,\n) {\n return store?.savePipelineRun(input);\n}\n\nasync function parsePipelineRunRequest(\n c: Context,\n): Promise<StudioPipelineRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n if (!(\"input\" in body) || !isJsonValue(body.input)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"input must be JSON-compatible\") };\n }\n\n const request: StudioPipelineRunRequest = {\n input: body.input,\n };\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nasync function parsePipelineReplayRequest(\n c: Context,\n): Promise<StudioPipelineReplayRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioPipelineReplayRequest = {};\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nfunction replayMetadata(\n sourceMetadata: JsonObject | undefined,\n requestMetadata: JsonObject | undefined,\n sourceRunId: string,\n): JsonObject {\n const metadata: JsonObject = {};\n Object.assign(metadata, sourceMetadata, requestMetadata);\n metadata.replayOf = sourceRunId;\n return metadata;\n}\n\nfunction parsePipelineLogLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 200;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 1000);\n}\n\nfunction parsePipelineLogAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { PipelineGraphNode, PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type {\n StudioPipeline,\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogStore,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { formatUnknown } from \"./json\";\n\nexport async function appendPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): Promise<StudioPipelineLogEntry | undefined> {\n return store?.appendPipelineLog(input);\n}\n\nexport async function* emitPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): AsyncIterable<{ type: \"pipeline_log\"; log: StudioPipelineLogEntry }> {\n const log = await appendPipelineLog(store, input);\n if (log !== undefined) {\n yield { type: \"pipeline_log\", log };\n }\n}\n\nexport function pipelineRunReceivedLog(props: {\n pipeline: StudioPipeline;\n runId: string;\n stream: boolean;\n input: unknown;\n metadata?: JsonObject;\n}): StudioPipelineLogAppendInput {\n const metadata: JsonObject = {\n stream: props.stream,\n metadataKeys: Object.keys(props.metadata ?? {}),\n };\n const inputBytes = byteLength(formatUnknown(props.input));\n if (inputBytes !== undefined) metadata.inputBytes = inputBytes;\n return {\n pipelineId: props.pipeline.id,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"pipeline.run_received\",\n message: \"Pipeline run request received\",\n metadata,\n };\n}\n\nexport function pipelineRunStartedLog(\n pipeline: StudioPipeline,\n runId: string,\n): StudioPipelineLogAppendInput {\n const graph = pipeline.pipeline.graph();\n return {\n pipelineId: pipeline.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_started\",\n message: \"Pipeline run started\",\n metadata: {\n stageCount: graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\")\n .length,\n edgeCount: graph.edges.length,\n },\n };\n}\n\nexport function pipelineRunCompletedLog(props: {\n pipelineId: string;\n runId: string;\n durationMs: number;\n output: unknown;\n}): StudioPipelineLogAppendInput {\n const metadata: JsonObject = { durationMs: props.durationMs };\n const outputBytes = byteLength(formatUnknown(props.output));\n if (outputBytes !== undefined) metadata.outputBytes = outputBytes;\n return {\n pipelineId: props.pipelineId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_completed\",\n message: \"Pipeline run completed\",\n metadata,\n };\n}\n\nexport function pipelineRunFailedLog(\n pipelineId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioPipelineLogAppendInput {\n return {\n pipelineId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"pipeline.run_failed\",\n message: \"Pipeline run failed\",\n metadata: {\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n },\n };\n}\n\nexport function pipelineStageLog(\n event: PipelineRunEvent,\n studioPipelineId: string = event.pipelineId,\n): StudioPipelineLogAppendInput {\n const category = stageCategory(event.node);\n if (event.type === \"stage_started\") {\n return {\n pipelineId: studioPipelineId,\n runId: event.runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.started`,\n message: `${event.node.label} started`,\n metadata: nodeMetadata(event.node),\n };\n }\n if (event.type === \"stage_completed\") {\n return {\n pipelineId: studioPipelineId,\n runId: event.runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.completed`,\n message: `${event.node.label} completed`,\n metadata: {\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n },\n };\n }\n return {\n pipelineId: studioPipelineId,\n runId: event.runId,\n level: \"error\",\n category,\n event: `${event.node.kind}.failed`,\n message: `${event.node.label} failed`,\n metadata: {\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n error: serializeError(event.error),\n },\n };\n}\n\nfunction stageCategory(node: PipelineGraphNode): StudioPipelineLogAppendInput[\"category\"] {\n if (node.kind === \"parallel\" || node.kind === \"branch\") {\n return \"parallel\";\n }\n if (node.kind === \"agent\") {\n return \"agent\";\n }\n if (node.kind === \"extractor\") {\n return \"extractor\";\n }\n return \"stage\";\n}\n\nfunction nodeMetadata(node: PipelineGraphNode): JsonObject {\n const metadata: JsonObject = {\n nodeId: node.id,\n nodePath: [...node.path],\n kind: node.kind,\n label: node.label,\n };\n if (node.agentId !== undefined) metadata.agentId = node.agentId;\n if (node.pipelineId !== undefined) metadata.pipelineId = node.pipelineId;\n if (node.branchKey !== undefined) metadata.branchKey = node.branchKey;\n return metadata;\n}\n\nfunction byteLength(value: string | undefined): number | undefined {\n return value === undefined ? undefined : new TextEncoder().encode(value).length;\n}\n","export type StudioRunLease = {\n readonly abortSignal: AbortSignal;\n finish(): void;\n};\n\nexport class StudioRunLifecycle {\n private readonly shutdownController = new AbortController();\n private readonly active = new Set<symbol>();\n private drainPromise: Promise<void> | undefined;\n private resolveDrain: (() => void) | undefined;\n private closed = false;\n\n start(requestSignal: AbortSignal): StudioRunLease | undefined {\n if (this.closed) return undefined;\n\n const token = Symbol(\"studio-run\");\n this.active.add(token);\n let finished = false;\n return {\n abortSignal: AbortSignal.any([requestSignal, this.shutdownController.signal]),\n finish: () => {\n if (finished) return;\n finished = true;\n this.active.delete(token);\n if (this.active.size === 0) {\n this.resolveDrain?.();\n this.resolveDrain = undefined;\n this.drainPromise = undefined;\n }\n },\n };\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.shutdownController.abort(new Error(\"Anvia Studio is shutting down.\"));\n }\n\n async drain(timeoutMs: number): Promise<void> {\n this.close();\n if (this.active.size === 0) return;\n\n this.drainPromise ??= new Promise<void>((resolve) => {\n this.resolveDrain = resolve;\n });\n await withTimeout(this.drainPromise, timeoutMs);\n }\n}\n\nasync function withTimeout(promise: Promise<void>, timeoutMs: number): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Anvia Studio shutdown timed out after ${timeoutMs}ms.`)),\n timeoutMs,\n );\n });\n try {\n await Promise.race([promise, timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n","import { upgradeWebSocket } from \"@hono/node-server\";\nimport { getConnInfo } from \"@hono/node-server/conninfo\";\nimport type { Context, Hono } from \"hono\";\nimport type { WSContext, WSEvents } from \"hono/ws\";\nimport { WebSocket } from \"ws\";\nimport type {\n StudioSandboxViewConnection,\n StudioSandboxViewControlLease,\n StudioSandboxViewRegistration,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport type { StudioSandboxRegistry, StudioSandboxRegistryEntry } from \"./sandboxes\";\n\nconst minLeaseTimeoutMs = 5_000;\nconst maxLeaseTimeoutMs = 120_000;\nconst maxPendingWebSocketBytes = 1024 * 1024;\n\ntype ResolvedView = {\n entry: StudioSandboxRegistryEntry;\n view: StudioSandboxViewRegistration;\n host: string;\n port: number;\n};\n\nexport function registerSandboxViewRoutes(app: Hono, registry: StudioSandboxRegistry): () => void {\n const leases = new Map<string, StudioSandboxViewControlLease>();\n const upstreamSockets = new Set<WebSocket>();\n\n app.get(\"/sandboxes/:sandboxRef/views/:viewId/control\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n pruneExpiredLease(leases, viewKey(resolved));\n return c.json(resolved.view.source.control.snapshot());\n });\n\n app.get(\"/sandboxes/:sandboxRef/views/:viewId/connection\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const response: StudioSandboxViewConnection = {\n sandboxRef: resolved.entry.summary.ref,\n viewId: resolved.view.id,\n protocol: \"novnc\",\n websocketPath: `/sandboxes/${encodeURIComponent(resolved.entry.summary.ref)}/views/${encodeURIComponent(resolved.view.id)}/ws`,\n authentication:\n resolved.view.authentication.type === \"password\"\n ? { type: \"password\", password: resolved.view.authentication.password }\n : { type: \"none\" },\n };\n c.header(\"cache-control\", \"no-store\");\n return c.json(response);\n });\n\n app.post(\"/sandboxes/:sandboxRef/views/:viewId/control/acquire\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const body = await readControlBody(c);\n if (body instanceof Response) return body;\n const key = viewKey(resolved);\n pruneExpiredLease(leases, key);\n if (leases.has(key)) {\n return errorResponse(c, 409, \"conflict\", \"Browser view is already controlled\");\n }\n try {\n const lease = await resolved.view.source.control.acquireHumanControl({\n ownerId: body.ownerId,\n leaseTimeoutMs: body.leaseTimeoutMs,\n abortSignal: c.req.raw.signal,\n });\n leases.set(key, lease);\n return c.json(leaseResponse(lease), 201);\n } catch (error) {\n return controlErrorResponse(c, error);\n }\n });\n\n app.post(\"/sandboxes/:sandboxRef/views/:viewId/control/renew\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const body = await readLeaseBody(c);\n if (body instanceof Response) return body;\n const key = viewKey(resolved);\n pruneExpiredLease(leases, key);\n const lease = leases.get(key);\n if (lease === undefined || lease.id !== body.leaseId) {\n return errorResponse(c, 409, \"conflict\", \"Browser control lease is not active\");\n }\n try {\n lease.renew({ leaseTimeoutMs: body.leaseTimeoutMs });\n return c.json(leaseResponse(lease));\n } catch (error) {\n leases.delete(key);\n return controlErrorResponse(c, error);\n }\n });\n\n app.post(\"/sandboxes/:sandboxRef/views/:viewId/control/release\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const body = await readReleaseBody(c);\n if (body instanceof Response) return body;\n const key = viewKey(resolved);\n const lease = leases.get(key);\n if (lease === undefined || lease.id !== body.leaseId) {\n return errorResponse(c, 409, \"conflict\", \"Browser control lease is not active\");\n }\n lease.release();\n leases.delete(key);\n return c.json({ released: true });\n });\n\n app.get(\"/sandboxes/:sandboxRef/views/:viewId/ws\", async (c) => {\n const resolved = await authorizedView(c, registry);\n if (resolved instanceof Response) return resolved;\n const upstreamUrl = `ws://${hostForUrl(resolved.host)}:${resolved.port}/websockify`;\n return upgradeWebSocket(c, createProxyEvents(upstreamUrl, upstreamSockets), {\n onError: () => undefined,\n });\n });\n\n return () => {\n for (const lease of leases.values()) lease.release();\n leases.clear();\n for (const socket of upstreamSockets) socket.close(1001, \"Studio closed\");\n upstreamSockets.clear();\n };\n}\n\nfunction createProxyEvents(upstreamUrl: string, sockets: Set<WebSocket>): WSEvents {\n let upstream: WebSocket | undefined;\n let pendingBytes = 0;\n const pending: Array<string | Uint8Array> = [];\n return {\n onOpen(_event: Event, downstream: WSContext) {\n const protocols =\n downstream.protocol === null || downstream.protocol.length === 0\n ? undefined\n : [downstream.protocol];\n upstream = new WebSocket(upstreamUrl, protocols, {\n headers: { origin: \"http://127.0.0.1\" },\n });\n sockets.add(upstream);\n upstream.binaryType = \"arraybuffer\";\n upstream.once(\"open\", () => {\n for (const message of pending) upstream?.send(message);\n pending.length = 0;\n pendingBytes = 0;\n });\n upstream.on(\"message\", (data, isBinary) => {\n const value = isBinary ? Uint8Array.from(Buffer.from(data as never)) : data.toString();\n downstream.send(value);\n });\n upstream.once(\"close\", (code, reason) => {\n sockets.delete(upstream as WebSocket);\n downstream.close(normalizeCloseCode(code), reason.toString(\"utf8\").slice(0, 123));\n });\n upstream.once(\"error\", () => downstream.close(1011, \"noVNC upstream failed\"));\n },\n onMessage(event, downstream) {\n void normalizeWebSocketMessage(event.data)\n .then((message) => {\n if (upstream?.readyState === WebSocket.OPEN) {\n upstream.send(message);\n return;\n }\n pendingBytes +=\n typeof message === \"string\" ? Buffer.byteLength(message) : message.byteLength;\n if (pendingBytes > maxPendingWebSocketBytes) {\n downstream.close(1009, \"Pending noVNC messages exceeded the limit\");\n return;\n }\n pending.push(message);\n })\n .catch(() => downstream.close(1003, \"Unsupported noVNC message\"));\n },\n onClose() {\n upstream?.close(1000, \"Viewer disconnected\");\n if (upstream !== undefined) sockets.delete(upstream);\n },\n onError() {\n upstream?.close(1011, \"Viewer connection failed\");\n },\n };\n}\n\nasync function authorizedView(\n c: Context,\n registry: StudioSandboxRegistry,\n): Promise<ResolvedView | Response> {\n const entry = registry.get(c.req.param(\"sandboxRef\") ?? \"\");\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n const view = entry.views.get(c.req.param(\"viewId\") ?? \"\");\n if (view === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox view not found\");\n if (!(await authorize(c, entry, view))) {\n return errorResponse(c, 403, \"forbidden\", \"Sandbox view access denied\");\n }\n const published = entry.inspector.publishedPorts?.find(\n (port) =>\n port.containerPort === view.source.containerPort &&\n port.protocol === \"tcp\" &&\n isLoopbackAddress(port.host),\n );\n if (published === undefined) {\n return errorResponse(c, 503, \"internal_error\", \"Sandbox view port is unavailable\");\n }\n return { entry, view, host: published.host, port: published.hostPort };\n}\n\nasync function authorize(\n c: Context,\n entry: StudioSandboxRegistryEntry,\n view: StudioSandboxViewRegistration,\n): Promise<boolean> {\n if (view.access.mode === \"authorize\") {\n try {\n return (\n (await view.access.authorize({\n request: c.req.raw,\n sandboxRef: entry.summary.ref,\n viewId: view.id,\n })) === true\n );\n } catch {\n return false;\n }\n }\n let remoteAddress: string;\n try {\n const address = getConnInfo(c).remote.address;\n if (address === undefined) return false;\n remoteAddress = address;\n } catch {\n return false;\n }\n if (!isLoopbackAddress(remoteAddress)) return false;\n const expectedOrigin = new URL(c.req.url).origin;\n const origin = c.req.header(\"origin\");\n return (\n origin === expectedOrigin ||\n (origin === undefined && c.req.header(\"sec-fetch-site\") === \"same-origin\")\n );\n}\n\nasync function readControlBody(\n c: Context,\n): Promise<{ ownerId: string; leaseTimeoutMs: number } | Response> {\n const body = await readJsonObject(c);\n if (body instanceof Response) return body;\n if (typeof body.ownerId !== \"string\" || body.ownerId.length === 0 || body.ownerId.length > 200) {\n return errorResponse(c, 400, \"bad_request\", \"ownerId must be a non-empty string\");\n }\n if (!isLeaseTimeout(body.leaseTimeoutMs)) {\n return errorResponse(c, 400, \"bad_request\", \"leaseTimeoutMs is outside the allowed range\");\n }\n return { ownerId: body.ownerId, leaseTimeoutMs: body.leaseTimeoutMs };\n}\n\nasync function readLeaseBody(\n c: Context,\n): Promise<{ leaseId: string; leaseTimeoutMs: number } | Response> {\n const body = await readJsonObject(c);\n if (body instanceof Response) return body;\n if (typeof body.leaseId !== \"string\" || body.leaseId.length === 0) {\n return errorResponse(c, 400, \"bad_request\", \"leaseId must be a non-empty string\");\n }\n if (!isLeaseTimeout(body.leaseTimeoutMs)) {\n return errorResponse(c, 400, \"bad_request\", \"leaseTimeoutMs is outside the allowed range\");\n }\n return { leaseId: body.leaseId, leaseTimeoutMs: body.leaseTimeoutMs };\n}\n\nasync function readReleaseBody(c: Context): Promise<{ leaseId: string } | Response> {\n const body = await readJsonObject(c);\n if (body instanceof Response) return body;\n if (typeof body.leaseId !== \"string\" || body.leaseId.length === 0) {\n return errorResponse(c, 400, \"bad_request\", \"leaseId must be a non-empty string\");\n }\n return { leaseId: body.leaseId };\n}\n\nasync function readJsonObject(c: Context): Promise<Record<string, unknown> | Response> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return errorResponse(c, 400, \"bad_request\", \"Request body must be valid JSON\");\n }\n return isRecord(body)\n ? body\n : errorResponse(c, 400, \"bad_request\", \"Request body must be an object\");\n}\n\nfunction controlErrorResponse(c: Context, error: unknown): Response {\n if (isRecord(error) && error.code === \"human_controlled\") {\n return errorResponse(c, 409, \"conflict\", \"Browser view is already controlled\");\n }\n if (isRecord(error) && error.code === \"invalid_state\") {\n return errorResponse(c, 409, \"conflict\", \"Browser control lease is no longer active\");\n }\n return errorResponse(c, 500, \"internal_error\", \"Browser control operation failed\");\n}\n\nfunction leaseResponse(lease: StudioSandboxViewControlLease) {\n return { id: lease.id, ownerId: lease.ownerId, expiresAt: lease.expiresAt };\n}\n\nfunction pruneExpiredLease(leases: Map<string, StudioSandboxViewControlLease>, key: string): void {\n const lease = leases.get(key);\n if (lease !== undefined && Date.parse(lease.expiresAt) <= Date.now()) {\n lease.release();\n leases.delete(key);\n }\n}\n\nfunction viewKey(resolved: ResolvedView): string {\n return `${resolved.entry.summary.ref}\\0${resolved.view.id}`;\n}\n\nfunction isLeaseTimeout(value: unknown): value is number {\n return (\n Number.isSafeInteger(value) &&\n Number(value) >= minLeaseTimeoutMs &&\n Number(value) <= maxLeaseTimeoutMs\n );\n}\n\nfunction isLoopbackAddress(value: string): boolean {\n return (\n value === \"localhost\" ||\n value === \"127.0.0.1\" ||\n value === \"::1\" ||\n value.startsWith(\"127.\") ||\n value.startsWith(\"::ffff:127.\")\n );\n}\n\nfunction hostForUrl(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\n\nasync function normalizeWebSocketMessage(\n value: unknown,\n): Promise<string | Uint8Array<ArrayBuffer>> {\n if (typeof value === \"string\") return value;\n if (value instanceof ArrayBuffer) return Uint8Array.from(new Uint8Array(value));\n if (ArrayBuffer.isView(value)) {\n return Uint8Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n }\n if (value instanceof Blob) return Uint8Array.from(new Uint8Array(await value.arrayBuffer()));\n throw new TypeError(\"Unsupported noVNC WebSocket message type.\");\n}\n\nfunction normalizeCloseCode(code: number): number {\n return code >= 1000 && code <= 4999 && code !== 1004 && code !== 1005 && code !== 1006\n ? code\n : 1001;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import path from \"node:path\";\nimport type { Context, Hono, Next } from \"hono\";\nimport type {\n StudioAgent,\n StudioErrorCode,\n StudioSandboxFileEntry,\n StudioSandboxFileType,\n StudioSandboxInspector,\n StudioSandboxProcess,\n StudioSandboxProcessLogsResponse,\n StudioSandboxProcessStatus,\n StudioSandboxRegistration,\n StudioSandboxSummary,\n StudioSandboxViewRegistration,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\n\nconst maxFileResponseBytes = 10 * 1024 * 1024;\nconst defaultProcessLogBytes = 64 * 1024;\nconst maxProcessLogBytes = 1024 * 1024;\n\nexport type StudioSandboxRegistryEntry = {\n inspector: StudioSandboxInspector;\n summary: StudioSandboxSummary;\n views: ReadonlyMap<string, StudioSandboxViewRegistration>;\n};\n\nexport class StudioSandboxRegistry {\n private readonly entries: Map<string, StudioSandboxRegistryEntry>;\n\n constructor(entries: StudioSandboxRegistryEntry[]) {\n this.entries = new Map(entries.map((entry) => [entry.summary.ref, entry]));\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n list(): StudioSandboxSummary[] {\n return [...this.entries.values()].map((entry) => copySummary(entry.summary));\n }\n\n get(ref: string): StudioSandboxRegistryEntry | undefined {\n return this.entries.get(ref);\n }\n}\n\nexport function createStudioSandboxRegistry(\n agents: StudioAgent[],\n registrations: readonly StudioSandboxRegistration[],\n): StudioSandboxRegistry {\n const agentIds = new Set(agents.map((agent) => agent.id));\n const refs = new Set<string>();\n const entries = registrations.map((registration, index): StudioSandboxRegistryEntry => {\n validateRegistration(registration, index, agentIds);\n const inspector = registration.inspector;\n const ref = sandboxRef(inspector.provider, inspector.id);\n if (refs.has(ref)) {\n throw new TypeError(\n `sandboxes contains a duplicate provider/id registration: ${inspector.provider}/${inspector.id}`,\n );\n }\n refs.add(ref);\n const views = new Map((registration.views ?? []).map((view) => [view.id, view]));\n return {\n inspector,\n views,\n summary: {\n ref,\n id: inspector.id,\n provider: inspector.provider,\n workdir: inspector.workdir,\n agentIds: sortedUnique(registration.agentIds ?? []),\n toolNames: sortedUnique(registration.toolNames ?? []),\n views: [...views.values()]\n .map((view) => ({ id: view.id, label: view.label, protocol: view.source.protocol }))\n .sort((left, right) => left.id.localeCompare(right.id)),\n capabilities: {\n files: supportsFiles(inspector),\n ports: supportsPorts(inspector),\n processes: supportsProcesses(inspector),\n views: views.size > 0,\n },\n },\n };\n });\n entries.sort((left, right) => left.summary.ref.localeCompare(right.summary.ref));\n return new StudioSandboxRegistry(entries);\n}\n\nexport function registerSandboxRoutes(app: Hono, registry: StudioSandboxRegistry): void {\n app.use(\"/sandboxes\", sandboxNoStore);\n app.use(\"/sandboxes/*\", sandboxNoStore);\n\n app.get(\"/sandboxes\", (c) => c.json({ sandboxes: registry.list() }));\n\n app.get(\"/sandboxes/:sandboxRef\", (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n return entry === undefined\n ? errorResponse(c, 404, \"not_found\", \"Sandbox not found\")\n : c.json(copySummary(entry.summary));\n });\n\n app.get(\"/sandboxes/:sandboxRef/files\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsFiles(entry.inspector)) return unsupportedSandboxOperation(c, \"files\");\n try {\n const requestedPath = c.req.query(\"path\") ?? \".\";\n const normalizedPath = normalizeSandboxPath(requestedPath, true);\n return c.json({\n sandboxRef: entry.summary.ref,\n path: normalizedPath,\n entries: await listSandboxFiles(entry.inspector, normalizedPath, c.req.raw.signal),\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/files/content\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsFiles(entry.inspector)) return unsupportedSandboxOperation(c, \"files.content\");\n try {\n const requestedPath = c.req.query(\"path\");\n if (requestedPath === undefined) {\n throw new SandboxRouteError(400, \"bad_request\", \"path query parameter is required\");\n }\n const download = c.req.query(\"download\");\n if (download !== undefined && download !== \"1\") {\n throw new SandboxRouteError(400, \"bad_request\", \"download must be 1 when provided\");\n }\n const normalizedPath = normalizeSandboxPath(requestedPath, false);\n const siblings = await listSandboxFiles(\n entry.inspector,\n path.posix.dirname(normalizedPath),\n c.req.raw.signal,\n );\n const file = siblings.find((candidate) => candidate.path === normalizedPath);\n if (file === undefined) {\n throw new SandboxRouteError(404, \"not_found\", \"Sandbox file not found\");\n }\n if (file.type !== \"file\") {\n throw new SandboxRouteError(\n 400,\n \"bad_request\",\n \"Sandbox content path must refer to a regular file\",\n );\n }\n if (file.size !== undefined && file.size > maxFileResponseBytes)\n throw fileTooLarge(file.size);\n const rawBytes = await entry.inspector.readFile({\n path: normalizedPath,\n abortSignal: c.req.raw.signal,\n });\n if (!(rawBytes instanceof Uint8Array)) {\n throw new TypeError(\"Sandbox readFile returned an invalid byte payload\");\n }\n if (rawBytes.byteLength > maxFileResponseBytes) throw fileTooLarge(rawBytes.byteLength);\n const bytes = rawBytes.slice();\n const disposition = download === \"1\" ? \"attachment\" : \"inline\";\n const filename = encodeURIComponent(path.posix.basename(normalizedPath));\n return new Response(bytes, {\n headers: {\n \"cache-control\": \"no-store\",\n \"content-disposition\": `${disposition}; filename*=UTF-8''${filename}`,\n \"content-length\": `${bytes.byteLength}`,\n \"content-type\": \"application/octet-stream\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/ports\", (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsPorts(entry.inspector)) return unsupportedSandboxOperation(c, \"ports\");\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n ports: normalizePorts(entry.inspector.publishedPorts),\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/processes\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsProcesses(entry.inspector)) {\n return unsupportedSandboxOperation(c, \"processes\");\n }\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n processes: normalizeProcesses(\n await entry.inspector.listProcesses({ abortSignal: c.req.raw.signal }),\n ),\n });\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n\n app.get(\"/sandboxes/:sandboxRef/processes/:processId/logs\", async (c) => {\n const entry = registry.get(c.req.param(\"sandboxRef\"));\n if (entry === undefined) return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n if (!supportsProcesses(entry.inspector)) {\n return unsupportedSandboxOperation(c, \"processes.logs\");\n }\n try {\n const tailBytes = parseTailBytes(c.req.query(\"tailBytes\"));\n const processId = c.req.param(\"processId\");\n const processes = normalizeProcesses(\n await entry.inspector.listProcesses({ abortSignal: c.req.raw.signal }),\n );\n if (!processes.some((process) => process.id === processId)) {\n throw new SandboxRouteError(404, \"not_found\", \"Sandbox process not found\");\n }\n const logs = normalizeProcessLogs(\n await entry.inspector.readProcessLogs({\n processId,\n tailBytes,\n abortSignal: c.req.raw.signal,\n }),\n tailBytes,\n );\n return c.json({\n sandboxRef: entry.summary.ref,\n processId,\n ...logs,\n } satisfies StudioSandboxProcessLogsResponse);\n } catch (error) {\n return sandboxErrorResponse(c, error);\n }\n });\n}\n\nasync function sandboxNoStore(c: Context, next: Next): Promise<void> {\n c.header(\"cache-control\", \"no-store\");\n await next();\n}\n\nfunction validateRegistration(\n registration: StudioSandboxRegistration,\n index: number,\n knownAgentIds: Set<string>,\n): void {\n if (!isRecord(registration) || !isInspector(registration.inspector)) {\n throw new TypeError(`sandboxes[${index}] must contain a valid inspector.`);\n }\n const inspector = registration.inspector;\n const files = supportsFiles(inspector);\n if ((inspector.listFiles === undefined) !== (inspector.readFile === undefined)) {\n throw new TypeError(`sandboxes[${index}] must register both file inspector methods.`);\n }\n const processes = supportsProcesses(inspector);\n if ((inspector.listProcesses === undefined) !== (inspector.readProcessLogs === undefined)) {\n throw new TypeError(`sandboxes[${index}] must register both process inspector methods.`);\n }\n if (!files && !supportsPorts(inspector) && !processes) {\n throw new TypeError(`sandboxes[${index}] inspector exposes no capabilities.`);\n }\n for (const agentId of sortedUnique(registration.agentIds ?? [])) {\n if (!knownAgentIds.has(agentId)) {\n throw new TypeError(`sandboxes[${index}] references an unknown agent: ${agentId}`);\n }\n }\n sortedUnique(registration.toolNames ?? []);\n validateViews(registration.views, inspector, index);\n}\n\nfunction validateViews(\n views: readonly StudioSandboxViewRegistration[] | undefined,\n inspector: StudioSandboxInspector,\n registrationIndex: number,\n): void {\n if (views === undefined) return;\n if (!Array.isArray(views))\n throw new TypeError(`sandboxes[${registrationIndex}].views must be an array.`);\n if (!supportsPorts(inspector)) {\n throw new TypeError(`sandboxes[${registrationIndex}] views require published port inspection.`);\n }\n const ids = new Set<string>();\n for (const [viewIndex, view] of views.entries()) {\n const prefix = `sandboxes[${registrationIndex}].views[${viewIndex}]`;\n const candidate: unknown = view;\n if (\n !isRecord(candidate) ||\n typeof candidate.id !== \"string\" ||\n !/^[a-z0-9](?:[a-z0-9_-]{0,62})$/.test(candidate.id)\n ) {\n throw new TypeError(`${prefix}.id must be a stable lowercase identifier.`);\n }\n if (ids.has(candidate.id)) throw new TypeError(`${prefix}.id is duplicated: ${candidate.id}`);\n ids.add(candidate.id);\n if (typeof candidate.label !== \"string\" || candidate.label.length === 0) {\n throw new TypeError(`${prefix}.label must be a non-empty string.`);\n }\n const source = candidate.source;\n if (\n !isRecord(source) ||\n source.protocol !== \"novnc\" ||\n !isPort(source.containerPort) ||\n !isRecord(source.control) ||\n typeof source.control.snapshot !== \"function\" ||\n typeof source.control.acquireHumanControl !== \"function\"\n ) {\n throw new TypeError(`${prefix}.source must be a valid noVNC view source.`);\n }\n const port = inspector.publishedPorts?.find(\n (candidate) =>\n candidate.containerPort === source.containerPort && candidate.protocol === \"tcp\",\n );\n if (port === undefined || !isLoopbackHost(port.host)) {\n throw new TypeError(`${prefix}.source must resolve to a loopback-published TCP port.`);\n }\n const access = candidate.access;\n if (!isRecord(access) || (access.mode !== \"local\" && access.mode !== \"authorize\")) {\n throw new TypeError(`${prefix}.access must explicitly select local or authorize mode.`);\n }\n if (access.mode === \"authorize\" && typeof access.authorize !== \"function\") {\n throw new TypeError(`${prefix}.access.authorize must be a function.`);\n }\n const authentication = candidate.authentication;\n if (\n !isRecord(authentication) ||\n (authentication.type !== \"none\" && authentication.type !== \"password\")\n ) {\n throw new TypeError(`${prefix}.authentication must explicitly select none or password.`);\n }\n if (\n authentication.type === \"password\" &&\n (typeof authentication.password !== \"string\" || authentication.password.length === 0)\n ) {\n throw new TypeError(`${prefix}.authentication.password must be a non-empty string.`);\n }\n }\n}\n\nfunction isInspector(value: unknown): value is StudioSandboxInspector {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n typeof value.provider === \"string\" &&\n value.provider.length > 0 &&\n typeof value.workdir === \"string\" &&\n value.workdir.length > 0\n );\n}\n\nfunction supportsFiles(\n inspector: StudioSandboxInspector,\n): inspector is StudioSandboxInspector &\n Required<Pick<StudioSandboxInspector, \"listFiles\" | \"readFile\">> {\n return typeof inspector.listFiles === \"function\" && typeof inspector.readFile === \"function\";\n}\n\nfunction supportsPorts(inspector: StudioSandboxInspector): boolean {\n return Array.isArray(inspector.publishedPorts);\n}\n\nfunction supportsProcesses(\n inspector: StudioSandboxInspector,\n): inspector is StudioSandboxInspector &\n Required<Pick<StudioSandboxInspector, \"listProcesses\" | \"readProcessLogs\">> {\n return (\n typeof inspector.listProcesses === \"function\" && typeof inspector.readProcessLogs === \"function\"\n );\n}\n\nfunction sandboxRef(provider: string, id: string): string {\n return Buffer.from(JSON.stringify([provider, id]), \"utf8\").toString(\"base64url\");\n}\n\nfunction copySummary(summary: StudioSandboxSummary): StudioSandboxSummary {\n return {\n ...summary,\n agentIds: [...summary.agentIds],\n toolNames: [...summary.toolNames],\n views: summary.views.map((view) => ({ ...view })),\n capabilities: { ...summary.capabilities },\n };\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"127.0.0.1\" || host === \"::1\" || host === \"localhost\";\n}\n\nasync function listSandboxFiles(\n inspector: StudioSandboxInspector &\n Required<Pick<StudioSandboxInspector, \"listFiles\" | \"readFile\">>,\n filePath: string,\n abortSignal: AbortSignal,\n): Promise<StudioSandboxFileEntry[]> {\n return normalizeFileEntries(await inspector.listFiles({ path: filePath, abortSignal })).sort(\n (left, right) => {\n if (left.type === \"directory\" && right.type !== \"directory\") return -1;\n if (left.type !== \"directory\" && right.type === \"directory\") return 1;\n return left.path.localeCompare(right.path);\n },\n );\n}\n\nfunction normalizeFileEntries(value: unknown): StudioSandboxFileEntry[] {\n if (!Array.isArray(value)) throw new TypeError(\"Sandbox listFiles returned an invalid payload\");\n return value.map((item) => {\n if (!isRecord(item) || typeof item.path !== \"string\" || !isFileType(item.type)) {\n throw new TypeError(\"Sandbox listFiles returned an invalid entry\");\n }\n let entryPath: string;\n try {\n entryPath = normalizeSandboxPath(item.path, false);\n } catch {\n throw new TypeError(\"Sandbox listFiles returned an invalid entry path\");\n }\n const entry: StudioSandboxFileEntry = { path: entryPath, type: item.type };\n if (item.size !== undefined) {\n if (!Number.isSafeInteger(item.size) || Number(item.size) < 0) {\n throw new TypeError(\"Sandbox listFiles returned an invalid file size\");\n }\n entry.size = item.size as number;\n }\n return entry;\n });\n}\n\nfunction normalizePorts(value: unknown) {\n if (!Array.isArray(value))\n throw new TypeError(\"Sandbox publishedPorts returned an invalid payload\");\n return value.map((item) => {\n if (\n !isRecord(item) ||\n !isPort(item.containerPort) ||\n typeof item.host !== \"string\" ||\n !isPort(item.hostPort) ||\n typeof item.protocol !== \"string\"\n ) {\n throw new TypeError(\"Sandbox publishedPorts returned an invalid entry\");\n }\n return {\n containerPort: item.containerPort,\n host: item.host,\n hostPort: item.hostPort,\n protocol: item.protocol,\n };\n });\n}\n\nfunction normalizeProcesses(value: unknown): StudioSandboxProcess[] {\n if (!Array.isArray(value))\n throw new TypeError(\"Sandbox listProcesses returned an invalid payload\");\n return value.map((item) => {\n if (\n !isRecord(item) ||\n typeof item.id !== \"string\" ||\n typeof item.command !== \"string\" ||\n !Array.isArray(item.args) ||\n !item.args.every((arg) => typeof arg === \"string\") ||\n !isProcessStatus(item.status) ||\n typeof item.startedAt !== \"string\"\n ) {\n throw new TypeError(\"Sandbox listProcesses returned an invalid entry\");\n }\n const process: StudioSandboxProcess = {\n id: item.id,\n command: item.command,\n args: [...item.args],\n status: item.status,\n startedAt: item.startedAt,\n };\n if (typeof item.cwd === \"string\") process.cwd = item.cwd;\n if (typeof item.exitCode === \"number\") process.exitCode = item.exitCode;\n if (typeof item.endedAt === \"string\") process.endedAt = item.endedAt;\n return process;\n });\n}\n\nfunction normalizeProcessLogs(\n value: unknown,\n maxBytes: number,\n): Omit<StudioSandboxProcessLogsResponse, \"sandboxRef\" | \"processId\"> {\n if (\n !isRecord(value) ||\n !(value.stdout instanceof Uint8Array) ||\n !(value.stderr instanceof Uint8Array) ||\n typeof value.stdoutTruncated !== \"boolean\" ||\n typeof value.stderrTruncated !== \"boolean\"\n ) {\n throw new TypeError(\"Sandbox readProcessLogs returned an invalid payload\");\n }\n const stdout = boundedLogBytes(value.stdout, maxBytes);\n const stderr = boundedLogBytes(value.stderr, maxBytes);\n return {\n stdout: stdout.text,\n stderr: stderr.text,\n stdoutTruncated: value.stdoutTruncated || stdout.truncated,\n stderrTruncated: value.stderrTruncated || stderr.truncated,\n };\n}\n\nfunction boundedLogBytes(\n value: Uint8Array,\n maxBytes: number,\n): { text: string; truncated: boolean } {\n if (maxBytes === 0) return { text: \"\", truncated: value.byteLength > 0 };\n let start = Math.max(0, value.byteLength - maxBytes);\n while (start < value.byteLength && ((value[start] ?? 0) & 0xc0) === 0x80) start += 1;\n return {\n text: new TextDecoder(\"utf-8\", { fatal: true }).decode(value.subarray(start)),\n truncated: start > 0,\n };\n}\n\nfunction normalizeSandboxPath(input: string, allowRoot: boolean): string {\n if (input.length === 0) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path cannot be empty\");\n }\n if (input.includes(\"\\0\")) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path cannot contain null bytes\");\n }\n const normalized = path.posix.normalize(input.replaceAll(\"\\\\\", \"/\"));\n if (path.posix.isAbsolute(normalized)) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path must be relative\");\n }\n if (normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path cannot leave the workspace\");\n }\n if (normalized === \".\" && !allowRoot) {\n throw new SandboxRouteError(400, \"bad_request\", \"Sandbox path must refer to a file\");\n }\n return normalized;\n}\n\nfunction parseTailBytes(value: string | undefined): number {\n if (value === undefined) return defaultProcessLogBytes;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed > maxProcessLogBytes) {\n throw new SandboxRouteError(\n 400,\n \"bad_request\",\n `tailBytes must be an integer from 0 through ${maxProcessLogBytes}`,\n );\n }\n return parsed;\n}\n\nfunction unsupportedSandboxOperation(c: Context, operation: string): Response {\n return errorResponse(c, 501, \"unsupported_capability\", `Sandbox does not support ${operation}`, {\n capability: \"sandboxes\",\n operation,\n });\n}\n\nfunction sandboxErrorResponse(c: Context, error: unknown): Response {\n if (error instanceof SandboxRouteError) {\n return errorResponse(c, error.status, error.code, error.message);\n }\n const code = errorCode(error);\n if (code === \"invalid_path\") return errorResponse(c, 400, \"bad_request\", errorMessage(error));\n if (code === \"file_too_large\") {\n return errorResponse(c, 413, \"payload_too_large\", errorMessage(error));\n }\n if (code === \"invalid_state\" || code === \"sandbox_not_found\") {\n return errorResponse(c, 409, \"conflict\", \"Sandbox is no longer available\");\n }\n return errorResponse(\n c,\n 500,\n \"internal_error\",\n \"Sandbox inspection failed\",\n serializeError(error),\n );\n}\n\nfunction fileTooLarge(size: number): SandboxRouteError {\n return new SandboxRouteError(\n 413,\n \"payload_too_large\",\n `Sandbox file exceeds the ${maxFileResponseBytes}-byte response limit (${size} bytes)`,\n );\n}\n\nclass SandboxRouteError extends Error {\n constructor(\n readonly status: 400 | 404 | 409 | 413 | 500 | 501,\n readonly code: StudioErrorCode,\n message: string,\n ) {\n super(message);\n }\n}\n\nfunction sortedUnique(values: readonly string[]): string[] {\n if (!Array.isArray(values)) throw new TypeError(\"Sandbox associations must be arrays.\");\n const result = new Set<string>();\n for (const value of values as readonly unknown[]) {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(\"Sandbox associations must contain non-empty strings.\");\n }\n if (result.has(value)) throw new TypeError(`Sandbox association is duplicated: ${value}`);\n result.add(value);\n }\n return [...result].sort();\n}\n\nfunction isFileType(value: unknown): value is StudioSandboxFileType {\n return value === \"file\" || value === \"directory\" || value === \"symlink\" || value === \"other\";\n}\n\nfunction isProcessStatus(value: unknown): value is StudioSandboxProcessStatus {\n return value === \"running\" || value === \"exited\" || value === \"stopped\";\n}\n\nfunction isPort(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) >= 1 && Number(value) <= 65_535;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return isRecord(error) && typeof error.code === \"string\" ? error.code : undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n return isRecord(error) && typeof error.message === \"string\" ? error.message : \"Sandbox failed\";\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport { optionalQueryString, parseAfter, parseLimit } from \"./query\";\nimport { appendSessionLog, sessionCreatedLog } from \"./session-logs\";\nimport { isJsonObject, isObject } from \"./type-guards\";\n\nexport function registerSessionRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n sessionStore: StudioSessionStore;\n traceStore?: StudioTraceStore;\n },\n): void {\n app.get(\"/sessions\", async (c) => {\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n if (agentId !== undefined && !props.agentMap.has(agentId)) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const listInput: Parameters<typeof props.sessionStore.listSessions>[0] = { limit };\n if (agentId !== undefined) listInput.agentId = agentId;\n const sessions = await props.sessionStore.listSessions(listInput);\n return c.json({ sessions });\n });\n\n app.post(\"/sessions\", async (c) => {\n const body = await parseCreateSessionRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n if (!props.agentMap.has(body.agentId)) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const createInput: Parameters<typeof props.sessionStore.createSession>[0] = {\n id: globalThis.crypto.randomUUID(),\n agentId: body.agentId,\n };\n if (body.title !== undefined) createInput.title = body.title;\n if (body.metadata !== undefined) createInput.metadata = body.metadata;\n const session = await props.sessionStore.createSession(createInput);\n await appendSessionLog(props.sessionStore, sessionCreatedLog(session));\n return c.json(session, 201);\n });\n\n app.get(\"/sessions/:sessionId\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"sessionId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.json(session);\n });\n\n app.get(\"/sessions/:sessionId/logs\", async (c) => {\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n if (props.sessionStore.listSessionLogs === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.logs\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"logs\" },\n );\n }\n\n const limit = parseLimit(c.req.query(\"limit\"), 200, 1000);\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parseAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const listInput: Parameters<NonNullable<typeof props.sessionStore.listSessionLogs>>[0] = {\n sessionId,\n limit,\n };\n if (after !== undefined) listInput.after = after;\n const logs = await props.sessionStore.listSessionLogs(listInput);\n const last = logs.at(-1);\n const response: { logs: typeof logs; nextCursor?: number } = { logs };\n if (logs.length === limit && last !== undefined) response.nextCursor = last.sequence;\n return c.json(response);\n });\n\n app.delete(\"/sessions/:sessionId\", async (c) => {\n if (props.sessionStore.deleteSession === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.delete\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"delete\" },\n );\n }\n\n const deleted = await props.sessionStore.deleteSession(c.req.param(\"sessionId\"));\n if (!deleted) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.body(null, 204);\n });\n\n app.get(\"/sessions/:sessionId/traces\", async (c) => {\n if (props.traceStore === undefined) {\n return unsupportedCapability(c, \"traces\");\n }\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const traces = await props.traceStore.listSessionTraces({ sessionId, limit });\n return c.json({ traces });\n });\n}\n\nasync function parseCreateSessionRequest(c: Context): Promise<\n | {\n agentId: string;\n title?: string;\n metadata?: JsonObject;\n }\n | { error: Response }\n> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n if (typeof body.agentId !== \"string\" || body.agentId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"agentId must be a string\") };\n }\n\n const request: { agentId: string; title?: string; metadata?: JsonObject } = {\n agentId: body.agentId.trim(),\n };\n if (\"title\" in body) {\n if (typeof body.title !== \"string\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"title must be a string\") };\n }\n const title = body.title.trim();\n if (title.length > 0) {\n request.title = title;\n }\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n","import type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type {\n MemoryAppendOptions,\n MemoryCompactionCapability,\n MemoryCompactionMessage,\n MemoryCompactionReplacePrefixOptions,\n MemoryErrorOptions,\n MemoryScope,\n} from \"@anvia/core/memory\";\nimport { traceSummary } from \"../runtime/trace-summary\";\nimport { renumberTranscript, transcriptFromMessages } from \"../runtime/transcript\";\nimport { isJsonObject, isJsonValue } from \"../runtime/type-guards\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n} from \"../types\";\n\ntype MemorySessionRecord = StudioSessionSummary & {\n messages: Message[];\n compactionState?: StudioCompactionState | undefined;\n storeRevision: number;\n runs: Array<StudioSessionRunTranscriptInput & { createdAt: string; updatedAt: string }>;\n logs: StudioSessionLogEntry[];\n};\n\ntype StudioCompactionState = {\n generation: number;\n summary: MemoryCompactionMessage;\n summarizedThroughPosition: number;\n};\n\nexport function createInMemoryStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n return new InMemoryStudioStore();\n}\n\nclass InMemoryStudioStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"memory\";\n readonly compaction: MemoryCompactionCapability = {\n snapshot: ({ scope }) => {\n const session = this.sessions.get(scope.sessionId);\n const messages = session?.messages ?? [];\n return Promise.resolve({\n revision: String(session?.storeRevision ?? 0),\n messages: projectedMessages(messages, session?.compactionState),\n });\n },\n replacePrefix: (options) => this.replaceCompactionPrefix(options),\n };\n private readonly sessions = new Map<string, MemorySessionRecord>();\n private readonly traces = new Map<string, StudioTrace>();\n private readonly pipelineLogs = new Map<string, StudioPipelineLogEntry[]>();\n private readonly pipelineRuns = new Map<string, StudioPipelineRunRecord>();\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n return [...this.sessions.values()]\n .filter((session) => options.agentId === undefined || session.agentId === options.agentId)\n .sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt))\n .slice(0, options.limit)\n .map(sessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const now = new Date().toISOString();\n const session: MemorySessionRecord = {\n id: input.id,\n agentId: input.agentId,\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n messages: [],\n storeRevision: 0,\n runs: [],\n logs: [],\n };\n if (input.title !== undefined) session.title = input.title;\n if (input.metadata !== undefined) session.metadata = input.metadata;\n this.sessions.set(input.id, session);\n return sessionSummary(session);\n }\n\n getSession(id: string): StudioSession | undefined {\n const session = this.sessions.get(id);\n return session === undefined ? undefined : materializeSession(session);\n }\n\n updateSessionMetadata(id: string, metadata: JsonObject | undefined): StudioSession | undefined {\n const session = this.sessions.get(id);\n if (session === undefined) {\n return undefined;\n }\n if (metadata === undefined) {\n delete session.metadata;\n } else {\n session.metadata = metadata;\n }\n session.updatedAt = new Date().toISOString();\n return materializeSession(session);\n }\n\n load({ scope }: { scope: MemoryScope }): Promise<Message[]> {\n return Promise.resolve(cloneMessages(this.sessions.get(scope.sessionId)?.messages ?? []));\n }\n\n append(input: MemoryAppendOptions): Promise<void> {\n const session = this.sessions.get(input.scope.sessionId);\n if (session !== undefined) {\n session.messages.push(...cloneMessages(input.messages));\n session.storeRevision += 1;\n session.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n clear({ scope }: { scope: MemoryScope }): Promise<void> {\n const session = this.sessions.get(scope.sessionId);\n if (session !== undefined) {\n session.messages = [];\n delete session.compactionState;\n session.storeRevision += 1;\n session.runs = [];\n session.messageCount = 0;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n async recordError(input: MemoryErrorOptions): Promise<void> {\n await this.saveSessionRunTranscript({\n id: input.scope.sessionId,\n runId: studioRunId(input.scope) ?? input.runId,\n transcript: transcriptFromMessages(input.messages),\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n private replaceCompactionPrefix(\n input: MemoryCompactionReplacePrefixOptions,\n ): Promise<{ status: \"committed\" | \"conflict\" }> {\n if (!Number.isSafeInteger(input.messageCount) || input.messageCount < 1) {\n throw new RangeError(\"messageCount must be a positive integer.\");\n }\n const session = this.sessions.get(input.scope.sessionId);\n if (session === undefined || String(session.storeRevision) !== input.revision) {\n return Promise.resolve({ status: \"conflict\" });\n }\n const physicalPrefixCount =\n input.messageCount - (session.compactionState === undefined ? 0 : 1);\n const activeMessageCount =\n session.messages.length - (session.compactionState?.summarizedThroughPosition ?? -1) - 1;\n if (physicalPrefixCount < 0 || physicalPrefixCount > activeMessageCount) {\n return Promise.resolve({ status: \"conflict\" });\n }\n session.compactionState = {\n generation: (session.compactionState?.generation ?? 0) + 1,\n summary: structuredClone(input.replacement),\n summarizedThroughPosition:\n (session.compactionState?.summarizedThroughPosition ?? -1) + physicalPrefixCount,\n };\n session.storeRevision += 1;\n session.updatedAt = new Date().toISOString();\n return Promise.resolve({ status: \"committed\" });\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const session = this.sessions.get(input.id);\n if (session === undefined) {\n return undefined;\n }\n const now = new Date().toISOString();\n const existingIndex = session.runs.findIndex((run) => run.runId === input.runId);\n const run = {\n ...input,\n transcript: renumberTranscript(input.transcript),\n createdAt: existingIndex === -1 ? now : (session.runs[existingIndex]?.createdAt ?? now),\n updatedAt: now,\n };\n if (existingIndex === -1) {\n session.runs.push(run);\n } else {\n session.runs[existingIndex] = run;\n }\n session.updatedAt = now;\n return materializeSession(session);\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const session = this.sessions.get(input.sessionId);\n const logs = session?.logs ?? [];\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n if (session !== undefined) {\n session.logs.push(entry);\n session.updatedAt = entry.timestamp;\n }\n return entry;\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n return (this.sessions.get(options.sessionId)?.logs ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n deleteSession(id: string): boolean {\n for (const trace of this.traces.values()) {\n if (trace.sessionId === id) {\n this.traces.delete(trace.id);\n }\n }\n return this.sessions.delete(id);\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n return [...this.traces.values()]\n .filter((trace) => options.sessionId === undefined || trace.sessionId === options.sessionId)\n .filter((trace) => options.status === undefined || trace.status === options.status)\n .filter((trace) => options.agentId === undefined || traceAgentId(trace) === options.agentId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit)\n .map(traceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n return this.listTraces({ sessionId: options.sessionId, limit: options.limit });\n }\n\n getTrace(id: string): StudioTrace | undefined {\n return this.traces.get(id);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n this.traces.set(trace.id, trace);\n return trace;\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const logs = this.pipelineLogs.get(input.pipelineId) ?? [];\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n this.pipelineLogs.set(input.pipelineId, [...logs, entry]);\n return entry;\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n return (this.pipelineLogs.get(options.pipelineId) ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const record: StudioPipelineRunRecord = {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n startedAt: input.startedAt,\n };\n if (input.output !== undefined) record.output = input.output;\n if (input.error !== undefined) record.error = input.error;\n if (input.metadata !== undefined) record.metadata = input.metadata;\n if (input.endedAt !== undefined) record.endedAt = input.endedAt;\n if (input.durationMs !== undefined) record.durationMs = input.durationMs;\n this.pipelineRuns.set(input.runId, record);\n return record;\n }\n\n getPipelineRun(options: {\n pipelineId: string;\n runId: string;\n }): StudioPipelineRunRecord | undefined {\n const run = this.pipelineRuns.get(options.runId);\n return run?.pipelineId === options.pipelineId ? run : undefined;\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n return [...this.pipelineRuns.values()]\n .filter((run) => run.pipelineId === options.pipelineId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit);\n }\n}\n\nfunction sessionSummary(session: MemorySessionRecord): StudioSessionSummary {\n const summary: StudioSessionSummary = {\n id: session.id,\n agentId: session.agentId,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messages.length,\n };\n if (session.title !== undefined) summary.title = session.title;\n if (session.metadata !== undefined) summary.metadata = session.metadata;\n return summary;\n}\n\nfunction materializeSession(session: MemorySessionRecord): StudioSession {\n return {\n ...sessionSummary(session),\n messages: cloneMessages(session.messages),\n transcript: renumberTranscript(session.runs.flatMap((run) => run.transcript)),\n };\n}\n\nfunction cloneMessages(messages: readonly Message[]): Message[] {\n return structuredClone([...messages]);\n}\n\nfunction traceAgentId(trace: StudioTrace): string | undefined {\n const nestedMetadata = trace.metadata?.metadata;\n return isJsonObject(nestedMetadata) && typeof nestedMetadata.agentId === \"string\"\n ? nestedMetadata.agentId\n : undefined;\n}\n\nfunction studioRunId(scope: MemoryScope): string | undefined {\n const value = scope.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction projectedMessages(\n messages: Message[],\n state: StudioCompactionState | undefined,\n): Message[] {\n if (state === undefined) return cloneMessages(messages);\n return [\n structuredClone(state.summary),\n ...cloneMessages(messages.slice(state.summarizedThroughPosition + 1)),\n ];\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n return isJsonValue(error) ? error : String(error);\n}\n","import { createInMemoryStudioStore } from \"../storage/memory-store\";\nimport type {\n StudioAgent,\n StudioPipeline,\n StudioPipelineLogStore,\n StudioPipelineRunStore,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport function resolveStores(options: StudioRuntimeOptions): ResolvedStores {\n const defaultStore = defaultStudioStore();\n const sessions = resolveSessionStore(options, defaultStore);\n const traces = resolveTraceStore(options, sessions, defaultStore);\n const pipelineLogs = resolvePipelineLogStore(options, sessions, defaultStore);\n const pipelineRuns = resolvePipelineRunStore(options, sessions, pipelineLogs, defaultStore);\n const stores: ResolvedStores = {};\n if (sessions !== undefined) stores.sessions = sessions;\n if (traces !== undefined) stores.traces = traces;\n if (pipelineLogs !== undefined) stores.pipelineLogs = pipelineLogs;\n if (pipelineRuns !== undefined) stores.pipelineRuns = pipelineRuns;\n return stores;\n}\n\nfunction defaultStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n return createInMemoryStudioStore();\n}\n\nfunction resolveSessionStore(\n options: StudioRuntimeOptions,\n defaultStore: StudioSessionStore,\n): StudioSessionStore | undefined {\n if (options.stores?.sessions === false) {\n return undefined;\n }\n if (options.stores?.sessions !== undefined) {\n return options.stores.sessions;\n }\n\n return defaultStore;\n}\n\nfunction resolveTraceStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioTraceStore,\n): StudioTraceStore | undefined {\n if (options.stores?.traces !== undefined) {\n return options.stores.traces;\n }\n if (sessionStore === undefined) {\n return undefined;\n }\n if (isTraceStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineLogStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioPipelineLogStore,\n): StudioPipelineLogStore | undefined {\n if (options.stores?.pipelineLogs === false) {\n return undefined;\n }\n if (options.stores?.pipelineLogs !== undefined) {\n return options.stores.pipelineLogs;\n }\n if (sessionStore !== undefined && isPipelineLogStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineRunStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n pipelineLogStore: StudioPipelineLogStore | undefined,\n defaultStore: StudioPipelineRunStore,\n): StudioPipelineRunStore | undefined {\n if (options.stores?.pipelineRuns === false) {\n return undefined;\n }\n if (options.stores?.pipelineRuns !== undefined) {\n return options.stores.pipelineRuns;\n }\n if (sessionStore !== undefined && isPipelineRunStore(sessionStore)) {\n return sessionStore;\n }\n if (pipelineLogStore !== undefined && isPipelineRunStore(pipelineLogStore)) {\n return pipelineLogStore;\n }\n return defaultStore;\n}\n\nfunction isTraceStore(store: StudioSessionStore): store is StudioSessionStore & StudioTraceStore {\n const candidate = store as Partial<StudioTraceStore>;\n return (\n typeof candidate.listSessionTraces === \"function\" &&\n typeof candidate.getTrace === \"function\" &&\n typeof candidate.saveTrace === \"function\"\n );\n}\n\nfunction isPipelineLogStore(\n store: StudioSessionStore,\n): store is StudioSessionStore & StudioPipelineLogStore {\n const candidate = store as Partial<StudioPipelineLogStore>;\n return (\n typeof candidate.appendPipelineLog === \"function\" &&\n typeof candidate.listPipelineLogs === \"function\"\n );\n}\n\nfunction isPipelineRunStore(store: object): store is object & StudioPipelineRunStore {\n const candidate = store as Partial<StudioPipelineRunStore>;\n return (\n typeof candidate.savePipelineRun === \"function\" &&\n typeof candidate.getPipelineRun === \"function\" &&\n typeof candidate.listPipelineRuns === \"function\"\n );\n}\n\nexport function normalizeAgents(agents: StudioAgent[]): StudioAgent[] {\n const ids = new Set<string>();\n return agents.map((agent) => {\n const id = agent.id.trim();\n if (id.length === 0) {\n throw new Error(\"Studio agent id cannot be empty\");\n }\n if (ids.has(id)) {\n throw new Error(`Duplicate runner agent id: ${id}`);\n }\n ids.add(id);\n return { ...agent, id };\n });\n}\n\nexport function normalizePipelines(pipelines: StudioPipeline[]): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = pipeline.id.trim();\n if (id.length === 0) {\n throw new Error(\"Studio pipeline id cannot be empty\");\n }\n if (ids.has(id)) {\n throw new Error(`Duplicate Studio pipeline id: ${id}`);\n }\n ids.add(id);\n return { ...pipeline, id };\n });\n}\n","import type { Hono } from \"hono\";\nimport type { StudioAgent, StudioPipeline, StudioStatusSummary } from \"../types\";\nimport { capabilityConfig, runnerId } from \"./config\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\n\nexport function registerStatusRoutes(\n app: Hono,\n props: {\n options: StudioRuntimeOptions;\n agents: StudioAgent[];\n pipelines: StudioPipeline[];\n stores: ResolvedStores;\n sandboxCount: number;\n },\n): void {\n app.get(\"/status\", async (c) => {\n const runner: StudioStatusSummary[\"runner\"] = { id: runnerId(props.options) };\n if (props.options.name !== undefined) runner.name = props.options.name;\n if (props.options.version !== undefined) runner.version = props.options.version;\n\n const storage: StudioStatusSummary[\"storage\"] = {};\n if (props.stores.sessions?.kind !== undefined) storage.sessions = props.stores.sessions.kind;\n if (props.stores.traces?.kind !== undefined) storage.traces = props.stores.traces.kind;\n if (props.stores.pipelineLogs !== undefined) storage.pipelineLogs = \"available\";\n if (props.stores.pipelineRuns !== undefined) storage.pipelineRuns = \"available\";\n\n const counts: StudioStatusSummary[\"counts\"] = {\n agents: props.agents.length,\n pipelines: props.pipelines.length,\n };\n if (props.sandboxCount > 0) counts.sandboxes = props.sandboxCount;\n if (props.stores.sessions !== undefined) {\n counts.sessions = (await props.stores.sessions.listSessions({ limit: 100 })).length;\n }\n if (props.stores.traces?.listTraces !== undefined) {\n counts.traces = (await props.stores.traces.listTraces({ limit: 100 })).length;\n }\n if (props.stores.pipelineRuns !== undefined && props.pipelines.length > 0) {\n counts.pipelineRuns = (\n await Promise.all(\n props.pipelines.map((pipeline) =>\n props.stores.pipelineRuns?.listPipelineRuns({\n pipelineId: pipeline.id,\n limit: 100,\n }),\n ),\n )\n ).reduce((sum, runs) => sum + (runs?.length ?? 0), 0);\n }\n\n const summary: StudioStatusSummary = {\n runner,\n storage,\n counts,\n capabilities: capabilityConfig(\n props.options,\n props.agents,\n props.pipelines,\n props.stores,\n props.sandboxCount,\n ),\n generatedAt: new Date().toISOString(),\n };\n return c.json(summary);\n });\n}\n","import type { Context, Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentToolMetadata,\n StudioToolRunRequest,\n StudioToolRunResponse,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { toJsonValue } from \"./json\";\nimport { agentToolItems, approvalMetadata, mcpServerName } from \"./tool-metadata\";\nimport { isJsonObject, isJsonValue } from \"./type-guards\";\n\nexport function registerToolRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/tools\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n tools: await agentToolMetadata(agent),\n });\n });\n\n app.post(\"/agents/:agentId/tools/:toolName/runs\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const toolName = c.req.param(\"toolName\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n if (agent.agent.getTool(toolName) === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Tool not found\");\n }\n\n const body = await parseToolRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const started = Date.now();\n const startedAt = new Date(started).toISOString();\n const events: unknown[] = [];\n try {\n const result = await agent.agent.callTool(toolName, JSON.stringify(body.args), {\n emitStreamEvent(event) {\n events.push(event);\n },\n });\n const ended = Date.now();\n return c.json({\n agentId,\n toolName,\n status: \"success\",\n result: toJsonValue(result),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse);\n } catch (error) {\n const ended = Date.now();\n return c.json(\n {\n agentId,\n toolName,\n status: \"error\",\n error: serializeError(error),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse,\n 500,\n );\n }\n });\n}\n\nasync function parseToolRunRequest(\n c: Context,\n): Promise<StudioToolRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n if (body === undefined || body === null) {\n return { args: {} } satisfies StudioToolRunRequest;\n }\n if (!isJsonObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n const args = Object.hasOwn(body, \"args\") ? body.args : {};\n if (!isJsonValue(args)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"args must be JSON-compatible\") };\n }\n const request: StudioToolRunRequest = { args };\n if (Object.hasOwn(body, \"context\")) {\n if (!isJsonObject(body.context)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"context must be an object\") };\n }\n request.context = body.context;\n }\n return request;\n}\n\nexport async function agentToolMetadata(agent: StudioAgent): Promise<StudioAgentToolMetadata[]> {\n const seen = new Set<string>();\n const metadata: StudioAgentToolMetadata[] = [];\n for (const { tool, source } of agentToolItems(agent)) {\n const key = `${source}:${tool.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n const definition = await tool.definition(\"\");\n const serverName = mcpServerName(tool);\n const item: StudioAgentToolMetadata = {\n agentId: agent.id,\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n approval: approvalMetadata(tool),\n };\n if (serverName !== undefined) item.mcpServerName = serverName;\n metadata.push(item);\n }\n\n return metadata.sort((left, right) => {\n if (left.source !== right.source) {\n return left.source === \"static\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n}\n","import type { Hono } from \"hono\";\nimport type { StudioTraceStore } from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString, parseLimit, parseTraceStatus } from \"./query\";\n\nexport function registerTraceRoutes(app: Hono, traceStore: StudioTraceStore): void {\n app.get(\"/traces\", async (c) => {\n if (traceStore.listTraces === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"traces.list\" is not implemented by this runner',\n { capability: \"traces\", operation: \"list\" },\n );\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const status = parseTraceStatus(c.req.query(\"status\"));\n if (status === false) {\n return errorResponse(c, 400, \"bad_request\", \"status must be running, success, or error\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sessionId = optionalQueryString(c.req.query(\"sessionId\"));\n const input: Parameters<NonNullable<typeof traceStore.listTraces>>[0] = { limit };\n if (agentId !== undefined) input.agentId = agentId;\n if (sessionId !== undefined) input.sessionId = sessionId;\n if (status !== undefined) input.status = status;\n const traces = await traceStore.listTraces(input);\n if (c.req.query(\"include\") === \"detail\") {\n const detailed = await Promise.all(\n traces.map((trace) => Promise.resolve(traceStore.getTrace(trace.id))),\n );\n return c.json({ traces: detailed.filter((trace) => trace !== undefined) });\n }\n return c.json({ traces });\n });\n\n app.get(\"/traces/:traceId\", async (c) => {\n const trace = await traceStore.getTrace(c.req.param(\"traceId\"));\n if (trace === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Trace not found\");\n }\n return c.json(trace);\n });\n}\n","import { mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport type { DatabaseSync as DatabaseSyncType } from \"node:sqlite\";\nimport { isJsonValue, type JsonObject, type JsonValue, type Message } from \"@anvia/core/completion\";\nimport type {\n MemoryAppendOptions,\n MemoryCompactionCapability,\n MemoryCompactionReplacePrefixOptions,\n MemoryErrorOptions,\n MemoryScope,\n} from \"@anvia/core/memory\";\nimport {\n activeStudioCompactionMessages,\n parseStudioCompactionState,\n projectStudioCompactionMessages,\n studioCompactionRevision,\n type StoredStudioCompactionState,\n type StudioCompactionMessageRow,\n} from \"./compaction-state\";\nimport { renumberTranscript, transcriptFromMessages } from \"../runtime/transcript\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunStatus,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\nexport type SqliteSessionStoreOptions = {\n path?: string;\n};\n\ntype DatabaseSyncConstructor = typeof DatabaseSyncType;\n\nlet DatabaseSync: DatabaseSyncConstructor | undefined;\n\ntype SessionRow = {\n id: string;\n agent_id: string;\n title: string | null;\n metadata_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype CompactionSessionRow = {\n id: string;\n compaction_state_json: string | null;\n};\n\ntype SessionSummaryRow = SessionRow & {\n message_count: number;\n};\n\ntype MessageRow = {\n session_id: string;\n message_index: number;\n role: Message[\"role\"];\n message_id: string | null;\n metadata_json: string | null;\n created_at: string;\n};\n\ntype MessagePartRow = {\n session_id: string;\n message_index: number;\n part_index: number;\n type: string;\n part_json: string;\n};\n\ntype StoredMessagePart = {\n type: string;\n value: unknown;\n};\n\ntype TableInfoRow = {\n name: string;\n};\n\ntype TraceRow = {\n id: string;\n session_id: string;\n name: string | null;\n status: StudioTrace[\"status\"];\n trace_json: string | null;\n input_json: string | null;\n output: string | null;\n error_json: string | null;\n usage_json: string | null;\n metadata_json: string | null;\n observations_json: string;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\ntype SessionRunRow = {\n run_id: string;\n session_id: string;\n status: StudioSessionRunStatus;\n title: string | null;\n transcript_json: string;\n error_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype SessionLogRow = {\n id: string;\n session_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioSessionLogEntry[\"level\"];\n category: StudioSessionLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineLogRow = {\n id: string;\n pipeline_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioPipelineLogEntry[\"level\"];\n category: StudioPipelineLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineRunRow = {\n run_id: string;\n pipeline_id: string;\n status: StudioPipelineRunRecord[\"status\"];\n input_json: string;\n output_json: string | null;\n error_json: string | null;\n metadata_json: string | null;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\nexport function createSqliteSessionStore(\n options: SqliteSessionStoreOptions = {},\n): StudioSessionStore & StudioTraceStore & StudioPipelineLogStore & StudioPipelineRunStore {\n return new SqliteSessionStore(options.path ?? \":memory:\");\n}\n\nclass SqliteSessionStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"sqlite\";\n readonly compaction: MemoryCompactionCapability = {\n snapshot: ({ scope }) => {\n const session = this.getCompactionSessionRow(scope.sessionId);\n const state = parseStudioCompactionState(session?.compaction_state_json ?? null);\n const rows = this.listCompactionMessages(scope.sessionId, state);\n return Promise.resolve({\n revision: studioCompactionRevision(rows, state),\n messages: projectStudioCompactionMessages(rows, state),\n });\n },\n replacePrefix: (options) => this.replaceCompactionPrefix(options),\n };\n private db: DatabaseSyncType | undefined;\n\n constructor(private readonly path: string) {}\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n const db = this.database();\n const agentClause = options.agentId === undefined ? \"\" : \"WHERE s.agent_id = $agentId\";\n const rows = db\n .prepare(\n `SELECT s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at,\n COUNT(m.message_index) AS message_count\n FROM anvia_studio_sessions s\n LEFT JOIN anvia_studio_session_messages m ON m.session_id = s.id\n ${agentClause}\n GROUP BY s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at\n ORDER BY s.updated_at DESC\n LIMIT $limit`,\n )\n .all({\n $agentId: options.agentId ?? null,\n $limit: options.limit,\n }) as SessionSummaryRow[];\n\n return rows.map(toSessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const db = this.database();\n const now = new Date().toISOString();\n db.prepare(\n `INSERT INTO anvia_studio_sessions (\n id,\n agent_id,\n title,\n metadata_json,\n created_at,\n updated_at\n ) VALUES ($id, $agentId, $title, $metadata, $now, $now)`,\n ).run({\n $id: input.id,\n $agentId: input.agentId,\n $title: input.title ?? null,\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $now: now,\n });\n\n const session: StudioSessionSummary = {\n id: input.id,\n agentId: input.agentId,\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n };\n if (input.title !== undefined) session.title = input.title;\n if (input.metadata !== undefined) session.metadata = input.metadata;\n return session;\n }\n\n getSession(id: string): StudioSession | undefined {\n const row = this.getSessionRow(id);\n\n return row === undefined\n ? undefined\n : toSession(row, this.listSessionMessages(id), this.listSessionRunRows(id));\n }\n\n updateSessionMetadata(id: string, metadata: JsonObject | undefined): StudioSession | undefined {\n const db = this.database();\n const now = new Date().toISOString();\n const result = db\n .prepare(\n `UPDATE anvia_studio_sessions\n SET metadata_json = $metadata,\n updated_at = $now\n WHERE id = $id`,\n )\n .run({\n $id: id,\n $metadata: metadata === undefined ? null : JSON.stringify(metadata),\n $now: now,\n });\n if (result.changes === 0) {\n return undefined;\n }\n return this.getSession(id);\n }\n\n load({ scope }: { scope: MemoryScope }): Promise<Message[]> {\n const session = this.getSession(scope.sessionId);\n return Promise.resolve(session?.messages ?? []);\n }\n\n append(input: MemoryAppendOptions): Promise<void> {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: input.scope.sessionId }) as SessionRow | undefined;\n\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve();\n }\n\n const updatedAt = new Date().toISOString();\n const nextIndex = this.nextMessageIndex(input.scope.sessionId);\n\n this.insertMessages(input.scope.sessionId, input.messages, nextIndex, updatedAt);\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.scope.sessionId,\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n clear({ scope }: { scope: MemoryScope }): Promise<void> {\n const db = this.database();\n const updatedAt = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET compaction_state_json = NULL,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: scope.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_messages WHERE session_id = $id\").run({\n $id: scope.sessionId,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({\n $id: scope.sessionId,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n async recordError(input: MemoryErrorOptions): Promise<void> {\n const runId = studioRunId(input.scope) ?? input.runId;\n const existing = this.getSessionRun(input.scope.sessionId, runId);\n const transcript =\n existing === undefined ||\n parseJsonArray<StudioTranscriptEntry>(existing.transcript_json).length === 0\n ? transcriptFromMessages(input.messages)\n : parseJsonArray<StudioTranscriptEntry>(existing.transcript_json);\n await this.saveSessionRunTranscript({\n id: input.scope.sessionId,\n runId,\n transcript,\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n private replaceCompactionPrefix(\n input: MemoryCompactionReplacePrefixOptions,\n ): Promise<{ status: \"committed\" | \"conflict\" }> {\n if (!Number.isSafeInteger(input.messageCount) || input.messageCount < 1) {\n throw new RangeError(\"messageCount must be a positive integer.\");\n }\n const db = this.database();\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const session = this.getCompactionSessionRow(input.scope.sessionId);\n const state = parseStudioCompactionState(session?.compaction_state_json ?? null);\n const rows = this.listCompactionMessages(input.scope.sessionId, state);\n if (session === undefined || studioCompactionRevision(rows, state) !== input.revision) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve({ status: \"conflict\" });\n }\n const physicalPrefixCount = input.messageCount - (state === undefined ? 0 : 1);\n const activeRows = activeStudioCompactionMessages(rows, state);\n if (physicalPrefixCount < 0 || physicalPrefixCount > activeRows.length) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve({ status: \"conflict\" });\n }\n const summarizedThroughPosition =\n physicalPrefixCount === 0\n ? state?.summarizedThroughPosition\n : activeRows[physicalPrefixCount - 1]?.position;\n if (summarizedThroughPosition === undefined) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve({ status: \"conflict\" });\n }\n const nextState: StoredStudioCompactionState = {\n version: 1,\n generation: (state?.generation ?? 0) + 1,\n summary: input.replacement,\n summarizedThroughPosition,\n };\n const updatedAt = new Date().toISOString();\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET compaction_state_json = $compactionState,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.scope.sessionId,\n $compactionState: JSON.stringify(nextState),\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve({ status: \"committed\" });\n } catch (error) {\n if (db.isTransaction) db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.id);\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return undefined;\n }\n const current = toSession(\n row,\n this.listSessionMessages(input.id),\n this.listSessionRunRows(input.id),\n );\n const title = current.title ?? input.title;\n\n db.prepare(\n `INSERT INTO anvia_studio_session_runs (\n run_id,\n session_id,\n status,\n title,\n transcript_json,\n error_json,\n created_at,\n updated_at\n ) VALUES (\n $runId,\n $sessionId,\n $status,\n $title,\n $transcript,\n $error,\n $now,\n $now\n )\n ON CONFLICT(run_id) DO UPDATE SET\n status = excluded.status,\n title = COALESCE(anvia_studio_session_runs.title, excluded.title),\n transcript_json = excluded.transcript_json,\n error_json = excluded.error_json,\n updated_at = excluded.updated_at`,\n ).run({\n $runId: input.runId,\n $sessionId: input.id,\n $status: input.status,\n $title: input.title ?? null,\n $transcript: JSON.stringify(renumberTranscript(input.transcript)),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $now: now,\n });\n\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET title = $title,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.id,\n $title: title ?? null,\n $updatedAt: now,\n });\n db.exec(\"COMMIT\");\n\n const updated = this.getSession(input.id);\n return updated;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.sessionId);\n if (row === undefined) {\n throw new Error(\"Session not found\");\n }\n const sequence = this.nextSessionLogSequence(input.sessionId);\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n\n db.prepare(\n `INSERT INTO anvia_studio_session_logs (\n id,\n session_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $sessionId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $sessionId: entry.sessionId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, session_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as SessionLogRow[];\n\n return rows.map(toSessionLog);\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const sequence = this.nextPipelineLogSequence(input.pipelineId);\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n };\n if (input.runId !== undefined) entry.runId = input.runId;\n if (input.metadata !== undefined) entry.metadata = input.metadata;\n\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_logs (\n id,\n pipeline_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $pipelineId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $pipelineId: entry.pipelineId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, pipeline_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as PipelineLogRow[];\n\n return rows.map(toPipelineLog);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_runs (\n run_id,\n pipeline_id,\n status,\n input_json,\n output_json,\n error_json,\n metadata_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $runId,\n $pipelineId,\n $status,\n $input,\n $output,\n $error,\n $metadata,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(run_id) DO UPDATE SET\n pipeline_id = excluded.pipeline_id,\n status = excluded.status,\n input_json = excluded.input_json,\n output_json = excluded.output_json,\n error_json = excluded.error_json,\n metadata_json = excluded.metadata_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $runId: input.runId,\n $pipelineId: input.pipelineId,\n $status: input.status,\n $input: JSON.stringify(input.input),\n $output: input.output === undefined ? null : JSON.stringify(input.output),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $startedAt: input.startedAt,\n $endedAt: input.endedAt ?? null,\n $durationMs: input.durationMs ?? null,\n });\n\n const record: StudioPipelineRunRecord = {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n startedAt: input.startedAt,\n };\n if (input.output !== undefined) record.output = input.output;\n if (input.error !== undefined) record.error = input.error;\n if (input.metadata !== undefined) record.metadata = input.metadata;\n if (input.endedAt !== undefined) record.endedAt = input.endedAt;\n if (input.durationMs !== undefined) record.durationMs = input.durationMs;\n return record;\n }\n\n getPipelineRun(options: {\n pipelineId: string;\n runId: string;\n }): StudioPipelineRunRecord | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT run_id, pipeline_id, status, input_json, output_json, error_json,\n metadata_json, started_at, ended_at, duration_ms\n FROM anvia_studio_pipeline_runs\n WHERE pipeline_id = $pipelineId AND run_id = $runId`,\n )\n .get({\n $pipelineId: options.pipelineId,\n $runId: options.runId,\n }) as PipelineRunRow | undefined;\n\n return row === undefined ? undefined : toPipelineRun(row);\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT run_id, pipeline_id, status, input_json, output_json, error_json,\n metadata_json, started_at, ended_at, duration_ms\n FROM anvia_studio_pipeline_runs\n WHERE pipeline_id = $pipelineId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $limit: options.limit,\n }) as PipelineRunRow[];\n\n return rows.map(toPipelineRun);\n }\n\n deleteSession(id: string): boolean {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\"DELETE FROM anvia_studio_traces WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_logs WHERE session_id = $id\").run({ $id: id });\n const result = db\n .prepare(\"DELETE FROM anvia_studio_sessions WHERE id = $id\")\n .run({ $id: id }) as {\n changes: number | bigint;\n };\n db.exec(\"COMMIT\");\n return Number(result.changes) > 0;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const filters: string[] = [];\n const values: Record<string, string | number | null> = {\n $limit: options.limit,\n };\n\n if (options.agentId !== undefined) {\n filters.push(\n \"(s.agent_id = $agentId OR json_extract(t.metadata_json, '$.metadata.agentId') = $agentId)\",\n );\n values.$agentId = options.agentId;\n }\n if (options.sessionId !== undefined) {\n filters.push(\"t.session_id = $sessionId\");\n values.$sessionId = options.sessionId;\n }\n if (options.status !== undefined) {\n filters.push(\"t.status = $status\");\n values.$status = options.status;\n }\n\n const whereClause = filters.length === 0 ? \"\" : `WHERE ${filters.join(\" AND \")}`;\n const rows = db\n .prepare(\n `SELECT t.id, t.session_id, t.name, t.status, t.trace_json, t.input_json, t.output,\n t.error_json, t.usage_json, t.metadata_json, t.observations_json,\n t.started_at, t.ended_at, t.duration_ms\n FROM anvia_studio_traces t\n LEFT JOIN anvia_studio_sessions s ON s.id = t.session_id\n ${whereClause}\n ORDER BY t.started_at DESC\n LIMIT $limit`,\n )\n .all(values) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE session_id = $sessionId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $limit: options.limit,\n }) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n getTrace(id: string): StudioTrace | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE id = $id`,\n )\n .get({ $id: id }) as TraceRow | undefined;\n\n return row === undefined ? undefined : toTrace(row);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_traces (\n id,\n session_id,\n name,\n status,\n trace_json,\n input_json,\n output,\n error_json,\n usage_json,\n metadata_json,\n observations_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $id,\n $sessionId,\n $name,\n $status,\n $trace,\n $input,\n $output,\n $error,\n $usage,\n $metadata,\n $observations,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n name = excluded.name,\n status = excluded.status,\n trace_json = excluded.trace_json,\n input_json = excluded.input_json,\n output = excluded.output,\n error_json = excluded.error_json,\n usage_json = excluded.usage_json,\n metadata_json = excluded.metadata_json,\n observations_json = excluded.observations_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $id: trace.id,\n $sessionId: trace.sessionId,\n $name: trace.name ?? null,\n $status: trace.status,\n $trace: trace.trace === undefined ? null : JSON.stringify(trace.trace),\n $input: trace.input === undefined ? null : JSON.stringify(trace.input),\n $output: trace.output ?? null,\n $error: trace.error === undefined ? null : JSON.stringify(trace.error),\n $usage: trace.usage === undefined ? null : JSON.stringify(trace.usage),\n $metadata: trace.metadata === undefined ? null : JSON.stringify(trace.metadata),\n $observations: JSON.stringify(trace.observations),\n $startedAt: trace.startedAt,\n $endedAt: trace.endedAt ?? null,\n $durationMs: trace.durationMs ?? null,\n });\n\n return trace;\n }\n\n private database(): DatabaseSyncType {\n if (this.db !== undefined) {\n return this.db;\n }\n\n if (this.path !== \":memory:\") {\n mkdirSync(dirname(resolve(this.path)), { recursive: true });\n }\n\n const db = new (loadDatabaseSync())(this.path, {\n allowUnknownNamedParameters: true,\n timeout: 5000,\n });\n db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n `);\n guardAgainstLegacySessionSchema(db);\n db.exec(`\n CREATE TABLE IF NOT EXISTS anvia_studio_sessions (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n title TEXT,\n metadata_json TEXT,\n compaction_state_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_sessions_agent_updated_idx\n ON anvia_studio_sessions(agent_id, updated_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_messages (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n role TEXT NOT NULL,\n message_id TEXT,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_messages_session_idx\n ON anvia_studio_session_messages(session_id, message_index ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_message_parts (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n part_index INTEGER NOT NULL,\n type TEXT NOT NULL,\n part_json TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index, part_index),\n FOREIGN KEY(session_id, message_index)\n REFERENCES anvia_studio_session_messages(session_id, message_index)\n ON DELETE CASCADE\n ) STRICT;\n CREATE TABLE IF NOT EXISTS anvia_studio_session_runs (\n run_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n title TEXT,\n transcript_json TEXT NOT NULL,\n error_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_runs_session_created_idx\n ON anvia_studio_session_runs(session_id, created_at ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_logs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(session_id, sequence),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_logs_session_sequence_idx\n ON anvia_studio_session_logs(session_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_logs (\n id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(pipeline_id, sequence)\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_logs_pipeline_sequence_idx\n ON anvia_studio_pipeline_logs(pipeline_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_runs (\n run_id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n status TEXT NOT NULL,\n input_json TEXT NOT NULL,\n output_json TEXT,\n error_json TEXT,\n metadata_json TEXT,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_runs_pipeline_started_idx\n ON anvia_studio_pipeline_runs(pipeline_id, started_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_traces (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n name TEXT,\n status TEXT NOT NULL,\n trace_json TEXT,\n input_json TEXT,\n output TEXT,\n error_json TEXT,\n usage_json TEXT,\n metadata_json TEXT,\n observations_json TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_traces_session_started_idx\n ON anvia_studio_traces(session_id, started_at DESC);\n `);\n ensureSessionCompactionStateColumn(db);\n ensureMessageMetadataColumn(db);\n\n this.db = db;\n return db;\n }\n\n private getSessionRow(id: string): SessionRow | undefined {\n return this.database()\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as SessionRow | undefined;\n }\n\n private getCompactionSessionRow(id: string): CompactionSessionRow | undefined {\n return this.database()\n .prepare(\n `SELECT id, compaction_state_json\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as CompactionSessionRow | undefined;\n }\n\n private getSessionRun(sessionId: string, runId: string): SessionRunRow | undefined {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId AND run_id = $runId`,\n )\n .get({ $sessionId: sessionId, $runId: runId }) as SessionRunRow | undefined;\n }\n\n private listSessionRunRows(sessionId: string): SessionRunRow[] {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId\n ORDER BY created_at ASC`,\n )\n .all({ $sessionId: sessionId }) as SessionRunRow[];\n }\n\n private nextSessionLogSequence(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private nextPipelineLogSequence(pipelineId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId`,\n )\n .get({ $pipelineId: pipelineId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private listSessionMessages(sessionId: string): Message[] {\n return this.listSessionMessageEntries(sessionId).map((entry) => entry.message);\n }\n\n private listCompactionMessages(\n sessionId: string,\n state: StoredStudioCompactionState | undefined,\n ): StudioCompactionMessageRow[] {\n return this.listSessionMessageEntries(sessionId, state?.summarizedThroughPosition);\n }\n\n private listSessionMessageEntries(\n sessionId: string,\n minimumIndex?: number,\n ): StudioCompactionMessageRow[] {\n const db = this.database();\n const boundaryClause = minimumIndex === undefined ? \"\" : \"AND message_index >= $minimumIndex\";\n const parameters =\n minimumIndex === undefined\n ? { $sessionId: sessionId }\n : { $sessionId: sessionId, $minimumIndex: minimumIndex };\n const messageRows = db\n .prepare(\n `SELECT session_id, message_index, role, message_id, metadata_json, created_at\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId\n ${boundaryClause}\n ORDER BY message_index ASC`,\n )\n .all(parameters) as MessageRow[];\n\n if (messageRows.length === 0) {\n return [];\n }\n\n const partRows = db\n .prepare(\n `SELECT session_id, message_index, part_index, type, part_json\n FROM anvia_studio_session_message_parts\n WHERE session_id = $sessionId\n ${boundaryClause}\n ORDER BY message_index ASC, part_index ASC`,\n )\n .all(parameters) as MessagePartRow[];\n const partsByMessage = new Map<number, MessagePartRow[]>();\n for (const partRow of partRows) {\n const parts = partsByMessage.get(partRow.message_index) ?? [];\n parts.push(partRow);\n partsByMessage.set(partRow.message_index, parts);\n }\n\n return messageRows.map((row) => ({\n position: row.message_index,\n message: messageFromRows(row, partsByMessage.get(row.message_index) ?? []),\n }));\n }\n\n private nextMessageIndex(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(message_index) + 1, 0) AS next_index\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_index: number };\n return row.next_index;\n }\n\n private insertMessages(\n sessionId: string,\n messages: Message[],\n startIndex: number,\n createdAt: string,\n ): void {\n const db = this.database();\n const insertMessage = db.prepare(\n `INSERT INTO anvia_studio_session_messages (\n session_id,\n message_index,\n role,\n message_id,\n metadata_json,\n created_at\n ) VALUES ($sessionId, $messageIndex, $role, $messageId, $metadata, $createdAt)`,\n );\n const insertPart = db.prepare(\n `INSERT INTO anvia_studio_session_message_parts (\n session_id,\n message_index,\n part_index,\n type,\n part_json\n ) VALUES ($sessionId, $messageIndex, $partIndex, $type, $partJson)`,\n );\n\n messages.forEach((message, messageOffset) => {\n const messageIndex = startIndex + messageOffset;\n if (message.metadata !== undefined && !isJsonValue(message.metadata)) {\n throw new TypeError(\"Studio message metadata must be a strict JSON value.\");\n }\n insertMessage.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $role: message.role,\n $messageId: message.role === \"assistant\" ? (message.id ?? null) : null,\n $metadata: message.metadata === undefined ? null : JSON.stringify(message.metadata),\n $createdAt: createdAt,\n });\n\n messageParts(message).forEach((part, partIndex) => {\n insertPart.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $partIndex: partIndex,\n $type: part.type,\n $partJson: JSON.stringify(part.value),\n });\n });\n });\n }\n}\n\nfunction toSession(\n row: SessionRow,\n messages: Message[],\n runRows: SessionRunRow[] = [],\n): StudioSession {\n const summary = toSessionSummary({ ...row, message_count: messages.length });\n const runTranscript = runRows.flatMap((runRow) =>\n parseJsonArray<StudioTranscriptEntry>(runRow.transcript_json),\n );\n return {\n ...summary,\n messages,\n transcript: renumberTranscript(runTranscript),\n };\n}\n\nfunction toSessionSummary(row: SessionSummaryRow): StudioSessionSummary {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const summary: StudioSessionSummary = {\n id: row.id,\n agentId: row.agent_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: row.message_count,\n };\n if (row.title !== null) summary.title = row.title;\n if (metadata !== undefined) summary.metadata = metadata;\n return summary;\n}\n\nfunction toSessionLog(row: SessionLogRow): StudioSessionLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const entry: StudioSessionLogEntry = {\n id: row.id,\n sessionId: row.session_id,\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n };\n if (row.run_id !== null) entry.runId = row.run_id;\n if (metadata !== undefined) entry.metadata = metadata;\n return entry;\n}\n\nfunction toPipelineLog(row: PipelineLogRow): StudioPipelineLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const entry: StudioPipelineLogEntry = {\n id: row.id,\n pipelineId: row.pipeline_id,\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n };\n if (row.run_id !== null) entry.runId = row.run_id;\n if (metadata !== undefined) entry.metadata = metadata;\n return entry;\n}\n\nfunction toPipelineRun(row: PipelineRunRow): StudioPipelineRunRecord {\n const output = parseJsonValue<JsonValue>(row.output_json);\n const error = parseJsonValue<JsonValue>(row.error_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const record: StudioPipelineRunRecord = {\n runId: row.run_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n input: JSON.parse(row.input_json) as JsonValue,\n startedAt: row.started_at,\n };\n if (output !== undefined) record.output = output;\n if (error !== undefined) record.error = error;\n if (metadata !== undefined) record.metadata = metadata;\n if (row.ended_at !== null) record.endedAt = row.ended_at;\n if (row.duration_ms !== null) record.durationMs = row.duration_ms;\n return record;\n}\n\nfunction messageParts(message: Message): StoredMessagePart[] {\n if (message.role === \"system\") {\n return [{ type: \"text\", value: { type: \"text\", text: message.content } }];\n }\n\n if (typeof message.content === \"string\") {\n return [{ type: \"text\", value: { type: \"text\", text: message.content } }];\n }\n return message.content.map((content) => ({\n type: content.type,\n value: content,\n }));\n}\n\nfunction messageFromRows(row: MessageRow, partRows: MessagePartRow[]): Message {\n const parts = partRows.map((partRow) => JSON.parse(partRow.part_json) as unknown);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n if (\n metadata !== undefined &&\n (!isJsonValue(metadata) ||\n typeof metadata !== \"object\" ||\n metadata === null ||\n Array.isArray(metadata))\n ) {\n throw new TypeError(\"Stored Studio message metadata is not a strict JSON object.\");\n }\n if (row.role === \"system\") {\n let message: Extract<Message, { role: \"system\" }> = {\n role: \"system\",\n content: systemContentFromParts(parts),\n };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n if (row.role === \"user\") {\n let message: Extract<Message, { role: \"user\" }> = {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n if (row.role === \"assistant\") {\n let message: Extract<Message, { role: \"assistant\" }> = {\n role: \"assistant\",\n content: parts as Extract<Message, { role: \"assistant\" }>[\"content\"],\n };\n if (row.message_id !== null) message = { ...message, id: row.message_id };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n if (row.role === \"tool\") {\n let message: Extract<Message, { role: \"tool\" }> = {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\n if (metadata !== undefined) message = { ...message, metadata };\n return message;\n }\n\n throw new Error(`Unsupported stored message role: ${row.role}`);\n}\n\nfunction systemContentFromParts(parts: unknown[]): string {\n const first = parts[0];\n if (\n typeof first === \"object\" &&\n first !== null &&\n \"type\" in first &&\n first.type === \"text\" &&\n \"text\" in first &&\n typeof first.text === \"string\"\n ) {\n return first.text;\n }\n return \"\";\n}\n\nfunction guardAgainstLegacySessionSchema(db: DatabaseSyncType): void {\n const columns = db.prepare(\"PRAGMA table_info('anvia_studio_sessions')\").all() as TableInfoRow[];\n if (columns.some((column) => column.name === \"messages_json\")) {\n throw new Error(\n \"Existing Studio SQLite DB uses the legacy messages_json schema. Delete or recreate the Studio SQLite DB to use normalized session messages.\",\n );\n }\n}\n\nfunction ensureMessageMetadataColumn(db: DatabaseSyncType): void {\n const columns = db\n .prepare(\"PRAGMA table_info('anvia_studio_session_messages')\")\n .all() as TableInfoRow[];\n if (!columns.some((column) => column.name === \"metadata_json\")) {\n db.exec(\"ALTER TABLE anvia_studio_session_messages ADD COLUMN metadata_json TEXT\");\n }\n}\n\nfunction ensureSessionCompactionStateColumn(db: DatabaseSyncType): void {\n const columns = db.prepare(\"PRAGMA table_info('anvia_studio_sessions')\").all() as TableInfoRow[];\n if (!columns.some((column) => column.name === \"compaction_state_json\")) {\n db.exec(\"ALTER TABLE anvia_studio_sessions ADD COLUMN compaction_state_json TEXT\");\n }\n}\n\nfunction loadDatabaseSync(): DatabaseSyncConstructor {\n if (DatabaseSync !== undefined) {\n return DatabaseSync;\n }\n\n try {\n ({ DatabaseSync } = createRequire(import.meta.url)(\n \"node:sqlite\",\n ) as typeof import(\"node:sqlite\"));\n return DatabaseSync;\n } catch (error) {\n throw new Error(\n \"The default Studio SQLite store requires Node.js with node:sqlite support. Provide custom Studio stores or disable persisted stores when running Studio in a runtime without node:sqlite.\",\n { cause: error },\n );\n }\n}\n\nfunction toTrace(row: TraceRow): StudioTrace {\n const trace = parseJsonValue<StudioTrace[\"trace\"]>(row.trace_json);\n const input = parseJsonValue<StudioTrace[\"input\"]>(row.input_json);\n const result: StudioTrace = {\n ...toTraceSummary(row),\n observations: parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json),\n };\n if (trace !== undefined) result.trace = trace;\n if (input !== undefined) result.input = input;\n return result;\n}\n\nfunction toTraceSummary(row: TraceRow): StudioTraceSummary {\n const observations = parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json);\n const error = parseJsonValue<StudioTraceSummary[\"error\"]>(row.error_json);\n const usage = parseJsonValue<StudioTraceSummary[\"usage\"]>(row.usage_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n const summary: StudioTraceSummary = {\n id: row.id,\n sessionId: row.session_id,\n status: row.status,\n startedAt: row.started_at,\n observationCount: observations.length,\n };\n if (row.name !== null) summary.name = row.name;\n if (row.ended_at !== null) summary.endedAt = row.ended_at;\n if (row.duration_ms !== null) summary.durationMs = row.duration_ms;\n if (row.output !== null) summary.output = row.output;\n if (error !== undefined) summary.error = error;\n if (usage !== undefined) summary.usage = usage;\n if (metadata !== undefined) summary.metadata = metadata;\n if (typeof metadata?.runId === \"string\") summary.runId = metadata.runId;\n return summary;\n}\n\nfunction parseJsonArray<T>(value: string): T[] {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as T[]) : [];\n}\n\nfunction parseJsonValue<T>(value: string | null): T | undefined {\n if (value === null) {\n return undefined;\n }\n return JSON.parse(value) as T;\n}\n\nfunction studioRunId(scope: MemoryScope): string | undefined {\n const value = scope.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n if (\n error === null ||\n typeof error === \"string\" ||\n typeof error === \"number\" ||\n typeof error === \"boolean\"\n ) {\n return error;\n }\n return String(error);\n}\n","import { parseMessage, type Message } from \"@anvia/core/completion\";\nimport { isMemoryCompactionMessage, type MemoryCompactionMessage } from \"@anvia/core/memory\";\n\nexport type StoredStudioCompactionState = {\n version: 1;\n generation: number;\n summary: MemoryCompactionMessage;\n summarizedThroughPosition: number;\n};\n\nexport type StudioCompactionMessageRow = {\n position: number;\n message: Message;\n};\n\nexport function parseStudioCompactionState(\n value: string | null,\n): StoredStudioCompactionState | undefined {\n if (value === null) return undefined;\n const parsed: unknown = JSON.parse(value);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Stored Studio memory compaction state is invalid.\");\n }\n const record = parsed as Record<string, unknown>;\n let summary: Message;\n try {\n summary = parseMessage(record.summary);\n } catch (cause) {\n throw new Error(\"Stored Studio memory compaction state summary is invalid.\", { cause });\n }\n if (\n record.version !== 1 ||\n !Number.isSafeInteger(record.generation) ||\n (record.generation as number) < 1 ||\n !isMemoryCompactionMessage(summary) ||\n !Number.isSafeInteger(record.summarizedThroughPosition) ||\n (record.summarizedThroughPosition as number) < 0\n ) {\n throw new Error(\"Stored Studio memory compaction state is invalid.\");\n }\n return {\n version: 1,\n generation: record.generation as number,\n summary,\n summarizedThroughPosition: record.summarizedThroughPosition as number,\n };\n}\n\nexport function projectStudioCompactionMessages(\n rows: StudioCompactionMessageRow[],\n state: StoredStudioCompactionState | undefined,\n): Message[] {\n if (state === undefined) return rows.map((row) => row.message);\n return [state.summary, ...activeStudioCompactionMessages(rows, state).map((row) => row.message)];\n}\n\nexport function activeStudioCompactionMessages(\n rows: StudioCompactionMessageRow[],\n state: StoredStudioCompactionState | undefined,\n): StudioCompactionMessageRow[] {\n if (state === undefined) return rows;\n const boundaryIndex = rows.findIndex((row) => row.position === state.summarizedThroughPosition);\n if (boundaryIndex === -1) {\n throw new Error(\"Stored Studio memory compaction state boundary is invalid.\");\n }\n return rows.slice(boundaryIndex + 1);\n}\n\nexport function studioCompactionRevision(\n rows: StudioCompactionMessageRow[],\n state: StoredStudioCompactionState | undefined,\n): string {\n return JSON.stringify([state?.generation ?? 0, rows]);\n}\n"],"mappings":"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","names":["getAgentToolState","path","config","resolve","appendSessionLog","appendPipelineLog","isJsonValue","contents","resolve","isJsonValue","durationMs","byteLength","runId","execution","durationMs","isRecord","isRecord","getAgentToolState","toJsonValue","byteLength","resolve","isRecord","process","isRecord","candidate","run","resolve","getAgentToolState","shutdownOptions","isJsonValue","path","studioRunId","serializeJsonError","isJsonValue"]}
|