@anvia/studio 0.7.51 → 0.7.52

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.
Files changed (33) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.js +5 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/ui/assets/evals-page-CEs62ZfO.js +2 -0
  5. package/dist/ui/assets/evals-page-CEs62ZfO.js.map +1 -0
  6. package/dist/ui/assets/{index-BA0rdlcA.js → index-DY62pnOs.js} +4 -4
  7. package/dist/ui/assets/{index-BA0rdlcA.js.map → index-DY62pnOs.js.map} +1 -1
  8. package/dist/ui/assets/{knowledge-page-mjUIFz9M.js → knowledge-page-DMzsYo4t.js} +2 -2
  9. package/dist/ui/assets/{knowledge-page-mjUIFz9M.js.map → knowledge-page-DMzsYo4t.js.map} +1 -1
  10. package/dist/ui/assets/{mcps-page-Cc7DIAm6.js → mcps-page-ok-rle9j.js} +2 -2
  11. package/dist/ui/assets/{mcps-page-Cc7DIAm6.js.map → mcps-page-ok-rle9j.js.map} +1 -1
  12. package/dist/ui/assets/{memory-page-DQIj_bQD.js → memory-page-C7kQQjJR.js} +2 -2
  13. package/dist/ui/assets/{memory-page-DQIj_bQD.js.map → memory-page-C7kQQjJR.js.map} +1 -1
  14. package/dist/ui/assets/{pipelines-page-C-_Kz3Lk.js → pipelines-page-P3XgUxJA.js} +2 -2
  15. package/dist/ui/assets/{pipelines-page-C-_Kz3Lk.js.map → pipelines-page-P3XgUxJA.js.map} +1 -1
  16. package/dist/ui/assets/{sandboxes-page-DTIS-k4s.js → sandboxes-page-j51ihKpC.js} +2 -2
  17. package/dist/ui/assets/{sandboxes-page-DTIS-k4s.js.map → sandboxes-page-j51ihKpC.js.map} +1 -1
  18. package/dist/ui/assets/{sessions-page-BXgRMxf-.js → sessions-page-BBwN5yCL.js} +2 -2
  19. package/dist/ui/assets/{sessions-page-BXgRMxf-.js.map → sessions-page-BBwN5yCL.js.map} +1 -1
  20. package/dist/ui/assets/{status-page-C1lHztV8.js → status-page-BeUj83WX.js} +2 -2
  21. package/dist/ui/assets/{status-page-C1lHztV8.js.map → status-page-BeUj83WX.js.map} +1 -1
  22. package/dist/ui/assets/{tool-runner-FyfYw2ZF.js → tool-runner-DPD3YKe-.js} +2 -2
  23. package/dist/ui/assets/{tool-runner-FyfYw2ZF.js.map → tool-runner-DPD3YKe-.js.map} +1 -1
  24. package/dist/ui/assets/{tools-page-wjxEfdKF.js → tools-page-DXe7uWe2.js} +2 -2
  25. package/dist/ui/assets/{tools-page-wjxEfdKF.js.map → tools-page-DXe7uWe2.js.map} +1 -1
  26. package/dist/ui/assets/{trace-browser-B7e1JE0G.js → trace-browser-DLq-cgJu.js} +2 -2
  27. package/dist/ui/assets/{trace-browser-B7e1JE0G.js.map → trace-browser-DLq-cgJu.js.map} +1 -1
  28. package/dist/ui/assets/{transcript-item-BWi5umW2.js → transcript-item-CNTeNfE-.js} +2 -2
  29. package/dist/ui/assets/{transcript-item-BWi5umW2.js.map → transcript-item-CNTeNfE-.js.map} +1 -1
  30. package/dist/ui/index.html +1 -1
  31. package/package.json +5 -5
  32. package/dist/ui/assets/evals-page-BENEdYNb.js +0 -2
  33. package/dist/ui/assets/evals-page-BENEdYNb.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/studio.ts","../src/runtime/json.ts","../src/traces/trace-observer.ts","../src/ui/routes.tsx","../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/transcript.ts","../src/runtime/runs.ts","../src/runtime/session-logs.ts","../src/runtime/query.ts","../src/runtime/approvals.ts","../src/runtime/eval-config.ts","../src/runtime/tool-metadata.ts","../src/runtime/config.ts","../src/runtime/evals.ts","../src/runtime/knowledge.ts","../src/runtime/mcps.ts","../src/runtime/memory.ts","../src/runtime/pipelines.ts","../src/runtime/pipeline-logs.ts","../src/runtime/questions.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"],"sourcesContent":["import type { JsonObject } from \"@anvia/core/completion\";\nimport { Agent } from \"@anvia/core/internal/agent\";\nimport { Pipeline } from \"@anvia/core/pipeline\";\nimport { serve } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { Hono as HonoApp } from \"hono\";\nimport { StudioTraceObserver } from \"../traces/trace-observer\";\nimport type {\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioPipeline,\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 { registerAgentRunRoute } from \"./agent-runs\";\nimport { cloneAgent } from \"./agent-utils\";\nimport { createApprovalRuntime, registerApprovalRoutes } from \"./approvals\";\nimport {\n agentConfig,\n agentRuntimeSummary,\n buildConfig,\n runnerId,\n unsupportedCapabilities,\n} from \"./config\";\nimport { registerEvalRoutes } from \"./evals\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\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 { createQuestionRuntime, registerQuestionRoutes } from \"./questions\";\nimport { createStudioSandboxRegistry, registerSandboxRoutes } from \"./sandboxes\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport { normalizeAgents, normalizePipelines, resolveStores } from \"./shared\";\nimport { registerStatusRoutes } from \"./status\";\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 sigintHandler: (() => 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\n const port = serveOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n const serverOptions: Parameters<typeof serve>[0] = {\n fetch: (request) => this.fetch(request),\n port,\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 this.sigintHandler = () => {\n this.close();\n process.exit(0);\n };\n process.once(\"SIGINT\", this.sigintHandler);\n }\n\n return this;\n }\n\n async serve(serveOptions: StudioServeLifecycleOptions = {}): Promise<void> {\n const { onShutdown, signal, ...startOptions } = serveOptions;\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 } finally {\n this.close();\n await onShutdown?.();\n }\n }\n\n close(): void {\n if (this.sigintHandler !== undefined) {\n process.off(\"SIGINT\", this.sigintHandler);\n this.sigintHandler = undefined;\n }\n this.server?.close();\n this.server = undefined;\n this.studio.close();\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\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 // biome-ignore lint/suspicious/noExplicitAny: 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 };\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 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// biome-ignore lint/suspicious/noExplicitAny: 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: agent.staticContext.length,\n dynamicContextCount: agent.dynamicContexts.length,\n dynamicToolCount: agent.dynamicTools.length,\n hasOutputSchema: agent.outputSchema !== undefined,\n hasHook: agent.hook !== undefined,\n observerCount: agent.observers.length,\n approvalToolCount: agent.toolSet.values().filter((tool) => tool.approval !== undefined).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 approvalRuntime = createApprovalRuntime();\n const questionRuntime = createQuestionRuntime();\n const sandboxRegistry = createStudioSandboxRegistry(agents);\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 registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\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 };\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 approvalRuntime,\n questionRuntime,\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 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 };\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 || hasStudioTraceObserver(studioAgent.agent)) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n observers: [\n ...studioAgent.agent.observers,\n { observer: new StudioTraceObserver({ store: traceStore }) },\n ],\n }),\n };\n}\n\nfunction hasStudioTraceObserver(agent: Agent): boolean {\n return agent.observers.some(\n (registration) => registration.observer instanceof StudioTraceObserver,\n );\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 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} 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 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 await this.save(\"success\", {\n endedAt: new Date(),\n output: args.output,\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n async error(args: AgentRunErrorArgs): Promise<void> {\n await this.save(\"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 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 const trace: StudioTrace = {\n id: this.props.id,\n sessionId,\n status,\n trace: 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 toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const callId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n const start: (typeof this.toolStarts)[number] = {\n startedAt: new Date(),\n agentId,\n childTurn,\n toolName,\n input: toJsonValue(toolCallFunction?.arguments ?? {}),\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 this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.error`,\n status: \"error\",\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 : \"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 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 effectiveModel =\n request.model ?? stringValue(rawResponse?.model) ?? args.modelInfo?.defaultModel ?? \"default\";\n const providerResponse = providerResponseSummary(rawResponse);\n const usage = response?.usage;\n\n return compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\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 toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n firstDeltaMs: endArgs?.firstDeltaMs,\n providerResponse,\n modelInfo: compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\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 model: request.model,\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 toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).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 hasAdditionalParams: args.toolCall.additionalParams !== 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 hasAdditionalParams: args.toolCall.additionalParams !== 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 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 { 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}/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}/evals`, (c) => redirectWithQuery(c, \"/evals\"));\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(\"/sandboxes\", shellWhenHtml(renderShell));\n app.get(\"/sandboxes/:sandboxRef\", shellWhenHtml(renderShell));\n app.get(\"/evals\", 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\" class=\"dark\">',\n \"<head>\",\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n `<title>${title}</title>`,\n '<script>(()=>{try{if(localStorage.getItem(\"anvia-studio-theme\")===\"light\"){document.documentElement.classList.remove(\"dark\")}}catch{}})();</script>',\n `<link rel=\"icon\" type=\"image/png\" href=\"${escapeHtml(props.compatUiPath)}/assets/anvia.png\">`,\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(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n","import { type Message as CoreMessage, type JsonObject, Message } from \"@anvia/core/completion\";\nimport type { Agent } from \"@anvia/core/internal/agent\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n StudioAgent,\n StudioSession,\n StudioSessionStore,\n} from \"../types\";\nimport { cloneAgent, composeHooks } from \"./agent-utils\";\nimport type { createApprovalRuntime } from \"./approvals\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport {\n type createStudioModelRegistry,\n ModelSelectionError,\n resolveStudioModel,\n STUDIO_MODEL_METADATA_KEY,\n sessionModelRef,\n} from \"./models\";\nimport { rawObservedStore } from \"./observability\";\nimport type { ResolvedStores } from \"./options\";\nimport type { createQuestionRuntime } from \"./questions\";\nimport {\n AsyncEventQueue,\n assignTranscriptRunDuration,\n createPersistedStreamingSessionTranscript,\n mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\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 approvalRuntime: ReturnType<typeof createApprovalRuntime>;\n questionRuntime: ReturnType<typeof createQuestionRuntime>;\n};\n\ntype SelectedModel = ReturnType<typeof resolveStudioModel>;\ntype RunRequest = ReturnType<Agent[\"prompt\"]>;\n\ntype PreparedAgentRun = {\n agentId: string;\n agent: StudioAgent;\n body: AgentRunRequest;\n memoryMetadata: JsonObject;\n request: RunRequest;\n runAgent: Agent;\n runId: string;\n runStartedAt: number;\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 prepared = await prepareAgentRun(c, props);\n if (prepared instanceof Response) {\n return prepared;\n }\n\n if (prepared.body.stream === true) {\n return handleStreamingAgentRun(c, prepared, props);\n }\n return handleBufferedAgentRun(c, prepared, props);\n}\n\nasync function prepareAgentRun(\n c: Context,\n props: AgentRunRouteProps,\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 const session = await resolveRunSession(c, body, agentId, props.stores);\n if (session instanceof Response) {\n return session;\n }\n\n const selectedModel = selectRunModel(c, props, agent, body, session);\n if (selectedModel instanceof Response) {\n return selectedModel;\n }\n const runAgent =\n selectedModel.model === undefined\n ? agent.agent\n : cloneAgent(agent.agent, { model: selectedModel.model });\n const runId = globalThis.crypto.randomUUID();\n const runStartedAt = Date.now();\n\n await recordRunReceived({\n agentId,\n body,\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n await recordSelectedModelWarnings({\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n\n const memoryMetadata = runMemoryMetadata(agentId, body, selectedModel, runId);\n const promptMessage = normalizePromptMessage(body.message);\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 context: { sessionId: session.id, metadata: memoryMetadata },\n runId,\n turn: 1,\n messages: [promptMessage],\n });\n }\n\n const request = createRunRequest({\n agentId,\n body,\n memoryMetadata,\n promptMessage,\n runAgent,\n session,\n });\n\n return {\n agentId,\n agent,\n body,\n memoryMetadata,\n request,\n runAgent,\n runId,\n runStartedAt,\n selectedModel,\n session,\n sessionStore,\n shouldPersistSessionMessages,\n };\n}\n\nasync function resolveRunSession(\n c: Context,\n body: AgentRunRequest,\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: AgentRunRequest,\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: AgentRunRequest;\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.message,\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 (props.body.metadata !== undefined || props.selectedModel.ref !== undefined) {\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 input.metadata = metadata;\n }\n await appendSessionLog(props.store, runReceivedLog(input));\n}\n\nasync function recordSelectedModelWarnings(props: {\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 (sessionModelRef(props.session.metadata) !== props.selectedModel.ref) {\n const metadata: JsonObject = {};\n Object.assign(metadata, props.session.metadata);\n metadata[STUDIO_MODEL_METADATA_KEY] = props.selectedModel.ref;\n await props.store?.updateSessionMetadata?.(props.session.id, metadata);\n }\n}\n\nfunction runMemoryMetadata(\n agentId: string,\n body: AgentRunRequest,\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 metadata.studioRunId = runId;\n return metadata;\n}\n\nfunction createRunRequest(props: {\n agentId: string;\n body: AgentRunRequest;\n memoryMetadata: JsonObject;\n promptMessage: CoreMessage;\n runAgent: Agent;\n session: StudioSession | undefined;\n}): RunRequest {\n const request =\n props.session !== undefined\n ? props.runAgent.memory === undefined\n ? props.runAgent.prompt([...props.session.messages, props.promptMessage])\n : props.runAgent\n .session(props.session.id, { metadata: props.memoryMetadata })\n .prompt(props.body.message)\n : props.runAgent.prompt(\n props.body.history !== undefined\n ? [...props.body.history, props.promptMessage]\n : props.body.message,\n );\n request.withCompletionRetries();\n if (props.body.maxTurns !== undefined) {\n request.maxTurns(props.body.maxTurns);\n }\n if (props.body.toolConcurrency !== undefined) {\n request.withToolConcurrency(props.body.toolConcurrency);\n }\n if (props.body.trace !== undefined) {\n request.withTrace(traceForRun(props.body.trace, props.agentId, props.session));\n } else if (props.session !== undefined) {\n request.withTrace(traceForRun(undefined, props.agentId, props.session));\n }\n return request;\n}\n\nfunction handleStreamingAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Response {\n const runtimeEvents = new AsyncEventQueue<AgentRunStreamEvent>();\n const approvalContext: Parameters<typeof props.approvalRuntime.createApprovals>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n emit: (event) => runtimeEvents.push(event),\n };\n if (run.session !== undefined) approvalContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) approvalContext.metadata = run.body.metadata;\n run.request.approvals(props.approvalRuntime.createApprovals(approvalContext));\n const questionContext: Parameters<typeof props.questionRuntime.createHook>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n emit: (event) => runtimeEvents.push(event),\n };\n if (run.session !== undefined) questionContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) questionContext.metadata = run.body.metadata;\n const effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook(questionContext),\n );\n if (effectiveHook !== undefined) {\n run.request.withHook(effectiveHook);\n }\n\n const runStream = mergeRunAndApprovalEvents(run.request.stream(), runtimeEvents);\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.message,\n runId: run.runId,\n startedAt: run.runStartedAt,\n persistGeneratedMessages: run.shouldPersistSessionMessages,\n });\n stream = persistedRun.events;\n }\n\n return streamAgentRunEvents(c, stream, {\n onCancel: async () => {\n props.approvalRuntime.cancelRun(run.runId);\n props.questionRuntime.cancelRun(run.runId);\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 handleBufferedAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Promise<Response> {\n try {\n await startBufferedSessionRun(run, props);\n const response = await run.request.send();\n await completeBufferedSessionRun(run, response);\n return c.json(response);\n } catch (error) {\n await failBufferedSessionRun(run, error);\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n}\n\nasync function startBufferedSessionRun(\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Promise<void> {\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 questionContext: Parameters<typeof props.questionRuntime.createHook>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n };\n if (run.session !== undefined) questionContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) questionContext.metadata = run.body.metadata;\n const effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook(questionContext),\n );\n const approvalContext: Parameters<typeof props.approvalRuntime.createApprovals>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n };\n if (run.session !== undefined) approvalContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) approvalContext.metadata = run.body.metadata;\n run.request.approvals(props.approvalRuntime.createApprovals(approvalContext));\n if (effectiveHook !== undefined) {\n run.request.withHook(effectiveHook);\n }\n}\n\nasync function completeBufferedSessionRun(\n run: PreparedAgentRun,\n response: Awaited<ReturnType<RunRequest[\"send\"]>>,\n): Promise<void> {\n if (run.session === undefined || run.sessionStore === undefined) {\n return;\n }\n if (run.shouldPersistSessionMessages) {\n const generatedMessages = response.messages.slice(1);\n if (generatedMessages.length > 0) {\n await run.sessionStore.append({\n context: { 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.message),\n transcript,\n status: \"success\",\n });\n await appendSessionLog(\n run.sessionStore,\n runCompletedLog({\n sessionId: run.session.id,\n runId: run.runId,\n durationMs,\n usage: response.usage,\n output: response.output,\n messageCount: response.messages.length,\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 messages = await run.sessionStore.load({\n sessionId: run.session.id,\n metadata: run.memoryMetadata,\n });\n const durationMs = Date.now() - run.runStartedAt;\n const transcript = transcriptFromMessages(messages.slice(run.session.messageCount));\n assignTranscriptRunDuration(transcript, durationMs);\n await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.message),\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 normalizePromptMessage(message: string | CoreMessage): CoreMessage {\n return typeof message === \"string\" ? Message.user(message) : message;\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 createHook,\n type HookAction,\n type PromptHook,\n type ToolCallHookAction,\n} from \"@anvia/core/hooks\";\nimport { Agent } from \"@anvia/core/internal/agent\";\n\nexport function cloneAgent(\n agent: Agent,\n overrides: Partial<ConstructorParameters<typeof Agent>[0]> = {},\n): Agent {\n return new Agent({\n id: agent.id,\n name: agent.name,\n description: agent.description,\n model: agent.model,\n instructions: agent.instructions,\n staticContext: agent.staticContext,\n temperature: agent.temperature,\n maxTokens: agent.maxTokens,\n additionalParams: agent.additionalParams,\n toolSet: agent.toolSet,\n toolChoice: agent.toolChoice,\n defaultMaxTurns: agent.defaultMaxTurns,\n hook: agent.hook,\n outputSchema: agent.outputSchema,\n observers: agent.observers,\n approvals: agent.approvals,\n dynamicContexts: agent.dynamicContexts,\n dynamicTools: agent.dynamicTools,\n middlewares: agent.middlewares,\n memory: agent.memory,\n eventStore: agent.eventStore,\n ...overrides,\n });\n}\n\nexport function composeHooks(\n first: PromptHook | undefined,\n second: PromptHook | undefined,\n): PromptHook | undefined {\n if (first === undefined) {\n return second;\n }\n if (second === undefined) {\n return first;\n }\n\n return createHook({\n async onCompletionCall(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionCall?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionCall?.(args)) ?? undefined);\n },\n async onCompletionResponse(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionResponse?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionResponse?.(args)) ?? undefined);\n },\n async onToolCall(args): Promise<ToolCallHookAction | undefined> {\n const firstAction = await first.onToolCall?.(args);\n if (\n firstAction?.type === \"skip\" ||\n firstAction?.type === \"terminate\" ||\n firstAction?.type === \"approval_request\"\n ) {\n return firstAction;\n }\n const secondAction = await second.onToolCall?.(args);\n return secondAction ?? firstAction ?? undefined;\n },\n async onToolResult(args): Promise<HookAction | undefined> {\n const firstAction = await first.onToolResult?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onToolResult?.(args)) ?? undefined);\n },\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 type JsonObject,\n type JsonValue,\n type Message,\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 function isMessageInput(value: unknown): value is string | Message {\n return typeof value === \"string\" || isMessage(value);\n}\n\nexport function isMessage(value: unknown): value is Message {\n if (!isObject(value) || typeof value.role !== \"string\") {\n return false;\n }\n if (value.role === \"system\") {\n return typeof value.content === \"string\";\n }\n if (value.role === \"user\" || value.role === \"assistant\" || value.role === \"tool\") {\n return Array.isArray(value.content);\n }\n return false;\n}\n\nexport function isAgentTraceOptions(value: unknown): value is AgentTraceOptions {\n if (!isObject(value)) {\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 optionalBoolean(value.failOnObserverError) &&\n optionalStringArray(value.tags) &&\n optionalObject(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 optionalBoolean(value: unknown): boolean {\n return value === undefined || typeof value === \"boolean\";\n}\n\nfunction optionalStringArray(value: unknown): boolean {\n return (\n value === undefined || (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n\nfunction optionalObject(value: unknown): boolean {\n return value === undefined || isObject(value);\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 | 404 | 409 | 413 | 500 | 501,\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 type { CompletionModel, JsonObject, Message } 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\";\n\ntype RuntimeProvider = StudioModelProvider & {\n staticModels: Map<string, StudioModelDefinition>;\n};\n\nexport type StudioModelRegistry = {\n readonly defaultModel?: string;\n readonly providers: Map<string, RuntimeProvider>;\n readonly agentPolicies: Map<string, NormalizedAgentModelPolicy>;\n readonly modelCache: Map<string, CompletionModel>;\n};\n\ntype NormalizedAgentModelPolicy = {\n default?: 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.defaultModel !== undefined) {\n runtimeProvider.defaultModel = normalizeModelId(provider.defaultModel);\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.default !== undefined) {\n Object.assign(registry, { defaultModel: normalizeModelRef(config.default) });\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 modelSummary(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.defaultModel !== undefined) config.defaultModel = provider.defaultModel;\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.defaultModel !== undefined) config.default = registry.defaultModel;\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 if (props.registry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model registry not configured\");\n }\n const providers = await Promise.all(\n [...props.registry.providers.values()].map((provider) => providerCatalog(provider)),\n );\n const response: { providers: StudioModelProviderConfig[]; defaultModel?: string } = {\n providers,\n };\n if (props.registry.defaultModel !== undefined) {\n response.defaultModel = props.registry.defaultModel;\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(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)?.default ??\n registry.defaultModel;\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 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 normalizeOptionalModelRef(ref: StudioModelRef | undefined): string | undefined {\n return ref === undefined ? undefined : normalizeModelRef(ref);\n}\n\nexport function normalizeModelRef(ref: StudioModelRef): string {\n if (typeof ref === \"string\") {\n const trimmed = ref.trim();\n const parsed = parseModelRef(trimmed);\n return `${parsed.providerId}:${parsed.modelId}`;\n }\n return `${normalizeProviderId(ref.provider)}:${normalizeModelId(ref.model)}`;\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([...registry.providers.values()].map(providerCatalog));\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(provider, modelId, {\n id: modelId,\n }),\n ];\n } catch {\n return [];\n }\n });\n\n const defaultModel = policy?.default ?? registry.defaultModel;\n const summary: StudioAgentModelsSummary = {\n agentId: agent.id,\n models: [...models, ...exactPolicyModels],\n };\n if (defaultModel !== undefined) summary.defaultModel = defaultModel;\n if (warnings.length > 0) summary.warnings = warnings;\n return summary;\n}\n\nasync function providerCatalog(provider: RuntimeProvider): Promise<StudioModelProviderConfig> {\n const models = new Map<string, StudioModelSummary>();\n for (const model of provider.staticModels.values()) {\n models.set(model.id, modelSummary(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(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.defaultModel !== undefined) catalog.defaultModel = provider.defaultModel;\n if (provider.metadata !== undefined) catalog.metadata = provider.metadata;\n if (warning !== undefined) catalog.warning = warning;\n return catalog;\n}\n\nfunction modelSummary(\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 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.default !== undefined) normalized.default = normalizeModelRef(policy.default);\n if (policy.allowed !== undefined) {\n normalized.allowed = policy.allowed.map((entry) =>\n typeof entry === \"string\" && entry.trim().endsWith(\":*\")\n ? `${normalizeProviderId(entry.trim().slice(0, -2))}:*`\n : normalizeModelRef(entry),\n );\n }\n return [agentId.trim(), normalized];\n }),\n );\n}\n\nfunction publicPolicy(policy: NormalizedAgentModelPolicy): StudioAgentModelPolicyConfig {\n const config: StudioAgentModelPolicyConfig = {};\n if (policy.default !== undefined) config.default = policy.default;\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 (typeof message === \"string\") {\n continue;\n }\n if (message.role === \"user\" || message.role === \"assistant\") {\n for (const content of message.content) {\n if (content.type === \"image\") {\n modalities.add(\"image\");\n }\n if (content.type === \"document\") {\n modalities.add(\"document\");\n }\n }\n }\n }\n return modalities;\n}\n\nfunction requestMessages(request: AgentRunRequest): Array<string | Message> {\n return [...(request.history ?? []), request.message];\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 { createEventStream } 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 createEventStream(withStudioStreamErrors(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 }\n return next;\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 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.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 type { Message } 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: 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 for (const content of message.content) {\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 transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: \"\",\n attachments,\n });\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: \"tool_result\",\n callId: content.callId ?? content.id,\n result: content.content\n .map((item) =>\n \"text\" in item ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\n .join(\"\\n\"),\n structuredResult: content.content,\n });\n }\n continue;\n }\n\n for (const content of message.content) {\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.function.name,\n callId: content.callId ?? content.id,\n args: formatJson(content.function.arguments),\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 return message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.source.type === \"base64\") {\n attachment.data = content.source.data;\n attachment.mediaType = content.source.mediaType;\n } else {\n attachment.url = content.source.url;\n }\n return [attachment];\n }\n if (content.type === \"document\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.source.filename !== undefined) attachment.name = content.source.filename;\n if (content.source.mediaType !== undefined) attachment.mediaType = content.source.mediaType;\n if (content.source.type === \"base64\") attachment.data = content.source.data;\n if (content.source.type === \"url\") attachment.url = content.source.url;\n return [attachment];\n }\n return [];\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 { Message } from \"@anvia/core/completion\";\nimport type { AgentStreamEvent } from \"@anvia/core/request\";\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 { streamStudioJsonl } from \"./streams\";\nimport {\n isAgentTraceOptions,\n isJsonObject,\n isMessage,\n isMessageInput,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n} from \"./type-guards\";\n\nexport { transcriptFromMessages } from \"./transcript\";\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 async function* mergeRunAndApprovalEvents(\n runEvents: AsyncIterable<AgentStreamEvent>,\n approvalEvents: AsyncEventQueue<AgentRunStreamEvent>,\n): AsyncIterable<AgentRunStreamEvent> {\n type TaggedNext =\n | { source: \"run\"; value: IteratorResult<AgentStreamEvent> }\n | { source: \"approval\"; value: IteratorResult<AgentRunStreamEvent> };\n const runIterator = runEvents[Symbol.asyncIterator]();\n let runDone = false;\n let runNext: Promise<IteratorResult<AgentStreamEvent>> | undefined = runIterator.next();\n let approvalNext: Promise<IteratorResult<AgentRunStreamEvent>> | undefined =\n approvalEvents.next();\n\n try {\n while (runNext !== undefined || approvalNext !== undefined) {\n const pending: Promise<TaggedNext>[] = [];\n if (runNext !== undefined) {\n pending.push(runNext.then((value) => ({ source: \"run\", value })));\n }\n if (approvalNext !== undefined) {\n pending.push(approvalNext.then((value) => ({ source: \"approval\", value })));\n }\n\n const result = await Promise.race(pending);\n\n if (result.source === \"run\") {\n if (result.value.done === true) {\n runDone = true;\n runNext = undefined;\n approvalEvents.close();\n } else {\n runNext = runIterator.next();\n yield result.value.value;\n }\n continue;\n }\n\n if (result.value.done === true) {\n approvalNext = undefined;\n } else {\n approvalNext = approvalEvents.next();\n yield result.value.value;\n }\n }\n } finally {\n if (!runDone && runIterator.return !== undefined) {\n await runIterator.return();\n }\n approvalEvents.close();\n }\n}\n\nexport function streamAgentRunEvents(\n _c: Context,\n events: AsyncIterable<AgentRunStreamEvent>,\n options: { onCancel?: () => void | Promise<void> } = {},\n): Response {\n return streamStudioJsonl(withAgentRunCancellation(events, options.onCancel));\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 (next.value.type === \"final\" || next.value.type === \"error\") {\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: Record<string, unknown> = {};\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}): {\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\" | \"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 (event.type === \"final\" || event.type === \"error\") {\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n }\n const eventStatus =\n event.type === \"final\" ? \"success\" : event.type === \"error\" ? \"error\" : \"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 = event.type === \"final\" ? event.messages.slice(1) : [];\n if (props.persistGeneratedMessages === true && generatedMessages.length > 0) {\n await props.store.append({\n context: { 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.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n args: formatJson(event.toolCall.function.arguments),\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 === \"tool_approval_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n matched.approval = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n };\n }\n }\n if (event.type === \"tool_approval_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n const approval: NonNullable<typeof matched.approval> = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n };\n if (event.approval.resolvedAt !== undefined) approval.resolvedAt = event.approval.resolvedAt;\n if (event.approval.reason !== undefined) approval.reason = event.approval.reason;\n matched.approval = approval;\n }\n }\n if (event.type === \"tool_question_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n matched.question = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n questions: event.question.questions,\n };\n }\n }\n if (event.type === \"tool_question_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n const question: NonNullable<typeof matched.question> = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n questions: event.question.questions,\n };\n if (event.question.answeredAt !== undefined) question.answeredAt = event.question.answeredAt;\n if (event.question.cancelledAt !== undefined) {\n question.cancelledAt = event.question.cancelledAt;\n }\n if (event.question.answers !== undefined) question.answers = event.question.answers;\n matched.question = question;\n }\n }\n if (event.type === \"final\" && event.trace?.traceId !== undefined) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\n }\n if (event.type === \"error\") {\n appendTranscriptAssistantError(transcript, errorText(event.error));\n }\n}\n\nfunction approvalCallId(approval: { callId?: string; toolCallId?: string }): string | undefined {\n return approval.callId ?? approval.toolCallId;\n}\n\nfunction questionCallId(question: { callId?: string; toolCallId?: string }): string | undefined {\n return question.callId ?? question.toolCallId;\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.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n args: formatJson(child.toolCall.function.arguments),\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 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.function.name}(${formatJson(item.function.arguments)})`];\n }\n if (item.type === \"tool_result\") {\n return item.content.map((result) =>\n \"text\" in result ? result.text : `[image:${result.mediaType ?? \"image/png\"}]`,\n );\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 const attachments = message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.source.type === \"base64\") {\n attachment.data = content.source.data;\n attachment.mediaType = content.source.mediaType;\n } else {\n attachment.url = content.source.url;\n }\n return [attachment];\n }\n if (content.type === \"document\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.source.filename !== undefined) attachment.name = content.source.filename;\n if (content.source.mediaType !== undefined) attachment.mediaType = content.source.mediaType;\n if (content.source.type === \"base64\") attachment.data = content.source.data;\n if (content.source.type === \"url\") attachment.url = content.source.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 const request =\n \"message\" in body ? parseLegacyRunRequestBody(c, body) : parseUiRunRequestBody(c, body);\n if (\"error\" in request) {\n return request;\n }\n\n return parseRunRequestOptions(c, body, request);\n}\n\nfunction parseLegacyRunRequestBody(\n c: Context,\n body: Record<string, unknown>,\n): AgentRunRequest | { error: Response } {\n if (!isMessageInput(body.message)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"Request body requires a string or Message\"),\n };\n }\n\n const request: AgentRunRequest = {\n message: typeof body.message === \"string\" ? body.message : body.message,\n };\n\n if (\"history\" in body) {\n if (!Array.isArray(body.history) || !body.history.every(isMessage)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"history must be a Message array\") };\n }\n request.history = body.history;\n }\n\n return request;\n}\n\nfunction parseUiRunRequestBody(\n c: Context,\n body: Record<string, unknown>,\n): AgentRunRequest | { error: Response } {\n const messages = body.messages;\n if (!Array.isArray(messages) || !messages.every(isMessage)) {\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\n const history = messages.slice(0, -1);\n const request: AgentRunRequest = { message };\n if (history.length > 0) request.history = history;\n return request;\n}\n\nfunction parseRunRequestOptions(\n c: Context,\n body: Record<string, unknown>,\n request: AgentRunRequest,\n): AgentRunRequest | { error: Response } {\n if (\"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.history !== undefined) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"sessionId cannot be combined with history\"),\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 (\"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 (\"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 (\"model\" in body) {\n if (typeof body.model === \"string\") {\n request.model = body.model;\n } else if (\n isObject(body.model) &&\n typeof body.model.provider === \"string\" &&\n typeof body.model.model === \"string\"\n ) {\n request.model = {\n provider: body.model.provider,\n model: body.model.model,\n };\n } else {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"model must be a provider:model string or { provider, model } object\",\n ),\n };\n }\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","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 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 === \"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.function.name} called`,\n metadata: {\n turn: event.turn,\n toolName: event.toolCall.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n argumentBytes: byteLength(formatUnknown(event.toolCall.function.arguments)),\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 === \"final\") {\n return [\n runCompletedLog({\n sessionId,\n runId,\n durationMs: Date.now() - props.startedAt,\n usage: event.usage,\n output: event.output,\n messageCount: event.messages.length,\n }),\n memorySavedLog({ sessionId, runId, messageCount: event.messages.length }),\n ];\n }\n if (event.type === \"error\") {\n return [runFailedLog(sessionId, runId, event.error, props.startedAt)];\n }\n if (event.type === \"tool_approval_request\") {\n const metadata: JsonObject = {\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n argumentBytes: byteLength(event.approval.args),\n };\n if (event.approval.callId !== undefined) metadata.callId = event.approval.callId;\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"approval\",\n event: \"approval.requested\",\n message: `Approval requested for ${event.approval.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"tool_approval_result\") {\n const metadata: JsonObject = {\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n };\n if (event.approval.callId !== undefined) metadata.callId = event.approval.callId;\n return [\n {\n sessionId,\n runId,\n level: event.approval.status === \"approved\" ? \"info\" : \"warn\",\n category: \"approval\",\n event: \"approval.resolved\",\n message: `Approval ${event.approval.status} for ${event.approval.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"tool_question_request\") {\n const metadata: JsonObject = {\n questionId: event.question.id,\n toolName: event.question.toolName,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n };\n if (event.question.callId !== undefined) metadata.callId = event.question.callId;\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.requested\",\n message: `Question requested by ${event.question.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"tool_question_result\") {\n const cancelled = event.question.status === \"cancelled\";\n const metadata: JsonObject = {\n questionId: event.question.id,\n toolName: event.question.toolName,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n answerCount: event.question.answers?.length ?? 0,\n };\n if (event.question.callId !== undefined) metadata.callId = event.question.callId;\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: cancelled ? \"question.cancelled\" : \"question.answered\",\n message: cancelled\n ? `Question cancelled for ${event.question.toolName}`\n : `Question answered for ${event.question.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.function.name}`,\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.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n argumentBytes: byteLength(formatUnknown(child.toolCall.function.arguments)),\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 === \"final\") {\n const metadata: JsonObject = {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n outputBytes: byteLength(child.output),\n messageCount: child.messages.length,\n };\n const usage = usageSummary(child.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 { 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\" || status === \"success\" || status === \"error\" ? status : 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 type { JsonObject } from \"@anvia/core/completion\";\nimport type { ToolApprovalRequest, ToolApprovalsOptions } from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolApproval,\n StudioToolApprovalDecision,\n StudioToolApprovalStatus,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString } from \"./query\";\nimport { isObject } from \"./type-guards\";\n\ntype PendingApproval = StudioToolApproval & {\n status: \"pending\";\n rejectMessage?: string;\n emit?: (event: AgentRunStreamEvent) => void;\n resolve: (decision: StudioToolApprovalDecision) => void;\n};\n\ntype ApprovalHookContext = {\n runId: string;\n agentId: string;\n sessionId?: string;\n metadata?: JsonObject;\n emit?: (event: AgentRunStreamEvent) => void;\n};\n\ntype ApprovalRequest = {\n toolName: string;\n toolCallId?: string;\n internalCallId: string;\n args: string;\n reason?: string;\n rejectMessage?: string;\n};\n\nexport type ApprovalRuntime = {\n approvals: Map<string, PendingApproval | StudioToolApproval>;\n createApprovals(context: ApprovalHookContext): ToolApprovalsOptions;\n list(options: ApprovalListOptions): StudioToolApproval[];\n cancelRun(runId: string): StudioToolApproval[];\n decide(\n id: string,\n decision: StudioToolApprovalDecision,\n ): \"missing\" | \"resolved\" | StudioToolApproval;\n};\n\ntype ApprovalListOptions = {\n status?: \"pending\" | \"resolved\";\n runId?: string;\n agentId?: string;\n sessionId?: string;\n};\n\nexport function registerApprovalRoutes(app: Hono, approvals: ApprovalRuntime): void {\n app.get(\"/approvals\", (c) => {\n const status = parseApprovalStatus(c.req.query(\"status\"));\n if (status === false) {\n return errorResponse(c, 400, \"bad_request\", \"status must be pending or resolved\");\n }\n\n const options: ApprovalListOptions = {};\n const runId = optionalQueryString(c.req.query(\"runId\"));\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sessionId = optionalQueryString(c.req.query(\"sessionId\"));\n if (status !== undefined) {\n options.status = status;\n }\n if (runId !== undefined) {\n options.runId = runId;\n }\n if (agentId !== undefined) {\n options.agentId = agentId;\n }\n if (sessionId !== undefined) {\n options.sessionId = sessionId;\n }\n\n return c.json({\n approvals: approvals.list(options),\n });\n });\n\n app.post(\"/approvals/:approvalId/decision\", async (c) => {\n const body = await parseApprovalDecisionRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const result = approvals.decide(c.req.param(\"approvalId\"), body);\n if (result === \"missing\") {\n return errorResponse(c, 404, \"not_found\", \"Approval not found\");\n }\n if (result === \"resolved\") {\n return errorResponse(c, 409, \"conflict\", \"Approval is already resolved\");\n }\n return c.json(result);\n });\n}\n\nfunction parseApprovalStatus(\n value: string | undefined,\n): \"pending\" | \"resolved\" | undefined | false {\n const status = optionalQueryString(value);\n if (status === undefined) {\n return undefined;\n }\n return status === \"pending\" || status === \"resolved\" ? status : false;\n}\n\nasync function parseApprovalDecisionRequest(\n c: Context,\n): Promise<StudioToolApprovalDecision | { 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 (typeof body.approved !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"approved must be a boolean\") };\n }\n if (\"reason\" in body && typeof body.reason !== \"string\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"reason must be a string\") };\n }\n\n const reason =\n typeof body.reason === \"string\" && body.reason.trim().length > 0\n ? body.reason.trim()\n : undefined;\n return approvalDecision(body.approved, reason);\n}\n\nexport function createApprovalRuntime(): ApprovalRuntime {\n const approvals = new Map<string, PendingApproval | StudioToolApproval>();\n\n return {\n approvals,\n createApprovals(context) {\n return {\n async handler(request: ToolApprovalRequest) {\n const approvalRequest: ApprovalRequest = {\n toolName: request.toolName,\n internalCallId: request.internalCallId,\n args: request.rawArgs,\n };\n if (request.toolCallId !== undefined) approvalRequest.toolCallId = request.toolCallId;\n if (request.reason !== undefined) approvalRequest.reason = request.reason;\n if (request.rejectMessage !== undefined) {\n approvalRequest.rejectMessage = request.rejectMessage;\n }\n const decision = await requestApproval(approvals, context, approvalRequest);\n return approvalDecision(decision.approved, decision.reason);\n },\n };\n },\n list(options) {\n return [...approvals.values()]\n .filter((approval) => {\n if (options.status === \"pending\" && approval.status !== \"pending\") {\n return false;\n }\n if (options.status === \"resolved\" && approval.status === \"pending\") {\n return false;\n }\n if (options.runId !== undefined && approval.runId !== options.runId) {\n return false;\n }\n if (options.agentId !== undefined && approval.agentId !== options.agentId) {\n return false;\n }\n if (options.sessionId !== undefined && approval.sessionId !== options.sessionId) {\n return false;\n }\n return true;\n })\n .map(publicApproval);\n },\n cancelRun(runId) {\n const cancelled: StudioToolApproval[] = [];\n for (const approval of approvals.values()) {\n if (!isPendingApproval(approval) || approval.runId !== runId) {\n continue;\n }\n const resolved = resolveApproval(approval, \"cancelled\", {\n reason: \"Run cancelled in Anvia Studio.\",\n });\n approvals.set(approval.id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve(approvalDecision(false, resolved.reason));\n cancelled.push(resolved);\n }\n return cancelled;\n },\n decide(id, decision) {\n const approval = approvals.get(id);\n if (approval === undefined) {\n return \"missing\";\n }\n if (!isPendingApproval(approval)) {\n return \"resolved\";\n }\n\n const reason = decision.approved\n ? decision.reason\n : (decision.reason ?? approval.rejectMessage ?? \"Rejected in Anvia Studio.\");\n const resolved = resolveApproval(\n approval,\n decision.approved ? \"approved\" : \"rejected\",\n reason === undefined ? {} : { reason },\n );\n approvals.set(id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve(approvalDecision(decision.approved, reason));\n return publicApproval(resolved);\n },\n };\n}\n\nasync function requestApproval(\n approvals: Map<string, PendingApproval | StudioToolApproval>,\n context: ApprovalHookContext,\n request: ApprovalRequest,\n): Promise<StudioToolApprovalDecision> {\n const id = globalThis.crypto.randomUUID();\n const approval: PendingApproval = {\n id,\n runId: context.runId,\n agentId: context.agentId,\n toolName: request.toolName,\n internalCallId: request.internalCallId,\n args: request.args,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n resolve: () => {},\n };\n if (context.sessionId !== undefined) approval.sessionId = context.sessionId;\n if (request.toolCallId !== undefined) approval.callId = request.toolCallId;\n if (request.reason !== undefined) approval.reason = request.reason;\n if (request.rejectMessage !== undefined) approval.rejectMessage = request.rejectMessage;\n if (context.emit !== undefined) approval.emit = context.emit;\n\n const decision = new Promise<StudioToolApprovalDecision>((resolve) => {\n approval.resolve = (decision) => {\n const current = approvals.get(id);\n if (!isPendingApproval(current)) {\n if (current !== undefined) {\n resolve(approvalDecision(current.status === \"approved\", current.reason));\n }\n return;\n }\n const reason = decision.approved\n ? decision.reason\n : (decision.reason ?? request.rejectMessage ?? \"Rejected in Anvia Studio.\");\n const resolved = resolveApproval(\n current,\n decision.approved ? \"approved\" : \"rejected\",\n reason === undefined ? {} : { reason },\n );\n approvals.set(id, resolved);\n context.emit?.({ type: \"tool_approval_result\", approval: resolved });\n resolve(approvalDecision(decision.approved, reason));\n };\n });\n\n approvals.set(id, approval);\n context.emit?.({ type: \"tool_approval_request\", approval: publicApproval(approval) });\n return decision;\n}\n\nfunction isPendingApproval(\n approval: PendingApproval | StudioToolApproval | undefined,\n): approval is PendingApproval {\n return approval !== undefined && approval.status === \"pending\" && \"resolve\" in approval;\n}\n\nfunction resolveApproval(\n approval: PendingApproval | StudioToolApproval,\n status: Exclude<StudioToolApprovalStatus, \"pending\">,\n options: { reason?: string } = {},\n): StudioToolApproval {\n const resolved: PendingApproval | StudioToolApproval = {\n ...approval,\n status,\n resolvedAt: new Date().toISOString(),\n };\n if (options.reason !== undefined) resolved.reason = options.reason;\n return publicApproval(resolved);\n}\n\nfunction approvalDecision(\n approved: boolean,\n reason: string | undefined,\n): StudioToolApprovalDecision {\n const decision: StudioToolApprovalDecision = { approved };\n if (reason !== undefined) decision.reason = reason;\n return decision;\n}\n\nfunction publicApproval(approval: PendingApproval | StudioToolApproval): StudioToolApproval {\n const { emit, rejectMessage, resolve, ...rest } = approval as PendingApproval;\n void emit;\n void rejectMessage;\n void resolve;\n return rest;\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.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 AnyTool, ToolSet } from \"@anvia/core/tool\";\nimport type { StudioAgent, StudioAgentToolApprovalMetadata, StudioAgentToolSource } from \"../types\";\n\nexport type AgentToolItem = {\n tool: AnyTool;\n source: StudioAgentToolSource;\n};\n\nconst MCP_TOOL_METADATA_KEY = Symbol.for(\"anvia.mcp.tool.metadata\");\n\nexport function agentToolItems(agent: StudioAgent): AgentToolItem[] {\n return [\n ...agent.agent.toolSet.values().map((tool) => ({ tool, source: \"static\" as const })),\n ...agent.agent.dynamicTools.flatMap((registration) => {\n const maybeToolSet = (registration.index as { toolSet?: unknown }).toolSet;\n if (!(maybeToolSet instanceof ToolSet)) {\n return [];\n }\n return maybeToolSet.values().map((tool) => ({ tool, source: \"dynamic\" as const }));\n }),\n ];\n}\n\nexport function approvalMetadata(tool: AnyTool): StudioAgentToolApprovalMetadata {\n const approval = tool.approval;\n if (approval === undefined || typeof approval !== \"object\" || approval === null) {\n return { required: false };\n }\n\n const policy = approval as {\n reason?: unknown;\n rejectMessage?: unknown;\n };\n const metadata: StudioAgentToolApprovalMetadata = { required: true };\n if (typeof policy.reason === \"string\") metadata.reason = policy.reason;\n if (typeof policy.rejectMessage === \"string\") metadata.rejectMessage = policy.rejectMessage;\n return metadata;\n}\n\nexport function mcpServerName(tool: AnyTool): string | undefined {\n const metadata = (tool as { [MCP_TOOL_METADATA_KEY]?: unknown })[MCP_TOOL_METADATA_KEY];\n if (typeof metadata !== \"object\" || metadata === null) {\n return undefined;\n }\n const serverName = (metadata as { serverName?: unknown }).serverName;\n return typeof serverName === \"string\" && serverName.length > 0 ? serverName : undefined;\n}\n\nexport function agentHasMcpTools(agent: StudioAgent): boolean {\n return agentToolItems(agent).some(({ tool }) => mcpServerName(tool) !== undefined);\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioAgentRuntimeSummary,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioPipeline,\n StudioPipelineConfig,\n} from \"../types\";\nimport { evalConfig } from \"./eval-config\";\nimport { serializeUnknown } from \"./json\";\nimport { createStudioModelRegistry, studioModelsConfig } from \"./models\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\nimport { agentHasMcpTools, agentToolItems, mcpServerName } 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 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) => item.tool.approval !== undefined).length,\n mcpToolCount: tools.filter((item) => mcpServerName(item.tool) !== undefined).length,\n staticContextCount: agent.agent.staticContext.length,\n dynamicContextCount: agent.agent.dynamicContexts.length,\n observerCount: agent.agent.observers.length,\n hasMemory: agent.agent.memory !== undefined,\n hasHook: agent.agent.hook !== 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 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 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.evals.length > 0) {\n capabilities.evals = { enabled: true };\n }\n if (\n agents.some(\n (agent) => agent.agent.toolSet.values().length > 0 || agent.agent.dynamicTools.length > 0,\n )\n ) {\n capabilities.tools = { enabled: true };\n }\n if (agents.some(agentHasMcpTools)) {\n capabilities.mcps = { enabled: true };\n }\n if (sandboxCount > 0) {\n capabilities.sandboxes = { enabled: true };\n }\n\n if (\n agents.some(\n (agent) =>\n agent.agent.hook !== undefined ||\n agent.agent.toolSet.values().some((tool) => tool.approval),\n )\n ) {\n capabilities.approvals = { enabled: true };\n }\n if (\n agents.some(\n (agent) =>\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0,\n )\n ) {\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 { 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 { JsonObject, JsonValue } from \"@anvia/core/completion\";\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 { errorResponse } from \"./http\";\nimport { compactJsonObject, toJsonValue } from \"./json\";\nimport { optionalQueryString, parseLimit } from \"./query\";\n\ntype InspectableIndex = {\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 return (\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0\n );\n}\n\nasync function agentKnowledgeConfig(agent: StudioAgent): Promise<StudioAgentKnowledgeConfig> {\n const agentName = agent.name ?? agent.agent.name;\n const config: StudioAgentKnowledgeConfig = {\n agentId: agent.id,\n sources: await knowledgeSources(agent),\n staticContext: agent.agent.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 sources: StudioKnowledgeSourceSummary[] = [\n {\n sourceId: staticSourceId(),\n kind: \"static_context\",\n label: \"Static context\",\n count: agent.agent.staticContext.length,\n inspectable: true,\n itemCount: agent.agent.staticContext.length,\n },\n ];\n\n const dynamicContextSources = await Promise.all(\n agent.agent.dynamicContexts.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.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: registration.options.topK,\n inspectable: inspect !== undefined,\n };\n if (registration.options.threshold !== undefined) {\n source.threshold = registration.options.threshold;\n }\n if (count !== undefined) source.itemCount = count;\n return source;\n }),\n );\n\n const dynamicToolSources = await Promise.all(\n agent.agent.dynamicTools.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.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: registration.options.topK,\n inspectable: inspect !== undefined,\n };\n if (registration.options.threshold !== undefined) {\n source.threshold = registration.options.threshold;\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: InspectableIndex[\"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 dynamicContextIndex = dynamicSourceIndex(sourceId, \"dynamic_context\");\n if (dynamicContextIndex !== undefined) {\n const registration = agent.agent.dynamicContexts[dynamicContextIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\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: registration.options.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 registration = agent.agent.dynamicTools[dynamicToolsIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\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: registration.options.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(index: unknown): InspectableIndex[\"inspect\"] | undefined {\n if (!isRecord(index) || typeof index.inspect !== \"function\") {\n return undefined;\n }\n const inspect = index.inspect;\n return (request) =>\n inspect.call(index, request) as ReturnType<NonNullable<InspectableIndex[\"inspect\"]>>;\n}\n\nfunction staticKnowledgeItemsPage(\n agent: StudioAgent,\n request: { limit: number; cursor?: string | undefined },\n): StudioKnowledgeItemsPage {\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const page = agent.agent.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: agent.agent.staticContext.length,\n };\n if (nextOffset < agent.agent.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 { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentMcpServerMetadata,\n StudioAgentMcpToolMetadata,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { agentToolItems, approvalMetadata, mcpServerName } 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 const servers = new Map<string, StudioAgentMcpToolMetadata[]>();\n const seen = new Set<string>();\n\n for (const { tool, source } of agentToolItems(agent)) {\n const serverName = mcpServerName(tool);\n if (serverName === undefined) {\n continue;\n }\n\n const definition = await tool.definition(\"\");\n const key = `${serverName}:${source}:${definition.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const tools = servers.get(serverName) ?? [];\n tools.push({\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n approval: approvalMetadata(tool),\n });\n servers.set(serverName, tools);\n }\n\n return [...servers.entries()]\n .map(([name, tools]) => {\n const sortedTools = tools.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 return {\n agentId: agent.id,\n name,\n toolCount: sortedTools.length,\n tools: sortedTools,\n };\n })\n .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(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 { 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 },\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 executePipelineRun(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 executePipelineRun(c, props, pipeline, replayRequest);\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): 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 };\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 return streamPipelineRun(c, streamOptions);\n }\n\n try {\n await appendPipelineLog(props.logStore, pipelineRunStartedLog(pipeline, runId));\n const output = await pipeline.pipeline.run(body.input, {\n observer: {\n async onEvent(event) {\n await appendPipelineLog(props.logStore, pipelineStageLog(pipeline.id, runId, event));\n },\n },\n });\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 }\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 },\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}): 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(props.input, {\n observer: {\n async onEvent(event: PipelineRunEvent) {\n const log = await appendPipelineLog(\n props.logStore,\n pipelineStageLog(props.pipeline.id, props.runId, event),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n },\n },\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 await run;\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 pipelineId: string,\n runId: string,\n event: PipelineRunEvent,\n): StudioPipelineLogAppendInput {\n const category = stageCategory(event.node);\n if (event.type === \"stage_started\") {\n return {\n pipelineId,\n 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,\n 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,\n 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 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","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport { createHook, type PromptHook } from \"@anvia/core/hooks\";\nimport { parseToolArgs } from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolQuestion,\n StudioToolQuestionAnswer,\n StudioToolQuestionChoice,\n StudioToolQuestionPrompt,\n StudioToolQuestionStatus,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString } from \"./query\";\nimport { isObject } from \"./type-guards\";\n\ntype PendingQuestion = StudioToolQuestion & {\n status: \"pending\";\n emit?: (event: AgentRunStreamEvent) => void;\n resolve: (answers: StudioToolQuestionAnswer[]) => void;\n};\n\ntype QuestionHookContext = {\n runId: string;\n agentId: string;\n sessionId?: string;\n metadata?: JsonObject;\n emit?: (event: AgentRunStreamEvent) => void;\n};\n\ntype QuestionRequest = {\n toolName: string;\n toolCallId?: string;\n internalCallId: string;\n args: string;\n questions: StudioToolQuestionPrompt[];\n};\n\nexport type QuestionRuntime = {\n questions: Map<string, PendingQuestion | StudioToolQuestion>;\n createHook(context: QuestionHookContext): PromptHook;\n list(options: QuestionListOptions): StudioToolQuestion[];\n cancelRun(runId: string): StudioToolQuestion[];\n answer(\n id: string,\n answers: StudioToolQuestionAnswer[],\n ): \"missing\" | \"resolved\" | StudioToolQuestion;\n};\n\ntype QuestionListOptions = {\n status?: \"pending\" | \"resolved\";\n runId?: string;\n agentId?: string;\n sessionId?: string;\n};\n\nexport function registerQuestionRoutes(app: Hono, questions: QuestionRuntime): void {\n app.get(\"/questions\", (c) => {\n const status = parseQuestionStatus(c.req.query(\"status\"));\n if (status === false) {\n return errorResponse(c, 400, \"bad_request\", \"status must be pending or resolved\");\n }\n\n const options: QuestionListOptions = {};\n const runId = optionalQueryString(c.req.query(\"runId\"));\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sessionId = optionalQueryString(c.req.query(\"sessionId\"));\n if (status !== undefined) {\n options.status = status;\n }\n if (runId !== undefined) {\n options.runId = runId;\n }\n if (agentId !== undefined) {\n options.agentId = agentId;\n }\n if (sessionId !== undefined) {\n options.sessionId = sessionId;\n }\n\n return c.json({ questions: questions.list(options) });\n });\n\n app.post(\"/questions/:questionId/answer\", async (c) => {\n const body = await parseQuestionAnswerRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const result = questions.answer(c.req.param(\"questionId\"), body.answers);\n if (result === \"missing\") {\n return errorResponse(c, 404, \"not_found\", \"Question not found\");\n }\n if (result === \"resolved\") {\n return errorResponse(c, 409, \"conflict\", \"Question is already answered\");\n }\n return c.json(result);\n });\n}\n\nfunction parseQuestionStatus(\n value: string | undefined,\n): \"pending\" | \"resolved\" | undefined | false {\n const status = optionalQueryString(value);\n if (status === undefined) {\n return undefined;\n }\n return status === \"pending\" || status === \"resolved\" ? status : false;\n}\n\nasync function parseQuestionAnswerRequest(\n c: Context,\n): Promise<{ answers: StudioToolQuestionAnswer[] } | { 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 (!Array.isArray(body.answers)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"answers must be an array\") };\n }\n\n const answers: StudioToolQuestionAnswer[] = [];\n for (const answer of body.answers) {\n if (!isObject(answer)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"answers must contain objects\") };\n }\n if (typeof answer.questionId !== \"string\" || answer.questionId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"questionId must be a string\") };\n }\n if (typeof answer.answer !== \"string\" || answer.answer.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"answer must be a string\") };\n }\n if (\"choice\" in answer && typeof answer.choice !== \"string\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"choice must be a string\") };\n }\n if (\"custom\" in answer && typeof answer.custom !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"custom must be a boolean\") };\n }\n const normalized: StudioToolQuestionAnswer = {\n questionId: answer.questionId.trim(),\n answer: answer.answer.trim(),\n };\n if (typeof answer.choice === \"string\") normalized.choice = answer.choice;\n if (typeof answer.custom === \"boolean\") normalized.custom = answer.custom;\n answers.push(normalized);\n }\n\n return { answers };\n}\n\nexport function createQuestionRuntime(): QuestionRuntime {\n const questions = new Map<string, PendingQuestion | StudioToolQuestion>();\n\n return {\n questions,\n createHook(context) {\n return createHook({\n async onToolCall({ toolName, toolCallId, internalCallId, args, tool: control }) {\n if (toolName !== \"ask_question\") {\n return control.run();\n }\n\n const prompts = normalizeQuestionPrompts(parseToolArgs(args));\n if (\"error\" in prompts) {\n return control.skip(prompts.error);\n }\n\n const request: QuestionRequest = {\n toolName,\n internalCallId,\n args,\n questions: prompts.questions,\n };\n if (toolCallId !== undefined) request.toolCallId = toolCallId;\n const answers = await requestQuestion(questions, context, request);\n\n return control.skip(JSON.stringify({ answers }));\n },\n });\n },\n list(options) {\n return [...questions.values()]\n .filter((question) => {\n if (options.status === \"pending\" && question.status !== \"pending\") {\n return false;\n }\n if (options.status === \"resolved\" && question.status === \"pending\") {\n return false;\n }\n if (options.runId !== undefined && question.runId !== options.runId) {\n return false;\n }\n if (options.agentId !== undefined && question.agentId !== options.agentId) {\n return false;\n }\n if (options.sessionId !== undefined && question.sessionId !== options.sessionId) {\n return false;\n }\n return true;\n })\n .map(publicQuestion);\n },\n cancelRun(runId) {\n const cancelled: StudioToolQuestion[] = [];\n for (const question of questions.values()) {\n if (!isPendingQuestion(question) || question.runId !== runId) {\n continue;\n }\n const resolved = cancelQuestion(question);\n questions.set(question.id, resolved);\n question.emit?.({ type: \"tool_question_result\", question: resolved });\n question.resolve([]);\n cancelled.push(resolved);\n }\n return cancelled;\n },\n answer(id, answers) {\n const question = questions.get(id);\n if (question === undefined) {\n return \"missing\";\n }\n if (!isPendingQuestion(question)) {\n return \"resolved\";\n }\n\n const resolved = resolveQuestion(question, answers);\n questions.set(id, resolved);\n question.emit?.({ type: \"tool_question_result\", question: resolved });\n question.resolve(answers);\n return publicQuestion(resolved);\n },\n };\n}\n\nasync function requestQuestion(\n questions: Map<string, PendingQuestion | StudioToolQuestion>,\n context: QuestionHookContext,\n request: QuestionRequest,\n): Promise<StudioToolQuestionAnswer[]> {\n const id = globalThis.crypto.randomUUID();\n const question: PendingQuestion = {\n id,\n runId: context.runId,\n agentId: context.agentId,\n toolName: request.toolName,\n internalCallId: request.internalCallId,\n args: request.args,\n questions: request.questions,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n resolve: () => {},\n };\n if (context.sessionId !== undefined) question.sessionId = context.sessionId;\n if (request.toolCallId !== undefined) question.callId = request.toolCallId;\n if (context.emit !== undefined) question.emit = context.emit;\n\n const answer = new Promise<StudioToolQuestionAnswer[]>((resolve) => {\n question.resolve = (answers) => {\n resolve(answers);\n };\n });\n\n questions.set(id, question);\n context.emit?.({ type: \"tool_question_request\", question: publicQuestion(question) });\n return answer;\n}\n\nfunction normalizeQuestionPrompts(\n args: JsonValue,\n): { questions: StudioToolQuestionPrompt[] } | { error: string } {\n if (!isObject(args)) {\n return { error: \"ask_question requires a JSON object with questions.\" };\n }\n\n const rawQuestions = Array.isArray(args.questions) ? args.questions : [args];\n if (rawQuestions.length === 0) {\n return { error: \"ask_question requires at least one question.\" };\n }\n\n const questions: StudioToolQuestionPrompt[] = [];\n for (const [index, question] of rawQuestions.entries()) {\n const normalized = normalizeQuestionPrompt(question, index);\n if (normalized === undefined) {\n return {\n error: \"ask_question requires every question to include text and at least one choice.\",\n };\n }\n questions.push(normalized);\n }\n return { questions };\n}\n\nfunction normalizeQuestionPrompt(\n value: unknown,\n index: number,\n): StudioToolQuestionPrompt | undefined {\n if (\n !isObject(value) ||\n typeof value.question !== \"string\" ||\n value.question.trim().length === 0\n ) {\n return undefined;\n }\n\n const choices = Array.isArray(value.choices)\n ? value.choices\n .map(normalizeQuestionChoice)\n .filter((choice): choice is StudioToolQuestionChoice => choice !== undefined)\n : [];\n if (choices.length === 0) {\n return undefined;\n }\n\n return {\n id:\n typeof value.id === \"string\" && value.id.trim().length > 0\n ? value.id.trim()\n : `question_${index + 1}`,\n question: value.question.trim(),\n choices,\n };\n}\n\nfunction normalizeQuestionChoice(value: unknown): StudioToolQuestionChoice | undefined {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { label: value.trim(), value: value.trim() };\n }\n if (!isObject(value) || typeof value.label !== \"string\" || value.label.trim().length === 0) {\n return undefined;\n }\n return {\n label: value.label.trim(),\n value:\n typeof value.value === \"string\" && value.value.trim().length > 0\n ? value.value.trim()\n : value.label.trim(),\n };\n}\n\nfunction isPendingQuestion(\n question: PendingQuestion | StudioToolQuestion | undefined,\n): question is PendingQuestion {\n return question !== undefined && question.status === \"pending\" && \"resolve\" in question;\n}\n\nfunction resolveQuestion(\n question: PendingQuestion | StudioToolQuestion,\n answers: StudioToolQuestionAnswer[],\n): StudioToolQuestion {\n return publicQuestion({\n ...question,\n status: \"answered\" satisfies StudioToolQuestionStatus,\n answeredAt: new Date().toISOString(),\n answers,\n });\n}\n\nfunction cancelQuestion(question: PendingQuestion | StudioToolQuestion): StudioToolQuestion {\n return publicQuestion({\n ...question,\n status: \"cancelled\" satisfies StudioToolQuestionStatus,\n cancelledAt: new Date().toISOString(),\n });\n}\n\nfunction publicQuestion(question: PendingQuestion | StudioToolQuestion): StudioToolQuestion {\n const { emit, resolve, ...rest } = question as PendingQuestion;\n void emit;\n void resolve;\n return rest;\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 StudioSandboxProcess,\n StudioSandboxProcessLogsResponse,\n StudioSandboxProcessStatus,\n StudioSandboxSummary,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { agentToolItems } from \"./tool-metadata\";\n\nconst sandboxToolMetadataKey = Symbol.for(\"anvia.sandbox.tool.metadata\");\nconst maxFileResponseBytes = 10 * 1024 * 1024;\nconst defaultProcessLogBytes = 64 * 1024;\nconst maxProcessLogBytes = 1024 * 1024;\n\ntype SandboxSessionLike = {\n readonly id: string;\n readonly provider: string;\n readonly workdir: string;\n readonly publishedPorts?: unknown;\n listFiles(path?: string): Promise<unknown>;\n readFile(path: string): Promise<unknown>;\n listProcesses?: () => Promise<unknown>;\n readProcessLogs?: (processId: string, options?: { tailBytes?: number }) => Promise<unknown>;\n};\n\ntype SandboxRegistryEntry = {\n session: SandboxSessionLike;\n summary: StudioSandboxSummary;\n};\n\ntype SandboxRegistryDraft = {\n session: SandboxSessionLike;\n agentIds: Set<string>;\n toolNames: Set<string>;\n};\n\nexport class StudioSandboxRegistry {\n private readonly entries: Map<string, SandboxRegistryEntry>;\n\n constructor(entries: SandboxRegistryEntry[]) {\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): SandboxRegistryEntry | undefined {\n return this.entries.get(ref);\n }\n}\n\nexport function createStudioSandboxRegistry(agents: StudioAgent[]): StudioSandboxRegistry {\n const drafts = new Map<SandboxSessionLike, SandboxRegistryDraft>();\n\n for (const agent of agents) {\n for (const { tool } of agentToolItems(agent)) {\n const session = sandboxSessionFromTool(tool);\n if (session === undefined) {\n continue;\n }\n\n const draft = drafts.get(session) ?? {\n session,\n agentIds: new Set<string>(),\n toolNames: new Set<string>(),\n };\n draft.agentIds.add(agent.id);\n draft.toolNames.add(tool.name);\n drafts.set(session, draft);\n }\n }\n\n const refCounts = new Map<string, number>();\n const entries = [...drafts.values()]\n .sort((left, right) =>\n `${left.session.provider}\\0${left.session.id}`.localeCompare(\n `${right.session.provider}\\0${right.session.id}`,\n ),\n )\n .map((draft): SandboxRegistryEntry => {\n const baseRef = sandboxRef(draft.session.provider, draft.session.id);\n const occurrence = (refCounts.get(baseRef) ?? 0) + 1;\n refCounts.set(baseRef, occurrence);\n const ref = occurrence === 1 ? baseRef : `${baseRef}.${occurrence}`;\n return {\n session: draft.session,\n summary: {\n ref,\n id: draft.session.id,\n provider: draft.session.provider,\n workdir: draft.session.workdir,\n agentIds: [...draft.agentIds].sort(),\n toolNames: [...draft.toolNames].sort(),\n capabilities: {\n files: true,\n ports: supportsPorts(draft.session),\n processes: supportsProcesses(draft.session),\n },\n },\n };\n });\n\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 if (entry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n return 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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n\n try {\n const requestedPath = c.req.query(\"path\") ?? \".\";\n const normalizedPath = normalizeSandboxPath(requestedPath, true);\n const entries = await listSandboxFiles(entry.session, normalizedPath);\n return c.json({\n sandboxRef: entry.summary.ref,\n path: normalizedPath,\n entries,\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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n\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\n const normalizedPath = normalizeSandboxPath(requestedPath, false);\n const parentPath = path.posix.dirname(normalizedPath);\n const siblings = await listSandboxFiles(entry.session, parentPath);\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 }\n\n const rawBytes = await entry.session.readFile(normalizedPath);\n if (!(rawBytes instanceof Uint8Array)) {\n throw new TypeError(\"Sandbox readFile returned an invalid byte payload\");\n }\n if (rawBytes.byteLength > maxFileResponseBytes) {\n throw fileTooLarge(rawBytes.byteLength);\n }\n\n const bytes = new Uint8Array(rawBytes.byteLength);\n bytes.set(rawBytes);\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\": String(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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n if (!supportsPorts(entry.session)) {\n return unsupportedSandboxOperation(c, \"ports\");\n }\n\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n ports: normalizePorts(entry.session.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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n if (!supportsProcesses(entry.session)) {\n return unsupportedSandboxOperation(c, \"processes\");\n }\n\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n processes: normalizeProcesses(await entry.session.listProcesses()),\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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n if (!supportsProcesses(entry.session)) {\n return unsupportedSandboxOperation(c, \"processes.logs\");\n }\n\n try {\n const tailBytes = parseTailBytes(c.req.query(\"tailBytes\"));\n const processId = c.req.param(\"processId\");\n const processes = normalizeProcesses(await entry.session.listProcesses());\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.session.readProcessLogs(processId, { tailBytes }),\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 sandboxSessionFromTool(tool: object): SandboxSessionLike | undefined {\n const metadata = (tool as { [sandboxToolMetadataKey]?: unknown })[sandboxToolMetadataKey];\n if (!isRecord(metadata)) {\n return undefined;\n }\n return isSandboxSession(metadata.session) ? metadata.session : undefined;\n}\n\nfunction isSandboxSession(value: unknown): value is SandboxSessionLike {\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 typeof value.listFiles === \"function\" &&\n typeof value.readFile === \"function\"\n );\n}\n\nfunction supportsPorts(session: SandboxSessionLike): boolean {\n return Array.isArray(session.publishedPorts);\n}\n\nfunction supportsProcesses(\n session: SandboxSessionLike,\n): session is SandboxSessionLike &\n Required<Pick<SandboxSessionLike, \"listProcesses\" | \"readProcessLogs\">> {\n return (\n typeof session.listProcesses === \"function\" && typeof session.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 capabilities: { ...summary.capabilities },\n };\n}\n\nasync function listSandboxFiles(\n session: SandboxSessionLike,\n filePath: string,\n): Promise<StudioSandboxFileEntry[]> {\n return normalizeFileEntries(await session.listFiles(filePath)).sort((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\nfunction normalizeFileEntries(value: unknown): StudioSandboxFileEntry[] {\n if (!Array.isArray(value)) {\n throw new TypeError(\"Sandbox listFiles returned an invalid payload\");\n }\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 (typeof item.size !== \"number\" || !Number.isFinite(item.size) || item.size < 0) {\n throw new TypeError(\"Sandbox listFiles returned an invalid file size\");\n }\n entry.size = item.size;\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 }\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 }\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 typeof value.stdout !== \"string\" ||\n typeof value.stderr !== \"string\" ||\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 = boundedLogText(value.stdout, maxBytes);\n const stderr = boundedLogText(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 boundedLogText(value: string, maxBytes: number): { text: string; truncated: boolean } {\n const bytes = new TextEncoder().encode(value);\n if (bytes.byteLength <= maxBytes) {\n return { text: value, truncated: false };\n }\n if (maxBytes === 0) {\n return { text: \"\", truncated: true };\n }\n\n let start = bytes.byteLength - maxBytes;\n while (start < bytes.byteLength && (bytes[start] ?? 0) >> 6 === 2) {\n start += 1;\n }\n return {\n text: new TextDecoder().decode(bytes.subarray(start)),\n truncated: true,\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) {\n return defaultProcessLogBytes;\n }\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 name = errorName(error);\n if (name === \"SandboxPathError\") {\n return errorResponse(c, 400, \"bad_request\", errorMessage(error));\n }\n if (name === \"SandboxFileSizeError\") {\n return errorResponse(c, 413, \"payload_too_large\", errorMessage(error));\n }\n if (name === \"SandboxSessionDestroyedError\") {\n return errorResponse(c, 409, \"conflict\", \"Sandbox session 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 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;\n}\n\nfunction errorName(error: unknown): string {\n return isRecord(error) && typeof error.name === \"string\" ? error.name : \"\";\n}\n\nfunction errorMessage(error: unknown): string {\n return isRecord(error) && typeof error.message === \"string\" ? error.message : String(error);\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 { MemoryAppendInput, MemoryContext, MemoryErrorInput } 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 runs: Array<StudioSessionRunTranscriptInput & { createdAt: string; updatedAt: string }>;\n logs: StudioSessionLogEntry[];\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 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 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(context: MemoryContext): Promise<Message[]> {\n return Promise.resolve(this.sessions.get(context.sessionId)?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): Promise<void> {\n const session = this.sessions.get(input.context.sessionId);\n if (session !== undefined) {\n session.messages.push(...input.messages);\n session.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n clear(context: MemoryContext): Promise<void> {\n const session = this.sessions.get(context.sessionId);\n if (session !== undefined) {\n session.messages = [];\n session.runs = [];\n session.messageCount = 0;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n async recordError(input: MemoryErrorInput): Promise<void> {\n await this.saveSessionRunTranscript({\n id: input.context.sessionId,\n runId: studioRunId(input.context) ?? input.runId,\n transcript: transcriptFromMessages(input.messages),\n status: \"error\",\n error: serializeJsonError(input.error),\n });\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: [...session.messages],\n transcript: renumberTranscript(session.runs.flatMap((run) => run.transcript)),\n };\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(context: MemoryContext): string | undefined {\n const value = context.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 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 { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\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 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 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(context: MemoryContext): Promise<Message[]> {\n const session = this.getSession(context.sessionId);\n return Promise.resolve(session?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): 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.context.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.context.sessionId);\n\n this.insertMessages(input.context.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.context.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(context: MemoryContext): 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 updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: context.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_messages WHERE session_id = $id\").run({\n $id: context.sessionId,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({\n $id: context.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: MemoryErrorInput): Promise<void> {\n const runId = studioRunId(input.context) ?? input.runId;\n const existing = this.getSessionRun(input.context.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.context.sessionId,\n runId,\n transcript,\n status: \"error\",\n error: serializeJsonError(input.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 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 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 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 const db = this.database();\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 ORDER BY message_index ASC`,\n )\n .all({ $sessionId: sessionId }) 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 ORDER BY message_index ASC, part_index ASC`,\n )\n .all({ $sessionId: sessionId }) 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 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 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<JsonValue>(row.metadata_json);\n if (metadata !== undefined && !isJsonValue(metadata)) {\n throw new TypeError(\"Stored Studio message metadata is not a strict JSON value.\");\n }\n if (row.role === \"system\") {\n const message: Extract<Message, { role: \"system\" }> = {\n role: \"system\",\n content: systemContentFromParts(parts),\n };\n if (metadata !== undefined) message.metadata = metadata;\n return message;\n }\n if (row.role === \"user\") {\n const message: Extract<Message, { role: \"user\" }> = {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n if (metadata !== undefined) message.metadata = metadata;\n return message;\n }\n if (row.role === \"assistant\") {\n const 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.id = row.message_id;\n if (metadata !== undefined) message.metadata = metadata;\n return message;\n }\n if (row.role === \"tool\") {\n const message: Extract<Message, { role: \"tool\" }> = {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\n if (metadata !== undefined) message.metadata = 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 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 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(context: MemoryContext): string | undefined {\n const value = context.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"],"mappings":"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","names":["Agent","path","config","resolve","appendSessionLog","appendPipelineLog","resolve","durationMs","byteLength","durationMs","resolve","decision","isRecord","toJsonValue","isRecord","byteLength","createHook","createHook","resolve","process","isRecord","run","resolve","Agent","isJsonValue","path","studioRunId","serializeJsonError","isJsonValue"]}
1
+ {"version":3,"sources":["../src/runtime/studio.ts","../src/runtime/json.ts","../src/traces/trace-observer.ts","../src/ui/routes.tsx","../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/transcript.ts","../src/runtime/runs.ts","../src/runtime/session-logs.ts","../src/runtime/query.ts","../src/runtime/approvals.ts","../src/runtime/eval-config.ts","../src/runtime/tool-metadata.ts","../src/runtime/config.ts","../src/runtime/evals.ts","../src/runtime/knowledge.ts","../src/runtime/mcps.ts","../src/runtime/memory.ts","../src/runtime/pipelines.ts","../src/runtime/pipeline-logs.ts","../src/runtime/questions.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"],"sourcesContent":["import type { JsonObject } from \"@anvia/core/completion\";\nimport { Agent } from \"@anvia/core/internal/agent\";\nimport { Pipeline } from \"@anvia/core/pipeline\";\nimport { serve } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { Hono as HonoApp } from \"hono\";\nimport { StudioTraceObserver } from \"../traces/trace-observer\";\nimport type {\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioPipeline,\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 { registerAgentRunRoute } from \"./agent-runs\";\nimport { cloneAgent } from \"./agent-utils\";\nimport { createApprovalRuntime, registerApprovalRoutes } from \"./approvals\";\nimport {\n agentConfig,\n agentRuntimeSummary,\n buildConfig,\n runnerId,\n unsupportedCapabilities,\n} from \"./config\";\nimport { registerEvalRoutes } from \"./evals\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\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 { createQuestionRuntime, registerQuestionRoutes } from \"./questions\";\nimport { createStudioSandboxRegistry, registerSandboxRoutes } from \"./sandboxes\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport { normalizeAgents, normalizePipelines, resolveStores } from \"./shared\";\nimport { registerStatusRoutes } from \"./status\";\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 sigintHandler: (() => 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\n const port = serveOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n const serverOptions: Parameters<typeof serve>[0] = {\n fetch: (request) => this.fetch(request),\n port,\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 this.sigintHandler = () => {\n this.close();\n process.exit(0);\n };\n process.once(\"SIGINT\", this.sigintHandler);\n }\n\n return this;\n }\n\n async serve(serveOptions: StudioServeLifecycleOptions = {}): Promise<void> {\n const { onShutdown, signal, ...startOptions } = serveOptions;\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 } finally {\n this.close();\n await onShutdown?.();\n }\n }\n\n close(): void {\n if (this.sigintHandler !== undefined) {\n process.off(\"SIGINT\", this.sigintHandler);\n this.sigintHandler = undefined;\n }\n this.server?.close();\n this.server = undefined;\n this.studio.close();\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\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 // biome-ignore lint/suspicious/noExplicitAny: 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 };\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 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// biome-ignore lint/suspicious/noExplicitAny: 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: agent.staticContext.length,\n dynamicContextCount: agent.dynamicContexts.length,\n dynamicToolCount: agent.dynamicTools.length,\n hasOutputSchema: agent.outputSchema !== undefined,\n hasHook: agent.hook !== undefined,\n observerCount: agent.observers.length,\n approvalToolCount: agent.toolSet.values().filter((tool) => tool.approval !== undefined).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 approvalRuntime = createApprovalRuntime();\n const questionRuntime = createQuestionRuntime();\n const sandboxRegistry = createStudioSandboxRegistry(agents);\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 registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\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 };\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 approvalRuntime,\n questionRuntime,\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 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 };\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 || hasStudioTraceObserver(studioAgent.agent)) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n observers: [\n ...studioAgent.agent.observers,\n { observer: new StudioTraceObserver({ store: traceStore }) },\n ],\n }),\n };\n}\n\nfunction hasStudioTraceObserver(agent: Agent): boolean {\n return agent.observers.some(\n (registration) => registration.observer instanceof StudioTraceObserver,\n );\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 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} 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 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 await this.save(\"success\", {\n endedAt: new Date(),\n output: args.output,\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n async error(args: AgentRunErrorArgs): Promise<void> {\n await this.save(\"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 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 const trace: StudioTrace = {\n id: this.props.id,\n sessionId,\n status,\n trace: 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 toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const callId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n const start: (typeof this.toolStarts)[number] = {\n startedAt: new Date(),\n agentId,\n childTurn,\n toolName,\n input: toJsonValue(toolCallFunction?.arguments ?? {}),\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 this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.error`,\n status: \"error\",\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 : \"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 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 effectiveModel =\n request.model ?? stringValue(rawResponse?.model) ?? args.modelInfo?.defaultModel ?? \"default\";\n const providerResponse = providerResponseSummary(rawResponse);\n const usage = response?.usage;\n\n return compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\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 toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n firstDeltaMs: endArgs?.firstDeltaMs,\n providerResponse,\n modelInfo: compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\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 model: request.model,\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 toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).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 hasAdditionalParams: args.toolCall.additionalParams !== 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 hasAdditionalParams: args.toolCall.additionalParams !== 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 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 { 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}/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}/evals`, (c) => redirectWithQuery(c, \"/evals\"));\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(\"/sandboxes\", shellWhenHtml(renderShell));\n app.get(\"/sandboxes/:sandboxRef\", shellWhenHtml(renderShell));\n app.get(\"/evals\", 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\" class=\"dark\">',\n \"<head>\",\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n `<title>${title}</title>`,\n '<script>(()=>{try{if(localStorage.getItem(\"anvia-studio-theme\")===\"light\"){document.documentElement.classList.remove(\"dark\")}}catch{}})();</script>',\n `<link rel=\"icon\" type=\"image/png\" href=\"${escapeHtml(props.compatUiPath)}/assets/anvia.png\">`,\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(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n","import { type Message as CoreMessage, type JsonObject, Message } from \"@anvia/core/completion\";\nimport type { Agent } from \"@anvia/core/internal/agent\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n StudioAgent,\n StudioSession,\n StudioSessionStore,\n} from \"../types\";\nimport { cloneAgent, composeHooks } from \"./agent-utils\";\nimport type { createApprovalRuntime } from \"./approvals\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse, unsupportedCapability } from \"./http\";\nimport {\n type createStudioModelRegistry,\n ModelSelectionError,\n resolveStudioModel,\n STUDIO_MODEL_METADATA_KEY,\n sessionModelRef,\n} from \"./models\";\nimport { rawObservedStore } from \"./observability\";\nimport type { ResolvedStores } from \"./options\";\nimport type { createQuestionRuntime } from \"./questions\";\nimport {\n AsyncEventQueue,\n assignTranscriptRunDuration,\n createPersistedStreamingSessionTranscript,\n mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\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 approvalRuntime: ReturnType<typeof createApprovalRuntime>;\n questionRuntime: ReturnType<typeof createQuestionRuntime>;\n};\n\ntype SelectedModel = ReturnType<typeof resolveStudioModel>;\ntype RunRequest = ReturnType<Agent[\"prompt\"]>;\n\ntype PreparedAgentRun = {\n agentId: string;\n agent: StudioAgent;\n body: AgentRunRequest;\n memoryMetadata: JsonObject;\n request: RunRequest;\n runAgent: Agent;\n runId: string;\n runStartedAt: number;\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 prepared = await prepareAgentRun(c, props);\n if (prepared instanceof Response) {\n return prepared;\n }\n\n if (prepared.body.stream === true) {\n return handleStreamingAgentRun(c, prepared, props);\n }\n return handleBufferedAgentRun(c, prepared, props);\n}\n\nasync function prepareAgentRun(\n c: Context,\n props: AgentRunRouteProps,\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 const session = await resolveRunSession(c, body, agentId, props.stores);\n if (session instanceof Response) {\n return session;\n }\n\n const selectedModel = selectRunModel(c, props, agent, body, session);\n if (selectedModel instanceof Response) {\n return selectedModel;\n }\n const runAgent =\n selectedModel.model === undefined\n ? agent.agent\n : cloneAgent(agent.agent, { model: selectedModel.model });\n const runId = globalThis.crypto.randomUUID();\n const runStartedAt = Date.now();\n\n await recordRunReceived({\n agentId,\n body,\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n await recordSelectedModelWarnings({\n runId,\n selectedModel,\n session,\n store: props.stores.sessions,\n });\n\n const memoryMetadata = runMemoryMetadata(agentId, body, selectedModel, runId);\n const promptMessage = normalizePromptMessage(body.message);\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 context: { sessionId: session.id, metadata: memoryMetadata },\n runId,\n turn: 1,\n messages: [promptMessage],\n });\n }\n\n const request = createRunRequest({\n agentId,\n body,\n memoryMetadata,\n promptMessage,\n runAgent,\n session,\n });\n\n return {\n agentId,\n agent,\n body,\n memoryMetadata,\n request,\n runAgent,\n runId,\n runStartedAt,\n selectedModel,\n session,\n sessionStore,\n shouldPersistSessionMessages,\n };\n}\n\nasync function resolveRunSession(\n c: Context,\n body: AgentRunRequest,\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: AgentRunRequest,\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: AgentRunRequest;\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.message,\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 (props.body.metadata !== undefined || props.selectedModel.ref !== undefined) {\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 input.metadata = metadata;\n }\n await appendSessionLog(props.store, runReceivedLog(input));\n}\n\nasync function recordSelectedModelWarnings(props: {\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 (sessionModelRef(props.session.metadata) !== props.selectedModel.ref) {\n const metadata: JsonObject = {};\n Object.assign(metadata, props.session.metadata);\n metadata[STUDIO_MODEL_METADATA_KEY] = props.selectedModel.ref;\n await props.store?.updateSessionMetadata?.(props.session.id, metadata);\n }\n}\n\nfunction runMemoryMetadata(\n agentId: string,\n body: AgentRunRequest,\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 metadata.studioRunId = runId;\n return metadata;\n}\n\nfunction createRunRequest(props: {\n agentId: string;\n body: AgentRunRequest;\n memoryMetadata: JsonObject;\n promptMessage: CoreMessage;\n runAgent: Agent;\n session: StudioSession | undefined;\n}): RunRequest {\n const request =\n props.session !== undefined\n ? props.runAgent.memory === undefined\n ? props.runAgent.prompt([...props.session.messages, props.promptMessage])\n : props.runAgent\n .session(props.session.id, { metadata: props.memoryMetadata })\n .prompt(props.body.message)\n : props.runAgent.prompt(\n props.body.history !== undefined\n ? [...props.body.history, props.promptMessage]\n : props.body.message,\n );\n request.withCompletionRetries();\n if (props.body.maxTurns !== undefined) {\n request.maxTurns(props.body.maxTurns);\n }\n if (props.body.toolConcurrency !== undefined) {\n request.withToolConcurrency(props.body.toolConcurrency);\n }\n if (props.body.trace !== undefined) {\n request.withTrace(traceForRun(props.body.trace, props.agentId, props.session));\n } else if (props.session !== undefined) {\n request.withTrace(traceForRun(undefined, props.agentId, props.session));\n }\n return request;\n}\n\nfunction handleStreamingAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Response {\n const runtimeEvents = new AsyncEventQueue<AgentRunStreamEvent>();\n const approvalContext: Parameters<typeof props.approvalRuntime.createApprovals>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n emit: (event) => runtimeEvents.push(event),\n };\n if (run.session !== undefined) approvalContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) approvalContext.metadata = run.body.metadata;\n run.request.approvals(props.approvalRuntime.createApprovals(approvalContext));\n const questionContext: Parameters<typeof props.questionRuntime.createHook>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n emit: (event) => runtimeEvents.push(event),\n };\n if (run.session !== undefined) questionContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) questionContext.metadata = run.body.metadata;\n const effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook(questionContext),\n );\n if (effectiveHook !== undefined) {\n run.request.withHook(effectiveHook);\n }\n\n const runStream = mergeRunAndApprovalEvents(run.request.stream(), runtimeEvents);\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.message,\n runId: run.runId,\n startedAt: run.runStartedAt,\n persistGeneratedMessages: run.shouldPersistSessionMessages,\n });\n stream = persistedRun.events;\n }\n\n return streamAgentRunEvents(c, stream, {\n onCancel: async () => {\n props.approvalRuntime.cancelRun(run.runId);\n props.questionRuntime.cancelRun(run.runId);\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 handleBufferedAgentRun(\n c: Context,\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Promise<Response> {\n try {\n await startBufferedSessionRun(run, props);\n const response = await run.request.send();\n await completeBufferedSessionRun(run, response);\n return c.json(response);\n } catch (error) {\n await failBufferedSessionRun(run, error);\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n}\n\nasync function startBufferedSessionRun(\n run: PreparedAgentRun,\n props: AgentRunRouteProps,\n): Promise<void> {\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 questionContext: Parameters<typeof props.questionRuntime.createHook>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n };\n if (run.session !== undefined) questionContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) questionContext.metadata = run.body.metadata;\n const effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook(questionContext),\n );\n const approvalContext: Parameters<typeof props.approvalRuntime.createApprovals>[0] = {\n runId: run.runId,\n agentId: run.agentId,\n };\n if (run.session !== undefined) approvalContext.sessionId = run.session.id;\n if (run.body.metadata !== undefined) approvalContext.metadata = run.body.metadata;\n run.request.approvals(props.approvalRuntime.createApprovals(approvalContext));\n if (effectiveHook !== undefined) {\n run.request.withHook(effectiveHook);\n }\n}\n\nasync function completeBufferedSessionRun(\n run: PreparedAgentRun,\n response: Awaited<ReturnType<RunRequest[\"send\"]>>,\n): Promise<void> {\n if (run.session === undefined || run.sessionStore === undefined) {\n return;\n }\n if (run.shouldPersistSessionMessages) {\n const generatedMessages = response.messages.slice(1);\n if (generatedMessages.length > 0) {\n await run.sessionStore.append({\n context: { 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.message),\n transcript,\n status: \"success\",\n });\n await appendSessionLog(\n run.sessionStore,\n runCompletedLog({\n sessionId: run.session.id,\n runId: run.runId,\n durationMs,\n usage: response.usage,\n output: response.output,\n messageCount: response.messages.length,\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 messages = await run.sessionStore.load({\n sessionId: run.session.id,\n metadata: run.memoryMetadata,\n });\n const durationMs = Date.now() - run.runStartedAt;\n const transcript = transcriptFromMessages(messages.slice(run.session.messageCount));\n assignTranscriptRunDuration(transcript, durationMs);\n await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.message),\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 normalizePromptMessage(message: string | CoreMessage): CoreMessage {\n return typeof message === \"string\" ? Message.user(message) : message;\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 createHook,\n type HookAction,\n type PromptHook,\n type ToolCallHookAction,\n} from \"@anvia/core/hooks\";\nimport { Agent } from \"@anvia/core/internal/agent\";\n\nexport function cloneAgent(\n agent: Agent,\n overrides: Partial<ConstructorParameters<typeof Agent>[0]> = {},\n): Agent {\n return new Agent({\n id: agent.id,\n name: agent.name,\n description: agent.description,\n model: agent.model,\n instructions: agent.instructions,\n staticContext: agent.staticContext,\n temperature: agent.temperature,\n maxTokens: agent.maxTokens,\n additionalParams: agent.additionalParams,\n toolSet: agent.toolSet,\n toolChoice: agent.toolChoice,\n defaultMaxTurns: agent.defaultMaxTurns,\n hook: agent.hook,\n outputSchema: agent.outputSchema,\n observers: agent.observers,\n approvals: agent.approvals,\n dynamicContexts: agent.dynamicContexts,\n dynamicTools: agent.dynamicTools,\n middlewares: agent.middlewares,\n memory: agent.memory,\n eventStore: agent.eventStore,\n ...overrides,\n });\n}\n\nexport function composeHooks(\n first: PromptHook | undefined,\n second: PromptHook | undefined,\n): PromptHook | undefined {\n if (first === undefined) {\n return second;\n }\n if (second === undefined) {\n return first;\n }\n\n return createHook({\n async onCompletionCall(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionCall?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionCall?.(args)) ?? undefined);\n },\n async onCompletionResponse(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionResponse?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionResponse?.(args)) ?? undefined);\n },\n async onToolCall(args): Promise<ToolCallHookAction | undefined> {\n const firstAction = await first.onToolCall?.(args);\n if (\n firstAction?.type === \"skip\" ||\n firstAction?.type === \"terminate\" ||\n firstAction?.type === \"approval_request\"\n ) {\n return firstAction;\n }\n const secondAction = await second.onToolCall?.(args);\n return secondAction ?? firstAction ?? undefined;\n },\n async onToolResult(args): Promise<HookAction | undefined> {\n const firstAction = await first.onToolResult?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onToolResult?.(args)) ?? undefined);\n },\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 type JsonObject,\n type JsonValue,\n type Message,\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 function isMessageInput(value: unknown): value is string | Message {\n return typeof value === \"string\" || isMessage(value);\n}\n\nexport function isMessage(value: unknown): value is Message {\n if (!isObject(value) || typeof value.role !== \"string\") {\n return false;\n }\n if (value.role === \"system\") {\n return typeof value.content === \"string\";\n }\n if (value.role === \"user\" || value.role === \"assistant\" || value.role === \"tool\") {\n return Array.isArray(value.content);\n }\n return false;\n}\n\nexport function isAgentTraceOptions(value: unknown): value is AgentTraceOptions {\n if (!isObject(value)) {\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 optionalBoolean(value.failOnObserverError) &&\n optionalStringArray(value.tags) &&\n optionalObject(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 optionalBoolean(value: unknown): boolean {\n return value === undefined || typeof value === \"boolean\";\n}\n\nfunction optionalStringArray(value: unknown): boolean {\n return (\n value === undefined || (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n\nfunction optionalObject(value: unknown): boolean {\n return value === undefined || isObject(value);\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 | 404 | 409 | 413 | 500 | 501,\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 type { CompletionModel, JsonObject, Message } 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\";\n\ntype RuntimeProvider = StudioModelProvider & {\n staticModels: Map<string, StudioModelDefinition>;\n};\n\nexport type StudioModelRegistry = {\n readonly defaultModel?: string;\n readonly providers: Map<string, RuntimeProvider>;\n readonly agentPolicies: Map<string, NormalizedAgentModelPolicy>;\n readonly modelCache: Map<string, CompletionModel>;\n};\n\ntype NormalizedAgentModelPolicy = {\n default?: 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.defaultModel !== undefined) {\n runtimeProvider.defaultModel = normalizeModelId(provider.defaultModel);\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.default !== undefined) {\n Object.assign(registry, { defaultModel: normalizeModelRef(config.default) });\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 modelSummary(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.defaultModel !== undefined) config.defaultModel = provider.defaultModel;\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.defaultModel !== undefined) config.default = registry.defaultModel;\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 if (props.registry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Model registry not configured\");\n }\n const providers = await Promise.all(\n [...props.registry.providers.values()].map((provider) => providerCatalog(provider)),\n );\n const response: { providers: StudioModelProviderConfig[]; defaultModel?: string } = {\n providers,\n };\n if (props.registry.defaultModel !== undefined) {\n response.defaultModel = props.registry.defaultModel;\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(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)?.default ??\n registry.defaultModel;\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 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 normalizeOptionalModelRef(ref: StudioModelRef | undefined): string | undefined {\n return ref === undefined ? undefined : normalizeModelRef(ref);\n}\n\nexport function normalizeModelRef(ref: StudioModelRef): string {\n if (typeof ref === \"string\") {\n const trimmed = ref.trim();\n const parsed = parseModelRef(trimmed);\n return `${parsed.providerId}:${parsed.modelId}`;\n }\n return `${normalizeProviderId(ref.provider)}:${normalizeModelId(ref.model)}`;\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([...registry.providers.values()].map(providerCatalog));\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(provider, modelId, {\n id: modelId,\n }),\n ];\n } catch {\n return [];\n }\n });\n\n const defaultModel = policy?.default ?? registry.defaultModel;\n const summary: StudioAgentModelsSummary = {\n agentId: agent.id,\n models: [...models, ...exactPolicyModels],\n };\n if (defaultModel !== undefined) summary.defaultModel = defaultModel;\n if (warnings.length > 0) summary.warnings = warnings;\n return summary;\n}\n\nasync function providerCatalog(provider: RuntimeProvider): Promise<StudioModelProviderConfig> {\n const models = new Map<string, StudioModelSummary>();\n for (const model of provider.staticModels.values()) {\n models.set(model.id, modelSummary(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(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.defaultModel !== undefined) catalog.defaultModel = provider.defaultModel;\n if (provider.metadata !== undefined) catalog.metadata = provider.metadata;\n if (warning !== undefined) catalog.warning = warning;\n return catalog;\n}\n\nfunction modelSummary(\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 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.default !== undefined) normalized.default = normalizeModelRef(policy.default);\n if (policy.allowed !== undefined) {\n normalized.allowed = policy.allowed.map((entry) =>\n typeof entry === \"string\" && entry.trim().endsWith(\":*\")\n ? `${normalizeProviderId(entry.trim().slice(0, -2))}:*`\n : normalizeModelRef(entry),\n );\n }\n return [agentId.trim(), normalized];\n }),\n );\n}\n\nfunction publicPolicy(policy: NormalizedAgentModelPolicy): StudioAgentModelPolicyConfig {\n const config: StudioAgentModelPolicyConfig = {};\n if (policy.default !== undefined) config.default = policy.default;\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 (typeof message === \"string\") {\n continue;\n }\n if (message.role === \"user\" || message.role === \"assistant\") {\n for (const content of message.content) {\n if (content.type === \"image\") {\n modalities.add(\"image\");\n }\n if (content.type === \"document\") {\n modalities.add(\"document\");\n }\n }\n }\n }\n return modalities;\n}\n\nfunction requestMessages(request: AgentRunRequest): Array<string | Message> {\n return [...(request.history ?? []), request.message];\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 { createEventStream } 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 createEventStream(withStudioStreamErrors(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 }\n return next;\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 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.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 type { Message } 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: 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 for (const content of message.content) {\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 transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: \"\",\n attachments,\n });\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: \"tool_result\",\n callId: content.callId ?? content.id,\n result: content.content\n .map((item) =>\n \"text\" in item ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\n .join(\"\\n\"),\n structuredResult: content.content,\n });\n }\n continue;\n }\n\n for (const content of message.content) {\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.function.name,\n callId: content.callId ?? content.id,\n args: formatJson(content.function.arguments),\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 return message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.source.type === \"base64\") {\n attachment.data = content.source.data;\n attachment.mediaType = content.source.mediaType;\n } else {\n attachment.url = content.source.url;\n }\n return [attachment];\n }\n if (content.type === \"document\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.source.filename !== undefined) attachment.name = content.source.filename;\n if (content.source.mediaType !== undefined) attachment.mediaType = content.source.mediaType;\n if (content.source.type === \"base64\") attachment.data = content.source.data;\n if (content.source.type === \"url\") attachment.url = content.source.url;\n return [attachment];\n }\n return [];\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 { Message } from \"@anvia/core/completion\";\nimport type { AgentStreamEvent } from \"@anvia/core/request\";\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 { streamStudioJsonl } from \"./streams\";\nimport {\n isAgentTraceOptions,\n isJsonObject,\n isMessage,\n isMessageInput,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n} from \"./type-guards\";\n\nexport { transcriptFromMessages } from \"./transcript\";\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 async function* mergeRunAndApprovalEvents(\n runEvents: AsyncIterable<AgentStreamEvent>,\n approvalEvents: AsyncEventQueue<AgentRunStreamEvent>,\n): AsyncIterable<AgentRunStreamEvent> {\n type TaggedNext =\n | { source: \"run\"; value: IteratorResult<AgentStreamEvent> }\n | { source: \"approval\"; value: IteratorResult<AgentRunStreamEvent> };\n const runIterator = runEvents[Symbol.asyncIterator]();\n let runDone = false;\n let runNext: Promise<IteratorResult<AgentStreamEvent>> | undefined = runIterator.next();\n let approvalNext: Promise<IteratorResult<AgentRunStreamEvent>> | undefined =\n approvalEvents.next();\n\n try {\n while (runNext !== undefined || approvalNext !== undefined) {\n const pending: Promise<TaggedNext>[] = [];\n if (runNext !== undefined) {\n pending.push(runNext.then((value) => ({ source: \"run\", value })));\n }\n if (approvalNext !== undefined) {\n pending.push(approvalNext.then((value) => ({ source: \"approval\", value })));\n }\n\n const result = await Promise.race(pending);\n\n if (result.source === \"run\") {\n if (result.value.done === true) {\n runDone = true;\n runNext = undefined;\n approvalEvents.close();\n } else {\n runNext = runIterator.next();\n yield result.value.value;\n }\n continue;\n }\n\n if (result.value.done === true) {\n approvalNext = undefined;\n } else {\n approvalNext = approvalEvents.next();\n yield result.value.value;\n }\n }\n } finally {\n if (!runDone && runIterator.return !== undefined) {\n await runIterator.return();\n }\n approvalEvents.close();\n }\n}\n\nexport function streamAgentRunEvents(\n _c: Context,\n events: AsyncIterable<AgentRunStreamEvent>,\n options: { onCancel?: () => void | Promise<void> } = {},\n): Response {\n return streamStudioJsonl(withAgentRunCancellation(events, options.onCancel));\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 (next.value.type === \"final\" || next.value.type === \"error\") {\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: Record<string, unknown> = {};\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}): {\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\" | \"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 (event.type === \"final\" || event.type === \"error\") {\n assignTranscriptRunDuration(transcript, Date.now() - props.startedAt);\n }\n const eventStatus =\n event.type === \"final\" ? \"success\" : event.type === \"error\" ? \"error\" : \"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 = event.type === \"final\" ? event.messages.slice(1) : [];\n if (props.persistGeneratedMessages === true && generatedMessages.length > 0) {\n await props.store.append({\n context: { 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.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n args: formatJson(event.toolCall.function.arguments),\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 === \"tool_approval_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n matched.approval = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n };\n }\n }\n if (event.type === \"tool_approval_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n const approval: NonNullable<typeof matched.approval> = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n };\n if (event.approval.resolvedAt !== undefined) approval.resolvedAt = event.approval.resolvedAt;\n if (event.approval.reason !== undefined) approval.reason = event.approval.reason;\n matched.approval = approval;\n }\n }\n if (event.type === \"tool_question_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n matched.question = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n questions: event.question.questions,\n };\n }\n }\n if (event.type === \"tool_question_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n const question: NonNullable<typeof matched.question> = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n questions: event.question.questions,\n };\n if (event.question.answeredAt !== undefined) question.answeredAt = event.question.answeredAt;\n if (event.question.cancelledAt !== undefined) {\n question.cancelledAt = event.question.cancelledAt;\n }\n if (event.question.answers !== undefined) question.answers = event.question.answers;\n matched.question = question;\n }\n }\n if (event.type === \"final\" && event.trace?.traceId !== undefined) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\n }\n if (event.type === \"error\") {\n appendTranscriptAssistantError(transcript, errorText(event.error));\n }\n}\n\nfunction approvalCallId(approval: { callId?: string; toolCallId?: string }): string | undefined {\n return approval.callId ?? approval.toolCallId;\n}\n\nfunction questionCallId(question: { callId?: string; toolCallId?: string }): string | undefined {\n return question.callId ?? question.toolCallId;\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.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n args: formatJson(child.toolCall.function.arguments),\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 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.function.name}(${formatJson(item.function.arguments)})`];\n }\n if (item.type === \"tool_result\") {\n return item.content.map((result) =>\n \"text\" in result ? result.text : `[image:${result.mediaType ?? \"image/png\"}]`,\n );\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 const attachments = message.content.flatMap((content): StudioTranscriptAttachment[] => {\n if (content.type === \"image\") {\n const attachment: StudioTranscriptAttachment = { kind: \"image\" };\n if (content.source.type === \"base64\") {\n attachment.data = content.source.data;\n attachment.mediaType = content.source.mediaType;\n } else {\n attachment.url = content.source.url;\n }\n return [attachment];\n }\n if (content.type === \"document\") {\n const attachment: StudioTranscriptAttachment = { kind: \"document\" };\n if (content.source.filename !== undefined) attachment.name = content.source.filename;\n if (content.source.mediaType !== undefined) attachment.mediaType = content.source.mediaType;\n if (content.source.type === \"base64\") attachment.data = content.source.data;\n if (content.source.type === \"url\") attachment.url = content.source.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 const request =\n \"message\" in body ? parseLegacyRunRequestBody(c, body) : parseUiRunRequestBody(c, body);\n if (\"error\" in request) {\n return request;\n }\n\n return parseRunRequestOptions(c, body, request);\n}\n\nfunction parseLegacyRunRequestBody(\n c: Context,\n body: Record<string, unknown>,\n): AgentRunRequest | { error: Response } {\n if (!isMessageInput(body.message)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"Request body requires a string or Message\"),\n };\n }\n\n const request: AgentRunRequest = {\n message: typeof body.message === \"string\" ? body.message : body.message,\n };\n\n if (\"history\" in body) {\n if (!Array.isArray(body.history) || !body.history.every(isMessage)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"history must be a Message array\") };\n }\n request.history = body.history;\n }\n\n return request;\n}\n\nfunction parseUiRunRequestBody(\n c: Context,\n body: Record<string, unknown>,\n): AgentRunRequest | { error: Response } {\n const messages = body.messages;\n if (!Array.isArray(messages) || !messages.every(isMessage)) {\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\n const history = messages.slice(0, -1);\n const request: AgentRunRequest = { message };\n if (history.length > 0) request.history = history;\n return request;\n}\n\nfunction parseRunRequestOptions(\n c: Context,\n body: Record<string, unknown>,\n request: AgentRunRequest,\n): AgentRunRequest | { error: Response } {\n if (\"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.history !== undefined) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"sessionId cannot be combined with history\"),\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 (\"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 (\"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 (\"model\" in body) {\n if (typeof body.model === \"string\") {\n request.model = body.model;\n } else if (\n isObject(body.model) &&\n typeof body.model.provider === \"string\" &&\n typeof body.model.model === \"string\"\n ) {\n request.model = {\n provider: body.model.provider,\n model: body.model.model,\n };\n } else {\n return {\n error: errorResponse(\n c,\n 400,\n \"bad_request\",\n \"model must be a provider:model string or { provider, model } object\",\n ),\n };\n }\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","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 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 === \"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.function.name} called`,\n metadata: {\n turn: event.turn,\n toolName: event.toolCall.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n argumentBytes: byteLength(formatUnknown(event.toolCall.function.arguments)),\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 === \"final\") {\n return [\n runCompletedLog({\n sessionId,\n runId,\n durationMs: Date.now() - props.startedAt,\n usage: event.usage,\n output: event.output,\n messageCount: event.messages.length,\n }),\n memorySavedLog({ sessionId, runId, messageCount: event.messages.length }),\n ];\n }\n if (event.type === \"error\") {\n return [runFailedLog(sessionId, runId, event.error, props.startedAt)];\n }\n if (event.type === \"tool_approval_request\") {\n const metadata: JsonObject = {\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n argumentBytes: byteLength(event.approval.args),\n };\n if (event.approval.callId !== undefined) metadata.callId = event.approval.callId;\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"approval\",\n event: \"approval.requested\",\n message: `Approval requested for ${event.approval.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"tool_approval_result\") {\n const metadata: JsonObject = {\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n };\n if (event.approval.callId !== undefined) metadata.callId = event.approval.callId;\n return [\n {\n sessionId,\n runId,\n level: event.approval.status === \"approved\" ? \"info\" : \"warn\",\n category: \"approval\",\n event: \"approval.resolved\",\n message: `Approval ${event.approval.status} for ${event.approval.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"tool_question_request\") {\n const metadata: JsonObject = {\n questionId: event.question.id,\n toolName: event.question.toolName,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n };\n if (event.question.callId !== undefined) metadata.callId = event.question.callId;\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.requested\",\n message: `Question requested by ${event.question.toolName}`,\n metadata,\n },\n ];\n }\n if (event.type === \"tool_question_result\") {\n const cancelled = event.question.status === \"cancelled\";\n const metadata: JsonObject = {\n questionId: event.question.id,\n toolName: event.question.toolName,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n answerCount: event.question.answers?.length ?? 0,\n };\n if (event.question.callId !== undefined) metadata.callId = event.question.callId;\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: cancelled ? \"question.cancelled\" : \"question.answered\",\n message: cancelled\n ? `Question cancelled for ${event.question.toolName}`\n : `Question answered for ${event.question.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.function.name}`,\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.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n argumentBytes: byteLength(formatUnknown(child.toolCall.function.arguments)),\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 === \"final\") {\n const metadata: JsonObject = {\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n outputBytes: byteLength(child.output),\n messageCount: child.messages.length,\n };\n const usage = usageSummary(child.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 { 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\" || status === \"success\" || status === \"error\" ? status : 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 type { JsonObject } from \"@anvia/core/completion\";\nimport type { ToolApprovalRequest, ToolApprovalsOptions } from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolApproval,\n StudioToolApprovalDecision,\n StudioToolApprovalStatus,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString } from \"./query\";\nimport { isObject } from \"./type-guards\";\n\ntype PendingApproval = StudioToolApproval & {\n status: \"pending\";\n rejectMessage?: string;\n emit?: (event: AgentRunStreamEvent) => void;\n resolve: (decision: StudioToolApprovalDecision) => void;\n};\n\ntype ApprovalHookContext = {\n runId: string;\n agentId: string;\n sessionId?: string;\n metadata?: JsonObject;\n emit?: (event: AgentRunStreamEvent) => void;\n};\n\ntype ApprovalRequest = {\n toolName: string;\n toolCallId?: string;\n internalCallId: string;\n args: string;\n reason?: string;\n rejectMessage?: string;\n};\n\nexport type ApprovalRuntime = {\n approvals: Map<string, PendingApproval | StudioToolApproval>;\n createApprovals(context: ApprovalHookContext): ToolApprovalsOptions;\n list(options: ApprovalListOptions): StudioToolApproval[];\n cancelRun(runId: string): StudioToolApproval[];\n decide(\n id: string,\n decision: StudioToolApprovalDecision,\n ): \"missing\" | \"resolved\" | StudioToolApproval;\n};\n\ntype ApprovalListOptions = {\n status?: \"pending\" | \"resolved\";\n runId?: string;\n agentId?: string;\n sessionId?: string;\n};\n\nexport function registerApprovalRoutes(app: Hono, approvals: ApprovalRuntime): void {\n app.get(\"/approvals\", (c) => {\n const status = parseApprovalStatus(c.req.query(\"status\"));\n if (status === false) {\n return errorResponse(c, 400, \"bad_request\", \"status must be pending or resolved\");\n }\n\n const options: ApprovalListOptions = {};\n const runId = optionalQueryString(c.req.query(\"runId\"));\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sessionId = optionalQueryString(c.req.query(\"sessionId\"));\n if (status !== undefined) {\n options.status = status;\n }\n if (runId !== undefined) {\n options.runId = runId;\n }\n if (agentId !== undefined) {\n options.agentId = agentId;\n }\n if (sessionId !== undefined) {\n options.sessionId = sessionId;\n }\n\n return c.json({\n approvals: approvals.list(options),\n });\n });\n\n app.post(\"/approvals/:approvalId/decision\", async (c) => {\n const body = await parseApprovalDecisionRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const result = approvals.decide(c.req.param(\"approvalId\"), body);\n if (result === \"missing\") {\n return errorResponse(c, 404, \"not_found\", \"Approval not found\");\n }\n if (result === \"resolved\") {\n return errorResponse(c, 409, \"conflict\", \"Approval is already resolved\");\n }\n return c.json(result);\n });\n}\n\nfunction parseApprovalStatus(\n value: string | undefined,\n): \"pending\" | \"resolved\" | undefined | false {\n const status = optionalQueryString(value);\n if (status === undefined) {\n return undefined;\n }\n return status === \"pending\" || status === \"resolved\" ? status : false;\n}\n\nasync function parseApprovalDecisionRequest(\n c: Context,\n): Promise<StudioToolApprovalDecision | { 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 (typeof body.approved !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"approved must be a boolean\") };\n }\n if (\"reason\" in body && typeof body.reason !== \"string\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"reason must be a string\") };\n }\n\n const reason =\n typeof body.reason === \"string\" && body.reason.trim().length > 0\n ? body.reason.trim()\n : undefined;\n return approvalDecision(body.approved, reason);\n}\n\nexport function createApprovalRuntime(): ApprovalRuntime {\n const approvals = new Map<string, PendingApproval | StudioToolApproval>();\n\n return {\n approvals,\n createApprovals(context) {\n return {\n async handler(request: ToolApprovalRequest) {\n const approvalRequest: ApprovalRequest = {\n toolName: request.toolName,\n internalCallId: request.internalCallId,\n args: request.rawArgs,\n };\n if (request.toolCallId !== undefined) approvalRequest.toolCallId = request.toolCallId;\n if (request.reason !== undefined) approvalRequest.reason = request.reason;\n if (request.rejectMessage !== undefined) {\n approvalRequest.rejectMessage = request.rejectMessage;\n }\n const decision = await requestApproval(approvals, context, approvalRequest);\n return approvalDecision(decision.approved, decision.reason);\n },\n };\n },\n list(options) {\n return [...approvals.values()]\n .filter((approval) => {\n if (options.status === \"pending\" && approval.status !== \"pending\") {\n return false;\n }\n if (options.status === \"resolved\" && approval.status === \"pending\") {\n return false;\n }\n if (options.runId !== undefined && approval.runId !== options.runId) {\n return false;\n }\n if (options.agentId !== undefined && approval.agentId !== options.agentId) {\n return false;\n }\n if (options.sessionId !== undefined && approval.sessionId !== options.sessionId) {\n return false;\n }\n return true;\n })\n .map(publicApproval);\n },\n cancelRun(runId) {\n const cancelled: StudioToolApproval[] = [];\n for (const approval of approvals.values()) {\n if (!isPendingApproval(approval) || approval.runId !== runId) {\n continue;\n }\n const resolved = resolveApproval(approval, \"cancelled\", {\n reason: \"Run cancelled in Anvia Studio.\",\n });\n approvals.set(approval.id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve(approvalDecision(false, resolved.reason));\n cancelled.push(resolved);\n }\n return cancelled;\n },\n decide(id, decision) {\n const approval = approvals.get(id);\n if (approval === undefined) {\n return \"missing\";\n }\n if (!isPendingApproval(approval)) {\n return \"resolved\";\n }\n\n const reason = decision.approved\n ? decision.reason\n : (decision.reason ?? approval.rejectMessage ?? \"Rejected in Anvia Studio.\");\n const resolved = resolveApproval(\n approval,\n decision.approved ? \"approved\" : \"rejected\",\n reason === undefined ? {} : { reason },\n );\n approvals.set(id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve(approvalDecision(decision.approved, reason));\n return publicApproval(resolved);\n },\n };\n}\n\nasync function requestApproval(\n approvals: Map<string, PendingApproval | StudioToolApproval>,\n context: ApprovalHookContext,\n request: ApprovalRequest,\n): Promise<StudioToolApprovalDecision> {\n const id = globalThis.crypto.randomUUID();\n const approval: PendingApproval = {\n id,\n runId: context.runId,\n agentId: context.agentId,\n toolName: request.toolName,\n internalCallId: request.internalCallId,\n args: request.args,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n resolve: () => {},\n };\n if (context.sessionId !== undefined) approval.sessionId = context.sessionId;\n if (request.toolCallId !== undefined) approval.callId = request.toolCallId;\n if (request.reason !== undefined) approval.reason = request.reason;\n if (request.rejectMessage !== undefined) approval.rejectMessage = request.rejectMessage;\n if (context.emit !== undefined) approval.emit = context.emit;\n\n const decision = new Promise<StudioToolApprovalDecision>((resolve) => {\n approval.resolve = (decision) => {\n const current = approvals.get(id);\n if (!isPendingApproval(current)) {\n if (current !== undefined) {\n resolve(approvalDecision(current.status === \"approved\", current.reason));\n }\n return;\n }\n const reason = decision.approved\n ? decision.reason\n : (decision.reason ?? request.rejectMessage ?? \"Rejected in Anvia Studio.\");\n const resolved = resolveApproval(\n current,\n decision.approved ? \"approved\" : \"rejected\",\n reason === undefined ? {} : { reason },\n );\n approvals.set(id, resolved);\n context.emit?.({ type: \"tool_approval_result\", approval: resolved });\n resolve(approvalDecision(decision.approved, reason));\n };\n });\n\n approvals.set(id, approval);\n context.emit?.({ type: \"tool_approval_request\", approval: publicApproval(approval) });\n return decision;\n}\n\nfunction isPendingApproval(\n approval: PendingApproval | StudioToolApproval | undefined,\n): approval is PendingApproval {\n return approval !== undefined && approval.status === \"pending\" && \"resolve\" in approval;\n}\n\nfunction resolveApproval(\n approval: PendingApproval | StudioToolApproval,\n status: Exclude<StudioToolApprovalStatus, \"pending\">,\n options: { reason?: string } = {},\n): StudioToolApproval {\n const resolved: PendingApproval | StudioToolApproval = {\n ...approval,\n status,\n resolvedAt: new Date().toISOString(),\n };\n if (options.reason !== undefined) resolved.reason = options.reason;\n return publicApproval(resolved);\n}\n\nfunction approvalDecision(\n approved: boolean,\n reason: string | undefined,\n): StudioToolApprovalDecision {\n const decision: StudioToolApprovalDecision = { approved };\n if (reason !== undefined) decision.reason = reason;\n return decision;\n}\n\nfunction publicApproval(approval: PendingApproval | StudioToolApproval): StudioToolApproval {\n const { emit, rejectMessage, resolve, ...rest } = approval as PendingApproval;\n void emit;\n void rejectMessage;\n void resolve;\n return rest;\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 AnyTool, ToolSet } from \"@anvia/core/tool\";\nimport type { StudioAgent, StudioAgentToolApprovalMetadata, StudioAgentToolSource } from \"../types\";\n\nexport type AgentToolItem = {\n tool: AnyTool;\n source: StudioAgentToolSource;\n};\n\nconst MCP_TOOL_METADATA_KEY = Symbol.for(\"anvia.mcp.tool.metadata\");\n\nexport function agentToolItems(agent: StudioAgent): AgentToolItem[] {\n return [\n ...agent.agent.toolSet.values().map((tool) => ({ tool, source: \"static\" as const })),\n ...agent.agent.dynamicTools.flatMap((registration) => {\n const maybeToolSet = (registration.index as { toolSet?: unknown }).toolSet;\n if (!(maybeToolSet instanceof ToolSet)) {\n return [];\n }\n return maybeToolSet.values().map((tool) => ({ tool, source: \"dynamic\" as const }));\n }),\n ];\n}\n\nexport function approvalMetadata(tool: AnyTool): StudioAgentToolApprovalMetadata {\n const approval = tool.approval;\n if (approval === undefined || typeof approval !== \"object\" || approval === null) {\n return { required: false };\n }\n\n const policy = approval as {\n reason?: unknown;\n rejectMessage?: unknown;\n };\n const metadata: StudioAgentToolApprovalMetadata = { required: true };\n if (typeof policy.reason === \"string\") metadata.reason = policy.reason;\n if (typeof policy.rejectMessage === \"string\") metadata.rejectMessage = policy.rejectMessage;\n return metadata;\n}\n\nexport function mcpServerName(tool: AnyTool): string | undefined {\n const metadata = (tool as { [MCP_TOOL_METADATA_KEY]?: unknown })[MCP_TOOL_METADATA_KEY];\n if (typeof metadata !== \"object\" || metadata === null) {\n return undefined;\n }\n const serverName = (metadata as { serverName?: unknown }).serverName;\n return typeof serverName === \"string\" && serverName.length > 0 ? serverName : undefined;\n}\n\nexport function agentHasMcpTools(agent: StudioAgent): boolean {\n return agentToolItems(agent).some(({ tool }) => mcpServerName(tool) !== undefined);\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioAgentRuntimeSummary,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioPipeline,\n StudioPipelineConfig,\n} from \"../types\";\nimport { evalConfig } from \"./eval-config\";\nimport { serializeUnknown } from \"./json\";\nimport { createStudioModelRegistry, studioModelsConfig } from \"./models\";\nimport type { ResolvedStores, StudioRuntimeOptions } from \"./options\";\nimport { agentHasMcpTools, agentToolItems, mcpServerName } 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 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) => item.tool.approval !== undefined).length,\n mcpToolCount: tools.filter((item) => mcpServerName(item.tool) !== undefined).length,\n staticContextCount: agent.agent.staticContext.length,\n dynamicContextCount: agent.agent.dynamicContexts.length,\n observerCount: agent.agent.observers.length,\n hasMemory: agent.agent.memory !== undefined,\n hasHook: agent.agent.hook !== 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 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 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.evals.length > 0) {\n capabilities.evals = { enabled: true };\n }\n if (\n agents.some(\n (agent) => agent.agent.toolSet.values().length > 0 || agent.agent.dynamicTools.length > 0,\n )\n ) {\n capabilities.tools = { enabled: true };\n }\n if (agents.some(agentHasMcpTools)) {\n capabilities.mcps = { enabled: true };\n }\n if (sandboxCount > 0) {\n capabilities.sandboxes = { enabled: true };\n }\n\n if (\n agents.some(\n (agent) =>\n agent.agent.hook !== undefined ||\n agent.agent.toolSet.values().some((tool) => tool.approval),\n )\n ) {\n capabilities.approvals = { enabled: true };\n }\n if (\n agents.some(\n (agent) =>\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0,\n )\n ) {\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 { 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 { JsonObject, JsonValue } from \"@anvia/core/completion\";\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 { errorResponse } from \"./http\";\nimport { compactJsonObject, toJsonValue } from \"./json\";\nimport { optionalQueryString, parseLimit } from \"./query\";\n\ntype InspectableIndex = {\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 return (\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0\n );\n}\n\nasync function agentKnowledgeConfig(agent: StudioAgent): Promise<StudioAgentKnowledgeConfig> {\n const agentName = agent.name ?? agent.agent.name;\n const config: StudioAgentKnowledgeConfig = {\n agentId: agent.id,\n sources: await knowledgeSources(agent),\n staticContext: agent.agent.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 sources: StudioKnowledgeSourceSummary[] = [\n {\n sourceId: staticSourceId(),\n kind: \"static_context\",\n label: \"Static context\",\n count: agent.agent.staticContext.length,\n inspectable: true,\n itemCount: agent.agent.staticContext.length,\n },\n ];\n\n const dynamicContextSources = await Promise.all(\n agent.agent.dynamicContexts.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.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: registration.options.topK,\n inspectable: inspect !== undefined,\n };\n if (registration.options.threshold !== undefined) {\n source.threshold = registration.options.threshold;\n }\n if (count !== undefined) source.itemCount = count;\n return source;\n }),\n );\n\n const dynamicToolSources = await Promise.all(\n agent.agent.dynamicTools.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.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: registration.options.topK,\n inspectable: inspect !== undefined,\n };\n if (registration.options.threshold !== undefined) {\n source.threshold = registration.options.threshold;\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: InspectableIndex[\"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 dynamicContextIndex = dynamicSourceIndex(sourceId, \"dynamic_context\");\n if (dynamicContextIndex !== undefined) {\n const registration = agent.agent.dynamicContexts[dynamicContextIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\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: registration.options.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 registration = agent.agent.dynamicTools[dynamicToolsIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\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: registration.options.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(index: unknown): InspectableIndex[\"inspect\"] | undefined {\n if (!isRecord(index) || typeof index.inspect !== \"function\") {\n return undefined;\n }\n const inspect = index.inspect;\n return (request) =>\n inspect.call(index, request) as ReturnType<NonNullable<InspectableIndex[\"inspect\"]>>;\n}\n\nfunction staticKnowledgeItemsPage(\n agent: StudioAgent,\n request: { limit: number; cursor?: string | undefined },\n): StudioKnowledgeItemsPage {\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const page = agent.agent.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: agent.agent.staticContext.length,\n };\n if (nextOffset < agent.agent.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 { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentMcpServerMetadata,\n StudioAgentMcpToolMetadata,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { agentToolItems, approvalMetadata, mcpServerName } 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 const servers = new Map<string, StudioAgentMcpToolMetadata[]>();\n const seen = new Set<string>();\n\n for (const { tool, source } of agentToolItems(agent)) {\n const serverName = mcpServerName(tool);\n if (serverName === undefined) {\n continue;\n }\n\n const definition = await tool.definition(\"\");\n const key = `${serverName}:${source}:${definition.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const tools = servers.get(serverName) ?? [];\n tools.push({\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n approval: approvalMetadata(tool),\n });\n servers.set(serverName, tools);\n }\n\n return [...servers.entries()]\n .map(([name, tools]) => {\n const sortedTools = tools.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 return {\n agentId: agent.id,\n name,\n toolCount: sortedTools.length,\n tools: sortedTools,\n };\n })\n .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(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 { 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 },\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 executePipelineRun(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 executePipelineRun(c, props, pipeline, replayRequest);\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): 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 };\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 return streamPipelineRun(c, streamOptions);\n }\n\n try {\n await appendPipelineLog(props.logStore, pipelineRunStartedLog(pipeline, runId));\n const output = await pipeline.pipeline.run(body.input, {\n observer: {\n async onEvent(event) {\n await appendPipelineLog(props.logStore, pipelineStageLog(pipeline.id, runId, event));\n },\n },\n });\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 }\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 },\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}): 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(props.input, {\n observer: {\n async onEvent(event: PipelineRunEvent) {\n const log = await appendPipelineLog(\n props.logStore,\n pipelineStageLog(props.pipeline.id, props.runId, event),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n },\n },\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 await run;\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 pipelineId: string,\n runId: string,\n event: PipelineRunEvent,\n): StudioPipelineLogAppendInput {\n const category = stageCategory(event.node);\n if (event.type === \"stage_started\") {\n return {\n pipelineId,\n 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,\n 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,\n 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 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","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport { createHook, type PromptHook } from \"@anvia/core/hooks\";\nimport { parseToolArgs } from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolQuestion,\n StudioToolQuestionAnswer,\n StudioToolQuestionChoice,\n StudioToolQuestionPrompt,\n StudioToolQuestionStatus,\n} from \"../types\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString } from \"./query\";\nimport { isObject } from \"./type-guards\";\n\ntype PendingQuestion = StudioToolQuestion & {\n status: \"pending\";\n emit?: (event: AgentRunStreamEvent) => void;\n resolve: (answers: StudioToolQuestionAnswer[]) => void;\n};\n\ntype QuestionHookContext = {\n runId: string;\n agentId: string;\n sessionId?: string;\n metadata?: JsonObject;\n emit?: (event: AgentRunStreamEvent) => void;\n};\n\ntype QuestionRequest = {\n toolName: string;\n toolCallId?: string;\n internalCallId: string;\n args: string;\n questions: StudioToolQuestionPrompt[];\n};\n\nexport type QuestionRuntime = {\n questions: Map<string, PendingQuestion | StudioToolQuestion>;\n createHook(context: QuestionHookContext): PromptHook;\n list(options: QuestionListOptions): StudioToolQuestion[];\n cancelRun(runId: string): StudioToolQuestion[];\n answer(\n id: string,\n answers: StudioToolQuestionAnswer[],\n ): \"missing\" | \"resolved\" | StudioToolQuestion;\n};\n\ntype QuestionListOptions = {\n status?: \"pending\" | \"resolved\";\n runId?: string;\n agentId?: string;\n sessionId?: string;\n};\n\nexport function registerQuestionRoutes(app: Hono, questions: QuestionRuntime): void {\n app.get(\"/questions\", (c) => {\n const status = parseQuestionStatus(c.req.query(\"status\"));\n if (status === false) {\n return errorResponse(c, 400, \"bad_request\", \"status must be pending or resolved\");\n }\n\n const options: QuestionListOptions = {};\n const runId = optionalQueryString(c.req.query(\"runId\"));\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sessionId = optionalQueryString(c.req.query(\"sessionId\"));\n if (status !== undefined) {\n options.status = status;\n }\n if (runId !== undefined) {\n options.runId = runId;\n }\n if (agentId !== undefined) {\n options.agentId = agentId;\n }\n if (sessionId !== undefined) {\n options.sessionId = sessionId;\n }\n\n return c.json({ questions: questions.list(options) });\n });\n\n app.post(\"/questions/:questionId/answer\", async (c) => {\n const body = await parseQuestionAnswerRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const result = questions.answer(c.req.param(\"questionId\"), body.answers);\n if (result === \"missing\") {\n return errorResponse(c, 404, \"not_found\", \"Question not found\");\n }\n if (result === \"resolved\") {\n return errorResponse(c, 409, \"conflict\", \"Question is already answered\");\n }\n return c.json(result);\n });\n}\n\nfunction parseQuestionStatus(\n value: string | undefined,\n): \"pending\" | \"resolved\" | undefined | false {\n const status = optionalQueryString(value);\n if (status === undefined) {\n return undefined;\n }\n return status === \"pending\" || status === \"resolved\" ? status : false;\n}\n\nasync function parseQuestionAnswerRequest(\n c: Context,\n): Promise<{ answers: StudioToolQuestionAnswer[] } | { 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 (!Array.isArray(body.answers)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"answers must be an array\") };\n }\n\n const answers: StudioToolQuestionAnswer[] = [];\n for (const answer of body.answers) {\n if (!isObject(answer)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"answers must contain objects\") };\n }\n if (typeof answer.questionId !== \"string\" || answer.questionId.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"questionId must be a string\") };\n }\n if (typeof answer.answer !== \"string\" || answer.answer.trim().length === 0) {\n return { error: errorResponse(c, 400, \"bad_request\", \"answer must be a string\") };\n }\n if (\"choice\" in answer && typeof answer.choice !== \"string\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"choice must be a string\") };\n }\n if (\"custom\" in answer && typeof answer.custom !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"custom must be a boolean\") };\n }\n const normalized: StudioToolQuestionAnswer = {\n questionId: answer.questionId.trim(),\n answer: answer.answer.trim(),\n };\n if (typeof answer.choice === \"string\") normalized.choice = answer.choice;\n if (typeof answer.custom === \"boolean\") normalized.custom = answer.custom;\n answers.push(normalized);\n }\n\n return { answers };\n}\n\nexport function createQuestionRuntime(): QuestionRuntime {\n const questions = new Map<string, PendingQuestion | StudioToolQuestion>();\n\n return {\n questions,\n createHook(context) {\n return createHook({\n async onToolCall({ toolName, toolCallId, internalCallId, args, tool: control }) {\n if (toolName !== \"ask_question\") {\n return control.run();\n }\n\n const prompts = normalizeQuestionPrompts(parseToolArgs(args));\n if (\"error\" in prompts) {\n return control.skip(prompts.error);\n }\n\n const request: QuestionRequest = {\n toolName,\n internalCallId,\n args,\n questions: prompts.questions,\n };\n if (toolCallId !== undefined) request.toolCallId = toolCallId;\n const answers = await requestQuestion(questions, context, request);\n\n return control.skip(JSON.stringify({ answers }));\n },\n });\n },\n list(options) {\n return [...questions.values()]\n .filter((question) => {\n if (options.status === \"pending\" && question.status !== \"pending\") {\n return false;\n }\n if (options.status === \"resolved\" && question.status === \"pending\") {\n return false;\n }\n if (options.runId !== undefined && question.runId !== options.runId) {\n return false;\n }\n if (options.agentId !== undefined && question.agentId !== options.agentId) {\n return false;\n }\n if (options.sessionId !== undefined && question.sessionId !== options.sessionId) {\n return false;\n }\n return true;\n })\n .map(publicQuestion);\n },\n cancelRun(runId) {\n const cancelled: StudioToolQuestion[] = [];\n for (const question of questions.values()) {\n if (!isPendingQuestion(question) || question.runId !== runId) {\n continue;\n }\n const resolved = cancelQuestion(question);\n questions.set(question.id, resolved);\n question.emit?.({ type: \"tool_question_result\", question: resolved });\n question.resolve([]);\n cancelled.push(resolved);\n }\n return cancelled;\n },\n answer(id, answers) {\n const question = questions.get(id);\n if (question === undefined) {\n return \"missing\";\n }\n if (!isPendingQuestion(question)) {\n return \"resolved\";\n }\n\n const resolved = resolveQuestion(question, answers);\n questions.set(id, resolved);\n question.emit?.({ type: \"tool_question_result\", question: resolved });\n question.resolve(answers);\n return publicQuestion(resolved);\n },\n };\n}\n\nasync function requestQuestion(\n questions: Map<string, PendingQuestion | StudioToolQuestion>,\n context: QuestionHookContext,\n request: QuestionRequest,\n): Promise<StudioToolQuestionAnswer[]> {\n const id = globalThis.crypto.randomUUID();\n const question: PendingQuestion = {\n id,\n runId: context.runId,\n agentId: context.agentId,\n toolName: request.toolName,\n internalCallId: request.internalCallId,\n args: request.args,\n questions: request.questions,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n resolve: () => {},\n };\n if (context.sessionId !== undefined) question.sessionId = context.sessionId;\n if (request.toolCallId !== undefined) question.callId = request.toolCallId;\n if (context.emit !== undefined) question.emit = context.emit;\n\n const answer = new Promise<StudioToolQuestionAnswer[]>((resolve) => {\n question.resolve = (answers) => {\n resolve(answers);\n };\n });\n\n questions.set(id, question);\n context.emit?.({ type: \"tool_question_request\", question: publicQuestion(question) });\n return answer;\n}\n\nfunction normalizeQuestionPrompts(\n args: JsonValue,\n): { questions: StudioToolQuestionPrompt[] } | { error: string } {\n if (!isObject(args)) {\n return { error: \"ask_question requires a JSON object with questions.\" };\n }\n\n const rawQuestions = Array.isArray(args.questions) ? args.questions : [args];\n if (rawQuestions.length === 0) {\n return { error: \"ask_question requires at least one question.\" };\n }\n\n const questions: StudioToolQuestionPrompt[] = [];\n for (const [index, question] of rawQuestions.entries()) {\n const normalized = normalizeQuestionPrompt(question, index);\n if (normalized === undefined) {\n return {\n error: \"ask_question requires every question to include text and at least one choice.\",\n };\n }\n questions.push(normalized);\n }\n return { questions };\n}\n\nfunction normalizeQuestionPrompt(\n value: unknown,\n index: number,\n): StudioToolQuestionPrompt | undefined {\n if (\n !isObject(value) ||\n typeof value.question !== \"string\" ||\n value.question.trim().length === 0\n ) {\n return undefined;\n }\n\n const choices = Array.isArray(value.choices)\n ? value.choices\n .map(normalizeQuestionChoice)\n .filter((choice): choice is StudioToolQuestionChoice => choice !== undefined)\n : [];\n if (choices.length === 0) {\n return undefined;\n }\n\n return {\n id:\n typeof value.id === \"string\" && value.id.trim().length > 0\n ? value.id.trim()\n : `question_${index + 1}`,\n question: value.question.trim(),\n choices,\n };\n}\n\nfunction normalizeQuestionChoice(value: unknown): StudioToolQuestionChoice | undefined {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { label: value.trim(), value: value.trim() };\n }\n if (!isObject(value) || typeof value.label !== \"string\" || value.label.trim().length === 0) {\n return undefined;\n }\n return {\n label: value.label.trim(),\n value:\n typeof value.value === \"string\" && value.value.trim().length > 0\n ? value.value.trim()\n : value.label.trim(),\n };\n}\n\nfunction isPendingQuestion(\n question: PendingQuestion | StudioToolQuestion | undefined,\n): question is PendingQuestion {\n return question !== undefined && question.status === \"pending\" && \"resolve\" in question;\n}\n\nfunction resolveQuestion(\n question: PendingQuestion | StudioToolQuestion,\n answers: StudioToolQuestionAnswer[],\n): StudioToolQuestion {\n return publicQuestion({\n ...question,\n status: \"answered\" satisfies StudioToolQuestionStatus,\n answeredAt: new Date().toISOString(),\n answers,\n });\n}\n\nfunction cancelQuestion(question: PendingQuestion | StudioToolQuestion): StudioToolQuestion {\n return publicQuestion({\n ...question,\n status: \"cancelled\" satisfies StudioToolQuestionStatus,\n cancelledAt: new Date().toISOString(),\n });\n}\n\nfunction publicQuestion(question: PendingQuestion | StudioToolQuestion): StudioToolQuestion {\n const { emit, resolve, ...rest } = question as PendingQuestion;\n void emit;\n void resolve;\n return rest;\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 StudioSandboxProcess,\n StudioSandboxProcessLogsResponse,\n StudioSandboxProcessStatus,\n StudioSandboxSummary,\n} from \"../types\";\nimport { serializeError } from \"./errors\";\nimport { errorResponse } from \"./http\";\nimport { agentToolItems } from \"./tool-metadata\";\n\nconst sandboxToolMetadataKey = Symbol.for(\"anvia.sandbox.tool.metadata\");\nconst maxFileResponseBytes = 10 * 1024 * 1024;\nconst defaultProcessLogBytes = 64 * 1024;\nconst maxProcessLogBytes = 1024 * 1024;\n\ntype SandboxSessionLike = {\n readonly id: string;\n readonly provider: string;\n readonly workdir: string;\n readonly publishedPorts?: unknown;\n listFiles(path?: string): Promise<unknown>;\n readFile(path: string): Promise<unknown>;\n listProcesses?: () => Promise<unknown>;\n readProcessLogs?: (processId: string, options?: { tailBytes?: number }) => Promise<unknown>;\n};\n\ntype SandboxRegistryEntry = {\n session: SandboxSessionLike;\n summary: StudioSandboxSummary;\n};\n\ntype SandboxRegistryDraft = {\n session: SandboxSessionLike;\n agentIds: Set<string>;\n toolNames: Set<string>;\n};\n\nexport class StudioSandboxRegistry {\n private readonly entries: Map<string, SandboxRegistryEntry>;\n\n constructor(entries: SandboxRegistryEntry[]) {\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): SandboxRegistryEntry | undefined {\n return this.entries.get(ref);\n }\n}\n\nexport function createStudioSandboxRegistry(agents: StudioAgent[]): StudioSandboxRegistry {\n const drafts = new Map<SandboxSessionLike, SandboxRegistryDraft>();\n\n for (const agent of agents) {\n for (const { tool } of agentToolItems(agent)) {\n const session = sandboxSessionFromTool(tool);\n if (session === undefined) {\n continue;\n }\n\n const draft = drafts.get(session) ?? {\n session,\n agentIds: new Set<string>(),\n toolNames: new Set<string>(),\n };\n draft.agentIds.add(agent.id);\n draft.toolNames.add(tool.name);\n drafts.set(session, draft);\n }\n }\n\n const refCounts = new Map<string, number>();\n const entries = [...drafts.values()]\n .sort((left, right) =>\n `${left.session.provider}\\0${left.session.id}`.localeCompare(\n `${right.session.provider}\\0${right.session.id}`,\n ),\n )\n .map((draft): SandboxRegistryEntry => {\n const baseRef = sandboxRef(draft.session.provider, draft.session.id);\n const occurrence = (refCounts.get(baseRef) ?? 0) + 1;\n refCounts.set(baseRef, occurrence);\n const ref = occurrence === 1 ? baseRef : `${baseRef}.${occurrence}`;\n return {\n session: draft.session,\n summary: {\n ref,\n id: draft.session.id,\n provider: draft.session.provider,\n workdir: draft.session.workdir,\n agentIds: [...draft.agentIds].sort(),\n toolNames: [...draft.toolNames].sort(),\n capabilities: {\n files: true,\n ports: supportsPorts(draft.session),\n processes: supportsProcesses(draft.session),\n },\n },\n };\n });\n\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 if (entry === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n return 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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n\n try {\n const requestedPath = c.req.query(\"path\") ?? \".\";\n const normalizedPath = normalizeSandboxPath(requestedPath, true);\n const entries = await listSandboxFiles(entry.session, normalizedPath);\n return c.json({\n sandboxRef: entry.summary.ref,\n path: normalizedPath,\n entries,\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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n\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\n const normalizedPath = normalizeSandboxPath(requestedPath, false);\n const parentPath = path.posix.dirname(normalizedPath);\n const siblings = await listSandboxFiles(entry.session, parentPath);\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 }\n\n const rawBytes = await entry.session.readFile(normalizedPath);\n if (!(rawBytes instanceof Uint8Array)) {\n throw new TypeError(\"Sandbox readFile returned an invalid byte payload\");\n }\n if (rawBytes.byteLength > maxFileResponseBytes) {\n throw fileTooLarge(rawBytes.byteLength);\n }\n\n const bytes = new Uint8Array(rawBytes.byteLength);\n bytes.set(rawBytes);\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\": String(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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n if (!supportsPorts(entry.session)) {\n return unsupportedSandboxOperation(c, \"ports\");\n }\n\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n ports: normalizePorts(entry.session.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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n if (!supportsProcesses(entry.session)) {\n return unsupportedSandboxOperation(c, \"processes\");\n }\n\n try {\n return c.json({\n sandboxRef: entry.summary.ref,\n processes: normalizeProcesses(await entry.session.listProcesses()),\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) {\n return errorResponse(c, 404, \"not_found\", \"Sandbox not found\");\n }\n if (!supportsProcesses(entry.session)) {\n return unsupportedSandboxOperation(c, \"processes.logs\");\n }\n\n try {\n const tailBytes = parseTailBytes(c.req.query(\"tailBytes\"));\n const processId = c.req.param(\"processId\");\n const processes = normalizeProcesses(await entry.session.listProcesses());\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.session.readProcessLogs(processId, { tailBytes }),\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 sandboxSessionFromTool(tool: object): SandboxSessionLike | undefined {\n const metadata = (tool as { [sandboxToolMetadataKey]?: unknown })[sandboxToolMetadataKey];\n if (!isRecord(metadata)) {\n return undefined;\n }\n return isSandboxSession(metadata.session) ? metadata.session : undefined;\n}\n\nfunction isSandboxSession(value: unknown): value is SandboxSessionLike {\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 typeof value.listFiles === \"function\" &&\n typeof value.readFile === \"function\"\n );\n}\n\nfunction supportsPorts(session: SandboxSessionLike): boolean {\n return Array.isArray(session.publishedPorts);\n}\n\nfunction supportsProcesses(\n session: SandboxSessionLike,\n): session is SandboxSessionLike &\n Required<Pick<SandboxSessionLike, \"listProcesses\" | \"readProcessLogs\">> {\n return (\n typeof session.listProcesses === \"function\" && typeof session.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 capabilities: { ...summary.capabilities },\n };\n}\n\nasync function listSandboxFiles(\n session: SandboxSessionLike,\n filePath: string,\n): Promise<StudioSandboxFileEntry[]> {\n return normalizeFileEntries(await session.listFiles(filePath)).sort((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\nfunction normalizeFileEntries(value: unknown): StudioSandboxFileEntry[] {\n if (!Array.isArray(value)) {\n throw new TypeError(\"Sandbox listFiles returned an invalid payload\");\n }\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 (typeof item.size !== \"number\" || !Number.isFinite(item.size) || item.size < 0) {\n throw new TypeError(\"Sandbox listFiles returned an invalid file size\");\n }\n entry.size = item.size;\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 }\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 }\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 typeof value.stdout !== \"string\" ||\n typeof value.stderr !== \"string\" ||\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 = boundedLogText(value.stdout, maxBytes);\n const stderr = boundedLogText(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 boundedLogText(value: string, maxBytes: number): { text: string; truncated: boolean } {\n const bytes = new TextEncoder().encode(value);\n if (bytes.byteLength <= maxBytes) {\n return { text: value, truncated: false };\n }\n if (maxBytes === 0) {\n return { text: \"\", truncated: true };\n }\n\n let start = bytes.byteLength - maxBytes;\n while (start < bytes.byteLength && (bytes[start] ?? 0) >> 6 === 2) {\n start += 1;\n }\n return {\n text: new TextDecoder().decode(bytes.subarray(start)),\n truncated: true,\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) {\n return defaultProcessLogBytes;\n }\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 name = errorName(error);\n if (name === \"SandboxPathError\") {\n return errorResponse(c, 400, \"bad_request\", errorMessage(error));\n }\n if (name === \"SandboxFileSizeError\") {\n return errorResponse(c, 413, \"payload_too_large\", errorMessage(error));\n }\n if (name === \"SandboxSessionDestroyedError\") {\n return errorResponse(c, 409, \"conflict\", \"Sandbox session 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 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;\n}\n\nfunction errorName(error: unknown): string {\n return isRecord(error) && typeof error.name === \"string\" ? error.name : \"\";\n}\n\nfunction errorMessage(error: unknown): string {\n return isRecord(error) && typeof error.message === \"string\" ? error.message : String(error);\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 { MemoryAppendInput, MemoryContext, MemoryErrorInput } 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 runs: Array<StudioSessionRunTranscriptInput & { createdAt: string; updatedAt: string }>;\n logs: StudioSessionLogEntry[];\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 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 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(context: MemoryContext): Promise<Message[]> {\n return Promise.resolve(this.sessions.get(context.sessionId)?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): Promise<void> {\n const session = this.sessions.get(input.context.sessionId);\n if (session !== undefined) {\n session.messages.push(...input.messages);\n session.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n clear(context: MemoryContext): Promise<void> {\n const session = this.sessions.get(context.sessionId);\n if (session !== undefined) {\n session.messages = [];\n session.runs = [];\n session.messageCount = 0;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n async recordError(input: MemoryErrorInput): Promise<void> {\n await this.saveSessionRunTranscript({\n id: input.context.sessionId,\n runId: studioRunId(input.context) ?? input.runId,\n transcript: transcriptFromMessages(input.messages),\n status: \"error\",\n error: serializeJsonError(input.error),\n });\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: [...session.messages],\n transcript: renumberTranscript(session.runs.flatMap((run) => run.transcript)),\n };\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(context: MemoryContext): string | undefined {\n const value = context.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 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 { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\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 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 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(context: MemoryContext): Promise<Message[]> {\n const session = this.getSession(context.sessionId);\n return Promise.resolve(session?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): 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.context.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.context.sessionId);\n\n this.insertMessages(input.context.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.context.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(context: MemoryContext): 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 updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: context.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_messages WHERE session_id = $id\").run({\n $id: context.sessionId,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({\n $id: context.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: MemoryErrorInput): Promise<void> {\n const runId = studioRunId(input.context) ?? input.runId;\n const existing = this.getSessionRun(input.context.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.context.sessionId,\n runId,\n transcript,\n status: \"error\",\n error: serializeJsonError(input.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 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 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 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 const db = this.database();\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 ORDER BY message_index ASC`,\n )\n .all({ $sessionId: sessionId }) 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 ORDER BY message_index ASC, part_index ASC`,\n )\n .all({ $sessionId: sessionId }) 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 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 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<JsonValue>(row.metadata_json);\n if (metadata !== undefined && !isJsonValue(metadata)) {\n throw new TypeError(\"Stored Studio message metadata is not a strict JSON value.\");\n }\n if (row.role === \"system\") {\n const message: Extract<Message, { role: \"system\" }> = {\n role: \"system\",\n content: systemContentFromParts(parts),\n };\n if (metadata !== undefined) message.metadata = metadata;\n return message;\n }\n if (row.role === \"user\") {\n const message: Extract<Message, { role: \"user\" }> = {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n if (metadata !== undefined) message.metadata = metadata;\n return message;\n }\n if (row.role === \"assistant\") {\n const 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.id = row.message_id;\n if (metadata !== undefined) message.metadata = metadata;\n return message;\n }\n if (row.role === \"tool\") {\n const message: Extract<Message, { role: \"tool\" }> = {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\n if (metadata !== undefined) message.metadata = 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 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 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(context: MemoryContext): string | undefined {\n const value = context.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"],"mappings":"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","names":["Agent","path","config","resolve","appendSessionLog","appendPipelineLog","resolve","durationMs","byteLength","durationMs","resolve","decision","isRecord","toJsonValue","isRecord","byteLength","createHook","createHook","resolve","process","isRecord","run","resolve","Agent","isJsonValue","path","studioRunId","serializeJsonError","isJsonValue"]}