@anvia/studio 0.7.28 → 0.7.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/studio.ts","../src/shared/compact.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/pipeline-logs.ts","../src/runtime/pipelines.ts","../src/runtime/questions.ts","../src/runtime/sessions.ts","../src/storage/memory-store.ts","../src/runtime/shared.ts","../src/runtime/status.ts","../src/runtime/tools.ts","../src/runtime/trace-routes.ts","../src/storage/sqlite-store.ts","../src/types.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 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 { compact } from \"./compact\";\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 { 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 { 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 this.server = serve({\n fetch: (request) => this.fetch(request),\n ...compact({ hostname: serveOptions.hostname }),\n port,\n });\n\n const log = serveOptions.log ?? true;\n if (log) {\n const host = serveOptions.hostname ?? \"localhost\";\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 this.sigintHandler = () => {\n this.close();\n process.exit(0);\n };\n process.once(\"SIGINT\", this.sigintHandler);\n\n return this;\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\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 return {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\n pipelines: inferStudioPipelines(pipelines),\n evals: options.evals ?? [],\n ...compact({ models: options.models }),\n ...compact({ stores: options.stores }),\n ...compact({ ui: options.ui }),\n };\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 return {\n id,\n pipeline,\n ...compact({ name: pipeline.name }),\n ...compact({ description: pipeline.description }),\n ...compact({ metadata: pipeline.metadata }),\n };\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 return {\n ...compact({ defaultMaxTurns: agent.defaultMaxTurns }),\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}\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 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) => c.json(buildConfig(options, agents, pipelines, stores)));\n registerStatusRoutes(app, { options, agents, pipelines, stores });\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 registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\n registerKnowledgeRoutes(app, {\n agents,\n ...compact({ traceStore: stores.traces }),\n });\n registerPipelineRoutes(app, {\n pipelines,\n pipelineMap,\n ...compact({ logStore: stores.pipelineLogs }),\n ...compact({ runStore: stores.pipelineRuns }),\n });\n\n registerAgentRunRoute(app, {\n agentMap,\n stores,\n modelRegistry,\n approvalRuntime,\n questionRuntime,\n });\n\n if (stores.sessions !== undefined) {\n registerMemoryRoutes(app, {\n sessionStore: stores.sessions,\n });\n registerSessionRoutes(app, {\n agentMap,\n sessionStore: stores.sessions,\n ...compact({ traceStore: stores.traces }),\n });\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 return {\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);\n },\n close() {},\n ...compact({ sessionStore: stores.sessions }),\n ...compact({ traceStore: stores.traces }),\n };\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","/**\n * Strips keys whose resolved type includes `undefined`.\n *\n * Replaces the verbose `...(x === undefined ? {} : { key: x })` pattern.\n */\nexport type Compact<T> = {\n [K in keyof T as undefined extends T[K] ? never : K]: Exclude<T[K], undefined>;\n};\n\nexport function compact<T extends Record<string, unknown>>(obj: T): Compact<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result as Compact<T>;\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 { compact } from \"../runtime/compact\";\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 ...compact({ name: this.props.args.trace?.name }),\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 ...compact({ output: result.output }),\n ...compact({ error: result.error }),\n ...compact({ usage: result.usage }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n\n await store.saveTrace(trace);\n }\n}\n\nclass ChildAgentToolTraceAccumulator {\n private readonly agentStarts = new Map<\n string,\n {\n startedAt: Date;\n agentId: string;\n agentName?: string;\n }\n >();\n private readonly generationStarts = new Map<\n string,\n {\n startedAt: Date;\n input?: JsonValue;\n agentId: string;\n agentName?: string;\n childTurn: number;\n }\n >();\n private readonly toolStarts: Array<{\n startedAt: Date;\n agentId: string;\n agentName?: string;\n childTurn: number;\n toolName: string;\n toolCallId?: string;\n internalCallId?: string;\n input?: JsonValue;\n completed: boolean;\n }> = [];\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 this.agentStarts.set(agentId, {\n startedAt: new Date(),\n agentId,\n ...compact({ agentName }),\n });\n }\n\n if (child.type === \"turn_start\") {\n this.generationStarts.set(generationKey(agentId, childTurn), {\n startedAt: new Date(),\n input: toJsonValue({\n prompt: child.prompt,\n history: child.history,\n }),\n agentId,\n ...compact({ agentName }),\n childTurn,\n });\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 this.completedObservations.push(\n traceObservation({\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 ...compact({ input: start?.input }),\n output: toJsonValue(child.response),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n }),\n );\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 this.toolStarts.push({\n startedAt: new Date(),\n agentId,\n ...compact({ agentName }),\n childTurn,\n toolName,\n ...compact({ toolCallId: callId }),\n input: toJsonValue(toolCallFunction?.arguments ?? {}),\n completed: false,\n });\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 this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.${toolName}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n ...compact({ input }),\n ...(typeof child.result === \"string\" ? { output: parseOrString(child.result) } : {}),\n metadata: {\n ...this.childMetadata(agentId, agentName, childTurn),\n ...compact({ toolCallId }),\n ...compact({ internalCallId }),\n },\n }),\n );\n return;\n }\n\n if (child.type === \"error\") {\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: this.childMetadata(agentId, agentName, childTurn),\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 return {\n id: globalThis.crypto.randomUUID(),\n ...(props.parentObservationId === undefined\n ? {}\n : { parentObservationId: props.parentObservationId }),\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 ...compact({ input: props.input }),\n ...compact({ output: props.output }),\n ...compact({ error: props.error }),\n ...compact({ metadata: props.metadata }),\n };\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 return {\n path: normalizeUiPath(options.path ?? \"/ui\"),\n title: options.title ?? \"Anvia Studio\",\n rootRoutes: options.rootRoutes ?? true,\n redirectRoot: options.redirectRoot ?? true,\n ...(options.clientScript === undefined ? {} : { clientScript: options.clientScript }),\n protectShell: options.protectShell ?? false,\n };\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}/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(\"/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 { compact } from \"./compact\";\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 mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n persistStreamingSessionTranscript,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\n memoryLoadedLog,\n memorySavedLog,\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 await appendSessionLog(\n props.store,\n runReceivedLog({\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 ...compact({ maxTurns: props.body.maxTurns }),\n ...compact({ toolConcurrency: props.body.toolConcurrency }),\n hasTrace: props.body.trace !== undefined,\n ...(props.body.metadata === undefined && props.selectedModel.ref === undefined\n ? {}\n : {\n metadata: {\n ...(props.body.metadata ?? {}),\n ...(props.selectedModel.ref === undefined\n ? {}\n : { [STUDIO_MODEL_METADATA_KEY]: props.selectedModel.ref }),\n },\n }),\n }),\n );\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 await props.store?.updateSessionMetadata?.(props.session.id, {\n ...(props.session.metadata ?? {}),\n [STUDIO_MODEL_METADATA_KEY]: props.selectedModel.ref,\n });\n }\n}\n\nfunction runMemoryMetadata(\n agentId: string,\n body: AgentRunRequest,\n selectedModel: SelectedModel,\n runId: string,\n): JsonObject {\n return {\n agentId,\n ...(body.metadata ?? {}),\n ...(selectedModel.ref === undefined ? {} : { [STUDIO_MODEL_METADATA_KEY]: selectedModel.ref }),\n studioRunId: runId,\n };\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 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 run.request.approvals(\n props.approvalRuntime.createApprovals({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n const effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n if (effectiveHook !== undefined) {\n run.request.requestHook(effectiveHook);\n }\n\n const runStream = mergeRunAndApprovalEvents(run.request.stream(), runtimeEvents);\n const stream =\n run.session === undefined || run.sessionStore === undefined\n ? runStream\n : persistStreamingSessionTranscript({\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 persistGeneratedMessages: run.shouldPersistSessionMessages,\n });\n return streamAgentRunEvents(c, stream);\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 effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n }),\n );\n run.request.approvals(\n props.approvalRuntime.createApprovals({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n }),\n );\n if (effectiveHook !== undefined) {\n run.request.requestHook(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 await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.message),\n transcript: transcriptFromMessages(response.messages),\n status: \"success\",\n });\n await appendSessionLog(\n run.sessionStore,\n runCompletedLog({\n sessionId: run.session.id,\n runId: run.runId,\n durationMs: Date.now() - run.runStartedAt,\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 await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.message),\n transcript: transcriptFromMessages(messages.slice(run.session.messageCount)),\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 type { JsonObject, JsonValue, Message } 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) && Object.values(value).every(isJsonValue);\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return isJsonObject(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 | 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 { compact } from \"./compact\";\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 providers.set(id, {\n ...provider,\n id,\n ...compact({\n defaultModel:\n provider.defaultModel !== undefined ? normalizeModelId(provider.defaultModel) : undefined,\n }),\n staticModels,\n });\n }\n\n return {\n ...compact({\n defaultModel: config.default !== undefined ? normalizeModelRef(config.default) : undefined,\n }),\n providers,\n agentPolicies: normalizeAgentPolicies(config.agents ?? {}),\n modelCache: new Map(),\n };\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 return {\n id: provider.id,\n ...compact({\n name: provider.name,\n defaultModel: provider.defaultModel,\n metadata: provider.metadata,\n }),\n models,\n };\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 return {\n providers,\n ...compact({ default: registry.defaultModel }),\n agents: agentsConfig,\n };\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 return c.json({\n providers,\n ...compact({ defaultModel: props.registry.defaultModel }),\n });\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 return {\n agentId: agent.id,\n ...compact({ defaultModel }),\n models: [...models, ...exactPolicyModels],\n ...compact({ warnings: warnings.length === 0 ? undefined : warnings }),\n };\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 models.set(\n model.id,\n modelSummary(provider, model.id, {\n id: model.id,\n ...compact({ name: model.name, description: model.description }),\n ...(staticModel ?? {}),\n metadata: {\n ...compact({\n type: model.type,\n createdAt: model.createdAt,\n ownedBy: model.ownedBy,\n contextLength: model.contextLength,\n }),\n ...(staticModel?.metadata ?? {}),\n },\n }),\n );\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 return {\n id: provider.id,\n ...compact({\n name: provider.name,\n defaultModel: provider.defaultModel,\n metadata: provider.metadata,\n warning,\n }),\n models: [...models.values()].sort((left, right) => left.ref.localeCompare(right.ref)),\n };\n}\n\nfunction modelSummary(\n provider: RuntimeProvider,\n modelId: string,\n model: StudioModelDefinition,\n): StudioModelSummary {\n return {\n ...model,\n id: modelId,\n ref: `${provider.id}:${modelId}`,\n providerId: provider.id,\n ...compact({ providerName: provider.name }),\n };\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 agentId.trim(),\n {\n ...compact({\n default: policy.default !== undefined ? normalizeModelRef(policy.default) : undefined,\n 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 },\n ]),\n );\n}\n\nfunction publicPolicy(policy: NormalizedAgentModelPolicy): StudioAgentModelPolicyConfig {\n return compact({ default: policy.default, allowed: policy.allowed });\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\";\nimport { compact } from \"./compact\";\n\nexport function traceSummary(trace: StudioTrace): StudioTraceSummary {\n return compact({\n id: trace.id,\n sessionId: trace.sessionId,\n name: trace.name,\n status: trace.status,\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n output: trace.output,\n error: trace.error,\n usage: trace.usage,\n metadata: trace.metadata,\n observationCount: trace.observations.length,\n }) as StudioTraceSummary;\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioObservabilityEvent,\n StudioObservabilityEventType,\n StudioPipelineLogStore,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport { compact } from \"./compact\";\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 return {\n ...stores,\n ...compact({\n sessions:\n stores.sessions !== undefined ? observeSessionStore(stores.sessions, hub) : undefined,\n traces: stores.traces !== undefined ? observeTraceStore(stores.traces, hub) : undefined,\n pipelineLogs:\n stores.pipelineLogs !== undefined\n ? observePipelineLogStore(stores.pipelineLogs, hub)\n : undefined,\n }),\n };\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 subscription = hub.subscribe(compact({ types }));\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 { compact } from \"./compact\";\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"message\" as const,\n role: \"user\" as const,\n text: content.text,\n attachments: attachments.length === 0 ? undefined : attachments,\n }) as StudioTranscriptEntry,\n );\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"reasoning\" as const,\n reasoningId: content.id,\n text: content.text,\n }) as StudioTranscriptEntry,\n );\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 return [\n {\n kind: \"image\",\n ...(content.source.type === \"base64\"\n ? { data: content.source.data, mediaType: content.source.mediaType }\n : { url: content.source.url }),\n },\n ];\n }\n if (content.type === \"document\") {\n return [\n compact({\n kind: \"document\" as const,\n name: content.source.filename,\n mediaType: content.source.mediaType,\n data: content.source.type === \"base64\" ? content.source.data : undefined,\n url: content.source.type === \"url\" ? content.source.url : undefined,\n }) as StudioTranscriptAttachment,\n ];\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 { compact } from \"./compact\";\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): Response {\n return streamStudioJsonl(events);\n}\n\nexport function traceForRun(\n trace: AgentTraceOptions | undefined,\n agentId: string,\n session: StudioSession | undefined,\n): AgentTraceOptions {\n const metadata = {\n ...(trace?.metadata ?? {}),\n agentId,\n };\n return {\n ...(trace ?? {}),\n metadata,\n ...(trace?.sessionId !== undefined\n ? { sessionId: trace.sessionId }\n : session === undefined\n ? {}\n : { sessionId: session.id }),\n };\n}\n\nexport async function* persistStreamingSessionTranscript(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n runId: string;\n persistGeneratedMessages?: boolean;\n}): AsyncIterable<AgentRunStreamEvent> {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n const title = optionalTitle(props.message);\n\n await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"running\",\n });\n\n try {\n for await (const event of props.stream) {\n acceptTranscriptStreamEvent(transcript, event);\n\n const nextSession = await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: event.type === \"final\" ? \"success\" : event.type === \"error\" ? \"error\" : \"running\",\n ...(event.type === \"error\" ? { error: serializeError(event.error) } : {}),\n });\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\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\n yield event;\n }\n } catch (error) {\n appendTranscriptAssistantError(transcript, errorText(error));\n await props.store.saveSessionRunTranscript({\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\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"tool\" as const,\n toolName: event.toolName,\n callId: event.toolCallId,\n args: event.args,\n result: event.result,\n structuredResult: event.structuredResult,\n }) as StudioTranscriptEntry,\n );\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"tool\" as const,\n toolName: event.toolName,\n callId: event.toolCallId,\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\n }) as StudioTranscriptEntry,\n );\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 matched.approval = compact({\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n resolvedAt: event.approval.resolvedAt,\n reason: event.approval.reason,\n }) as NonNullable<typeof matched.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 matched.question = compact({\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n answeredAt: event.question.answeredAt,\n questions: event.question.questions,\n answers: event.question.answers,\n }) as NonNullable<typeof matched.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 return compact({\n kind: \"message\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n text: child.delta,\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"reasoning_delta\") {\n return compact({\n kind: \"reasoning\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n reasoningId: child.id,\n text: child.delta,\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"tool_call\") {\n return compact({\n kind: \"tool\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n toolName: child.toolCall.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n args: formatJson(child.toolCall.function.arguments),\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"tool_result\") {\n return compact({\n kind: \"tool\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n toolName: child.toolName,\n callId: child.toolCallId,\n args: child.args,\n result: child.result,\n structuredResult: child.structuredResult,\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"error\") {\n return compact({\n kind: \"message\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n text: `Error: ${errorText(child.error)}`,\n }) as StudioTranscriptChildAgentEvent;\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 return {\n entryId,\n kind: \"message\",\n role,\n text: extractMessageText(message),\n ...(role === \"user\" ? optionalTranscriptAttachments(message) : {}),\n };\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"reasoning\" as const,\n reasoningId,\n text: delta,\n }) as StudioTranscriptEntry,\n );\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 return [\n {\n kind: \"image\",\n ...(content.source.type === \"base64\"\n ? { data: content.source.data, mediaType: content.source.mediaType }\n : { url: content.source.url }),\n },\n ];\n }\n if (content.type === \"document\") {\n return [\n compact({\n kind: \"document\" as const,\n name: content.source.filename,\n mediaType: content.source.mediaType,\n data: content.source.type === \"base64\" ? content.source.data : undefined,\n url: content.source.type === \"url\" ? content.source.url : undefined,\n }) as StudioTranscriptAttachment,\n ];\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 return {\n message,\n ...(history.length === 0 ? {} : { history }),\n };\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 { compact } from \"./compact\";\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: compact({\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 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: compact({\n agentId: props.agentId,\n stream: props.stream,\n message: messageSummary(props.message),\n maxTurns: props.maxTurns,\n toolConcurrency: props.toolConcurrency,\n hasTrace: props.hasTrace,\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\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: compact({\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: compact({\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 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: compact({\n durationMs: props.durationMs,\n usage: usageSummary(props.usage),\n outputBytes: byteLength(props.output),\n messageCount: props.messageCount,\n }),\n };\n}\n\nexport function memorySavedLog(props: {\n sessionId: string;\n runId: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\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: compact({\n messageCount: props.messageCount,\n }),\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: compact({\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: compact({\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: compact({\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 return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.completed\",\n message: `Tool ${event.toolName} completed`,\n metadata: compact({\n turn: event.turn,\n toolName: event.toolName,\n callId: event.toolCallId,\n internalCallId: event.internalCallId,\n argumentBytes: byteLength(event.args),\n resultBytes: byteLength(event.result),\n structuredResultBytes:\n event.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(event.structuredResult)),\n }),\n },\n ];\n }\n if (event.type === \"turn_end\") {\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: compact({\n turn: event.turn,\n contentCount: event.response.choice.length,\n usage: usageSummary(event.response.usage),\n }),\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 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: compact({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n argumentBytes: byteLength(event.approval.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_approval_result\") {\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: compact({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n }),\n },\n ];\n }\n if (event.type === \"tool_question_request\") {\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: compact({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_question_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.answered\",\n message: `Question answered for ${event.question.toolName}`,\n metadata: compact({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n answerCount: event.question.answers?.length ?? 0,\n }),\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: compact({\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 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: compact({\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 callId: child.toolCallId,\n resultBytes: byteLength(child.result),\n structuredResultBytes:\n child.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(child.structuredResult)),\n }),\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: compact({\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 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: compact({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n usage: usageSummary(child.usage),\n outputBytes: byteLength(child.output),\n messageCount: child.messages.length,\n }),\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: compact({\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 return compact({\n inputTokens: numericValue(record.inputTokens),\n outputTokens: numericValue(record.outputTokens),\n totalTokens: numericValue(record.totalTokens),\n cachedInputTokens: numericValue(record.cachedInputTokens),\n cacheCreationInputTokens: numericValue(record.cacheCreationInputTokens),\n });\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 { compact } from \"./compact\";\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 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 return compact({\n approved: body.approved,\n reason:\n typeof body.reason === \"string\" && body.reason.trim().length > 0\n ? body.reason.trim()\n : undefined,\n }) as StudioToolApprovalDecision;\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 decision = await requestApproval(\n approvals,\n context,\n compact({\n toolName: request.toolName,\n toolCallId: request.toolCallId,\n internalCallId: request.internalCallId,\n args: request.rawArgs,\n reason: request.reason,\n rejectMessage: request.rejectMessage,\n }) as ApprovalRequest,\n );\n return decision.approved\n ? compact({ approved: true as const, reason: decision.reason })\n : compact({ approved: false as const, reason: 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 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 compact({ reason }),\n );\n approvals.set(id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve(\n compact({\n approved: decision.approved,\n reason,\n }) as StudioToolApprovalDecision,\n );\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 ...compact({\n id,\n runId: context.runId,\n agentId: context.agentId,\n sessionId: context.sessionId,\n toolName: request.toolName,\n callId: request.toolCallId,\n internalCallId: request.internalCallId,\n args: request.args,\n status: \"pending\" as const,\n requestedAt: new Date().toISOString(),\n reason: request.reason,\n rejectMessage: request.rejectMessage,\n emit: context.emit,\n }),\n resolve: () => {},\n };\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(\n compact({\n approved: current.status === \"approved\",\n reason: current.reason,\n }) as StudioToolApprovalDecision,\n );\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 compact({ reason }),\n );\n approvals.set(id, resolved);\n context.emit?.({ type: \"tool_approval_result\", approval: resolved });\n resolve(\n compact({\n approved: decision.approved,\n reason,\n }) as StudioToolApprovalDecision,\n );\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 return publicApproval({\n ...approval,\n ...compact({\n status,\n resolvedAt: new Date().toISOString(),\n reason: options.reason,\n }),\n });\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 { compact } from \"./compact\";\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 return compact({\n id: suite.id ?? suite.name,\n name: suite.name,\n description: suite.description,\n caseCount: suite.cases.length,\n metricNames: suite.metrics.map((metric) => metric.name),\n casePreviewCount: casePreviews.length,\n casePreviews,\n metricSummaries,\n concurrency: suite.concurrency,\n metadata: suite.metadata,\n }) as StudioEvalSuiteConfig;\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 return compact({\n id:\n typeof testCase.id === \"string\" && testCase.id.length > 0 ? testCase.id : `case-${index + 1}`,\n input: \"input\" in testCase ? previewValue(testCase.input) : undefined,\n expected: \"expected\" in testCase ? previewValue(testCase.expected) : undefined,\n metadataKeys: metadataKeys(testCase.metadata),\n }) as StudioEvalCasePreview;\n}\n\nfunction metricSummary(metric: unknown, index: number): StudioEvalMetricSummary {\n if (!isRecord(metric)) {\n return { name: `metric-${index + 1}` };\n }\n\n return compact({\n name:\n typeof metric.name === \"string\" && metric.name.length > 0\n ? metric.name\n : `metric-${index + 1}`,\n dataType: metricDataType(metric.dataType),\n configId: typeof metric.configId === \"string\" ? metric.configId : undefined,\n scoreConfigId: typeof metric.scoreConfigId === \"string\" ? metric.scoreConfigId : undefined,\n metadataKeys: metadataKeys(metric.metadata),\n }) as StudioEvalMetricSummary;\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 return {\n required: true,\n ...(typeof policy.reason === \"string\" ? { reason: policy.reason } : {}),\n ...(typeof policy.rejectMessage === \"string\" ? { rejectMessage: policy.rejectMessage } : {}),\n };\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 { compact } from \"./compact\";\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 return compact({\n id: agent.id,\n name,\n description,\n quickPrompts: agent.quickPrompts ?? [],\n metadata: agent.metadata,\n }) as StudioAgentConfig;\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 return compact({\n id: agent.id,\n name,\n description,\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 defaultMaxTurns: agent.agent.defaultMaxTurns,\n metadata: agent.metadata,\n }) as StudioAgentRuntimeSummary;\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 return compact({\n id: pipeline.id,\n name: pipeline.name,\n description: pipeline.description,\n metadata: pipeline.metadata,\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 }) as StudioPipelineConfig;\n}\n\nexport function buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n): StudioConfig {\n const models =\n options.models === undefined\n ? undefined\n : studioModelsConfig(createStudioModelRegistry(options.models), agents);\n return compact({\n id: runnerId(options),\n name: options.name,\n description: options.description,\n version: options.version,\n agents: agents.map(agentConfig),\n models,\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),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n }) as StudioConfig;\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\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 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\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 return [\n ...(stores.sessions === undefined ? ([\"sessions\"] as const) : []),\n ...(stores.traces === undefined ? ([\"traces\"] as const) : []),\n ];\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 { compact } from \"./compact\";\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 result = await runEvalSuite({\n ...suite,\n ...compact({ concurrency: body.concurrency }),\n });\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 StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { compact } from \"./compact\";\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 return {\n agentId: agent.id,\n ...compact({ agentName }),\n sources: await knowledgeSources(agent),\n staticContext: agent.agent.staticContext.map((document) => ({\n id: document.id,\n text: document.text,\n ...compact({\n additionalProps:\n document.additionalProps !== undefined\n ? jsonObjectFromRecord(document.additionalProps)\n : undefined,\n }),\n })),\n };\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 return {\n sourceId: dynamicContextSourceId(index),\n kind: \"dynamic_context\" as const,\n label: `Dynamic context ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...compact({ threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...compact({ itemCount: count }),\n };\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 return {\n sourceId: dynamicToolsSourceId(index),\n kind: \"dynamic_tools\" as const,\n label: `Dynamic tools ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...compact({ threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...compact({ itemCount: count }),\n };\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 return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_context\",\n inspectable: true,\n items: page.items.map((item) => dynamicContextItem(item)),\n ...compact({ nextCursor: page.nextCursor, totalCount: page.totalCount }),\n };\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 return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_tools\",\n inspectable: true,\n items: page.items.map((item) => dynamicToolItem(item)),\n ...compact({ nextCursor: page.nextCursor, totalCount: page.totalCount }),\n };\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 return {\n agentId: agent.id,\n sourceId: staticSourceId(),\n kind: \"static_context\",\n inspectable: true,\n items: page.map((document) => ({\n id: document.id,\n kind: \"static_context\",\n text: document.text,\n ...compact({\n metadata:\n document.additionalProps !== undefined\n ? jsonObjectFromRecord(document.additionalProps)\n : undefined,\n }),\n })),\n ...compact({\n nextCursor: nextOffset < agent.agent.staticContext.length ? String(nextOffset) : undefined,\n }),\n totalCount: agent.agent.staticContext.length,\n };\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 return {\n id: item.id,\n kind: \"dynamic_context\",\n ...(text === undefined ? { document: toJsonValue(item.document) } : { text }),\n ...compact({\n metadata: item.metadata !== undefined ? jsonObjectFromRecord(item.metadata) : undefined,\n }),\n };\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 return {\n id: item.id,\n kind: \"dynamic_tool\",\n toolName,\n description,\n parameterKeys: parameterKeys(definition.parameters),\n document: toJsonValue(item.document),\n ...compact({\n metadata: item.metadata !== undefined ? jsonObjectFromRecord(item.metadata) : undefined,\n }),\n };\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 return [\n {\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 ...compact({ query }),\n documentCount: documents.length,\n toolCount: tools.length,\n documents,\n tools,\n },\n ];\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 return [compact({ id, text, additionalProps })];\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 { Hono } from \"hono\";\nimport type {\n StudioMemoryConversationMessages,\n StudioMemoryConversationSteps,\n StudioMemoryConversationSummary,\n StudioMemoryConversationsPage,\n StudioMemoryUsersPage,\n StudioSession,\n StudioSessionStore,\n StudioSessionSummary,\n} from \"../types\";\nimport { compact } from \"./compact\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString, parseLimit } from \"./query\";\n\nconst DEFAULT_USER_ID = \"default\";\n\nexport function registerMemoryRoutes(\n app: Hono,\n props: {\n sessionStore: StudioSessionStore;\n },\n): 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 props.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)) {\n existing.agentIds.push(session.agentId);\n }\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 sessions = await props.sessionStore.listSessions({\n ...compact({ agentId }),\n limit: 100,\n });\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 props.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 props.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 memoryConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemoryConversationSummary {\n return compact({\n id: session.id,\n userId: sessionUserId(session),\n agentId: session.agentId,\n title: session.title,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n metadata: session.metadata,\n }) as StudioMemoryConversationSummary;\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","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 { compact } from \"./compact\";\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 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: compact({\n stream: props.stream,\n inputBytes: byteLength(formatUnknown(props.input)),\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\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: compact({\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 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: compact({\n durationMs: props.durationMs,\n outputBytes: byteLength(formatUnknown(props.output)),\n }),\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: compact({\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: compact({\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: compact({\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 return compact({\n nodeId: node.id,\n kind: node.kind,\n label: node.label,\n agentId: node.agentId,\n pipelineId: node.pipelineId,\n branchKey: node.branchKey,\n });\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 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 { compact } from \"./compact\";\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, 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 logs = await props.logStore.listPipelineLogs({\n pipelineId,\n limit,\n ...compact({ after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\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 return executePipelineRun(c, props, pipeline, {\n input: sourceRun.input,\n ...compact({ stream: body.stream }),\n metadata: replayMetadata(sourceRun.metadata, body.metadata, sourceRun.runId),\n });\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 await appendPipelineLog(\n props.logStore,\n pipelineRunReceivedLog({\n pipeline,\n runId,\n stream: body.stream === true,\n input: body.input,\n ...compact({ metadata: body.metadata }),\n }),\n );\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"running\",\n input: body.input,\n ...compact({ metadata: body.metadata }),\n startedAt: startedAtIso,\n });\n\n if (body.stream === true) {\n return streamPipelineRun(c, {\n pipeline,\n runId,\n input: body.input,\n startedAt,\n startedAtIso,\n ...compact({ metadata: body.metadata }),\n ...compact({ logStore: props.logStore, runStore: props.runStore }),\n });\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 await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"success\",\n input: body.input,\n output: jsonOutput,\n ...compact({ metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\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 await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"error\",\n input: body.input,\n error: serializeError(error),\n ...compact({ metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\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 await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"success\",\n input: props.input,\n output: jsonOutput,\n ...compact({ metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\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 await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"error\",\n input: props.input,\n error: serializeError(error),\n ...compact({ metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\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) } as AgentRunStreamEvent);\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 return {\n ...(sourceMetadata ?? {}),\n ...(requestMetadata ?? {}),\n replayOf: sourceRunId,\n };\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\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return Number.isFinite(value) || typeof value !== \"number\";\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (isObject(value)) {\n return Object.values(value).every((item) => item === undefined || isJsonValue(item));\n }\n return false;\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 { compact } from \"./compact\";\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 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 answers.push(\n compact({\n questionId: answer.questionId.trim(),\n answer: answer.answer.trim(),\n choice: typeof answer.choice === \"string\" ? answer.choice : undefined,\n custom: typeof answer.custom === \"boolean\" ? answer.custom : undefined,\n }) as StudioToolQuestionAnswer,\n );\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 answers = await requestQuestion(\n questions,\n context,\n compact({\n toolName,\n toolCallId,\n internalCallId,\n args,\n questions: prompts.questions,\n }) as QuestionRequest,\n );\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 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 ...compact({\n id,\n runId: context.runId,\n agentId: context.agentId,\n sessionId: context.sessionId,\n toolName: request.toolName,\n callId: request.toolCallId,\n internalCallId: request.internalCallId,\n args: request.args,\n questions: request.questions,\n status: \"pending\" as const,\n requestedAt: new Date().toISOString(),\n emit: context.emit,\n }),\n resolve: () => {},\n };\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 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 type { JsonObject } from \"@anvia/core/completion\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport { compact } from \"./compact\";\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 sessions = await props.sessionStore.listSessions({\n ...compact({ agentId }),\n limit,\n });\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 session = await props.sessionStore.createSession({\n id: globalThis.crypto.randomUUID(),\n agentId: body.agentId,\n ...compact({ title: body.title, metadata: body.metadata }),\n });\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 logs = await props.sessionStore.listSessionLogs({\n sessionId,\n limit,\n ...compact({ after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\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 { compact } from \"../runtime/compact\";\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 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 ...compact({\n id: input.id,\n agentId: input.agentId,\n title: input.title,\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n metadata: input.metadata,\n }),\n messages: [],\n runs: [],\n logs: [],\n };\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 = compact({\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n runId: input.runId,\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 metadata: input.metadata,\n }) as StudioSessionLogEntry;\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 = compact({\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n runId: input.runId,\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 metadata: input.metadata,\n }) as StudioPipelineLogEntry;\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 = compact({\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n output: input.output,\n error: input.error,\n metadata: input.metadata,\n startedAt: input.startedAt,\n endedAt: input.endedAt,\n durationMs: input.durationMs,\n }) as StudioPipelineRunRecord;\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 return compact({\n id: session.id,\n agentId: session.agentId,\n title: session.title,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messages.length,\n metadata: session.metadata,\n }) as StudioSessionSummary;\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 traceSummary(trace: StudioTrace): StudioTraceSummary {\n return compact({\n id: trace.id,\n sessionId: trace.sessionId,\n name: trace.name,\n status: trace.status,\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n output: trace.output,\n error: trace.error,\n usage: trace.usage,\n metadata: trace.metadata,\n observationCount: trace.observations.length,\n }) as StudioTraceSummary;\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\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return isJsonObject(value) && Object.values(value).every(isJsonValue);\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 { compact } from \"./compact\";\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 return compact({\n sessions,\n traces,\n pipelineLogs,\n pipelineRuns,\n }) as ResolvedStores;\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 { compact } from \"./compact\";\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 },\n): void {\n app.get(\"/status\", async (c) => {\n const summary: StudioStatusSummary = {\n runner: {\n id: runnerId(props.options),\n ...compact({ name: props.options.name, version: props.options.version }),\n },\n storage: {\n ...compact({\n sessions: props.stores.sessions?.kind,\n traces: props.stores.traces?.kind,\n pipelineLogs:\n props.stores.pipelineLogs !== undefined ? (\"available\" as const) : undefined,\n pipelineRuns:\n props.stores.pipelineRuns !== undefined ? (\"available\" as const) : undefined,\n }),\n },\n counts: {\n agents: props.agents.length,\n pipelines: props.pipelines.length,\n ...compact({\n sessions:\n props.stores.sessions !== undefined\n ? (await props.stores.sessions.listSessions({ limit: 100 })).length\n : undefined,\n traces:\n props.stores.traces?.listTraces !== undefined\n ? (await props.stores.traces.listTraces({ limit: 100 })).length\n : undefined,\n pipelineRuns:\n props.stores.pipelineRuns !== undefined && props.pipelines.length > 0\n ? (\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 : undefined,\n }),\n },\n capabilities: capabilityConfig(props.options, props.agents, props.pipelines, props.stores),\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 metadata.push({\n agentId: agent.id,\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n ...(serverName === undefined ? {} : { mcpServerName: serverName }),\n approval: approvalMetadata(tool),\n });\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 { compact } from \"./compact\";\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 traces = await traceStore.listTraces({\n limit,\n ...compact({ agentId, sessionId, status }),\n });\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 type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\nimport { compact } from \"../runtime/compact\";\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 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 return {\n id: input.id,\n agentId: input.agentId,\n ...compact({ title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...compact({ metadata: input.metadata }),\n };\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 ...compact({ runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...compact({ metadata: input.metadata }),\n };\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 ...compact({ runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...compact({ metadata: input.metadata }),\n };\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 return {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n ...compact({ output: input.output }),\n ...compact({ error: input.error }),\n ...compact({ metadata: input.metadata }),\n startedAt: input.startedAt,\n ...compact({ endedAt: input.endedAt }),\n ...compact({ durationMs: input.durationMs }),\n };\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 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\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, 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 created_at\n ) VALUES ($sessionId, $messageIndex, $role, $messageId, $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 insertMessage.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $role: message.role,\n $messageId: message.role === \"assistant\" ? (message.id ?? null) : null,\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 return {\n id: row.id,\n agentId: row.agent_id,\n ...compact({ title: row.title ?? undefined }),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: row.message_count,\n ...compact({ metadata }),\n };\n}\n\nfunction toSessionLog(row: SessionLogRow): StudioSessionLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n sessionId: row.session_id,\n ...compact({ runId: row.run_id ?? undefined }),\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 ...compact({ metadata }),\n };\n}\n\nfunction toPipelineLog(row: PipelineLogRow): StudioPipelineLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n pipelineId: row.pipeline_id,\n ...compact({ runId: row.run_id ?? undefined }),\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 ...compact({ metadata }),\n };\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 return {\n runId: row.run_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n input: JSON.parse(row.input_json) as JsonValue,\n ...compact({ output }),\n ...compact({ error }),\n ...compact({ metadata }),\n startedAt: row.started_at,\n ...compact({ endedAt: row.ended_at ?? undefined }),\n ...compact({ durationMs: row.duration_ms ?? undefined }),\n };\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\n if (row.role === \"system\") {\n return { role: \"system\", content: systemContentFromParts(parts) };\n }\n if (row.role === \"user\") {\n return {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n }\n if (row.role === \"assistant\") {\n return {\n role: \"assistant\",\n ...compact({ id: row.message_id ?? undefined }),\n content: parts as Extract<Message, { role: \"assistant\" }>[\"content\"],\n };\n }\n if (row.role === \"tool\") {\n return {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\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 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 return {\n ...toTraceSummary(row),\n ...compact({ trace }),\n ...compact({ input }),\n observations: parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json),\n };\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 return {\n id: row.id,\n sessionId: row.session_id,\n ...compact({ name: row.name ?? undefined }),\n status: row.status,\n startedAt: row.started_at,\n ...compact({ endedAt: row.ended_at ?? undefined }),\n ...compact({ durationMs: row.duration_ms ?? undefined }),\n ...compact({ output: row.output ?? undefined }),\n ...compact({ error }),\n ...compact({ usage }),\n ...compact({ metadata }),\n observationCount: observations.length,\n };\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","import type {\n CompletionModel,\n CompletionModelCapabilities,\n JsonObject,\n JsonValue,\n Message,\n StreamingCompletionModel,\n ToolResultContent,\n Usage,\n} from \"@anvia/core/completion\";\nimport type { Agent } from \"@anvia/core/internal/agent\";\nimport type { ModelList } from \"@anvia/core/model-listing\";\nimport type { Pipeline, PipelineGraph } from \"@anvia/core/pipeline\";\nimport type { AgentStreamEvent, PromptResponse } from \"@anvia/core/request\";\nimport type { Hono } from \"hono\";\nimport { compact } from \"./shared/compact\";\n\nexport type StudioCapability =\n | \"agents\"\n | \"approvals\"\n | \"evals\"\n | \"memory\"\n | \"knowledge\"\n | \"mcps\"\n | \"observability\"\n | \"pipelines\"\n | \"sessions\"\n | \"status\"\n | \"tools\"\n | \"traces\";\n\nexport type AgentTraceInfo = {\n traceId?: string | undefined;\n observationId?: string | undefined;\n};\n\nexport type AgentTraceOptions = {\n name?: string | undefined;\n userId?: string | undefined;\n sessionId?: string | undefined;\n metadata?: Record<string, unknown> | undefined;\n tags?: string[] | undefined;\n version?: string | undefined;\n traceId?: string | undefined;\n failOnObserverError?: boolean | undefined;\n};\n\nexport type StudioModelRef = string | { provider: string; model: string };\n\nexport type StudioModelModality = \"text\" | \"image\" | \"document\" | \"audio\" | \"video\";\n\nexport type StudioModelModalities = {\n input: StudioModelModality[];\n output?: StudioModelModality[];\n};\n\nexport type StudioModelDefinition = {\n id: string;\n name?: string;\n description?: string;\n modalities?: StudioModelModalities;\n capabilities?: Partial<CompletionModelCapabilities>;\n metadata?: JsonObject;\n};\n\nexport type StudioModelProvider = {\n id: string;\n name?: string;\n defaultModel?: string;\n models?: StudioModelDefinition[];\n createCompletionModel(model: string): CompletionModel | StreamingCompletionModel;\n listModels?: () => Promise<ModelList>;\n metadata?: JsonObject;\n};\n\nexport type StudioAgentModelPolicy = {\n default?: StudioModelRef;\n allowed?: Array<StudioModelRef | `${string}:*`>;\n};\n\nexport type StudioModelConfig = {\n providers: StudioModelProvider[];\n default?: StudioModelRef;\n agents?: Record<string, StudioAgentModelPolicy>;\n};\n\nexport type StudioModelSummary = StudioModelDefinition & {\n ref: string;\n providerId: string;\n providerName?: string;\n};\n\nexport type StudioModelProviderConfig = {\n id: string;\n name?: string;\n defaultModel?: string;\n models: StudioModelSummary[];\n metadata?: JsonObject;\n warning?: string;\n};\n\nexport type StudioAgentModelPolicyConfig = {\n default?: string;\n allowed?: string[];\n};\n\nexport type StudioModelsConfig = {\n providers: StudioModelProviderConfig[];\n default?: string;\n agents: Record<string, StudioAgentModelPolicyConfig>;\n};\n\nexport type StudioAgentModelsSummary = {\n agentId: string;\n defaultModel?: string;\n models: StudioModelSummary[];\n warnings?: JsonObject[];\n};\n\nexport type StudioAgent = {\n id: string;\n agent: Agent;\n name?: string;\n description?: string;\n quickPrompts?: string[];\n metadata?: JsonObject;\n};\n\n// Studio accepts arbitrary pipelines and validates run inputs at the HTTP boundary.\n// biome-ignore lint/suspicious/noExplicitAny: input/output types remain user-defined outside Studio.\nexport type StudioTarget = Agent | Pipeline<any, any>;\n\nexport type StudioAgentConfig = {\n id: string;\n name?: string;\n description?: string;\n quickPrompts: string[];\n metadata?: JsonObject;\n};\n\nexport type StudioAgentRuntimeSummary = {\n id: string;\n name?: string;\n description?: string;\n model?: JsonValue;\n toolCount: number;\n staticToolCount: number;\n dynamicToolCount: number;\n approvalToolCount: number;\n mcpToolCount: number;\n staticContextCount: number;\n dynamicContextCount: number;\n observerCount: number;\n hasMemory: boolean;\n hasHook: boolean;\n hasOutputSchema: boolean;\n defaultMaxTurns?: number;\n metadata?: JsonObject;\n};\n\nexport type StudioPipeline = {\n id: string;\n // biome-ignore lint/suspicious/noExplicitAny: Studio stores heterogeneous user pipelines.\n pipeline: Pipeline<any, any>;\n name?: string;\n description?: string;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineConfig = {\n id: string;\n name?: string;\n description?: string;\n metadata?: JsonObject;\n stageCount: number;\n edgeCount: number;\n hasParallelStages: boolean;\n agentCount: number;\n extractorCount: number;\n};\n\nexport type StudioPipelineDetail = StudioPipelineConfig & {\n graph: PipelineGraph;\n};\n\nexport type StudioEvalSuite<\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous eval suites.\n Input = any,\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous eval suites.\n _Output = any,\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous eval suites.\n _Expected = any,\n> = {\n name: string;\n cases: Array<Input>;\n // biome-ignore lint/suspicious/noExplicitAny: Studio passes eval targets through to core.\n target: any;\n // biome-ignore lint/suspicious/noExplicitAny: Studio only reads metric names and passes metrics through.\n metrics: any[];\n concurrency?: number;\n // biome-ignore lint/suspicious/noExplicitAny: Studio passes reporters through to core.\n reporters?: any[];\n failOnReporterError?: boolean;\n id?: string;\n description?: string;\n metadata?: JsonObject;\n};\n\nexport type StudioEvalSuiteConfig = {\n id: string;\n name: string;\n description?: string;\n caseCount: number;\n metricNames: string[];\n casePreviewCount?: number;\n casePreviews?: StudioEvalCasePreview[];\n metricSummaries?: StudioEvalMetricSummary[];\n concurrency?: number;\n metadata?: JsonObject;\n};\n\nexport type StudioEvalCasePreview = {\n id: string;\n input?: JsonValue;\n expected?: JsonValue;\n metadataKeys?: string[];\n};\n\nexport type StudioEvalMetricSummary = {\n name: string;\n dataType?: \"NUMERIC\" | \"CATEGORICAL\" | \"BOOLEAN\";\n configId?: string;\n scoreConfigId?: string;\n metadataKeys?: string[];\n};\n\nexport type StudioEvalRunRequest = {\n concurrency?: number;\n};\n\nexport type StudioEvalRunResponse = {\n runId: string;\n suiteId: string;\n startedAt: string;\n endedAt: string;\n durationMs: number;\n result: JsonObject;\n};\n\nexport type StudioCapabilityConfig = {\n enabled: boolean;\n reason?: string;\n};\n\nexport type StudioConfig = {\n id: string;\n name?: string;\n description?: string;\n version?: string;\n agents: StudioAgentConfig[];\n models?: StudioModelsConfig;\n pipelines: StudioPipelineConfig[];\n evals: StudioEvalSuiteConfig[];\n chat: {\n quickPrompts: Record<string, string[]>;\n };\n capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>>;\n unsupportedCapabilities: StudioCapability[];\n};\n\nexport type StudioAgentToolSource = \"static\" | \"dynamic\";\n\nexport type StudioAgentToolApprovalMetadata = {\n required: boolean;\n reason?: string;\n rejectMessage?: string;\n};\n\nexport type StudioAgentToolMetadata = {\n agentId: string;\n name: string;\n description: string;\n parameters: JsonObject;\n source: StudioAgentToolSource;\n mcpServerName?: string;\n approval: StudioAgentToolApprovalMetadata;\n};\n\nexport type StudioAgentToolsSummary = {\n agentId: string;\n tools: StudioAgentToolMetadata[];\n};\n\nexport type StudioToolRunRequest = {\n args: JsonValue;\n context?: JsonObject;\n};\n\nexport type StudioToolRunResponse = {\n agentId: string;\n toolName: string;\n result?: JsonValue;\n error?: JsonValue;\n status: \"success\" | \"error\";\n durationMs: number;\n startedAt: string;\n endedAt: string;\n events: JsonValue[];\n};\n\nexport type StudioAgentMcpToolMetadata = {\n name: string;\n description: string;\n parameters: JsonObject;\n source: StudioAgentToolSource;\n approval: StudioAgentToolApprovalMetadata;\n};\n\nexport type StudioAgentMcpServerMetadata = {\n agentId: string;\n name: string;\n toolCount: number;\n tools: StudioAgentMcpToolMetadata[];\n};\n\nexport type StudioAgentMcpsSummary = {\n agentId: string;\n servers: StudioAgentMcpServerMetadata[];\n};\n\nexport type StudioTranscriptChatEntry = {\n entryId: number;\n kind: \"message\";\n role: \"user\" | \"assistant\";\n text: string;\n tone?: \"error\";\n traceId?: string;\n attachments?: StudioTranscriptAttachment[];\n};\n\nexport type StudioTranscriptAttachment = {\n kind: \"image\" | \"document\";\n name?: string;\n mediaType?: string;\n data?: string;\n url?: string;\n};\n\nexport type StudioTranscriptReasoningEntry = {\n entryId: number;\n kind: \"reasoning\";\n reasoningId?: string;\n text: string;\n};\n\nexport type StudioTranscriptToolEntry = {\n entryId: number;\n kind: \"tool\";\n toolName: string;\n callId?: string;\n args?: string;\n result?: string;\n structuredResult?: ToolResultContent[];\n childEvents?: StudioTranscriptChildAgentEvent[];\n approval?: StudioToolApprovalTranscript;\n question?: StudioToolQuestionTranscript;\n};\n\nexport type StudioTranscriptChildAgentEvent =\n | {\n kind: \"message\";\n agentId: string;\n agentName?: string;\n text: string;\n }\n | {\n kind: \"reasoning\";\n agentId: string;\n agentName?: string;\n reasoningId?: string;\n text: string;\n }\n | {\n kind: \"tool\";\n agentId: string;\n agentName?: string;\n toolName: string;\n callId?: string;\n args?: string;\n result?: string;\n structuredResult?: ToolResultContent[];\n };\n\nexport type StudioTranscriptEntry =\n | StudioTranscriptChatEntry\n | StudioTranscriptReasoningEntry\n | StudioTranscriptToolEntry;\n\nexport type StudioSessionSummary = {\n id: string;\n agentId: string;\n title?: string;\n createdAt: string;\n updatedAt: string;\n messageCount: number;\n metadata?: JsonObject;\n};\n\nexport type StudioSession = StudioSessionSummary & {\n messages: Message[];\n transcript: StudioTranscriptEntry[];\n};\n\nexport type StudioSessionCreateInput = {\n id: string;\n agentId: string;\n title?: string;\n metadata?: JsonObject;\n};\n\nexport type StudioSessionListOptions = {\n agentId?: string;\n limit: number;\n};\n\nexport type StudioSessionRunStatus = \"running\" | \"success\" | \"error\";\n\nexport type StudioSessionRunTranscriptInput = {\n id: string;\n runId: string;\n title?: string;\n transcript: StudioTranscriptEntry[];\n status: StudioSessionRunStatus;\n error?: JsonValue;\n};\n\nexport type StudioSessionLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type StudioSessionLogCategory =\n | \"session\"\n | \"run\"\n | \"memory\"\n | \"prompt\"\n | \"model\"\n | \"tool\"\n | \"approval\"\n | \"question\"\n | \"api\";\n\nexport type StudioSessionLogEntry = {\n id: string;\n sessionId: string;\n runId?: string;\n sequence: number;\n timestamp: string;\n level: StudioSessionLogLevel;\n category: StudioSessionLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioSessionLogAppendInput = {\n sessionId: string;\n runId?: string;\n level: StudioSessionLogLevel;\n category: StudioSessionLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioSessionLogListOptions = {\n sessionId: string;\n limit: number;\n after?: number;\n};\n\nexport type StudioMemoryContext = {\n sessionId: string;\n userId?: string | undefined;\n metadata?: JsonObject | undefined;\n};\n\nexport type StudioMemoryAppendInput = {\n context: StudioMemoryContext;\n runId: string;\n turn: number;\n messages: Message[];\n};\n\nexport type StudioMemoryErrorInput = {\n context: StudioMemoryContext;\n runId: string;\n error: unknown;\n messages: Message[];\n};\n\nexport type StudioMemoryStore = {\n load(context: StudioMemoryContext): Promise<Message[]>;\n append(input: StudioMemoryAppendInput): Promise<void>;\n clear(context: StudioMemoryContext): Promise<void>;\n recordError?(input: StudioMemoryErrorInput): Promise<void>;\n};\n\nexport type StudioSessionStore = StudioMemoryStore & {\n readonly kind?: string;\n listSessions(\n options: StudioSessionListOptions,\n ): StudioSessionSummary[] | Promise<StudioSessionSummary[]>;\n createSession(\n input: StudioSessionCreateInput,\n ): StudioSessionSummary | Promise<StudioSessionSummary>;\n getSession(id: string): StudioSession | undefined | Promise<StudioSession | undefined>;\n saveSessionRunTranscript(\n input: StudioSessionRunTranscriptInput,\n ): StudioSession | undefined | Promise<StudioSession | undefined>;\n updateSessionMetadata?(\n id: string,\n metadata: JsonObject | undefined,\n ): StudioSession | undefined | Promise<StudioSession | undefined>;\n appendSessionLog?(\n input: StudioSessionLogAppendInput,\n ): StudioSessionLogEntry | Promise<StudioSessionLogEntry>;\n listSessionLogs?(\n options: StudioSessionLogListOptions,\n ): StudioSessionLogEntry[] | Promise<StudioSessionLogEntry[]>;\n deleteSession?(id: string): boolean | Promise<boolean>;\n};\n\nexport type StudioTraceStatus = \"running\" | \"success\" | \"error\";\n\nexport type StudioTraceObservationKind = \"agent\" | \"generation\" | \"tool\";\n\nexport type StudioTraceObservation = {\n id: string;\n parentObservationId?: string;\n kind: StudioTraceObservationKind;\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n};\n\nexport type StudioTraceSummary = {\n id: string;\n sessionId: string;\n name?: string;\n status: StudioTraceStatus;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n output?: string;\n error?: JsonValue;\n usage?: Usage;\n metadata?: JsonObject;\n observationCount: number;\n};\n\nexport type StudioTrace = StudioTraceSummary & {\n trace?: AgentTraceInfo;\n input?: JsonValue;\n observations: StudioTraceObservation[];\n};\n\nexport type StudioObservabilityEventType = \"session_log\" | \"pipeline_log\" | \"trace\";\n\nexport type StudioObservabilityEvent =\n | {\n type: \"session_log\";\n log: StudioSessionLogEntry;\n }\n | {\n type: \"pipeline_log\";\n log: StudioPipelineLogEntry;\n }\n | {\n type: \"trace\";\n trace: StudioTraceSummary;\n };\n\nexport type StudioTraceListOptions = {\n limit: number;\n agentId?: string;\n sessionId?: string;\n status?: StudioTraceStatus;\n};\n\nexport type StudioSessionTraceListOptions = {\n sessionId: string;\n limit: number;\n};\n\nexport type StudioTraceStore = {\n readonly kind?: string;\n listTraces?(\n options: StudioTraceListOptions,\n ): StudioTraceSummary[] | Promise<StudioTraceSummary[]>;\n listSessionTraces(\n options: StudioSessionTraceListOptions,\n ): StudioTraceSummary[] | Promise<StudioTraceSummary[]>;\n getTrace(id: string): StudioTrace | undefined | Promise<StudioTrace | undefined>;\n saveTrace(trace: StudioTrace): StudioTrace | Promise<StudioTrace>;\n};\n\nexport type StudioKnowledgeSourceKind = \"static_context\" | \"dynamic_context\" | \"dynamic_tools\";\n\nexport type StudioKnowledgeSourceSummary = {\n sourceId?: string;\n kind: StudioKnowledgeSourceKind;\n label?: string;\n count: number;\n registrationIndex?: number;\n topK?: number;\n threshold?: number;\n inspectable?: boolean;\n itemCount?: number;\n};\n\nexport type StudioStaticKnowledgeDocument = {\n id: string;\n text: string;\n additionalProps?: JsonObject;\n};\n\nexport type StudioKnowledgeEvidenceDocument = {\n id?: string;\n text?: string;\n additionalProps?: JsonObject;\n};\n\nexport type StudioKnowledgeEvidence = {\n traceId: string;\n sessionId: string;\n observationId: string;\n observationName: string;\n turn: number;\n startedAt: string;\n query?: string;\n documentCount: number;\n toolCount: number;\n documents: StudioKnowledgeEvidenceDocument[];\n tools: string[];\n};\n\nexport type StudioAgentKnowledgeConfig = {\n agentId: string;\n agentName?: string;\n sources: StudioKnowledgeSourceSummary[];\n staticContext: StudioStaticKnowledgeDocument[];\n};\n\nexport type StudioKnowledgeItemKind = \"static_context\" | \"dynamic_context\" | \"dynamic_tool\";\n\nexport type StudioKnowledgeItem = {\n id: string;\n kind: StudioKnowledgeItemKind;\n text?: string;\n document?: JsonValue;\n toolName?: string;\n description?: string;\n parameterKeys?: string[];\n metadata?: JsonObject;\n};\n\nexport type StudioKnowledgeItemsPage = {\n agentId: string;\n sourceId: string;\n kind: StudioKnowledgeSourceKind;\n inspectable: boolean;\n items: StudioKnowledgeItem[];\n nextCursor?: string;\n totalCount?: number;\n message?: string;\n};\n\nexport type StudioKnowledgeSummary = {\n agents: StudioAgentKnowledgeConfig[];\n evidence: StudioKnowledgeEvidence[];\n};\n\nexport type StudioMemoryUserSummary = {\n userId: string;\n conversationCount: number;\n agentIds: string[];\n lastInteractionAt: string;\n};\n\nexport type StudioMemoryConversationSummary = {\n id: string;\n userId: string;\n agentId: string;\n title?: string;\n createdAt: string;\n updatedAt: string;\n messageCount: number;\n metadata?: JsonObject;\n};\n\nexport type StudioMemoryConversationsPage = {\n conversations: StudioMemoryConversationSummary[];\n total: number;\n};\n\nexport type StudioMemoryUsersPage = {\n users: StudioMemoryUserSummary[];\n total: number;\n};\n\nexport type StudioMemoryConversationMessages = {\n conversation: StudioMemoryConversationSummary;\n messages: Message[];\n transcript: StudioTranscriptEntry[];\n};\n\nexport type StudioMemoryConversationSteps = {\n conversation: StudioMemoryConversationSummary;\n steps: StudioTranscriptEntry[];\n};\n\nexport type StudioStatusSummary = {\n runner: {\n id: string;\n name?: string;\n version?: string;\n };\n storage: {\n sessions?: string;\n traces?: string;\n pipelineLogs?: string;\n pipelineRuns?: string;\n };\n counts: {\n agents: number;\n pipelines: number;\n sessions?: number;\n traces?: number;\n pipelineRuns?: number;\n };\n capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>>;\n generatedAt: string;\n};\n\nexport type StudioStores = {\n sessions?: StudioSessionStore | false;\n traces?: StudioTraceStore;\n pipelineLogs?: StudioPipelineLogStore | false;\n pipelineRuns?: StudioPipelineRunStore | false;\n};\n\nexport type StudioUiOptions = {\n path?: string;\n rootRoutes?: boolean;\n title?: string;\n redirectRoot?: boolean;\n clientScript?: string;\n protectShell?: boolean;\n};\n\nexport type StudioOptions = {\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts eval suites with arbitrary user-defined case and output types.\n evals?: Array<StudioEvalSuite<any, any, any>>;\n quickPrompts?: Record<string, string[]>;\n stores?: StudioStores;\n ui?: boolean | StudioUiOptions;\n models?: StudioModelConfig;\n};\n\nexport type StudioServeOptions = {\n port?: number;\n hostname?: string;\n log?: boolean;\n};\n\nexport type StudioToolApprovalDecision = {\n approved: boolean;\n reason?: string;\n};\n\nexport type StudioToolApprovalStatus = \"pending\" | \"approved\" | \"rejected\" | \"timed_out\";\n\nexport type StudioToolApproval = {\n id: string;\n runId: string;\n agentId: string;\n sessionId?: string;\n toolName: string;\n callId?: string;\n internalCallId: string;\n args: string;\n status: StudioToolApprovalStatus;\n requestedAt: string;\n resolvedAt?: string;\n reason?: string;\n};\n\nexport type StudioToolApprovalTranscript = {\n id: string;\n status: StudioToolApprovalStatus;\n requestedAt: string;\n resolvedAt?: string;\n reason?: string;\n};\n\nexport type StudioToolApprovalRequestEvent = {\n type: \"tool_approval_request\";\n approval: StudioToolApproval;\n};\n\nexport type StudioToolApprovalResultEvent = {\n type: \"tool_approval_result\";\n approval: StudioToolApproval;\n};\n\nexport type StudioToolQuestionChoice = {\n label: string;\n value: string;\n};\n\nexport type StudioToolQuestionPrompt = {\n id: string;\n question: string;\n choices: StudioToolQuestionChoice[];\n};\n\nexport type StudioToolQuestionAnswer = {\n questionId: string;\n answer: string;\n choice?: string;\n custom?: boolean;\n};\n\nexport type StudioToolQuestionStatus = \"pending\" | \"answered\";\n\nexport type StudioToolQuestion = {\n id: string;\n runId: string;\n agentId: string;\n sessionId?: string;\n toolName: string;\n callId?: string;\n internalCallId: string;\n args: string;\n questions: StudioToolQuestionPrompt[];\n status: StudioToolQuestionStatus;\n requestedAt: string;\n answeredAt?: string;\n answers?: StudioToolQuestionAnswer[];\n};\n\nexport type StudioToolQuestionTranscript = {\n id: string;\n status: StudioToolQuestionStatus;\n requestedAt: string;\n answeredAt?: string;\n questions: StudioToolQuestionPrompt[];\n answers?: StudioToolQuestionAnswer[];\n};\n\nexport type StudioToolQuestionRequestEvent = {\n type: \"tool_question_request\";\n question: StudioToolQuestion;\n};\n\nexport type StudioToolQuestionResultEvent = {\n type: \"tool_question_result\";\n question: StudioToolQuestion;\n};\n\nexport type StudioSessionLogEvent = {\n type: \"session_log\";\n log: StudioSessionLogEntry;\n};\n\nexport type StudioPipelineLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type StudioPipelineLogCategory =\n | \"pipeline\"\n | \"run\"\n | \"stage\"\n | \"parallel\"\n | \"agent\"\n | \"extractor\"\n | \"api\";\n\nexport type StudioPipelineLogEntry = {\n id: string;\n pipelineId: string;\n runId?: string;\n sequence: number;\n timestamp: string;\n level: StudioPipelineLogLevel;\n category: StudioPipelineLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineLogAppendInput = {\n pipelineId: string;\n runId?: string;\n level: StudioPipelineLogLevel;\n category: StudioPipelineLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineLogListOptions = {\n pipelineId: string;\n limit: number;\n after?: number;\n};\n\nexport type StudioPipelineLogStore = {\n appendPipelineLog(\n input: StudioPipelineLogAppendInput,\n ): StudioPipelineLogEntry | Promise<StudioPipelineLogEntry>;\n listPipelineLogs(\n options: StudioPipelineLogListOptions,\n ): StudioPipelineLogEntry[] | Promise<StudioPipelineLogEntry[]>;\n};\n\nexport type StudioPipelineLogEvent = {\n type: \"pipeline_log\";\n log: StudioPipelineLogEntry;\n};\n\nexport type StudioPipelineFinalEvent = {\n type: \"pipeline_final\";\n runId: string;\n pipelineId: string;\n output: JsonValue;\n};\n\nexport type StudioPipelineRunStatus = \"running\" | \"success\" | \"error\";\n\nexport type StudioPipelineRunRecord = {\n runId: string;\n pipelineId: string;\n status: StudioPipelineRunStatus;\n input: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n};\n\nexport type StudioPipelineRunSaveInput = {\n runId: string;\n pipelineId: string;\n status: StudioPipelineRunStatus;\n input: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n};\n\nexport type StudioPipelineRunListOptions = {\n pipelineId: string;\n limit: number;\n};\n\nexport type StudioPipelineRunGetOptions = {\n pipelineId: string;\n runId: string;\n};\n\nexport type StudioPipelineRunStore = {\n savePipelineRun(\n input: StudioPipelineRunSaveInput,\n ): StudioPipelineRunRecord | Promise<StudioPipelineRunRecord>;\n getPipelineRun(\n options: StudioPipelineRunGetOptions,\n ): StudioPipelineRunRecord | undefined | Promise<StudioPipelineRunRecord | undefined>;\n listPipelineRuns(\n options: StudioPipelineRunListOptions,\n ): StudioPipelineRunRecord[] | Promise<StudioPipelineRunRecord[]>;\n};\n\nexport type StudioPipelineRunRequest = {\n input: JsonValue;\n stream?: boolean;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineReplayRequest = {\n stream?: boolean;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineRunResponse = {\n runId: string;\n pipelineId: string;\n output: JsonValue;\n};\n\nexport type AgentRunRequest = {\n message: string | Message;\n history?: Message[];\n sessionId?: string;\n stream?: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n model?: StudioModelRef;\n metadata?: JsonObject;\n trace?: AgentTraceOptions;\n};\n\nexport type AgentRunUIRequest = {\n messages: Message[];\n sessionId?: string;\n stream?: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n model?: StudioModelRef;\n metadata?: JsonObject;\n trace?: AgentTraceOptions;\n};\n\nexport type AgentRunResponse = PromptResponse;\n\nexport type AgentRunStreamEvent =\n | AgentStreamEvent\n | StudioToolApprovalRequestEvent\n | StudioToolApprovalResultEvent\n | StudioToolQuestionRequestEvent\n | StudioToolQuestionResultEvent\n | StudioSessionLogEvent\n | StudioPipelineLogEvent\n | StudioPipelineFinalEvent;\n\nexport type StudioErrorCode =\n | \"bad_request\"\n | \"conflict\"\n | \"not_found\"\n | \"unsupported_capability\"\n | \"internal_error\";\n\nexport type StudioErrorResponse = {\n error: {\n code: StudioErrorCode;\n message: string;\n details?: JsonValue;\n };\n};\n\nexport function traceSummary(trace: StudioTrace): StudioTraceSummary {\n return compact({\n id: trace.id,\n sessionId: trace.sessionId,\n name: trace.name,\n status: trace.status,\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n output: trace.output,\n error: trace.error,\n usage: trace.usage,\n metadata: trace.metadata,\n observationCount: trace.observations.length,\n }) as StudioTraceSummary;\n}\n\nexport type AnviaStudio = {\n readonly app: Hono;\n fetch(request: Request): Response | Promise<Response>;\n config(): StudioConfig;\n close(): void;\n};\n"],"mappings":"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","names":["Agent","resolve","appendSessionLog","appendPipelineLog","resolve","byteLength","resolve","decision","isRecord","toJsonValue","isRecord","byteLength","isJsonValue","createHook","createHook","resolve","run","traceSummary","isJsonObject","isJsonValue","Agent","studioRunId","serializeJsonError","traceSummary"]}
1
+ {"version":3,"sources":["../src/runtime/studio.ts","../src/shared/compact.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/pipeline-logs.ts","../src/runtime/pipelines.ts","../src/runtime/questions.ts","../src/runtime/sessions.ts","../src/storage/memory-store.ts","../src/runtime/shared.ts","../src/runtime/status.ts","../src/runtime/tools.ts","../src/runtime/trace-routes.ts","../src/storage/sqlite-store.ts","../src/types.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 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 { compact } from \"./compact\";\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 { 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 { 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 this.server = serve({\n fetch: (request) => this.fetch(request),\n ...compact({ hostname: serveOptions.hostname }),\n port,\n });\n\n const log = serveOptions.log ?? true;\n if (log) {\n const host = serveOptions.hostname ?? \"localhost\";\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 this.sigintHandler = () => {\n this.close();\n process.exit(0);\n };\n process.once(\"SIGINT\", this.sigintHandler);\n\n return this;\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\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 return {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\n pipelines: inferStudioPipelines(pipelines),\n evals: options.evals ?? [],\n ...compact({ models: options.models }),\n ...compact({ stores: options.stores }),\n ...compact({ ui: options.ui }),\n };\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 return {\n id,\n pipeline,\n ...compact({ name: pipeline.name }),\n ...compact({ description: pipeline.description }),\n ...compact({ metadata: pipeline.metadata }),\n };\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 return {\n ...compact({ defaultMaxTurns: agent.defaultMaxTurns }),\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}\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 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) => c.json(buildConfig(options, agents, pipelines, stores)));\n registerStatusRoutes(app, { options, agents, pipelines, stores });\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 registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\n registerKnowledgeRoutes(app, {\n agents,\n ...compact({ traceStore: stores.traces }),\n });\n registerPipelineRoutes(app, {\n pipelines,\n pipelineMap,\n ...compact({ logStore: stores.pipelineLogs }),\n ...compact({ runStore: stores.pipelineRuns }),\n });\n\n registerAgentRunRoute(app, {\n agentMap,\n stores,\n modelRegistry,\n approvalRuntime,\n questionRuntime,\n });\n\n if (stores.sessions !== undefined) {\n registerMemoryRoutes(app, {\n sessionStore: stores.sessions,\n });\n registerSessionRoutes(app, {\n agentMap,\n sessionStore: stores.sessions,\n ...compact({ traceStore: stores.traces }),\n });\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 return {\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);\n },\n close() {},\n ...compact({ sessionStore: stores.sessions }),\n ...compact({ traceStore: stores.traces }),\n };\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","/**\n * Strips keys whose resolved type includes `undefined`.\n *\n * Replaces the verbose `...(x === undefined ? {} : { key: x })` pattern.\n */\nexport type Compact<T> = {\n [K in keyof T as undefined extends T[K] ? never : K]: Exclude<T[K], undefined>;\n};\n\nexport function compact<T extends Record<string, unknown>>(obj: T): Compact<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result as Compact<T>;\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 { compact } from \"../runtime/compact\";\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 ...compact({ name: this.props.args.trace?.name }),\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 ...compact({ output: result.output }),\n ...compact({ error: result.error }),\n ...compact({ usage: result.usage }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n\n await store.saveTrace(trace);\n }\n}\n\nclass ChildAgentToolTraceAccumulator {\n private readonly agentStarts = new Map<\n string,\n {\n startedAt: Date;\n agentId: string;\n agentName?: string;\n }\n >();\n private readonly generationStarts = new Map<\n string,\n {\n startedAt: Date;\n input?: JsonValue;\n agentId: string;\n agentName?: string;\n childTurn: number;\n }\n >();\n private readonly toolStarts: Array<{\n startedAt: Date;\n agentId: string;\n agentName?: string;\n childTurn: number;\n toolName: string;\n toolCallId?: string;\n internalCallId?: string;\n input?: JsonValue;\n completed: boolean;\n }> = [];\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 this.agentStarts.set(agentId, {\n startedAt: new Date(),\n agentId,\n ...compact({ agentName }),\n });\n }\n\n if (child.type === \"turn_start\") {\n this.generationStarts.set(generationKey(agentId, childTurn), {\n startedAt: new Date(),\n input: toJsonValue({\n prompt: child.prompt,\n history: child.history,\n }),\n agentId,\n ...compact({ agentName }),\n childTurn,\n });\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 this.completedObservations.push(\n traceObservation({\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 ...compact({ input: start?.input }),\n output: toJsonValue(child.response),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n }),\n );\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 this.toolStarts.push({\n startedAt: new Date(),\n agentId,\n ...compact({ agentName }),\n childTurn,\n toolName,\n ...compact({ toolCallId: callId }),\n input: toJsonValue(toolCallFunction?.arguments ?? {}),\n completed: false,\n });\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 this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.${toolName}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n ...compact({ input }),\n ...(typeof child.result === \"string\" ? { output: parseOrString(child.result) } : {}),\n metadata: {\n ...this.childMetadata(agentId, agentName, childTurn),\n ...compact({ toolCallId }),\n ...compact({ internalCallId }),\n },\n }),\n );\n return;\n }\n\n if (child.type === \"error\") {\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: this.childMetadata(agentId, agentName, childTurn),\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 return {\n id: globalThis.crypto.randomUUID(),\n ...(props.parentObservationId === undefined\n ? {}\n : { parentObservationId: props.parentObservationId }),\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 ...compact({ input: props.input }),\n ...compact({ output: props.output }),\n ...compact({ error: props.error }),\n ...compact({ metadata: props.metadata }),\n };\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 return {\n path: normalizeUiPath(options.path ?? \"/ui\"),\n title: options.title ?? \"Anvia Studio\",\n rootRoutes: options.rootRoutes ?? true,\n redirectRoot: options.redirectRoot ?? true,\n ...(options.clientScript === undefined ? {} : { clientScript: options.clientScript }),\n protectShell: options.protectShell ?? false,\n };\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}/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(\"/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 { compact } from \"./compact\";\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 mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n persistStreamingSessionTranscript,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\n memoryLoadedLog,\n memorySavedLog,\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 await appendSessionLog(\n props.store,\n runReceivedLog({\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 ...compact({ maxTurns: props.body.maxTurns }),\n ...compact({ toolConcurrency: props.body.toolConcurrency }),\n hasTrace: props.body.trace !== undefined,\n ...(props.body.metadata === undefined && props.selectedModel.ref === undefined\n ? {}\n : {\n metadata: {\n ...(props.body.metadata ?? {}),\n ...(props.selectedModel.ref === undefined\n ? {}\n : { [STUDIO_MODEL_METADATA_KEY]: props.selectedModel.ref }),\n },\n }),\n }),\n );\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 await props.store?.updateSessionMetadata?.(props.session.id, {\n ...(props.session.metadata ?? {}),\n [STUDIO_MODEL_METADATA_KEY]: props.selectedModel.ref,\n });\n }\n}\n\nfunction runMemoryMetadata(\n agentId: string,\n body: AgentRunRequest,\n selectedModel: SelectedModel,\n runId: string,\n): JsonObject {\n return {\n agentId,\n ...(body.metadata ?? {}),\n ...(selectedModel.ref === undefined ? {} : { [STUDIO_MODEL_METADATA_KEY]: selectedModel.ref }),\n studioRunId: runId,\n };\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 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 run.request.approvals(\n props.approvalRuntime.createApprovals({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n const effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n if (effectiveHook !== undefined) {\n run.request.requestHook(effectiveHook);\n }\n\n const runStream = mergeRunAndApprovalEvents(run.request.stream(), runtimeEvents);\n const stream =\n run.session === undefined || run.sessionStore === undefined\n ? runStream\n : persistStreamingSessionTranscript({\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 persistGeneratedMessages: run.shouldPersistSessionMessages,\n });\n return streamAgentRunEvents(c, stream);\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 effectiveHook = composeHooks(\n run.runAgent.hook,\n props.questionRuntime.createHook({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n }),\n );\n run.request.approvals(\n props.approvalRuntime.createApprovals({\n runId: run.runId,\n agentId: run.agentId,\n ...compact({ sessionId: run.session?.id }),\n ...compact({ metadata: run.body.metadata }),\n }),\n );\n if (effectiveHook !== undefined) {\n run.request.requestHook(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 await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.message),\n transcript: transcriptFromMessages(response.messages),\n status: \"success\",\n });\n await appendSessionLog(\n run.sessionStore,\n runCompletedLog({\n sessionId: run.session.id,\n runId: run.runId,\n durationMs: Date.now() - run.runStartedAt,\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 await run.sessionStore.saveSessionRunTranscript({\n id: run.session.id,\n runId: run.runId,\n ...optionalTitle(run.body.message),\n transcript: transcriptFromMessages(messages.slice(run.session.messageCount)),\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 | 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 { compact } from \"./compact\";\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 providers.set(id, {\n ...provider,\n id,\n ...compact({\n defaultModel:\n provider.defaultModel !== undefined ? normalizeModelId(provider.defaultModel) : undefined,\n }),\n staticModels,\n });\n }\n\n return {\n ...compact({\n defaultModel: config.default !== undefined ? normalizeModelRef(config.default) : undefined,\n }),\n providers,\n agentPolicies: normalizeAgentPolicies(config.agents ?? {}),\n modelCache: new Map(),\n };\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 return {\n id: provider.id,\n ...compact({\n name: provider.name,\n defaultModel: provider.defaultModel,\n metadata: provider.metadata,\n }),\n models,\n };\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 return {\n providers,\n ...compact({ default: registry.defaultModel }),\n agents: agentsConfig,\n };\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 return c.json({\n providers,\n ...compact({ defaultModel: props.registry.defaultModel }),\n });\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 return {\n agentId: agent.id,\n ...compact({ defaultModel }),\n models: [...models, ...exactPolicyModels],\n ...compact({ warnings: warnings.length === 0 ? undefined : warnings }),\n };\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 models.set(\n model.id,\n modelSummary(provider, model.id, {\n id: model.id,\n ...compact({ name: model.name, description: model.description }),\n ...(staticModel ?? {}),\n metadata: {\n ...compact({\n type: model.type,\n createdAt: model.createdAt,\n ownedBy: model.ownedBy,\n contextLength: model.contextLength,\n }),\n ...(staticModel?.metadata ?? {}),\n },\n }),\n );\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 return {\n id: provider.id,\n ...compact({\n name: provider.name,\n defaultModel: provider.defaultModel,\n metadata: provider.metadata,\n warning,\n }),\n models: [...models.values()].sort((left, right) => left.ref.localeCompare(right.ref)),\n };\n}\n\nfunction modelSummary(\n provider: RuntimeProvider,\n modelId: string,\n model: StudioModelDefinition,\n): StudioModelSummary {\n return {\n ...model,\n id: modelId,\n ref: `${provider.id}:${modelId}`,\n providerId: provider.id,\n ...compact({ providerName: provider.name }),\n };\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 agentId.trim(),\n {\n ...compact({\n default: policy.default !== undefined ? normalizeModelRef(policy.default) : undefined,\n 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 },\n ]),\n );\n}\n\nfunction publicPolicy(policy: NormalizedAgentModelPolicy): StudioAgentModelPolicyConfig {\n return compact({ default: policy.default, allowed: policy.allowed });\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\";\nimport { compact } from \"./compact\";\n\nexport function traceSummary(trace: StudioTrace): StudioTraceSummary {\n return compact({\n id: trace.id,\n sessionId: trace.sessionId,\n name: trace.name,\n status: trace.status,\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n output: trace.output,\n error: trace.error,\n usage: trace.usage,\n metadata: trace.metadata,\n observationCount: trace.observations.length,\n }) as StudioTraceSummary;\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioObservabilityEvent,\n StudioObservabilityEventType,\n StudioPipelineLogStore,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport { compact } from \"./compact\";\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 return {\n ...stores,\n ...compact({\n sessions:\n stores.sessions !== undefined ? observeSessionStore(stores.sessions, hub) : undefined,\n traces: stores.traces !== undefined ? observeTraceStore(stores.traces, hub) : undefined,\n pipelineLogs:\n stores.pipelineLogs !== undefined\n ? observePipelineLogStore(stores.pipelineLogs, hub)\n : undefined,\n }),\n };\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 subscription = hub.subscribe(compact({ types }));\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 { compact } from \"./compact\";\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"message\" as const,\n role: \"user\" as const,\n text: content.text,\n attachments: attachments.length === 0 ? undefined : attachments,\n }) as StudioTranscriptEntry,\n );\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"reasoning\" as const,\n reasoningId: content.id,\n text: content.text,\n }) as StudioTranscriptEntry,\n );\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 return [\n {\n kind: \"image\",\n ...(content.source.type === \"base64\"\n ? { data: content.source.data, mediaType: content.source.mediaType }\n : { url: content.source.url }),\n },\n ];\n }\n if (content.type === \"document\") {\n return [\n compact({\n kind: \"document\" as const,\n name: content.source.filename,\n mediaType: content.source.mediaType,\n data: content.source.type === \"base64\" ? content.source.data : undefined,\n url: content.source.type === \"url\" ? content.source.url : undefined,\n }) as StudioTranscriptAttachment,\n ];\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 { compact } from \"./compact\";\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): Response {\n return streamStudioJsonl(events);\n}\n\nexport function traceForRun(\n trace: AgentTraceOptions | undefined,\n agentId: string,\n session: StudioSession | undefined,\n): AgentTraceOptions {\n const metadata = {\n ...(trace?.metadata ?? {}),\n agentId,\n };\n return {\n ...(trace ?? {}),\n metadata,\n ...(trace?.sessionId !== undefined\n ? { sessionId: trace.sessionId }\n : session === undefined\n ? {}\n : { sessionId: session.id }),\n };\n}\n\nexport async function* persistStreamingSessionTranscript(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n runId: string;\n persistGeneratedMessages?: boolean;\n}): AsyncIterable<AgentRunStreamEvent> {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n const title = optionalTitle(props.message);\n\n await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"running\",\n });\n\n try {\n for await (const event of props.stream) {\n acceptTranscriptStreamEvent(transcript, event);\n\n const nextSession = await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: event.type === \"final\" ? \"success\" : event.type === \"error\" ? \"error\" : \"running\",\n ...(event.type === \"error\" ? { error: serializeError(event.error) } : {}),\n });\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\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\n yield event;\n }\n } catch (error) {\n appendTranscriptAssistantError(transcript, errorText(error));\n await props.store.saveSessionRunTranscript({\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\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"tool\" as const,\n toolName: event.toolName,\n callId: event.toolCallId,\n args: event.args,\n result: event.result,\n structuredResult: event.structuredResult,\n }) as StudioTranscriptEntry,\n );\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"tool\" as const,\n toolName: event.toolName,\n callId: event.toolCallId,\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\n }) as StudioTranscriptEntry,\n );\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 matched.approval = compact({\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n resolvedAt: event.approval.resolvedAt,\n reason: event.approval.reason,\n }) as NonNullable<typeof matched.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 matched.question = compact({\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n answeredAt: event.question.answeredAt,\n questions: event.question.questions,\n answers: event.question.answers,\n }) as NonNullable<typeof matched.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 return compact({\n kind: \"message\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n text: child.delta,\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"reasoning_delta\") {\n return compact({\n kind: \"reasoning\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n reasoningId: child.id,\n text: child.delta,\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"tool_call\") {\n return compact({\n kind: \"tool\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n toolName: child.toolCall.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n args: formatJson(child.toolCall.function.arguments),\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"tool_result\") {\n return compact({\n kind: \"tool\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n toolName: child.toolName,\n callId: child.toolCallId,\n args: child.args,\n result: child.result,\n structuredResult: child.structuredResult,\n }) as StudioTranscriptChildAgentEvent;\n }\n if (child.type === \"error\") {\n return compact({\n kind: \"message\" as const,\n agentId: event.agentId,\n agentName: event.agentName,\n text: `Error: ${errorText(child.error)}`,\n }) as StudioTranscriptChildAgentEvent;\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 return {\n entryId,\n kind: \"message\",\n role,\n text: extractMessageText(message),\n ...(role === \"user\" ? optionalTranscriptAttachments(message) : {}),\n };\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 transcript.push(\n compact({\n entryId: transcript.length,\n kind: \"reasoning\" as const,\n reasoningId,\n text: delta,\n }) as StudioTranscriptEntry,\n );\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 return [\n {\n kind: \"image\",\n ...(content.source.type === \"base64\"\n ? { data: content.source.data, mediaType: content.source.mediaType }\n : { url: content.source.url }),\n },\n ];\n }\n if (content.type === \"document\") {\n return [\n compact({\n kind: \"document\" as const,\n name: content.source.filename,\n mediaType: content.source.mediaType,\n data: content.source.type === \"base64\" ? content.source.data : undefined,\n url: content.source.type === \"url\" ? content.source.url : undefined,\n }) as StudioTranscriptAttachment,\n ];\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 return {\n message,\n ...(history.length === 0 ? {} : { history }),\n };\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 { compact } from \"./compact\";\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: compact({\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 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: compact({\n agentId: props.agentId,\n stream: props.stream,\n message: messageSummary(props.message),\n maxTurns: props.maxTurns,\n toolConcurrency: props.toolConcurrency,\n hasTrace: props.hasTrace,\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\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: compact({\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: compact({\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 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: compact({\n durationMs: props.durationMs,\n usage: usageSummary(props.usage),\n outputBytes: byteLength(props.output),\n messageCount: props.messageCount,\n }),\n };\n}\n\nexport function memorySavedLog(props: {\n sessionId: string;\n runId: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\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: compact({\n messageCount: props.messageCount,\n }),\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: compact({\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: compact({\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: compact({\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 return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.completed\",\n message: `Tool ${event.toolName} completed`,\n metadata: compact({\n turn: event.turn,\n toolName: event.toolName,\n callId: event.toolCallId,\n internalCallId: event.internalCallId,\n argumentBytes: byteLength(event.args),\n resultBytes: byteLength(event.result),\n structuredResultBytes:\n event.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(event.structuredResult)),\n }),\n },\n ];\n }\n if (event.type === \"turn_end\") {\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: compact({\n turn: event.turn,\n contentCount: event.response.choice.length,\n usage: usageSummary(event.response.usage),\n }),\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 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: compact({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n argumentBytes: byteLength(event.approval.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_approval_result\") {\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: compact({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n }),\n },\n ];\n }\n if (event.type === \"tool_question_request\") {\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: compact({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_question_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.answered\",\n message: `Question answered for ${event.question.toolName}`,\n metadata: compact({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n answerCount: event.question.answers?.length ?? 0,\n }),\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: compact({\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 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: compact({\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 callId: child.toolCallId,\n resultBytes: byteLength(child.result),\n structuredResultBytes:\n child.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(child.structuredResult)),\n }),\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: compact({\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 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: compact({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n usage: usageSummary(child.usage),\n outputBytes: byteLength(child.output),\n messageCount: child.messages.length,\n }),\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: compact({\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 return compact({\n inputTokens: numericValue(record.inputTokens),\n outputTokens: numericValue(record.outputTokens),\n totalTokens: numericValue(record.totalTokens),\n cachedInputTokens: numericValue(record.cachedInputTokens),\n cacheCreationInputTokens: numericValue(record.cacheCreationInputTokens),\n });\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 { compact } from \"./compact\";\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 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 return compact({\n approved: body.approved,\n reason:\n typeof body.reason === \"string\" && body.reason.trim().length > 0\n ? body.reason.trim()\n : undefined,\n }) as StudioToolApprovalDecision;\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 decision = await requestApproval(\n approvals,\n context,\n compact({\n toolName: request.toolName,\n toolCallId: request.toolCallId,\n internalCallId: request.internalCallId,\n args: request.rawArgs,\n reason: request.reason,\n rejectMessage: request.rejectMessage,\n }) as ApprovalRequest,\n );\n return decision.approved\n ? compact({ approved: true as const, reason: decision.reason })\n : compact({ approved: false as const, reason: 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 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 compact({ reason }),\n );\n approvals.set(id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve(\n compact({\n approved: decision.approved,\n reason,\n }) as StudioToolApprovalDecision,\n );\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 ...compact({\n id,\n runId: context.runId,\n agentId: context.agentId,\n sessionId: context.sessionId,\n toolName: request.toolName,\n callId: request.toolCallId,\n internalCallId: request.internalCallId,\n args: request.args,\n status: \"pending\" as const,\n requestedAt: new Date().toISOString(),\n reason: request.reason,\n rejectMessage: request.rejectMessage,\n emit: context.emit,\n }),\n resolve: () => {},\n };\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(\n compact({\n approved: current.status === \"approved\",\n reason: current.reason,\n }) as StudioToolApprovalDecision,\n );\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 compact({ reason }),\n );\n approvals.set(id, resolved);\n context.emit?.({ type: \"tool_approval_result\", approval: resolved });\n resolve(\n compact({\n approved: decision.approved,\n reason,\n }) as StudioToolApprovalDecision,\n );\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 return publicApproval({\n ...approval,\n ...compact({\n status,\n resolvedAt: new Date().toISOString(),\n reason: options.reason,\n }),\n });\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 { compact } from \"./compact\";\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 return compact({\n id: suite.id ?? suite.name,\n name: suite.name,\n description: suite.description,\n caseCount: suite.cases.length,\n metricNames: suite.metrics.map((metric) => metric.name),\n casePreviewCount: casePreviews.length,\n casePreviews,\n metricSummaries,\n concurrency: suite.concurrency,\n metadata: suite.metadata,\n }) as StudioEvalSuiteConfig;\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 return compact({\n id:\n typeof testCase.id === \"string\" && testCase.id.length > 0 ? testCase.id : `case-${index + 1}`,\n input: \"input\" in testCase ? previewValue(testCase.input) : undefined,\n expected: \"expected\" in testCase ? previewValue(testCase.expected) : undefined,\n metadataKeys: metadataKeys(testCase.metadata),\n }) as StudioEvalCasePreview;\n}\n\nfunction metricSummary(metric: unknown, index: number): StudioEvalMetricSummary {\n if (!isRecord(metric)) {\n return { name: `metric-${index + 1}` };\n }\n\n return compact({\n name:\n typeof metric.name === \"string\" && metric.name.length > 0\n ? metric.name\n : `metric-${index + 1}`,\n dataType: metricDataType(metric.dataType),\n configId: typeof metric.configId === \"string\" ? metric.configId : undefined,\n scoreConfigId: typeof metric.scoreConfigId === \"string\" ? metric.scoreConfigId : undefined,\n metadataKeys: metadataKeys(metric.metadata),\n }) as StudioEvalMetricSummary;\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 return {\n required: true,\n ...(typeof policy.reason === \"string\" ? { reason: policy.reason } : {}),\n ...(typeof policy.rejectMessage === \"string\" ? { rejectMessage: policy.rejectMessage } : {}),\n };\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 { compact } from \"./compact\";\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 return compact({\n id: agent.id,\n name,\n description,\n quickPrompts: agent.quickPrompts ?? [],\n metadata: agent.metadata,\n }) as StudioAgentConfig;\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 return compact({\n id: agent.id,\n name,\n description,\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 defaultMaxTurns: agent.agent.defaultMaxTurns,\n metadata: agent.metadata,\n }) as StudioAgentRuntimeSummary;\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 return compact({\n id: pipeline.id,\n name: pipeline.name,\n description: pipeline.description,\n metadata: pipeline.metadata,\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 }) as StudioPipelineConfig;\n}\n\nexport function buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n): StudioConfig {\n const models =\n options.models === undefined\n ? undefined\n : studioModelsConfig(createStudioModelRegistry(options.models), agents);\n return compact({\n id: runnerId(options),\n name: options.name,\n description: options.description,\n version: options.version,\n agents: agents.map(agentConfig),\n models,\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),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n }) as StudioConfig;\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\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 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\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 return [\n ...(stores.sessions === undefined ? ([\"sessions\"] as const) : []),\n ...(stores.traces === undefined ? ([\"traces\"] as const) : []),\n ];\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 { compact } from \"./compact\";\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 result = await runEvalSuite({\n ...suite,\n ...compact({ concurrency: body.concurrency }),\n });\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 StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { compact } from \"./compact\";\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 return {\n agentId: agent.id,\n ...compact({ agentName }),\n sources: await knowledgeSources(agent),\n staticContext: agent.agent.staticContext.map((document) => ({\n id: document.id,\n text: document.text,\n ...compact({\n additionalProps:\n document.additionalProps !== undefined\n ? jsonObjectFromRecord(document.additionalProps)\n : undefined,\n }),\n })),\n };\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 return {\n sourceId: dynamicContextSourceId(index),\n kind: \"dynamic_context\" as const,\n label: `Dynamic context ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...compact({ threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...compact({ itemCount: count }),\n };\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 return {\n sourceId: dynamicToolsSourceId(index),\n kind: \"dynamic_tools\" as const,\n label: `Dynamic tools ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...compact({ threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...compact({ itemCount: count }),\n };\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 return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_context\",\n inspectable: true,\n items: page.items.map((item) => dynamicContextItem(item)),\n ...compact({ nextCursor: page.nextCursor, totalCount: page.totalCount }),\n };\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 return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_tools\",\n inspectable: true,\n items: page.items.map((item) => dynamicToolItem(item)),\n ...compact({ nextCursor: page.nextCursor, totalCount: page.totalCount }),\n };\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 return {\n agentId: agent.id,\n sourceId: staticSourceId(),\n kind: \"static_context\",\n inspectable: true,\n items: page.map((document) => ({\n id: document.id,\n kind: \"static_context\",\n text: document.text,\n ...compact({\n metadata:\n document.additionalProps !== undefined\n ? jsonObjectFromRecord(document.additionalProps)\n : undefined,\n }),\n })),\n ...compact({\n nextCursor: nextOffset < agent.agent.staticContext.length ? String(nextOffset) : undefined,\n }),\n totalCount: agent.agent.staticContext.length,\n };\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 return {\n id: item.id,\n kind: \"dynamic_context\",\n ...(text === undefined ? { document: toJsonValue(item.document) } : { text }),\n ...compact({\n metadata: item.metadata !== undefined ? jsonObjectFromRecord(item.metadata) : undefined,\n }),\n };\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 return {\n id: item.id,\n kind: \"dynamic_tool\",\n toolName,\n description,\n parameterKeys: parameterKeys(definition.parameters),\n document: toJsonValue(item.document),\n ...compact({\n metadata: item.metadata !== undefined ? jsonObjectFromRecord(item.metadata) : undefined,\n }),\n };\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 return [\n {\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 ...compact({ query }),\n documentCount: documents.length,\n toolCount: tools.length,\n documents,\n tools,\n },\n ];\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 return [compact({ id, text, additionalProps })];\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 { Hono } from \"hono\";\nimport type {\n StudioMemoryConversationMessages,\n StudioMemoryConversationSteps,\n StudioMemoryConversationSummary,\n StudioMemoryConversationsPage,\n StudioMemoryUsersPage,\n StudioSession,\n StudioSessionStore,\n StudioSessionSummary,\n} from \"../types\";\nimport { compact } from \"./compact\";\nimport { errorResponse } from \"./http\";\nimport { optionalQueryString, parseLimit } from \"./query\";\n\nconst DEFAULT_USER_ID = \"default\";\n\nexport function registerMemoryRoutes(\n app: Hono,\n props: {\n sessionStore: StudioSessionStore;\n },\n): 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 props.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)) {\n existing.agentIds.push(session.agentId);\n }\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 sessions = await props.sessionStore.listSessions({\n ...compact({ agentId }),\n limit: 100,\n });\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 props.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 props.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 memoryConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemoryConversationSummary {\n return compact({\n id: session.id,\n userId: sessionUserId(session),\n agentId: session.agentId,\n title: session.title,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n metadata: session.metadata,\n }) as StudioMemoryConversationSummary;\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","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 { compact } from \"./compact\";\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 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: compact({\n stream: props.stream,\n inputBytes: byteLength(formatUnknown(props.input)),\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\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: compact({\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 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: compact({\n durationMs: props.durationMs,\n outputBytes: byteLength(formatUnknown(props.output)),\n }),\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: compact({\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: compact({\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: compact({\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 return compact({\n nodeId: node.id,\n kind: node.kind,\n label: node.label,\n agentId: node.agentId,\n pipelineId: node.pipelineId,\n branchKey: node.branchKey,\n });\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 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 { compact } from \"./compact\";\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 logs = await props.logStore.listPipelineLogs({\n pipelineId,\n limit,\n ...compact({ after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\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 return executePipelineRun(c, props, pipeline, {\n input: sourceRun.input,\n ...compact({ stream: body.stream }),\n metadata: replayMetadata(sourceRun.metadata, body.metadata, sourceRun.runId),\n });\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 await appendPipelineLog(\n props.logStore,\n pipelineRunReceivedLog({\n pipeline,\n runId,\n stream: body.stream === true,\n input: body.input,\n ...compact({ metadata: body.metadata }),\n }),\n );\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"running\",\n input: body.input,\n ...compact({ metadata: body.metadata }),\n startedAt: startedAtIso,\n });\n\n if (body.stream === true) {\n return streamPipelineRun(c, {\n pipeline,\n runId,\n input: body.input,\n startedAt,\n startedAtIso,\n ...compact({ metadata: body.metadata }),\n ...compact({ logStore: props.logStore, runStore: props.runStore }),\n });\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 await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"success\",\n input: body.input,\n output: jsonOutput,\n ...compact({ metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\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 await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"error\",\n input: body.input,\n error: serializeError(error),\n ...compact({ metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\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 await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"success\",\n input: props.input,\n output: jsonOutput,\n ...compact({ metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\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 await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"error\",\n input: props.input,\n error: serializeError(error),\n ...compact({ metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\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) } as AgentRunStreamEvent);\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 return {\n ...(sourceMetadata ?? {}),\n ...(requestMetadata ?? {}),\n replayOf: sourceRunId,\n };\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, 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 { compact } from \"./compact\";\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 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 answers.push(\n compact({\n questionId: answer.questionId.trim(),\n answer: answer.answer.trim(),\n choice: typeof answer.choice === \"string\" ? answer.choice : undefined,\n custom: typeof answer.custom === \"boolean\" ? answer.custom : undefined,\n }) as StudioToolQuestionAnswer,\n );\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 answers = await requestQuestion(\n questions,\n context,\n compact({\n toolName,\n toolCallId,\n internalCallId,\n args,\n questions: prompts.questions,\n }) as QuestionRequest,\n );\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 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 ...compact({\n id,\n runId: context.runId,\n agentId: context.agentId,\n sessionId: context.sessionId,\n toolName: request.toolName,\n callId: request.toolCallId,\n internalCallId: request.internalCallId,\n args: request.args,\n questions: request.questions,\n status: \"pending\" as const,\n requestedAt: new Date().toISOString(),\n emit: context.emit,\n }),\n resolve: () => {},\n };\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 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 type { JsonObject } from \"@anvia/core/completion\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport { compact } from \"./compact\";\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 sessions = await props.sessionStore.listSessions({\n ...compact({ agentId }),\n limit,\n });\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 session = await props.sessionStore.createSession({\n id: globalThis.crypto.randomUUID(),\n agentId: body.agentId,\n ...compact({ title: body.title, metadata: body.metadata }),\n });\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 logs = await props.sessionStore.listSessionLogs({\n sessionId,\n limit,\n ...compact({ after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\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 { compact } from \"../runtime/compact\";\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 ...compact({\n id: input.id,\n agentId: input.agentId,\n title: input.title,\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n metadata: input.metadata,\n }),\n messages: [],\n runs: [],\n logs: [],\n };\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 = compact({\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n runId: input.runId,\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 metadata: input.metadata,\n }) as StudioSessionLogEntry;\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 = compact({\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n runId: input.runId,\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 metadata: input.metadata,\n }) as StudioPipelineLogEntry;\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 = compact({\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n output: input.output,\n error: input.error,\n metadata: input.metadata,\n startedAt: input.startedAt,\n endedAt: input.endedAt,\n durationMs: input.durationMs,\n }) as StudioPipelineRunRecord;\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 return compact({\n id: session.id,\n agentId: session.agentId,\n title: session.title,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messages.length,\n metadata: session.metadata,\n }) as StudioSessionSummary;\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 traceSummary(trace: StudioTrace): StudioTraceSummary {\n return compact({\n id: trace.id,\n sessionId: trace.sessionId,\n name: trace.name,\n status: trace.status,\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n output: trace.output,\n error: trace.error,\n usage: trace.usage,\n metadata: trace.metadata,\n observationCount: trace.observations.length,\n }) as StudioTraceSummary;\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 { compact } from \"./compact\";\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 return compact({\n sessions,\n traces,\n pipelineLogs,\n pipelineRuns,\n }) as ResolvedStores;\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 { compact } from \"./compact\";\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 },\n): void {\n app.get(\"/status\", async (c) => {\n const summary: StudioStatusSummary = {\n runner: {\n id: runnerId(props.options),\n ...compact({ name: props.options.name, version: props.options.version }),\n },\n storage: {\n ...compact({\n sessions: props.stores.sessions?.kind,\n traces: props.stores.traces?.kind,\n pipelineLogs:\n props.stores.pipelineLogs !== undefined ? (\"available\" as const) : undefined,\n pipelineRuns:\n props.stores.pipelineRuns !== undefined ? (\"available\" as const) : undefined,\n }),\n },\n counts: {\n agents: props.agents.length,\n pipelines: props.pipelines.length,\n ...compact({\n sessions:\n props.stores.sessions !== undefined\n ? (await props.stores.sessions.listSessions({ limit: 100 })).length\n : undefined,\n traces:\n props.stores.traces?.listTraces !== undefined\n ? (await props.stores.traces.listTraces({ limit: 100 })).length\n : undefined,\n pipelineRuns:\n props.stores.pipelineRuns !== undefined && props.pipelines.length > 0\n ? (\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 : undefined,\n }),\n },\n capabilities: capabilityConfig(props.options, props.agents, props.pipelines, props.stores),\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 metadata.push({\n agentId: agent.id,\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n ...(serverName === undefined ? {} : { mcpServerName: serverName }),\n approval: approvalMetadata(tool),\n });\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 { compact } from \"./compact\";\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 traces = await traceStore.listTraces({\n limit,\n ...compact({ agentId, sessionId, status }),\n });\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 { compact } from \"../runtime/compact\";\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 return {\n id: input.id,\n agentId: input.agentId,\n ...compact({ title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...compact({ metadata: input.metadata }),\n };\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 ...compact({ runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...compact({ metadata: input.metadata }),\n };\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 ...compact({ runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...compact({ metadata: input.metadata }),\n };\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 return {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n ...compact({ output: input.output }),\n ...compact({ error: input.error }),\n ...compact({ metadata: input.metadata }),\n startedAt: input.startedAt,\n ...compact({ endedAt: input.endedAt }),\n ...compact({ durationMs: input.durationMs }),\n };\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 return {\n id: row.id,\n agentId: row.agent_id,\n ...compact({ title: row.title ?? undefined }),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: row.message_count,\n ...compact({ metadata }),\n };\n}\n\nfunction toSessionLog(row: SessionLogRow): StudioSessionLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n sessionId: row.session_id,\n ...compact({ runId: row.run_id ?? undefined }),\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 ...compact({ metadata }),\n };\n}\n\nfunction toPipelineLog(row: PipelineLogRow): StudioPipelineLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n pipelineId: row.pipeline_id,\n ...compact({ runId: row.run_id ?? undefined }),\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 ...compact({ metadata }),\n };\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 return {\n runId: row.run_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n input: JSON.parse(row.input_json) as JsonValue,\n ...compact({ output }),\n ...compact({ error }),\n ...compact({ metadata }),\n startedAt: row.started_at,\n ...compact({ endedAt: row.ended_at ?? undefined }),\n ...compact({ durationMs: row.duration_ms ?? undefined }),\n };\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 const metadataProperties = compact({ metadata });\n\n if (row.role === \"system\") {\n return { role: \"system\", content: systemContentFromParts(parts), ...metadataProperties };\n }\n if (row.role === \"user\") {\n return {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n ...metadataProperties,\n };\n }\n if (row.role === \"assistant\") {\n return {\n role: \"assistant\",\n ...compact({ id: row.message_id ?? undefined }),\n content: parts as Extract<Message, { role: \"assistant\" }>[\"content\"],\n ...metadataProperties,\n };\n }\n if (row.role === \"tool\") {\n return {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n ...metadataProperties,\n };\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 return {\n ...toTraceSummary(row),\n ...compact({ trace }),\n ...compact({ input }),\n observations: parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json),\n };\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 return {\n id: row.id,\n sessionId: row.session_id,\n ...compact({ name: row.name ?? undefined }),\n status: row.status,\n startedAt: row.started_at,\n ...compact({ endedAt: row.ended_at ?? undefined }),\n ...compact({ durationMs: row.duration_ms ?? undefined }),\n ...compact({ output: row.output ?? undefined }),\n ...compact({ error }),\n ...compact({ usage }),\n ...compact({ metadata }),\n observationCount: observations.length,\n };\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","import type {\n CompletionModel,\n CompletionModelCapabilities,\n JsonObject,\n JsonValue,\n Message,\n StreamingCompletionModel,\n ToolResultContent,\n Usage,\n} from \"@anvia/core/completion\";\nimport type { Agent } from \"@anvia/core/internal/agent\";\nimport type { ModelList } from \"@anvia/core/model-listing\";\nimport type { Pipeline, PipelineGraph } from \"@anvia/core/pipeline\";\nimport type { AgentStreamEvent, PromptResponse } from \"@anvia/core/request\";\nimport type { Hono } from \"hono\";\nimport { compact } from \"./shared/compact\";\n\nexport type StudioCapability =\n | \"agents\"\n | \"approvals\"\n | \"evals\"\n | \"memory\"\n | \"knowledge\"\n | \"mcps\"\n | \"observability\"\n | \"pipelines\"\n | \"sessions\"\n | \"status\"\n | \"tools\"\n | \"traces\";\n\nexport type AgentTraceInfo = {\n traceId?: string | undefined;\n observationId?: string | undefined;\n};\n\nexport type AgentTraceOptions = {\n name?: string | undefined;\n userId?: string | undefined;\n sessionId?: string | undefined;\n metadata?: Record<string, unknown> | undefined;\n tags?: string[] | undefined;\n version?: string | undefined;\n traceId?: string | undefined;\n failOnObserverError?: boolean | undefined;\n};\n\nexport type StudioModelRef = string | { provider: string; model: string };\n\nexport type StudioModelModality = \"text\" | \"image\" | \"document\" | \"audio\" | \"video\";\n\nexport type StudioModelModalities = {\n input: StudioModelModality[];\n output?: StudioModelModality[];\n};\n\nexport type StudioModelDefinition = {\n id: string;\n name?: string;\n description?: string;\n modalities?: StudioModelModalities;\n capabilities?: Partial<CompletionModelCapabilities>;\n metadata?: JsonObject;\n};\n\nexport type StudioModelProvider = {\n id: string;\n name?: string;\n defaultModel?: string;\n models?: StudioModelDefinition[];\n createCompletionModel(model: string): CompletionModel | StreamingCompletionModel;\n listModels?: () => Promise<ModelList>;\n metadata?: JsonObject;\n};\n\nexport type StudioAgentModelPolicy = {\n default?: StudioModelRef;\n allowed?: Array<StudioModelRef | `${string}:*`>;\n};\n\nexport type StudioModelConfig = {\n providers: StudioModelProvider[];\n default?: StudioModelRef;\n agents?: Record<string, StudioAgentModelPolicy>;\n};\n\nexport type StudioModelSummary = StudioModelDefinition & {\n ref: string;\n providerId: string;\n providerName?: string;\n};\n\nexport type StudioModelProviderConfig = {\n id: string;\n name?: string;\n defaultModel?: string;\n models: StudioModelSummary[];\n metadata?: JsonObject;\n warning?: string;\n};\n\nexport type StudioAgentModelPolicyConfig = {\n default?: string;\n allowed?: string[];\n};\n\nexport type StudioModelsConfig = {\n providers: StudioModelProviderConfig[];\n default?: string;\n agents: Record<string, StudioAgentModelPolicyConfig>;\n};\n\nexport type StudioAgentModelsSummary = {\n agentId: string;\n defaultModel?: string;\n models: StudioModelSummary[];\n warnings?: JsonObject[];\n};\n\nexport type StudioAgent = {\n id: string;\n agent: Agent;\n name?: string;\n description?: string;\n quickPrompts?: string[];\n metadata?: JsonObject;\n};\n\n// Studio accepts arbitrary pipelines and validates run inputs at the HTTP boundary.\n// biome-ignore lint/suspicious/noExplicitAny: input/output types remain user-defined outside Studio.\nexport type StudioTarget = Agent | Pipeline<any, any>;\n\nexport type StudioAgentConfig = {\n id: string;\n name?: string;\n description?: string;\n quickPrompts: string[];\n metadata?: JsonObject;\n};\n\nexport type StudioAgentRuntimeSummary = {\n id: string;\n name?: string;\n description?: string;\n model?: JsonValue;\n toolCount: number;\n staticToolCount: number;\n dynamicToolCount: number;\n approvalToolCount: number;\n mcpToolCount: number;\n staticContextCount: number;\n dynamicContextCount: number;\n observerCount: number;\n hasMemory: boolean;\n hasHook: boolean;\n hasOutputSchema: boolean;\n defaultMaxTurns?: number;\n metadata?: JsonObject;\n};\n\nexport type StudioPipeline = {\n id: string;\n // biome-ignore lint/suspicious/noExplicitAny: Studio stores heterogeneous user pipelines.\n pipeline: Pipeline<any, any>;\n name?: string;\n description?: string;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineConfig = {\n id: string;\n name?: string;\n description?: string;\n metadata?: JsonObject;\n stageCount: number;\n edgeCount: number;\n hasParallelStages: boolean;\n agentCount: number;\n extractorCount: number;\n};\n\nexport type StudioPipelineDetail = StudioPipelineConfig & {\n graph: PipelineGraph;\n};\n\nexport type StudioEvalSuite<\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous eval suites.\n Input = any,\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous eval suites.\n _Output = any,\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous eval suites.\n _Expected = any,\n> = {\n name: string;\n cases: Array<Input>;\n // biome-ignore lint/suspicious/noExplicitAny: Studio passes eval targets through to core.\n target: any;\n // biome-ignore lint/suspicious/noExplicitAny: Studio only reads metric names and passes metrics through.\n metrics: any[];\n concurrency?: number;\n // biome-ignore lint/suspicious/noExplicitAny: Studio passes reporters through to core.\n reporters?: any[];\n failOnReporterError?: boolean;\n id?: string;\n description?: string;\n metadata?: JsonObject;\n};\n\nexport type StudioEvalSuiteConfig = {\n id: string;\n name: string;\n description?: string;\n caseCount: number;\n metricNames: string[];\n casePreviewCount?: number;\n casePreviews?: StudioEvalCasePreview[];\n metricSummaries?: StudioEvalMetricSummary[];\n concurrency?: number;\n metadata?: JsonObject;\n};\n\nexport type StudioEvalCasePreview = {\n id: string;\n input?: JsonValue;\n expected?: JsonValue;\n metadataKeys?: string[];\n};\n\nexport type StudioEvalMetricSummary = {\n name: string;\n dataType?: \"NUMERIC\" | \"CATEGORICAL\" | \"BOOLEAN\";\n configId?: string;\n scoreConfigId?: string;\n metadataKeys?: string[];\n};\n\nexport type StudioEvalRunRequest = {\n concurrency?: number;\n};\n\nexport type StudioEvalRunResponse = {\n runId: string;\n suiteId: string;\n startedAt: string;\n endedAt: string;\n durationMs: number;\n result: JsonObject;\n};\n\nexport type StudioCapabilityConfig = {\n enabled: boolean;\n reason?: string;\n};\n\nexport type StudioConfig = {\n id: string;\n name?: string;\n description?: string;\n version?: string;\n agents: StudioAgentConfig[];\n models?: StudioModelsConfig;\n pipelines: StudioPipelineConfig[];\n evals: StudioEvalSuiteConfig[];\n chat: {\n quickPrompts: Record<string, string[]>;\n };\n capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>>;\n unsupportedCapabilities: StudioCapability[];\n};\n\nexport type StudioAgentToolSource = \"static\" | \"dynamic\";\n\nexport type StudioAgentToolApprovalMetadata = {\n required: boolean;\n reason?: string;\n rejectMessage?: string;\n};\n\nexport type StudioAgentToolMetadata = {\n agentId: string;\n name: string;\n description: string;\n parameters: JsonObject;\n source: StudioAgentToolSource;\n mcpServerName?: string;\n approval: StudioAgentToolApprovalMetadata;\n};\n\nexport type StudioAgentToolsSummary = {\n agentId: string;\n tools: StudioAgentToolMetadata[];\n};\n\nexport type StudioToolRunRequest = {\n args: JsonValue;\n context?: JsonObject;\n};\n\nexport type StudioToolRunResponse = {\n agentId: string;\n toolName: string;\n result?: JsonValue;\n error?: JsonValue;\n status: \"success\" | \"error\";\n durationMs: number;\n startedAt: string;\n endedAt: string;\n events: JsonValue[];\n};\n\nexport type StudioAgentMcpToolMetadata = {\n name: string;\n description: string;\n parameters: JsonObject;\n source: StudioAgentToolSource;\n approval: StudioAgentToolApprovalMetadata;\n};\n\nexport type StudioAgentMcpServerMetadata = {\n agentId: string;\n name: string;\n toolCount: number;\n tools: StudioAgentMcpToolMetadata[];\n};\n\nexport type StudioAgentMcpsSummary = {\n agentId: string;\n servers: StudioAgentMcpServerMetadata[];\n};\n\nexport type StudioTranscriptChatEntry = {\n entryId: number;\n kind: \"message\";\n role: \"user\" | \"assistant\";\n text: string;\n tone?: \"error\";\n traceId?: string;\n attachments?: StudioTranscriptAttachment[];\n};\n\nexport type StudioTranscriptAttachment = {\n kind: \"image\" | \"document\";\n name?: string;\n mediaType?: string;\n data?: string;\n url?: string;\n};\n\nexport type StudioTranscriptReasoningEntry = {\n entryId: number;\n kind: \"reasoning\";\n reasoningId?: string;\n text: string;\n};\n\nexport type StudioTranscriptToolEntry = {\n entryId: number;\n kind: \"tool\";\n toolName: string;\n callId?: string;\n args?: string;\n result?: string;\n structuredResult?: ToolResultContent[];\n childEvents?: StudioTranscriptChildAgentEvent[];\n approval?: StudioToolApprovalTranscript;\n question?: StudioToolQuestionTranscript;\n};\n\nexport type StudioTranscriptChildAgentEvent =\n | {\n kind: \"message\";\n agentId: string;\n agentName?: string;\n text: string;\n }\n | {\n kind: \"reasoning\";\n agentId: string;\n agentName?: string;\n reasoningId?: string;\n text: string;\n }\n | {\n kind: \"tool\";\n agentId: string;\n agentName?: string;\n toolName: string;\n callId?: string;\n args?: string;\n result?: string;\n structuredResult?: ToolResultContent[];\n };\n\nexport type StudioTranscriptEntry =\n | StudioTranscriptChatEntry\n | StudioTranscriptReasoningEntry\n | StudioTranscriptToolEntry;\n\nexport type StudioSessionSummary = {\n id: string;\n agentId: string;\n title?: string;\n createdAt: string;\n updatedAt: string;\n messageCount: number;\n metadata?: JsonObject;\n};\n\nexport type StudioSession = StudioSessionSummary & {\n messages: Message[];\n transcript: StudioTranscriptEntry[];\n};\n\nexport type StudioSessionCreateInput = {\n id: string;\n agentId: string;\n title?: string;\n metadata?: JsonObject;\n};\n\nexport type StudioSessionListOptions = {\n agentId?: string;\n limit: number;\n};\n\nexport type StudioSessionRunStatus = \"running\" | \"success\" | \"error\";\n\nexport type StudioSessionRunTranscriptInput = {\n id: string;\n runId: string;\n title?: string;\n transcript: StudioTranscriptEntry[];\n status: StudioSessionRunStatus;\n error?: JsonValue;\n};\n\nexport type StudioSessionLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type StudioSessionLogCategory =\n | \"session\"\n | \"run\"\n | \"memory\"\n | \"prompt\"\n | \"model\"\n | \"tool\"\n | \"approval\"\n | \"question\"\n | \"api\";\n\nexport type StudioSessionLogEntry = {\n id: string;\n sessionId: string;\n runId?: string;\n sequence: number;\n timestamp: string;\n level: StudioSessionLogLevel;\n category: StudioSessionLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioSessionLogAppendInput = {\n sessionId: string;\n runId?: string;\n level: StudioSessionLogLevel;\n category: StudioSessionLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioSessionLogListOptions = {\n sessionId: string;\n limit: number;\n after?: number;\n};\n\nexport type StudioMemoryContext = {\n sessionId: string;\n userId?: string | undefined;\n metadata?: JsonObject | undefined;\n};\n\nexport type StudioMemoryAppendInput = {\n context: StudioMemoryContext;\n runId: string;\n turn: number;\n messages: Message[];\n};\n\nexport type StudioMemoryErrorInput = {\n context: StudioMemoryContext;\n runId: string;\n error: unknown;\n messages: Message[];\n};\n\nexport type StudioMemoryStore = {\n load(context: StudioMemoryContext): Promise<Message[]>;\n append(input: StudioMemoryAppendInput): Promise<void>;\n clear(context: StudioMemoryContext): Promise<void>;\n recordError?(input: StudioMemoryErrorInput): Promise<void>;\n};\n\nexport type StudioSessionStore = StudioMemoryStore & {\n readonly kind?: string;\n listSessions(\n options: StudioSessionListOptions,\n ): StudioSessionSummary[] | Promise<StudioSessionSummary[]>;\n createSession(\n input: StudioSessionCreateInput,\n ): StudioSessionSummary | Promise<StudioSessionSummary>;\n getSession(id: string): StudioSession | undefined | Promise<StudioSession | undefined>;\n saveSessionRunTranscript(\n input: StudioSessionRunTranscriptInput,\n ): StudioSession | undefined | Promise<StudioSession | undefined>;\n updateSessionMetadata?(\n id: string,\n metadata: JsonObject | undefined,\n ): StudioSession | undefined | Promise<StudioSession | undefined>;\n appendSessionLog?(\n input: StudioSessionLogAppendInput,\n ): StudioSessionLogEntry | Promise<StudioSessionLogEntry>;\n listSessionLogs?(\n options: StudioSessionLogListOptions,\n ): StudioSessionLogEntry[] | Promise<StudioSessionLogEntry[]>;\n deleteSession?(id: string): boolean | Promise<boolean>;\n};\n\nexport type StudioTraceStatus = \"running\" | \"success\" | \"error\";\n\nexport type StudioTraceObservationKind = \"agent\" | \"generation\" | \"tool\";\n\nexport type StudioTraceObservation = {\n id: string;\n parentObservationId?: string;\n kind: StudioTraceObservationKind;\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n};\n\nexport type StudioTraceSummary = {\n id: string;\n sessionId: string;\n name?: string;\n status: StudioTraceStatus;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n output?: string;\n error?: JsonValue;\n usage?: Usage;\n metadata?: JsonObject;\n observationCount: number;\n};\n\nexport type StudioTrace = StudioTraceSummary & {\n trace?: AgentTraceInfo;\n input?: JsonValue;\n observations: StudioTraceObservation[];\n};\n\nexport type StudioObservabilityEventType = \"session_log\" | \"pipeline_log\" | \"trace\";\n\nexport type StudioObservabilityEvent =\n | {\n type: \"session_log\";\n log: StudioSessionLogEntry;\n }\n | {\n type: \"pipeline_log\";\n log: StudioPipelineLogEntry;\n }\n | {\n type: \"trace\";\n trace: StudioTraceSummary;\n };\n\nexport type StudioTraceListOptions = {\n limit: number;\n agentId?: string;\n sessionId?: string;\n status?: StudioTraceStatus;\n};\n\nexport type StudioSessionTraceListOptions = {\n sessionId: string;\n limit: number;\n};\n\nexport type StudioTraceStore = {\n readonly kind?: string;\n listTraces?(\n options: StudioTraceListOptions,\n ): StudioTraceSummary[] | Promise<StudioTraceSummary[]>;\n listSessionTraces(\n options: StudioSessionTraceListOptions,\n ): StudioTraceSummary[] | Promise<StudioTraceSummary[]>;\n getTrace(id: string): StudioTrace | undefined | Promise<StudioTrace | undefined>;\n saveTrace(trace: StudioTrace): StudioTrace | Promise<StudioTrace>;\n};\n\nexport type StudioKnowledgeSourceKind = \"static_context\" | \"dynamic_context\" | \"dynamic_tools\";\n\nexport type StudioKnowledgeSourceSummary = {\n sourceId?: string;\n kind: StudioKnowledgeSourceKind;\n label?: string;\n count: number;\n registrationIndex?: number;\n topK?: number;\n threshold?: number;\n inspectable?: boolean;\n itemCount?: number;\n};\n\nexport type StudioStaticKnowledgeDocument = {\n id: string;\n text: string;\n additionalProps?: JsonObject;\n};\n\nexport type StudioKnowledgeEvidenceDocument = {\n id?: string;\n text?: string;\n additionalProps?: JsonObject;\n};\n\nexport type StudioKnowledgeEvidence = {\n traceId: string;\n sessionId: string;\n observationId: string;\n observationName: string;\n turn: number;\n startedAt: string;\n query?: string;\n documentCount: number;\n toolCount: number;\n documents: StudioKnowledgeEvidenceDocument[];\n tools: string[];\n};\n\nexport type StudioAgentKnowledgeConfig = {\n agentId: string;\n agentName?: string;\n sources: StudioKnowledgeSourceSummary[];\n staticContext: StudioStaticKnowledgeDocument[];\n};\n\nexport type StudioKnowledgeItemKind = \"static_context\" | \"dynamic_context\" | \"dynamic_tool\";\n\nexport type StudioKnowledgeItem = {\n id: string;\n kind: StudioKnowledgeItemKind;\n text?: string;\n document?: JsonValue;\n toolName?: string;\n description?: string;\n parameterKeys?: string[];\n metadata?: JsonObject;\n};\n\nexport type StudioKnowledgeItemsPage = {\n agentId: string;\n sourceId: string;\n kind: StudioKnowledgeSourceKind;\n inspectable: boolean;\n items: StudioKnowledgeItem[];\n nextCursor?: string;\n totalCount?: number;\n message?: string;\n};\n\nexport type StudioKnowledgeSummary = {\n agents: StudioAgentKnowledgeConfig[];\n evidence: StudioKnowledgeEvidence[];\n};\n\nexport type StudioMemoryUserSummary = {\n userId: string;\n conversationCount: number;\n agentIds: string[];\n lastInteractionAt: string;\n};\n\nexport type StudioMemoryConversationSummary = {\n id: string;\n userId: string;\n agentId: string;\n title?: string;\n createdAt: string;\n updatedAt: string;\n messageCount: number;\n metadata?: JsonObject;\n};\n\nexport type StudioMemoryConversationsPage = {\n conversations: StudioMemoryConversationSummary[];\n total: number;\n};\n\nexport type StudioMemoryUsersPage = {\n users: StudioMemoryUserSummary[];\n total: number;\n};\n\nexport type StudioMemoryConversationMessages = {\n conversation: StudioMemoryConversationSummary;\n messages: Message[];\n transcript: StudioTranscriptEntry[];\n};\n\nexport type StudioMemoryConversationSteps = {\n conversation: StudioMemoryConversationSummary;\n steps: StudioTranscriptEntry[];\n};\n\nexport type StudioStatusSummary = {\n runner: {\n id: string;\n name?: string;\n version?: string;\n };\n storage: {\n sessions?: string;\n traces?: string;\n pipelineLogs?: string;\n pipelineRuns?: string;\n };\n counts: {\n agents: number;\n pipelines: number;\n sessions?: number;\n traces?: number;\n pipelineRuns?: number;\n };\n capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>>;\n generatedAt: string;\n};\n\nexport type StudioStores = {\n sessions?: StudioSessionStore | false;\n traces?: StudioTraceStore;\n pipelineLogs?: StudioPipelineLogStore | false;\n pipelineRuns?: StudioPipelineRunStore | false;\n};\n\nexport type StudioUiOptions = {\n path?: string;\n rootRoutes?: boolean;\n title?: string;\n redirectRoot?: boolean;\n clientScript?: string;\n protectShell?: boolean;\n};\n\nexport type StudioOptions = {\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts eval suites with arbitrary user-defined case and output types.\n evals?: Array<StudioEvalSuite<any, any, any>>;\n quickPrompts?: Record<string, string[]>;\n stores?: StudioStores;\n ui?: boolean | StudioUiOptions;\n models?: StudioModelConfig;\n};\n\nexport type StudioServeOptions = {\n port?: number;\n hostname?: string;\n log?: boolean;\n};\n\nexport type StudioToolApprovalDecision = {\n approved: boolean;\n reason?: string;\n};\n\nexport type StudioToolApprovalStatus = \"pending\" | \"approved\" | \"rejected\" | \"timed_out\";\n\nexport type StudioToolApproval = {\n id: string;\n runId: string;\n agentId: string;\n sessionId?: string;\n toolName: string;\n callId?: string;\n internalCallId: string;\n args: string;\n status: StudioToolApprovalStatus;\n requestedAt: string;\n resolvedAt?: string;\n reason?: string;\n};\n\nexport type StudioToolApprovalTranscript = {\n id: string;\n status: StudioToolApprovalStatus;\n requestedAt: string;\n resolvedAt?: string;\n reason?: string;\n};\n\nexport type StudioToolApprovalRequestEvent = {\n type: \"tool_approval_request\";\n approval: StudioToolApproval;\n};\n\nexport type StudioToolApprovalResultEvent = {\n type: \"tool_approval_result\";\n approval: StudioToolApproval;\n};\n\nexport type StudioToolQuestionChoice = {\n label: string;\n value: string;\n};\n\nexport type StudioToolQuestionPrompt = {\n id: string;\n question: string;\n choices: StudioToolQuestionChoice[];\n};\n\nexport type StudioToolQuestionAnswer = {\n questionId: string;\n answer: string;\n choice?: string;\n custom?: boolean;\n};\n\nexport type StudioToolQuestionStatus = \"pending\" | \"answered\";\n\nexport type StudioToolQuestion = {\n id: string;\n runId: string;\n agentId: string;\n sessionId?: string;\n toolName: string;\n callId?: string;\n internalCallId: string;\n args: string;\n questions: StudioToolQuestionPrompt[];\n status: StudioToolQuestionStatus;\n requestedAt: string;\n answeredAt?: string;\n answers?: StudioToolQuestionAnswer[];\n};\n\nexport type StudioToolQuestionTranscript = {\n id: string;\n status: StudioToolQuestionStatus;\n requestedAt: string;\n answeredAt?: string;\n questions: StudioToolQuestionPrompt[];\n answers?: StudioToolQuestionAnswer[];\n};\n\nexport type StudioToolQuestionRequestEvent = {\n type: \"tool_question_request\";\n question: StudioToolQuestion;\n};\n\nexport type StudioToolQuestionResultEvent = {\n type: \"tool_question_result\";\n question: StudioToolQuestion;\n};\n\nexport type StudioSessionLogEvent = {\n type: \"session_log\";\n log: StudioSessionLogEntry;\n};\n\nexport type StudioPipelineLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type StudioPipelineLogCategory =\n | \"pipeline\"\n | \"run\"\n | \"stage\"\n | \"parallel\"\n | \"agent\"\n | \"extractor\"\n | \"api\";\n\nexport type StudioPipelineLogEntry = {\n id: string;\n pipelineId: string;\n runId?: string;\n sequence: number;\n timestamp: string;\n level: StudioPipelineLogLevel;\n category: StudioPipelineLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineLogAppendInput = {\n pipelineId: string;\n runId?: string;\n level: StudioPipelineLogLevel;\n category: StudioPipelineLogCategory;\n event: string;\n message: string;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineLogListOptions = {\n pipelineId: string;\n limit: number;\n after?: number;\n};\n\nexport type StudioPipelineLogStore = {\n appendPipelineLog(\n input: StudioPipelineLogAppendInput,\n ): StudioPipelineLogEntry | Promise<StudioPipelineLogEntry>;\n listPipelineLogs(\n options: StudioPipelineLogListOptions,\n ): StudioPipelineLogEntry[] | Promise<StudioPipelineLogEntry[]>;\n};\n\nexport type StudioPipelineLogEvent = {\n type: \"pipeline_log\";\n log: StudioPipelineLogEntry;\n};\n\nexport type StudioPipelineFinalEvent = {\n type: \"pipeline_final\";\n runId: string;\n pipelineId: string;\n output: JsonValue;\n};\n\nexport type StudioPipelineRunStatus = \"running\" | \"success\" | \"error\";\n\nexport type StudioPipelineRunRecord = {\n runId: string;\n pipelineId: string;\n status: StudioPipelineRunStatus;\n input: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n};\n\nexport type StudioPipelineRunSaveInput = {\n runId: string;\n pipelineId: string;\n status: StudioPipelineRunStatus;\n input: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n startedAt: string;\n endedAt?: string;\n durationMs?: number;\n};\n\nexport type StudioPipelineRunListOptions = {\n pipelineId: string;\n limit: number;\n};\n\nexport type StudioPipelineRunGetOptions = {\n pipelineId: string;\n runId: string;\n};\n\nexport type StudioPipelineRunStore = {\n savePipelineRun(\n input: StudioPipelineRunSaveInput,\n ): StudioPipelineRunRecord | Promise<StudioPipelineRunRecord>;\n getPipelineRun(\n options: StudioPipelineRunGetOptions,\n ): StudioPipelineRunRecord | undefined | Promise<StudioPipelineRunRecord | undefined>;\n listPipelineRuns(\n options: StudioPipelineRunListOptions,\n ): StudioPipelineRunRecord[] | Promise<StudioPipelineRunRecord[]>;\n};\n\nexport type StudioPipelineRunRequest = {\n input: JsonValue;\n stream?: boolean;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineReplayRequest = {\n stream?: boolean;\n metadata?: JsonObject;\n};\n\nexport type StudioPipelineRunResponse = {\n runId: string;\n pipelineId: string;\n output: JsonValue;\n};\n\nexport type AgentRunRequest = {\n message: string | Message;\n history?: Message[];\n sessionId?: string;\n stream?: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n model?: StudioModelRef;\n metadata?: JsonObject;\n trace?: AgentTraceOptions;\n};\n\nexport type AgentRunUIRequest = {\n messages: Message[];\n sessionId?: string;\n stream?: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n model?: StudioModelRef;\n metadata?: JsonObject;\n trace?: AgentTraceOptions;\n};\n\nexport type AgentRunResponse = PromptResponse;\n\nexport type AgentRunStreamEvent =\n | AgentStreamEvent\n | StudioToolApprovalRequestEvent\n | StudioToolApprovalResultEvent\n | StudioToolQuestionRequestEvent\n | StudioToolQuestionResultEvent\n | StudioSessionLogEvent\n | StudioPipelineLogEvent\n | StudioPipelineFinalEvent;\n\nexport type StudioErrorCode =\n | \"bad_request\"\n | \"conflict\"\n | \"not_found\"\n | \"unsupported_capability\"\n | \"internal_error\";\n\nexport type StudioErrorResponse = {\n error: {\n code: StudioErrorCode;\n message: string;\n details?: JsonValue;\n };\n};\n\nexport function traceSummary(trace: StudioTrace): StudioTraceSummary {\n return compact({\n id: trace.id,\n sessionId: trace.sessionId,\n name: trace.name,\n status: trace.status,\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n output: trace.output,\n error: trace.error,\n usage: trace.usage,\n metadata: trace.metadata,\n observationCount: trace.observations.length,\n }) as StudioTraceSummary;\n}\n\nexport type AnviaStudio = {\n readonly app: Hono;\n fetch(request: Request): Response | Promise<Response>;\n config(): StudioConfig;\n close(): void;\n};\n"],"mappings":"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","names":["Agent","resolve","appendSessionLog","appendPipelineLog","resolve","byteLength","resolve","decision","isRecord","toJsonValue","isRecord","byteLength","createHook","createHook","resolve","run","traceSummary","Agent","isJsonValue","studioRunId","serializeJsonError","isJsonValue","traceSummary"]}