@anvia/studio 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/dist/index.d.ts +344 -0
- package/dist/index.js +2657 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/assets/anvia.png +0 -0
- package/dist/ui/assets/index-DArq3ZFi.js +85 -0
- package/dist/ui/assets/index-DArq3ZFi.js.map +1 -0
- package/dist/ui/assets/index-VMCHaVgC.css +1 -0
- package/dist/ui/assets/logo.png +0 -0
- package/dist/ui/index.html +22 -0
- package/package.json +57 -0
|
@@ -0,0 +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"]}
|
|
Binary file
|