@anvia/studio 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +32 -7
- package/dist/index.js +702 -105
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/{index-DArq3ZFi.js → index-Dy72BB4f.js} +6 -6
- package/dist/ui/assets/{index-DArq3ZFi.js.map → index-Dy72BB4f.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/studio.ts","../src/traces/trace-observer.ts","../src/ui/routes.tsx","../src/runtime/approvals.ts","../src/runtime/shared.ts","../src/storage/sqlite-store.ts","../src/runtime/json.ts","../src/runtime/knowledge.ts","../src/runtime/questions.ts","../src/runtime/runs.ts","../src/runtime/sessions.ts","../src/runtime/trace-routes.ts"],"sourcesContent":["import {\n Agent,\n createHook,\n type HookAction,\n type JsonObject,\n type PromptHook,\n type ToolCallHookAction,\n} from \"@anvia/core\";\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 AgentRunStreamEvent,\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioServeOptions,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport {\n isStudioUiEnabled,\n registerStudioUi,\n resolveStudioUiOptions,\n studioUiEntryPath,\n} from \"../ui/routes\";\nimport { createApprovalRuntime, registerApprovalRoutes } from \"./approvals\";\nimport { registerKnowledgeRoutes } from \"./knowledge\";\nimport { createQuestionRuntime, registerQuestionRoutes } from \"./questions\";\nimport {\n AsyncEventQueue,\n mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n persistStreamingSessionRun,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport {\n agentConfig,\n buildConfig,\n errorResponse,\n normalizeAgents,\n resolveStores,\n runnerId,\n type StudioRuntimeOptions,\n serializeError,\n unsupportedCapabilities,\n unsupportedCapability,\n} from \"./shared\";\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(agents: Agent[] = [], options: StudioOptions = {}) {\n this.options = studioOptionsFromAgents(agents, 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 ...(serveOptions.hostname === undefined ? {} : { 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 studioOptionsFromAgents(agents: Agent[], options: StudioOptions): StudioRuntimeOptions {\n return {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\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\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 ...(agent.defaultMaxTurns === undefined ? {} : { defaultMaxTurns: agent.defaultMaxTurns }),\n staticContextCount: agent.staticContext.length,\n dynamicContextCount: agent.dynamicContexts.length,\n dynamicToolCount: agent.dynamicTools.length,\n hasOutputSchema: agent.outputSchema !== 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 stores = resolveStores(options);\n const agents = normalizeAgents(options.agents).map((agent) =>\n withStudioTraceObserver(agent, stores.traces),\n );\n const agentMap = new Map(agents.map((agent) => [agent.id, agent]));\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, 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 registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerKnowledgeRoutes(app, {\n agents,\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n });\n\n app.post(\"/agents/:agentId/runs\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const body = await parseRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n if (body.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\n const runId = globalThis.crypto.randomUUID();\n const request = agent.agent.prompt(body.message);\n if (session !== undefined) {\n request.withHistory(session.messages);\n } else if (body.history !== undefined) {\n request.withHistory(body.history);\n }\n if (body.maxTurns !== undefined) {\n request.maxTurns(body.maxTurns);\n }\n if (body.toolConcurrency !== undefined) {\n request.withToolConcurrency(body.toolConcurrency);\n }\n if (body.trace !== undefined) {\n request.withTrace(traceForRun(body.trace, agentId, session));\n } else if (session !== undefined) {\n request.withTrace(traceForRun(undefined, agentId, session));\n }\n\n if (body.stream === true) {\n const runtimeEvents = new AsyncEventQueue<AgentRunStreamEvent>();\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n emit: (event) => runtimeEvents.push(event),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const runStream = mergeRunAndApprovalEvents(request.stream(), runtimeEvents);\n const stream =\n session === undefined || stores.sessions === undefined\n ? runStream\n : persistStreamingSessionRun({\n stream: runStream,\n store: stores.sessions,\n session,\n message: body.message,\n });\n return streamAgentRunEvents(c, stream);\n }\n\n try {\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const response = await request.send();\n if (session !== undefined && stores.sessions !== undefined) {\n await stores.sessions.appendSessionRun({\n id: session.id,\n ...optionalTitle(body.message),\n messages: response.messages,\n transcript: transcriptFromMessages(response.messages),\n });\n }\n return c.json(response);\n } catch (error) {\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n });\n\n if (stores.sessions !== undefined) {\n registerSessionRoutes(app, {\n agentMap,\n sessionStore: stores.sessions,\n ...(stores.traces === undefined ? {} : { 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, stores);\n },\n close() {},\n ...(stores.sessions === undefined ? {} : { sessionStore: stores.sessions }),\n ...(stores.traces === undefined ? {} : { 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: new Agent({\n id: studioAgent.agent.id,\n name: studioAgent.agent.name,\n description: studioAgent.agent.description,\n model: studioAgent.agent.model,\n instructions: studioAgent.agent.instructions,\n staticContext: studioAgent.agent.staticContext,\n temperature: studioAgent.agent.temperature,\n maxTokens: studioAgent.agent.maxTokens,\n additionalParams: studioAgent.agent.additionalParams,\n toolSet: studioAgent.agent.toolSet,\n toolChoice: studioAgent.agent.toolChoice,\n defaultMaxTurns: studioAgent.agent.defaultMaxTurns,\n hook: studioAgent.agent.hook,\n outputSchema: studioAgent.agent.outputSchema,\n observers: [\n ...studioAgent.agent.observers,\n { observer: new StudioTraceObserver({ store: traceStore }) },\n ],\n dynamicContexts: studioAgent.agent.dynamicContexts,\n dynamicTools: studioAgent.agent.dynamicTools,\n }),\n };\n}\n\nfunction hasStudioTraceObserver(agent: Agent): boolean {\n return agent.observers.some(\n (registration) => registration.observer instanceof StudioTraceObserver,\n );\n}\n\nfunction 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 (firstAction?.type === \"skip\" || firstAction?.type === \"terminate\") {\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 {\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 JsonObject,\n JsonValue,\n} from \"@anvia/core\";\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: {\n model: args.request.model ?? \"default\",\n toolCount: args.request.tools.length,\n ...(endArgs.firstDeltaMs === undefined ? {} : { firstDeltaMs: endArgs.firstDeltaMs }),\n },\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: {\n model: args.request.model ?? \"default\",\n toolCount: args.request.tools.length,\n },\n }),\n );\n },\n };\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const startedAt = new Date();\n return {\n end: (endArgs: AgentToolEndArgs) => {\n this.observations.push(\n 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),\n }),\n );\n },\n error: (errorArgs: AgentToolErrorArgs) => {\n this.observations.push(\n 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 );\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 ...(this.props.args.trace?.name === undefined ? {} : { 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 ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.usage === undefined ? {} : { usage: result.usage }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n\n await store.saveTrace(trace);\n }\n}\n\nfunction traceObservation(props: {\n kind: StudioTraceObservation[\"kind\"];\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: Date;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n}): StudioTraceObservation {\n const endedAt = new Date();\n return {\n id: globalThis.crypto.randomUUID(),\n kind: props.kind,\n name: props.name,\n status: props.status,\n turn: props.turn,\n startedAt: props.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: durationMs(props.startedAt, endedAt),\n ...(props.input === undefined ? {} : { input: props.input }),\n ...(props.output === undefined ? {} : { output: props.output }),\n ...(props.error === undefined ? {} : { error: props.error }),\n ...(props.metadata === undefined ? {} : { 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 toolMetadata(args: AgentToolStartArgs, skipped: boolean): JsonObject {\n return compactJsonObject({\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n });\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValue(value)]],\n );\n return Object.fromEntries(entries) as JsonObject;\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 serializeError(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\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (typeof value === \"object\") {\n return compactJsonObject(value as Record<string, unknown>);\n }\n return String(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Hono } 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: options.path,\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n const renderRootShell = () =>\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 app.get(options.path, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/:traceId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/sessions/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/*`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/sessions`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/agents`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/knowledge`, async (c) => c.html(await renderShell()));\n\n if (options.rootRoutes) {\n app.get(\"/playground\", async (c) => c.html(await renderRootShell()));\n app.get(\"/playground/:sessionId\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing/:traceId\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing/sessions/:sessionId\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing/*\", async (c) => c.html(await renderRootShell()));\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\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\")??localStorage.getItem(\"aion-studio-theme\"))===\"light\"){document.documentElement.classList.remove(\"dark\")}}catch{}})();</script>',\n `<link rel=\"icon\" type=\"image/png\" href=\"${escapeHtml(props.compatUiPath)}/assets/logo.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>\",\n `<img src=\"${escapeHtml(props.compatUiPath)}/assets/logo.png\" alt=\"\" width=\"32\" height=\"32\">`,\n '<p class=\"eyebrow\">Anvia</p>',\n `<h1>${title}</h1>`,\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 options.rootRoutes ? \"/playground\" : options.path;\n}\n\nasync function readBundledUiIndex(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/index.html\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/index.html\", import.meta.url)),\n \"utf8\",\n );\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n return readFile(fileURLToPath(new URL(\"./app/index.html\", import.meta.url)), \"utf8\");\n }\n}\n\nasync function readBundledUiAsset(asset: string): Promise<Uint8Array | undefined> {\n try {\n return await readFile(fileURLToPath(new URL(`./assets/${asset}`, import.meta.url)));\n } catch (sourceError) {\n if (!isNotFoundError(sourceError)) {\n throw sourceError;\n }\n }\n try {\n return await readFile(fileURLToPath(new URL(`./ui/assets/${asset}`, import.meta.url)));\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(`../../dist/ui/assets/${asset}`, import.meta.url)),\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return undefined;\n }\n }\n}\n\nasync function readBundledLegacyStylesheet(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/styles.css\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/styles.css\", import.meta.url)),\n \"utf8\",\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return \"\";\n }\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction contentTypeForAsset(asset: string): string {\n if (asset.endsWith(\".js\")) {\n return \"text/javascript; charset=utf-8\";\n }\n if (asset.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (asset.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (asset.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (asset.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n return \"application/octet-stream\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n","import type {\n AnyTool,\n JsonObject,\n PromptHook,\n ToolApprovalContext,\n ToolApprovalPolicy,\n} from \"@anvia/core\";\nimport { createHook, parseToolArgs } from \"@anvia/core\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolApproval,\n StudioToolApprovalDecision,\n StudioToolApprovalStatus,\n} from \"../types\";\nimport { errorResponse, isObject, optionalQueryString } from \"./shared\";\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 getTool(toolName: string): AnyTool | undefined;\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 createHook(context: ApprovalHookContext): PromptHook;\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 {\n approved: body.approved,\n ...(typeof body.reason === \"string\" && body.reason.trim().length > 0\n ? { reason: body.reason.trim() }\n : {}),\n };\n}\n\nexport function createApprovalRuntime(): ApprovalRuntime {\n const approvals = new Map<string, PendingApproval | StudioToolApproval>();\n\n return {\n approvals,\n createHook(context) {\n return createHook({\n async onToolCall({ toolName, toolCallId, internalCallId, args, tool: control }) {\n const registeredTool = context.getTool(toolName);\n if (registeredTool?.approval === undefined) {\n return control.run();\n }\n const approval = registeredTool.approval as ToolApprovalPolicy<unknown>;\n\n const rawParsedArgs = parseToolArgs(args);\n const parsedArgs = registeredTool.parseApprovalArgs?.(rawParsedArgs) ?? rawParsedArgs;\n const approvalContext = {\n toolName,\n args: parsedArgs,\n rawArgs: args,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n run: {\n agentId: context.agentId,\n runId: context.runId,\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n ...(context.metadata === undefined ? {} : { metadata: context.metadata }),\n },\n };\n\n const required = await approval.when(approvalContext);\n if (!required) {\n return control.run();\n }\n\n const reason = await resolveApprovalText(approval.reason, approvalContext);\n const rejectMessage = await resolveApprovalText(approval.rejectMessage, approvalContext);\n const decision = await requestApproval(approvals, context, {\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n args,\n ...(reason === undefined ? {} : { reason }),\n ...(rejectMessage === undefined ? {} : { rejectMessage }),\n });\n\n return decision.approved\n ? control.run()\n : control.skip(decision.reason ?? rejectMessage ?? \"Rejected in Anvia Studio.\");\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(approval, decision.approved ? \"approved\" : \"rejected\", {\n ...(reason === undefined ? {} : { reason }),\n });\n approvals.set(id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve({\n approved: decision.approved,\n ...(reason === undefined ? {} : { reason }),\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 id,\n runId: context.runId,\n agentId: context.agentId,\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n toolName: request.toolName,\n ...(request.toolCallId === undefined ? {} : { callId: request.toolCallId }),\n internalCallId: request.internalCallId,\n args: request.args,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n ...(request.reason === undefined ? {} : { reason: request.reason }),\n ...(request.rejectMessage === undefined ? {} : { rejectMessage: request.rejectMessage }),\n ...(context.emit === undefined ? {} : { emit: context.emit }),\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 approved: current.status === \"approved\",\n ...(current.reason === undefined ? {} : { reason: current.reason }),\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(current, decision.approved ? \"approved\" : \"rejected\", {\n ...(reason === undefined ? {} : { reason }),\n });\n approvals.set(id, resolved);\n context.emit?.({ type: \"tool_approval_result\", approval: resolved });\n resolve({\n approved: decision.approved,\n ...(reason === undefined ? {} : { reason }),\n });\n };\n });\n\n approvals.set(id, approval);\n context.emit?.({ type: \"tool_approval_request\", approval: publicApproval(approval) });\n return decision;\n}\n\nasync function resolveApprovalText<Args>(\n value: string | ((ctx: ToolApprovalContext<Args>) => string | Promise<string>) | undefined,\n context: ToolApprovalContext<Args>,\n): Promise<string | undefined> {\n return typeof value === \"function\" ? value(context) : value;\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 status,\n resolvedAt: new Date().toISOString(),\n ...(options.reason === undefined ? {} : { reason: options.reason }),\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 { join } from \"node:path\";\nimport type { AgentTraceOptions, JsonObject, JsonValue, Message } from \"@anvia/core\";\nimport type { Context } from \"hono\";\nimport { createSqliteSessionStore } from \"../storage/sqlite-store\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioErrorCode,\n StudioErrorResponse,\n StudioSessionStore,\n StudioStores,\n StudioTraceStatus,\n StudioTraceStore,\n StudioUiOptions,\n} from \"../types\";\n\nexport type ResolvedStores = {\n sessions?: StudioSessionStore;\n traces?: StudioTraceStore;\n};\n\nexport type StudioRuntimeOptions = {\n id?: string;\n name?: string;\n description?: string;\n version?: string;\n agents: StudioAgent[];\n stores?: StudioStores;\n ui?: boolean | StudioUiOptions;\n};\n\nexport function resolveStores(options: StudioRuntimeOptions): ResolvedStores {\n const defaultPath =\n process.env.ANVIA_STUDIO_DB ??\n process.env.AION_STUDIO_DB ??\n join(process.cwd(), \".anvia-studio\", `${safeFileName(runnerId(options))}.sqlite`);\n const defaultStore = createSqliteSessionStore({ path: defaultPath });\n const sessions = resolveSessionStore(options, defaultStore);\n const traces = resolveTraceStore(options, sessions, defaultStore);\n return {\n ...(sessions === undefined ? {} : { sessions }),\n ...(traces === undefined ? {} : { traces }),\n };\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 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\nexport function unsupportedCapabilities(stores: ResolvedStores): StudioCapability[] {\n return [\n ...(stores.sessions === undefined ? ([\"sessions\"] as const) : []),\n ...(stores.traces === undefined ? ([\"traces\"] as const) : []),\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 buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n stores: ResolvedStores,\n): StudioConfig {\n return {\n id: runnerId(options),\n ...(options.name === undefined ? {} : { name: options.name }),\n ...(options.description === undefined ? {} : { description: options.description }),\n ...(options.version === undefined ? {} : { version: options.version }),\n agents: agents.map(agentConfig),\n chat: {\n quickPrompts: Object.fromEntries(agents.map((agent) => [agent.id, agent.quickPrompts ?? []])),\n },\n capabilities: capabilityConfig(options, agents, stores),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n };\n}\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 {\n id: agent.id,\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n quickPrompts: agent.quickPrompts ?? [],\n ...(agent.metadata === undefined ? {} : { metadata: agent.metadata }),\n };\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n stores: ResolvedStores,\n): Partial<Record<StudioCapability, StudioCapabilityConfig>> {\n const capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>> = {\n agents: { enabled: true },\n };\n\n if (stores.sessions !== undefined) {\n capabilities.sessions = { enabled: true };\n }\n if (stores.traces !== undefined) {\n capabilities.traces = { enabled: true };\n }\n\n if (agents.some((agent) => agent.agent.observers.length > 0)) {\n capabilities.observability = { enabled: true };\n }\n if (agents.some((agent) => agent.agent.toolSet.values().some((tool) => tool.approval))) {\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 optionalQueryString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nexport function parseLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 50;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 100);\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\nexport function safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\") || \"anvia-studio\";\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 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 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\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\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\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\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 serializeError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack === undefined ? {} : { stack: error.stack }),\n };\n }\n\n return isJsonValue(error) ? error : String(error);\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, Message } from \"@anvia/core\";\nimport type {\n StudioSession,\n StudioSessionAppendInput,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\nconst { DatabaseSync } = createRequire(import.meta.url)(\n \"node:sqlite\",\n) as typeof import(\"node:sqlite\");\n\nexport type SqliteSessionStoreOptions = {\n path?: string;\n};\n\ntype SessionRow = {\n id: string;\n agent_id: string;\n title: string | null;\n metadata_json: string | null;\n messages_json: string;\n transcript_json: string;\n created_at: string;\n updated_at: 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\nexport function createSqliteSessionStore(\n options: SqliteSessionStoreOptions = {},\n): StudioSessionStore & StudioTraceStore {\n return new SqliteSessionStore(options.path ?? \":memory:\");\n}\n\nclass SqliteSessionStore implements StudioSessionStore, StudioTraceStore {\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 agent_id = $agentId\";\n const rows = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, messages_json, transcript_json, created_at, updated_at\n FROM runner_sessions\n ${agentClause}\n ORDER BY updated_at DESC\n LIMIT $limit`,\n )\n .all({\n $agentId: options.agentId ?? null,\n $limit: options.limit,\n }) as SessionRow[];\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 runner_sessions (\n id,\n agent_id,\n title,\n metadata_json,\n messages_json,\n transcript_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 ...(input.title === undefined ? {} : { title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n }\n\n getSession(id: string): StudioSession | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, messages_json, transcript_json, created_at, updated_at\n FROM runner_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as SessionRow | undefined;\n\n return row === undefined ? undefined : toSession(row);\n }\n\n appendSessionRun(input: StudioSessionAppendInput): StudioSession | undefined {\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, messages_json, transcript_json, created_at, updated_at\n FROM runner_sessions\n WHERE id = $id`,\n )\n .get({ $id: input.id }) as SessionRow | undefined;\n\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return undefined;\n }\n\n const current = toSession(row);\n const messages = [...current.messages, ...input.messages];\n const transcript = renumberTranscript([...current.transcript, ...input.transcript]);\n const title = current.title ?? input.title;\n const updatedAt = new Date().toISOString();\n\n db.prepare(\n `UPDATE runner_sessions\n SET title = $title,\n messages_json = $messages,\n transcript_json = $transcript,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.id,\n $title: title ?? null,\n $messages: JSON.stringify(messages),\n $transcript: JSON.stringify(transcript),\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n\n return {\n ...current,\n ...(title === undefined ? {} : { title }),\n updatedAt,\n messageCount: messages.length,\n messages,\n transcript,\n };\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\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 runner_traces WHERE session_id = $id\").run({ $id: id });\n const result = db.prepare(\"DELETE FROM runner_sessions WHERE id = $id\").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 runner_traces t\n LEFT JOIN runner_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 runner_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 runner_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 runner_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 DatabaseSync(this.path, {\n allowUnknownNamedParameters: true,\n timeout: 5000,\n });\n db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n CREATE TABLE IF NOT EXISTS runner_sessions (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n title TEXT,\n metadata_json TEXT,\n messages_json TEXT NOT NULL,\n transcript_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n ) STRICT;\n CREATE INDEX IF NOT EXISTS runner_sessions_agent_updated_idx\n ON runner_sessions(agent_id, updated_at DESC);\n CREATE TABLE IF NOT EXISTS runner_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 runner_traces_session_started_idx\n ON runner_traces(session_id, started_at DESC);\n `);\n\n this.db = db;\n return db;\n }\n}\n\nfunction toSession(row: SessionRow): StudioSession {\n const summary = toSessionSummary(row);\n return {\n ...summary,\n messages: parseJsonArray<Message>(row.messages_json),\n transcript: renumberTranscript(parseJsonArray<StudioTranscriptEntry>(row.transcript_json)),\n };\n}\n\nfunction toSessionSummary(row: SessionRow): StudioSessionSummary {\n const messages = parseJsonArray<Message>(row.messages_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n agentId: row.agent_id,\n ...(row.title === null ? {} : { title: row.title }),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: messages.length,\n ...(metadata === undefined ? {} : { metadata }),\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 ...(trace === undefined ? {} : { trace }),\n ...(input === undefined ? {} : { 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 ...(row.name === null ? {} : { name: row.name }),\n status: row.status,\n startedAt: row.started_at,\n ...(row.ended_at === null ? {} : { endedAt: row.ended_at }),\n ...(row.duration_ms === null ? {} : { durationMs: row.duration_ms }),\n ...(row.output === null ? {} : { output: row.output }),\n ...(error === undefined ? {} : { error }),\n ...(usage === undefined ? {} : { usage }),\n ...(metadata === undefined ? {} : { 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 renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core\";\n\nexport function toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (typeof value === \"object\") {\n return compactJsonObject(value as Record<string, unknown>);\n }\n return String(value);\n}\n\nexport function compactJsonObject(values: Record<string, unknown>): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValue(value)]],\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","import type { JsonObject, JsonValue } from \"@anvia/core\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentKnowledgeConfig,\n StudioKnowledgeEvidence,\n StudioKnowledgeEvidenceDocument,\n StudioKnowledgeSummary,\n StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { compactJsonObject } from \"./json\";\nimport { errorResponse, parseLimit } from \"./shared\";\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: props.agents.map(agentKnowledgeConfig),\n evidence: await recentKnowledgeEvidence(props.traceStore, limit),\n };\n return c.json(summary);\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\nfunction agentKnowledgeConfig(agent: StudioAgent): StudioAgentKnowledgeConfig {\n const agentName = agent.name ?? agent.agent.name;\n return {\n agentId: agent.id,\n ...(agentName === undefined ? {} : { agentName }),\n sources: [\n { kind: \"static_context\", count: agent.agent.staticContext.length },\n { kind: \"dynamic_context\", count: agent.agent.dynamicContexts.length },\n { kind: \"dynamic_tools\", count: agent.agent.dynamicTools.length },\n ],\n staticContext: agent.agent.staticContext.map((document) => ({\n id: document.id,\n text: document.text,\n ...(document.additionalProps === undefined\n ? {}\n : { additionalProps: jsonObjectFromRecord(document.additionalProps) }),\n })),\n };\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 ...(query === undefined ? {} : { 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 [\n {\n ...(id === undefined ? {} : { id }),\n ...(text === undefined ? {} : { text }),\n ...(additionalProps === undefined ? {} : { additionalProps }),\n },\n ];\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 { JsonObject, JsonValue, PromptHook } from \"@anvia/core\";\nimport { createHook, parseToolArgs } from \"@anvia/core\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolQuestion,\n StudioToolQuestionAnswer,\n StudioToolQuestionChoice,\n StudioToolQuestionPrompt,\n StudioToolQuestionStatus,\n} from \"../types\";\nimport { errorResponse, isObject, optionalQueryString } from \"./shared\";\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 questionId: answer.questionId.trim(),\n answer: answer.answer.trim(),\n ...(typeof answer.choice === \"string\" ? { choice: answer.choice } : {}),\n ...(typeof answer.custom === \"boolean\" ? { custom: answer.custom } : {}),\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(questions, context, {\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n args,\n questions: prompts.questions,\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 id,\n runId: context.runId,\n agentId: context.agentId,\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n toolName: request.toolName,\n ...(request.toolCallId === undefined ? {} : { callId: request.toolCallId }),\n internalCallId: request.internalCallId,\n args: request.args,\n questions: request.questions,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n ...(context.emit === undefined ? {} : { emit: context.emit }),\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 { AgentStreamEvent, AgentTraceOptions, Message } from \"@anvia/core\";\nimport type { Context } from \"hono\";\nimport { stream as streamResponse } from \"hono/streaming\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionStore,\n StudioTranscriptEntry,\n} from \"../types\";\nimport {\n errorResponse,\n isAgentTraceOptions,\n isJsonObject,\n isMessage,\n isMessageInput,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n serializeError,\n} from \"./shared\";\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 c.header(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n c.header(\"cache-control\", \"no-cache, no-transform\");\n c.header(\"connection\", \"keep-alive\");\n c.header(\"transfer-encoding\", \"chunked\");\n c.header(\"x-accel-buffering\", \"no\");\n\n return streamResponse(\n c,\n async (stream) => {\n for await (const event of events) {\n await stream.write(`${JSON.stringify(event)}\\n`);\n }\n },\n async (error, stream) => {\n await stream.write(`${JSON.stringify({ type: \"error\", error: serializeError(error) })}\\n`);\n },\n );\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* persistStreamingSessionRun(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n}): AsyncIterable<AgentRunStreamEvent> {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n\n for await (const event of props.stream) {\n acceptTranscriptStreamEvent(transcript, event);\n\n if (event.type === \"final\") {\n const nextSession = await props.store.appendSessionRun({\n id: props.session.id,\n ...optionalTitle(props.message),\n messages: event.messages,\n transcript,\n });\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\n }\n\n yield event;\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 entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n ...(event.toolCallId === undefined ? {} : { callId: event.toolCallId }),\n args: event.args,\n result: event.result,\n });\n return;\n }\n matched.args = matched.args ?? event.args;\n matched.result = event.result;\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 = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n ...(event.approval.resolvedAt === undefined\n ? {}\n : { resolvedAt: event.approval.resolvedAt }),\n ...(event.approval.reason === undefined ? {} : { reason: event.approval.reason }),\n };\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 = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n ...(event.question.answeredAt === undefined\n ? {}\n : { answeredAt: event.question.answeredAt }),\n questions: event.question.questions,\n ...(event.question.answers === undefined ? {} : { answers: event.question.answers }),\n };\n }\n }\n if (event.type === \"final\" && event.trace?.traceId !== undefined) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\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\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 for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\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) => (\"text\" in item ? item.text : \"[image]\"))\n .join(\"\\n\"),\n });\n }\n continue;\n }\n\n for (const content of message.content) {\n if (content.type === \"text\") {\n appendTranscriptAssistantText(transcript, content.text);\n } else if (content.type === \"reasoning\") {\n appendTranscriptReasoningText(transcript, content.text, content.id);\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 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 };\n}\n\nfunction appendTranscriptAssistantText(transcript: StudioTranscriptEntry[], delta: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\") {\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 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 entryId: transcript.length,\n kind: \"reasoning\",\n ...(reasoningId === undefined ? {} : { reasoningId }),\n text: delta,\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) => (\"text\" in result ? result.text : \"[image]\"));\n }\n return [];\n })\n .join(\"\\n\");\n}\n\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport async function parseRunRequest(c: Context): Promise<AgentRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n if (!(\"message\" in body) || !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 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 (\"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 } from \"@anvia/core\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport {\n errorResponse,\n isJsonObject,\n isObject,\n optionalQueryString,\n parseLimit,\n unsupportedCapability,\n} from \"./shared\";\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 ...(agentId === undefined ? {} : { 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 ...(body.title === undefined ? {} : { title: body.title }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n });\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.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 { Hono } from \"hono\";\nimport type { StudioTraceStore } from \"../types\";\nimport { errorResponse, optionalQueryString, parseLimit, parseTraceStatus } from \"./shared\";\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 ...(agentId === undefined ? {} : { agentId }),\n ...(sessionId === undefined ? {} : { sessionId }),\n ...(status === undefined ? {} : { status }),\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"],"mappings":"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","names":["createHook","serializeError","resolve","decision","toJsonValue","compactJsonObject","compactJsonObject","createHook","parseToolArgs","createHook","parseToolArgs","resolve","resolve","serializeError","serializeError","createHook"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/studio.ts","../src/traces/trace-observer.ts","../src/ui/routes.tsx","../src/runtime/approvals.ts","../src/runtime/shared.ts","../src/storage/sqlite-store.ts","../src/runtime/json.ts","../src/runtime/knowledge.ts","../src/runtime/questions.ts","../src/runtime/runs.ts","../src/runtime/sessions.ts","../src/runtime/trace-routes.ts"],"sourcesContent":["import {\n Agent,\n type Message as CoreMessage,\n createHook,\n type HookAction,\n type JsonObject,\n Message,\n type PromptHook,\n resolveMemoryOptions,\n type ToolCallHookAction,\n} from \"@anvia/core\";\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 AgentRunStreamEvent,\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioServeOptions,\n StudioSessionStore,\n StudioTraceStore,\n} from \"../types\";\nimport {\n isStudioUiEnabled,\n registerStudioUi,\n resolveStudioUiOptions,\n studioUiEntryPath,\n} from \"../ui/routes\";\nimport { createApprovalRuntime, registerApprovalRoutes } from \"./approvals\";\nimport { registerKnowledgeRoutes } from \"./knowledge\";\nimport { createQuestionRuntime, registerQuestionRoutes } from \"./questions\";\nimport {\n AsyncEventQueue,\n mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n persistStreamingSessionTranscript,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport {\n agentConfig,\n buildConfig,\n errorResponse,\n normalizeAgents,\n resolveStores,\n runnerId,\n type StudioRuntimeOptions,\n serializeError,\n unsupportedCapabilities,\n unsupportedCapability,\n} from \"./shared\";\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(agents: Agent[] = [], options: StudioOptions = {}) {\n this.options = studioOptionsFromAgents(agents, 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 ...(serveOptions.hostname === undefined ? {} : { 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 studioOptionsFromAgents(agents: Agent[], options: StudioOptions): StudioRuntimeOptions {\n return {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\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\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 ...(agent.defaultMaxTurns === undefined ? {} : { defaultMaxTurns: agent.defaultMaxTurns }),\n staticContextCount: agent.staticContext.length,\n dynamicContextCount: agent.dynamicContexts.length,\n dynamicToolCount: agent.dynamicTools.length,\n hasOutputSchema: agent.outputSchema !== 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 stores = resolveStores(options);\n const agents = normalizeAgents(options.agents)\n .map((agent) => withStudioSessionMemory(agent, stores.sessions))\n .map((agent) => withStudioTraceObserver(agent, stores.traces));\n const agentMap = new Map(agents.map((agent) => [agent.id, agent]));\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, 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 registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerKnowledgeRoutes(app, {\n agents,\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n });\n\n app.post(\"/agents/:agentId/runs\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const body = await parseRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n if (body.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\n const runId = globalThis.crypto.randomUUID();\n const memoryMetadata = {\n agentId,\n ...(body.metadata ?? {}),\n studioRunId: runId,\n };\n const request =\n session !== undefined\n ? agent.agent.session(session.id, { metadata: memoryMetadata }).prompt(body.message)\n : agent.agent.prompt(\n body.history !== undefined\n ? [...body.history, normalizePromptMessage(body.message)]\n : body.message,\n );\n if (body.maxTurns !== undefined) {\n request.maxTurns(body.maxTurns);\n }\n if (body.toolConcurrency !== undefined) {\n request.withToolConcurrency(body.toolConcurrency);\n }\n if (body.trace !== undefined) {\n request.withTrace(traceForRun(body.trace, agentId, session));\n } else if (session !== undefined) {\n request.withTrace(traceForRun(undefined, agentId, session));\n }\n\n if (body.stream === true) {\n const runtimeEvents = new AsyncEventQueue<AgentRunStreamEvent>();\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n emit: (event) => runtimeEvents.push(event),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const runStream = mergeRunAndApprovalEvents(request.stream(), runtimeEvents);\n const stream =\n session === undefined || stores.sessions === undefined\n ? runStream\n : persistStreamingSessionTranscript({\n stream: runStream,\n store: stores.sessions,\n session,\n message: body.message,\n runId,\n });\n return streamAgentRunEvents(c, stream);\n }\n\n try {\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const response = await request.send();\n if (session !== undefined && stores.sessions !== undefined) {\n await stores.sessions.saveSessionRunTranscript({\n id: session.id,\n runId,\n ...optionalTitle(body.message),\n transcript: transcriptFromMessages(response.messages),\n status: \"success\",\n });\n }\n return c.json(response);\n } catch (error) {\n if (session !== undefined && stores.sessions !== undefined) {\n const messages = await stores.sessions.load({\n sessionId: session.id,\n metadata: memoryMetadata,\n });\n await stores.sessions.saveSessionRunTranscript({\n id: session.id,\n runId,\n ...optionalTitle(body.message),\n transcript: transcriptFromMessages(messages.slice(session.messageCount)),\n status: \"error\",\n error: serializeError(error),\n });\n }\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n });\n\n if (stores.sessions !== undefined) {\n registerSessionRoutes(app, {\n agentMap,\n sessionStore: stores.sessions,\n ...(stores.traces === undefined ? {} : { 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, stores);\n },\n close() {},\n ...(stores.sessions === undefined ? {} : { sessionStore: stores.sessions }),\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n };\n}\n\nfunction normalizePromptMessage(message: string | CoreMessage): CoreMessage {\n return typeof message === \"string\" ? Message.user(message) : message;\n}\n\nfunction withStudioSessionMemory(\n studioAgent: StudioAgent,\n sessionStore: StudioSessionStore | undefined,\n): StudioAgent {\n if (sessionStore === undefined) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n memory: {\n store: sessionStore,\n options: resolveMemoryOptions({ savePolicy: \"message\" }),\n },\n }),\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 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 dynamicContexts: agent.dynamicContexts,\n dynamicTools: agent.dynamicTools,\n memory: agent.memory,\n ...overrides,\n });\n}\n\nfunction hasStudioTraceObserver(agent: Agent): boolean {\n return agent.observers.some(\n (registration) => registration.observer instanceof StudioTraceObserver,\n );\n}\n\nfunction 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 (firstAction?.type === \"skip\" || firstAction?.type === \"terminate\") {\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 {\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 JsonObject,\n JsonValue,\n} from \"@anvia/core\";\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: {\n model: args.request.model ?? \"default\",\n toolCount: args.request.tools.length,\n ...(endArgs.firstDeltaMs === undefined ? {} : { firstDeltaMs: endArgs.firstDeltaMs }),\n },\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: {\n model: args.request.model ?? \"default\",\n toolCount: args.request.tools.length,\n },\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),\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 ...(this.props.args.trace?.name === undefined ? {} : { 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 ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.usage === undefined ? {} : { 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 ...(agentName === undefined ? {} : { 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 ...(agentName === undefined ? {} : { 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 ...(start?.input === undefined ? {} : { 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 ...(agentName === undefined ? {} : { agentName }),\n childTurn,\n toolName,\n ...(callId === undefined ? {} : { 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 ...(input === undefined ? {} : { input }),\n ...(typeof child.result === \"string\" ? { output: parseOrString(child.result) } : {}),\n metadata: {\n ...this.childMetadata(agentId, agentName, childTurn),\n ...(toolCallId === undefined ? {} : { toolCallId }),\n ...(internalCallId === undefined ? {} : { 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 ...(props.input === undefined ? {} : { input: props.input }),\n ...(props.output === undefined ? {} : { output: props.output }),\n ...(props.error === undefined ? {} : { error: props.error }),\n ...(props.metadata === undefined ? {} : { 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 toolMetadata(args: AgentToolStartArgs, skipped: boolean): JsonObject {\n return compactJsonObject({\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n });\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValue(value)]],\n );\n return Object.fromEntries(entries) as JsonObject;\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\nfunction serializeError(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\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (typeof value === \"object\") {\n return compactJsonObject(value as Record<string, unknown>);\n }\n return String(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Hono } 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: options.path,\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n const renderRootShell = () =>\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 app.get(options.path, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/:traceId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/sessions/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/*`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/sessions`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/agents`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/knowledge`, async (c) => c.html(await renderShell()));\n\n if (options.rootRoutes) {\n app.get(\"/playground\", async (c) => c.html(await renderRootShell()));\n app.get(\"/playground/:sessionId\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing/:traceId\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing/sessions/:sessionId\", async (c) => c.html(await renderRootShell()));\n app.get(\"/tracing/*\", async (c) => c.html(await renderRootShell()));\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\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\")??localStorage.getItem(\"aion-studio-theme\"))===\"light\"){document.documentElement.classList.remove(\"dark\")}}catch{}})();</script>',\n `<link rel=\"icon\" type=\"image/png\" href=\"${escapeHtml(props.compatUiPath)}/assets/logo.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>\",\n `<img src=\"${escapeHtml(props.compatUiPath)}/assets/logo.png\" alt=\"\" width=\"32\" height=\"32\">`,\n '<p class=\"eyebrow\">Anvia</p>',\n `<h1>${title}</h1>`,\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 options.rootRoutes ? \"/playground\" : options.path;\n}\n\nasync function readBundledUiIndex(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/index.html\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/index.html\", import.meta.url)),\n \"utf8\",\n );\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n return readFile(fileURLToPath(new URL(\"./app/index.html\", import.meta.url)), \"utf8\");\n }\n}\n\nasync function readBundledUiAsset(asset: string): Promise<Uint8Array | undefined> {\n try {\n return await readFile(fileURLToPath(new URL(`./assets/${asset}`, import.meta.url)));\n } catch (sourceError) {\n if (!isNotFoundError(sourceError)) {\n throw sourceError;\n }\n }\n try {\n return await readFile(fileURLToPath(new URL(`./ui/assets/${asset}`, import.meta.url)));\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(`../../dist/ui/assets/${asset}`, import.meta.url)),\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return undefined;\n }\n }\n}\n\nasync function readBundledLegacyStylesheet(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/styles.css\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/styles.css\", import.meta.url)),\n \"utf8\",\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return \"\";\n }\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction contentTypeForAsset(asset: string): string {\n if (asset.endsWith(\".js\")) {\n return \"text/javascript; charset=utf-8\";\n }\n if (asset.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (asset.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (asset.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (asset.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n return \"application/octet-stream\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n","import type {\n AnyTool,\n JsonObject,\n PromptHook,\n ToolApprovalContext,\n ToolApprovalPolicy,\n} from \"@anvia/core\";\nimport { createHook, parseToolArgs } from \"@anvia/core\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolApproval,\n StudioToolApprovalDecision,\n StudioToolApprovalStatus,\n} from \"../types\";\nimport { errorResponse, isObject, optionalQueryString } from \"./shared\";\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 getTool(toolName: string): AnyTool | undefined;\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 createHook(context: ApprovalHookContext): PromptHook;\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 {\n approved: body.approved,\n ...(typeof body.reason === \"string\" && body.reason.trim().length > 0\n ? { reason: body.reason.trim() }\n : {}),\n };\n}\n\nexport function createApprovalRuntime(): ApprovalRuntime {\n const approvals = new Map<string, PendingApproval | StudioToolApproval>();\n\n return {\n approvals,\n createHook(context) {\n return createHook({\n async onToolCall({ toolName, toolCallId, internalCallId, args, tool: control }) {\n const registeredTool = context.getTool(toolName);\n if (registeredTool?.approval === undefined) {\n return control.run();\n }\n const approval = registeredTool.approval as ToolApprovalPolicy<unknown>;\n\n const rawParsedArgs = parseToolArgs(args);\n const parsedArgs = registeredTool.parseApprovalArgs?.(rawParsedArgs) ?? rawParsedArgs;\n const approvalContext = {\n toolName,\n args: parsedArgs,\n rawArgs: args,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n run: {\n agentId: context.agentId,\n runId: context.runId,\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n ...(context.metadata === undefined ? {} : { metadata: context.metadata }),\n },\n };\n\n const required = await approval.when(approvalContext);\n if (!required) {\n return control.run();\n }\n\n const reason = await resolveApprovalText(approval.reason, approvalContext);\n const rejectMessage = await resolveApprovalText(approval.rejectMessage, approvalContext);\n const decision = await requestApproval(approvals, context, {\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n args,\n ...(reason === undefined ? {} : { reason }),\n ...(rejectMessage === undefined ? {} : { rejectMessage }),\n });\n\n return decision.approved\n ? control.run()\n : control.skip(decision.reason ?? rejectMessage ?? \"Rejected in Anvia Studio.\");\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(approval, decision.approved ? \"approved\" : \"rejected\", {\n ...(reason === undefined ? {} : { reason }),\n });\n approvals.set(id, resolved);\n approval.emit?.({ type: \"tool_approval_result\", approval: resolved });\n approval.resolve({\n approved: decision.approved,\n ...(reason === undefined ? {} : { reason }),\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 id,\n runId: context.runId,\n agentId: context.agentId,\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n toolName: request.toolName,\n ...(request.toolCallId === undefined ? {} : { callId: request.toolCallId }),\n internalCallId: request.internalCallId,\n args: request.args,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n ...(request.reason === undefined ? {} : { reason: request.reason }),\n ...(request.rejectMessage === undefined ? {} : { rejectMessage: request.rejectMessage }),\n ...(context.emit === undefined ? {} : { emit: context.emit }),\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 approved: current.status === \"approved\",\n ...(current.reason === undefined ? {} : { reason: current.reason }),\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(current, decision.approved ? \"approved\" : \"rejected\", {\n ...(reason === undefined ? {} : { reason }),\n });\n approvals.set(id, resolved);\n context.emit?.({ type: \"tool_approval_result\", approval: resolved });\n resolve({\n approved: decision.approved,\n ...(reason === undefined ? {} : { reason }),\n });\n };\n });\n\n approvals.set(id, approval);\n context.emit?.({ type: \"tool_approval_request\", approval: publicApproval(approval) });\n return decision;\n}\n\nasync function resolveApprovalText<Args>(\n value: string | ((ctx: ToolApprovalContext<Args>) => string | Promise<string>) | undefined,\n context: ToolApprovalContext<Args>,\n): Promise<string | undefined> {\n return typeof value === \"function\" ? value(context) : value;\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 status,\n resolvedAt: new Date().toISOString(),\n ...(options.reason === undefined ? {} : { reason: options.reason }),\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 { join } from \"node:path\";\nimport type { AgentTraceOptions, JsonObject, JsonValue, Message } from \"@anvia/core\";\nimport type { Context } from \"hono\";\nimport { createSqliteSessionStore } from \"../storage/sqlite-store\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioErrorCode,\n StudioErrorResponse,\n StudioSessionStore,\n StudioStores,\n StudioTraceStatus,\n StudioTraceStore,\n StudioUiOptions,\n} from \"../types\";\n\nexport type ResolvedStores = {\n sessions?: StudioSessionStore;\n traces?: StudioTraceStore;\n};\n\nexport type StudioRuntimeOptions = {\n id?: string;\n name?: string;\n description?: string;\n version?: string;\n agents: StudioAgent[];\n stores?: StudioStores;\n ui?: boolean | StudioUiOptions;\n};\n\nexport function resolveStores(options: StudioRuntimeOptions): ResolvedStores {\n const defaultPath =\n process.env.ANVIA_STUDIO_DB ??\n process.env.AION_STUDIO_DB ??\n join(process.cwd(), \".anvia-studio\", `${safeFileName(runnerId(options))}.sqlite`);\n const defaultStore = createSqliteSessionStore({ path: defaultPath });\n const sessions = resolveSessionStore(options, defaultStore);\n const traces = resolveTraceStore(options, sessions, defaultStore);\n return {\n ...(sessions === undefined ? {} : { sessions }),\n ...(traces === undefined ? {} : { traces }),\n };\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 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\nexport function unsupportedCapabilities(stores: ResolvedStores): StudioCapability[] {\n return [\n ...(stores.sessions === undefined ? ([\"sessions\"] as const) : []),\n ...(stores.traces === undefined ? ([\"traces\"] as const) : []),\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 buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n stores: ResolvedStores,\n): StudioConfig {\n return {\n id: runnerId(options),\n ...(options.name === undefined ? {} : { name: options.name }),\n ...(options.description === undefined ? {} : { description: options.description }),\n ...(options.version === undefined ? {} : { version: options.version }),\n agents: agents.map(agentConfig),\n chat: {\n quickPrompts: Object.fromEntries(agents.map((agent) => [agent.id, agent.quickPrompts ?? []])),\n },\n capabilities: capabilityConfig(options, agents, stores),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n };\n}\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 {\n id: agent.id,\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n quickPrompts: agent.quickPrompts ?? [],\n ...(agent.metadata === undefined ? {} : { metadata: agent.metadata }),\n };\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n stores: ResolvedStores,\n): Partial<Record<StudioCapability, StudioCapabilityConfig>> {\n const capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>> = {\n agents: { enabled: true },\n };\n\n if (stores.sessions !== undefined) {\n capabilities.sessions = { enabled: true };\n }\n if (stores.traces !== undefined) {\n capabilities.traces = { enabled: true };\n }\n\n if (agents.some((agent) => agent.agent.observers.length > 0)) {\n capabilities.observability = { enabled: true };\n }\n if (agents.some((agent) => agent.agent.toolSet.values().some((tool) => tool.approval))) {\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 optionalQueryString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nexport function parseLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 50;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 100);\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\nexport function safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\") || \"anvia-studio\";\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 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 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\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\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\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\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 serializeError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack === undefined ? {} : { stack: error.stack }),\n };\n }\n\n return isJsonValue(error) ? error : String(error);\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 {\n JsonObject,\n JsonValue,\n MemoryAppendInput,\n MemoryContext,\n MemoryErrorInput,\n Message,\n} from \"@anvia/core\";\nimport type {\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionRunStatus,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\nconst { DatabaseSync } = createRequire(import.meta.url)(\n \"node:sqlite\",\n) as typeof import(\"node:sqlite\");\n\nexport type SqliteSessionStoreOptions = {\n path?: string;\n};\n\ntype SessionRow = {\n id: string;\n agent_id: string;\n title: string | null;\n metadata_json: string | null;\n messages_json: string;\n transcript_json: string;\n created_at: string;\n updated_at: 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\nexport function createSqliteSessionStore(\n options: SqliteSessionStoreOptions = {},\n): StudioSessionStore & StudioTraceStore {\n return new SqliteSessionStore(options.path ?? \":memory:\");\n}\n\nclass SqliteSessionStore implements StudioSessionStore, StudioTraceStore {\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 agent_id = $agentId\";\n const rows = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, messages_json, transcript_json, created_at, updated_at\n FROM runner_sessions\n ${agentClause}\n ORDER BY updated_at DESC\n LIMIT $limit`,\n )\n .all({\n $agentId: options.agentId ?? null,\n $limit: options.limit,\n }) as SessionRow[];\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 runner_sessions (\n id,\n agent_id,\n title,\n metadata_json,\n messages_json,\n transcript_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 ...(input.title === undefined ? {} : { title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n }\n\n getSession(id: string): StudioSession | undefined {\n const row = this.getSessionRow(id);\n\n return row === undefined ? undefined : toSession(row, this.listSessionRunRows(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, messages_json, transcript_json, created_at, updated_at\n FROM runner_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 current = toSession(row);\n const messages = [...current.messages, ...input.messages];\n const updatedAt = new Date().toISOString();\n\n db.prepare(\n `UPDATE runner_sessions\n SET messages_json = $messages,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.context.sessionId,\n $messages: JSON.stringify(messages),\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 runner_sessions\n SET messages_json = '[]',\n transcript_json = '[]',\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: context.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM runner_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 ? transcriptFromMessagesFallback(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(row, this.listSessionRunRows(input.id));\n const title = current.title ?? input.title;\n\n db.prepare(\n `INSERT INTO runner_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(runner_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 runner_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 deleteSession(id: string): boolean {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\"DELETE FROM runner_traces WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM runner_session_runs WHERE session_id = $id\").run({ $id: id });\n const result = db.prepare(\"DELETE FROM runner_sessions WHERE id = $id\").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 runner_traces t\n LEFT JOIN runner_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 runner_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 runner_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 runner_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 DatabaseSync(this.path, {\n allowUnknownNamedParameters: true,\n timeout: 5000,\n });\n db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n CREATE TABLE IF NOT EXISTS runner_sessions (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n title TEXT,\n metadata_json TEXT,\n messages_json TEXT NOT NULL,\n transcript_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n ) STRICT;\n CREATE INDEX IF NOT EXISTS runner_sessions_agent_updated_idx\n ON runner_sessions(agent_id, updated_at DESC);\n CREATE TABLE IF NOT EXISTS runner_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 runner_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS runner_session_runs_session_created_idx\n ON runner_session_runs(session_id, created_at ASC);\n CREATE TABLE IF NOT EXISTS runner_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 runner_traces_session_started_idx\n ON runner_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, messages_json, transcript_json, created_at, updated_at\n FROM runner_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 runner_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 runner_session_runs\n WHERE session_id = $sessionId\n ORDER BY created_at ASC`,\n )\n .all({ $sessionId: sessionId }) as SessionRunRow[];\n }\n}\n\nfunction toSession(row: SessionRow, runRows: SessionRunRow[] = []): StudioSession {\n const summary = toSessionSummary(row);\n const legacyTranscript = parseJsonArray<StudioTranscriptEntry>(row.transcript_json);\n const runTranscript = runRows.flatMap((runRow) =>\n parseJsonArray<StudioTranscriptEntry>(runRow.transcript_json),\n );\n return {\n ...summary,\n messages: parseJsonArray<Message>(row.messages_json),\n transcript: renumberTranscript([...legacyTranscript, ...runTranscript]),\n };\n}\n\nfunction toSessionSummary(row: SessionRow): StudioSessionSummary {\n const messages = parseJsonArray<Message>(row.messages_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n agentId: row.agent_id,\n ...(row.title === null ? {} : { title: row.title }),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: messages.length,\n ...(metadata === undefined ? {} : { metadata }),\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 ...(trace === undefined ? {} : { trace }),\n ...(input === undefined ? {} : { 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 ...(row.name === null ? {} : { name: row.name }),\n status: row.status,\n startedAt: row.started_at,\n ...(row.ended_at === null ? {} : { endedAt: row.ended_at }),\n ...(row.duration_ms === null ? {} : { durationMs: row.duration_ms }),\n ...(row.output === null ? {} : { output: row.output }),\n ...(error === undefined ? {} : { error }),\n ...(usage === undefined ? {} : { usage }),\n ...(metadata === undefined ? {} : { 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 renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\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\nfunction transcriptFromMessagesFallback(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 for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\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) => (\"text\" in item ? item.text : \"[image]\"))\n .join(\"\\n\"),\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 entryId: transcript.length,\n kind: \"reasoning\",\n ...(content.id === undefined ? {} : { reasoningId: content.id }),\n text: content.text,\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 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\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core\";\n\nexport function toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (typeof value === \"object\") {\n return compactJsonObject(value as Record<string, unknown>);\n }\n return String(value);\n}\n\nexport function compactJsonObject(values: Record<string, unknown>): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValue(value)]],\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","import type { JsonObject, JsonValue } from \"@anvia/core\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentKnowledgeConfig,\n StudioKnowledgeEvidence,\n StudioKnowledgeEvidenceDocument,\n StudioKnowledgeSummary,\n StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { compactJsonObject } from \"./json\";\nimport { errorResponse, parseLimit } from \"./shared\";\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: props.agents.map(agentKnowledgeConfig),\n evidence: await recentKnowledgeEvidence(props.traceStore, limit),\n };\n return c.json(summary);\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\nfunction agentKnowledgeConfig(agent: StudioAgent): StudioAgentKnowledgeConfig {\n const agentName = agent.name ?? agent.agent.name;\n return {\n agentId: agent.id,\n ...(agentName === undefined ? {} : { agentName }),\n sources: [\n { kind: \"static_context\", count: agent.agent.staticContext.length },\n { kind: \"dynamic_context\", count: agent.agent.dynamicContexts.length },\n { kind: \"dynamic_tools\", count: agent.agent.dynamicTools.length },\n ],\n staticContext: agent.agent.staticContext.map((document) => ({\n id: document.id,\n text: document.text,\n ...(document.additionalProps === undefined\n ? {}\n : { additionalProps: jsonObjectFromRecord(document.additionalProps) }),\n })),\n };\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 ...(query === undefined ? {} : { 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 [\n {\n ...(id === undefined ? {} : { id }),\n ...(text === undefined ? {} : { text }),\n ...(additionalProps === undefined ? {} : { additionalProps }),\n },\n ];\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 { JsonObject, JsonValue, PromptHook } from \"@anvia/core\";\nimport { createHook, parseToolArgs } from \"@anvia/core\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolQuestion,\n StudioToolQuestionAnswer,\n StudioToolQuestionChoice,\n StudioToolQuestionPrompt,\n StudioToolQuestionStatus,\n} from \"../types\";\nimport { errorResponse, isObject, optionalQueryString } from \"./shared\";\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 questionId: answer.questionId.trim(),\n answer: answer.answer.trim(),\n ...(typeof answer.choice === \"string\" ? { choice: answer.choice } : {}),\n ...(typeof answer.custom === \"boolean\" ? { custom: answer.custom } : {}),\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(questions, context, {\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n args,\n questions: prompts.questions,\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 id,\n runId: context.runId,\n agentId: context.agentId,\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n toolName: request.toolName,\n ...(request.toolCallId === undefined ? {} : { callId: request.toolCallId }),\n internalCallId: request.internalCallId,\n args: request.args,\n questions: request.questions,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n ...(context.emit === undefined ? {} : { emit: context.emit }),\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 { AgentStreamEvent, AgentTraceOptions, Message } from \"@anvia/core\";\nimport type { Context } from \"hono\";\nimport { stream as streamResponse } from \"hono/streaming\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionStore,\n StudioTranscriptChildAgentEvent,\n StudioTranscriptEntry,\n} from \"../types\";\nimport {\n errorResponse,\n isAgentTraceOptions,\n isJsonObject,\n isMessage,\n isMessageInput,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n serializeError,\n} from \"./shared\";\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 c.header(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n c.header(\"cache-control\", \"no-cache, no-transform\");\n c.header(\"connection\", \"keep-alive\");\n c.header(\"transfer-encoding\", \"chunked\");\n c.header(\"x-accel-buffering\", \"no\");\n\n return streamResponse(\n c,\n async (stream) => {\n for await (const event of events) {\n await stream.write(`${JSON.stringify(event)}\\n`);\n }\n },\n async (error, stream) => {\n await stream.write(`${JSON.stringify({ type: \"error\", error: serializeError(error) })}\\n`);\n },\n );\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}): 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\n yield event;\n }\n } catch (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 entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n ...(event.toolCallId === undefined ? {} : { callId: event.toolCallId }),\n args: event.args,\n result: event.result,\n });\n return;\n }\n matched.args = matched.args ?? event.args;\n matched.result = event.result;\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 entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n ...(event.toolCallId === undefined ? {} : { callId: event.toolCallId }),\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\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 = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n ...(event.approval.resolvedAt === undefined\n ? {}\n : { resolvedAt: event.approval.resolvedAt }),\n ...(event.approval.reason === undefined ? {} : { reason: event.approval.reason }),\n };\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 = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n ...(event.question.answeredAt === undefined\n ? {}\n : { answeredAt: event.question.answeredAt }),\n questions: event.question.questions,\n ...(event.question.answers === undefined ? {} : { answers: event.question.answers }),\n };\n }\n }\n if (event.type === \"final\" && event.trace?.traceId !== undefined) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\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 {\n kind: \"message\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n text: child.delta,\n };\n }\n if (child.type === \"reasoning_delta\") {\n return {\n kind: \"reasoning\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n ...(child.id === undefined ? {} : { reasoningId: child.id }),\n text: child.delta,\n };\n }\n if (child.type === \"tool_call\") {\n return {\n kind: \"tool\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n toolName: child.toolCall.function.name,\n ...(child.toolCall.callId === undefined && child.toolCall.id === undefined\n ? {}\n : { callId: child.toolCall.callId ?? child.toolCall.id }),\n args: formatJson(child.toolCall.function.arguments),\n };\n }\n if (child.type === \"tool_result\") {\n return {\n kind: \"tool\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n toolName: child.toolName,\n ...(child.toolCallId === undefined ? {} : { callId: child.toolCallId }),\n args: child.args,\n result: child.result,\n };\n }\n if (child.type === \"error\") {\n return {\n kind: \"message\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n text: `Error: ${errorText(child.error)}`,\n };\n }\n return undefined;\n}\n\nfunction errorText(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\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\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 for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\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) => (\"text\" in item ? item.text : \"[image]\"))\n .join(\"\\n\"),\n });\n }\n continue;\n }\n\n for (const content of message.content) {\n if (content.type === \"text\") {\n appendTranscriptAssistantText(transcript, content.text);\n } else if (content.type === \"reasoning\") {\n appendTranscriptReasoningText(transcript, content.text, content.id);\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 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 };\n}\n\nfunction appendTranscriptAssistantText(transcript: StudioTranscriptEntry[], delta: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\") {\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 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 entryId: transcript.length,\n kind: \"reasoning\",\n ...(reasoningId === undefined ? {} : { reasoningId }),\n text: delta,\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) => (\"text\" in result ? result.text : \"[image]\"));\n }\n return [];\n })\n .join(\"\\n\");\n}\n\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport async function parseRunRequest(c: Context): Promise<AgentRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n if (!(\"message\" in body) || !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 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 (\"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 } from \"@anvia/core\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport {\n errorResponse,\n isJsonObject,\n isObject,\n optionalQueryString,\n parseLimit,\n unsupportedCapability,\n} from \"./shared\";\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 ...(agentId === undefined ? {} : { 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 ...(body.title === undefined ? {} : { title: body.title }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n });\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.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 { Hono } from \"hono\";\nimport type { StudioTraceStore } from \"../types\";\nimport { errorResponse, optionalQueryString, parseLimit, parseTraceStatus } from \"./shared\";\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 ...(agentId === undefined ? {} : { agentId }),\n ...(sessionId === undefined ? {} : { sessionId }),\n ...(status === undefined ? {} : { status }),\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"],"mappings":"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","names":["createHook","serializeError","resolve","decision","toJsonValue","compactJsonObject","isRecord","compactJsonObject","createHook","parseToolArgs","createHook","parseToolArgs","resolve","resolve","serializeError","formatJson","serializeError","createHook"]}
|