@anvia/studio 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/studio.ts","../src/traces/trace-observer.ts","../src/ui/routes.tsx","../src/runtime/approvals.ts","../src/storage/memory-store.ts","../src/storage/sqlite-store.ts","../src/runtime/json.ts","../src/runtime/tool-metadata.ts","../src/runtime/shared.ts","../src/runtime/evals.ts","../src/runtime/knowledge.ts","../src/runtime/mcps.ts","../src/runtime/memory.ts","../src/runtime/observability.ts","../src/runtime/pipelines.ts","../src/runtime/pipeline-logs.ts","../src/runtime/runs.ts","../src/runtime/questions.ts","../src/runtime/session-logs.ts","../src/runtime/sessions.ts","../src/runtime/status.ts","../src/runtime/tools.ts","../src/runtime/trace-routes.ts"],"sourcesContent":["import {\n createHook,\n type HookAction,\n type PromptHook,\n type ToolCallHookAction,\n} from \"@anvia/core/agent\";\nimport { type Message as CoreMessage, type JsonObject, Message } from \"@anvia/core/completion\";\nimport { Agent } from \"@anvia/core/internal/agent\";\nimport { resolveMemoryOptions } from \"@anvia/core/memory\";\nimport { Pipeline } from \"@anvia/core/pipeline\";\nimport { serve } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { Hono as HonoApp } from \"hono\";\nimport { StudioTraceObserver } from \"../traces/trace-observer\";\nimport type {\n AgentRunStreamEvent,\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioPipeline,\n StudioServeOptions,\n StudioSessionStore,\n StudioTarget,\n StudioTraceStore,\n} from \"../types\";\nimport {\n isStudioUiEnabled,\n registerStudioUi,\n resolveStudioUiOptions,\n studioUiEntryPath,\n} from \"../ui/routes\";\nimport {\n createApprovalRuntime,\n registerApprovalRoutes,\n type StudioApprovalHook,\n} from \"./approvals\";\nimport { registerEvalRoutes } from \"./evals\";\nimport { registerKnowledgeRoutes } from \"./knowledge\";\nimport { registerMcpRoutes } from \"./mcps\";\nimport { registerMemoryRoutes } from \"./memory\";\nimport {\n observeStores,\n registerObservabilityRoutes,\n StudioObservabilityHub,\n} from \"./observability\";\nimport { registerPipelineRoutes } from \"./pipelines\";\nimport { createQuestionRuntime, registerQuestionRoutes } from \"./questions\";\nimport {\n AsyncEventQueue,\n mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n persistStreamingSessionTranscript,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\n memoryLoadedLog,\n memorySavedLog,\n runCompletedLog,\n runFailedLog,\n runReceivedLog,\n runStartedLog,\n streamSessionRunLogs,\n} from \"./session-logs\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport {\n agentConfig,\n agentRuntimeSummary,\n buildConfig,\n errorResponse,\n normalizeAgents,\n normalizePipelines,\n resolveStores,\n runnerId,\n type StudioRuntimeOptions,\n serializeError,\n unsupportedCapabilities,\n unsupportedCapability,\n} from \"./shared\";\nimport { registerStatusRoutes } from \"./status\";\nimport { registerToolRoutes } from \"./tools\";\nimport { registerTraceRoutes } from \"./trace-routes\";\n\ntype StudioApp = AnviaStudio & {\n readonly sessionStore?: StudioSessionStore;\n readonly traceStore?: StudioTraceStore;\n};\n\nexport class Studio implements AnviaStudio {\n private readonly options: StudioRuntimeOptions;\n private studio: StudioApp;\n private server: ReturnType<typeof serve> | undefined;\n private sigintHandler: (() => void) | undefined;\n\n constructor(targets: StudioTarget[] = [], options: StudioOptions = {}) {\n this.options = studioOptionsFromTargets(targets, options);\n this.studio = createStudioApp(this.options);\n }\n\n get app(): Hono {\n return this.studio.app;\n }\n\n fetch(request: Request): Response | Promise<Response> {\n return this.studio.fetch(request);\n }\n\n config(): StudioConfig {\n return this.studio.config();\n }\n\n traceObserver(): StudioTraceObserver {\n return new StudioTraceObserver({\n store: () => this.studio.traceStore,\n });\n }\n\n start(serveOptions: StudioServeOptions = {}): this {\n this.close();\n this.studio = createStudioApp(this.options);\n\n const port = serveOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n this.server = serve({\n fetch: (request) => this.fetch(request),\n ...(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 studioOptionsFromTargets(\n targets: StudioTarget[],\n options: StudioOptions,\n): StudioRuntimeOptions {\n const agents = targets.filter((target): target is Agent => target instanceof Agent);\n const pipelines = targets.filter(\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous user pipelines.\n (target): target is Pipeline<any, any> => target instanceof Pipeline,\n );\n return {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\n pipelines: inferStudioPipelines(pipelines),\n evals: options.evals ?? [],\n ...(options.stores === undefined ? {} : { stores: options.stores }),\n ...(options.ui === undefined ? {} : { ui: options.ui }),\n };\n}\n\nfunction inferStudioAgents(agents: Agent[], quickPrompts: Record<string, string[]>): StudioAgent[] {\n const ids = new Set<string>();\n return agents.map((agent) => {\n const id = uniqueAgentId(agent.id, ids);\n return {\n id,\n agent,\n quickPrompts: quickPrompts[id] ?? [],\n metadata: agentMetadata(agent),\n };\n });\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous user pipelines.\nfunction inferStudioPipelines(pipelines: Array<Pipeline<any, any>>): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = uniqueAgentId(pipeline.id || \"pipeline\", ids);\n return {\n id,\n pipeline,\n ...(pipeline.name === undefined ? {} : { name: pipeline.name }),\n ...(pipeline.description === undefined ? {} : { description: pipeline.description }),\n ...(pipeline.metadata === undefined ? {} : { metadata: pipeline.metadata }),\n };\n });\n}\n\nfunction uniqueAgentId(baseId: string, ids: Set<string>): string {\n let id = baseId;\n let suffix = 2;\n while (ids.has(id)) {\n id = `${baseId}-${suffix}`;\n suffix += 1;\n }\n ids.add(id);\n return id;\n}\n\nfunction agentMetadata(agent: Agent): JsonObject {\n return {\n ...(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 hasHook: agent.hook !== undefined,\n observerCount: agent.observers.length,\n approvalToolCount: agent.toolSet.values().filter((tool) => tool.approval !== undefined).length,\n };\n}\n\nfunction createStudioApp(options: StudioRuntimeOptions): StudioApp {\n const observabilityHub = new StudioObservabilityHub();\n const stores = observeStores(resolveStores(options), observabilityHub);\n const agents = normalizeAgents(options.agents)\n .map((agent) => withStudioSessionMemory(agent, stores.sessions))\n .map((agent) => withStudioTraceObserver(agent, stores.traces));\n const pipelines = normalizePipelines(options.pipelines);\n const agentMap = new Map(agents.map((agent) => [agent.id, agent]));\n const pipelineMap = new Map(pipelines.map((pipeline) => [pipeline.id, pipeline]));\n const evalMap = new Map(options.evals.map((suite) => [suite.id ?? suite.name, suite]));\n const approvalRuntime = createApprovalRuntime();\n const questionRuntime = createQuestionRuntime();\n const app = new HonoApp();\n const uiOptions = isStudioUiEnabled(options.ui) ? resolveStudioUiOptions(options.ui) : undefined;\n\n if (uiOptions !== undefined && !uiOptions.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n if (uiOptions?.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n app.get(\"/health\", (c) =>\n c.json({\n status: \"ok\",\n runner: {\n id: runnerId(options),\n name: options.name,\n version: options.version,\n },\n }),\n );\n\n app.get(\"/config\", (c) => c.json(buildConfig(options, agents, pipelines, stores)));\n registerStatusRoutes(app, { options, agents, pipelines, stores });\n\n app.get(\"/agents\", (c) => c.json({ agents: agents.map(agentConfig) }));\n\n app.get(\"/agents/:agentId\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentConfig(agent));\n });\n\n app.get(\"/agents/:agentId/runtime\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentRuntimeSummary(agent));\n });\n\n registerMcpRoutes(app, { agentMap });\n registerToolRoutes(app, { agentMap });\n registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\n registerKnowledgeRoutes(app, {\n agents,\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n });\n registerPipelineRoutes(app, {\n pipelines,\n pipelineMap,\n ...(stores.pipelineLogs === undefined ? {} : { logStore: stores.pipelineLogs }),\n ...(stores.pipelineRuns === undefined ? {} : { runStore: stores.pipelineRuns }),\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 runStartedAt = Date.now();\n if (session !== undefined) {\n await appendSessionLog(\n stores.sessions,\n runReceivedLog({\n sessionId: session.id,\n runId,\n agentId,\n message: body.message,\n stream: body.stream === true,\n ...(body.maxTurns === undefined ? {} : { maxTurns: body.maxTurns }),\n ...(body.toolConcurrency === undefined ? {} : { toolConcurrency: body.toolConcurrency }),\n hasTrace: body.trace !== undefined,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n }\n const memoryMetadata = {\n agentId,\n ...(body.metadata ?? {}),\n studioRunId: runId,\n };\n const request =\n session !== undefined\n ? agent.agent.session(session.id, { metadata: memoryMetadata }).prompt(body.message)\n : agent.agent.prompt(\n body.history !== undefined\n ? [...body.history, normalizePromptMessage(body.message)]\n : body.message,\n );\n if (body.maxTurns !== undefined) {\n request.maxTurns(body.maxTurns);\n }\n if (body.toolConcurrency !== undefined) {\n request.withToolConcurrency(body.toolConcurrency);\n }\n if (body.trace !== undefined) {\n request.withTrace(traceForRun(body.trace, agentId, session));\n } else if (session !== undefined) {\n request.withTrace(traceForRun(undefined, agentId, session));\n }\n\n if (body.stream === true) {\n const runtimeEvents = new AsyncEventQueue<AgentRunStreamEvent>();\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n emit: (event) => runtimeEvents.push(event),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const runStream = mergeRunAndApprovalEvents(request.stream(), runtimeEvents);\n const stream =\n session === undefined || stores.sessions === undefined\n ? runStream\n : persistStreamingSessionTranscript({\n stream: streamSessionRunLogs({\n stream: runStream,\n store: stores.sessions,\n session,\n runId,\n startedAt: runStartedAt,\n }),\n store: stores.sessions,\n session,\n message: body.message,\n runId,\n });\n return streamAgentRunEvents(c, stream);\n }\n\n try {\n if (session !== undefined) {\n await appendSessionLog(stores.sessions, runStartedLog(session, runId));\n await appendSessionLog(stores.sessions, memoryLoadedLog(session, runId));\n }\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const response = await request.send();\n if (session !== undefined && stores.sessions !== undefined) {\n await stores.sessions.saveSessionRunTranscript({\n id: session.id,\n runId,\n ...optionalTitle(body.message),\n transcript: transcriptFromMessages(response.messages),\n status: \"success\",\n });\n await appendSessionLog(\n stores.sessions,\n runCompletedLog({\n sessionId: session.id,\n runId,\n durationMs: Date.now() - runStartedAt,\n usage: response.usage,\n output: response.output,\n messageCount: response.messages.length,\n }),\n );\n await appendSessionLog(\n stores.sessions,\n memorySavedLog({\n sessionId: session.id,\n runId,\n messageCount: response.messages.length,\n }),\n );\n }\n return c.json(response);\n } catch (error) {\n if (session !== undefined && stores.sessions !== undefined) {\n const messages = await stores.sessions.load({\n sessionId: session.id,\n metadata: memoryMetadata,\n });\n await stores.sessions.saveSessionRunTranscript({\n id: session.id,\n runId,\n ...optionalTitle(body.message),\n transcript: transcriptFromMessages(messages.slice(session.messageCount)),\n status: \"error\",\n error: serializeError(error),\n });\n await appendSessionLog(\n stores.sessions,\n runFailedLog(session.id, runId, error, runStartedAt),\n );\n }\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n });\n\n if (stores.sessions !== undefined) {\n registerMemoryRoutes(app, {\n sessionStore: stores.sessions,\n });\n registerSessionRoutes(app, {\n agentMap,\n sessionStore: stores.sessions,\n ...(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, pipelines, stores);\n },\n close() {},\n ...(stores.sessions === undefined ? {} : { sessionStore: stores.sessions }),\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n };\n}\n\nfunction normalizePromptMessage(message: string | CoreMessage): CoreMessage {\n return typeof message === \"string\" ? Message.user(message) : message;\n}\n\nfunction withStudioSessionMemory(\n studioAgent: StudioAgent,\n sessionStore: StudioSessionStore | undefined,\n): StudioAgent {\n if (sessionStore === undefined) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n memory: {\n store: sessionStore,\n options: resolveMemoryOptions({ savePolicy: \"message\" }),\n },\n }),\n };\n}\n\nfunction withStudioTraceObserver(\n studioAgent: StudioAgent,\n traceStore: StudioTraceStore | undefined,\n): StudioAgent {\n if (traceStore === undefined || hasStudioTraceObserver(studioAgent.agent)) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n observers: [\n ...studioAgent.agent.observers,\n { observer: new StudioTraceObserver({ store: traceStore }) },\n ],\n }),\n };\n}\n\nfunction cloneAgent(\n agent: Agent,\n overrides: Partial<ConstructorParameters<typeof Agent>[0]> = {},\n): Agent {\n return new Agent({\n id: agent.id,\n name: agent.name,\n description: agent.description,\n model: agent.model,\n instructions: agent.instructions,\n staticContext: agent.staticContext,\n temperature: agent.temperature,\n maxTokens: agent.maxTokens,\n additionalParams: agent.additionalParams,\n toolSet: agent.toolSet,\n toolChoice: agent.toolChoice,\n defaultMaxTurns: agent.defaultMaxTurns,\n hook: agent.hook,\n outputSchema: agent.outputSchema,\n observers: agent.observers,\n dynamicContexts: agent.dynamicContexts,\n dynamicTools: agent.dynamicTools,\n memory: agent.memory,\n ...overrides,\n });\n}\n\nfunction hasStudioTraceObserver(agent: Agent): boolean {\n return agent.observers.some(\n (registration) => registration.observer instanceof StudioTraceObserver,\n );\n}\n\nfunction composeHooks(\n first: PromptHook | undefined,\n second: PromptHook | undefined,\n): PromptHook | undefined {\n if (first === undefined) {\n return second;\n }\n if (second === undefined) {\n return first;\n }\n\n return createHook({\n async onCompletionCall(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionCall?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionCall?.(args)) ?? undefined);\n },\n async onCompletionResponse(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionResponse?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionResponse?.(args)) ?? undefined);\n },\n async onToolCall(args): Promise<ToolCallHookAction | undefined> {\n const firstAction = await first.onToolCall?.(args);\n if (firstAction?.type === \"skip\" || firstAction?.type === \"terminate\") {\n return firstAction;\n }\n if (firstAction?.type === \"approval_request\") {\n return (await approvalRequestHandler(second)?.(args, firstAction)) ?? 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\nfunction approvalRequestHandler(\n hook: PromptHook,\n): StudioApprovalHook[\"handleApprovalRequest\"] | undefined {\n const candidate = hook as Partial<StudioApprovalHook>;\n return typeof candidate.handleApprovalRequest === \"function\"\n ? candidate.handleApprovalRequest\n : undefined;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentObserver,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunObserver,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n} from \"@anvia/core/observability\";\nimport type {\n StudioTrace,\n StudioTraceObservation,\n StudioTraceStatus,\n StudioTraceStore,\n} from \"../types\";\n\nexport type StudioTraceObserverOptions = {\n store: StudioTraceStore | (() => StudioTraceStore | undefined) | undefined;\n};\n\nexport class StudioTraceObserver implements AgentObserver {\n constructor(private readonly options: StudioTraceObserverOptions) {}\n\n startRun(args: AgentRunStartArgs): AgentRunObserver {\n const traceId = args.trace?.traceId ?? globalThis.crypto.randomUUID().replaceAll(\"-\", \"\");\n const observationId = globalThis.crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 16);\n return new StudioRunTraceObserver({\n id: traceId,\n observationId,\n args,\n store: this.store(),\n });\n }\n\n private store(): StudioTraceStore | undefined {\n return typeof this.options.store === \"function\" ? this.options.store() : this.options.store;\n }\n}\n\nclass StudioRunTraceObserver implements AgentRunObserver {\n readonly trace: { traceId: string; observationId: string };\n private readonly startedAt = new Date();\n private readonly observations: StudioTraceObservation[] = [];\n\n constructor(\n private readonly props: {\n id: string;\n observationId: string;\n args: AgentRunStartArgs;\n store: StudioTraceStore | undefined;\n },\n ) {\n this.trace = { traceId: props.id, observationId: props.observationId };\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n const startedAt = new Date();\n return {\n end: (endArgs: AgentGenerationEndArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n output: toJsonValue(endArgs.response),\n metadata: generationMetadata(args, endArgs),\n }),\n );\n },\n error: (errorArgs: AgentGenerationErrorArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n error: serializeError(errorArgs.error),\n metadata: generationMetadata(args),\n }),\n );\n },\n };\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const startedAt = new Date();\n const childTrace = new ChildAgentToolTraceAccumulator(args);\n return {\n streamEvent: (streamArgs: AgentToolStreamEventArgs) => {\n childTrace.accept(streamArgs);\n },\n end: (endArgs: AgentToolEndArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n output: parseOrString(endArgs.result),\n metadata: toolMetadata(args, endArgs.skipped, endArgs.result),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n error: (errorArgs: AgentToolErrorArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n error: serializeError(errorArgs.error),\n metadata: toolMetadata(args, false),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n };\n }\n\n async end(args: AgentRunEndArgs): Promise<void> {\n await this.save(\"success\", {\n endedAt: new Date(),\n output: args.output,\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n async error(args: AgentRunErrorArgs): Promise<void> {\n await this.save(\"error\", {\n endedAt: new Date(),\n error: serializeError(args.error),\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n private async save(\n status: StudioTraceStatus,\n result: {\n endedAt: Date;\n output?: string;\n error?: JsonValue;\n usage: StudioTrace[\"usage\"];\n messages: JsonValue;\n },\n ): Promise<void> {\n const sessionId = this.props.args.trace?.sessionId;\n const store = this.props.store;\n if (sessionId === undefined || store === undefined) {\n return;\n }\n\n const metadata = traceMetadata(this.props.args, result.messages);\n const trace: StudioTrace = {\n id: this.props.id,\n sessionId,\n ...(this.props.args.trace?.name === undefined ? {} : { name: this.props.args.trace.name }),\n status,\n trace: this.trace,\n startedAt: this.startedAt.toISOString(),\n endedAt: result.endedAt.toISOString(),\n durationMs: durationMs(this.startedAt, result.endedAt),\n input: toJsonValue({\n instructions: this.props.args.instructions,\n prompt: this.props.args.prompt,\n history: this.props.args.history,\n }),\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.usage === undefined ? {} : { usage: result.usage }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n\n await store.saveTrace(trace);\n }\n}\n\nclass ChildAgentToolTraceAccumulator {\n private readonly agentStarts = new Map<\n string,\n {\n startedAt: Date;\n agentId: string;\n agentName?: string;\n }\n >();\n private readonly generationStarts = new Map<\n string,\n {\n startedAt: Date;\n input?: JsonValue;\n agentId: string;\n agentName?: string;\n childTurn: number;\n }\n >();\n private readonly toolStarts: Array<{\n startedAt: Date;\n agentId: string;\n agentName?: string;\n childTurn: number;\n toolName: string;\n toolCallId?: string;\n internalCallId?: string;\n input?: JsonValue;\n completed: boolean;\n }> = [];\n private readonly completedObservations: StudioTraceObservation[] = [];\n\n constructor(private readonly parent: AgentToolStartArgs) {}\n\n accept(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : this.parent.turn;\n\n if (!this.agentStarts.has(agentId)) {\n this.agentStarts.set(agentId, {\n startedAt: new Date(),\n agentId,\n ...(agentName === undefined ? {} : { agentName }),\n });\n }\n\n if (child.type === \"turn_start\") {\n this.generationStarts.set(generationKey(agentId, childTurn), {\n startedAt: new Date(),\n input: toJsonValue({\n prompt: child.prompt,\n history: child.history,\n }),\n agentId,\n ...(agentName === undefined ? {} : { agentName }),\n childTurn,\n });\n return;\n }\n\n if (child.type === \"turn_end\") {\n const key = generationKey(agentId, childTurn);\n const start = this.generationStarts.get(key);\n this.generationStarts.delete(key);\n this.completedObservations.push(\n traceObservation({\n kind: \"generation\",\n name: `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n ...(start?.input === undefined ? {} : { input: start.input }),\n output: toJsonValue(child.response),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n }),\n );\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const callId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n this.toolStarts.push({\n startedAt: new Date(),\n agentId,\n ...(agentName === undefined ? {} : { agentName }),\n childTurn,\n toolName,\n ...(callId === undefined ? {} : { toolCallId: callId }),\n input: toJsonValue(toolCallFunction?.arguments ?? {}),\n completed: false,\n });\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const internalCallId =\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined;\n const start = this.findToolStart(agentId, toolName, toolCallId);\n const input =\n start?.input ?? (typeof child.args === \"string\" ? parseOrString(child.args) : undefined);\n if (start !== undefined) {\n start.completed = true;\n }\n this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.${toolName}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n ...(input === undefined ? {} : { input }),\n ...(typeof child.result === \"string\" ? { output: parseOrString(child.result) } : {}),\n metadata: {\n ...this.childMetadata(agentId, agentName, childTurn),\n ...(toolCallId === undefined ? {} : { toolCallId }),\n ...(internalCallId === undefined ? {} : { internalCallId }),\n },\n }),\n );\n return;\n }\n\n if (child.type === \"error\") {\n this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.error`,\n status: \"error\",\n turn: this.parent.turn,\n startedAt: new Date(),\n error: serializeError(child.error),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n }),\n );\n }\n }\n\n observations(parentObservationId: string): StudioTraceObservation[] {\n const observations: StudioTraceObservation[] = [];\n const agentObservationIds = new Map<string, string>();\n\n for (const agentStart of this.agentStarts.values()) {\n const agentChildren = this.completedObservations.filter(\n (observation) =>\n isRecord(observation.metadata) &&\n observation.metadata.childAgentId === agentStart.agentId,\n );\n const childStartTimes = agentChildren.map((observation) => Date.parse(observation.startedAt));\n const childEndTimes = agentChildren.map((observation) =>\n Date.parse(observation.endedAt ?? observation.startedAt),\n );\n const startedAt =\n childStartTimes.length === 0\n ? agentStart.startedAt\n : new Date(Math.min(agentStart.startedAt.getTime(), ...childStartTimes));\n const endedAt =\n childEndTimes.length === 0 ? new Date() : new Date(Math.max(...childEndTimes));\n const agentObservation = traceObservation({\n parentObservationId,\n kind: \"agent\",\n name: `${agentLabel(agentStart.agentId, agentStart.agentName)}.run`,\n status: agentChildren.some((observation) => observation.status === \"error\")\n ? \"error\"\n : \"success\",\n turn: this.parent.turn,\n startedAt,\n endedAt,\n metadata: this.childMetadata(agentStart.agentId, agentStart.agentName, this.parent.turn),\n });\n observations.push(agentObservation);\n agentObservationIds.set(agentStart.agentId, agentObservation.id);\n }\n\n for (const observation of this.completedObservations) {\n const childAgentId = isRecord(observation.metadata)\n ? stringValue(observation.metadata.childAgentId)\n : undefined;\n const childAgentObservationId =\n childAgentId === undefined ? undefined : agentObservationIds.get(childAgentId);\n observations.push({\n ...observation,\n parentObservationId: childAgentObservationId ?? parentObservationId,\n });\n }\n\n return observations;\n }\n\n private findToolStart(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.toolStarts)[number] | undefined {\n for (let index = this.toolStarts.length - 1; index >= 0; index -= 1) {\n const start = this.toolStarts[index];\n if (\n start === undefined ||\n start.completed ||\n start.agentId !== agentId ||\n start.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || start.toolCallId === toolCallId) {\n return start;\n }\n }\n return undefined;\n }\n\n private childMetadata(\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n ): JsonObject {\n return compactJsonObject({\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: this.parent.toolName,\n parentInternalCallId: this.parent.internalCallId,\n parentToolCallId: this.parent.toolCallId,\n });\n }\n}\n\nfunction generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nfunction agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nfunction traceObservation(props: {\n parentObservationId?: string;\n kind: StudioTraceObservation[\"kind\"];\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: Date;\n endedAt?: Date;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n}): StudioTraceObservation {\n const endedAt = props.endedAt ?? new Date();\n return {\n id: globalThis.crypto.randomUUID(),\n ...(props.parentObservationId === undefined\n ? {}\n : { parentObservationId: props.parentObservationId }),\n kind: props.kind,\n name: props.name,\n status: props.status,\n turn: props.turn,\n startedAt: props.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: durationMs(props.startedAt, endedAt),\n ...(props.input === undefined ? {} : { input: props.input }),\n ...(props.output === undefined ? {} : { output: props.output }),\n ...(props.error === undefined ? {} : { error: props.error }),\n ...(props.metadata === undefined ? {} : { metadata: props.metadata }),\n };\n}\n\nfunction traceMetadata(args: AgentRunStartArgs, messages: JsonValue): JsonObject {\n return compactJsonObject({\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n userId: args.trace?.userId,\n tags: args.trace?.tags,\n version: args.trace?.version,\n metadata: toJsonValue(args.trace?.metadata ?? {}),\n messages,\n });\n}\n\nfunction generationMetadata(\n args: AgentGenerationStartArgs,\n endArgs?: AgentGenerationEndArgs,\n): JsonObject {\n const request = args.request;\n const response = endArgs?.response;\n const rawResponse = isRecord(response?.rawResponse) ? response.rawResponse : undefined;\n const effectiveModel =\n request.model ?? stringValue(rawResponse?.model) ?? args.modelInfo?.defaultModel ?? \"default\";\n const providerResponse = providerResponseSummary(rawResponse);\n const usage = response?.usage;\n\n return compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\n messageId: response?.messageId,\n usage,\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n documentCount: request.documents.length,\n historyCount: request.chatHistory.length,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n firstDeltaMs: endArgs?.firstDeltaMs,\n providerResponse,\n modelInfo: compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\n capabilities: args.modelInfo?.capabilities,\n }),\n modelCall: compactJsonObject({\n request: completionRequestSummary(request),\n providerRequest: args.providerRequest,\n }),\n response: compactJsonObject({\n messageId: response?.messageId,\n usage,\n contentTypes: response?.choice.map((item) => item.type),\n providerResponse,\n }),\n tools: compactJsonObject({\n count: request.tools.length,\n names: request.tools.map((tool) => tool.name),\n toolChoice: request.toolChoice,\n hasOutputSchema: request.outputSchema !== undefined,\n }),\n timing: compactJsonObject({\n firstDeltaMs: endArgs?.firstDeltaMs,\n }),\n });\n}\n\nfunction completionRequestSummary(request: AgentGenerationStartArgs[\"request\"]): JsonObject {\n return compactJsonObject({\n model: request.model,\n instructions: request.instructions === undefined ? undefined : { present: true },\n messageCount: request.chatHistory.length,\n documentCount: request.documents.length,\n documentIds: request.documents.map((document) => document.id),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n });\n}\n\nfunction providerResponseSummary(\n rawResponse: Record<string, unknown> | undefined,\n): JsonObject | undefined {\n if (rawResponse === undefined) {\n return undefined;\n }\n const reasoning = isRecord(rawResponse.reasoning) ? rawResponse.reasoning : undefined;\n const text = isRecord(rawResponse.text) ? rawResponse.text : undefined;\n const toolUsage = isRecord(rawResponse.tool_usage) ? rawResponse.tool_usage : undefined;\n const webSearch = isRecord(toolUsage?.web_search) ? toolUsage.web_search : undefined;\n const summary = compactJsonObject({\n id: rawResponse.id,\n status: rawResponse.status,\n serviceTier: rawResponse.service_tier,\n store: rawResponse.store,\n parallelToolCalls: rawResponse.parallel_tool_calls,\n promptCacheKey: rawResponse.prompt_cache_key,\n promptCacheRetention: rawResponse.prompt_cache_retention,\n reasoningEffort: reasoning?.effort,\n textVerbosity: text?.verbosity,\n webSearchRequestCount: webSearch?.num_requests,\n });\n return Object.keys(summary).length === 0 ? undefined : summary;\n}\n\nfunction toolMetadata(args: AgentToolStartArgs, skipped: boolean, result?: string): JsonObject {\n const schema = isRecord(args.toolDefinition?.parameters) ? args.toolDefinition.parameters : {};\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = Array.isArray(schema.required)\n ? schema.required.filter((item): item is string => typeof item === \"string\")\n : [];\n return compactJsonObject({\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n hasAdditionalParams: args.toolCall.additionalParams !== undefined,\n toolDescription: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n tools: compactJsonObject({\n name: args.toolName,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n description: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n hasAdditionalParams: args.toolCall.additionalParams !== undefined,\n }),\n });\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValue(value)]],\n );\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction durationMs(startedAt: Date, endedAt: Date): number {\n return Math.max(0, endedAt.getTime() - startedAt.getTime());\n}\n\nfunction parseOrString(value: string): JsonValue {\n try {\n return toJsonValue(JSON.parse(value));\n } catch {\n return value;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction serializeError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return compactJsonObject({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n }\n return toJsonValue(error);\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (typeof value === \"object\") {\n return compactJsonObject(value as Record<string, unknown>);\n }\n return String(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Hono } from \"hono\";\nimport type { StudioUiOptions } from \"../types\";\n\nexport type ResolvedStudioUiOptions = {\n path: string;\n title: string;\n rootRoutes: boolean;\n redirectRoot: boolean;\n clientScript?: string;\n protectShell: boolean;\n};\n\nexport function resolveStudioUiOptions(\n ui: boolean | StudioUiOptions | undefined,\n): ResolvedStudioUiOptions {\n const options = typeof ui === \"object\" ? ui : {};\n return {\n path: normalizeUiPath(options.path ?? \"/ui\"),\n title: options.title ?? \"Anvia Studio\",\n rootRoutes: options.rootRoutes ?? true,\n redirectRoot: options.redirectRoot ?? true,\n ...(options.clientScript === undefined ? {} : { clientScript: options.clientScript }),\n protectShell: options.protectShell ?? false,\n };\n}\n\nexport function isStudioUiEnabled(ui: boolean | StudioUiOptions | undefined): boolean {\n return ui !== false;\n}\n\nexport function registerStudioUi(app: Hono, options: ResolvedStudioUiOptions): void {\n const scriptPath = `${options.path}/assets/client.js`;\n const stylePath = `${options.path}/assets/styles.css`;\n const renderShell = () =>\n renderStudioUi({\n options,\n routePath: options.path,\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n const renderRootShell = () =>\n renderStudioUi({\n options,\n routePath: \"\",\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n\n if (options.redirectRoot) {\n app.get(\"/\", (c) => c.redirect(studioUiEntryPath(options)));\n }\n\n app.get(options.path, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/:traceId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/sessions/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/*`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/sessions`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/agents`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tools`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/mcps`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/pipelines`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/evals`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/memory`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/status`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/knowledge`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/knowledge/:tab`, 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.path}/playground`;\n}\n\nasync function readBundledUiIndex(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/index.html\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/index.html\", import.meta.url)),\n \"utf8\",\n );\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n return readFile(fileURLToPath(new URL(\"./app/index.html\", import.meta.url)), \"utf8\");\n }\n}\n\nasync function readBundledUiAsset(asset: string): Promise<Uint8Array | undefined> {\n try {\n return await readFile(fileURLToPath(new URL(`./assets/${asset}`, import.meta.url)));\n } catch (sourceError) {\n if (!isNotFoundError(sourceError)) {\n throw sourceError;\n }\n }\n try {\n return await readFile(fileURLToPath(new URL(`./ui/assets/${asset}`, import.meta.url)));\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(`../../dist/ui/assets/${asset}`, import.meta.url)),\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return undefined;\n }\n }\n}\n\nasync function readBundledLegacyStylesheet(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/styles.css\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/styles.css\", import.meta.url)),\n \"utf8\",\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return \"\";\n }\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction contentTypeForAsset(asset: string): string {\n if (asset.endsWith(\".js\")) {\n return \"text/javascript; charset=utf-8\";\n }\n if (asset.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (asset.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (asset.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (asset.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n return \"application/octet-stream\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n","import {\n createHook,\n type PromptHook,\n type ToolApprovalRequestOptions,\n type ToolCallHookAction,\n type ToolCallHookArgs,\n} from \"@anvia/core/agent\";\nimport type { JsonObject } from \"@anvia/core/completion\";\nimport {\n type AnyTool,\n parseToolArgs,\n type ToolApprovalContext,\n type ToolApprovalPolicy,\n} from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolApproval,\n StudioToolApprovalDecision,\n StudioToolApprovalStatus,\n} from \"../types\";\nimport { errorResponse, 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): StudioApprovalHook;\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 type StudioApprovalHook = PromptHook & {\n handleApprovalRequest(\n args: ToolCallHookArgs,\n request: ToolApprovalRequestOptions,\n ): Promise<ToolCallHookAction>;\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 const handleApprovalRequest: StudioApprovalHook[\"handleApprovalRequest\"] = async (\n { toolName, toolCallId, internalCallId, args, tool: control },\n request,\n ) => {\n const decision = await requestApproval(approvals, context, {\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n args,\n ...(request.reason === undefined ? {} : { reason: request.reason }),\n ...(request.rejectMessage === undefined ? {} : { rejectMessage: request.rejectMessage }),\n });\n\n return decision.approved\n ? control.run()\n : control.skip(decision.reason ?? request.rejectMessage ?? \"Rejected in Anvia Studio.\");\n };\n return {\n ...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(\n approval.rejectMessage,\n approvalContext,\n );\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 handleApprovalRequest,\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 type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\ntype MemorySessionRecord = StudioSessionSummary & {\n messages: Message[];\n runs: Array<StudioSessionRunTranscriptInput & { createdAt: string; updatedAt: string }>;\n logs: StudioSessionLogEntry[];\n};\n\nexport function createInMemoryStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n return new InMemoryStudioStore();\n}\n\nclass InMemoryStudioStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"memory\";\n private readonly sessions = new Map<string, MemorySessionRecord>();\n private readonly traces = new Map<string, StudioTrace>();\n private readonly pipelineLogs = new Map<string, StudioPipelineLogEntry[]>();\n private readonly pipelineRuns = new Map<string, StudioPipelineRunRecord>();\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n return [...this.sessions.values()]\n .filter((session) => options.agentId === undefined || session.agentId === options.agentId)\n .sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt))\n .slice(0, options.limit)\n .map(sessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const now = new Date().toISOString();\n const session: MemorySessionRecord = {\n id: input.id,\n agentId: input.agentId,\n ...(input.title === undefined ? {} : { title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n messages: [],\n runs: [],\n logs: [],\n };\n this.sessions.set(input.id, session);\n return sessionSummary(session);\n }\n\n getSession(id: string): StudioSession | undefined {\n const session = this.sessions.get(id);\n return session === undefined ? undefined : materializeSession(session);\n }\n\n load(context: MemoryContext): Promise<Message[]> {\n return Promise.resolve(this.sessions.get(context.sessionId)?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): Promise<void> {\n const session = this.sessions.get(input.context.sessionId);\n if (session !== undefined) {\n session.messages.push(...input.messages);\n session.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n clear(context: MemoryContext): Promise<void> {\n const session = this.sessions.get(context.sessionId);\n if (session !== undefined) {\n session.messages = [];\n session.runs = [];\n session.messageCount = 0;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n async recordError(input: MemoryErrorInput): Promise<void> {\n await this.saveSessionRunTranscript({\n id: input.context.sessionId,\n runId: studioRunId(input.context) ?? input.runId,\n transcript: transcriptFromMessagesFallback(input.messages),\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const session = this.sessions.get(input.id);\n if (session === undefined) {\n return undefined;\n }\n const now = new Date().toISOString();\n const existingIndex = session.runs.findIndex((run) => run.runId === input.runId);\n const run = {\n ...input,\n transcript: renumberTranscript(input.transcript),\n createdAt: existingIndex === -1 ? now : (session.runs[existingIndex]?.createdAt ?? now),\n updatedAt: now,\n };\n if (existingIndex === -1) {\n session.runs.push(run);\n } else {\n session.runs[existingIndex] = run;\n }\n session.updatedAt = now;\n return materializeSession(session);\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const session = this.sessions.get(input.sessionId);\n const logs = session?.logs ?? [];\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n if (session !== undefined) {\n session.logs.push(entry);\n session.updatedAt = entry.timestamp;\n }\n return entry;\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n return (this.sessions.get(options.sessionId)?.logs ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n deleteSession(id: string): boolean {\n for (const trace of this.traces.values()) {\n if (trace.sessionId === id) {\n this.traces.delete(trace.id);\n }\n }\n return this.sessions.delete(id);\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n return [...this.traces.values()]\n .filter((trace) => options.sessionId === undefined || trace.sessionId === options.sessionId)\n .filter((trace) => options.status === undefined || trace.status === options.status)\n .filter((trace) => options.agentId === undefined || traceAgentId(trace) === options.agentId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit)\n .map(traceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n return this.listTraces({ sessionId: options.sessionId, limit: options.limit });\n }\n\n getTrace(id: string): StudioTrace | undefined {\n return this.traces.get(id);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n this.traces.set(trace.id, trace);\n return trace;\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const logs = this.pipelineLogs.get(input.pipelineId) ?? [];\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n this.pipelineLogs.set(input.pipelineId, [...logs, entry]);\n return entry;\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n return (this.pipelineLogs.get(options.pipelineId) ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const record: StudioPipelineRunRecord = {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n ...(input.output === undefined ? {} : { output: input.output }),\n ...(input.error === undefined ? {} : { error: input.error }),\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n startedAt: input.startedAt,\n ...(input.endedAt === undefined ? {} : { endedAt: input.endedAt }),\n ...(input.durationMs === undefined ? {} : { durationMs: input.durationMs }),\n };\n this.pipelineRuns.set(input.runId, record);\n return record;\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n return [...this.pipelineRuns.values()]\n .filter((run) => run.pipelineId === options.pipelineId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit);\n }\n}\n\nfunction sessionSummary(session: MemorySessionRecord): StudioSessionSummary {\n return {\n id: session.id,\n agentId: session.agentId,\n ...(session.title === undefined ? {} : { title: session.title }),\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messages.length,\n ...(session.metadata === undefined ? {} : { metadata: session.metadata }),\n };\n}\n\nfunction materializeSession(session: MemorySessionRecord): StudioSession {\n return {\n ...sessionSummary(session),\n messages: [...session.messages],\n transcript: renumberTranscript(session.runs.flatMap((run) => run.transcript)),\n };\n}\n\nfunction traceSummary(trace: StudioTrace): StudioTraceSummary {\n return {\n id: trace.id,\n sessionId: trace.sessionId,\n ...(trace.name === undefined ? {} : { name: trace.name }),\n status: trace.status,\n startedAt: trace.startedAt,\n ...(trace.endedAt === undefined ? {} : { endedAt: trace.endedAt }),\n ...(trace.durationMs === undefined ? {} : { durationMs: trace.durationMs }),\n ...(trace.output === undefined ? {} : { output: trace.output }),\n ...(trace.error === undefined ? {} : { error: trace.error }),\n ...(trace.usage === undefined ? {} : { usage: trace.usage }),\n ...(trace.metadata === undefined ? {} : { metadata: trace.metadata }),\n observationCount: trace.observations.length,\n };\n}\n\nfunction traceAgentId(trace: StudioTrace): string | undefined {\n const nestedMetadata = trace.metadata?.metadata;\n return isJsonObject(nestedMetadata) && typeof nestedMetadata.agentId === \"string\"\n ? nestedMetadata.agentId\n : undefined;\n}\n\nfunction renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n\nfunction studioRunId(context: MemoryContext): string | undefined {\n const value = context.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n return isJsonValue(error) ? error : String(error);\n}\n\nfunction transcriptFromMessagesFallback(messages: Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\n }\n }\n continue;\n }\n if (message.role === \"assistant\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: content.text,\n });\n }\n }\n }\n }\n return transcript;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return isJsonObject(value) && Object.values(value).every(isJsonValue);\n}\n","import { mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport type { DatabaseSync as DatabaseSyncType } from \"node:sqlite\";\nimport type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunStatus,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\nexport type SqliteSessionStoreOptions = {\n path?: string;\n};\n\ntype DatabaseSyncConstructor = typeof DatabaseSyncType;\n\nlet DatabaseSync: DatabaseSyncConstructor | undefined;\n\ntype SessionRow = {\n id: string;\n agent_id: string;\n title: string | null;\n metadata_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype SessionSummaryRow = SessionRow & {\n message_count: number;\n};\n\ntype MessageRow = {\n session_id: string;\n message_index: number;\n role: Message[\"role\"];\n message_id: string | null;\n created_at: string;\n};\n\ntype MessagePartRow = {\n session_id: string;\n message_index: number;\n part_index: number;\n type: string;\n part_json: string;\n};\n\ntype StoredMessagePart = {\n type: string;\n value: unknown;\n};\n\ntype TableInfoRow = {\n name: string;\n};\n\ntype TraceRow = {\n id: string;\n session_id: string;\n name: string | null;\n status: StudioTrace[\"status\"];\n trace_json: string | null;\n input_json: string | null;\n output: string | null;\n error_json: string | null;\n usage_json: string | null;\n metadata_json: string | null;\n observations_json: string;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\ntype SessionRunRow = {\n run_id: string;\n session_id: string;\n status: StudioSessionRunStatus;\n title: string | null;\n transcript_json: string;\n error_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype SessionLogRow = {\n id: string;\n session_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioSessionLogEntry[\"level\"];\n category: StudioSessionLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineLogRow = {\n id: string;\n pipeline_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioPipelineLogEntry[\"level\"];\n category: StudioPipelineLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineRunRow = {\n run_id: string;\n pipeline_id: string;\n status: StudioPipelineRunRecord[\"status\"];\n input_json: string;\n output_json: string | null;\n error_json: string | null;\n metadata_json: string | null;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\nexport function createSqliteSessionStore(\n options: SqliteSessionStoreOptions = {},\n): StudioSessionStore & StudioTraceStore & StudioPipelineLogStore & StudioPipelineRunStore {\n return new SqliteSessionStore(options.path ?? \":memory:\");\n}\n\nclass SqliteSessionStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"sqlite\";\n private db: DatabaseSyncType | undefined;\n\n constructor(private readonly path: string) {}\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n const db = this.database();\n const agentClause = options.agentId === undefined ? \"\" : \"WHERE s.agent_id = $agentId\";\n const rows = db\n .prepare(\n `SELECT s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at,\n COUNT(m.message_index) AS message_count\n FROM anvia_studio_sessions s\n LEFT JOIN anvia_studio_session_messages m ON m.session_id = s.id\n ${agentClause}\n GROUP BY s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at\n ORDER BY s.updated_at DESC\n LIMIT $limit`,\n )\n .all({\n $agentId: options.agentId ?? null,\n $limit: options.limit,\n }) as SessionSummaryRow[];\n\n return rows.map(toSessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const db = this.database();\n const now = new Date().toISOString();\n db.prepare(\n `INSERT INTO anvia_studio_sessions (\n id,\n agent_id,\n title,\n metadata_json,\n created_at,\n updated_at\n ) VALUES ($id, $agentId, $title, $metadata, $now, $now)`,\n ).run({\n $id: input.id,\n $agentId: input.agentId,\n $title: input.title ?? null,\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $now: now,\n });\n\n return {\n id: input.id,\n agentId: input.agentId,\n ...(input.title === undefined ? {} : { title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n }\n\n getSession(id: string): StudioSession | undefined {\n const row = this.getSessionRow(id);\n\n return row === undefined\n ? undefined\n : toSession(row, this.listSessionMessages(id), this.listSessionRunRows(id));\n }\n\n load(context: MemoryContext): Promise<Message[]> {\n const session = this.getSession(context.sessionId);\n return Promise.resolve(session?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): Promise<void> {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: input.context.sessionId }) as SessionRow | undefined;\n\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve();\n }\n\n const updatedAt = new Date().toISOString();\n const nextIndex = this.nextMessageIndex(input.context.sessionId);\n\n this.insertMessages(input.context.sessionId, input.messages, nextIndex, updatedAt);\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.context.sessionId,\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n clear(context: MemoryContext): Promise<void> {\n const db = this.database();\n const updatedAt = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: context.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_messages WHERE session_id = $id\").run({\n $id: context.sessionId,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({\n $id: context.sessionId,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n async recordError(input: MemoryErrorInput): Promise<void> {\n const runId = studioRunId(input.context) ?? input.runId;\n const existing = this.getSessionRun(input.context.sessionId, runId);\n const transcript =\n existing === undefined ||\n parseJsonArray<StudioTranscriptEntry>(existing.transcript_json).length === 0\n ? transcriptFromMessagesFallback(input.messages)\n : parseJsonArray<StudioTranscriptEntry>(existing.transcript_json);\n await this.saveSessionRunTranscript({\n id: input.context.sessionId,\n runId,\n transcript,\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.id);\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return undefined;\n }\n const current = toSession(\n row,\n this.listSessionMessages(input.id),\n this.listSessionRunRows(input.id),\n );\n const title = current.title ?? input.title;\n\n db.prepare(\n `INSERT INTO anvia_studio_session_runs (\n run_id,\n session_id,\n status,\n title,\n transcript_json,\n error_json,\n created_at,\n updated_at\n ) VALUES (\n $runId,\n $sessionId,\n $status,\n $title,\n $transcript,\n $error,\n $now,\n $now\n )\n ON CONFLICT(run_id) DO UPDATE SET\n status = excluded.status,\n title = COALESCE(anvia_studio_session_runs.title, excluded.title),\n transcript_json = excluded.transcript_json,\n error_json = excluded.error_json,\n updated_at = excluded.updated_at`,\n ).run({\n $runId: input.runId,\n $sessionId: input.id,\n $status: input.status,\n $title: input.title ?? null,\n $transcript: JSON.stringify(renumberTranscript(input.transcript)),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $now: now,\n });\n\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET title = $title,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.id,\n $title: title ?? null,\n $updatedAt: now,\n });\n db.exec(\"COMMIT\");\n\n const updated = this.getSession(input.id);\n return updated;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.sessionId);\n if (row === undefined) {\n throw new Error(\"Session not found\");\n }\n const sequence = this.nextSessionLogSequence(input.sessionId);\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n\n db.prepare(\n `INSERT INTO anvia_studio_session_logs (\n id,\n session_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $sessionId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $sessionId: entry.sessionId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, session_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as SessionLogRow[];\n\n return rows.map(toSessionLog);\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const sequence = this.nextPipelineLogSequence(input.pipelineId);\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_logs (\n id,\n pipeline_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $pipelineId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $pipelineId: entry.pipelineId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, pipeline_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as PipelineLogRow[];\n\n return rows.map(toPipelineLog);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_runs (\n run_id,\n pipeline_id,\n status,\n input_json,\n output_json,\n error_json,\n metadata_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $runId,\n $pipelineId,\n $status,\n $input,\n $output,\n $error,\n $metadata,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(run_id) DO UPDATE SET\n pipeline_id = excluded.pipeline_id,\n status = excluded.status,\n input_json = excluded.input_json,\n output_json = excluded.output_json,\n error_json = excluded.error_json,\n metadata_json = excluded.metadata_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $runId: input.runId,\n $pipelineId: input.pipelineId,\n $status: input.status,\n $input: JSON.stringify(input.input),\n $output: input.output === undefined ? null : JSON.stringify(input.output),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $startedAt: input.startedAt,\n $endedAt: input.endedAt ?? null,\n $durationMs: input.durationMs ?? null,\n });\n\n return {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n ...(input.output === undefined ? {} : { output: input.output }),\n ...(input.error === undefined ? {} : { error: input.error }),\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n startedAt: input.startedAt,\n ...(input.endedAt === undefined ? {} : { endedAt: input.endedAt }),\n ...(input.durationMs === undefined ? {} : { durationMs: input.durationMs }),\n };\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT run_id, pipeline_id, status, input_json, output_json, error_json,\n metadata_json, started_at, ended_at, duration_ms\n FROM anvia_studio_pipeline_runs\n WHERE pipeline_id = $pipelineId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $limit: options.limit,\n }) as PipelineRunRow[];\n\n return rows.map(toPipelineRun);\n }\n\n deleteSession(id: string): boolean {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\"DELETE FROM anvia_studio_traces WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_logs WHERE session_id = $id\").run({ $id: id });\n const result = db\n .prepare(\"DELETE FROM anvia_studio_sessions WHERE id = $id\")\n .run({ $id: id }) as {\n changes: number | bigint;\n };\n db.exec(\"COMMIT\");\n return Number(result.changes) > 0;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const filters: string[] = [];\n const values: Record<string, string | number | null> = {\n $limit: options.limit,\n };\n\n if (options.agentId !== undefined) {\n filters.push(\n \"(s.agent_id = $agentId OR json_extract(t.metadata_json, '$.metadata.agentId') = $agentId)\",\n );\n values.$agentId = options.agentId;\n }\n if (options.sessionId !== undefined) {\n filters.push(\"t.session_id = $sessionId\");\n values.$sessionId = options.sessionId;\n }\n if (options.status !== undefined) {\n filters.push(\"t.status = $status\");\n values.$status = options.status;\n }\n\n const whereClause = filters.length === 0 ? \"\" : `WHERE ${filters.join(\" AND \")}`;\n const rows = db\n .prepare(\n `SELECT t.id, t.session_id, t.name, t.status, t.trace_json, t.input_json, t.output,\n t.error_json, t.usage_json, t.metadata_json, t.observations_json,\n t.started_at, t.ended_at, t.duration_ms\n FROM anvia_studio_traces t\n LEFT JOIN anvia_studio_sessions s ON s.id = t.session_id\n ${whereClause}\n ORDER BY t.started_at DESC\n LIMIT $limit`,\n )\n .all(values) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE session_id = $sessionId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $limit: options.limit,\n }) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n getTrace(id: string): StudioTrace | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE id = $id`,\n )\n .get({ $id: id }) as TraceRow | undefined;\n\n return row === undefined ? undefined : toTrace(row);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_traces (\n id,\n session_id,\n name,\n status,\n trace_json,\n input_json,\n output,\n error_json,\n usage_json,\n metadata_json,\n observations_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $id,\n $sessionId,\n $name,\n $status,\n $trace,\n $input,\n $output,\n $error,\n $usage,\n $metadata,\n $observations,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n name = excluded.name,\n status = excluded.status,\n trace_json = excluded.trace_json,\n input_json = excluded.input_json,\n output = excluded.output,\n error_json = excluded.error_json,\n usage_json = excluded.usage_json,\n metadata_json = excluded.metadata_json,\n observations_json = excluded.observations_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $id: trace.id,\n $sessionId: trace.sessionId,\n $name: trace.name ?? null,\n $status: trace.status,\n $trace: trace.trace === undefined ? null : JSON.stringify(trace.trace),\n $input: trace.input === undefined ? null : JSON.stringify(trace.input),\n $output: trace.output ?? null,\n $error: trace.error === undefined ? null : JSON.stringify(trace.error),\n $usage: trace.usage === undefined ? null : JSON.stringify(trace.usage),\n $metadata: trace.metadata === undefined ? null : JSON.stringify(trace.metadata),\n $observations: JSON.stringify(trace.observations),\n $startedAt: trace.startedAt,\n $endedAt: trace.endedAt ?? null,\n $durationMs: trace.durationMs ?? null,\n });\n\n return trace;\n }\n\n private database(): DatabaseSyncType {\n if (this.db !== undefined) {\n return this.db;\n }\n\n if (this.path !== \":memory:\") {\n mkdirSync(dirname(resolve(this.path)), { recursive: true });\n }\n\n const db = new (loadDatabaseSync())(this.path, {\n allowUnknownNamedParameters: true,\n timeout: 5000,\n });\n db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n `);\n guardAgainstLegacySessionSchema(db);\n db.exec(`\n CREATE TABLE IF NOT EXISTS anvia_studio_sessions (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n title TEXT,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_sessions_agent_updated_idx\n ON anvia_studio_sessions(agent_id, updated_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_messages (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n role TEXT NOT NULL,\n message_id TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_messages_session_idx\n ON anvia_studio_session_messages(session_id, message_index ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_message_parts (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n part_index INTEGER NOT NULL,\n type TEXT NOT NULL,\n part_json TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index, part_index),\n FOREIGN KEY(session_id, message_index)\n REFERENCES anvia_studio_session_messages(session_id, message_index)\n ON DELETE CASCADE\n ) STRICT;\n CREATE TABLE IF NOT EXISTS anvia_studio_session_runs (\n run_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n title TEXT,\n transcript_json TEXT NOT NULL,\n error_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_runs_session_created_idx\n ON anvia_studio_session_runs(session_id, created_at ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_logs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(session_id, sequence),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_logs_session_sequence_idx\n ON anvia_studio_session_logs(session_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_logs (\n id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(pipeline_id, sequence)\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_logs_pipeline_sequence_idx\n ON anvia_studio_pipeline_logs(pipeline_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_runs (\n run_id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n status TEXT NOT NULL,\n input_json TEXT NOT NULL,\n output_json TEXT,\n error_json TEXT,\n metadata_json TEXT,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_runs_pipeline_started_idx\n ON anvia_studio_pipeline_runs(pipeline_id, started_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_traces (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n name TEXT,\n status TEXT NOT NULL,\n trace_json TEXT,\n input_json TEXT,\n output TEXT,\n error_json TEXT,\n usage_json TEXT,\n metadata_json TEXT,\n observations_json TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_traces_session_started_idx\n ON anvia_studio_traces(session_id, started_at DESC);\n `);\n\n this.db = db;\n return db;\n }\n\n private getSessionRow(id: string): SessionRow | undefined {\n return this.database()\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as SessionRow | undefined;\n }\n\n private getSessionRun(sessionId: string, runId: string): SessionRunRow | undefined {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId AND run_id = $runId`,\n )\n .get({ $sessionId: sessionId, $runId: runId }) as SessionRunRow | undefined;\n }\n\n private listSessionRunRows(sessionId: string): SessionRunRow[] {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId\n ORDER BY created_at ASC`,\n )\n .all({ $sessionId: sessionId }) as SessionRunRow[];\n }\n\n private nextSessionLogSequence(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private nextPipelineLogSequence(pipelineId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId`,\n )\n .get({ $pipelineId: pipelineId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private listSessionMessages(sessionId: string): Message[] {\n const db = this.database();\n const messageRows = db\n .prepare(\n `SELECT session_id, message_index, role, message_id, created_at\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId\n ORDER BY message_index ASC`,\n )\n .all({ $sessionId: sessionId }) as MessageRow[];\n\n if (messageRows.length === 0) {\n return [];\n }\n\n const partRows = db\n .prepare(\n `SELECT session_id, message_index, part_index, type, part_json\n FROM anvia_studio_session_message_parts\n WHERE session_id = $sessionId\n ORDER BY message_index ASC, part_index ASC`,\n )\n .all({ $sessionId: sessionId }) as MessagePartRow[];\n const partsByMessage = new Map<number, MessagePartRow[]>();\n for (const partRow of partRows) {\n const parts = partsByMessage.get(partRow.message_index) ?? [];\n parts.push(partRow);\n partsByMessage.set(partRow.message_index, parts);\n }\n\n return messageRows.map((row) =>\n messageFromRows(row, partsByMessage.get(row.message_index) ?? []),\n );\n }\n\n private nextMessageIndex(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(message_index) + 1, 0) AS next_index\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_index: number };\n return row.next_index;\n }\n\n private insertMessages(\n sessionId: string,\n messages: Message[],\n startIndex: number,\n createdAt: string,\n ): void {\n const db = this.database();\n const insertMessage = db.prepare(\n `INSERT INTO anvia_studio_session_messages (\n session_id,\n message_index,\n role,\n message_id,\n created_at\n ) VALUES ($sessionId, $messageIndex, $role, $messageId, $createdAt)`,\n );\n const insertPart = db.prepare(\n `INSERT INTO anvia_studio_session_message_parts (\n session_id,\n message_index,\n part_index,\n type,\n part_json\n ) VALUES ($sessionId, $messageIndex, $partIndex, $type, $partJson)`,\n );\n\n messages.forEach((message, messageOffset) => {\n const messageIndex = startIndex + messageOffset;\n insertMessage.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $role: message.role,\n $messageId: message.role === \"assistant\" ? (message.id ?? null) : null,\n $createdAt: createdAt,\n });\n\n messageParts(message).forEach((part, partIndex) => {\n insertPart.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $partIndex: partIndex,\n $type: part.type,\n $partJson: JSON.stringify(part.value),\n });\n });\n });\n }\n}\n\nfunction toSession(\n row: SessionRow,\n messages: Message[],\n runRows: SessionRunRow[] = [],\n): StudioSession {\n const summary = toSessionSummary({ ...row, message_count: messages.length });\n const runTranscript = runRows.flatMap((runRow) =>\n parseJsonArray<StudioTranscriptEntry>(runRow.transcript_json),\n );\n return {\n ...summary,\n messages,\n transcript: renumberTranscript(runTranscript),\n };\n}\n\nfunction toSessionSummary(row: SessionSummaryRow): StudioSessionSummary {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n agentId: row.agent_id,\n ...(row.title === null ? {} : { title: row.title }),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: row.message_count,\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nfunction toSessionLog(row: SessionLogRow): StudioSessionLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n sessionId: row.session_id,\n ...(row.run_id === null ? {} : { runId: row.run_id }),\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nfunction toPipelineLog(row: PipelineLogRow): StudioPipelineLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n pipelineId: row.pipeline_id,\n ...(row.run_id === null ? {} : { runId: row.run_id }),\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nfunction toPipelineRun(row: PipelineRunRow): StudioPipelineRunRecord {\n const output = parseJsonValue<JsonValue>(row.output_json);\n const error = parseJsonValue<JsonValue>(row.error_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n runId: row.run_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n input: JSON.parse(row.input_json) as JsonValue,\n ...(output === undefined ? {} : { output }),\n ...(error === undefined ? {} : { error }),\n ...(metadata === undefined ? {} : { metadata }),\n startedAt: row.started_at,\n ...(row.ended_at === null ? {} : { endedAt: row.ended_at }),\n ...(row.duration_ms === null ? {} : { durationMs: row.duration_ms }),\n };\n}\n\nfunction messageParts(message: Message): StoredMessagePart[] {\n if (message.role === \"system\") {\n return [{ type: \"text\", value: { type: \"text\", text: message.content } }];\n }\n\n return message.content.map((content) => ({\n type: content.type,\n value: content,\n }));\n}\n\nfunction messageFromRows(row: MessageRow, partRows: MessagePartRow[]): Message {\n const parts = partRows.map((partRow) => JSON.parse(partRow.part_json) as unknown);\n\n if (row.role === \"system\") {\n return { role: \"system\", content: systemContentFromParts(parts) };\n }\n if (row.role === \"user\") {\n return {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n }\n if (row.role === \"assistant\") {\n return {\n role: \"assistant\",\n ...(row.message_id === null ? {} : { id: row.message_id }),\n content: parts as Extract<Message, { role: \"assistant\" }>[\"content\"],\n };\n }\n if (row.role === \"tool\") {\n return {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\n }\n\n throw new Error(`Unsupported stored message role: ${row.role}`);\n}\n\nfunction systemContentFromParts(parts: unknown[]): string {\n const first = parts[0];\n if (\n typeof first === \"object\" &&\n first !== null &&\n \"type\" in first &&\n first.type === \"text\" &&\n \"text\" in first &&\n typeof first.text === \"string\"\n ) {\n return first.text;\n }\n return \"\";\n}\n\nfunction guardAgainstLegacySessionSchema(db: DatabaseSyncType): void {\n const columns = db.prepare(\"PRAGMA table_info('anvia_studio_sessions')\").all() as TableInfoRow[];\n if (columns.some((column) => column.name === \"messages_json\")) {\n throw new Error(\n \"Existing Studio SQLite DB uses the legacy messages_json schema. Delete or recreate the Studio SQLite DB to use normalized session messages.\",\n );\n }\n}\n\nfunction loadDatabaseSync(): DatabaseSyncConstructor {\n if (DatabaseSync !== undefined) {\n return DatabaseSync;\n }\n\n try {\n ({ DatabaseSync } = createRequire(import.meta.url)(\n \"node:sqlite\",\n ) as typeof import(\"node:sqlite\"));\n return DatabaseSync;\n } catch (error) {\n throw new Error(\n \"The default Studio SQLite store requires Node.js with node:sqlite support. Provide custom Studio stores or disable persisted stores when running Studio in a runtime without node:sqlite.\",\n { cause: error },\n );\n }\n}\n\nfunction toTrace(row: TraceRow): StudioTrace {\n const trace = parseJsonValue<StudioTrace[\"trace\"]>(row.trace_json);\n const input = parseJsonValue<StudioTrace[\"input\"]>(row.input_json);\n return {\n ...toTraceSummary(row),\n ...(trace === undefined ? {} : { trace }),\n ...(input === undefined ? {} : { input }),\n observations: parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json),\n };\n}\n\nfunction toTraceSummary(row: TraceRow): StudioTraceSummary {\n const observations = parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json);\n const error = parseJsonValue<StudioTraceSummary[\"error\"]>(row.error_json);\n const usage = parseJsonValue<StudioTraceSummary[\"usage\"]>(row.usage_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n sessionId: row.session_id,\n ...(row.name === null ? {} : { name: row.name }),\n status: row.status,\n startedAt: row.started_at,\n ...(row.ended_at === null ? {} : { endedAt: row.ended_at }),\n ...(row.duration_ms === null ? {} : { durationMs: row.duration_ms }),\n ...(row.output === null ? {} : { output: row.output }),\n ...(error === undefined ? {} : { error }),\n ...(usage === undefined ? {} : { usage }),\n ...(metadata === undefined ? {} : { metadata }),\n observationCount: observations.length,\n };\n}\n\nfunction parseJsonArray<T>(value: string): T[] {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as T[]) : [];\n}\n\nfunction parseJsonValue<T>(value: string | null): T | undefined {\n if (value === null) {\n return undefined;\n }\n return JSON.parse(value) as T;\n}\n\nfunction renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n\nfunction studioRunId(context: MemoryContext): string | undefined {\n const value = context.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n if (\n error === null ||\n typeof error === \"string\" ||\n typeof error === \"number\" ||\n typeof error === \"boolean\"\n ) {\n return error;\n }\n return String(error);\n}\n\nfunction transcriptFromMessagesFallback(messages: Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\n }\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: \"tool_result\",\n callId: content.callId ?? content.id,\n result: content.content\n .map((item) =>\n \"text\" in item ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\n .join(\"\\n\"),\n structuredResult: content.content,\n });\n }\n continue;\n }\n\n for (const content of message.content) {\n if (content.type === \"text\") {\n appendAssistantTranscriptText(transcript, content.text);\n } else if (content.type === \"reasoning\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"reasoning\",\n ...(content.id === undefined ? {} : { reasoningId: content.id }),\n text: content.text,\n });\n } else if (content.type === \"tool_call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: content.function.name,\n callId: content.callId ?? content.id,\n args: formatJson(content.function.arguments),\n });\n }\n }\n }\n return transcript;\n}\n\nfunction appendAssistantTranscriptText(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\") {\n last.text = `${last.text}${text}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n });\n}\n\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function toJsonValue(value: unknown): JsonValue {\n return toJsonValueInternal(value, new WeakSet<object>());\n}\n\nfunction toJsonValueInternal(value: unknown, seen: WeakSet<object>): JsonValue {\n if (\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 if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return value.map((item) => toJsonValueInternal(item, seen));\n } finally {\n seen.delete(value);\n }\n }\n if (typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return compactJsonObjectInternal(value as Record<string, unknown>, seen);\n } finally {\n seen.delete(value);\n }\n }\n return String(value);\n}\n\nexport function compactJsonObject(values: Record<string, unknown>): JsonObject {\n return compactJsonObjectInternal(values, new WeakSet<object>());\n}\n\nfunction compactJsonObjectInternal(\n values: Record<string, unknown>,\n seen: WeakSet<object>,\n): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValueInternal(value, seen)]],\n );\n return Object.fromEntries(entries) as JsonObject;\n}\n\nexport function serializeUnknown(error: unknown): JsonValue {\n if (error instanceof Error) {\n return compactJsonObject({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n }\n return toJsonValue(error);\n}\n","import { type AnyTool, ToolSet } from \"@anvia/core/tool\";\nimport type { StudioAgent, StudioAgentToolApprovalMetadata, StudioAgentToolSource } from \"../types\";\n\nexport type AgentToolItem = {\n tool: AnyTool;\n source: StudioAgentToolSource;\n};\n\nconst MCP_TOOL_METADATA_KEY = Symbol.for(\"anvia.mcp.tool.metadata\");\n\nexport function agentToolItems(agent: StudioAgent): AgentToolItem[] {\n return [\n ...agent.agent.toolSet.values().map((tool) => ({ tool, source: \"static\" as const })),\n ...agent.agent.dynamicTools.flatMap((registration) => {\n const maybeToolSet = (registration.index as { toolSet?: unknown }).toolSet;\n if (!(maybeToolSet instanceof ToolSet)) {\n return [];\n }\n return maybeToolSet.values().map((tool) => ({ tool, source: \"dynamic\" as const }));\n }),\n ];\n}\n\nexport function approvalMetadata(tool: AnyTool): StudioAgentToolApprovalMetadata {\n const approval = tool.approval;\n if (approval === undefined || typeof approval !== \"object\" || approval === null) {\n return { required: false };\n }\n\n const policy = approval as {\n reason?: unknown;\n rejectMessage?: unknown;\n };\n return {\n required: true,\n ...(typeof policy.reason === \"string\" ? { reason: policy.reason } : {}),\n ...(typeof policy.rejectMessage === \"string\" ? { rejectMessage: policy.rejectMessage } : {}),\n };\n}\n\nexport function mcpServerName(tool: AnyTool): string | undefined {\n const metadata = (tool as { [MCP_TOOL_METADATA_KEY]?: unknown })[MCP_TOOL_METADATA_KEY];\n if (typeof metadata !== \"object\" || metadata === null) {\n return undefined;\n }\n const serverName = (metadata as { serverName?: unknown }).serverName;\n return typeof serverName === \"string\" && serverName.length > 0 ? serverName : undefined;\n}\n\nexport function agentHasMcpTools(agent: StudioAgent): boolean {\n return agentToolItems(agent).some(({ tool }) => mcpServerName(tool) !== undefined);\n}\n","import type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { AgentTraceOptions } from \"@anvia/core/observability\";\nimport type { Context } from \"hono\";\nimport { createInMemoryStudioStore } from \"../storage/memory-store\";\nimport { createSqliteSessionStore } from \"../storage/sqlite-store\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioAgentRuntimeSummary,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioErrorCode,\n StudioErrorResponse,\n StudioEvalSuite,\n StudioEvalSuiteConfig,\n StudioPipeline,\n StudioPipelineConfig,\n StudioPipelineLogStore,\n StudioPipelineRunStore,\n StudioSessionStore,\n StudioStores,\n StudioTraceStatus,\n StudioTraceStore,\n StudioUiOptions,\n} from \"../types\";\nimport { toJsonValue } from \"./json\";\nimport { agentHasMcpTools, agentToolItems, mcpServerName } from \"./tool-metadata\";\n\nexport type ResolvedStores = {\n sessions?: StudioSessionStore;\n traces?: StudioTraceStore;\n pipelineLogs?: StudioPipelineLogStore;\n pipelineRuns?: StudioPipelineRunStore;\n};\n\nexport type StudioRuntimeOptions = {\n id?: string;\n name?: string;\n description?: string;\n version?: string;\n agents: StudioAgent[];\n pipelines: StudioPipeline[];\n evals: StudioEvalSuite[];\n stores?: StudioStores;\n ui?: boolean | StudioUiOptions;\n};\n\nexport function resolveStores(options: StudioRuntimeOptions): ResolvedStores {\n const defaultStore = defaultStudioStore();\n const sessions = resolveSessionStore(options, defaultStore);\n const traces = resolveTraceStore(options, sessions, defaultStore);\n const pipelineLogs = resolvePipelineLogStore(options, sessions, defaultStore);\n const pipelineRuns = resolvePipelineRunStore(options, sessions, pipelineLogs, defaultStore);\n return {\n ...(sessions === undefined ? {} : { sessions }),\n ...(traces === undefined ? {} : { traces }),\n ...(pipelineLogs === undefined ? {} : { pipelineLogs }),\n ...(pipelineRuns === undefined ? {} : { pipelineRuns }),\n };\n}\n\nfunction defaultStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n const sqlitePath = process.env.ANVIA_STUDIO_DB ?? process.env.AION_STUDIO_DB;\n return sqlitePath === undefined\n ? createInMemoryStudioStore()\n : createSqliteSessionStore({ path: sqlitePath });\n}\n\nfunction resolveSessionStore(\n options: StudioRuntimeOptions,\n defaultStore: StudioSessionStore,\n): StudioSessionStore | undefined {\n if (options.stores?.sessions === false) {\n return undefined;\n }\n if (options.stores?.sessions !== undefined) {\n return options.stores.sessions;\n }\n\n return defaultStore;\n}\n\nfunction resolveTraceStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioTraceStore,\n): StudioTraceStore | undefined {\n if (options.stores?.traces !== undefined) {\n return options.stores.traces;\n }\n if (sessionStore === undefined) {\n return undefined;\n }\n if (isTraceStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineLogStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioPipelineLogStore,\n): StudioPipelineLogStore | undefined {\n if (options.stores?.pipelineLogs === false) {\n return undefined;\n }\n if (options.stores?.pipelineLogs !== undefined) {\n return options.stores.pipelineLogs;\n }\n if (sessionStore !== undefined && isPipelineLogStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineRunStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n pipelineLogStore: StudioPipelineLogStore | undefined,\n defaultStore: StudioPipelineRunStore,\n): StudioPipelineRunStore | undefined {\n if (options.stores?.pipelineRuns === false) {\n return undefined;\n }\n if (options.stores?.pipelineRuns !== undefined) {\n return options.stores.pipelineRuns;\n }\n if (sessionStore !== undefined && isPipelineRunStore(sessionStore)) {\n return sessionStore;\n }\n if (pipelineLogStore !== undefined && isPipelineRunStore(pipelineLogStore)) {\n return pipelineLogStore;\n }\n return defaultStore;\n}\n\nfunction isTraceStore(store: StudioSessionStore): store is StudioSessionStore & StudioTraceStore {\n const candidate = store as Partial<StudioTraceStore>;\n return (\n typeof candidate.listSessionTraces === \"function\" &&\n typeof candidate.getTrace === \"function\" &&\n typeof candidate.saveTrace === \"function\"\n );\n}\n\nfunction isPipelineLogStore(\n store: StudioSessionStore,\n): store is StudioSessionStore & StudioPipelineLogStore {\n const candidate = store as Partial<StudioPipelineLogStore>;\n return (\n typeof candidate.appendPipelineLog === \"function\" &&\n typeof candidate.listPipelineLogs === \"function\"\n );\n}\n\nfunction isPipelineRunStore(store: object): store is object & StudioPipelineRunStore {\n const candidate = store as Partial<StudioPipelineRunStore>;\n return (\n typeof candidate.savePipelineRun === \"function\" &&\n typeof candidate.listPipelineRuns === \"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 normalizePipelines(pipelines: StudioPipeline[]): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = pipeline.id.trim();\n if (id.length === 0) {\n throw new Error(\"Studio pipeline id cannot be empty\");\n }\n if (ids.has(id)) {\n throw new Error(`Duplicate Studio pipeline id: ${id}`);\n }\n ids.add(id);\n return { ...pipeline, id };\n });\n}\n\nexport function buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\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 pipelines: pipelines.map(pipelineConfig),\n evals: options.evals.map(evalConfig),\n chat: {\n quickPrompts: Object.fromEntries(agents.map((agent) => [agent.id, agent.quickPrompts ?? []])),\n },\n capabilities: capabilityConfig(options, agents, pipelines, stores),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n };\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 agentRuntimeSummary(agent: StudioAgent): StudioAgentRuntimeSummary {\n const tools = agentToolItems(agent);\n const name = agent.name ?? agent.agent.name;\n const description = agent.description ?? agent.agent.description;\n return {\n id: agent.id,\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n model: toJsonValue(agent.agent.model),\n toolCount: tools.length,\n staticToolCount: tools.filter((item) => item.source === \"static\").length,\n dynamicToolCount: tools.filter((item) => item.source === \"dynamic\").length,\n approvalToolCount: tools.filter((item) => item.tool.approval !== undefined).length,\n mcpToolCount: tools.filter((item) => mcpServerName(item.tool) !== undefined).length,\n staticContextCount: agent.agent.staticContext.length,\n dynamicContextCount: agent.agent.dynamicContexts.length,\n observerCount: agent.agent.observers.length,\n hasMemory: agent.agent.memory !== undefined,\n hasHook: agent.agent.hook !== undefined,\n hasOutputSchema: agent.agent.outputSchema !== undefined,\n ...(agent.agent.defaultMaxTurns === undefined\n ? {}\n : { defaultMaxTurns: agent.agent.defaultMaxTurns }),\n ...(agent.metadata === undefined ? {} : { metadata: agent.metadata }),\n };\n}\n\nexport function pipelineConfig(pipeline: StudioPipeline): StudioPipelineConfig {\n const graph = pipeline.pipeline.graph();\n const stageNodes = graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\");\n return {\n id: pipeline.id,\n ...(pipeline.name === undefined ? {} : { name: pipeline.name }),\n ...(pipeline.description === undefined ? {} : { description: pipeline.description }),\n ...(pipeline.metadata === undefined ? {} : { metadata: pipeline.metadata }),\n stageCount: stageNodes.length,\n edgeCount: graph.edges.length,\n hasParallelStages: graph.nodes.some((node) => node.kind === \"parallel\"),\n agentCount: graph.nodes.filter((node) => node.kind === \"agent\").length,\n extractorCount: graph.nodes.filter((node) => node.kind === \"extractor\").length,\n };\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n): Partial<Record<StudioCapability, StudioCapabilityConfig>> {\n const capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>> = {\n agents: { enabled: true },\n observability: { enabled: true },\n status: { enabled: true },\n };\n\n if (stores.sessions !== undefined) {\n capabilities.sessions = { enabled: true };\n capabilities.memory = { enabled: true };\n }\n if (stores.traces !== undefined) {\n capabilities.traces = { enabled: true };\n }\n if (pipelines.length > 0) {\n capabilities.pipelines = { enabled: true };\n }\n if (_options.evals.length > 0) {\n capabilities.evals = { enabled: true };\n }\n if (\n agents.some(\n (agent) => agent.agent.toolSet.values().length > 0 || agent.agent.dynamicTools.length > 0,\n )\n ) {\n capabilities.tools = { enabled: true };\n }\n if (agents.some(agentHasMcpTools)) {\n capabilities.mcps = { enabled: true };\n }\n\n if (\n agents.some(\n (agent) =>\n agent.agent.hook !== undefined ||\n agent.agent.toolSet.values().some((tool) => tool.approval),\n )\n ) {\n capabilities.approvals = { enabled: true };\n }\n if (\n agents.some(\n (agent) =>\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0,\n )\n ) {\n capabilities.knowledge = { enabled: true };\n }\n return capabilities;\n}\n\nexport function evalConfig(suite: StudioEvalSuite): StudioEvalSuiteConfig {\n return {\n id: suite.id ?? suite.name,\n name: suite.name,\n ...(suite.description === undefined ? {} : { description: suite.description }),\n caseCount: suite.cases.length,\n metricNames: suite.metrics.map((metric) => metric.name),\n ...(suite.concurrency === undefined ? {} : { concurrency: suite.concurrency }),\n ...(suite.metadata === undefined ? {} : { metadata: suite.metadata }),\n };\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 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 { runEvalSuite } from \"@anvia/core/evals\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioEvalRunRequest, StudioEvalRunResponse, StudioEvalSuite } from \"../types\";\nimport { toJsonValue } from \"./json\";\nimport { errorResponse, evalConfig, isJsonObject, isObject, isPositiveInteger } from \"./shared\";\n\nexport function registerEvalRoutes(\n app: Hono,\n props: {\n evals: StudioEvalSuite[];\n evalMap: Map<string, StudioEvalSuite>;\n },\n): void {\n app.get(\"/evals\", (c) =>\n c.json({\n evals: props.evals.map(evalConfig),\n }),\n );\n\n app.get(\"/evals/:evalId\", (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n return c.json(evalConfig(suite));\n });\n\n app.post(\"/evals/:evalId/runs\", async (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n\n const body = await parseEvalRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const result = await runEvalSuite({\n ...suite,\n ...(body.concurrency === undefined ? {} : { concurrency: body.concurrency }),\n });\n const endedAt = Date.now();\n const jsonResult = toJsonValue(result);\n const response: StudioEvalRunResponse = {\n runId,\n suiteId: suite.id ?? suite.name,\n startedAt: new Date(startedAt).toISOString(),\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n result: isJsonObject(jsonResult) ? jsonResult : { value: jsonResult },\n };\n return c.json(response);\n });\n}\n\nasync function parseEvalRunRequest(\n c: Context,\n): Promise<StudioEvalRunRequest | { error: Response }> {\n let body: unknown = {};\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioEvalRunRequest = {};\n if (\"concurrency\" in body) {\n if (!isPositiveInteger(body.concurrency)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"concurrency must be a positive integer\"),\n };\n }\n request.concurrency = body.concurrency;\n }\n return request;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentKnowledgeConfig,\n StudioKnowledgeEvidence,\n StudioKnowledgeEvidenceDocument,\n StudioKnowledgeItem,\n StudioKnowledgeItemsPage,\n StudioKnowledgeSourceKind,\n StudioKnowledgeSourceSummary,\n StudioKnowledgeSummary,\n StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { compactJsonObject, toJsonValue } from \"./json\";\nimport { errorResponse, optionalQueryString, parseLimit } from \"./shared\";\n\ntype InspectableIndex = {\n inspect?: (request: { limit: number; cursor?: string | undefined; filter?: unknown }) => Promise<{\n items: Array<{ id: string; document: unknown; metadata?: Record<string, unknown> }>;\n nextCursor?: string | undefined;\n totalCount?: number | undefined;\n }>;\n};\n\nexport function registerKnowledgeRoutes(\n app: Hono,\n props: {\n agents: StudioAgent[];\n traceStore?: StudioTraceStore;\n },\n): void {\n app.get(\"/knowledge\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const summary: StudioKnowledgeSummary = {\n agents: await Promise.all(props.agents.map(agentKnowledgeConfig)),\n evidence: await recentKnowledgeEvidence(props.traceStore, limit),\n };\n return c.json(summary);\n });\n\n app.get(\"/knowledge/items\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sourceId = optionalQueryString(c.req.query(\"sourceId\"));\n if (agentId === undefined || sourceId === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"agentId and sourceId are required\");\n }\n\n const agent = props.agents.find((item) => item.id === agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const page = await knowledgeItemsPage(agent, sourceId, {\n limit,\n cursor: optionalQueryString(c.req.query(\"cursor\")),\n });\n if (page === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Knowledge source not found\");\n }\n\n return c.json(page);\n });\n}\n\nexport function agentHasKnowledge(agent: StudioAgent): boolean {\n return (\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0\n );\n}\n\nasync function agentKnowledgeConfig(agent: StudioAgent): Promise<StudioAgentKnowledgeConfig> {\n const agentName = agent.name ?? agent.agent.name;\n return {\n agentId: agent.id,\n ...(agentName === undefined ? {} : { agentName }),\n sources: await knowledgeSources(agent),\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 knowledgeSources(agent: StudioAgent): Promise<StudioKnowledgeSourceSummary[]> {\n const sources: StudioKnowledgeSourceSummary[] = [\n {\n sourceId: staticSourceId(),\n kind: \"static_context\",\n label: \"Static context\",\n count: agent.agent.staticContext.length,\n inspectable: true,\n itemCount: agent.agent.staticContext.length,\n },\n ];\n\n const dynamicContextSources = await Promise.all(\n agent.agent.dynamicContexts.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.filter);\n return {\n sourceId: dynamicContextSourceId(index),\n kind: \"dynamic_context\" as const,\n label: `Dynamic context ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...(registration.options.threshold === undefined\n ? {}\n : { threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...(count === undefined ? {} : { itemCount: count }),\n };\n }),\n );\n\n const dynamicToolSources = await Promise.all(\n agent.agent.dynamicTools.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.filter);\n return {\n sourceId: dynamicToolsSourceId(index),\n kind: \"dynamic_tools\" as const,\n label: `Dynamic tools ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...(registration.options.threshold === undefined\n ? {}\n : { threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...(count === undefined ? {} : { itemCount: count }),\n };\n }),\n );\n\n return [...sources, ...dynamicContextSources, ...dynamicToolSources];\n}\n\nasync function inspectableCount(\n inspect: InspectableIndex[\"inspect\"] | undefined,\n filter?: unknown,\n): Promise<number | undefined> {\n if (inspect === undefined) {\n return undefined;\n }\n const page = await inspect({ limit: 1, filter });\n return page.totalCount;\n}\n\nasync function knowledgeItemsPage(\n agent: StudioAgent,\n sourceId: string,\n request: { limit: number; cursor?: string | undefined },\n): Promise<StudioKnowledgeItemsPage | undefined> {\n if (sourceId === staticSourceId()) {\n return staticKnowledgeItemsPage(agent, request);\n }\n\n const dynamicContextIndex = dynamicSourceIndex(sourceId, \"dynamic_context\");\n if (dynamicContextIndex !== undefined) {\n const registration = agent.agent.dynamicContexts[dynamicContextIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_context\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: registration.options.filter,\n });\n return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_context\",\n inspectable: true,\n items: page.items.map((item) => dynamicContextItem(item)),\n ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),\n ...(page.totalCount === undefined ? {} : { totalCount: page.totalCount }),\n };\n }\n\n const dynamicToolsIndex = dynamicSourceIndex(sourceId, \"dynamic_tools\");\n if (dynamicToolsIndex !== undefined) {\n const registration = agent.agent.dynamicTools[dynamicToolsIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_tools\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: registration.options.filter,\n });\n return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_tools\",\n inspectable: true,\n items: page.items.map((item) => dynamicToolItem(item)),\n ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),\n ...(page.totalCount === undefined ? {} : { totalCount: page.totalCount }),\n };\n }\n\n return undefined;\n}\n\nfunction inspectFn(index: unknown): InspectableIndex[\"inspect\"] | undefined {\n if (!isRecord(index) || typeof index.inspect !== \"function\") {\n return undefined;\n }\n const inspect = index.inspect;\n return (request) =>\n inspect.call(index, request) as ReturnType<NonNullable<InspectableIndex[\"inspect\"]>>;\n}\n\nfunction staticKnowledgeItemsPage(\n agent: StudioAgent,\n request: { limit: number; cursor?: string | undefined },\n): StudioKnowledgeItemsPage {\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const page = agent.agent.staticContext.slice(start, start + request.limit);\n const nextOffset = start + page.length;\n return {\n agentId: agent.id,\n sourceId: staticSourceId(),\n kind: \"static_context\",\n inspectable: true,\n items: page.map((document) => ({\n id: document.id,\n kind: \"static_context\",\n text: document.text,\n ...(document.additionalProps === undefined\n ? {}\n : { metadata: jsonObjectFromRecord(document.additionalProps) }),\n })),\n ...(nextOffset < agent.agent.staticContext.length ? { nextCursor: String(nextOffset) } : {}),\n totalCount: agent.agent.staticContext.length,\n };\n}\n\nfunction nonInspectablePage(\n agentId: string,\n sourceId: string,\n kind: StudioKnowledgeSourceKind,\n): StudioKnowledgeItemsPage {\n return {\n agentId,\n sourceId,\n kind,\n inspectable: false,\n items: [],\n message: \"This source can be searched at runtime, but it does not expose browseable chunks.\",\n };\n}\n\nfunction dynamicContextItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const text =\n isRecord(item.document) && typeof item.document.text === \"string\"\n ? item.document.text\n : typeof item.document === \"string\"\n ? item.document\n : undefined;\n return {\n id: item.id,\n kind: \"dynamic_context\",\n ...(text === undefined ? { document: toJsonValue(item.document) } : { text }),\n ...(item.metadata === undefined ? {} : { metadata: jsonObjectFromRecord(item.metadata) }),\n };\n}\n\nfunction dynamicToolItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const document = isRecord(item.document) ? item.document : {};\n const definition = isRecord(document.definition) ? document.definition : {};\n const toolName =\n typeof document.toolName === \"string\"\n ? document.toolName\n : typeof definition.name === \"string\"\n ? definition.name\n : item.id;\n const description = typeof definition.description === \"string\" ? definition.description : \"\";\n return {\n id: item.id,\n kind: \"dynamic_tool\",\n toolName,\n description,\n parameterKeys: parameterKeys(definition.parameters),\n document: toJsonValue(item.document),\n ...(item.metadata === undefined ? {} : { metadata: jsonObjectFromRecord(item.metadata) }),\n };\n}\n\nfunction parameterKeys(parameters: unknown): string[] {\n if (!isRecord(parameters) || !isRecord(parameters.properties)) {\n return [];\n }\n return Object.keys(parameters.properties);\n}\n\nfunction staticSourceId(): string {\n return \"static-context\";\n}\n\nfunction dynamicContextSourceId(index: number): string {\n return `dynamic-context-${index}`;\n}\n\nfunction dynamicToolsSourceId(index: number): string {\n return `dynamic-tools-${index}`;\n}\n\nfunction dynamicSourceIndex(\n sourceId: string,\n kind: \"dynamic_context\" | \"dynamic_tools\",\n): number | undefined {\n const prefix = kind === \"dynamic_context\" ? \"dynamic-context-\" : \"dynamic-tools-\";\n if (!sourceId.startsWith(prefix)) {\n return undefined;\n }\n const index = Number(sourceId.slice(prefix.length));\n return Number.isInteger(index) && index >= 0 ? index : undefined;\n}\n\nasync function recentKnowledgeEvidence(\n traceStore: StudioTraceStore | undefined,\n limit: number,\n): Promise<StudioKnowledgeEvidence[]> {\n if (traceStore?.listTraces === undefined) {\n return [];\n }\n\n const store = traceStore;\n const listTraces = store.listTraces;\n if (listTraces === undefined) {\n return [];\n }\n const summaries = await listTraces.call(store, { limit });\n const traces = await Promise.all(\n summaries.map((summary) => Promise.resolve(store.getTrace(summary.id)).catch(() => undefined)),\n );\n return traces.flatMap((trace: StudioTrace | undefined) =>\n trace === undefined ? [] : evidenceFromTrace(trace),\n );\n}\n\nfunction evidenceFromTrace(trace: StudioTrace): StudioKnowledgeEvidence[] {\n return trace.observations.flatMap((observation) => {\n if (observation.kind !== \"generation\" || !isRecord(observation.input)) {\n return [];\n }\n\n const documents = Array.isArray(observation.input.documents)\n ? observation.input.documents.flatMap((document) => evidenceDocument(document))\n : [];\n const tools = Array.isArray(observation.input.tools)\n ? observation.input.tools.flatMap((tool) => evidenceToolName(tool))\n : [];\n if (documents.length === 0 && tools.length === 0) {\n return [];\n }\n\n const query = queryFromGenerationInput(observation.input);\n return [\n {\n traceId: trace.id,\n sessionId: trace.sessionId,\n observationId: observation.id,\n observationName: observation.name,\n turn: observation.turn,\n startedAt: observation.startedAt,\n ...(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 { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentMcpServerMetadata,\n StudioAgentMcpToolMetadata,\n} from \"../types\";\nimport { errorResponse } from \"./shared\";\nimport { agentToolItems, mcpServerName } from \"./tool-metadata\";\n\nexport function registerMcpRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/mcps\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n servers: await agentMcpMetadata(agent),\n });\n });\n}\n\nexport async function agentMcpMetadata(\n agent: StudioAgent,\n): Promise<StudioAgentMcpServerMetadata[]> {\n const servers = new Map<string, StudioAgentMcpToolMetadata[]>();\n const seen = new Set<string>();\n\n for (const { tool, source } of agentToolItems(agent)) {\n const serverName = mcpServerName(tool);\n if (serverName === undefined) {\n continue;\n }\n\n const definition = await tool.definition(\"\");\n const key = `${serverName}:${source}:${definition.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const tools = servers.get(serverName) ?? [];\n tools.push({\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n });\n servers.set(serverName, tools);\n }\n\n return [...servers.entries()]\n .map(([name, tools]) => {\n const sortedTools = tools.sort((left, right) => {\n if (left.source !== right.source) {\n return left.source === \"static\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n return {\n agentId: agent.id,\n name,\n toolCount: sortedTools.length,\n tools: sortedTools,\n };\n })\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioMemoryConversationMessages,\n StudioMemoryConversationSteps,\n StudioMemoryConversationSummary,\n StudioMemoryConversationsPage,\n StudioMemoryUsersPage,\n StudioSession,\n StudioSessionStore,\n StudioSessionSummary,\n} from \"../types\";\nimport { errorResponse, optionalQueryString, parseLimit } from \"./shared\";\n\nconst DEFAULT_USER_ID = \"default\";\n\nexport function registerMemoryRoutes(\n app: Hono,\n props: {\n sessionStore: StudioSessionStore;\n },\n): void {\n app.get(\"/memory/users\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const sessions = await props.sessionStore.listSessions({ limit: 100 });\n const users = new Map<string, StudioMemoryUsersPage[\"users\"][number]>();\n for (const session of sessions) {\n const userId = sessionUserId(session);\n const existing = users.get(userId);\n if (existing === undefined) {\n users.set(userId, {\n userId,\n conversationCount: 1,\n agentIds: [session.agentId],\n lastInteractionAt: session.updatedAt,\n });\n continue;\n }\n existing.conversationCount += 1;\n if (!existing.agentIds.includes(session.agentId)) {\n existing.agentIds.push(session.agentId);\n }\n if (new Date(session.updatedAt).getTime() > new Date(existing.lastInteractionAt).getTime()) {\n existing.lastInteractionAt = session.updatedAt;\n }\n }\n\n const page = [...users.values()]\n .sort(\n (left, right) =>\n new Date(right.lastInteractionAt).getTime() - new Date(left.lastInteractionAt).getTime(),\n )\n .slice(0, limit);\n return c.json({ users: page, total: users.size } satisfies StudioMemoryUsersPage);\n });\n\n app.get(\"/memory/conversations\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const userId = optionalQueryString(c.req.query(\"userId\"));\n const sessions = await props.sessionStore.listSessions({\n ...(agentId === undefined ? {} : { agentId }),\n limit: 100,\n });\n const conversations = sessions\n .map(memoryConversationSummary)\n .filter((session) => userId === undefined || session.userId === userId)\n .slice(0, limit);\n\n return c.json({\n conversations,\n total: conversations.length,\n } satisfies StudioMemoryConversationsPage);\n });\n\n app.get(\"/memory/conversations/:conversationId/messages\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n messages: session.messages,\n transcript: session.transcript,\n } satisfies StudioMemoryConversationMessages);\n });\n\n app.get(\"/memory/conversations/:conversationId/steps\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n steps: session.transcript,\n } satisfies StudioMemoryConversationSteps);\n });\n}\n\nfunction memoryConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemoryConversationSummary {\n return {\n id: session.id,\n userId: sessionUserId(session),\n agentId: session.agentId,\n ...(session.title === undefined ? {} : { title: session.title }),\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n ...(session.metadata === undefined ? {} : { metadata: session.metadata }),\n };\n}\n\nfunction sessionUserId(session: Pick<StudioSession, \"metadata\">): string {\n const userId = session.metadata?.userId;\n return typeof userId === \"string\" && userId.trim().length > 0 ? userId : DEFAULT_USER_ID;\n}\n","import type { Hono } from \"hono\";\nimport { stream as streamResponse } from \"hono/streaming\";\nimport type {\n StudioObservabilityEvent,\n StudioObservabilityEventType,\n StudioPipelineLogStore,\n StudioSessionStore,\n StudioTrace,\n StudioTraceStore,\n StudioTraceSummary,\n} from \"../types\";\nimport type { ResolvedStores } from \"./shared\";\n\ntype ObservabilitySubscription = {\n close: () => void;\n next: () => Promise<IteratorResult<StudioObservabilityEvent>>;\n push: (event: StudioObservabilityEvent) => void;\n};\n\nconst defaultBufferSize = 1000;\n\nexport class StudioObservabilityHub {\n private readonly subscriptions = new Set<ObservabilitySubscription>();\n\n emit(event: StudioObservabilityEvent): void {\n for (const subscription of this.subscriptions) {\n subscription.push(event);\n }\n }\n\n subscribe(\n options: { types?: Set<StudioObservabilityEventType> } = {},\n ): ObservabilitySubscription {\n const subscription = createSubscription(options.types);\n this.subscriptions.add(subscription);\n return {\n close: () => {\n subscription.close();\n this.subscriptions.delete(subscription);\n },\n next: subscription.next,\n push: subscription.push,\n };\n }\n}\n\nexport function observeStores(stores: ResolvedStores, hub: StudioObservabilityHub): ResolvedStores {\n return {\n ...stores,\n ...(stores.sessions === undefined\n ? {}\n : { sessions: observeSessionStore(stores.sessions, hub) }),\n ...(stores.traces === undefined ? {} : { traces: observeTraceStore(stores.traces, hub) }),\n ...(stores.pipelineLogs === undefined\n ? {}\n : { pipelineLogs: observePipelineLogStore(stores.pipelineLogs, hub) }),\n };\n}\n\nexport function registerObservabilityRoutes(app: Hono, hub: StudioObservabilityHub): void {\n app.get(\"/observability/events\", (c) => {\n const types = parseEventTypes(c.req.query(\"type\"));\n if (types === false) {\n return c.json(\n {\n error: {\n code: \"bad_request\",\n message: \"type must include session_log, pipeline_log, or trace\",\n },\n },\n 400,\n );\n }\n\n 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(c, async (stream) => {\n const subscription = hub.subscribe(types === undefined ? {} : { types });\n try {\n while (true) {\n const next = await subscription.next();\n if (next.done === true) {\n break;\n }\n await stream.write(`${JSON.stringify(next.value)}\\n`);\n }\n } finally {\n subscription.close();\n }\n });\n });\n}\n\nfunction createSubscription(\n types: Set<StudioObservabilityEventType> | undefined,\n): ObservabilitySubscription {\n const values: StudioObservabilityEvent[] = [];\n const resolvers: Array<(value: IteratorResult<StudioObservabilityEvent>) => void> = [];\n let closed = false;\n\n return {\n close() {\n closed = true;\n for (const resolve of resolvers.splice(0)) {\n resolve({ done: true, value: undefined });\n }\n },\n next() {\n const value = values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => resolvers.push(resolve));\n },\n push(event) {\n if (closed || (types !== undefined && !types.has(event.type))) {\n return;\n }\n const resolve = resolvers.shift();\n if (resolve !== undefined) {\n resolve({ done: false, value: event });\n return;\n }\n if (values.length >= defaultBufferSize) {\n values.shift();\n }\n values.push(event);\n },\n };\n}\n\nfunction observeSessionStore(\n store: StudioSessionStore,\n hub: StudioObservabilityHub,\n): StudioSessionStore {\n return new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendSessionLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendSessionLog = target.appendSessionLog?.bind(target);\n if (appendSessionLog === undefined) {\n return undefined;\n }\n return async (...args: Parameters<NonNullable<StudioSessionStore[\"appendSessionLog\"]>>) => {\n const log = await appendSessionLog(...args);\n hub.emit({ type: \"session_log\", log });\n return log;\n };\n },\n });\n}\n\nfunction observePipelineLogStore(\n store: StudioPipelineLogStore,\n hub: StudioObservabilityHub,\n): StudioPipelineLogStore {\n return new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendPipelineLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendPipelineLog = target.appendPipelineLog.bind(target);\n return async (...args: Parameters<StudioPipelineLogStore[\"appendPipelineLog\"]>) => {\n const log = await appendPipelineLog(...args);\n hub.emit({ type: \"pipeline_log\", log });\n return log;\n };\n },\n });\n}\n\nfunction observeTraceStore(store: StudioTraceStore, hub: StudioObservabilityHub): StudioTraceStore {\n return new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"saveTrace\") {\n return boundProperty(target, property, receiver);\n }\n const saveTrace = target.saveTrace.bind(target);\n return async (...args: Parameters<StudioTraceStore[\"saveTrace\"]>) => {\n const trace = await saveTrace(...args);\n hub.emit({ type: \"trace\", trace: traceSummary(trace) });\n return trace;\n };\n },\n });\n}\n\nfunction boundProperty<T extends object>(\n target: T,\n property: string | symbol,\n receiver: unknown,\n): unknown {\n const value = Reflect.get(target, property, receiver);\n return typeof value === \"function\" ? value.bind(target) : value;\n}\n\nfunction parseEventTypes(\n value: string | undefined,\n): Set<StudioObservabilityEventType> | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n const types = new Set<StudioObservabilityEventType>();\n for (const type of value.split(\",\")) {\n const trimmed = type.trim();\n if (!isEventType(trimmed)) {\n return false;\n }\n types.add(trimmed);\n }\n return types;\n}\n\nfunction isEventType(value: string): value is StudioObservabilityEventType {\n return value === \"session_log\" || value === \"pipeline_log\" || value === \"trace\";\n}\n\nfunction traceSummary(trace: StudioTrace): StudioTraceSummary {\n return {\n id: trace.id,\n sessionId: trace.sessionId,\n ...(trace.name === undefined ? {} : { name: trace.name }),\n status: trace.status,\n startedAt: trace.startedAt,\n ...(trace.endedAt === undefined ? {} : { endedAt: trace.endedAt }),\n ...(trace.durationMs === undefined ? {} : { durationMs: trace.durationMs }),\n ...(trace.output === undefined ? {} : { output: trace.output }),\n ...(trace.error === undefined ? {} : { error: trace.error }),\n ...(trace.usage === undefined ? {} : { usage: trace.usage }),\n ...(trace.metadata === undefined ? {} : { metadata: trace.metadata }),\n observationCount: trace.observations.length,\n };\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type { PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type { Context, Hono } from \"hono\";\nimport { stream as streamResponse } from \"hono/streaming\";\nimport type {\n AgentRunStreamEvent,\n StudioPipeline,\n StudioPipelineDetail,\n StudioPipelineLogStore,\n StudioPipelineReplayRequest,\n StudioPipelineRunRequest,\n StudioPipelineRunResponse,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n} from \"../types\";\nimport {\n appendPipelineLog,\n emitPipelineLog,\n pipelineRunCompletedLog,\n pipelineRunFailedLog,\n pipelineRunReceivedLog,\n pipelineRunStartedLog,\n pipelineStageLog,\n} from \"./pipeline-logs\";\nimport { AsyncEventQueue } from \"./runs\";\nimport { errorResponse, isJsonObject, isObject, pipelineConfig, serializeError } from \"./shared\";\n\nexport function registerPipelineRoutes(\n app: Hono,\n props: {\n pipelines: StudioPipeline[];\n pipelineMap: Map<string, StudioPipeline>;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n): void {\n app.get(\"/pipelines\", (c) =>\n c.json({\n pipelines: props.pipelines.map(pipelineConfig),\n }),\n );\n\n app.get(\"/pipelines/:pipelineId\", (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n return c.json(pipelineDetail(pipeline));\n });\n\n app.get(\"/pipelines/:pipelineId/logs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.logStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.logs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"logs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parsePipelineLogAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const logs = await props.logStore.listPipelineLogs({\n pipelineId,\n limit,\n ...(after === undefined ? {} : { after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\n });\n\n app.get(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const runs = await props.runStore.listPipelineRuns({ pipelineId, limit });\n return c.json({ runs });\n });\n\n app.post(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n\n const body = await parsePipelineRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n return executePipelineRun(c, props, pipeline, body);\n });\n\n app.post(\"/pipelines/:pipelineId/runs/:runId/replay\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const body = await parsePipelineReplayRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const sourceRunId = c.req.param(\"runId\");\n const runs = await props.runStore.listPipelineRuns({\n pipelineId: pipeline.id,\n limit: 1000,\n });\n const sourceRun = runs.find((run) => run.runId === sourceRunId);\n if (sourceRun === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline run not found\");\n }\n if (sourceRun.status === \"running\") {\n return errorResponse(c, 409, \"conflict\", \"Cannot replay a running pipeline run\");\n }\n\n return executePipelineRun(c, props, pipeline, {\n input: sourceRun.input,\n ...(body.stream === undefined ? {} : { stream: body.stream }),\n metadata: replayMetadata(sourceRun.metadata, body.metadata, sourceRun.runId),\n });\n });\n}\n\nasync function executePipelineRun(\n c: Context,\n props: {\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n pipeline: StudioPipeline,\n body: StudioPipelineRunRequest,\n): Promise<Response> {\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const startedAtIso = new Date(startedAt).toISOString();\n await appendPipelineLog(\n props.logStore,\n pipelineRunReceivedLog({\n pipeline,\n runId,\n stream: body.stream === true,\n input: body.input,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"running\",\n input: body.input,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n startedAt: startedAtIso,\n });\n\n if (body.stream === true) {\n return streamPipelineRun(c, {\n pipeline,\n runId,\n input: body.input,\n startedAt,\n startedAtIso,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n ...(props.logStore === undefined ? {} : { logStore: props.logStore }),\n ...(props.runStore === undefined ? {} : { runStore: props.runStore }),\n });\n }\n\n try {\n await appendPipelineLog(props.logStore, pipelineRunStartedLog(pipeline, runId));\n const output = await pipeline.pipeline.run(body.input, {\n observer: {\n async onEvent(event) {\n await appendPipelineLog(props.logStore, pipelineStageLog(pipeline.id, runId, event));\n },\n },\n });\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"success\",\n input: body.input,\n output: jsonOutput,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\n await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: pipeline.id,\n runId,\n durationMs: endedAt - startedAt,\n output: jsonOutput,\n }),\n );\n const response: StudioPipelineRunResponse = {\n runId,\n pipelineId: pipeline.id,\n output: jsonOutput,\n };\n return c.json(response);\n } catch (error) {\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"error\",\n input: body.input,\n error: serializeError(error),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\n await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(pipeline.id, runId, error, startedAt),\n );\n return errorResponse(c, 500, \"internal_error\", \"Pipeline run failed\", serializeError(error));\n }\n}\n\nfunction pipelineDetail(pipeline: StudioPipeline): StudioPipelineDetail {\n const graph = pipeline.pipeline.graph();\n graph.id = pipeline.id;\n return {\n ...pipelineConfig(pipeline),\n graph,\n };\n}\n\nfunction streamPipelineRun(\n c: Context,\n props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n): Response {\n 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 pipelineRunEvents(props)) {\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\nasync function* pipelineRunEvents(props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitPipelineLog(props.logStore, pipelineRunStartedLog(props.pipeline, props.runId));\n\n const events = new AsyncEventQueue<AgentRunStreamEvent>();\n const run = props.pipeline.pipeline\n .run(props.input, {\n observer: {\n async onEvent(event: PipelineRunEvent) {\n const log = await appendPipelineLog(\n props.logStore,\n pipelineStageLog(props.pipeline.id, props.runId, event),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n },\n },\n })\n .then(async (output) => {\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"success\",\n input: props.input,\n output: jsonOutput,\n ...(props.metadata === undefined ? {} : { metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: props.pipeline.id,\n runId: props.runId,\n durationMs: endedAt - props.startedAt,\n output: jsonOutput,\n }),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({\n type: \"pipeline_final\",\n runId: props.runId,\n pipelineId: props.pipeline.id,\n output: jsonOutput,\n });\n })\n .catch(async (error) => {\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"error\",\n input: props.input,\n error: serializeError(error),\n ...(props.metadata === undefined ? {} : { metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(props.pipeline.id, props.runId, error, props.startedAt),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({ type: \"error\", error: serializeError(error) } as AgentRunStreamEvent);\n })\n .finally(() => events.close());\n\n try {\n while (true) {\n const next = await events.next();\n if (next.done === true) {\n break;\n }\n yield next.value;\n }\n } finally {\n await run;\n }\n}\n\nasync function savePipelineRun(\n store: StudioPipelineRunStore | undefined,\n input: StudioPipelineRunSaveInput,\n) {\n return store?.savePipelineRun(input);\n}\n\nasync function parsePipelineRunRequest(\n c: Context,\n): Promise<StudioPipelineRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n if (!(\"input\" in body) || !isJsonValue(body.input)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"input must be JSON-compatible\") };\n }\n\n const request: StudioPipelineRunRequest = {\n input: body.input,\n };\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nasync function parsePipelineReplayRequest(\n c: Context,\n): Promise<StudioPipelineReplayRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioPipelineReplayRequest = {};\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nfunction replayMetadata(\n sourceMetadata: JsonObject | undefined,\n requestMetadata: JsonObject | undefined,\n sourceRunId: string,\n): JsonObject {\n return {\n ...(sourceMetadata ?? {}),\n ...(requestMetadata ?? {}),\n replayOf: sourceRunId,\n };\n}\n\nfunction parsePipelineLogLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 200;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 1000);\n}\n\nfunction parsePipelineLogAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return Number.isFinite(value) || typeof value !== \"number\";\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (isObject(value)) {\n return Object.values(value).every((item) => item === undefined || isJsonValue(item));\n }\n return false;\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (isJsonValue(value)) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n try {\n const parsed = JSON.parse(JSON.stringify(value)) as unknown;\n return isJsonValue(parsed) ? parsed : String(value);\n } catch {\n return String(value);\n }\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { PipelineGraphNode, PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type {\n StudioPipeline,\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogStore,\n} from \"../types\";\nimport { serializeError } from \"./shared\";\n\nexport async function appendPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): Promise<StudioPipelineLogEntry | undefined> {\n return store?.appendPipelineLog(input);\n}\n\nexport async function* emitPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): AsyncIterable<{ type: \"pipeline_log\"; log: StudioPipelineLogEntry }> {\n const log = await appendPipelineLog(store, input);\n if (log !== undefined) {\n yield { type: \"pipeline_log\", log };\n }\n}\n\nexport function pipelineRunReceivedLog(props: {\n pipeline: StudioPipeline;\n runId: string;\n stream: boolean;\n input: unknown;\n metadata?: JsonObject;\n}): StudioPipelineLogAppendInput {\n return {\n pipelineId: props.pipeline.id,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"pipeline.run_received\",\n message: \"Pipeline run request received\",\n metadata: cleanMetadata({\n stream: props.stream,\n inputBytes: byteLength(formatUnknown(props.input)),\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\n };\n}\n\nexport function pipelineRunStartedLog(\n pipeline: StudioPipeline,\n runId: string,\n): StudioPipelineLogAppendInput {\n const graph = pipeline.pipeline.graph();\n return {\n pipelineId: pipeline.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_started\",\n message: \"Pipeline run started\",\n metadata: cleanMetadata({\n stageCount: graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\")\n .length,\n edgeCount: graph.edges.length,\n }),\n };\n}\n\nexport function pipelineRunCompletedLog(props: {\n pipelineId: string;\n runId: string;\n durationMs: number;\n output: unknown;\n}): StudioPipelineLogAppendInput {\n return {\n pipelineId: props.pipelineId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_completed\",\n message: \"Pipeline run completed\",\n metadata: cleanMetadata({\n durationMs: props.durationMs,\n outputBytes: byteLength(formatUnknown(props.output)),\n }),\n };\n}\n\nexport function pipelineRunFailedLog(\n pipelineId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioPipelineLogAppendInput {\n return {\n pipelineId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"pipeline.run_failed\",\n message: \"Pipeline run failed\",\n metadata: cleanMetadata({\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n }),\n };\n}\n\nexport function pipelineStageLog(\n pipelineId: string,\n runId: string,\n event: PipelineRunEvent,\n): StudioPipelineLogAppendInput {\n const category = stageCategory(event.node);\n if (event.type === \"stage_started\") {\n return {\n pipelineId,\n runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.started`,\n message: `${event.node.label} started`,\n metadata: nodeMetadata(event.node),\n };\n }\n if (event.type === \"stage_completed\") {\n return {\n pipelineId,\n runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.completed`,\n message: `${event.node.label} completed`,\n metadata: cleanMetadata({\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n }),\n };\n }\n return {\n pipelineId,\n runId,\n level: \"error\",\n category,\n event: `${event.node.kind}.failed`,\n message: `${event.node.label} failed`,\n metadata: cleanMetadata({\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n error: serializeError(event.error),\n }),\n };\n}\n\nfunction stageCategory(node: PipelineGraphNode): StudioPipelineLogAppendInput[\"category\"] {\n if (node.kind === \"parallel\" || node.kind === \"branch\") {\n return \"parallel\";\n }\n if (node.kind === \"agent\") {\n return \"agent\";\n }\n if (node.kind === \"extractor\") {\n return \"extractor\";\n }\n return \"stage\";\n}\n\nfunction nodeMetadata(node: PipelineGraphNode): JsonObject {\n return cleanMetadata({\n nodeId: node.id,\n kind: node.kind,\n label: node.label,\n agentId: node.agentId,\n pipelineId: node.pipelineId,\n branchKey: node.branchKey,\n });\n}\n\nfunction cleanMetadata(value: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined),\n ) as JsonObject;\n}\n\nfunction byteLength(value: string | undefined): number | undefined {\n return value === undefined ? undefined : new TextEncoder().encode(value).length;\n}\n\nfunction formatUnknown(value: unknown): string | undefined {\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n","import type { AgentStreamEvent } from \"@anvia/core/agent\";\nimport type { Message } from \"@anvia/core/completion\";\nimport type { AgentTraceOptions } from \"@anvia/core/observability\";\nimport type { Context } from \"hono\";\nimport { stream as streamResponse } from \"hono/streaming\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionStore,\n StudioTranscriptChildAgentEvent,\n StudioTranscriptEntry,\n} from \"../types\";\nimport {\n errorResponse,\n isAgentTraceOptions,\n isJsonObject,\n isMessage,\n isMessageInput,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n serializeError,\n} from \"./shared\";\n\nexport class AsyncEventQueue<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) {\n return;\n }\n const resolver = this.resolvers.shift();\n if (resolver !== undefined) {\n resolver({ done: false, value });\n return;\n }\n this.values.push(value);\n }\n\n close(): void {\n this.closed = true;\n for (const resolver of this.resolvers.splice(0)) {\n resolver({ done: true, value: undefined });\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n const value = this.values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (this.closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => this.resolvers.push(resolve));\n }\n}\n\nexport async function* mergeRunAndApprovalEvents(\n runEvents: AsyncIterable<AgentStreamEvent>,\n approvalEvents: AsyncEventQueue<AgentRunStreamEvent>,\n): AsyncIterable<AgentRunStreamEvent> {\n type TaggedNext =\n | { source: \"run\"; value: IteratorResult<AgentStreamEvent> }\n | { source: \"approval\"; value: IteratorResult<AgentRunStreamEvent> };\n const runIterator = runEvents[Symbol.asyncIterator]();\n let runDone = false;\n let runNext: Promise<IteratorResult<AgentStreamEvent>> | undefined = runIterator.next();\n let approvalNext: Promise<IteratorResult<AgentRunStreamEvent>> | undefined =\n approvalEvents.next();\n\n try {\n while (runNext !== undefined || approvalNext !== undefined) {\n const pending: Promise<TaggedNext>[] = [];\n if (runNext !== undefined) {\n pending.push(runNext.then((value) => ({ source: \"run\", value })));\n }\n if (approvalNext !== undefined) {\n pending.push(approvalNext.then((value) => ({ source: \"approval\", value })));\n }\n\n const result = await Promise.race(pending);\n\n if (result.source === \"run\") {\n if (result.value.done === true) {\n runDone = true;\n runNext = undefined;\n approvalEvents.close();\n } else {\n runNext = runIterator.next();\n yield result.value.value;\n }\n continue;\n }\n\n if (result.value.done === true) {\n approvalNext = undefined;\n } else {\n approvalNext = approvalEvents.next();\n yield result.value.value;\n }\n }\n } finally {\n if (!runDone && runIterator.return !== undefined) {\n await runIterator.return();\n }\n approvalEvents.close();\n }\n}\n\nexport function streamAgentRunEvents(\n c: Context,\n events: AsyncIterable<AgentRunStreamEvent>,\n): Response {\n c.header(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n c.header(\"cache-control\", \"no-cache, no-transform\");\n c.header(\"connection\", \"keep-alive\");\n c.header(\"transfer-encoding\", \"chunked\");\n c.header(\"x-accel-buffering\", \"no\");\n\n return streamResponse(\n c,\n async (stream) => {\n for await (const event of events) {\n await stream.write(`${JSON.stringify(event)}\\n`);\n }\n },\n async (error, stream) => {\n await stream.write(`${JSON.stringify({ type: \"error\", error: serializeError(error) })}\\n`);\n },\n );\n}\n\nexport function traceForRun(\n trace: AgentTraceOptions | undefined,\n agentId: string,\n session: StudioSession | undefined,\n): AgentTraceOptions {\n const metadata = {\n ...(trace?.metadata ?? {}),\n agentId,\n };\n return {\n ...(trace ?? {}),\n metadata,\n ...(trace?.sessionId !== undefined\n ? { sessionId: trace.sessionId }\n : session === undefined\n ? {}\n : { sessionId: session.id }),\n };\n}\n\nexport async function* persistStreamingSessionTranscript(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n runId: string;\n}): AsyncIterable<AgentRunStreamEvent> {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n const title = optionalTitle(props.message);\n\n await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"running\",\n });\n\n try {\n for await (const event of props.stream) {\n acceptTranscriptStreamEvent(transcript, event);\n\n const nextSession = await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: event.type === \"final\" ? \"success\" : event.type === \"error\" ? \"error\" : \"running\",\n ...(event.type === \"error\" ? { error: serializeError(event.error) } : {}),\n });\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\n\n yield event;\n }\n } catch (error) {\n await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"error\",\n error: serializeError(error),\n });\n throw error;\n }\n}\n\nfunction acceptTranscriptStreamEvent(\n transcript: StudioTranscriptEntry[],\n event: AgentRunStreamEvent,\n): void {\n if (event.type === \"text_delta\") {\n appendTranscriptAssistantText(transcript, event.delta);\n }\n if (event.type === \"reasoning_delta\") {\n appendTranscriptReasoningText(transcript, event.delta, event.id);\n }\n if (event.type === \"tool_call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolCall.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n args: formatJson(event.toolCall.function.arguments),\n });\n }\n if (event.type === \"tool_result\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n ...(event.toolCallId === undefined ? {} : { callId: event.toolCallId }),\n args: event.args,\n result: event.result,\n ...(event.structuredResult === undefined\n ? {}\n : { structuredResult: event.structuredResult }),\n });\n return;\n }\n matched.args = matched.args ?? event.args;\n matched.result = event.result;\n if (event.structuredResult !== undefined) {\n matched.structuredResult = event.structuredResult;\n }\n }\n if (event.type === \"agent_tool_event\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n ...(event.toolCallId === undefined ? {} : { callId: event.toolCallId }),\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\n });\n return;\n }\n appendChildAgentTranscriptEvent(matched, event);\n }\n if (event.type === \"tool_approval_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n matched.approval = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n };\n }\n }\n if (event.type === \"tool_approval_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n matched.approval = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n ...(event.approval.resolvedAt === undefined\n ? {}\n : { resolvedAt: event.approval.resolvedAt }),\n ...(event.approval.reason === undefined ? {} : { reason: event.approval.reason }),\n };\n }\n }\n if (event.type === \"tool_question_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n matched.question = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n questions: event.question.questions,\n };\n }\n }\n if (event.type === \"tool_question_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n matched.question = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n ...(event.question.answeredAt === undefined\n ? {}\n : { answeredAt: event.question.answeredAt }),\n questions: event.question.questions,\n ...(event.question.answers === undefined ? {} : { answers: event.question.answers }),\n };\n }\n }\n if (event.type === \"final\" && event.trace?.traceId !== undefined) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\n }\n}\n\nfunction approvalCallId(approval: { callId?: string; toolCallId?: string }): string | undefined {\n return approval.callId ?? approval.toolCallId;\n}\n\nfunction questionCallId(question: { callId?: string; toolCallId?: string }): string | undefined {\n return question.callId ?? question.toolCallId;\n}\n\nfunction appendChildAgentTranscriptEvent(\n entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }>,\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): void {\n const childEvent = childAgentTranscriptEvent(event);\n if (childEvent === undefined) {\n return;\n }\n const childEvents = entry.childEvents ?? [];\n if (childEvent.kind === \"message\") {\n const last = childEvents.at(-1);\n if (last?.kind === \"message\" && last.agentId === childEvent.agentId) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else if (childEvent.kind === \"reasoning\") {\n const last = childEvents.at(-1);\n if (\n last?.kind === \"reasoning\" &&\n last.agentId === childEvent.agentId &&\n (last.reasoningId ?? \"\") === (childEvent.reasoningId ?? \"\")\n ) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else {\n const matched = findChildAgentToolEvent(childEvents, childEvent);\n if (matched === undefined) {\n childEvents.push(childEvent);\n } else {\n if (matched.args === undefined && childEvent.args !== undefined) {\n matched.args = childEvent.args;\n }\n if (childEvent.result !== undefined) {\n matched.result = childEvent.result;\n }\n }\n }\n entry.childEvents = childEvents;\n}\n\nfunction childAgentTranscriptEvent(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): StudioTranscriptChildAgentEvent | undefined {\n const child = event.event;\n if (child.type === \"text_delta\") {\n return {\n kind: \"message\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n text: child.delta,\n };\n }\n if (child.type === \"reasoning_delta\") {\n return {\n kind: \"reasoning\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n ...(child.id === undefined ? {} : { reasoningId: child.id }),\n text: child.delta,\n };\n }\n if (child.type === \"tool_call\") {\n return {\n kind: \"tool\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n toolName: child.toolCall.function.name,\n ...(child.toolCall.callId === undefined && child.toolCall.id === undefined\n ? {}\n : { callId: child.toolCall.callId ?? child.toolCall.id }),\n args: formatJson(child.toolCall.function.arguments),\n };\n }\n if (child.type === \"tool_result\") {\n return {\n kind: \"tool\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n toolName: child.toolName,\n ...(child.toolCallId === undefined ? {} : { callId: child.toolCallId }),\n args: child.args,\n result: child.result,\n ...(child.structuredResult === undefined ? {} : { structuredResult: child.structuredResult }),\n };\n }\n if (child.type === \"error\") {\n return {\n kind: \"message\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n text: `Error: ${errorText(child.error)}`,\n };\n }\n return undefined;\n}\n\nfunction errorText(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return JSON.stringify(serializeError(error));\n}\n\nfunction findChildAgentToolEvent(\n childEvents: StudioTranscriptChildAgentEvent[],\n event: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }>,\n): Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> | undefined {\n for (let index = childEvents.length - 1; index >= 0; index -= 1) {\n const childEvent = childEvents[index];\n if (\n childEvent?.kind !== \"tool\" ||\n childEvent.agentId !== event.agentId ||\n childEvent.toolName !== event.toolName ||\n childEvent.result !== undefined\n ) {\n continue;\n }\n if (event.callId === undefined || childEvent.callId === event.callId) {\n return childEvent;\n }\n }\n return undefined;\n}\n\nexport function transcriptFromMessages(messages: Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\n }\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: \"tool_result\",\n callId: content.callId ?? content.id,\n result: content.content\n .map((item) =>\n \"text\" in item ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\n .join(\"\\n\"),\n structuredResult: content.content,\n });\n }\n continue;\n }\n\n for (const content of message.content) {\n if (content.type === \"text\") {\n 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) =>\n \"text\" in result ? result.text : `[image:${result.mediaType ?? \"image/png\"}]`,\n );\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 { createHook, type PromptHook } from \"@anvia/core/agent\";\nimport type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport { parseToolArgs } from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolQuestion,\n StudioToolQuestionAnswer,\n StudioToolQuestionChoice,\n StudioToolQuestionPrompt,\n StudioToolQuestionStatus,\n} from \"../types\";\nimport { errorResponse, 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 { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type {\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionStore,\n} from \"../types\";\nimport { serializeError } from \"./shared\";\n\nexport async function appendSessionLog(\n store: StudioSessionStore | undefined,\n input: StudioSessionLogAppendInput,\n): Promise<StudioSessionLogEntry | undefined> {\n return store?.appendSessionLog?.(input);\n}\n\nexport async function* streamSessionRunLogs(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n runId: string;\n startedAt: number;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitLog(props.store, runStartedLog(props.session, props.runId));\n yield* emitLog(props.store, memoryLoadedLog(props.session, props.runId));\n\n try {\n for await (const event of props.stream) {\n for (const input of logsFromStreamEvent({\n event,\n runId: props.runId,\n sessionId: props.session.id,\n startedAt: props.startedAt,\n })) {\n yield* emitLog(props.store, input);\n }\n yield event;\n }\n } catch (error) {\n yield* emitLog(\n props.store,\n runFailedLog(props.session.id, props.runId, error, props.startedAt),\n );\n throw error;\n }\n}\n\nexport function sessionCreatedLog(\n session: StudioSession | { id: string; agentId: string; title?: string },\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n level: \"info\",\n category: \"session\",\n event: \"session.created\",\n message: \"Session created\",\n metadata: cleanMetadata({\n agentId: session.agentId,\n hasTitle: session.title !== undefined,\n titleLength: session.title?.length ?? 0,\n }),\n };\n}\n\nexport function runReceivedLog(props: {\n sessionId: string;\n runId: string;\n agentId: string;\n message: string | Message;\n stream: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n hasTrace: boolean;\n metadata?: JsonObject;\n}): StudioSessionLogAppendInput {\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"run.received\",\n message: \"Run request received\",\n metadata: cleanMetadata({\n agentId: props.agentId,\n stream: props.stream,\n message: messageSummary(props.message),\n maxTurns: props.maxTurns,\n toolConcurrency: props.toolConcurrency,\n hasTrace: props.hasTrace,\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\n };\n}\n\nexport function runStartedLog(session: StudioSession, runId: string): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.started\",\n message: \"Run started\",\n metadata: cleanMetadata({\n agentId: session.agentId,\n existingMessageCount: session.messageCount,\n }),\n };\n}\n\nexport function memoryLoadedLog(\n session: StudioSession,\n runId: string,\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.loaded\",\n message: \"Session memory loaded\",\n metadata: cleanMetadata({\n messageCount: session.messageCount,\n transcriptEntries: session.transcript.length,\n }),\n };\n}\n\nexport function runCompletedLog(props: {\n sessionId: string;\n runId: string;\n durationMs: number;\n usage?: unknown;\n output?: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"run.completed\",\n message: \"Run completed\",\n metadata: cleanMetadata({\n durationMs: props.durationMs,\n usage: usageSummary(props.usage),\n outputBytes: byteLength(props.output),\n messageCount: props.messageCount,\n }),\n };\n}\n\nexport function memorySavedLog(props: {\n sessionId: string;\n runId: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.saved\",\n message: \"Session memory saved\",\n metadata: cleanMetadata({\n messageCount: props.messageCount,\n }),\n };\n}\n\nexport function runFailedLog(\n sessionId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioSessionLogAppendInput {\n return {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"run.failed\",\n message: \"Run failed\",\n metadata: cleanMetadata({\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n }),\n };\n}\n\nfunction logsFromStreamEvent(props: {\n event: AgentRunStreamEvent;\n sessionId: string;\n runId: string;\n startedAt: number;\n}): StudioSessionLogAppendInput[] {\n const { event, sessionId, runId } = props;\n if (event.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"prompt\",\n event: \"prompt.prepared\",\n message: `Turn ${event.turn} prompt prepared`,\n metadata: cleanMetadata({\n turn: event.turn,\n prompt: messageSummary(event.prompt),\n historyCount: event.history.length,\n }),\n },\n ];\n }\n if (event.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.called\",\n message: `Tool ${event.toolCall.function.name} called`,\n metadata: cleanMetadata({\n turn: event.turn,\n toolName: event.toolCall.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n argumentBytes: byteLength(formatUnknown(event.toolCall.function.arguments)),\n }),\n },\n ];\n }\n if (event.type === \"tool_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.completed\",\n message: `Tool ${event.toolName} completed`,\n metadata: cleanMetadata({\n turn: event.turn,\n toolName: event.toolName,\n callId: event.toolCallId,\n internalCallId: event.internalCallId,\n argumentBytes: byteLength(event.args),\n resultBytes: byteLength(event.result),\n structuredResultBytes:\n event.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(event.structuredResult)),\n }),\n },\n ];\n }\n if (event.type === \"turn_end\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"model\",\n event: \"model.turn.completed\",\n message: `Model turn ${event.turn} completed`,\n metadata: cleanMetadata({\n turn: event.turn,\n contentCount: event.response.choice.length,\n usage: usageSummary(event.response.usage),\n }),\n },\n ];\n }\n if (event.type === \"final\") {\n return [\n runCompletedLog({\n sessionId,\n runId,\n durationMs: Date.now() - props.startedAt,\n usage: event.usage,\n output: event.output,\n messageCount: event.messages.length,\n }),\n memorySavedLog({ sessionId, runId, messageCount: event.messages.length }),\n ];\n }\n if (event.type === \"error\") {\n return [runFailedLog(sessionId, runId, event.error, props.startedAt)];\n }\n if (event.type === \"tool_approval_request\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"approval\",\n event: \"approval.requested\",\n message: `Approval requested for ${event.approval.toolName}`,\n metadata: cleanMetadata({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n argumentBytes: byteLength(event.approval.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_approval_result\") {\n return [\n {\n sessionId,\n runId,\n level: event.approval.status === \"approved\" ? \"info\" : \"warn\",\n category: \"approval\",\n event: \"approval.resolved\",\n message: `Approval ${event.approval.status} for ${event.approval.toolName}`,\n metadata: cleanMetadata({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n }),\n },\n ];\n }\n if (event.type === \"tool_question_request\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.requested\",\n message: `Question requested by ${event.question.toolName}`,\n metadata: cleanMetadata({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_question_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.answered\",\n message: `Question answered for ${event.question.toolName}`,\n metadata: cleanMetadata({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n answerCount: event.question.answers?.length ?? 0,\n }),\n },\n ];\n }\n if (event.type === \"agent_tool_event\") {\n return childAgentLog(event, sessionId, runId);\n }\n return [];\n}\n\nasync function* emitLog(\n store: StudioSessionStore,\n input: StudioSessionLogAppendInput,\n): AsyncIterable<AgentRunStreamEvent> {\n const log = await appendSessionLog(store, input);\n if (log !== undefined) {\n yield { type: \"session_log\", log };\n }\n}\n\nfunction childAgentLog(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n sessionId: string,\n runId: string,\n): StudioSessionLogAppendInput[] {\n const child = event.event;\n if (child.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.called\",\n message: `Child agent ${event.agentName ?? event.agentId} called ${child.toolCall.function.name}`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolCall.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n argumentBytes: byteLength(formatUnknown(child.toolCall.function.arguments)),\n }),\n },\n ];\n }\n if (child.type === \"tool_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed ${child.toolName}`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolName,\n callId: child.toolCallId,\n resultBytes: byteLength(child.result),\n structuredResultBytes:\n child.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(child.structuredResult)),\n }),\n },\n ];\n }\n if (child.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.turn_started\",\n message: `Child agent ${event.agentName ?? event.agentId} turn ${child.turn} started`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n childTurn: child.turn,\n historyCount: child.history.length,\n }),\n },\n ];\n }\n if (child.type === \"final\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n usage: usageSummary(child.usage),\n outputBytes: byteLength(child.output),\n messageCount: child.messages.length,\n }),\n },\n ];\n }\n if (child.type === \"error\") {\n return [\n {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"child_agent.failed\",\n message: `Child agent ${event.agentName ?? event.agentId} failed`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n error: serializeError(child.error),\n }),\n },\n ];\n }\n return [];\n}\n\nfunction messageSummary(message: string | Message): JsonObject {\n if (typeof message === \"string\") {\n return {\n role: \"user\",\n contentKind: \"text\",\n byteLength: byteLength(message),\n };\n }\n return {\n role: message.role,\n contentKind: Array.isArray(message.content) ? \"parts\" : \"text\",\n partCount: Array.isArray(message.content) ? message.content.length : 1,\n byteLength: byteLength(formatUnknown(message.content)),\n };\n}\n\nfunction usageSummary(value: unknown): JsonObject | undefined {\n if (value === undefined || value === null || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n return cleanMetadata({\n inputTokens: numericValue(record.inputTokens),\n outputTokens: numericValue(record.outputTokens),\n totalTokens: numericValue(record.totalTokens),\n cachedInputTokens: numericValue(record.cachedInputTokens),\n cacheCreationInputTokens: numericValue(record.cacheCreationInputTokens),\n });\n}\n\nfunction cleanMetadata(value: Record<string, unknown>): JsonObject {\n const cleaned: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (item === undefined) {\n continue;\n }\n const jsonValue = cleanJsonValue(item);\n if (jsonValue !== undefined) {\n cleaned[key] = jsonValue;\n }\n }\n return cleaned;\n}\n\nfunction cleanJsonValue(value: unknown): JsonValue | undefined {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => cleanJsonValue(item))\n .filter((item): item is JsonValue => item !== undefined);\n }\n if (typeof value === \"object\" && value !== null) {\n return cleanMetadata(value as Record<string, unknown>);\n }\n return undefined;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction byteLength(value: string | undefined): number {\n return value === undefined ? 0 : new TextEncoder().encode(value).byteLength;\n}\n\nfunction formatUnknown(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport { appendSessionLog, sessionCreatedLog } from \"./session-logs\";\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 await appendSessionLog(props.sessionStore, sessionCreatedLog(session));\n return c.json(session, 201);\n });\n\n app.get(\"/sessions/:sessionId\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"sessionId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.json(session);\n });\n\n app.get(\"/sessions/:sessionId/logs\", async (c) => {\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n if (props.sessionStore.listSessionLogs === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.logs\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"logs\" },\n );\n }\n\n const limit = parseSessionLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parseSessionLogAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const logs = await props.sessionStore.listSessionLogs({\n sessionId,\n limit,\n ...(after === undefined ? {} : { after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\n });\n\n app.delete(\"/sessions/:sessionId\", async (c) => {\n if (props.sessionStore.deleteSession === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.delete\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"delete\" },\n );\n }\n\n const deleted = await props.sessionStore.deleteSession(c.req.param(\"sessionId\"));\n if (!deleted) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.body(null, 204);\n });\n\n app.get(\"/sessions/:sessionId/traces\", async (c) => {\n if (props.traceStore === undefined) {\n return unsupportedCapability(c, \"traces\");\n }\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const traces = await props.traceStore.listSessionTraces({ sessionId, limit });\n return c.json({ traces });\n });\n}\n\nfunction parseSessionLogLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 200;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 1000);\n}\n\nfunction parseSessionLogAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n\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 { StudioAgent, StudioPipeline, StudioStatusSummary } from \"../types\";\nimport {\n capabilityConfig,\n type ResolvedStores,\n runnerId,\n type StudioRuntimeOptions,\n} from \"./shared\";\n\nexport function registerStatusRoutes(\n app: Hono,\n props: {\n options: StudioRuntimeOptions;\n agents: StudioAgent[];\n pipelines: StudioPipeline[];\n stores: ResolvedStores;\n },\n): void {\n app.get(\"/status\", async (c) => {\n const summary: StudioStatusSummary = {\n runner: {\n id: runnerId(props.options),\n ...(props.options.name === undefined ? {} : { name: props.options.name }),\n ...(props.options.version === undefined ? {} : { version: props.options.version }),\n },\n storage: {\n ...(props.stores.sessions?.kind === undefined\n ? {}\n : { sessions: props.stores.sessions.kind }),\n ...(props.stores.traces?.kind === undefined ? {} : { traces: props.stores.traces.kind }),\n ...(props.stores.pipelineLogs === undefined ? {} : { pipelineLogs: \"available\" }),\n ...(props.stores.pipelineRuns === undefined ? {} : { pipelineRuns: \"available\" }),\n },\n counts: {\n agents: props.agents.length,\n pipelines: props.pipelines.length,\n ...(props.stores.sessions === undefined\n ? {}\n : { sessions: (await props.stores.sessions.listSessions({ limit: 100 })).length }),\n ...(props.stores.traces?.listTraces === undefined\n ? {}\n : { traces: (await props.stores.traces.listTraces({ limit: 100 })).length }),\n ...(props.stores.pipelineRuns === undefined || props.pipelines.length === 0\n ? {}\n : {\n pipelineRuns: (\n await Promise.all(\n props.pipelines.map((pipeline) =>\n props.stores.pipelineRuns?.listPipelineRuns({\n pipelineId: pipeline.id,\n limit: 100,\n }),\n ),\n )\n ).reduce((sum, runs) => sum + (runs?.length ?? 0), 0),\n }),\n },\n capabilities: capabilityConfig(props.options, props.agents, props.pipelines, props.stores),\n generatedAt: new Date().toISOString(),\n };\n return c.json(summary);\n });\n}\n","import type { Context, Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentToolMetadata,\n StudioToolRunRequest,\n StudioToolRunResponse,\n} from \"../types\";\nimport { serializeUnknown, toJsonValue } from \"./json\";\nimport { errorResponse, isJsonObject, isJsonValue } from \"./shared\";\nimport { agentToolItems, approvalMetadata } from \"./tool-metadata\";\n\nexport function registerToolRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/tools\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n tools: await agentToolMetadata(agent),\n });\n });\n\n app.post(\"/agents/:agentId/tools/:toolName/runs\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const toolName = c.req.param(\"toolName\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n if (agent.agent.getTool(toolName) === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Tool not found\");\n }\n\n const body = await parseToolRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const started = Date.now();\n const startedAt = new Date(started).toISOString();\n const events: unknown[] = [];\n try {\n const result = await agent.agent.callTool(toolName, JSON.stringify(body.args), {\n emitStreamEvent(event) {\n events.push(event);\n },\n });\n const ended = Date.now();\n return c.json({\n agentId,\n toolName,\n status: \"success\",\n result: toJsonValue(result),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse);\n } catch (error) {\n const ended = Date.now();\n return c.json(\n {\n agentId,\n toolName,\n status: \"error\",\n error: serializeUnknown(error),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse,\n 500,\n );\n }\n });\n}\n\nasync function parseToolRunRequest(\n c: Context,\n): Promise<StudioToolRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n if (body === undefined || body === null) {\n return { args: {} } satisfies StudioToolRunRequest;\n }\n if (!isJsonObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n const args = Object.hasOwn(body, \"args\") ? body.args : {};\n if (!isJsonValue(args)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"args must be JSON-compatible\") };\n }\n const request: StudioToolRunRequest = { args };\n if (Object.hasOwn(body, \"context\")) {\n if (!isJsonObject(body.context)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"context must be an object\") };\n }\n request.context = body.context;\n }\n return request;\n}\n\nexport async function agentToolMetadata(agent: StudioAgent): Promise<StudioAgentToolMetadata[]> {\n const seen = new Set<string>();\n const metadata: StudioAgentToolMetadata[] = [];\n for (const { tool, source } of agentToolItems(agent)) {\n const key = `${source}:${tool.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n const definition = await tool.definition(\"\");\n metadata.push({\n agentId: agent.id,\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n approval: approvalMetadata(tool),\n });\n }\n\n return metadata.sort((left, right) => {\n if (left.source !== right.source) {\n return left.source === \"static\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n}\n","import type { Hono } from \"hono\";\nimport type { StudioTraceStore } from \"../types\";\nimport { 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","run","studioRunId","transcriptFromMessagesFallback","serializeJsonError","renumberTranscript","toJsonValue","compactJsonObject","toJsonValue","isJsonObject","isJsonValue","serializeError","resolve","decision","toJsonValue","isJsonObject","isRecord","toJsonValue","compactJsonObject","resolve","appendSessionLog","appendPipelineLog","traceSummary","streamResponse","byteLength","serializeError","streamResponse","resolve","streamResponse","serializeError","formatJson","isJsonObject","toJsonValue","serializeError","streamResponse","isJsonValue","isJsonObject","createHook","parseToolArgs","createHook","parseToolArgs","resolve","cleanMetadata","byteLength","serializeError","formatUnknown","isJsonObject","toJsonValue","isJsonObject","isJsonValue","serializeError","createHook"]}
1
+ {"version":3,"sources":["../src/runtime/studio.ts","../src/traces/trace-observer.ts","../src/ui/routes.tsx","../src/runtime/approvals.ts","../src/storage/memory-store.ts","../src/storage/sqlite-store.ts","../src/runtime/json.ts","../src/runtime/tool-metadata.ts","../src/runtime/shared.ts","../src/runtime/evals.ts","../src/runtime/knowledge.ts","../src/runtime/mcps.ts","../src/runtime/memory.ts","../src/runtime/streams.ts","../src/runtime/observability.ts","../src/runtime/pipeline-logs.ts","../src/runtime/runs.ts","../src/runtime/pipelines.ts","../src/runtime/questions.ts","../src/runtime/session-logs.ts","../src/runtime/sessions.ts","../src/runtime/status.ts","../src/runtime/tools.ts","../src/runtime/trace-routes.ts"],"sourcesContent":["import {\n createHook,\n type HookAction,\n type PromptHook,\n type ToolCallHookAction,\n} from \"@anvia/core/agent\";\nimport { type Message as CoreMessage, type JsonObject, Message } from \"@anvia/core/completion\";\nimport { Agent } from \"@anvia/core/internal/agent\";\nimport { resolveMemoryOptions } from \"@anvia/core/memory\";\nimport { Pipeline } from \"@anvia/core/pipeline\";\nimport { serve } from \"@hono/node-server\";\nimport type { Hono } from \"hono\";\nimport { Hono as HonoApp } from \"hono\";\nimport { StudioTraceObserver } from \"../traces/trace-observer\";\nimport type {\n AgentRunStreamEvent,\n AnviaStudio,\n StudioAgent,\n StudioConfig,\n StudioOptions,\n StudioPipeline,\n StudioServeOptions,\n StudioSessionStore,\n StudioTarget,\n StudioTraceStore,\n} from \"../types\";\nimport {\n isStudioUiEnabled,\n registerStudioUi,\n resolveStudioUiOptions,\n studioUiEntryPath,\n} from \"../ui/routes\";\nimport {\n createApprovalRuntime,\n registerApprovalRoutes,\n type StudioApprovalHook,\n} from \"./approvals\";\nimport { registerEvalRoutes } from \"./evals\";\nimport { registerKnowledgeRoutes } from \"./knowledge\";\nimport { registerMcpRoutes } from \"./mcps\";\nimport { registerMemoryRoutes } from \"./memory\";\nimport {\n observeStores,\n registerObservabilityRoutes,\n StudioObservabilityHub,\n} from \"./observability\";\nimport { registerPipelineRoutes } from \"./pipelines\";\nimport { createQuestionRuntime, registerQuestionRoutes } from \"./questions\";\nimport {\n AsyncEventQueue,\n mergeRunAndApprovalEvents,\n optionalTitle,\n parseRunRequest,\n persistStreamingSessionTranscript,\n streamAgentRunEvents,\n traceForRun,\n transcriptFromMessages,\n} from \"./runs\";\nimport {\n appendSessionLog,\n memoryLoadedLog,\n memorySavedLog,\n runCompletedLog,\n runFailedLog,\n runReceivedLog,\n runStartedLog,\n streamSessionRunLogs,\n} from \"./session-logs\";\nimport { registerSessionRoutes } from \"./sessions\";\nimport {\n agentConfig,\n agentRuntimeSummary,\n buildConfig,\n errorResponse,\n normalizeAgents,\n normalizePipelines,\n resolveStores,\n runnerId,\n type StudioRuntimeOptions,\n serializeError,\n unsupportedCapabilities,\n unsupportedCapability,\n} from \"./shared\";\nimport { registerStatusRoutes } from \"./status\";\nimport { registerToolRoutes } from \"./tools\";\nimport { registerTraceRoutes } from \"./trace-routes\";\n\ntype StudioApp = AnviaStudio & {\n readonly sessionStore?: StudioSessionStore;\n readonly traceStore?: StudioTraceStore;\n};\n\nexport class Studio implements AnviaStudio {\n private readonly options: StudioRuntimeOptions;\n private studio: StudioApp;\n private server: ReturnType<typeof serve> | undefined;\n private sigintHandler: (() => void) | undefined;\n\n constructor(targets: StudioTarget[] = [], options: StudioOptions = {}) {\n this.options = studioOptionsFromTargets(targets, options);\n this.studio = createStudioApp(this.options);\n }\n\n get app(): Hono {\n return this.studio.app;\n }\n\n fetch(request: Request): Response | Promise<Response> {\n return this.studio.fetch(request);\n }\n\n config(): StudioConfig {\n return this.studio.config();\n }\n\n traceObserver(): StudioTraceObserver {\n return new StudioTraceObserver({\n store: () => this.studio.traceStore,\n });\n }\n\n start(serveOptions: StudioServeOptions = {}): this {\n this.close();\n this.studio = createStudioApp(this.options);\n\n const port = serveOptions.port ?? Number(process.env.RUNNER_PORT ?? 4021);\n this.server = serve({\n fetch: (request) => this.fetch(request),\n ...(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 studioOptionsFromTargets(\n targets: StudioTarget[],\n options: StudioOptions,\n): StudioRuntimeOptions {\n const agents = targets.filter((target): target is Agent => target instanceof Agent);\n const pipelines = targets.filter(\n // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous user pipelines.\n (target): target is Pipeline<any, any> => target instanceof Pipeline,\n );\n return {\n agents: inferStudioAgents(agents, options.quickPrompts ?? {}),\n pipelines: inferStudioPipelines(pipelines),\n evals: options.evals ?? [],\n ...(options.stores === undefined ? {} : { stores: options.stores }),\n ...(options.ui === undefined ? {} : { ui: options.ui }),\n };\n}\n\nfunction inferStudioAgents(agents: Agent[], quickPrompts: Record<string, string[]>): StudioAgent[] {\n const ids = new Set<string>();\n return agents.map((agent) => {\n const id = uniqueAgentId(agent.id, ids);\n return {\n id,\n agent,\n quickPrompts: quickPrompts[id] ?? [],\n metadata: agentMetadata(agent),\n };\n });\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous user pipelines.\nfunction inferStudioPipelines(pipelines: Array<Pipeline<any, any>>): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = uniqueAgentId(pipeline.id || \"pipeline\", ids);\n return {\n id,\n pipeline,\n ...(pipeline.name === undefined ? {} : { name: pipeline.name }),\n ...(pipeline.description === undefined ? {} : { description: pipeline.description }),\n ...(pipeline.metadata === undefined ? {} : { metadata: pipeline.metadata }),\n };\n });\n}\n\nfunction uniqueAgentId(baseId: string, ids: Set<string>): string {\n let id = baseId;\n let suffix = 2;\n while (ids.has(id)) {\n id = `${baseId}-${suffix}`;\n suffix += 1;\n }\n ids.add(id);\n return id;\n}\n\nfunction agentMetadata(agent: Agent): JsonObject {\n return {\n ...(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 hasHook: agent.hook !== undefined,\n observerCount: agent.observers.length,\n approvalToolCount: agent.toolSet.values().filter((tool) => tool.approval !== undefined).length,\n };\n}\n\nfunction createStudioApp(options: StudioRuntimeOptions): StudioApp {\n const observabilityHub = new StudioObservabilityHub();\n const stores = observeStores(resolveStores(options), observabilityHub);\n const agents = normalizeAgents(options.agents)\n .map((agent) => withStudioSessionMemory(agent, stores.sessions))\n .map((agent) => withStudioTraceObserver(agent, stores.traces));\n const pipelines = normalizePipelines(options.pipelines);\n const agentMap = new Map(agents.map((agent) => [agent.id, agent]));\n const pipelineMap = new Map(pipelines.map((pipeline) => [pipeline.id, pipeline]));\n const evalMap = new Map(options.evals.map((suite) => [suite.id ?? suite.name, suite]));\n const approvalRuntime = createApprovalRuntime();\n const questionRuntime = createQuestionRuntime();\n const app = new HonoApp();\n const uiOptions = isStudioUiEnabled(options.ui) ? resolveStudioUiOptions(options.ui) : undefined;\n\n if (uiOptions !== undefined && !uiOptions.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n if (uiOptions?.protectShell) {\n registerStudioUi(app, uiOptions);\n }\n\n app.get(\"/health\", (c) =>\n c.json({\n status: \"ok\",\n runner: {\n id: runnerId(options),\n name: options.name,\n version: options.version,\n },\n }),\n );\n\n app.get(\"/config\", (c) => c.json(buildConfig(options, agents, pipelines, stores)));\n registerStatusRoutes(app, { options, agents, pipelines, stores });\n\n app.get(\"/agents\", (c) => c.json({ agents: agents.map(agentConfig) }));\n\n app.get(\"/agents/:agentId\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentConfig(agent));\n });\n\n app.get(\"/agents/:agentId/runtime\", (c) => {\n const agent = agentMap.get(c.req.param(\"agentId\"));\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json(agentRuntimeSummary(agent));\n });\n\n registerMcpRoutes(app, { agentMap });\n registerToolRoutes(app, { agentMap });\n registerApprovalRoutes(app, approvalRuntime);\n registerQuestionRoutes(app, questionRuntime);\n registerObservabilityRoutes(app, observabilityHub);\n registerEvalRoutes(app, {\n evals: options.evals,\n evalMap,\n });\n registerKnowledgeRoutes(app, {\n agents,\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n });\n registerPipelineRoutes(app, {\n pipelines,\n pipelineMap,\n ...(stores.pipelineLogs === undefined ? {} : { logStore: stores.pipelineLogs }),\n ...(stores.pipelineRuns === undefined ? {} : { runStore: stores.pipelineRuns }),\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 runStartedAt = Date.now();\n if (session !== undefined) {\n await appendSessionLog(\n stores.sessions,\n runReceivedLog({\n sessionId: session.id,\n runId,\n agentId,\n message: body.message,\n stream: body.stream === true,\n ...(body.maxTurns === undefined ? {} : { maxTurns: body.maxTurns }),\n ...(body.toolConcurrency === undefined ? {} : { toolConcurrency: body.toolConcurrency }),\n hasTrace: body.trace !== undefined,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n }\n const memoryMetadata = {\n agentId,\n ...(body.metadata ?? {}),\n studioRunId: runId,\n };\n const request =\n session !== undefined\n ? agent.agent.session(session.id, { metadata: memoryMetadata }).prompt(body.message)\n : agent.agent.prompt(\n body.history !== undefined\n ? [...body.history, normalizePromptMessage(body.message)]\n : body.message,\n );\n if (body.maxTurns !== undefined) {\n request.maxTurns(body.maxTurns);\n }\n if (body.toolConcurrency !== undefined) {\n request.withToolConcurrency(body.toolConcurrency);\n }\n if (body.trace !== undefined) {\n request.withTrace(traceForRun(body.trace, agentId, session));\n } else if (session !== undefined) {\n request.withTrace(traceForRun(undefined, agentId, session));\n }\n\n if (body.stream === true) {\n const runtimeEvents = new AsyncEventQueue<AgentRunStreamEvent>();\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n emit: (event) => runtimeEvents.push(event),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n emit: (event) => runtimeEvents.push(event),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const runStream = mergeRunAndApprovalEvents(request.stream(), runtimeEvents);\n const stream =\n session === undefined || stores.sessions === undefined\n ? runStream\n : persistStreamingSessionTranscript({\n stream: streamSessionRunLogs({\n stream: runStream,\n store: stores.sessions,\n session,\n runId,\n startedAt: runStartedAt,\n }),\n store: stores.sessions,\n session,\n message: body.message,\n runId,\n });\n return streamAgentRunEvents(c, stream);\n }\n\n try {\n if (session !== undefined) {\n await appendSessionLog(stores.sessions, runStartedLog(session, runId));\n await appendSessionLog(stores.sessions, memoryLoadedLog(session, runId));\n }\n const effectiveHook = composeHooks(\n composeHooks(\n agent.agent.hook,\n approvalRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n getTool: (toolName) => agent.agent.getTool(toolName),\n }),\n ),\n questionRuntime.createHook({\n runId,\n agentId,\n ...(session?.id === undefined ? {} : { sessionId: session.id }),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n if (effectiveHook !== undefined) {\n request.requestHook(effectiveHook);\n }\n const response = await request.send();\n if (session !== undefined && stores.sessions !== undefined) {\n await stores.sessions.saveSessionRunTranscript({\n id: session.id,\n runId,\n ...optionalTitle(body.message),\n transcript: transcriptFromMessages(response.messages),\n status: \"success\",\n });\n await appendSessionLog(\n stores.sessions,\n runCompletedLog({\n sessionId: session.id,\n runId,\n durationMs: Date.now() - runStartedAt,\n usage: response.usage,\n output: response.output,\n messageCount: response.messages.length,\n }),\n );\n await appendSessionLog(\n stores.sessions,\n memorySavedLog({\n sessionId: session.id,\n runId,\n messageCount: response.messages.length,\n }),\n );\n }\n return c.json(response);\n } catch (error) {\n if (session !== undefined && stores.sessions !== undefined) {\n const messages = await stores.sessions.load({\n sessionId: session.id,\n metadata: memoryMetadata,\n });\n await stores.sessions.saveSessionRunTranscript({\n id: session.id,\n runId,\n ...optionalTitle(body.message),\n transcript: transcriptFromMessages(messages.slice(session.messageCount)),\n status: \"error\",\n error: serializeError(error),\n });\n await appendSessionLog(\n stores.sessions,\n runFailedLog(session.id, runId, error, runStartedAt),\n );\n }\n return errorResponse(c, 500, \"internal_error\", \"Agent run failed\", serializeError(error));\n }\n });\n\n if (stores.sessions !== undefined) {\n registerMemoryRoutes(app, {\n sessionStore: stores.sessions,\n });\n registerSessionRoutes(app, {\n agentMap,\n sessionStore: stores.sessions,\n ...(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, pipelines, stores);\n },\n close() {},\n ...(stores.sessions === undefined ? {} : { sessionStore: stores.sessions }),\n ...(stores.traces === undefined ? {} : { traceStore: stores.traces }),\n };\n}\n\nfunction normalizePromptMessage(message: string | CoreMessage): CoreMessage {\n return typeof message === \"string\" ? Message.user(message) : message;\n}\n\nfunction withStudioSessionMemory(\n studioAgent: StudioAgent,\n sessionStore: StudioSessionStore | undefined,\n): StudioAgent {\n if (sessionStore === undefined) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n memory: {\n store: sessionStore,\n options: resolveMemoryOptions({ savePolicy: \"message\" }),\n },\n }),\n };\n}\n\nfunction withStudioTraceObserver(\n studioAgent: StudioAgent,\n traceStore: StudioTraceStore | undefined,\n): StudioAgent {\n if (traceStore === undefined || hasStudioTraceObserver(studioAgent.agent)) {\n return studioAgent;\n }\n\n return {\n ...studioAgent,\n agent: cloneAgent(studioAgent.agent, {\n observers: [\n ...studioAgent.agent.observers,\n { observer: new StudioTraceObserver({ store: traceStore }) },\n ],\n }),\n };\n}\n\nfunction cloneAgent(\n agent: Agent,\n overrides: Partial<ConstructorParameters<typeof Agent>[0]> = {},\n): Agent {\n return new Agent({\n id: agent.id,\n name: agent.name,\n description: agent.description,\n model: agent.model,\n instructions: agent.instructions,\n staticContext: agent.staticContext,\n temperature: agent.temperature,\n maxTokens: agent.maxTokens,\n additionalParams: agent.additionalParams,\n toolSet: agent.toolSet,\n toolChoice: agent.toolChoice,\n defaultMaxTurns: agent.defaultMaxTurns,\n hook: agent.hook,\n outputSchema: agent.outputSchema,\n observers: agent.observers,\n dynamicContexts: agent.dynamicContexts,\n dynamicTools: agent.dynamicTools,\n memory: agent.memory,\n ...overrides,\n });\n}\n\nfunction hasStudioTraceObserver(agent: Agent): boolean {\n return agent.observers.some(\n (registration) => registration.observer instanceof StudioTraceObserver,\n );\n}\n\nfunction composeHooks(\n first: PromptHook | undefined,\n second: PromptHook | undefined,\n): PromptHook | undefined {\n if (first === undefined) {\n return second;\n }\n if (second === undefined) {\n return first;\n }\n\n return createHook({\n async onCompletionCall(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionCall?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionCall?.(args)) ?? undefined);\n },\n async onCompletionResponse(args): Promise<HookAction | undefined> {\n const firstAction = await first.onCompletionResponse?.(args);\n return firstAction?.type === \"terminate\"\n ? firstAction\n : ((await second.onCompletionResponse?.(args)) ?? undefined);\n },\n async onToolCall(args): Promise<ToolCallHookAction | undefined> {\n const firstAction = await first.onToolCall?.(args);\n if (firstAction?.type === \"skip\" || firstAction?.type === \"terminate\") {\n return firstAction;\n }\n if (firstAction?.type === \"approval_request\") {\n return (await approvalRequestHandler(second)?.(args, firstAction)) ?? 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\nfunction approvalRequestHandler(\n hook: PromptHook,\n): StudioApprovalHook[\"handleApprovalRequest\"] | undefined {\n const candidate = hook as Partial<StudioApprovalHook>;\n return typeof candidate.handleApprovalRequest === \"function\"\n ? candidate.handleApprovalRequest\n : undefined;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentObserver,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunObserver,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n} from \"@anvia/core/observability\";\nimport type {\n StudioTrace,\n StudioTraceObservation,\n StudioTraceStatus,\n StudioTraceStore,\n} from \"../types\";\n\nexport type StudioTraceObserverOptions = {\n store: StudioTraceStore | (() => StudioTraceStore | undefined) | undefined;\n};\n\nexport class StudioTraceObserver implements AgentObserver {\n constructor(private readonly options: StudioTraceObserverOptions) {}\n\n startRun(args: AgentRunStartArgs): AgentRunObserver {\n const traceId = args.trace?.traceId ?? globalThis.crypto.randomUUID().replaceAll(\"-\", \"\");\n const observationId = globalThis.crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 16);\n return new StudioRunTraceObserver({\n id: traceId,\n observationId,\n args,\n store: this.store(),\n });\n }\n\n private store(): StudioTraceStore | undefined {\n return typeof this.options.store === \"function\" ? this.options.store() : this.options.store;\n }\n}\n\nclass StudioRunTraceObserver implements AgentRunObserver {\n readonly trace: { traceId: string; observationId: string };\n private readonly startedAt = new Date();\n private readonly observations: StudioTraceObservation[] = [];\n\n constructor(\n private readonly props: {\n id: string;\n observationId: string;\n args: AgentRunStartArgs;\n store: StudioTraceStore | undefined;\n },\n ) {\n this.trace = { traceId: props.id, observationId: props.observationId };\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n const startedAt = new Date();\n return {\n end: (endArgs: AgentGenerationEndArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n output: toJsonValue(endArgs.response),\n metadata: generationMetadata(args, endArgs),\n }),\n );\n },\n error: (errorArgs: AgentGenerationErrorArgs) => {\n this.observations.push(\n traceObservation({\n kind: \"generation\",\n name: `model.turn.${args.turn}`,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: toJsonValue(args.request),\n error: serializeError(errorArgs.error),\n metadata: generationMetadata(args),\n }),\n );\n },\n };\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const startedAt = new Date();\n const childTrace = new ChildAgentToolTraceAccumulator(args);\n return {\n streamEvent: (streamArgs: AgentToolStreamEventArgs) => {\n childTrace.accept(streamArgs);\n },\n end: (endArgs: AgentToolEndArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"success\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n output: parseOrString(endArgs.result),\n metadata: toolMetadata(args, endArgs.skipped, endArgs.result),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n error: (errorArgs: AgentToolErrorArgs) => {\n const parentObservation = traceObservation({\n kind: \"tool\",\n name: args.toolName,\n status: \"error\",\n turn: args.turn,\n startedAt,\n input: parseOrString(args.args),\n error: serializeError(errorArgs.error),\n metadata: toolMetadata(args, false),\n });\n this.observations.push(parentObservation);\n this.observations.push(...childTrace.observations(parentObservation.id));\n },\n };\n }\n\n async end(args: AgentRunEndArgs): Promise<void> {\n await this.save(\"success\", {\n endedAt: new Date(),\n output: args.output,\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n async error(args: AgentRunErrorArgs): Promise<void> {\n await this.save(\"error\", {\n endedAt: new Date(),\n error: serializeError(args.error),\n usage: args.usage,\n messages: toJsonValue(args.messages),\n });\n }\n\n private async save(\n status: StudioTraceStatus,\n result: {\n endedAt: Date;\n output?: string;\n error?: JsonValue;\n usage: StudioTrace[\"usage\"];\n messages: JsonValue;\n },\n ): Promise<void> {\n const sessionId = this.props.args.trace?.sessionId;\n const store = this.props.store;\n if (sessionId === undefined || store === undefined) {\n return;\n }\n\n const metadata = traceMetadata(this.props.args, result.messages);\n const trace: StudioTrace = {\n id: this.props.id,\n sessionId,\n ...(this.props.args.trace?.name === undefined ? {} : { name: this.props.args.trace.name }),\n status,\n trace: this.trace,\n startedAt: this.startedAt.toISOString(),\n endedAt: result.endedAt.toISOString(),\n durationMs: durationMs(this.startedAt, result.endedAt),\n input: toJsonValue({\n instructions: this.props.args.instructions,\n prompt: this.props.args.prompt,\n history: this.props.args.history,\n }),\n ...(result.output === undefined ? {} : { output: result.output }),\n ...(result.error === undefined ? {} : { error: result.error }),\n ...(result.usage === undefined ? {} : { usage: result.usage }),\n metadata,\n observations: this.observations,\n observationCount: this.observations.length,\n };\n\n await store.saveTrace(trace);\n }\n}\n\nclass ChildAgentToolTraceAccumulator {\n private readonly agentStarts = new Map<\n string,\n {\n startedAt: Date;\n agentId: string;\n agentName?: string;\n }\n >();\n private readonly generationStarts = new Map<\n string,\n {\n startedAt: Date;\n input?: JsonValue;\n agentId: string;\n agentName?: string;\n childTurn: number;\n }\n >();\n private readonly toolStarts: Array<{\n startedAt: Date;\n agentId: string;\n agentName?: string;\n childTurn: number;\n toolName: string;\n toolCallId?: string;\n internalCallId?: string;\n input?: JsonValue;\n completed: boolean;\n }> = [];\n private readonly completedObservations: StudioTraceObservation[] = [];\n\n constructor(private readonly parent: AgentToolStartArgs) {}\n\n accept(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : this.parent.turn;\n\n if (!this.agentStarts.has(agentId)) {\n this.agentStarts.set(agentId, {\n startedAt: new Date(),\n agentId,\n ...(agentName === undefined ? {} : { agentName }),\n });\n }\n\n if (child.type === \"turn_start\") {\n this.generationStarts.set(generationKey(agentId, childTurn), {\n startedAt: new Date(),\n input: toJsonValue({\n prompt: child.prompt,\n history: child.history,\n }),\n agentId,\n ...(agentName === undefined ? {} : { agentName }),\n childTurn,\n });\n return;\n }\n\n if (child.type === \"turn_end\") {\n const key = generationKey(agentId, childTurn);\n const start = this.generationStarts.get(key);\n this.generationStarts.delete(key);\n this.completedObservations.push(\n traceObservation({\n kind: \"generation\",\n name: `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n ...(start?.input === undefined ? {} : { input: start.input }),\n output: toJsonValue(child.response),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n }),\n );\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const callId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n this.toolStarts.push({\n startedAt: new Date(),\n agentId,\n ...(agentName === undefined ? {} : { agentName }),\n childTurn,\n toolName,\n ...(callId === undefined ? {} : { toolCallId: callId }),\n input: toJsonValue(toolCallFunction?.arguments ?? {}),\n completed: false,\n });\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const internalCallId =\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined;\n const start = this.findToolStart(agentId, toolName, toolCallId);\n const input =\n start?.input ?? (typeof child.args === \"string\" ? parseOrString(child.args) : undefined);\n if (start !== undefined) {\n start.completed = true;\n }\n this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.${toolName}`,\n status: \"success\",\n turn: this.parent.turn,\n startedAt: start?.startedAt ?? new Date(),\n ...(input === undefined ? {} : { input }),\n ...(typeof child.result === \"string\" ? { output: parseOrString(child.result) } : {}),\n metadata: {\n ...this.childMetadata(agentId, agentName, childTurn),\n ...(toolCallId === undefined ? {} : { toolCallId }),\n ...(internalCallId === undefined ? {} : { internalCallId }),\n },\n }),\n );\n return;\n }\n\n if (child.type === \"error\") {\n this.completedObservations.push(\n traceObservation({\n kind: \"tool\",\n name: `${agentLabel(agentId, agentName)}.error`,\n status: \"error\",\n turn: this.parent.turn,\n startedAt: new Date(),\n error: serializeError(child.error),\n metadata: this.childMetadata(agentId, agentName, childTurn),\n }),\n );\n }\n }\n\n observations(parentObservationId: string): StudioTraceObservation[] {\n const observations: StudioTraceObservation[] = [];\n const agentObservationIds = new Map<string, string>();\n\n for (const agentStart of this.agentStarts.values()) {\n const agentChildren = this.completedObservations.filter(\n (observation) =>\n isRecord(observation.metadata) &&\n observation.metadata.childAgentId === agentStart.agentId,\n );\n const childStartTimes = agentChildren.map((observation) => Date.parse(observation.startedAt));\n const childEndTimes = agentChildren.map((observation) =>\n Date.parse(observation.endedAt ?? observation.startedAt),\n );\n const startedAt =\n childStartTimes.length === 0\n ? agentStart.startedAt\n : new Date(Math.min(agentStart.startedAt.getTime(), ...childStartTimes));\n const endedAt =\n childEndTimes.length === 0 ? new Date() : new Date(Math.max(...childEndTimes));\n const agentObservation = traceObservation({\n parentObservationId,\n kind: \"agent\",\n name: `${agentLabel(agentStart.agentId, agentStart.agentName)}.run`,\n status: agentChildren.some((observation) => observation.status === \"error\")\n ? \"error\"\n : \"success\",\n turn: this.parent.turn,\n startedAt,\n endedAt,\n metadata: this.childMetadata(agentStart.agentId, agentStart.agentName, this.parent.turn),\n });\n observations.push(agentObservation);\n agentObservationIds.set(agentStart.agentId, agentObservation.id);\n }\n\n for (const observation of this.completedObservations) {\n const childAgentId = isRecord(observation.metadata)\n ? stringValue(observation.metadata.childAgentId)\n : undefined;\n const childAgentObservationId =\n childAgentId === undefined ? undefined : agentObservationIds.get(childAgentId);\n observations.push({\n ...observation,\n parentObservationId: childAgentObservationId ?? parentObservationId,\n });\n }\n\n return observations;\n }\n\n private findToolStart(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.toolStarts)[number] | undefined {\n for (let index = this.toolStarts.length - 1; index >= 0; index -= 1) {\n const start = this.toolStarts[index];\n if (\n start === undefined ||\n start.completed ||\n start.agentId !== agentId ||\n start.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || start.toolCallId === toolCallId) {\n return start;\n }\n }\n return undefined;\n }\n\n private childMetadata(\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n ): JsonObject {\n return compactJsonObject({\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: this.parent.toolName,\n parentInternalCallId: this.parent.internalCallId,\n parentToolCallId: this.parent.toolCallId,\n });\n }\n}\n\nfunction generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nfunction agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nfunction traceObservation(props: {\n parentObservationId?: string;\n kind: StudioTraceObservation[\"kind\"];\n name: string;\n status: StudioTraceStatus;\n turn: number;\n startedAt: Date;\n endedAt?: Date;\n input?: JsonValue;\n output?: JsonValue;\n error?: JsonValue;\n metadata?: JsonObject;\n}): StudioTraceObservation {\n const endedAt = props.endedAt ?? new Date();\n return {\n id: globalThis.crypto.randomUUID(),\n ...(props.parentObservationId === undefined\n ? {}\n : { parentObservationId: props.parentObservationId }),\n kind: props.kind,\n name: props.name,\n status: props.status,\n turn: props.turn,\n startedAt: props.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: durationMs(props.startedAt, endedAt),\n ...(props.input === undefined ? {} : { input: props.input }),\n ...(props.output === undefined ? {} : { output: props.output }),\n ...(props.error === undefined ? {} : { error: props.error }),\n ...(props.metadata === undefined ? {} : { metadata: props.metadata }),\n };\n}\n\nfunction traceMetadata(args: AgentRunStartArgs, messages: JsonValue): JsonObject {\n return compactJsonObject({\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n userId: args.trace?.userId,\n tags: args.trace?.tags,\n version: args.trace?.version,\n metadata: toJsonValue(args.trace?.metadata ?? {}),\n messages,\n });\n}\n\nfunction generationMetadata(\n args: AgentGenerationStartArgs,\n endArgs?: AgentGenerationEndArgs,\n): JsonObject {\n const request = args.request;\n const response = endArgs?.response;\n const rawResponse = isRecord(response?.rawResponse) ? response.rawResponse : undefined;\n const effectiveModel =\n request.model ?? stringValue(rawResponse?.model) ?? args.modelInfo?.defaultModel ?? \"default\";\n const providerResponse = providerResponseSummary(rawResponse);\n const usage = response?.usage;\n\n return compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\n messageId: response?.messageId,\n usage,\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n documentCount: request.documents.length,\n historyCount: request.chatHistory.length,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n firstDeltaMs: endArgs?.firstDeltaMs,\n providerResponse,\n modelInfo: compactJsonObject({\n provider: args.modelInfo?.provider,\n model: effectiveModel,\n requestedModel: request.model,\n defaultModel: args.modelInfo?.defaultModel,\n capabilities: args.modelInfo?.capabilities,\n }),\n modelCall: compactJsonObject({\n request: completionRequestSummary(request),\n providerRequest: args.providerRequest,\n }),\n response: compactJsonObject({\n messageId: response?.messageId,\n usage,\n contentTypes: response?.choice.map((item) => item.type),\n providerResponse,\n }),\n tools: compactJsonObject({\n count: request.tools.length,\n names: request.tools.map((tool) => tool.name),\n toolChoice: request.toolChoice,\n hasOutputSchema: request.outputSchema !== undefined,\n }),\n timing: compactJsonObject({\n firstDeltaMs: endArgs?.firstDeltaMs,\n }),\n });\n}\n\nfunction completionRequestSummary(request: AgentGenerationStartArgs[\"request\"]): JsonObject {\n return compactJsonObject({\n model: request.model,\n instructions: request.instructions === undefined ? undefined : { present: true },\n messageCount: request.chatHistory.length,\n documentCount: request.documents.length,\n documentIds: request.documents.map((document) => document.id),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: request.toolChoice,\n additionalParamKeys: isRecord(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n });\n}\n\nfunction providerResponseSummary(\n rawResponse: Record<string, unknown> | undefined,\n): JsonObject | undefined {\n if (rawResponse === undefined) {\n return undefined;\n }\n const reasoning = isRecord(rawResponse.reasoning) ? rawResponse.reasoning : undefined;\n const text = isRecord(rawResponse.text) ? rawResponse.text : undefined;\n const toolUsage = isRecord(rawResponse.tool_usage) ? rawResponse.tool_usage : undefined;\n const webSearch = isRecord(toolUsage?.web_search) ? toolUsage.web_search : undefined;\n const summary = compactJsonObject({\n id: rawResponse.id,\n status: rawResponse.status,\n serviceTier: rawResponse.service_tier,\n store: rawResponse.store,\n parallelToolCalls: rawResponse.parallel_tool_calls,\n promptCacheKey: rawResponse.prompt_cache_key,\n promptCacheRetention: rawResponse.prompt_cache_retention,\n reasoningEffort: reasoning?.effort,\n textVerbosity: text?.verbosity,\n webSearchRequestCount: webSearch?.num_requests,\n });\n return Object.keys(summary).length === 0 ? undefined : summary;\n}\n\nfunction toolMetadata(args: AgentToolStartArgs, skipped: boolean, result?: string): JsonObject {\n const schema = isRecord(args.toolDefinition?.parameters) ? args.toolDefinition.parameters : {};\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = Array.isArray(schema.required)\n ? schema.required.filter((item): item is string => typeof item === \"string\")\n : [];\n return compactJsonObject({\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n hasAdditionalParams: args.toolCall.additionalParams !== undefined,\n toolDescription: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n tools: compactJsonObject({\n name: args.toolName,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped,\n description: args.toolDefinition?.description,\n parameterKeys: Object.keys(properties).sort(),\n requiredParameterKeys: required,\n approvalRequired: args.toolMetadata?.approvalRequired,\n mcpServerName: args.toolMetadata?.mcpServerName,\n argumentBytes: byteLength(args.args),\n resultBytes: result === undefined ? undefined : byteLength(result),\n hasCallSignature: args.toolCall.signature !== undefined,\n hasAdditionalParams: args.toolCall.additionalParams !== undefined,\n }),\n });\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValue(value)]],\n );\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction durationMs(startedAt: Date, endedAt: Date): number {\n return Math.max(0, endedAt.getTime() - startedAt.getTime());\n}\n\nfunction parseOrString(value: string): JsonValue {\n try {\n return toJsonValue(JSON.parse(value));\n } catch {\n return value;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction serializeError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return compactJsonObject({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n }\n return toJsonValue(error);\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (typeof value === \"object\") {\n return compactJsonObject(value as Record<string, unknown>);\n }\n return String(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Hono } from \"hono\";\nimport type { StudioUiOptions } from \"../types\";\n\nexport type ResolvedStudioUiOptions = {\n path: string;\n title: string;\n rootRoutes: boolean;\n redirectRoot: boolean;\n clientScript?: string;\n protectShell: boolean;\n};\n\nexport function resolveStudioUiOptions(\n ui: boolean | StudioUiOptions | undefined,\n): ResolvedStudioUiOptions {\n const options = typeof ui === \"object\" ? ui : {};\n return {\n path: normalizeUiPath(options.path ?? \"/ui\"),\n title: options.title ?? \"Anvia Studio\",\n rootRoutes: options.rootRoutes ?? true,\n redirectRoot: options.redirectRoot ?? true,\n ...(options.clientScript === undefined ? {} : { clientScript: options.clientScript }),\n protectShell: options.protectShell ?? false,\n };\n}\n\nexport function isStudioUiEnabled(ui: boolean | StudioUiOptions | undefined): boolean {\n return ui !== false;\n}\n\nexport function registerStudioUi(app: Hono, options: ResolvedStudioUiOptions): void {\n const scriptPath = `${options.path}/assets/client.js`;\n const stylePath = `${options.path}/assets/styles.css`;\n const renderShell = () =>\n renderStudioUi({\n options,\n routePath: options.path,\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n const renderRootShell = () =>\n renderStudioUi({\n options,\n routePath: \"\",\n clientScript: scriptPath,\n stylesheet: stylePath,\n });\n\n if (options.redirectRoot) {\n app.get(\"/\", (c) => c.redirect(studioUiEntryPath(options)));\n }\n\n app.get(options.path, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/playground/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/:traceId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/sessions/:sessionId`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tracing/*`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/sessions`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/agents`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/tools`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/mcps`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/pipelines`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/evals`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/memory`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/status`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/knowledge`, async (c) => c.html(await renderShell()));\n app.get(`${options.path}/knowledge/:tab`, 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.path}/playground`;\n}\n\nasync function readBundledUiIndex(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/index.html\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/index.html\", import.meta.url)),\n \"utf8\",\n );\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n return readFile(fileURLToPath(new URL(\"./app/index.html\", import.meta.url)), \"utf8\");\n }\n}\n\nasync function readBundledUiAsset(asset: string): Promise<Uint8Array | undefined> {\n try {\n return await readFile(fileURLToPath(new URL(`./assets/${asset}`, import.meta.url)));\n } catch (sourceError) {\n if (!isNotFoundError(sourceError)) {\n throw sourceError;\n }\n }\n try {\n return await readFile(fileURLToPath(new URL(`./ui/assets/${asset}`, import.meta.url)));\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(`../../dist/ui/assets/${asset}`, import.meta.url)),\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return undefined;\n }\n }\n}\n\nasync function readBundledLegacyStylesheet(): Promise<string> {\n try {\n return await readFile(fileURLToPath(new URL(\"./ui/styles.css\", import.meta.url)), \"utf8\");\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n try {\n return await readFile(\n fileURLToPath(new URL(\"../../dist/ui/styles.css\", import.meta.url)),\n \"utf8\",\n );\n } catch (fallbackError) {\n if (!isNotFoundError(fallbackError)) {\n throw fallbackError;\n }\n return \"\";\n }\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction contentTypeForAsset(asset: string): string {\n if (asset.endsWith(\".js\")) {\n return \"text/javascript; charset=utf-8\";\n }\n if (asset.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (asset.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (asset.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (asset.endsWith(\".woff2\")) {\n return \"font/woff2\";\n }\n return \"application/octet-stream\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n","import {\n createHook,\n type PromptHook,\n type ToolApprovalRequestOptions,\n type ToolCallHookAction,\n type ToolCallHookArgs,\n} from \"@anvia/core/agent\";\nimport type { JsonObject } from \"@anvia/core/completion\";\nimport {\n type AnyTool,\n parseToolArgs,\n type ToolApprovalContext,\n type ToolApprovalPolicy,\n} from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolApproval,\n StudioToolApprovalDecision,\n StudioToolApprovalStatus,\n} from \"../types\";\nimport { errorResponse, 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): StudioApprovalHook;\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 type StudioApprovalHook = PromptHook & {\n handleApprovalRequest(\n args: ToolCallHookArgs,\n request: ToolApprovalRequestOptions,\n ): Promise<ToolCallHookAction>;\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 const handleApprovalRequest: StudioApprovalHook[\"handleApprovalRequest\"] = async (\n { toolName, toolCallId, internalCallId, args, tool: control },\n request,\n ) => {\n const decision = await requestApproval(approvals, context, {\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n internalCallId,\n args,\n ...(request.reason === undefined ? {} : { reason: request.reason }),\n ...(request.rejectMessage === undefined ? {} : { rejectMessage: request.rejectMessage }),\n });\n\n return decision.approved\n ? control.run()\n : control.skip(decision.reason ?? request.rejectMessage ?? \"Rejected in Anvia Studio.\");\n };\n return {\n ...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(\n approval.rejectMessage,\n approvalContext,\n );\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 handleApprovalRequest,\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 type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\ntype MemorySessionRecord = StudioSessionSummary & {\n messages: Message[];\n runs: Array<StudioSessionRunTranscriptInput & { createdAt: string; updatedAt: string }>;\n logs: StudioSessionLogEntry[];\n};\n\nexport function createInMemoryStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n return new InMemoryStudioStore();\n}\n\nclass InMemoryStudioStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"memory\";\n private readonly sessions = new Map<string, MemorySessionRecord>();\n private readonly traces = new Map<string, StudioTrace>();\n private readonly pipelineLogs = new Map<string, StudioPipelineLogEntry[]>();\n private readonly pipelineRuns = new Map<string, StudioPipelineRunRecord>();\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n return [...this.sessions.values()]\n .filter((session) => options.agentId === undefined || session.agentId === options.agentId)\n .sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt))\n .slice(0, options.limit)\n .map(sessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const now = new Date().toISOString();\n const session: MemorySessionRecord = {\n id: input.id,\n agentId: input.agentId,\n ...(input.title === undefined ? {} : { title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n messages: [],\n runs: [],\n logs: [],\n };\n this.sessions.set(input.id, session);\n return sessionSummary(session);\n }\n\n getSession(id: string): StudioSession | undefined {\n const session = this.sessions.get(id);\n return session === undefined ? undefined : materializeSession(session);\n }\n\n load(context: MemoryContext): Promise<Message[]> {\n return Promise.resolve(this.sessions.get(context.sessionId)?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): Promise<void> {\n const session = this.sessions.get(input.context.sessionId);\n if (session !== undefined) {\n session.messages.push(...input.messages);\n session.messageCount = session.messages.length;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n clear(context: MemoryContext): Promise<void> {\n const session = this.sessions.get(context.sessionId);\n if (session !== undefined) {\n session.messages = [];\n session.runs = [];\n session.messageCount = 0;\n session.updatedAt = new Date().toISOString();\n }\n return Promise.resolve();\n }\n\n async recordError(input: MemoryErrorInput): Promise<void> {\n await this.saveSessionRunTranscript({\n id: input.context.sessionId,\n runId: studioRunId(input.context) ?? input.runId,\n transcript: transcriptFromMessagesFallback(input.messages),\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const session = this.sessions.get(input.id);\n if (session === undefined) {\n return undefined;\n }\n const now = new Date().toISOString();\n const existingIndex = session.runs.findIndex((run) => run.runId === input.runId);\n const run = {\n ...input,\n transcript: renumberTranscript(input.transcript),\n createdAt: existingIndex === -1 ? now : (session.runs[existingIndex]?.createdAt ?? now),\n updatedAt: now,\n };\n if (existingIndex === -1) {\n session.runs.push(run);\n } else {\n session.runs[existingIndex] = run;\n }\n session.updatedAt = now;\n return materializeSession(session);\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const session = this.sessions.get(input.sessionId);\n const logs = session?.logs ?? [];\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n if (session !== undefined) {\n session.logs.push(entry);\n session.updatedAt = entry.timestamp;\n }\n return entry;\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n return (this.sessions.get(options.sessionId)?.logs ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n deleteSession(id: string): boolean {\n for (const trace of this.traces.values()) {\n if (trace.sessionId === id) {\n this.traces.delete(trace.id);\n }\n }\n return this.sessions.delete(id);\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n return [...this.traces.values()]\n .filter((trace) => options.sessionId === undefined || trace.sessionId === options.sessionId)\n .filter((trace) => options.status === undefined || trace.status === options.status)\n .filter((trace) => options.agentId === undefined || traceAgentId(trace) === options.agentId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit)\n .map(traceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n return this.listTraces({ sessionId: options.sessionId, limit: options.limit });\n }\n\n getTrace(id: string): StudioTrace | undefined {\n return this.traces.get(id);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n this.traces.set(trace.id, trace);\n return trace;\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const logs = this.pipelineLogs.get(input.pipelineId) ?? [];\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence: logs.length,\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n this.pipelineLogs.set(input.pipelineId, [...logs, entry]);\n return entry;\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n return (this.pipelineLogs.get(options.pipelineId) ?? [])\n .filter((log) => options.after === undefined || log.sequence > options.after)\n .slice(0, options.limit);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const record: StudioPipelineRunRecord = {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n ...(input.output === undefined ? {} : { output: input.output }),\n ...(input.error === undefined ? {} : { error: input.error }),\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n startedAt: input.startedAt,\n ...(input.endedAt === undefined ? {} : { endedAt: input.endedAt }),\n ...(input.durationMs === undefined ? {} : { durationMs: input.durationMs }),\n };\n this.pipelineRuns.set(input.runId, record);\n return record;\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n return [...this.pipelineRuns.values()]\n .filter((run) => run.pipelineId === options.pipelineId)\n .sort((left, right) => Date.parse(right.startedAt) - Date.parse(left.startedAt))\n .slice(0, options.limit);\n }\n}\n\nfunction sessionSummary(session: MemorySessionRecord): StudioSessionSummary {\n return {\n id: session.id,\n agentId: session.agentId,\n ...(session.title === undefined ? {} : { title: session.title }),\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messages.length,\n ...(session.metadata === undefined ? {} : { metadata: session.metadata }),\n };\n}\n\nfunction materializeSession(session: MemorySessionRecord): StudioSession {\n return {\n ...sessionSummary(session),\n messages: [...session.messages],\n transcript: renumberTranscript(session.runs.flatMap((run) => run.transcript)),\n };\n}\n\nfunction traceSummary(trace: StudioTrace): StudioTraceSummary {\n return {\n id: trace.id,\n sessionId: trace.sessionId,\n ...(trace.name === undefined ? {} : { name: trace.name }),\n status: trace.status,\n startedAt: trace.startedAt,\n ...(trace.endedAt === undefined ? {} : { endedAt: trace.endedAt }),\n ...(trace.durationMs === undefined ? {} : { durationMs: trace.durationMs }),\n ...(trace.output === undefined ? {} : { output: trace.output }),\n ...(trace.error === undefined ? {} : { error: trace.error }),\n ...(trace.usage === undefined ? {} : { usage: trace.usage }),\n ...(trace.metadata === undefined ? {} : { metadata: trace.metadata }),\n observationCount: trace.observations.length,\n };\n}\n\nfunction traceAgentId(trace: StudioTrace): string | undefined {\n const nestedMetadata = trace.metadata?.metadata;\n return isJsonObject(nestedMetadata) && typeof nestedMetadata.agentId === \"string\"\n ? nestedMetadata.agentId\n : undefined;\n}\n\nfunction renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n\nfunction studioRunId(context: MemoryContext): string | undefined {\n const value = context.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n return isJsonValue(error) ? error : String(error);\n}\n\nfunction transcriptFromMessagesFallback(messages: Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\n }\n }\n continue;\n }\n if (message.role === \"assistant\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: content.text,\n });\n }\n }\n }\n }\n return transcript;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return isJsonObject(value) && Object.values(value).every(isJsonValue);\n}\n","import { mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport type { DatabaseSync as DatabaseSyncType } from \"node:sqlite\";\nimport type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { MemoryAppendInput, MemoryContext, MemoryErrorInput } from \"@anvia/core/memory\";\nimport type {\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogListOptions,\n StudioPipelineLogStore,\n StudioPipelineRunListOptions,\n StudioPipelineRunRecord,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n StudioSession,\n StudioSessionCreateInput,\n StudioSessionListOptions,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionLogListOptions,\n StudioSessionRunStatus,\n StudioSessionRunTranscriptInput,\n StudioSessionStore,\n StudioSessionSummary,\n StudioSessionTraceListOptions,\n StudioTrace,\n StudioTraceListOptions,\n StudioTraceStore,\n StudioTraceSummary,\n StudioTranscriptEntry,\n} from \"../types\";\n\nexport type SqliteSessionStoreOptions = {\n path?: string;\n};\n\ntype DatabaseSyncConstructor = typeof DatabaseSyncType;\n\nlet DatabaseSync: DatabaseSyncConstructor | undefined;\n\ntype SessionRow = {\n id: string;\n agent_id: string;\n title: string | null;\n metadata_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype SessionSummaryRow = SessionRow & {\n message_count: number;\n};\n\ntype MessageRow = {\n session_id: string;\n message_index: number;\n role: Message[\"role\"];\n message_id: string | null;\n created_at: string;\n};\n\ntype MessagePartRow = {\n session_id: string;\n message_index: number;\n part_index: number;\n type: string;\n part_json: string;\n};\n\ntype StoredMessagePart = {\n type: string;\n value: unknown;\n};\n\ntype TableInfoRow = {\n name: string;\n};\n\ntype TraceRow = {\n id: string;\n session_id: string;\n name: string | null;\n status: StudioTrace[\"status\"];\n trace_json: string | null;\n input_json: string | null;\n output: string | null;\n error_json: string | null;\n usage_json: string | null;\n metadata_json: string | null;\n observations_json: string;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\ntype SessionRunRow = {\n run_id: string;\n session_id: string;\n status: StudioSessionRunStatus;\n title: string | null;\n transcript_json: string;\n error_json: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype SessionLogRow = {\n id: string;\n session_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioSessionLogEntry[\"level\"];\n category: StudioSessionLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineLogRow = {\n id: string;\n pipeline_id: string;\n run_id: string | null;\n sequence: number;\n timestamp: string;\n level: StudioPipelineLogEntry[\"level\"];\n category: StudioPipelineLogEntry[\"category\"];\n event: string;\n message: string;\n metadata_json: string | null;\n};\n\ntype PipelineRunRow = {\n run_id: string;\n pipeline_id: string;\n status: StudioPipelineRunRecord[\"status\"];\n input_json: string;\n output_json: string | null;\n error_json: string | null;\n metadata_json: string | null;\n started_at: string;\n ended_at: string | null;\n duration_ms: number | null;\n};\n\nexport function createSqliteSessionStore(\n options: SqliteSessionStoreOptions = {},\n): StudioSessionStore & StudioTraceStore & StudioPipelineLogStore & StudioPipelineRunStore {\n return new SqliteSessionStore(options.path ?? \":memory:\");\n}\n\nclass SqliteSessionStore\n implements StudioSessionStore, StudioTraceStore, StudioPipelineLogStore, StudioPipelineRunStore\n{\n readonly kind = \"sqlite\";\n private db: DatabaseSyncType | undefined;\n\n constructor(private readonly path: string) {}\n\n listSessions(options: StudioSessionListOptions): StudioSessionSummary[] {\n const db = this.database();\n const agentClause = options.agentId === undefined ? \"\" : \"WHERE s.agent_id = $agentId\";\n const rows = db\n .prepare(\n `SELECT s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at,\n COUNT(m.message_index) AS message_count\n FROM anvia_studio_sessions s\n LEFT JOIN anvia_studio_session_messages m ON m.session_id = s.id\n ${agentClause}\n GROUP BY s.id, s.agent_id, s.title, s.metadata_json, s.created_at, s.updated_at\n ORDER BY s.updated_at DESC\n LIMIT $limit`,\n )\n .all({\n $agentId: options.agentId ?? null,\n $limit: options.limit,\n }) as SessionSummaryRow[];\n\n return rows.map(toSessionSummary);\n }\n\n createSession(input: StudioSessionCreateInput): StudioSessionSummary {\n const db = this.database();\n const now = new Date().toISOString();\n db.prepare(\n `INSERT INTO anvia_studio_sessions (\n id,\n agent_id,\n title,\n metadata_json,\n created_at,\n updated_at\n ) VALUES ($id, $agentId, $title, $metadata, $now, $now)`,\n ).run({\n $id: input.id,\n $agentId: input.agentId,\n $title: input.title ?? null,\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $now: now,\n });\n\n return {\n id: input.id,\n agentId: input.agentId,\n ...(input.title === undefined ? {} : { title: input.title }),\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n }\n\n getSession(id: string): StudioSession | undefined {\n const row = this.getSessionRow(id);\n\n return row === undefined\n ? undefined\n : toSession(row, this.listSessionMessages(id), this.listSessionRunRows(id));\n }\n\n load(context: MemoryContext): Promise<Message[]> {\n const session = this.getSession(context.sessionId);\n return Promise.resolve(session?.messages ?? []);\n }\n\n append(input: MemoryAppendInput): Promise<void> {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = db\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: input.context.sessionId }) as SessionRow | undefined;\n\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return Promise.resolve();\n }\n\n const updatedAt = new Date().toISOString();\n const nextIndex = this.nextMessageIndex(input.context.sessionId);\n\n this.insertMessages(input.context.sessionId, input.messages, nextIndex, updatedAt);\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.context.sessionId,\n $updatedAt: updatedAt,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n clear(context: MemoryContext): Promise<void> {\n const db = this.database();\n const updatedAt = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: context.sessionId,\n $updatedAt: updatedAt,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_messages WHERE session_id = $id\").run({\n $id: context.sessionId,\n });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({\n $id: context.sessionId,\n });\n db.exec(\"COMMIT\");\n return Promise.resolve();\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n async recordError(input: MemoryErrorInput): Promise<void> {\n const runId = studioRunId(input.context) ?? input.runId;\n const existing = this.getSessionRun(input.context.sessionId, runId);\n const transcript =\n existing === undefined ||\n parseJsonArray<StudioTranscriptEntry>(existing.transcript_json).length === 0\n ? transcriptFromMessagesFallback(input.messages)\n : parseJsonArray<StudioTranscriptEntry>(existing.transcript_json);\n await this.saveSessionRunTranscript({\n id: input.context.sessionId,\n runId,\n transcript,\n status: \"error\",\n error: serializeJsonError(input.error),\n });\n }\n\n saveSessionRunTranscript(input: StudioSessionRunTranscriptInput): StudioSession | undefined {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.id);\n if (row === undefined) {\n db.exec(\"ROLLBACK\");\n return undefined;\n }\n const current = toSession(\n row,\n this.listSessionMessages(input.id),\n this.listSessionRunRows(input.id),\n );\n const title = current.title ?? input.title;\n\n db.prepare(\n `INSERT INTO anvia_studio_session_runs (\n run_id,\n session_id,\n status,\n title,\n transcript_json,\n error_json,\n created_at,\n updated_at\n ) VALUES (\n $runId,\n $sessionId,\n $status,\n $title,\n $transcript,\n $error,\n $now,\n $now\n )\n ON CONFLICT(run_id) DO UPDATE SET\n status = excluded.status,\n title = COALESCE(anvia_studio_session_runs.title, excluded.title),\n transcript_json = excluded.transcript_json,\n error_json = excluded.error_json,\n updated_at = excluded.updated_at`,\n ).run({\n $runId: input.runId,\n $sessionId: input.id,\n $status: input.status,\n $title: input.title ?? null,\n $transcript: JSON.stringify(renumberTranscript(input.transcript)),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $now: now,\n });\n\n db.prepare(\n `UPDATE anvia_studio_sessions\n SET title = $title,\n updated_at = $updatedAt\n WHERE id = $id`,\n ).run({\n $id: input.id,\n $title: title ?? null,\n $updatedAt: now,\n });\n db.exec(\"COMMIT\");\n\n const updated = this.getSession(input.id);\n return updated;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n appendSessionLog(input: StudioSessionLogAppendInput): StudioSessionLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const row = this.getSessionRow(input.sessionId);\n if (row === undefined) {\n throw new Error(\"Session not found\");\n }\n const sequence = this.nextSessionLogSequence(input.sessionId);\n const entry: StudioSessionLogEntry = {\n id: globalThis.crypto.randomUUID(),\n sessionId: input.sessionId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n\n db.prepare(\n `INSERT INTO anvia_studio_session_logs (\n id,\n session_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $sessionId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $sessionId: entry.sessionId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listSessionLogs(options: StudioSessionLogListOptions): StudioSessionLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, session_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as SessionLogRow[];\n\n return rows.map(toSessionLog);\n }\n\n appendPipelineLog(input: StudioPipelineLogAppendInput): StudioPipelineLogEntry {\n const db = this.database();\n const now = new Date().toISOString();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n const sequence = this.nextPipelineLogSequence(input.pipelineId);\n const entry: StudioPipelineLogEntry = {\n id: globalThis.crypto.randomUUID(),\n pipelineId: input.pipelineId,\n ...(input.runId === undefined ? {} : { runId: input.runId }),\n sequence,\n timestamp: now,\n level: input.level,\n category: input.category,\n event: input.event,\n message: input.message,\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n };\n\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_logs (\n id,\n pipeline_id,\n run_id,\n sequence,\n timestamp,\n level,\n category,\n event,\n message,\n metadata_json\n ) VALUES (\n $id,\n $pipelineId,\n $runId,\n $sequence,\n $timestamp,\n $level,\n $category,\n $event,\n $message,\n $metadata\n )`,\n ).run({\n $id: entry.id,\n $pipelineId: entry.pipelineId,\n $runId: entry.runId ?? null,\n $sequence: entry.sequence,\n $timestamp: entry.timestamp,\n $level: entry.level,\n $category: entry.category,\n $event: entry.event,\n $message: entry.message,\n $metadata: entry.metadata === undefined ? null : JSON.stringify(entry.metadata),\n });\n\n db.exec(\"COMMIT\");\n return entry;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listPipelineLogs(options: StudioPipelineLogListOptions): StudioPipelineLogEntry[] {\n const db = this.database();\n const afterClause = options.after === undefined ? \"\" : \"AND sequence > $after\";\n const rows = db\n .prepare(\n `SELECT id, pipeline_id, run_id, sequence, timestamp, level, category, event, message,\n metadata_json\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId\n ${afterClause}\n ORDER BY sequence ASC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $after: options.after ?? null,\n $limit: options.limit,\n }) as PipelineLogRow[];\n\n return rows.map(toPipelineLog);\n }\n\n savePipelineRun(input: StudioPipelineRunSaveInput): StudioPipelineRunRecord {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_pipeline_runs (\n run_id,\n pipeline_id,\n status,\n input_json,\n output_json,\n error_json,\n metadata_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $runId,\n $pipelineId,\n $status,\n $input,\n $output,\n $error,\n $metadata,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(run_id) DO UPDATE SET\n pipeline_id = excluded.pipeline_id,\n status = excluded.status,\n input_json = excluded.input_json,\n output_json = excluded.output_json,\n error_json = excluded.error_json,\n metadata_json = excluded.metadata_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $runId: input.runId,\n $pipelineId: input.pipelineId,\n $status: input.status,\n $input: JSON.stringify(input.input),\n $output: input.output === undefined ? null : JSON.stringify(input.output),\n $error: input.error === undefined ? null : JSON.stringify(input.error),\n $metadata: input.metadata === undefined ? null : JSON.stringify(input.metadata),\n $startedAt: input.startedAt,\n $endedAt: input.endedAt ?? null,\n $durationMs: input.durationMs ?? null,\n });\n\n return {\n runId: input.runId,\n pipelineId: input.pipelineId,\n status: input.status,\n input: input.input,\n ...(input.output === undefined ? {} : { output: input.output }),\n ...(input.error === undefined ? {} : { error: input.error }),\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n startedAt: input.startedAt,\n ...(input.endedAt === undefined ? {} : { endedAt: input.endedAt }),\n ...(input.durationMs === undefined ? {} : { durationMs: input.durationMs }),\n };\n }\n\n listPipelineRuns(options: StudioPipelineRunListOptions): StudioPipelineRunRecord[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT run_id, pipeline_id, status, input_json, output_json, error_json,\n metadata_json, started_at, ended_at, duration_ms\n FROM anvia_studio_pipeline_runs\n WHERE pipeline_id = $pipelineId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $pipelineId: options.pipelineId,\n $limit: options.limit,\n }) as PipelineRunRow[];\n\n return rows.map(toPipelineRun);\n }\n\n deleteSession(id: string): boolean {\n const db = this.database();\n\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n db.prepare(\"DELETE FROM anvia_studio_traces WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_runs WHERE session_id = $id\").run({ $id: id });\n db.prepare(\"DELETE FROM anvia_studio_session_logs WHERE session_id = $id\").run({ $id: id });\n const result = db\n .prepare(\"DELETE FROM anvia_studio_sessions WHERE id = $id\")\n .run({ $id: id }) as {\n changes: number | bigint;\n };\n db.exec(\"COMMIT\");\n return Number(result.changes) > 0;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n }\n\n listTraces(options: StudioTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const filters: string[] = [];\n const values: Record<string, string | number | null> = {\n $limit: options.limit,\n };\n\n if (options.agentId !== undefined) {\n filters.push(\n \"(s.agent_id = $agentId OR json_extract(t.metadata_json, '$.metadata.agentId') = $agentId)\",\n );\n values.$agentId = options.agentId;\n }\n if (options.sessionId !== undefined) {\n filters.push(\"t.session_id = $sessionId\");\n values.$sessionId = options.sessionId;\n }\n if (options.status !== undefined) {\n filters.push(\"t.status = $status\");\n values.$status = options.status;\n }\n\n const whereClause = filters.length === 0 ? \"\" : `WHERE ${filters.join(\" AND \")}`;\n const rows = db\n .prepare(\n `SELECT t.id, t.session_id, t.name, t.status, t.trace_json, t.input_json, t.output,\n t.error_json, t.usage_json, t.metadata_json, t.observations_json,\n t.started_at, t.ended_at, t.duration_ms\n FROM anvia_studio_traces t\n LEFT JOIN anvia_studio_sessions s ON s.id = t.session_id\n ${whereClause}\n ORDER BY t.started_at DESC\n LIMIT $limit`,\n )\n .all(values) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n listSessionTraces(options: StudioSessionTraceListOptions): StudioTraceSummary[] {\n const db = this.database();\n const rows = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE session_id = $sessionId\n ORDER BY started_at DESC\n LIMIT $limit`,\n )\n .all({\n $sessionId: options.sessionId,\n $limit: options.limit,\n }) as TraceRow[];\n\n return rows.map(toTraceSummary);\n }\n\n getTrace(id: string): StudioTrace | undefined {\n const db = this.database();\n const row = db\n .prepare(\n `SELECT id, session_id, name, status, trace_json, input_json, output, error_json,\n usage_json, metadata_json, observations_json, started_at, ended_at, duration_ms\n FROM anvia_studio_traces\n WHERE id = $id`,\n )\n .get({ $id: id }) as TraceRow | undefined;\n\n return row === undefined ? undefined : toTrace(row);\n }\n\n saveTrace(trace: StudioTrace): StudioTrace {\n const db = this.database();\n db.prepare(\n `INSERT INTO anvia_studio_traces (\n id,\n session_id,\n name,\n status,\n trace_json,\n input_json,\n output,\n error_json,\n usage_json,\n metadata_json,\n observations_json,\n started_at,\n ended_at,\n duration_ms\n ) VALUES (\n $id,\n $sessionId,\n $name,\n $status,\n $trace,\n $input,\n $output,\n $error,\n $usage,\n $metadata,\n $observations,\n $startedAt,\n $endedAt,\n $durationMs\n )\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n name = excluded.name,\n status = excluded.status,\n trace_json = excluded.trace_json,\n input_json = excluded.input_json,\n output = excluded.output,\n error_json = excluded.error_json,\n usage_json = excluded.usage_json,\n metadata_json = excluded.metadata_json,\n observations_json = excluded.observations_json,\n started_at = excluded.started_at,\n ended_at = excluded.ended_at,\n duration_ms = excluded.duration_ms`,\n ).run({\n $id: trace.id,\n $sessionId: trace.sessionId,\n $name: trace.name ?? null,\n $status: trace.status,\n $trace: trace.trace === undefined ? null : JSON.stringify(trace.trace),\n $input: trace.input === undefined ? null : JSON.stringify(trace.input),\n $output: trace.output ?? null,\n $error: trace.error === undefined ? null : JSON.stringify(trace.error),\n $usage: trace.usage === undefined ? null : JSON.stringify(trace.usage),\n $metadata: trace.metadata === undefined ? null : JSON.stringify(trace.metadata),\n $observations: JSON.stringify(trace.observations),\n $startedAt: trace.startedAt,\n $endedAt: trace.endedAt ?? null,\n $durationMs: trace.durationMs ?? null,\n });\n\n return trace;\n }\n\n private database(): DatabaseSyncType {\n if (this.db !== undefined) {\n return this.db;\n }\n\n if (this.path !== \":memory:\") {\n mkdirSync(dirname(resolve(this.path)), { recursive: true });\n }\n\n const db = new (loadDatabaseSync())(this.path, {\n allowUnknownNamedParameters: true,\n timeout: 5000,\n });\n db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n `);\n guardAgainstLegacySessionSchema(db);\n db.exec(`\n CREATE TABLE IF NOT EXISTS anvia_studio_sessions (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n title TEXT,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_sessions_agent_updated_idx\n ON anvia_studio_sessions(agent_id, updated_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_messages (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n role TEXT NOT NULL,\n message_id TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_messages_session_idx\n ON anvia_studio_session_messages(session_id, message_index ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_message_parts (\n session_id TEXT NOT NULL,\n message_index INTEGER NOT NULL,\n part_index INTEGER NOT NULL,\n type TEXT NOT NULL,\n part_json TEXT NOT NULL,\n PRIMARY KEY(session_id, message_index, part_index),\n FOREIGN KEY(session_id, message_index)\n REFERENCES anvia_studio_session_messages(session_id, message_index)\n ON DELETE CASCADE\n ) STRICT;\n CREATE TABLE IF NOT EXISTS anvia_studio_session_runs (\n run_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n title TEXT,\n transcript_json TEXT NOT NULL,\n error_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_runs_session_created_idx\n ON anvia_studio_session_runs(session_id, created_at ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_session_logs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(session_id, sequence),\n FOREIGN KEY(session_id) REFERENCES anvia_studio_sessions(id) ON DELETE CASCADE\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_session_logs_session_sequence_idx\n ON anvia_studio_session_logs(session_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_logs (\n id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n run_id TEXT,\n sequence INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n category TEXT NOT NULL,\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata_json TEXT,\n UNIQUE(pipeline_id, sequence)\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_logs_pipeline_sequence_idx\n ON anvia_studio_pipeline_logs(pipeline_id, sequence ASC);\n CREATE TABLE IF NOT EXISTS anvia_studio_pipeline_runs (\n run_id TEXT PRIMARY KEY,\n pipeline_id TEXT NOT NULL,\n status TEXT NOT NULL,\n input_json TEXT NOT NULL,\n output_json TEXT,\n error_json TEXT,\n metadata_json TEXT,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_pipeline_runs_pipeline_started_idx\n ON anvia_studio_pipeline_runs(pipeline_id, started_at DESC);\n CREATE TABLE IF NOT EXISTS anvia_studio_traces (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n name TEXT,\n status TEXT NOT NULL,\n trace_json TEXT,\n input_json TEXT,\n output TEXT,\n error_json TEXT,\n usage_json TEXT,\n metadata_json TEXT,\n observations_json TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n duration_ms INTEGER\n ) STRICT;\n CREATE INDEX IF NOT EXISTS anvia_studio_traces_session_started_idx\n ON anvia_studio_traces(session_id, started_at DESC);\n `);\n\n this.db = db;\n return db;\n }\n\n private getSessionRow(id: string): SessionRow | undefined {\n return this.database()\n .prepare(\n `SELECT id, agent_id, title, metadata_json, created_at, updated_at\n FROM anvia_studio_sessions\n WHERE id = $id`,\n )\n .get({ $id: id }) as SessionRow | undefined;\n }\n\n private getSessionRun(sessionId: string, runId: string): SessionRunRow | undefined {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId AND run_id = $runId`,\n )\n .get({ $sessionId: sessionId, $runId: runId }) as SessionRunRow | undefined;\n }\n\n private listSessionRunRows(sessionId: string): SessionRunRow[] {\n return this.database()\n .prepare(\n `SELECT run_id, session_id, status, title, transcript_json, error_json, created_at, updated_at\n FROM anvia_studio_session_runs\n WHERE session_id = $sessionId\n ORDER BY created_at ASC`,\n )\n .all({ $sessionId: sessionId }) as SessionRunRow[];\n }\n\n private nextSessionLogSequence(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_session_logs\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private nextPipelineLogSequence(pipelineId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(sequence) + 1, 0) AS next_sequence\n FROM anvia_studio_pipeline_logs\n WHERE pipeline_id = $pipelineId`,\n )\n .get({ $pipelineId: pipelineId }) as { next_sequence: number };\n return row.next_sequence;\n }\n\n private listSessionMessages(sessionId: string): Message[] {\n const db = this.database();\n const messageRows = db\n .prepare(\n `SELECT session_id, message_index, role, message_id, created_at\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId\n ORDER BY message_index ASC`,\n )\n .all({ $sessionId: sessionId }) as MessageRow[];\n\n if (messageRows.length === 0) {\n return [];\n }\n\n const partRows = db\n .prepare(\n `SELECT session_id, message_index, part_index, type, part_json\n FROM anvia_studio_session_message_parts\n WHERE session_id = $sessionId\n ORDER BY message_index ASC, part_index ASC`,\n )\n .all({ $sessionId: sessionId }) as MessagePartRow[];\n const partsByMessage = new Map<number, MessagePartRow[]>();\n for (const partRow of partRows) {\n const parts = partsByMessage.get(partRow.message_index) ?? [];\n parts.push(partRow);\n partsByMessage.set(partRow.message_index, parts);\n }\n\n return messageRows.map((row) =>\n messageFromRows(row, partsByMessage.get(row.message_index) ?? []),\n );\n }\n\n private nextMessageIndex(sessionId: string): number {\n const row = this.database()\n .prepare(\n `SELECT COALESCE(MAX(message_index) + 1, 0) AS next_index\n FROM anvia_studio_session_messages\n WHERE session_id = $sessionId`,\n )\n .get({ $sessionId: sessionId }) as { next_index: number };\n return row.next_index;\n }\n\n private insertMessages(\n sessionId: string,\n messages: Message[],\n startIndex: number,\n createdAt: string,\n ): void {\n const db = this.database();\n const insertMessage = db.prepare(\n `INSERT INTO anvia_studio_session_messages (\n session_id,\n message_index,\n role,\n message_id,\n created_at\n ) VALUES ($sessionId, $messageIndex, $role, $messageId, $createdAt)`,\n );\n const insertPart = db.prepare(\n `INSERT INTO anvia_studio_session_message_parts (\n session_id,\n message_index,\n part_index,\n type,\n part_json\n ) VALUES ($sessionId, $messageIndex, $partIndex, $type, $partJson)`,\n );\n\n messages.forEach((message, messageOffset) => {\n const messageIndex = startIndex + messageOffset;\n insertMessage.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $role: message.role,\n $messageId: message.role === \"assistant\" ? (message.id ?? null) : null,\n $createdAt: createdAt,\n });\n\n messageParts(message).forEach((part, partIndex) => {\n insertPart.run({\n $sessionId: sessionId,\n $messageIndex: messageIndex,\n $partIndex: partIndex,\n $type: part.type,\n $partJson: JSON.stringify(part.value),\n });\n });\n });\n }\n}\n\nfunction toSession(\n row: SessionRow,\n messages: Message[],\n runRows: SessionRunRow[] = [],\n): StudioSession {\n const summary = toSessionSummary({ ...row, message_count: messages.length });\n const runTranscript = runRows.flatMap((runRow) =>\n parseJsonArray<StudioTranscriptEntry>(runRow.transcript_json),\n );\n return {\n ...summary,\n messages,\n transcript: renumberTranscript(runTranscript),\n };\n}\n\nfunction toSessionSummary(row: SessionSummaryRow): StudioSessionSummary {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n agentId: row.agent_id,\n ...(row.title === null ? {} : { title: row.title }),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n messageCount: row.message_count,\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nfunction toSessionLog(row: SessionLogRow): StudioSessionLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n sessionId: row.session_id,\n ...(row.run_id === null ? {} : { runId: row.run_id }),\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nfunction toPipelineLog(row: PipelineLogRow): StudioPipelineLogEntry {\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n pipelineId: row.pipeline_id,\n ...(row.run_id === null ? {} : { runId: row.run_id }),\n sequence: row.sequence,\n timestamp: row.timestamp,\n level: row.level,\n category: row.category,\n event: row.event,\n message: row.message,\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nfunction toPipelineRun(row: PipelineRunRow): StudioPipelineRunRecord {\n const output = parseJsonValue<JsonValue>(row.output_json);\n const error = parseJsonValue<JsonValue>(row.error_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n runId: row.run_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n input: JSON.parse(row.input_json) as JsonValue,\n ...(output === undefined ? {} : { output }),\n ...(error === undefined ? {} : { error }),\n ...(metadata === undefined ? {} : { metadata }),\n startedAt: row.started_at,\n ...(row.ended_at === null ? {} : { endedAt: row.ended_at }),\n ...(row.duration_ms === null ? {} : { durationMs: row.duration_ms }),\n };\n}\n\nfunction messageParts(message: Message): StoredMessagePart[] {\n if (message.role === \"system\") {\n return [{ type: \"text\", value: { type: \"text\", text: message.content } }];\n }\n\n return message.content.map((content) => ({\n type: content.type,\n value: content,\n }));\n}\n\nfunction messageFromRows(row: MessageRow, partRows: MessagePartRow[]): Message {\n const parts = partRows.map((partRow) => JSON.parse(partRow.part_json) as unknown);\n\n if (row.role === \"system\") {\n return { role: \"system\", content: systemContentFromParts(parts) };\n }\n if (row.role === \"user\") {\n return {\n role: \"user\",\n content: parts as Extract<Message, { role: \"user\" }>[\"content\"],\n };\n }\n if (row.role === \"assistant\") {\n return {\n role: \"assistant\",\n ...(row.message_id === null ? {} : { id: row.message_id }),\n content: parts as Extract<Message, { role: \"assistant\" }>[\"content\"],\n };\n }\n if (row.role === \"tool\") {\n return {\n role: \"tool\",\n content: parts as Extract<Message, { role: \"tool\" }>[\"content\"],\n };\n }\n\n throw new Error(`Unsupported stored message role: ${row.role}`);\n}\n\nfunction systemContentFromParts(parts: unknown[]): string {\n const first = parts[0];\n if (\n typeof first === \"object\" &&\n first !== null &&\n \"type\" in first &&\n first.type === \"text\" &&\n \"text\" in first &&\n typeof first.text === \"string\"\n ) {\n return first.text;\n }\n return \"\";\n}\n\nfunction guardAgainstLegacySessionSchema(db: DatabaseSyncType): void {\n const columns = db.prepare(\"PRAGMA table_info('anvia_studio_sessions')\").all() as TableInfoRow[];\n if (columns.some((column) => column.name === \"messages_json\")) {\n throw new Error(\n \"Existing Studio SQLite DB uses the legacy messages_json schema. Delete or recreate the Studio SQLite DB to use normalized session messages.\",\n );\n }\n}\n\nfunction loadDatabaseSync(): DatabaseSyncConstructor {\n if (DatabaseSync !== undefined) {\n return DatabaseSync;\n }\n\n try {\n ({ DatabaseSync } = createRequire(import.meta.url)(\n \"node:sqlite\",\n ) as typeof import(\"node:sqlite\"));\n return DatabaseSync;\n } catch (error) {\n throw new Error(\n \"The default Studio SQLite store requires Node.js with node:sqlite support. Provide custom Studio stores or disable persisted stores when running Studio in a runtime without node:sqlite.\",\n { cause: error },\n );\n }\n}\n\nfunction toTrace(row: TraceRow): StudioTrace {\n const trace = parseJsonValue<StudioTrace[\"trace\"]>(row.trace_json);\n const input = parseJsonValue<StudioTrace[\"input\"]>(row.input_json);\n return {\n ...toTraceSummary(row),\n ...(trace === undefined ? {} : { trace }),\n ...(input === undefined ? {} : { input }),\n observations: parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json),\n };\n}\n\nfunction toTraceSummary(row: TraceRow): StudioTraceSummary {\n const observations = parseJsonArray<StudioTrace[\"observations\"][number]>(row.observations_json);\n const error = parseJsonValue<StudioTraceSummary[\"error\"]>(row.error_json);\n const usage = parseJsonValue<StudioTraceSummary[\"usage\"]>(row.usage_json);\n const metadata = parseJsonValue<JsonObject>(row.metadata_json);\n return {\n id: row.id,\n sessionId: row.session_id,\n ...(row.name === null ? {} : { name: row.name }),\n status: row.status,\n startedAt: row.started_at,\n ...(row.ended_at === null ? {} : { endedAt: row.ended_at }),\n ...(row.duration_ms === null ? {} : { durationMs: row.duration_ms }),\n ...(row.output === null ? {} : { output: row.output }),\n ...(error === undefined ? {} : { error }),\n ...(usage === undefined ? {} : { usage }),\n ...(metadata === undefined ? {} : { metadata }),\n observationCount: observations.length,\n };\n}\n\nfunction parseJsonArray<T>(value: string): T[] {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as T[]) : [];\n}\n\nfunction parseJsonValue<T>(value: string | null): T | undefined {\n if (value === null) {\n return undefined;\n }\n return JSON.parse(value) as T;\n}\n\nfunction renumberTranscript(entries: StudioTranscriptEntry[]): StudioTranscriptEntry[] {\n return entries.map((entry, entryId) => ({ ...entry, entryId }));\n}\n\nfunction studioRunId(context: MemoryContext): string | undefined {\n const value = context.metadata?.studioRunId;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction serializeJsonError(error: unknown): JsonValue {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n if (\n error === null ||\n typeof error === \"string\" ||\n typeof error === \"number\" ||\n typeof error === \"boolean\"\n ) {\n return error;\n }\n return String(error);\n}\n\nfunction transcriptFromMessagesFallback(messages: Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\n }\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: \"tool_result\",\n callId: content.callId ?? content.id,\n result: content.content\n .map((item) =>\n \"text\" in item ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\n .join(\"\\n\"),\n structuredResult: content.content,\n });\n }\n continue;\n }\n\n for (const content of message.content) {\n if (content.type === \"text\") {\n appendAssistantTranscriptText(transcript, content.text);\n } else if (content.type === \"reasoning\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"reasoning\",\n ...(content.id === undefined ? {} : { reasoningId: content.id }),\n text: content.text,\n });\n } else if (content.type === \"tool_call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: content.function.name,\n callId: content.callId ?? content.id,\n args: formatJson(content.function.arguments),\n });\n }\n }\n }\n return transcript;\n}\n\nfunction appendAssistantTranscriptText(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (last?.kind === \"message\" && last.role === \"assistant\") {\n last.text = `${last.text}${text}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n });\n}\n\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function toJsonValue(value: unknown): JsonValue {\n return toJsonValueInternal(value, new WeakSet<object>());\n}\n\nfunction toJsonValueInternal(value: unknown, seen: WeakSet<object>): JsonValue {\n if (\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 if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return value.map((item) => toJsonValueInternal(item, seen));\n } finally {\n seen.delete(value);\n }\n }\n if (typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n try {\n return compactJsonObjectInternal(value as Record<string, unknown>, seen);\n } finally {\n seen.delete(value);\n }\n }\n return String(value);\n}\n\nexport function compactJsonObject(values: Record<string, unknown>): JsonObject {\n return compactJsonObjectInternal(values, new WeakSet<object>());\n}\n\nfunction compactJsonObjectInternal(\n values: Record<string, unknown>,\n seen: WeakSet<object>,\n): JsonObject {\n const entries = Object.entries(values).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, toJsonValueInternal(value, seen)]],\n );\n return Object.fromEntries(entries) as JsonObject;\n}\n\nexport function serializeUnknown(error: unknown): JsonValue {\n if (error instanceof Error) {\n return compactJsonObject({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n }\n return toJsonValue(error);\n}\n","import { type AnyTool, ToolSet } from \"@anvia/core/tool\";\nimport type { StudioAgent, StudioAgentToolApprovalMetadata, StudioAgentToolSource } from \"../types\";\n\nexport type AgentToolItem = {\n tool: AnyTool;\n source: StudioAgentToolSource;\n};\n\nconst MCP_TOOL_METADATA_KEY = Symbol.for(\"anvia.mcp.tool.metadata\");\n\nexport function agentToolItems(agent: StudioAgent): AgentToolItem[] {\n return [\n ...agent.agent.toolSet.values().map((tool) => ({ tool, source: \"static\" as const })),\n ...agent.agent.dynamicTools.flatMap((registration) => {\n const maybeToolSet = (registration.index as { toolSet?: unknown }).toolSet;\n if (!(maybeToolSet instanceof ToolSet)) {\n return [];\n }\n return maybeToolSet.values().map((tool) => ({ tool, source: \"dynamic\" as const }));\n }),\n ];\n}\n\nexport function approvalMetadata(tool: AnyTool): StudioAgentToolApprovalMetadata {\n const approval = tool.approval;\n if (approval === undefined || typeof approval !== \"object\" || approval === null) {\n return { required: false };\n }\n\n const policy = approval as {\n reason?: unknown;\n rejectMessage?: unknown;\n };\n return {\n required: true,\n ...(typeof policy.reason === \"string\" ? { reason: policy.reason } : {}),\n ...(typeof policy.rejectMessage === \"string\" ? { rejectMessage: policy.rejectMessage } : {}),\n };\n}\n\nexport function mcpServerName(tool: AnyTool): string | undefined {\n const metadata = (tool as { [MCP_TOOL_METADATA_KEY]?: unknown })[MCP_TOOL_METADATA_KEY];\n if (typeof metadata !== \"object\" || metadata === null) {\n return undefined;\n }\n const serverName = (metadata as { serverName?: unknown }).serverName;\n return typeof serverName === \"string\" && serverName.length > 0 ? serverName : undefined;\n}\n\nexport function agentHasMcpTools(agent: StudioAgent): boolean {\n return agentToolItems(agent).some(({ tool }) => mcpServerName(tool) !== undefined);\n}\n","import type { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type { AgentTraceOptions } from \"@anvia/core/observability\";\nimport type { Context } from \"hono\";\nimport { createInMemoryStudioStore } from \"../storage/memory-store\";\nimport { createSqliteSessionStore } from \"../storage/sqlite-store\";\nimport type {\n StudioAgent,\n StudioAgentConfig,\n StudioAgentRuntimeSummary,\n StudioCapability,\n StudioCapabilityConfig,\n StudioConfig,\n StudioErrorCode,\n StudioErrorResponse,\n StudioEvalSuite,\n StudioEvalSuiteConfig,\n StudioPipeline,\n StudioPipelineConfig,\n StudioPipelineLogStore,\n StudioPipelineRunStore,\n StudioSessionStore,\n StudioStores,\n StudioTraceStatus,\n StudioTraceStore,\n StudioUiOptions,\n} from \"../types\";\nimport { toJsonValue } from \"./json\";\nimport { agentHasMcpTools, agentToolItems, mcpServerName } from \"./tool-metadata\";\n\nexport type ResolvedStores = {\n sessions?: StudioSessionStore;\n traces?: StudioTraceStore;\n pipelineLogs?: StudioPipelineLogStore;\n pipelineRuns?: StudioPipelineRunStore;\n};\n\nexport type StudioRuntimeOptions = {\n id?: string;\n name?: string;\n description?: string;\n version?: string;\n agents: StudioAgent[];\n pipelines: StudioPipeline[];\n evals: StudioEvalSuite[];\n stores?: StudioStores;\n ui?: boolean | StudioUiOptions;\n};\n\nexport function resolveStores(options: StudioRuntimeOptions): ResolvedStores {\n const defaultStore = defaultStudioStore();\n const sessions = resolveSessionStore(options, defaultStore);\n const traces = resolveTraceStore(options, sessions, defaultStore);\n const pipelineLogs = resolvePipelineLogStore(options, sessions, defaultStore);\n const pipelineRuns = resolvePipelineRunStore(options, sessions, pipelineLogs, defaultStore);\n return {\n ...(sessions === undefined ? {} : { sessions }),\n ...(traces === undefined ? {} : { traces }),\n ...(pipelineLogs === undefined ? {} : { pipelineLogs }),\n ...(pipelineRuns === undefined ? {} : { pipelineRuns }),\n };\n}\n\nfunction defaultStudioStore(): StudioSessionStore &\n StudioTraceStore &\n StudioPipelineLogStore &\n StudioPipelineRunStore {\n const sqlitePath = process.env.ANVIA_STUDIO_DB ?? process.env.AION_STUDIO_DB;\n return sqlitePath === undefined\n ? createInMemoryStudioStore()\n : createSqliteSessionStore({ path: sqlitePath });\n}\n\nfunction resolveSessionStore(\n options: StudioRuntimeOptions,\n defaultStore: StudioSessionStore,\n): StudioSessionStore | undefined {\n if (options.stores?.sessions === false) {\n return undefined;\n }\n if (options.stores?.sessions !== undefined) {\n return options.stores.sessions;\n }\n\n return defaultStore;\n}\n\nfunction resolveTraceStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioTraceStore,\n): StudioTraceStore | undefined {\n if (options.stores?.traces !== undefined) {\n return options.stores.traces;\n }\n if (sessionStore === undefined) {\n return undefined;\n }\n if (isTraceStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineLogStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n defaultStore: StudioPipelineLogStore,\n): StudioPipelineLogStore | undefined {\n if (options.stores?.pipelineLogs === false) {\n return undefined;\n }\n if (options.stores?.pipelineLogs !== undefined) {\n return options.stores.pipelineLogs;\n }\n if (sessionStore !== undefined && isPipelineLogStore(sessionStore)) {\n return sessionStore;\n }\n return defaultStore;\n}\n\nfunction resolvePipelineRunStore(\n options: StudioRuntimeOptions,\n sessionStore: StudioSessionStore | undefined,\n pipelineLogStore: StudioPipelineLogStore | undefined,\n defaultStore: StudioPipelineRunStore,\n): StudioPipelineRunStore | undefined {\n if (options.stores?.pipelineRuns === false) {\n return undefined;\n }\n if (options.stores?.pipelineRuns !== undefined) {\n return options.stores.pipelineRuns;\n }\n if (sessionStore !== undefined && isPipelineRunStore(sessionStore)) {\n return sessionStore;\n }\n if (pipelineLogStore !== undefined && isPipelineRunStore(pipelineLogStore)) {\n return pipelineLogStore;\n }\n return defaultStore;\n}\n\nfunction isTraceStore(store: StudioSessionStore): store is StudioSessionStore & StudioTraceStore {\n const candidate = store as Partial<StudioTraceStore>;\n return (\n typeof candidate.listSessionTraces === \"function\" &&\n typeof candidate.getTrace === \"function\" &&\n typeof candidate.saveTrace === \"function\"\n );\n}\n\nfunction isPipelineLogStore(\n store: StudioSessionStore,\n): store is StudioSessionStore & StudioPipelineLogStore {\n const candidate = store as Partial<StudioPipelineLogStore>;\n return (\n typeof candidate.appendPipelineLog === \"function\" &&\n typeof candidate.listPipelineLogs === \"function\"\n );\n}\n\nfunction isPipelineRunStore(store: object): store is object & StudioPipelineRunStore {\n const candidate = store as Partial<StudioPipelineRunStore>;\n return (\n typeof candidate.savePipelineRun === \"function\" &&\n typeof candidate.listPipelineRuns === \"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 normalizePipelines(pipelines: StudioPipeline[]): StudioPipeline[] {\n const ids = new Set<string>();\n return pipelines.map((pipeline) => {\n const id = pipeline.id.trim();\n if (id.length === 0) {\n throw new Error(\"Studio pipeline id cannot be empty\");\n }\n if (ids.has(id)) {\n throw new Error(`Duplicate Studio pipeline id: ${id}`);\n }\n ids.add(id);\n return { ...pipeline, id };\n });\n}\n\nexport function buildConfig(\n options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\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 pipelines: pipelines.map(pipelineConfig),\n evals: options.evals.map(evalConfig),\n chat: {\n quickPrompts: Object.fromEntries(agents.map((agent) => [agent.id, agent.quickPrompts ?? []])),\n },\n capabilities: capabilityConfig(options, agents, pipelines, stores),\n unsupportedCapabilities: unsupportedCapabilities(stores),\n };\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 agentRuntimeSummary(agent: StudioAgent): StudioAgentRuntimeSummary {\n const tools = agentToolItems(agent);\n const name = agent.name ?? agent.agent.name;\n const description = agent.description ?? agent.agent.description;\n return {\n id: agent.id,\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n model: toJsonValue(agent.agent.model),\n toolCount: tools.length,\n staticToolCount: tools.filter((item) => item.source === \"static\").length,\n dynamicToolCount: tools.filter((item) => item.source === \"dynamic\").length,\n approvalToolCount: tools.filter((item) => item.tool.approval !== undefined).length,\n mcpToolCount: tools.filter((item) => mcpServerName(item.tool) !== undefined).length,\n staticContextCount: agent.agent.staticContext.length,\n dynamicContextCount: agent.agent.dynamicContexts.length,\n observerCount: agent.agent.observers.length,\n hasMemory: agent.agent.memory !== undefined,\n hasHook: agent.agent.hook !== undefined,\n hasOutputSchema: agent.agent.outputSchema !== undefined,\n ...(agent.agent.defaultMaxTurns === undefined\n ? {}\n : { defaultMaxTurns: agent.agent.defaultMaxTurns }),\n ...(agent.metadata === undefined ? {} : { metadata: agent.metadata }),\n };\n}\n\nexport function pipelineConfig(pipeline: StudioPipeline): StudioPipelineConfig {\n const graph = pipeline.pipeline.graph();\n const stageNodes = graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\");\n return {\n id: pipeline.id,\n ...(pipeline.name === undefined ? {} : { name: pipeline.name }),\n ...(pipeline.description === undefined ? {} : { description: pipeline.description }),\n ...(pipeline.metadata === undefined ? {} : { metadata: pipeline.metadata }),\n stageCount: stageNodes.length,\n edgeCount: graph.edges.length,\n hasParallelStages: graph.nodes.some((node) => node.kind === \"parallel\"),\n agentCount: graph.nodes.filter((node) => node.kind === \"agent\").length,\n extractorCount: graph.nodes.filter((node) => node.kind === \"extractor\").length,\n };\n}\n\nexport function capabilityConfig(\n _options: StudioRuntimeOptions,\n agents: StudioAgent[],\n pipelines: StudioPipeline[],\n stores: ResolvedStores,\n): Partial<Record<StudioCapability, StudioCapabilityConfig>> {\n const capabilities: Partial<Record<StudioCapability, StudioCapabilityConfig>> = {\n agents: { enabled: true },\n observability: { enabled: true },\n status: { enabled: true },\n };\n\n if (stores.sessions !== undefined) {\n capabilities.sessions = { enabled: true };\n capabilities.memory = { enabled: true };\n }\n if (stores.traces !== undefined) {\n capabilities.traces = { enabled: true };\n }\n if (pipelines.length > 0) {\n capabilities.pipelines = { enabled: true };\n }\n if (_options.evals.length > 0) {\n capabilities.evals = { enabled: true };\n }\n if (\n agents.some(\n (agent) => agent.agent.toolSet.values().length > 0 || agent.agent.dynamicTools.length > 0,\n )\n ) {\n capabilities.tools = { enabled: true };\n }\n if (agents.some(agentHasMcpTools)) {\n capabilities.mcps = { enabled: true };\n }\n\n if (\n agents.some(\n (agent) =>\n agent.agent.hook !== undefined ||\n agent.agent.toolSet.values().some((tool) => tool.approval),\n )\n ) {\n capabilities.approvals = { enabled: true };\n }\n if (\n agents.some(\n (agent) =>\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0,\n )\n ) {\n capabilities.knowledge = { enabled: true };\n }\n return capabilities;\n}\n\nexport function evalConfig(suite: StudioEvalSuite): StudioEvalSuiteConfig {\n return {\n id: suite.id ?? suite.name,\n name: suite.name,\n ...(suite.description === undefined ? {} : { description: suite.description }),\n caseCount: suite.cases.length,\n metricNames: suite.metrics.map((metric) => metric.name),\n ...(suite.concurrency === undefined ? {} : { concurrency: suite.concurrency }),\n ...(suite.metadata === undefined ? {} : { metadata: suite.metadata }),\n };\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 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 { runEvalSuite } from \"@anvia/core/evals\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioEvalRunRequest, StudioEvalRunResponse, StudioEvalSuite } from \"../types\";\nimport { toJsonValue } from \"./json\";\nimport { errorResponse, evalConfig, isJsonObject, isObject, isPositiveInteger } from \"./shared\";\n\nexport function registerEvalRoutes(\n app: Hono,\n props: {\n evals: StudioEvalSuite[];\n evalMap: Map<string, StudioEvalSuite>;\n },\n): void {\n app.get(\"/evals\", (c) =>\n c.json({\n evals: props.evals.map(evalConfig),\n }),\n );\n\n app.get(\"/evals/:evalId\", (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n return c.json(evalConfig(suite));\n });\n\n app.post(\"/evals/:evalId/runs\", async (c) => {\n const suite = props.evalMap.get(c.req.param(\"evalId\"));\n if (suite === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Eval suite not found\");\n }\n\n const body = await parseEvalRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const result = await runEvalSuite({\n ...suite,\n ...(body.concurrency === undefined ? {} : { concurrency: body.concurrency }),\n });\n const endedAt = Date.now();\n const jsonResult = toJsonValue(result);\n const response: StudioEvalRunResponse = {\n runId,\n suiteId: suite.id ?? suite.name,\n startedAt: new Date(startedAt).toISOString(),\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n result: isJsonObject(jsonResult) ? jsonResult : { value: jsonResult },\n };\n return c.json(response);\n });\n}\n\nasync function parseEvalRunRequest(\n c: Context,\n): Promise<StudioEvalRunRequest | { error: Response }> {\n let body: unknown = {};\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioEvalRunRequest = {};\n if (\"concurrency\" in body) {\n if (!isPositiveInteger(body.concurrency)) {\n return {\n error: errorResponse(c, 400, \"bad_request\", \"concurrency must be a positive integer\"),\n };\n }\n request.concurrency = body.concurrency;\n }\n return request;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport type { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentKnowledgeConfig,\n StudioKnowledgeEvidence,\n StudioKnowledgeEvidenceDocument,\n StudioKnowledgeItem,\n StudioKnowledgeItemsPage,\n StudioKnowledgeSourceKind,\n StudioKnowledgeSourceSummary,\n StudioKnowledgeSummary,\n StudioTrace,\n StudioTraceStore,\n} from \"../types\";\nimport { compactJsonObject, toJsonValue } from \"./json\";\nimport { errorResponse, optionalQueryString, parseLimit } from \"./shared\";\n\ntype InspectableIndex = {\n inspect?: (request: { limit: number; cursor?: string | undefined; filter?: unknown }) => Promise<{\n items: Array<{ id: string; document: unknown; metadata?: Record<string, unknown> }>;\n nextCursor?: string | undefined;\n totalCount?: number | undefined;\n }>;\n};\n\nexport function registerKnowledgeRoutes(\n app: Hono,\n props: {\n agents: StudioAgent[];\n traceStore?: StudioTraceStore;\n },\n): void {\n app.get(\"/knowledge\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const summary: StudioKnowledgeSummary = {\n agents: await Promise.all(props.agents.map(agentKnowledgeConfig)),\n evidence: await recentKnowledgeEvidence(props.traceStore, limit),\n };\n return c.json(summary);\n });\n\n app.get(\"/knowledge/items\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"Invalid limit\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const sourceId = optionalQueryString(c.req.query(\"sourceId\"));\n if (agentId === undefined || sourceId === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"agentId and sourceId are required\");\n }\n\n const agent = props.agents.find((item) => item.id === agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n const page = await knowledgeItemsPage(agent, sourceId, {\n limit,\n cursor: optionalQueryString(c.req.query(\"cursor\")),\n });\n if (page === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Knowledge source not found\");\n }\n\n return c.json(page);\n });\n}\n\nexport function agentHasKnowledge(agent: StudioAgent): boolean {\n return (\n agent.agent.staticContext.length > 0 ||\n agent.agent.dynamicContexts.length > 0 ||\n agent.agent.dynamicTools.length > 0\n );\n}\n\nasync function agentKnowledgeConfig(agent: StudioAgent): Promise<StudioAgentKnowledgeConfig> {\n const agentName = agent.name ?? agent.agent.name;\n return {\n agentId: agent.id,\n ...(agentName === undefined ? {} : { agentName }),\n sources: await knowledgeSources(agent),\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 knowledgeSources(agent: StudioAgent): Promise<StudioKnowledgeSourceSummary[]> {\n const sources: StudioKnowledgeSourceSummary[] = [\n {\n sourceId: staticSourceId(),\n kind: \"static_context\",\n label: \"Static context\",\n count: agent.agent.staticContext.length,\n inspectable: true,\n itemCount: agent.agent.staticContext.length,\n },\n ];\n\n const dynamicContextSources = await Promise.all(\n agent.agent.dynamicContexts.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.filter);\n return {\n sourceId: dynamicContextSourceId(index),\n kind: \"dynamic_context\" as const,\n label: `Dynamic context ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...(registration.options.threshold === undefined\n ? {}\n : { threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...(count === undefined ? {} : { itemCount: count }),\n };\n }),\n );\n\n const dynamicToolSources = await Promise.all(\n agent.agent.dynamicTools.map(async (registration, index) => {\n const inspect = inspectFn(registration.index);\n const count = await inspectableCount(inspect, registration.options.filter);\n return {\n sourceId: dynamicToolsSourceId(index),\n kind: \"dynamic_tools\" as const,\n label: `Dynamic tools ${index + 1}`,\n count: 1,\n registrationIndex: index,\n topK: registration.options.topK,\n ...(registration.options.threshold === undefined\n ? {}\n : { threshold: registration.options.threshold }),\n inspectable: inspect !== undefined,\n ...(count === undefined ? {} : { itemCount: count }),\n };\n }),\n );\n\n return [...sources, ...dynamicContextSources, ...dynamicToolSources];\n}\n\nasync function inspectableCount(\n inspect: InspectableIndex[\"inspect\"] | undefined,\n filter?: unknown,\n): Promise<number | undefined> {\n if (inspect === undefined) {\n return undefined;\n }\n const page = await inspect({ limit: 1, filter });\n return page.totalCount;\n}\n\nasync function knowledgeItemsPage(\n agent: StudioAgent,\n sourceId: string,\n request: { limit: number; cursor?: string | undefined },\n): Promise<StudioKnowledgeItemsPage | undefined> {\n if (sourceId === staticSourceId()) {\n return staticKnowledgeItemsPage(agent, request);\n }\n\n const dynamicContextIndex = dynamicSourceIndex(sourceId, \"dynamic_context\");\n if (dynamicContextIndex !== undefined) {\n const registration = agent.agent.dynamicContexts[dynamicContextIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_context\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: registration.options.filter,\n });\n return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_context\",\n inspectable: true,\n items: page.items.map((item) => dynamicContextItem(item)),\n ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),\n ...(page.totalCount === undefined ? {} : { totalCount: page.totalCount }),\n };\n }\n\n const dynamicToolsIndex = dynamicSourceIndex(sourceId, \"dynamic_tools\");\n if (dynamicToolsIndex !== undefined) {\n const registration = agent.agent.dynamicTools[dynamicToolsIndex];\n if (registration === undefined) {\n return undefined;\n }\n const inspect = inspectFn(registration.index);\n if (inspect === undefined) {\n return nonInspectablePage(agent.id, sourceId, \"dynamic_tools\");\n }\n const page = await inspect({\n limit: request.limit,\n cursor: request.cursor,\n filter: registration.options.filter,\n });\n return {\n agentId: agent.id,\n sourceId,\n kind: \"dynamic_tools\",\n inspectable: true,\n items: page.items.map((item) => dynamicToolItem(item)),\n ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),\n ...(page.totalCount === undefined ? {} : { totalCount: page.totalCount }),\n };\n }\n\n return undefined;\n}\n\nfunction inspectFn(index: unknown): InspectableIndex[\"inspect\"] | undefined {\n if (!isRecord(index) || typeof index.inspect !== \"function\") {\n return undefined;\n }\n const inspect = index.inspect;\n return (request) =>\n inspect.call(index, request) as ReturnType<NonNullable<InspectableIndex[\"inspect\"]>>;\n}\n\nfunction staticKnowledgeItemsPage(\n agent: StudioAgent,\n request: { limit: number; cursor?: string | undefined },\n): StudioKnowledgeItemsPage {\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const page = agent.agent.staticContext.slice(start, start + request.limit);\n const nextOffset = start + page.length;\n return {\n agentId: agent.id,\n sourceId: staticSourceId(),\n kind: \"static_context\",\n inspectable: true,\n items: page.map((document) => ({\n id: document.id,\n kind: \"static_context\",\n text: document.text,\n ...(document.additionalProps === undefined\n ? {}\n : { metadata: jsonObjectFromRecord(document.additionalProps) }),\n })),\n ...(nextOffset < agent.agent.staticContext.length ? { nextCursor: String(nextOffset) } : {}),\n totalCount: agent.agent.staticContext.length,\n };\n}\n\nfunction nonInspectablePage(\n agentId: string,\n sourceId: string,\n kind: StudioKnowledgeSourceKind,\n): StudioKnowledgeItemsPage {\n return {\n agentId,\n sourceId,\n kind,\n inspectable: false,\n items: [],\n message: \"This source can be searched at runtime, but it does not expose browseable chunks.\",\n };\n}\n\nfunction dynamicContextItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const text =\n isRecord(item.document) && typeof item.document.text === \"string\"\n ? item.document.text\n : typeof item.document === \"string\"\n ? item.document\n : undefined;\n return {\n id: item.id,\n kind: \"dynamic_context\",\n ...(text === undefined ? { document: toJsonValue(item.document) } : { text }),\n ...(item.metadata === undefined ? {} : { metadata: jsonObjectFromRecord(item.metadata) }),\n };\n}\n\nfunction dynamicToolItem(item: {\n id: string;\n document: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): StudioKnowledgeItem {\n const document = isRecord(item.document) ? item.document : {};\n const definition = isRecord(document.definition) ? document.definition : {};\n const toolName =\n typeof document.toolName === \"string\"\n ? document.toolName\n : typeof definition.name === \"string\"\n ? definition.name\n : item.id;\n const description = typeof definition.description === \"string\" ? definition.description : \"\";\n return {\n id: item.id,\n kind: \"dynamic_tool\",\n toolName,\n description,\n parameterKeys: parameterKeys(definition.parameters),\n document: toJsonValue(item.document),\n ...(item.metadata === undefined ? {} : { metadata: jsonObjectFromRecord(item.metadata) }),\n };\n}\n\nfunction parameterKeys(parameters: unknown): string[] {\n if (!isRecord(parameters) || !isRecord(parameters.properties)) {\n return [];\n }\n return Object.keys(parameters.properties);\n}\n\nfunction staticSourceId(): string {\n return \"static-context\";\n}\n\nfunction dynamicContextSourceId(index: number): string {\n return `dynamic-context-${index}`;\n}\n\nfunction dynamicToolsSourceId(index: number): string {\n return `dynamic-tools-${index}`;\n}\n\nfunction dynamicSourceIndex(\n sourceId: string,\n kind: \"dynamic_context\" | \"dynamic_tools\",\n): number | undefined {\n const prefix = kind === \"dynamic_context\" ? \"dynamic-context-\" : \"dynamic-tools-\";\n if (!sourceId.startsWith(prefix)) {\n return undefined;\n }\n const index = Number(sourceId.slice(prefix.length));\n return Number.isInteger(index) && index >= 0 ? index : undefined;\n}\n\nasync function recentKnowledgeEvidence(\n traceStore: StudioTraceStore | undefined,\n limit: number,\n): Promise<StudioKnowledgeEvidence[]> {\n if (traceStore?.listTraces === undefined) {\n return [];\n }\n\n const store = traceStore;\n const listTraces = store.listTraces;\n if (listTraces === undefined) {\n return [];\n }\n const summaries = await listTraces.call(store, { limit });\n const traces = await Promise.all(\n summaries.map((summary) => Promise.resolve(store.getTrace(summary.id)).catch(() => undefined)),\n );\n return traces.flatMap((trace: StudioTrace | undefined) =>\n trace === undefined ? [] : evidenceFromTrace(trace),\n );\n}\n\nfunction evidenceFromTrace(trace: StudioTrace): StudioKnowledgeEvidence[] {\n return trace.observations.flatMap((observation) => {\n if (observation.kind !== \"generation\" || !isRecord(observation.input)) {\n return [];\n }\n\n const documents = Array.isArray(observation.input.documents)\n ? observation.input.documents.flatMap((document) => evidenceDocument(document))\n : [];\n const tools = Array.isArray(observation.input.tools)\n ? observation.input.tools.flatMap((tool) => evidenceToolName(tool))\n : [];\n if (documents.length === 0 && tools.length === 0) {\n return [];\n }\n\n const query = queryFromGenerationInput(observation.input);\n return [\n {\n traceId: trace.id,\n sessionId: trace.sessionId,\n observationId: observation.id,\n observationName: observation.name,\n turn: observation.turn,\n startedAt: observation.startedAt,\n ...(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 { Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentMcpServerMetadata,\n StudioAgentMcpToolMetadata,\n} from \"../types\";\nimport { errorResponse } from \"./shared\";\nimport { agentToolItems, mcpServerName } from \"./tool-metadata\";\n\nexport function registerMcpRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/mcps\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n servers: await agentMcpMetadata(agent),\n });\n });\n}\n\nexport async function agentMcpMetadata(\n agent: StudioAgent,\n): Promise<StudioAgentMcpServerMetadata[]> {\n const servers = new Map<string, StudioAgentMcpToolMetadata[]>();\n const seen = new Set<string>();\n\n for (const { tool, source } of agentToolItems(agent)) {\n const serverName = mcpServerName(tool);\n if (serverName === undefined) {\n continue;\n }\n\n const definition = await tool.definition(\"\");\n const key = `${serverName}:${source}:${definition.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const tools = servers.get(serverName) ?? [];\n tools.push({\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n });\n servers.set(serverName, tools);\n }\n\n return [...servers.entries()]\n .map(([name, tools]) => {\n const sortedTools = tools.sort((left, right) => {\n if (left.source !== right.source) {\n return left.source === \"static\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n return {\n agentId: agent.id,\n name,\n toolCount: sortedTools.length,\n tools: sortedTools,\n };\n })\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioMemoryConversationMessages,\n StudioMemoryConversationSteps,\n StudioMemoryConversationSummary,\n StudioMemoryConversationsPage,\n StudioMemoryUsersPage,\n StudioSession,\n StudioSessionStore,\n StudioSessionSummary,\n} from \"../types\";\nimport { errorResponse, optionalQueryString, parseLimit } from \"./shared\";\n\nconst DEFAULT_USER_ID = \"default\";\n\nexport function registerMemoryRoutes(\n app: Hono,\n props: {\n sessionStore: StudioSessionStore;\n },\n): void {\n app.get(\"/memory/users\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const sessions = await props.sessionStore.listSessions({ limit: 100 });\n const users = new Map<string, StudioMemoryUsersPage[\"users\"][number]>();\n for (const session of sessions) {\n const userId = sessionUserId(session);\n const existing = users.get(userId);\n if (existing === undefined) {\n users.set(userId, {\n userId,\n conversationCount: 1,\n agentIds: [session.agentId],\n lastInteractionAt: session.updatedAt,\n });\n continue;\n }\n existing.conversationCount += 1;\n if (!existing.agentIds.includes(session.agentId)) {\n existing.agentIds.push(session.agentId);\n }\n if (new Date(session.updatedAt).getTime() > new Date(existing.lastInteractionAt).getTime()) {\n existing.lastInteractionAt = session.updatedAt;\n }\n }\n\n const page = [...users.values()]\n .sort(\n (left, right) =>\n new Date(right.lastInteractionAt).getTime() - new Date(left.lastInteractionAt).getTime(),\n )\n .slice(0, limit);\n return c.json({ users: page, total: users.size } satisfies StudioMemoryUsersPage);\n });\n\n app.get(\"/memory/conversations\", async (c) => {\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const agentId = optionalQueryString(c.req.query(\"agentId\"));\n const userId = optionalQueryString(c.req.query(\"userId\"));\n const sessions = await props.sessionStore.listSessions({\n ...(agentId === undefined ? {} : { agentId }),\n limit: 100,\n });\n const conversations = sessions\n .map(memoryConversationSummary)\n .filter((session) => userId === undefined || session.userId === userId)\n .slice(0, limit);\n\n return c.json({\n conversations,\n total: conversations.length,\n } satisfies StudioMemoryConversationsPage);\n });\n\n app.get(\"/memory/conversations/:conversationId/messages\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n messages: session.messages,\n transcript: session.transcript,\n } satisfies StudioMemoryConversationMessages);\n });\n\n app.get(\"/memory/conversations/:conversationId/steps\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"conversationId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Conversation not found\");\n }\n return c.json({\n conversation: memoryConversationSummary(session),\n steps: session.transcript,\n } satisfies StudioMemoryConversationSteps);\n });\n}\n\nfunction memoryConversationSummary(\n session: StudioSession | StudioSessionSummary,\n): StudioMemoryConversationSummary {\n return {\n id: session.id,\n userId: sessionUserId(session),\n agentId: session.agentId,\n ...(session.title === undefined ? {} : { title: session.title }),\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n messageCount: session.messageCount,\n ...(session.metadata === undefined ? {} : { metadata: session.metadata }),\n };\n}\n\nfunction sessionUserId(session: Pick<StudioSession, \"metadata\">): string {\n const userId = session.metadata?.userId;\n return typeof userId === \"string\" && userId.trim().length > 0 ? userId : DEFAULT_USER_ID;\n}\n","import { createEventStream } from \"@anvia/server\";\nimport { serializeError } from \"./shared\";\n\ntype StudioStreamErrorEvent = {\n type: \"error\";\n error: unknown;\n};\n\nconst studioJsonlHeaders: HeadersInit = {\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"transfer-encoding\": \"chunked\",\n \"x-accel-buffering\": \"no\",\n};\n\nexport function streamStudioJsonl<TEvent>(events: AsyncIterable<TEvent>): Response {\n return createEventStream(withStudioStreamErrors(events), {\n format: \"jsonl\",\n headers: studioJsonlHeaders,\n });\n}\n\nfunction withStudioStreamErrors<TEvent>(\n events: AsyncIterable<TEvent>,\n): AsyncIterable<TEvent | StudioStreamErrorEvent> {\n const iterator = events[Symbol.asyncIterator]();\n let done = false;\n\n return {\n [Symbol.asyncIterator](): AsyncIterator<TEvent | StudioStreamErrorEvent> {\n return {\n async next(): Promise<IteratorResult<TEvent | StudioStreamErrorEvent>> {\n if (done) {\n return { done: true, value: undefined };\n }\n\n try {\n const next = await iterator.next();\n if (next.done === true) {\n done = true;\n }\n return next;\n } catch (error) {\n done = true;\n return {\n done: false,\n value: studioStreamError(error),\n };\n }\n },\n async return(): Promise<IteratorResult<TEvent | StudioStreamErrorEvent>> {\n done = true;\n await iterator.return?.();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nfunction studioStreamError(error: unknown): StudioStreamErrorEvent {\n return {\n type: \"error\",\n error: serializeError(error),\n };\n}\n","import type { Hono } from \"hono\";\nimport type {\n StudioObservabilityEvent,\n StudioObservabilityEventType,\n StudioPipelineLogStore,\n StudioSessionStore,\n StudioTrace,\n StudioTraceStore,\n StudioTraceSummary,\n} from \"../types\";\nimport type { ResolvedStores } from \"./shared\";\nimport { streamStudioJsonl } from \"./streams\";\n\ntype ObservabilitySubscription = {\n close: () => void;\n next: () => Promise<IteratorResult<StudioObservabilityEvent>>;\n push: (event: StudioObservabilityEvent) => void;\n};\n\nconst defaultBufferSize = 1000;\n\nexport class StudioObservabilityHub {\n private readonly subscriptions = new Set<ObservabilitySubscription>();\n\n emit(event: StudioObservabilityEvent): void {\n for (const subscription of this.subscriptions) {\n subscription.push(event);\n }\n }\n\n subscribe(\n options: { types?: Set<StudioObservabilityEventType> } = {},\n ): ObservabilitySubscription {\n const subscription = createSubscription(options.types);\n this.subscriptions.add(subscription);\n return {\n close: () => {\n subscription.close();\n this.subscriptions.delete(subscription);\n },\n next: subscription.next,\n push: subscription.push,\n };\n }\n}\n\nexport function observeStores(stores: ResolvedStores, hub: StudioObservabilityHub): ResolvedStores {\n return {\n ...stores,\n ...(stores.sessions === undefined\n ? {}\n : { sessions: observeSessionStore(stores.sessions, hub) }),\n ...(stores.traces === undefined ? {} : { traces: observeTraceStore(stores.traces, hub) }),\n ...(stores.pipelineLogs === undefined\n ? {}\n : { pipelineLogs: observePipelineLogStore(stores.pipelineLogs, hub) }),\n };\n}\n\nexport function registerObservabilityRoutes(app: Hono, hub: StudioObservabilityHub): void {\n app.get(\"/observability/events\", (c) => {\n const types = parseEventTypes(c.req.query(\"type\"));\n if (types === false) {\n return c.json(\n {\n error: {\n code: \"bad_request\",\n message: \"type must include session_log, pipeline_log, or trace\",\n },\n },\n 400,\n );\n }\n\n return streamStudioJsonl(observabilityEvents(hub, types));\n });\n}\n\nfunction observabilityEvents(\n hub: StudioObservabilityHub,\n types: Set<StudioObservabilityEventType> | undefined,\n): AsyncIterable<StudioObservabilityEvent> {\n const subscription = hub.subscribe(types === undefined ? {} : { types });\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next: () => subscription.next(),\n async return() {\n subscription.close();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\nfunction createSubscription(\n types: Set<StudioObservabilityEventType> | undefined,\n): ObservabilitySubscription {\n const values: StudioObservabilityEvent[] = [];\n const resolvers: Array<(value: IteratorResult<StudioObservabilityEvent>) => void> = [];\n let closed = false;\n\n return {\n close() {\n closed = true;\n for (const resolve of resolvers.splice(0)) {\n resolve({ done: true, value: undefined });\n }\n },\n next() {\n const value = values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => resolvers.push(resolve));\n },\n push(event) {\n if (closed || (types !== undefined && !types.has(event.type))) {\n return;\n }\n const resolve = resolvers.shift();\n if (resolve !== undefined) {\n resolve({ done: false, value: event });\n return;\n }\n if (values.length >= defaultBufferSize) {\n values.shift();\n }\n values.push(event);\n },\n };\n}\n\nfunction observeSessionStore(\n store: StudioSessionStore,\n hub: StudioObservabilityHub,\n): StudioSessionStore {\n return new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendSessionLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendSessionLog = target.appendSessionLog?.bind(target);\n if (appendSessionLog === undefined) {\n return undefined;\n }\n return async (...args: Parameters<NonNullable<StudioSessionStore[\"appendSessionLog\"]>>) => {\n const log = await appendSessionLog(...args);\n hub.emit({ type: \"session_log\", log });\n return log;\n };\n },\n });\n}\n\nfunction observePipelineLogStore(\n store: StudioPipelineLogStore,\n hub: StudioObservabilityHub,\n): StudioPipelineLogStore {\n return new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"appendPipelineLog\") {\n return boundProperty(target, property, receiver);\n }\n const appendPipelineLog = target.appendPipelineLog.bind(target);\n return async (...args: Parameters<StudioPipelineLogStore[\"appendPipelineLog\"]>) => {\n const log = await appendPipelineLog(...args);\n hub.emit({ type: \"pipeline_log\", log });\n return log;\n };\n },\n });\n}\n\nfunction observeTraceStore(store: StudioTraceStore, hub: StudioObservabilityHub): StudioTraceStore {\n return new Proxy(store, {\n get(target, property, receiver) {\n if (property !== \"saveTrace\") {\n return boundProperty(target, property, receiver);\n }\n const saveTrace = target.saveTrace.bind(target);\n return async (...args: Parameters<StudioTraceStore[\"saveTrace\"]>) => {\n const trace = await saveTrace(...args);\n hub.emit({ type: \"trace\", trace: traceSummary(trace) });\n return trace;\n };\n },\n });\n}\n\nfunction boundProperty<T extends object>(\n target: T,\n property: string | symbol,\n receiver: unknown,\n): unknown {\n const value = Reflect.get(target, property, receiver);\n return typeof value === \"function\" ? value.bind(target) : value;\n}\n\nfunction parseEventTypes(\n value: string | undefined,\n): Set<StudioObservabilityEventType> | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n const types = new Set<StudioObservabilityEventType>();\n for (const type of value.split(\",\")) {\n const trimmed = type.trim();\n if (!isEventType(trimmed)) {\n return false;\n }\n types.add(trimmed);\n }\n return types;\n}\n\nfunction isEventType(value: string): value is StudioObservabilityEventType {\n return value === \"session_log\" || value === \"pipeline_log\" || value === \"trace\";\n}\n\nfunction traceSummary(trace: StudioTrace): StudioTraceSummary {\n return {\n id: trace.id,\n sessionId: trace.sessionId,\n ...(trace.name === undefined ? {} : { name: trace.name }),\n status: trace.status,\n startedAt: trace.startedAt,\n ...(trace.endedAt === undefined ? {} : { endedAt: trace.endedAt }),\n ...(trace.durationMs === undefined ? {} : { durationMs: trace.durationMs }),\n ...(trace.output === undefined ? {} : { output: trace.output }),\n ...(trace.error === undefined ? {} : { error: trace.error }),\n ...(trace.usage === undefined ? {} : { usage: trace.usage }),\n ...(trace.metadata === undefined ? {} : { metadata: trace.metadata }),\n observationCount: trace.observations.length,\n };\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { PipelineGraphNode, PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type {\n StudioPipeline,\n StudioPipelineLogAppendInput,\n StudioPipelineLogEntry,\n StudioPipelineLogStore,\n} from \"../types\";\nimport { serializeError } from \"./shared\";\n\nexport async function appendPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): Promise<StudioPipelineLogEntry | undefined> {\n return store?.appendPipelineLog(input);\n}\n\nexport async function* emitPipelineLog(\n store: StudioPipelineLogStore | undefined,\n input: StudioPipelineLogAppendInput,\n): AsyncIterable<{ type: \"pipeline_log\"; log: StudioPipelineLogEntry }> {\n const log = await appendPipelineLog(store, input);\n if (log !== undefined) {\n yield { type: \"pipeline_log\", log };\n }\n}\n\nexport function pipelineRunReceivedLog(props: {\n pipeline: StudioPipeline;\n runId: string;\n stream: boolean;\n input: unknown;\n metadata?: JsonObject;\n}): StudioPipelineLogAppendInput {\n return {\n pipelineId: props.pipeline.id,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"pipeline.run_received\",\n message: \"Pipeline run request received\",\n metadata: cleanMetadata({\n stream: props.stream,\n inputBytes: byteLength(formatUnknown(props.input)),\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\n };\n}\n\nexport function pipelineRunStartedLog(\n pipeline: StudioPipeline,\n runId: string,\n): StudioPipelineLogAppendInput {\n const graph = pipeline.pipeline.graph();\n return {\n pipelineId: pipeline.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_started\",\n message: \"Pipeline run started\",\n metadata: cleanMetadata({\n stageCount: graph.nodes.filter((node) => node.kind !== \"input\" && node.kind !== \"output\")\n .length,\n edgeCount: graph.edges.length,\n }),\n };\n}\n\nexport function pipelineRunCompletedLog(props: {\n pipelineId: string;\n runId: string;\n durationMs: number;\n output: unknown;\n}): StudioPipelineLogAppendInput {\n return {\n pipelineId: props.pipelineId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"pipeline.run_completed\",\n message: \"Pipeline run completed\",\n metadata: cleanMetadata({\n durationMs: props.durationMs,\n outputBytes: byteLength(formatUnknown(props.output)),\n }),\n };\n}\n\nexport function pipelineRunFailedLog(\n pipelineId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioPipelineLogAppendInput {\n return {\n pipelineId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"pipeline.run_failed\",\n message: \"Pipeline run failed\",\n metadata: cleanMetadata({\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n }),\n };\n}\n\nexport function pipelineStageLog(\n pipelineId: string,\n runId: string,\n event: PipelineRunEvent,\n): StudioPipelineLogAppendInput {\n const category = stageCategory(event.node);\n if (event.type === \"stage_started\") {\n return {\n pipelineId,\n runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.started`,\n message: `${event.node.label} started`,\n metadata: nodeMetadata(event.node),\n };\n }\n if (event.type === \"stage_completed\") {\n return {\n pipelineId,\n runId,\n level: \"debug\",\n category,\n event: `${event.node.kind}.completed`,\n message: `${event.node.label} completed`,\n metadata: cleanMetadata({\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n }),\n };\n }\n return {\n pipelineId,\n runId,\n level: \"error\",\n category,\n event: `${event.node.kind}.failed`,\n message: `${event.node.label} failed`,\n metadata: cleanMetadata({\n ...nodeMetadata(event.node),\n durationMs: event.durationMs,\n error: serializeError(event.error),\n }),\n };\n}\n\nfunction stageCategory(node: PipelineGraphNode): StudioPipelineLogAppendInput[\"category\"] {\n if (node.kind === \"parallel\" || node.kind === \"branch\") {\n return \"parallel\";\n }\n if (node.kind === \"agent\") {\n return \"agent\";\n }\n if (node.kind === \"extractor\") {\n return \"extractor\";\n }\n return \"stage\";\n}\n\nfunction nodeMetadata(node: PipelineGraphNode): JsonObject {\n return cleanMetadata({\n nodeId: node.id,\n kind: node.kind,\n label: node.label,\n agentId: node.agentId,\n pipelineId: node.pipelineId,\n branchKey: node.branchKey,\n });\n}\n\nfunction cleanMetadata(value: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined),\n ) as JsonObject;\n}\n\nfunction byteLength(value: string | undefined): number | undefined {\n return value === undefined ? undefined : new TextEncoder().encode(value).length;\n}\n\nfunction formatUnknown(value: unknown): string | undefined {\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n","import type { AgentStreamEvent } from \"@anvia/core/agent\";\nimport type { Message } from \"@anvia/core/completion\";\nimport type { AgentTraceOptions } from \"@anvia/core/observability\";\nimport type { Context } from \"hono\";\nimport type {\n AgentRunRequest,\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionStore,\n StudioTranscriptChildAgentEvent,\n StudioTranscriptEntry,\n} from \"../types\";\nimport {\n errorResponse,\n isAgentTraceOptions,\n isJsonObject,\n isMessage,\n isMessageInput,\n isNonNegativeInteger,\n isObject,\n isPositiveInteger,\n serializeError,\n} from \"./shared\";\nimport { streamStudioJsonl } from \"./streams\";\n\nexport class AsyncEventQueue<T> {\n private readonly values: T[] = [];\n private readonly resolvers: Array<(value: IteratorResult<T>) => void> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) {\n return;\n }\n const resolver = this.resolvers.shift();\n if (resolver !== undefined) {\n resolver({ done: false, value });\n return;\n }\n this.values.push(value);\n }\n\n close(): void {\n this.closed = true;\n for (const resolver of this.resolvers.splice(0)) {\n resolver({ done: true, value: undefined });\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n const value = this.values.shift();\n if (value !== undefined) {\n return Promise.resolve({ done: false, value });\n }\n if (this.closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => this.resolvers.push(resolve));\n }\n}\n\nexport async function* mergeRunAndApprovalEvents(\n runEvents: AsyncIterable<AgentStreamEvent>,\n approvalEvents: AsyncEventQueue<AgentRunStreamEvent>,\n): AsyncIterable<AgentRunStreamEvent> {\n type TaggedNext =\n | { source: \"run\"; value: IteratorResult<AgentStreamEvent> }\n | { source: \"approval\"; value: IteratorResult<AgentRunStreamEvent> };\n const runIterator = runEvents[Symbol.asyncIterator]();\n let runDone = false;\n let runNext: Promise<IteratorResult<AgentStreamEvent>> | undefined = runIterator.next();\n let approvalNext: Promise<IteratorResult<AgentRunStreamEvent>> | undefined =\n approvalEvents.next();\n\n try {\n while (runNext !== undefined || approvalNext !== undefined) {\n const pending: Promise<TaggedNext>[] = [];\n if (runNext !== undefined) {\n pending.push(runNext.then((value) => ({ source: \"run\", value })));\n }\n if (approvalNext !== undefined) {\n pending.push(approvalNext.then((value) => ({ source: \"approval\", value })));\n }\n\n const result = await Promise.race(pending);\n\n if (result.source === \"run\") {\n if (result.value.done === true) {\n runDone = true;\n runNext = undefined;\n approvalEvents.close();\n } else {\n runNext = runIterator.next();\n yield result.value.value;\n }\n continue;\n }\n\n if (result.value.done === true) {\n approvalNext = undefined;\n } else {\n approvalNext = approvalEvents.next();\n yield result.value.value;\n }\n }\n } finally {\n if (!runDone && runIterator.return !== undefined) {\n await runIterator.return();\n }\n approvalEvents.close();\n }\n}\n\nexport function streamAgentRunEvents(\n _c: Context,\n events: AsyncIterable<AgentRunStreamEvent>,\n): Response {\n return streamStudioJsonl(events);\n}\n\nexport function traceForRun(\n trace: AgentTraceOptions | undefined,\n agentId: string,\n session: StudioSession | undefined,\n): AgentTraceOptions {\n const metadata = {\n ...(trace?.metadata ?? {}),\n agentId,\n };\n return {\n ...(trace ?? {}),\n metadata,\n ...(trace?.sessionId !== undefined\n ? { sessionId: trace.sessionId }\n : session === undefined\n ? {}\n : { sessionId: session.id }),\n };\n}\n\nexport async function* persistStreamingSessionTranscript(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n message: string | Message;\n runId: string;\n}): AsyncIterable<AgentRunStreamEvent> {\n const transcript: StudioTranscriptEntry[] = [messageToTranscriptEntry(props.message, 0)];\n const title = optionalTitle(props.message);\n\n await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"running\",\n });\n\n try {\n for await (const event of props.stream) {\n acceptTranscriptStreamEvent(transcript, event);\n\n const nextSession = await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: event.type === \"final\" ? \"success\" : event.type === \"error\" ? \"error\" : \"running\",\n ...(event.type === \"error\" ? { error: serializeError(event.error) } : {}),\n });\n if (nextSession === undefined) {\n throw new Error(\"Session not found\");\n }\n\n yield event;\n }\n } catch (error) {\n appendTranscriptAssistantError(transcript, errorText(error));\n await props.store.saveSessionRunTranscript({\n id: props.session.id,\n runId: props.runId,\n ...title,\n transcript,\n status: \"error\",\n error: serializeError(error),\n });\n throw error;\n }\n}\n\nfunction acceptTranscriptStreamEvent(\n transcript: StudioTranscriptEntry[],\n event: AgentRunStreamEvent,\n): void {\n if (event.type === \"text_delta\") {\n appendTranscriptAssistantText(transcript, event.delta);\n }\n if (event.type === \"reasoning_delta\") {\n appendTranscriptReasoningText(transcript, event.delta, event.id);\n }\n if (event.type === \"tool_call\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolCall.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n args: formatJson(event.toolCall.function.arguments),\n });\n }\n if (event.type === \"tool_result\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n transcript.push({\n 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 ...(event.structuredResult === undefined\n ? {}\n : { structuredResult: event.structuredResult }),\n });\n return;\n }\n matched.args = matched.args ?? event.args;\n matched.result = event.result;\n if (event.structuredResult !== undefined) {\n matched.structuredResult = event.structuredResult;\n }\n }\n if (event.type === \"agent_tool_event\") {\n const matched = findTranscriptToolEntry(transcript, event.toolName, event.toolCallId);\n if (matched === undefined) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: event.toolName,\n ...(event.toolCallId === undefined ? {} : { callId: event.toolCallId }),\n childEvents: [childAgentTranscriptEvent(event)].filter(\n (childEvent): childEvent is StudioTranscriptChildAgentEvent => childEvent !== undefined,\n ),\n });\n return;\n }\n appendChildAgentTranscriptEvent(matched, event);\n }\n if (event.type === \"tool_approval_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n matched.approval = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n };\n }\n }\n if (event.type === \"tool_approval_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.approval.toolName,\n approvalCallId(event.approval),\n );\n if (matched !== undefined) {\n matched.approval = {\n id: event.approval.id,\n status: event.approval.status,\n requestedAt: event.approval.requestedAt,\n ...(event.approval.resolvedAt === undefined\n ? {}\n : { resolvedAt: event.approval.resolvedAt }),\n ...(event.approval.reason === undefined ? {} : { reason: event.approval.reason }),\n };\n }\n }\n if (event.type === \"tool_question_request\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n matched.question = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n questions: event.question.questions,\n };\n }\n }\n if (event.type === \"tool_question_result\") {\n const matched = findTranscriptToolEntry(\n transcript,\n event.question.toolName,\n questionCallId(event.question),\n );\n if (matched !== undefined) {\n matched.question = {\n id: event.question.id,\n status: event.question.status,\n requestedAt: event.question.requestedAt,\n ...(event.question.answeredAt === undefined\n ? {}\n : { answeredAt: event.question.answeredAt }),\n questions: event.question.questions,\n ...(event.question.answers === undefined ? {} : { answers: event.question.answers }),\n };\n }\n }\n if (event.type === \"final\" && event.trace?.traceId !== undefined) {\n assignTranscriptTraceId(transcript, event.trace.traceId);\n }\n if (event.type === \"error\") {\n appendTranscriptAssistantError(transcript, errorText(event.error));\n }\n}\n\nfunction approvalCallId(approval: { callId?: string; toolCallId?: string }): string | undefined {\n return approval.callId ?? approval.toolCallId;\n}\n\nfunction questionCallId(question: { callId?: string; toolCallId?: string }): string | undefined {\n return question.callId ?? question.toolCallId;\n}\n\nfunction appendChildAgentTranscriptEvent(\n entry: Extract<StudioTranscriptEntry, { kind: \"tool\" }>,\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): void {\n const childEvent = childAgentTranscriptEvent(event);\n if (childEvent === undefined) {\n return;\n }\n const childEvents = entry.childEvents ?? [];\n if (childEvent.kind === \"message\") {\n const last = childEvents.at(-1);\n if (last?.kind === \"message\" && last.agentId === childEvent.agentId) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else if (childEvent.kind === \"reasoning\") {\n const last = childEvents.at(-1);\n if (\n last?.kind === \"reasoning\" &&\n last.agentId === childEvent.agentId &&\n (last.reasoningId ?? \"\") === (childEvent.reasoningId ?? \"\")\n ) {\n last.text = `${last.text}${childEvent.text}`;\n } else {\n childEvents.push(childEvent);\n }\n } else {\n const matched = findChildAgentToolEvent(childEvents, childEvent);\n if (matched === undefined) {\n childEvents.push(childEvent);\n } else {\n if (matched.args === undefined && childEvent.args !== undefined) {\n matched.args = childEvent.args;\n }\n if (childEvent.result !== undefined) {\n matched.result = childEvent.result;\n }\n }\n }\n entry.childEvents = childEvents;\n}\n\nfunction childAgentTranscriptEvent(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n): StudioTranscriptChildAgentEvent | undefined {\n const child = event.event;\n if (child.type === \"text_delta\") {\n return {\n kind: \"message\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n text: child.delta,\n };\n }\n if (child.type === \"reasoning_delta\") {\n return {\n kind: \"reasoning\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n ...(child.id === undefined ? {} : { reasoningId: child.id }),\n text: child.delta,\n };\n }\n if (child.type === \"tool_call\") {\n return {\n kind: \"tool\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n toolName: child.toolCall.function.name,\n ...(child.toolCall.callId === undefined && child.toolCall.id === undefined\n ? {}\n : { callId: child.toolCall.callId ?? child.toolCall.id }),\n args: formatJson(child.toolCall.function.arguments),\n };\n }\n if (child.type === \"tool_result\") {\n return {\n kind: \"tool\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n toolName: child.toolName,\n ...(child.toolCallId === undefined ? {} : { callId: child.toolCallId }),\n args: child.args,\n result: child.result,\n ...(child.structuredResult === undefined ? {} : { structuredResult: child.structuredResult }),\n };\n }\n if (child.type === \"error\") {\n return {\n kind: \"message\",\n agentId: event.agentId,\n ...(event.agentName === undefined ? {} : { agentName: event.agentName }),\n text: `Error: ${errorText(child.error)}`,\n };\n }\n return undefined;\n}\n\nfunction errorText(error: unknown): string {\n if (typeof error === \"string\") {\n return error;\n }\n return JSON.stringify(serializeError(error));\n}\n\nfunction findChildAgentToolEvent(\n childEvents: StudioTranscriptChildAgentEvent[],\n event: Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }>,\n): Extract<StudioTranscriptChildAgentEvent, { kind: \"tool\" }> | undefined {\n for (let index = childEvents.length - 1; index >= 0; index -= 1) {\n const childEvent = childEvents[index];\n if (\n childEvent?.kind !== \"tool\" ||\n childEvent.agentId !== event.agentId ||\n childEvent.toolName !== event.toolName ||\n childEvent.result !== undefined\n ) {\n continue;\n }\n if (event.callId === undefined || childEvent.callId === event.callId) {\n return childEvent;\n }\n }\n return undefined;\n}\n\nexport function transcriptFromMessages(messages: Message[]): StudioTranscriptEntry[] {\n const transcript: StudioTranscriptEntry[] = [];\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n if (message.role === \"user\") {\n for (const content of message.content) {\n if (content.type === \"text\") {\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"user\",\n text: content.text,\n });\n }\n }\n continue;\n }\n if (message.role === \"tool\") {\n for (const content of message.content) {\n transcript.push({\n entryId: transcript.length,\n kind: \"tool\",\n toolName: \"tool_result\",\n callId: content.callId ?? content.id,\n result: content.content\n .map((item) =>\n \"text\" in item ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\n .join(\"\\n\"),\n structuredResult: content.content,\n });\n }\n continue;\n }\n\n for (const content of message.content) {\n if (content.type === \"text\") {\n 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\" && last.tone !== \"error\") {\n last.text = `${last.text}${delta}`;\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text: delta,\n });\n}\n\nfunction appendTranscriptAssistantError(transcript: StudioTranscriptEntry[], text: string): void {\n const last = transcript.at(-1);\n if (\n last?.kind === \"message\" &&\n last.role === \"assistant\" &&\n last.tone === \"error\" &&\n last.text === text\n ) {\n return;\n }\n transcript.push({\n entryId: transcript.length,\n kind: \"message\",\n role: \"assistant\",\n text,\n tone: \"error\",\n });\n}\n\nfunction assignTranscriptTraceId(transcript: StudioTranscriptEntry[], traceId: string): void {\n for (let index = transcript.length - 1; index >= 0; index -= 1) {\n const entry = transcript[index];\n if (entry?.kind === \"message\" && entry.role === \"assistant\") {\n transcript[index] = { ...entry, traceId };\n return;\n }\n }\n}\n\nfunction appendTranscriptReasoningText(\n transcript: StudioTranscriptEntry[],\n delta: string,\n reasoningId: string | undefined,\n): void {\n const last = transcript.at(-1);\n if (last?.kind === \"reasoning\" && (last.reasoningId ?? \"\") === (reasoningId ?? \"\")) {\n last.text = `${last.text}${delta}`;\n return;\n }\n transcript.push({\n 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) =>\n \"text\" in result ? result.text : `[image:${result.mediaType ?? \"image/png\"}]`,\n );\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, JsonValue } from \"@anvia/core/completion\";\nimport type { PipelineRunEvent } from \"@anvia/core/pipeline\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioPipeline,\n StudioPipelineDetail,\n StudioPipelineLogStore,\n StudioPipelineReplayRequest,\n StudioPipelineRunRequest,\n StudioPipelineRunResponse,\n StudioPipelineRunSaveInput,\n StudioPipelineRunStore,\n} from \"../types\";\nimport {\n appendPipelineLog,\n emitPipelineLog,\n pipelineRunCompletedLog,\n pipelineRunFailedLog,\n pipelineRunReceivedLog,\n pipelineRunStartedLog,\n pipelineStageLog,\n} from \"./pipeline-logs\";\nimport { AsyncEventQueue } from \"./runs\";\nimport { errorResponse, isJsonObject, isObject, pipelineConfig, serializeError } from \"./shared\";\nimport { streamStudioJsonl } from \"./streams\";\n\nexport function registerPipelineRoutes(\n app: Hono,\n props: {\n pipelines: StudioPipeline[];\n pipelineMap: Map<string, StudioPipeline>;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n): void {\n app.get(\"/pipelines\", (c) =>\n c.json({\n pipelines: props.pipelines.map(pipelineConfig),\n }),\n );\n\n app.get(\"/pipelines/:pipelineId\", (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n return c.json(pipelineDetail(pipeline));\n });\n\n app.get(\"/pipelines/:pipelineId/logs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.logStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.logs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"logs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parsePipelineLogAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const logs = await props.logStore.listPipelineLogs({\n pipelineId,\n limit,\n ...(after === undefined ? {} : { after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\n });\n\n app.get(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipelineId = c.req.param(\"pipelineId\");\n if (!props.pipelineMap.has(pipelineId)) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const limit = parsePipelineLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const runs = await props.runStore.listPipelineRuns({ pipelineId, limit });\n return c.json({ runs });\n });\n\n app.post(\"/pipelines/:pipelineId/runs\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n\n const body = await parsePipelineRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n return executePipelineRun(c, props, pipeline, body);\n });\n\n app.post(\"/pipelines/:pipelineId/runs/:runId/replay\", async (c) => {\n const pipeline = props.pipelineMap.get(c.req.param(\"pipelineId\"));\n if (pipeline === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline not found\");\n }\n if (props.runStore === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"pipelines.runs\" is not implemented by this runner',\n { capability: \"pipelines\", operation: \"runs\" },\n );\n }\n\n const body = await parsePipelineReplayRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const sourceRunId = c.req.param(\"runId\");\n const runs = await props.runStore.listPipelineRuns({\n pipelineId: pipeline.id,\n limit: 1000,\n });\n const sourceRun = runs.find((run) => run.runId === sourceRunId);\n if (sourceRun === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Pipeline run not found\");\n }\n if (sourceRun.status === \"running\") {\n return errorResponse(c, 409, \"conflict\", \"Cannot replay a running pipeline run\");\n }\n\n return executePipelineRun(c, props, pipeline, {\n input: sourceRun.input,\n ...(body.stream === undefined ? {} : { stream: body.stream }),\n metadata: replayMetadata(sourceRun.metadata, body.metadata, sourceRun.runId),\n });\n });\n}\n\nasync function executePipelineRun(\n c: Context,\n props: {\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n pipeline: StudioPipeline,\n body: StudioPipelineRunRequest,\n): Promise<Response> {\n const runId = globalThis.crypto.randomUUID();\n const startedAt = Date.now();\n const startedAtIso = new Date(startedAt).toISOString();\n await appendPipelineLog(\n props.logStore,\n pipelineRunReceivedLog({\n pipeline,\n runId,\n stream: body.stream === true,\n input: body.input,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n }),\n );\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"running\",\n input: body.input,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n startedAt: startedAtIso,\n });\n\n if (body.stream === true) {\n return streamPipelineRun(c, {\n pipeline,\n runId,\n input: body.input,\n startedAt,\n startedAtIso,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n ...(props.logStore === undefined ? {} : { logStore: props.logStore }),\n ...(props.runStore === undefined ? {} : { runStore: props.runStore }),\n });\n }\n\n try {\n await appendPipelineLog(props.logStore, pipelineRunStartedLog(pipeline, runId));\n const output = await pipeline.pipeline.run(body.input, {\n observer: {\n async onEvent(event) {\n await appendPipelineLog(props.logStore, pipelineStageLog(pipeline.id, runId, event));\n },\n },\n });\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"success\",\n input: body.input,\n output: jsonOutput,\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\n await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: pipeline.id,\n runId,\n durationMs: endedAt - startedAt,\n output: jsonOutput,\n }),\n );\n const response: StudioPipelineRunResponse = {\n runId,\n pipelineId: pipeline.id,\n output: jsonOutput,\n };\n return c.json(response);\n } catch (error) {\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId,\n pipelineId: pipeline.id,\n status: \"error\",\n input: body.input,\n error: serializeError(error),\n ...(body.metadata === undefined ? {} : { metadata: body.metadata }),\n startedAt: startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n });\n await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(pipeline.id, runId, error, startedAt),\n );\n return errorResponse(c, 500, \"internal_error\", \"Pipeline run failed\", serializeError(error));\n }\n}\n\nfunction pipelineDetail(pipeline: StudioPipeline): StudioPipelineDetail {\n const graph = pipeline.pipeline.graph();\n graph.id = pipeline.id;\n return {\n ...pipelineConfig(pipeline),\n graph,\n };\n}\n\nfunction streamPipelineRun(\n _c: Context,\n props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n },\n): Response {\n return streamStudioJsonl(pipelineRunEvents(props));\n}\n\nasync function* pipelineRunEvents(props: {\n pipeline: StudioPipeline;\n runId: string;\n input: JsonValue;\n startedAt: number;\n startedAtIso: string;\n metadata?: JsonObject;\n logStore?: StudioPipelineLogStore;\n runStore?: StudioPipelineRunStore;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitPipelineLog(props.logStore, pipelineRunStartedLog(props.pipeline, props.runId));\n\n const events = new AsyncEventQueue<AgentRunStreamEvent>();\n const run = props.pipeline.pipeline\n .run(props.input, {\n observer: {\n async onEvent(event: PipelineRunEvent) {\n const log = await appendPipelineLog(\n props.logStore,\n pipelineStageLog(props.pipeline.id, props.runId, event),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n },\n },\n })\n .then(async (output) => {\n const jsonOutput = toJsonValue(output);\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"success\",\n input: props.input,\n output: jsonOutput,\n ...(props.metadata === undefined ? {} : { metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunCompletedLog({\n pipelineId: props.pipeline.id,\n runId: props.runId,\n durationMs: endedAt - props.startedAt,\n output: jsonOutput,\n }),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({\n type: \"pipeline_final\",\n runId: props.runId,\n pipelineId: props.pipeline.id,\n output: jsonOutput,\n });\n })\n .catch(async (error) => {\n const endedAt = Date.now();\n await savePipelineRun(props.runStore, {\n runId: props.runId,\n pipelineId: props.pipeline.id,\n status: \"error\",\n input: props.input,\n error: serializeError(error),\n ...(props.metadata === undefined ? {} : { metadata: props.metadata }),\n startedAt: props.startedAtIso,\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - props.startedAt,\n });\n const log = await appendPipelineLog(\n props.logStore,\n pipelineRunFailedLog(props.pipeline.id, props.runId, error, props.startedAt),\n );\n if (log !== undefined) {\n events.push({ type: \"pipeline_log\", log });\n }\n events.push({ type: \"error\", error: serializeError(error) } as AgentRunStreamEvent);\n })\n .finally(() => events.close());\n\n try {\n while (true) {\n const next = await events.next();\n if (next.done === true) {\n break;\n }\n yield next.value;\n }\n } finally {\n await run;\n }\n}\n\nasync function savePipelineRun(\n store: StudioPipelineRunStore | undefined,\n input: StudioPipelineRunSaveInput,\n) {\n return store?.savePipelineRun(input);\n}\n\nasync function parsePipelineRunRequest(\n c: Context,\n): Promise<StudioPipelineRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n if (!(\"input\" in body) || !isJsonValue(body.input)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"input must be JSON-compatible\") };\n }\n\n const request: StudioPipelineRunRequest = {\n input: body.input,\n };\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nasync function parsePipelineReplayRequest(\n c: Context,\n): Promise<StudioPipelineReplayRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n\n if (!isObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n\n const request: StudioPipelineReplayRequest = {};\n if (\"stream\" in body) {\n if (typeof body.stream !== \"boolean\") {\n return { error: errorResponse(c, 400, \"bad_request\", \"stream must be a boolean\") };\n }\n request.stream = body.stream;\n }\n if (\"metadata\" in body) {\n if (!isJsonObject(body.metadata)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"metadata must be an object\") };\n }\n request.metadata = body.metadata;\n }\n return request;\n}\n\nfunction replayMetadata(\n sourceMetadata: JsonObject | undefined,\n requestMetadata: JsonObject | undefined,\n sourceRunId: string,\n): JsonObject {\n return {\n ...(sourceMetadata ?? {}),\n ...(requestMetadata ?? {}),\n replayOf: sourceRunId,\n };\n}\n\nfunction parsePipelineLogLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 200;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 1000);\n}\n\nfunction parsePipelineLogAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return Number.isFinite(value) || typeof value !== \"number\";\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (isObject(value)) {\n return Object.values(value).every((item) => item === undefined || isJsonValue(item));\n }\n return false;\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (isJsonValue(value)) {\n return value;\n }\n if (value === undefined) {\n return null;\n }\n try {\n const parsed = JSON.parse(JSON.stringify(value)) as unknown;\n return isJsonValue(parsed) ? parsed : String(value);\n } catch {\n return String(value);\n }\n}\n","import { createHook, type PromptHook } from \"@anvia/core/agent\";\nimport type { JsonObject, JsonValue } from \"@anvia/core/completion\";\nimport { parseToolArgs } from \"@anvia/core/tool\";\nimport type { Context, Hono } from \"hono\";\nimport type {\n AgentRunStreamEvent,\n StudioToolQuestion,\n StudioToolQuestionAnswer,\n StudioToolQuestionChoice,\n StudioToolQuestionPrompt,\n StudioToolQuestionStatus,\n} from \"../types\";\nimport { errorResponse, 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 { JsonObject, JsonValue, Message } from \"@anvia/core/completion\";\nimport type {\n AgentRunStreamEvent,\n StudioSession,\n StudioSessionLogAppendInput,\n StudioSessionLogEntry,\n StudioSessionStore,\n} from \"../types\";\nimport { serializeError } from \"./shared\";\n\nexport async function appendSessionLog(\n store: StudioSessionStore | undefined,\n input: StudioSessionLogAppendInput,\n): Promise<StudioSessionLogEntry | undefined> {\n return store?.appendSessionLog?.(input);\n}\n\nexport async function* streamSessionRunLogs(props: {\n stream: AsyncIterable<AgentRunStreamEvent>;\n store: StudioSessionStore;\n session: StudioSession;\n runId: string;\n startedAt: number;\n}): AsyncIterable<AgentRunStreamEvent> {\n yield* emitLog(props.store, runStartedLog(props.session, props.runId));\n yield* emitLog(props.store, memoryLoadedLog(props.session, props.runId));\n\n try {\n for await (const event of props.stream) {\n for (const input of logsFromStreamEvent({\n event,\n runId: props.runId,\n sessionId: props.session.id,\n startedAt: props.startedAt,\n })) {\n yield* emitLog(props.store, input);\n }\n yield event;\n }\n } catch (error) {\n yield* emitLog(\n props.store,\n runFailedLog(props.session.id, props.runId, error, props.startedAt),\n );\n throw error;\n }\n}\n\nexport function sessionCreatedLog(\n session: StudioSession | { id: string; agentId: string; title?: string },\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n level: \"info\",\n category: \"session\",\n event: \"session.created\",\n message: \"Session created\",\n metadata: cleanMetadata({\n agentId: session.agentId,\n hasTitle: session.title !== undefined,\n titleLength: session.title?.length ?? 0,\n }),\n };\n}\n\nexport function runReceivedLog(props: {\n sessionId: string;\n runId: string;\n agentId: string;\n message: string | Message;\n stream: boolean;\n maxTurns?: number;\n toolConcurrency?: number;\n hasTrace: boolean;\n metadata?: JsonObject;\n}): StudioSessionLogAppendInput {\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"api\",\n event: \"run.received\",\n message: \"Run request received\",\n metadata: cleanMetadata({\n agentId: props.agentId,\n stream: props.stream,\n message: messageSummary(props.message),\n maxTurns: props.maxTurns,\n toolConcurrency: props.toolConcurrency,\n hasTrace: props.hasTrace,\n metadataKeys: Object.keys(props.metadata ?? {}),\n }),\n };\n}\n\nexport function runStartedLog(session: StudioSession, runId: string): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"info\",\n category: \"run\",\n event: \"run.started\",\n message: \"Run started\",\n metadata: cleanMetadata({\n agentId: session.agentId,\n existingMessageCount: session.messageCount,\n }),\n };\n}\n\nexport function memoryLoadedLog(\n session: StudioSession,\n runId: string,\n): StudioSessionLogAppendInput {\n return {\n sessionId: session.id,\n runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.loaded\",\n message: \"Session memory loaded\",\n metadata: cleanMetadata({\n messageCount: session.messageCount,\n transcriptEntries: session.transcript.length,\n }),\n };\n}\n\nexport function runCompletedLog(props: {\n sessionId: string;\n runId: string;\n durationMs: number;\n usage?: unknown;\n output?: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"info\",\n category: \"run\",\n event: \"run.completed\",\n message: \"Run completed\",\n metadata: cleanMetadata({\n durationMs: props.durationMs,\n usage: usageSummary(props.usage),\n outputBytes: byteLength(props.output),\n messageCount: props.messageCount,\n }),\n };\n}\n\nexport function memorySavedLog(props: {\n sessionId: string;\n runId: string;\n messageCount?: number;\n}): StudioSessionLogAppendInput {\n return {\n sessionId: props.sessionId,\n runId: props.runId,\n level: \"debug\",\n category: \"memory\",\n event: \"memory.saved\",\n message: \"Session memory saved\",\n metadata: cleanMetadata({\n messageCount: props.messageCount,\n }),\n };\n}\n\nexport function runFailedLog(\n sessionId: string,\n runId: string,\n error: unknown,\n startedAt: number,\n): StudioSessionLogAppendInput {\n return {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"run.failed\",\n message: \"Run failed\",\n metadata: cleanMetadata({\n durationMs: Date.now() - startedAt,\n error: serializeError(error),\n }),\n };\n}\n\nfunction logsFromStreamEvent(props: {\n event: AgentRunStreamEvent;\n sessionId: string;\n runId: string;\n startedAt: number;\n}): StudioSessionLogAppendInput[] {\n const { event, sessionId, runId } = props;\n if (event.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"prompt\",\n event: \"prompt.prepared\",\n message: `Turn ${event.turn} prompt prepared`,\n metadata: cleanMetadata({\n turn: event.turn,\n prompt: messageSummary(event.prompt),\n historyCount: event.history.length,\n }),\n },\n ];\n }\n if (event.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.called\",\n message: `Tool ${event.toolCall.function.name} called`,\n metadata: cleanMetadata({\n turn: event.turn,\n toolName: event.toolCall.function.name,\n callId: event.toolCall.callId ?? event.toolCall.id,\n argumentBytes: byteLength(formatUnknown(event.toolCall.function.arguments)),\n }),\n },\n ];\n }\n if (event.type === \"tool_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"tool\",\n event: \"tool.completed\",\n message: `Tool ${event.toolName} completed`,\n metadata: cleanMetadata({\n turn: event.turn,\n toolName: event.toolName,\n callId: event.toolCallId,\n internalCallId: event.internalCallId,\n argumentBytes: byteLength(event.args),\n resultBytes: byteLength(event.result),\n structuredResultBytes:\n event.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(event.structuredResult)),\n }),\n },\n ];\n }\n if (event.type === \"turn_end\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"model\",\n event: \"model.turn.completed\",\n message: `Model turn ${event.turn} completed`,\n metadata: cleanMetadata({\n turn: event.turn,\n contentCount: event.response.choice.length,\n usage: usageSummary(event.response.usage),\n }),\n },\n ];\n }\n if (event.type === \"final\") {\n return [\n runCompletedLog({\n sessionId,\n runId,\n durationMs: Date.now() - props.startedAt,\n usage: event.usage,\n output: event.output,\n messageCount: event.messages.length,\n }),\n memorySavedLog({ sessionId, runId, messageCount: event.messages.length }),\n ];\n }\n if (event.type === \"error\") {\n return [runFailedLog(sessionId, runId, event.error, props.startedAt)];\n }\n if (event.type === \"tool_approval_request\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"approval\",\n event: \"approval.requested\",\n message: `Approval requested for ${event.approval.toolName}`,\n metadata: cleanMetadata({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n argumentBytes: byteLength(event.approval.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_approval_result\") {\n return [\n {\n sessionId,\n runId,\n level: event.approval.status === \"approved\" ? \"info\" : \"warn\",\n category: \"approval\",\n event: \"approval.resolved\",\n message: `Approval ${event.approval.status} for ${event.approval.toolName}`,\n metadata: cleanMetadata({\n approvalId: event.approval.id,\n toolName: event.approval.toolName,\n callId: event.approval.callId,\n status: event.approval.status,\n hasReason: event.approval.reason !== undefined,\n }),\n },\n ];\n }\n if (event.type === \"tool_question_request\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.requested\",\n message: `Question requested by ${event.question.toolName}`,\n metadata: cleanMetadata({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n questionCount: event.question.questions.length,\n argumentBytes: byteLength(event.question.args),\n }),\n },\n ];\n }\n if (event.type === \"tool_question_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"info\",\n category: \"question\",\n event: \"question.answered\",\n message: `Question answered for ${event.question.toolName}`,\n metadata: cleanMetadata({\n questionId: event.question.id,\n toolName: event.question.toolName,\n callId: event.question.callId,\n status: event.question.status,\n answerCount: event.question.answers?.length ?? 0,\n }),\n },\n ];\n }\n if (event.type === \"agent_tool_event\") {\n return childAgentLog(event, sessionId, runId);\n }\n return [];\n}\n\nasync function* emitLog(\n store: StudioSessionStore,\n input: StudioSessionLogAppendInput,\n): AsyncIterable<AgentRunStreamEvent> {\n const log = await appendSessionLog(store, input);\n if (log !== undefined) {\n yield { type: \"session_log\", log };\n }\n}\n\nfunction childAgentLog(\n event: Extract<AgentRunStreamEvent, { type: \"agent_tool_event\" }>,\n sessionId: string,\n runId: string,\n): StudioSessionLogAppendInput[] {\n const child = event.event;\n if (child.type === \"tool_call\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.called\",\n message: `Child agent ${event.agentName ?? event.agentId} called ${child.toolCall.function.name}`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolCall.function.name,\n callId: child.toolCall.callId ?? child.toolCall.id,\n argumentBytes: byteLength(formatUnknown(child.toolCall.function.arguments)),\n }),\n },\n ];\n }\n if (child.type === \"tool_result\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"tool\",\n event: \"child_tool.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed ${child.toolName}`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n turn: event.turn,\n childTurn: child.turn,\n toolName: child.toolName,\n callId: child.toolCallId,\n resultBytes: byteLength(child.result),\n structuredResultBytes:\n child.structuredResult === undefined\n ? undefined\n : byteLength(JSON.stringify(child.structuredResult)),\n }),\n },\n ];\n }\n if (child.type === \"turn_start\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.turn_started\",\n message: `Child agent ${event.agentName ?? event.agentId} turn ${child.turn} started`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n childTurn: child.turn,\n historyCount: child.history.length,\n }),\n },\n ];\n }\n if (child.type === \"final\") {\n return [\n {\n sessionId,\n runId,\n level: \"debug\",\n category: \"run\",\n event: \"child_agent.completed\",\n message: `Child agent ${event.agentName ?? event.agentId} completed`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n usage: usageSummary(child.usage),\n outputBytes: byteLength(child.output),\n messageCount: child.messages.length,\n }),\n },\n ];\n }\n if (child.type === \"error\") {\n return [\n {\n sessionId,\n runId,\n level: \"error\",\n category: \"run\",\n event: \"child_agent.failed\",\n message: `Child agent ${event.agentName ?? event.agentId} failed`,\n metadata: cleanMetadata({\n parentToolName: event.toolName,\n agentId: event.agentId,\n hasAgentName: event.agentName !== undefined,\n error: serializeError(child.error),\n }),\n },\n ];\n }\n return [];\n}\n\nfunction messageSummary(message: string | Message): JsonObject {\n if (typeof message === \"string\") {\n return {\n role: \"user\",\n contentKind: \"text\",\n byteLength: byteLength(message),\n };\n }\n return {\n role: message.role,\n contentKind: Array.isArray(message.content) ? \"parts\" : \"text\",\n partCount: Array.isArray(message.content) ? message.content.length : 1,\n byteLength: byteLength(formatUnknown(message.content)),\n };\n}\n\nfunction usageSummary(value: unknown): JsonObject | undefined {\n if (value === undefined || value === null || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n return cleanMetadata({\n inputTokens: numericValue(record.inputTokens),\n outputTokens: numericValue(record.outputTokens),\n totalTokens: numericValue(record.totalTokens),\n cachedInputTokens: numericValue(record.cachedInputTokens),\n cacheCreationInputTokens: numericValue(record.cacheCreationInputTokens),\n });\n}\n\nfunction cleanMetadata(value: Record<string, unknown>): JsonObject {\n const cleaned: JsonObject = {};\n for (const [key, item] of Object.entries(value)) {\n if (item === undefined) {\n continue;\n }\n const jsonValue = cleanJsonValue(item);\n if (jsonValue !== undefined) {\n cleaned[key] = jsonValue;\n }\n }\n return cleaned;\n}\n\nfunction cleanJsonValue(value: unknown): JsonValue | undefined {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => cleanJsonValue(item))\n .filter((item): item is JsonValue => item !== undefined);\n }\n if (typeof value === \"object\" && value !== null) {\n return cleanMetadata(value as Record<string, unknown>);\n }\n return undefined;\n}\n\nfunction numericValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction byteLength(value: string | undefined): number {\n return value === undefined ? 0 : new TextEncoder().encode(value).byteLength;\n}\n\nfunction formatUnknown(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","import type { JsonObject } from \"@anvia/core/completion\";\nimport type { Context, Hono } from \"hono\";\nimport type { StudioAgent, StudioSessionStore, StudioTraceStore } from \"../types\";\nimport { appendSessionLog, sessionCreatedLog } from \"./session-logs\";\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 await appendSessionLog(props.sessionStore, sessionCreatedLog(session));\n return c.json(session, 201);\n });\n\n app.get(\"/sessions/:sessionId\", async (c) => {\n const session = await props.sessionStore.getSession(c.req.param(\"sessionId\"));\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.json(session);\n });\n\n app.get(\"/sessions/:sessionId/logs\", async (c) => {\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n if (props.sessionStore.listSessionLogs === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.logs\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"logs\" },\n );\n }\n\n const limit = parseSessionLogLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n const after = parseSessionLogAfter(c.req.query(\"after\"));\n if (after === false) {\n return errorResponse(c, 400, \"bad_request\", \"after must be a non-negative integer\");\n }\n\n const logs = await props.sessionStore.listSessionLogs({\n sessionId,\n limit,\n ...(after === undefined ? {} : { after }),\n });\n const last = logs.at(-1);\n return c.json({\n logs,\n ...(logs.length === limit && last !== undefined ? { nextCursor: last.sequence } : {}),\n });\n });\n\n app.delete(\"/sessions/:sessionId\", async (c) => {\n if (props.sessionStore.deleteSession === undefined) {\n return errorResponse(\n c,\n 501,\n \"unsupported_capability\",\n 'Capability \"sessions.delete\" is not implemented by this runner',\n { capability: \"sessions\", operation: \"delete\" },\n );\n }\n\n const deleted = await props.sessionStore.deleteSession(c.req.param(\"sessionId\"));\n if (!deleted) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n return c.body(null, 204);\n });\n\n app.get(\"/sessions/:sessionId/traces\", async (c) => {\n if (props.traceStore === undefined) {\n return unsupportedCapability(c, \"traces\");\n }\n const sessionId = c.req.param(\"sessionId\");\n const session = await props.sessionStore.getSession(sessionId);\n if (session === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Session not found\");\n }\n\n const limit = parseLimit(c.req.query(\"limit\"));\n if (limit === undefined) {\n return errorResponse(c, 400, \"bad_request\", \"limit must be a positive integer\");\n }\n\n const traces = await props.traceStore.listSessionTraces({ sessionId, limit });\n return c.json({ traces });\n });\n}\n\nfunction parseSessionLogLimit(value: string | undefined): number | undefined {\n if (value === undefined || value.trim().length === 0) {\n return 200;\n }\n const limit = Number(value);\n if (!Number.isInteger(limit) || limit <= 0) {\n return undefined;\n }\n return Math.min(limit, 1000);\n}\n\nfunction parseSessionLogAfter(value: string | undefined): number | undefined | false {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n const after = Number(value);\n if (!Number.isInteger(after) || after < 0) {\n return false;\n }\n return after;\n}\n\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 { StudioAgent, StudioPipeline, StudioStatusSummary } from \"../types\";\nimport {\n capabilityConfig,\n type ResolvedStores,\n runnerId,\n type StudioRuntimeOptions,\n} from \"./shared\";\n\nexport function registerStatusRoutes(\n app: Hono,\n props: {\n options: StudioRuntimeOptions;\n agents: StudioAgent[];\n pipelines: StudioPipeline[];\n stores: ResolvedStores;\n },\n): void {\n app.get(\"/status\", async (c) => {\n const summary: StudioStatusSummary = {\n runner: {\n id: runnerId(props.options),\n ...(props.options.name === undefined ? {} : { name: props.options.name }),\n ...(props.options.version === undefined ? {} : { version: props.options.version }),\n },\n storage: {\n ...(props.stores.sessions?.kind === undefined\n ? {}\n : { sessions: props.stores.sessions.kind }),\n ...(props.stores.traces?.kind === undefined ? {} : { traces: props.stores.traces.kind }),\n ...(props.stores.pipelineLogs === undefined ? {} : { pipelineLogs: \"available\" }),\n ...(props.stores.pipelineRuns === undefined ? {} : { pipelineRuns: \"available\" }),\n },\n counts: {\n agents: props.agents.length,\n pipelines: props.pipelines.length,\n ...(props.stores.sessions === undefined\n ? {}\n : { sessions: (await props.stores.sessions.listSessions({ limit: 100 })).length }),\n ...(props.stores.traces?.listTraces === undefined\n ? {}\n : { traces: (await props.stores.traces.listTraces({ limit: 100 })).length }),\n ...(props.stores.pipelineRuns === undefined || props.pipelines.length === 0\n ? {}\n : {\n pipelineRuns: (\n await Promise.all(\n props.pipelines.map((pipeline) =>\n props.stores.pipelineRuns?.listPipelineRuns({\n pipelineId: pipeline.id,\n limit: 100,\n }),\n ),\n )\n ).reduce((sum, runs) => sum + (runs?.length ?? 0), 0),\n }),\n },\n capabilities: capabilityConfig(props.options, props.agents, props.pipelines, props.stores),\n generatedAt: new Date().toISOString(),\n };\n return c.json(summary);\n });\n}\n","import type { Context, Hono } from \"hono\";\nimport type {\n StudioAgent,\n StudioAgentToolMetadata,\n StudioToolRunRequest,\n StudioToolRunResponse,\n} from \"../types\";\nimport { serializeUnknown, toJsonValue } from \"./json\";\nimport { errorResponse, isJsonObject, isJsonValue } from \"./shared\";\nimport { agentToolItems, approvalMetadata } from \"./tool-metadata\";\n\nexport function registerToolRoutes(\n app: Hono,\n props: {\n agentMap: Map<string, StudioAgent>;\n },\n): void {\n app.get(\"/agents/:agentId/tools\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n\n return c.json({\n agentId,\n tools: await agentToolMetadata(agent),\n });\n });\n\n app.post(\"/agents/:agentId/tools/:toolName/runs\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const toolName = c.req.param(\"toolName\");\n const agent = props.agentMap.get(agentId);\n if (agent === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Agent not found\");\n }\n if (agent.agent.getTool(toolName) === undefined) {\n return errorResponse(c, 404, \"not_found\", \"Tool not found\");\n }\n\n const body = await parseToolRunRequest(c);\n if (\"error\" in body) {\n return body.error;\n }\n\n const started = Date.now();\n const startedAt = new Date(started).toISOString();\n const events: unknown[] = [];\n try {\n const result = await agent.agent.callTool(toolName, JSON.stringify(body.args), {\n emitStreamEvent(event) {\n events.push(event);\n },\n });\n const ended = Date.now();\n return c.json({\n agentId,\n toolName,\n status: \"success\",\n result: toJsonValue(result),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse);\n } catch (error) {\n const ended = Date.now();\n return c.json(\n {\n agentId,\n toolName,\n status: \"error\",\n error: serializeUnknown(error),\n durationMs: ended - started,\n startedAt,\n endedAt: new Date(ended).toISOString(),\n events: events.map(toJsonValue),\n } satisfies StudioToolRunResponse,\n 500,\n );\n }\n });\n}\n\nasync function parseToolRunRequest(\n c: Context,\n): Promise<StudioToolRunRequest | { error: Response }> {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be JSON\") };\n }\n if (body === undefined || body === null) {\n return { args: {} } satisfies StudioToolRunRequest;\n }\n if (!isJsonObject(body)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"Request body must be an object\") };\n }\n const args = Object.hasOwn(body, \"args\") ? body.args : {};\n if (!isJsonValue(args)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"args must be JSON-compatible\") };\n }\n const request: StudioToolRunRequest = { args };\n if (Object.hasOwn(body, \"context\")) {\n if (!isJsonObject(body.context)) {\n return { error: errorResponse(c, 400, \"bad_request\", \"context must be an object\") };\n }\n request.context = body.context;\n }\n return request;\n}\n\nexport async function agentToolMetadata(agent: StudioAgent): Promise<StudioAgentToolMetadata[]> {\n const seen = new Set<string>();\n const metadata: StudioAgentToolMetadata[] = [];\n for (const { tool, source } of agentToolItems(agent)) {\n const key = `${source}:${tool.name}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n const definition = await tool.definition(\"\");\n metadata.push({\n agentId: agent.id,\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n source,\n approval: approvalMetadata(tool),\n });\n }\n\n return metadata.sort((left, right) => {\n if (left.source !== right.source) {\n return left.source === \"static\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n}\n","import type { Hono } from \"hono\";\nimport type { StudioTraceStore } from \"../types\";\nimport { 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":";AAAA;AAAA,EACE,cAAAA;AAAA,OAIK;AACP,SAAuD,eAAe;AACtE,SAAS,aAAa;AACtB,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,aAAa;AAEtB,SAAS,QAAQ,eAAe;;;ACgBzB,IAAM,sBAAN,MAAmD;AAAA,EACxD,YAA6B,SAAqC;AAArC;AAAA,EAAsC;AAAA,EAAtC;AAAA,EAE7B,SAAS,MAA2C;AAClD,UAAM,UAAU,KAAK,OAAO,WAAW,WAAW,OAAO,WAAW,EAAE,WAAW,KAAK,EAAE;AACxF,UAAM,gBAAgB,WAAW,OAAO,WAAW,EAAE,WAAW,KAAK,EAAE,EAAE,MAAM,GAAG,EAAE;AACpF,WAAO,IAAI,uBAAuB;AAAA,MAChC,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO,KAAK,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,QAAsC;AAC5C,WAAO,OAAO,KAAK,QAAQ,UAAU,aAAa,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ;AAAA,EACxF;AACF;AAEA,IAAM,yBAAN,MAAyD;AAAA,EAKvD,YACmB,OAMjB;AANiB;AAOjB,SAAK,QAAQ,EAAE,SAAS,MAAM,IAAI,eAAe,MAAM,cAAc;AAAA,EACvE;AAAA,EARmB;AAAA,EALV;AAAA,EACQ,YAAY,oBAAI,KAAK;AAAA,EACrB,eAAyC,CAAC;AAAA,EAa3D,gBAAgB,MAAyD;AACvE,UAAM,YAAY,oBAAI,KAAK;AAC3B,WAAO;AAAA,MACL,KAAK,CAAC,YAAoC;AACxC,aAAK,aAAa;AAAA,UAChB,iBAAiB;AAAA,YACf,MAAM;AAAA,YACN,MAAM,cAAc,KAAK,IAAI;AAAA,YAC7B,QAAQ;AAAA,YACR,MAAM,KAAK;AAAA,YACX;AAAA,YACA,OAAO,YAAY,KAAK,OAAO;AAAA,YAC/B,QAAQ,YAAY,QAAQ,QAAQ;AAAA,YACpC,UAAU,mBAAmB,MAAM,OAAO;AAAA,UAC5C,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,OAAO,CAAC,cAAwC;AAC9C,aAAK,aAAa;AAAA,UAChB,iBAAiB;AAAA,YACf,MAAM;AAAA,YACN,MAAM,cAAc,KAAK,IAAI;AAAA,YAC7B,QAAQ;AAAA,YACR,MAAM,KAAK;AAAA,YACX;AAAA,YACA,OAAO,YAAY,KAAK,OAAO;AAAA,YAC/B,OAAO,eAAe,UAAU,KAAK;AAAA,YACrC,UAAU,mBAAmB,IAAI;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,MAA6C;AACrD,UAAM,YAAY,oBAAI,KAAK;AAC3B,UAAM,aAAa,IAAI,+BAA+B,IAAI;AAC1D,WAAO;AAAA,MACL,aAAa,CAAC,eAAyC;AACrD,mBAAW,OAAO,UAAU;AAAA,MAC9B;AAAA,MACA,KAAK,CAAC,YAA8B;AAClC,cAAM,oBAAoB,iBAAiB;AAAA,UACzC,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,MAAM,KAAK;AAAA,UACX;AAAA,UACA,OAAO,cAAc,KAAK,IAAI;AAAA,UAC9B,QAAQ,cAAc,QAAQ,MAAM;AAAA,UACpC,UAAU,aAAa,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAAA,QAC9D,CAAC;AACD,aAAK,aAAa,KAAK,iBAAiB;AACxC,aAAK,aAAa,KAAK,GAAG,WAAW,aAAa,kBAAkB,EAAE,CAAC;AAAA,MACzE;AAAA,MACA,OAAO,CAAC,cAAkC;AACxC,cAAM,oBAAoB,iBAAiB;AAAA,UACzC,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,MAAM,KAAK;AAAA,UACX;AAAA,UACA,OAAO,cAAc,KAAK,IAAI;AAAA,UAC9B,OAAO,eAAe,UAAU,KAAK;AAAA,UACrC,UAAU,aAAa,MAAM,KAAK;AAAA,QACpC,CAAC;AACD,aAAK,aAAa,KAAK,iBAAiB;AACxC,aAAK,aAAa,KAAK,GAAG,WAAW,aAAa,kBAAkB,EAAE,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAsC;AAC9C,UAAM,KAAK,KAAK,WAAW;AAAA,MACzB,SAAS,oBAAI,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,UAAU,YAAY,KAAK,QAAQ;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,MAAwC;AAClD,UAAM,KAAK,KAAK,SAAS;AAAA,MACvB,SAAS,oBAAI,KAAK;AAAA,MAClB,OAAO,eAAe,KAAK,KAAK;AAAA,MAChC,OAAO,KAAK;AAAA,MACZ,UAAU,YAAY,KAAK,QAAQ;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,KACZ,QACA,QAOe;AACf,UAAM,YAAY,KAAK,MAAM,KAAK,OAAO;AACzC,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,cAAc,UAAa,UAAU,QAAW;AAClD;AAAA,IACF;AAEA,UAAM,WAAW,cAAc,KAAK,MAAM,MAAM,OAAO,QAAQ;AAC/D,UAAM,QAAqB;AAAA,MACzB,IAAI,KAAK,MAAM;AAAA,MACf;AAAA,MACA,GAAI,KAAK,MAAM,KAAK,OAAO,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAAA,MACxF;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,UAAU,YAAY;AAAA,MACtC,SAAS,OAAO,QAAQ,YAAY;AAAA,MACpC,YAAY,WAAW,KAAK,WAAW,OAAO,OAAO;AAAA,MACrD,OAAO,YAAY;AAAA,QACjB,cAAc,KAAK,MAAM,KAAK;AAAA,QAC9B,QAAQ,KAAK,MAAM,KAAK;AAAA,QACxB,SAAS,KAAK,MAAM,KAAK;AAAA,MAC3B,CAAC;AAAA,MACD,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,MAC/D,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,MAC5D,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,MAC5D;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,kBAAkB,KAAK,aAAa;AAAA,IACtC;AAEA,UAAM,MAAM,UAAU,KAAK;AAAA,EAC7B;AACF;AAEA,IAAM,iCAAN,MAAqC;AAAA,EAgCnC,YAA6B,QAA4B;AAA5B;AAAA,EAA6B;AAAA,EAA7B;AAAA,EA/BZ,cAAc,oBAAI,IAOjC;AAAA,EACe,mBAAmB,oBAAI,IAStC;AAAA,EACe,aAUZ,CAAC;AAAA,EACW,wBAAkD,CAAC;AAAA,EAIpE,OAAO,MAAsC;AAC3C,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,QAAQ,QAAQ;AACxD,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ;AACxB,UAAM,YAAY,QAAQ;AAC1B,UAAM,YAAY,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,KAAK,OAAO;AAE5E,QAAI,CAAC,KAAK,YAAY,IAAI,OAAO,GAAG;AAClC,WAAK,YAAY,IAAI,SAAS;AAAA,QAC5B,WAAW,oBAAI,KAAK;AAAA,QACpB;AAAA,QACA,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,SAAS,cAAc;AAC/B,WAAK,iBAAiB,IAAI,cAAc,SAAS,SAAS,GAAG;AAAA,QAC3D,WAAW,oBAAI,KAAK;AAAA,QACpB,OAAO,YAAY;AAAA,UACjB,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,QACD;AAAA,QACA,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,QAC/C;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,YAAM,MAAM,cAAc,SAAS,SAAS;AAC5C,YAAM,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC3C,WAAK,iBAAiB,OAAO,GAAG;AAChC,WAAK,sBAAsB;AAAA,QACzB,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,MAAM,GAAG,WAAW,SAAS,SAAS,CAAC,eAAe,SAAS;AAAA,UAC/D,QAAQ;AAAA,UACR,MAAM,KAAK,OAAO;AAAA,UAClB,WAAW,OAAO,aAAa,oBAAI,KAAK;AAAA,UACxC,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,UAC3D,QAAQ,YAAY,MAAM,QAAQ;AAAA,UAClC,UAAU,KAAK,cAAc,SAAS,WAAW,SAAS;AAAA,QAC5D,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,eAAe,SAAS,MAAM,QAAQ,GAAG;AAC1D,YAAM,WAAW,MAAM;AACvB,YAAM,mBAAmB,SAAS,SAAS,QAAQ,IAAI,SAAS,WAAW;AAC3E,YAAM,WAAW,OAAO,kBAAkB,SAAS,WAAW,iBAAiB,OAAO;AACtF,YAAM,SACJ,OAAO,SAAS,WAAW,WACvB,SAAS,SACT,OAAO,SAAS,OAAO,WACrB,SAAS,KACT;AACR,WAAK,WAAW,KAAK;AAAA,QACnB,WAAW,oBAAI,KAAK;AAAA,QACpB;AAAA,QACA,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,QAC/C;AAAA,QACA;AAAA,QACA,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,OAAO;AAAA,QACrD,OAAO,YAAY,kBAAkB,aAAa,CAAC,CAAC;AAAA,QACpD,WAAW;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,eAAe;AAChC,YAAM,WAAW,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AACvE,YAAM,aAAa,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC7E,YAAM,iBACJ,OAAO,MAAM,mBAAmB,WAAW,MAAM,iBAAiB;AACpE,YAAM,QAAQ,KAAK,cAAc,SAAS,UAAU,UAAU;AAC9D,YAAM,QACJ,OAAO,UAAU,OAAO,MAAM,SAAS,WAAW,cAAc,MAAM,IAAI,IAAI;AAChF,UAAI,UAAU,QAAW;AACvB,cAAM,YAAY;AAAA,MACpB;AACA,WAAK,sBAAsB;AAAA,QACzB,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,MAAM,GAAG,WAAW,SAAS,SAAS,CAAC,IAAI,QAAQ;AAAA,UACnD,QAAQ;AAAA,UACR,MAAM,KAAK,OAAO;AAAA,UAClB,WAAW,OAAO,aAAa,oBAAI,KAAK;AAAA,UACxC,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,UACvC,GAAI,OAAO,MAAM,WAAW,WAAW,EAAE,QAAQ,cAAc,MAAM,MAAM,EAAE,IAAI,CAAC;AAAA,UAClF,UAAU;AAAA,YACR,GAAG,KAAK,cAAc,SAAS,WAAW,SAAS;AAAA,YACnD,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,YACjD,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,UAC3D;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,WAAK,sBAAsB;AAAA,QACzB,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,MAAM,GAAG,WAAW,SAAS,SAAS,CAAC;AAAA,UACvC,QAAQ;AAAA,UACR,MAAM,KAAK,OAAO;AAAA,UAClB,WAAW,oBAAI,KAAK;AAAA,UACpB,OAAO,eAAe,MAAM,KAAK;AAAA,UACjC,UAAU,KAAK,cAAc,SAAS,WAAW,SAAS;AAAA,QAC5D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,qBAAuD;AAClE,UAAM,eAAyC,CAAC;AAChD,UAAM,sBAAsB,oBAAI,IAAoB;AAEpD,eAAW,cAAc,KAAK,YAAY,OAAO,GAAG;AAClD,YAAM,gBAAgB,KAAK,sBAAsB;AAAA,QAC/C,CAAC,gBACC,SAAS,YAAY,QAAQ,KAC7B,YAAY,SAAS,iBAAiB,WAAW;AAAA,MACrD;AACA,YAAM,kBAAkB,cAAc,IAAI,CAAC,gBAAgB,KAAK,MAAM,YAAY,SAAS,CAAC;AAC5F,YAAM,gBAAgB,cAAc;AAAA,QAAI,CAAC,gBACvC,KAAK,MAAM,YAAY,WAAW,YAAY,SAAS;AAAA,MACzD;AACA,YAAM,YACJ,gBAAgB,WAAW,IACvB,WAAW,YACX,IAAI,KAAK,KAAK,IAAI,WAAW,UAAU,QAAQ,GAAG,GAAG,eAAe,CAAC;AAC3E,YAAM,UACJ,cAAc,WAAW,IAAI,oBAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,aAAa,CAAC;AAC/E,YAAM,mBAAmB,iBAAiB;AAAA,QACxC;AAAA,QACA,MAAM;AAAA,QACN,MAAM,GAAG,WAAW,WAAW,SAAS,WAAW,SAAS,CAAC;AAAA,QAC7D,QAAQ,cAAc,KAAK,CAAC,gBAAgB,YAAY,WAAW,OAAO,IACtE,UACA;AAAA,QACJ,MAAM,KAAK,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,QACA,UAAU,KAAK,cAAc,WAAW,SAAS,WAAW,WAAW,KAAK,OAAO,IAAI;AAAA,MACzF,CAAC;AACD,mBAAa,KAAK,gBAAgB;AAClC,0BAAoB,IAAI,WAAW,SAAS,iBAAiB,EAAE;AAAA,IACjE;AAEA,eAAW,eAAe,KAAK,uBAAuB;AACpD,YAAM,eAAe,SAAS,YAAY,QAAQ,IAC9C,YAAY,YAAY,SAAS,YAAY,IAC7C;AACJ,YAAM,0BACJ,iBAAiB,SAAY,SAAY,oBAAoB,IAAI,YAAY;AAC/E,mBAAa,KAAK;AAAA,QAChB,GAAG;AAAA,QACH,qBAAqB,2BAA2B;AAAA,MAClD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cACN,SACA,UACA,YAC8C;AAC9C,aAAS,QAAQ,KAAK,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACnE,YAAM,QAAQ,KAAK,WAAW,KAAK;AACnC,UACE,UAAU,UACV,MAAM,aACN,MAAM,YAAY,WAClB,MAAM,aAAa,UACnB;AACA;AAAA,MACF;AACA,UAAI,eAAe,UAAa,MAAM,eAAe,YAAY;AAC/D,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cACN,SACA,WACA,WACY;AACZ,WAAO,kBAAkB;AAAA,MACvB,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB;AAAA,MACA,gBAAgB,KAAK,OAAO;AAAA,MAC5B,sBAAsB,KAAK,OAAO;AAAA,MAClC,kBAAkB,KAAK,OAAO;AAAA,IAChC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,SAAiB,MAAsB;AAC5D,SAAO,GAAG,OAAO,IAAI,IAAI;AAC3B;AAEA,SAAS,WAAW,SAAiB,WAAuC;AAC1E,UAAQ,aAAa,SAAS,WAAW,QAAQ,GAAG;AACtD;AAEA,SAAS,iBAAiB,OAYC;AACzB,QAAM,UAAU,MAAM,WAAW,oBAAI,KAAK;AAC1C,SAAO;AAAA,IACL,IAAI,WAAW,OAAO,WAAW;AAAA,IACjC,GAAI,MAAM,wBAAwB,SAC9B,CAAC,IACD,EAAE,qBAAqB,MAAM,oBAAoB;AAAA,IACrD,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,UAAU,YAAY;AAAA,IACvC,SAAS,QAAQ,YAAY;AAAA,IAC7B,YAAY,WAAW,MAAM,WAAW,OAAO;AAAA,IAC/C,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,EACrE;AACF;AAEA,SAAS,cAAc,MAAyB,UAAiC;AAC/E,SAAO,kBAAkB;AAAA,IACvB,WAAW,KAAK;AAAA,IAChB,kBAAkB,KAAK;AAAA,IACvB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK,OAAO;AAAA,IACpB,MAAM,KAAK,OAAO;AAAA,IAClB,SAAS,KAAK,OAAO;AAAA,IACrB,UAAU,YAAY,KAAK,OAAO,YAAY,CAAC,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBACP,MACA,SACY;AACZ,QAAM,UAAU,KAAK;AACrB,QAAM,WAAW,SAAS;AAC1B,QAAM,cAAc,SAAS,UAAU,WAAW,IAAI,SAAS,cAAc;AAC7E,QAAM,iBACJ,QAAQ,SAAS,YAAY,aAAa,KAAK,KAAK,KAAK,WAAW,gBAAgB;AACtF,QAAM,mBAAmB,wBAAwB,WAAW;AAC5D,QAAM,QAAQ,UAAU;AAExB,SAAO,kBAAkB;AAAA,IACvB,UAAU,KAAK,WAAW;AAAA,IAC1B,OAAO;AAAA,IACP,gBAAgB,QAAQ;AAAA,IACxB,cAAc,KAAK,WAAW;AAAA,IAC9B,WAAW,UAAU;AAAA,IACrB;AAAA,IACA,WAAW,QAAQ,MAAM;AAAA,IACzB,WAAW,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IAChD,eAAe,QAAQ,UAAU;AAAA,IACjC,cAAc,QAAQ,YAAY;AAAA,IAClC,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,qBAAqB,SAAS,QAAQ,gBAAgB,IAClD,OAAO,KAAK,QAAQ,gBAAgB,EAAE,KAAK,IAC3C;AAAA,IACJ,iBAAiB,QAAQ,iBAAiB;AAAA,IAC1C,cAAc,SAAS;AAAA,IACvB;AAAA,IACA,WAAW,kBAAkB;AAAA,MAC3B,UAAU,KAAK,WAAW;AAAA,MAC1B,OAAO;AAAA,MACP,gBAAgB,QAAQ;AAAA,MACxB,cAAc,KAAK,WAAW;AAAA,MAC9B,cAAc,KAAK,WAAW;AAAA,IAChC,CAAC;AAAA,IACD,WAAW,kBAAkB;AAAA,MAC3B,SAAS,yBAAyB,OAAO;AAAA,MACzC,iBAAiB,KAAK;AAAA,IACxB,CAAC;AAAA,IACD,UAAU,kBAAkB;AAAA,MAC1B,WAAW,UAAU;AAAA,MACrB;AAAA,MACA,cAAc,UAAU,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,IACD,OAAO,kBAAkB;AAAA,MACvB,OAAO,QAAQ,MAAM;AAAA,MACrB,OAAO,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,MAC5C,YAAY,QAAQ;AAAA,MACpB,iBAAiB,QAAQ,iBAAiB;AAAA,IAC5C,CAAC;AAAA,IACD,QAAQ,kBAAkB;AAAA,MACxB,cAAc,SAAS;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,yBAAyB,SAA0D;AAC1F,SAAO,kBAAkB;AAAA,IACvB,OAAO,QAAQ;AAAA,IACf,cAAc,QAAQ,iBAAiB,SAAY,SAAY,EAAE,SAAS,KAAK;AAAA,IAC/E,cAAc,QAAQ,YAAY;AAAA,IAClC,eAAe,QAAQ,UAAU;AAAA,IACjC,aAAa,QAAQ,UAAU,IAAI,CAAC,aAAa,SAAS,EAAE;AAAA,IAC5D,WAAW,QAAQ,MAAM;AAAA,IACzB,WAAW,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IAChD,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,qBAAqB,SAAS,QAAQ,gBAAgB,IAClD,OAAO,KAAK,QAAQ,gBAAgB,EAAE,KAAK,IAC3C;AAAA,IACJ,iBAAiB,QAAQ,iBAAiB;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,wBACP,aACwB;AACxB,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,SAAS,YAAY,SAAS,IAAI,YAAY,YAAY;AAC5E,QAAM,OAAO,SAAS,YAAY,IAAI,IAAI,YAAY,OAAO;AAC7D,QAAM,YAAY,SAAS,YAAY,UAAU,IAAI,YAAY,aAAa;AAC9E,QAAM,YAAY,SAAS,WAAW,UAAU,IAAI,UAAU,aAAa;AAC3E,QAAM,UAAU,kBAAkB;AAAA,IAChC,IAAI,YAAY;AAAA,IAChB,QAAQ,YAAY;AAAA,IACpB,aAAa,YAAY;AAAA,IACzB,OAAO,YAAY;AAAA,IACnB,mBAAmB,YAAY;AAAA,IAC/B,gBAAgB,YAAY;AAAA,IAC5B,sBAAsB,YAAY;AAAA,IAClC,iBAAiB,WAAW;AAAA,IAC5B,eAAe,MAAM;AAAA,IACrB,uBAAuB,WAAW;AAAA,EACpC,CAAC;AACD,SAAO,OAAO,KAAK,OAAO,EAAE,WAAW,IAAI,SAAY;AACzD;AAEA,SAAS,aAAa,MAA0B,SAAkB,QAA6B;AAC7F,QAAM,SAAS,SAAS,KAAK,gBAAgB,UAAU,IAAI,KAAK,eAAe,aAAa,CAAC;AAC7F,QAAM,aAAa,SAAS,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AACtE,QAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAC1C,OAAO,SAAS,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IACzE,CAAC;AACL,SAAO,kBAAkB;AAAA,IACvB,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,IACjB;AAAA,IACA,eAAe,WAAW,KAAK,IAAI;AAAA,IACnC,aAAa,WAAW,SAAY,SAAY,WAAW,MAAM;AAAA,IACjE,kBAAkB,KAAK,SAAS,cAAc;AAAA,IAC9C,qBAAqB,KAAK,SAAS,qBAAqB;AAAA,IACxD,iBAAiB,KAAK,gBAAgB;AAAA,IACtC,eAAe,OAAO,KAAK,UAAU,EAAE,KAAK;AAAA,IAC5C,uBAAuB;AAAA,IACvB,kBAAkB,KAAK,cAAc;AAAA,IACrC,eAAe,KAAK,cAAc;AAAA,IAClC,OAAO,kBAAkB;AAAA,MACvB,MAAM,KAAK;AAAA,MACX,gBAAgB,KAAK;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,aAAa,KAAK,gBAAgB;AAAA,MAClC,eAAe,OAAO,KAAK,UAAU,EAAE,KAAK;AAAA,MAC5C,uBAAuB;AAAA,MACvB,kBAAkB,KAAK,cAAc;AAAA,MACrC,eAAe,KAAK,cAAc;AAAA,MAClC,eAAe,WAAW,KAAK,IAAI;AAAA,MACnC,aAAa,WAAW,SAAY,SAAY,WAAW,MAAM;AAAA,MACjE,kBAAkB,KAAK,SAAS,cAAc;AAAA,MAC9C,qBAAqB,KAAK,SAAS,qBAAqB;AAAA,IAC1D,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE;AACzC;AAEA,SAAS,kBAAkB,QAA6C;AACtE,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE;AAAA,IAAQ,CAAC,CAAC,KAAK,KAAK,MACzD,UAAU,SAAY,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACvD;AACA,SAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAS,WAAW,WAAiB,SAAuB;AAC1D,SAAO,KAAK,IAAI,GAAG,QAAQ,QAAQ,IAAI,UAAU,QAAQ,CAAC;AAC5D;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI;AACF,WAAO,YAAY,KAAK,MAAM,KAAK,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,eAAe,OAA2B;AACjD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,kBAAkB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO,YAAY,KAAK;AAC1B;AAEA,SAAS,YAAY,OAA2B;AAC9C,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC;AAAA,EAC9C;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,kBAAkB,KAAgC;AAAA,EAC3D;AACA,SAAO,OAAO,KAAK;AACrB;;;ACzrBA,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAavB,SAAS,uBACd,IACyB;AACzB,QAAM,UAAU,OAAO,OAAO,WAAW,KAAK,CAAC;AAC/C,SAAO;AAAA,IACL,MAAM,gBAAgB,QAAQ,QAAQ,KAAK;AAAA,IAC3C,OAAO,QAAQ,SAAS;AAAA,IACxB,YAAY,QAAQ,cAAc;AAAA,IAClC,cAAc,QAAQ,gBAAgB;AAAA,IACtC,GAAI,QAAQ,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;AAAA,IACnF,cAAc,QAAQ,gBAAgB;AAAA,EACxC;AACF;AAEO,SAAS,kBAAkB,IAAoD;AACpF,SAAO,OAAO;AAChB;AAEO,SAAS,iBAAiB,KAAW,SAAwC;AAClF,QAAM,aAAa,GAAG,QAAQ,IAAI;AAClC,QAAM,YAAY,GAAG,QAAQ,IAAI;AACjC,QAAM,cAAc,MAClB,eAAe;AAAA,IACb;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AACH,QAAM,kBAAkB,MACtB,eAAe;AAAA,IACb;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAEH,MAAI,QAAQ,cAAc;AACxB,QAAI,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,kBAAkB,OAAO,CAAC,CAAC;AAAA,EAC5D;AAEA,MAAI,IAAI,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC9D,MAAI,IAAI,GAAG,QAAQ,IAAI,eAAe,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC9E,MAAI,IAAI,GAAG,QAAQ,IAAI,eAAe,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC9E,MAAI,IAAI,GAAG,QAAQ,IAAI,0BAA0B,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AACzF,MAAI,IAAI,GAAG,QAAQ,IAAI,YAAY,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC3E,MAAI,IAAI,GAAG,QAAQ,IAAI,qBAAqB,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AACpF,MAAI,IAAI,GAAG,QAAQ,IAAI,gCAAgC,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC/F,MAAI,IAAI,GAAG,QAAQ,IAAI,cAAc,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC7E,MAAI,IAAI,GAAG,QAAQ,IAAI,aAAa,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC5E,MAAI,IAAI,GAAG,QAAQ,IAAI,WAAW,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC1E,MAAI,IAAI,GAAG,QAAQ,IAAI,UAAU,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AACzE,MAAI,IAAI,GAAG,QAAQ,IAAI,SAAS,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AACxE,MAAI,IAAI,GAAG,QAAQ,IAAI,cAAc,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC7E,MAAI,IAAI,GAAG,QAAQ,IAAI,UAAU,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AACzE,MAAI,IAAI,GAAG,QAAQ,IAAI,WAAW,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC1E,MAAI,IAAI,GAAG,QAAQ,IAAI,WAAW,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC1E,MAAI,IAAI,GAAG,QAAQ,IAAI,cAAc,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAC7E,MAAI,IAAI,GAAG,QAAQ,IAAI,mBAAmB,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAClF,MAAI,IAAI,GAAG,QAAQ,IAAI,gBAAgB,OAAO,MAAM,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;AAE/E,MAAI,QAAQ,YAAY;AACtB,QAAI,IAAI,eAAe,OAAO,MAAM,EAAE,KAAK,MAAM,gBAAgB,CAAC,CAAC;AACnE,QAAI,IAAI,0BAA0B,OAAO,MAAM,EAAE,KAAK,MAAM,gBAAgB,CAAC,CAAC;AAC9E,QAAI,IAAI,YAAY,OAAO,MAAM,EAAE,KAAK,MAAM,gBAAgB,CAAC,CAAC;AAChE,QAAI,IAAI,qBAAqB,OAAO,MAAM,EAAE,KAAK,MAAM,gBAAgB,CAAC,CAAC;AACzE,QAAI,IAAI,gCAAgC,OAAO,MAAM,EAAE,KAAK,MAAM,gBAAgB,CAAC,CAAC;AACpF,QAAI,IAAI,cAAc,OAAO,MAAM,EAAE,KAAK,MAAM,gBAAgB,CAAC,CAAC;AAAA,EACpE;AAEA,MAAI,IAAI,YAAY,YAAY;AAC9B,QAAI,QAAQ,iBAAiB,QAAW;AACtC,aAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C;AACA,WAAO,IAAI,SAAS,QAAQ,cAAc;AAAA,MACxC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,IAAI,WAAW,YAAY;AAC7B,UAAM,SAAS,MAAM,4BAA4B;AACjD,WAAO,IAAI,SAAS,QAAQ;AAAA,MAC1B,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,IAAI,GAAG,QAAQ,IAAI,kBAAkB,OAAO,MAAM;AACpD,UAAM,QAAQ,EAAE,IAAI,MAAM,OAAO;AACjC,QAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG;AAC/C,aAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C;AACA,UAAM,SAAS,MAAM,mBAAmB,KAAK;AAC7C,QAAI,WAAW,QAAW;AACxB,aAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C;AACA,UAAM,OAAO,IAAI,YAAY,OAAO,UAAU;AAC9C,QAAI,WAAW,IAAI,EAAE,IAAI,MAAM;AAC/B,WAAO,IAAI,SAAS,MAAM;AAAA,MACxB,SAAS;AAAA,QACP,gBAAgB,oBAAoB,KAAK;AAAA,QACzC,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,eAAe,OAKV;AAClB,QAAM,EAAE,QAAQ,IAAI;AACpB,MAAI,QAAQ,iBAAiB,QAAW;AACtC,WAAO,0BAA0B;AAAA,MAC/B,OAAO,QAAQ;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,cAAc,QAAQ;AAAA,MACtB,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,MAAM,mBAAmB;AACvC,SAAO,MACJ,QAAQ,uBAAuB,UAAU,WAAW,QAAQ,KAAK,CAAC,UAAU,EAC5E;AAAA,IACC;AAAA,IACA,iBAAiB,WAAW,MAAM,SAAS,CAAC,0BAA0B,WAAW,QAAQ,IAAI,CAAC;AAAA,EAChG,EACC,WAAW,SAAS,IAAI,WAAW,QAAQ,IAAI,CAAC,GAAG;AACxD;AAEA,SAAS,0BAA0B,OAMxB;AACT,QAAM,QAAQ,WAAW,MAAM,KAAK;AACpC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,KAAK;AAAA,IACf;AAAA,IACA,2CAA2C,WAAW,MAAM,YAAY,CAAC;AAAA,IACzE,gCAAgC,WAAW,MAAM,UAAU,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,IACA,oCAAoC,WAAW,MAAM,MAAM,CAAC,0BAA0B,WAAW,MAAM,YAAY,CAAC;AAAA,IACpH;AAAA,IACA;AAAA,IACA,aAAa,WAAW,MAAM,YAAY,CAAC;AAAA,IAC3C;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,8BAA8B,WAAW,MAAM,YAAY,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,EACF,EAAE,KAAK,EAAE;AACX;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,QAAM,UAAU,KAAK,KAAK;AAC1B,QAAM,YAAY,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI,OAAO;AACjE,QAAM,uBAAuB,UAAU,SAAS,IAAI,UAAU,QAAQ,QAAQ,EAAE,IAAI;AACpF,MAAI,qBAAqB,WAAW,KAAK,yBAAyB,KAAK;AACrE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,SAA0C;AAC1E,SAAO,GAAG,QAAQ,IAAI;AACxB;AAEA,eAAe,qBAAsC;AACnD,MAAI;AACF,WAAO,MAAM,SAAS,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAAC,GAAG,MAAM;AAAA,EAC1F,SAAS,OAAO;AACd,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI;AACF,WAAO,MAAM;AAAA,MACX,cAAc,IAAI,IAAI,4BAA4B,YAAY,GAAG,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,YAAM;AAAA,IACR;AACA,WAAO,SAAS,cAAc,IAAI,IAAI,oBAAoB,YAAY,GAAG,CAAC,GAAG,MAAM;AAAA,EACrF;AACF;AAEA,eAAe,mBAAmB,OAAgD;AAChF,MAAI;AACF,WAAO,MAAM,SAAS,cAAc,IAAI,IAAI,YAAY,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC;AAAA,EACpF,SAAS,aAAa;AACpB,QAAI,CAAC,gBAAgB,WAAW,GAAG;AACjC,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI;AACF,WAAO,MAAM,SAAS,cAAc,IAAI,IAAI,eAAe,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC;AAAA,EACvF,SAAS,OAAO;AACd,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,YAAM;AAAA,IACR;AACA,QAAI;AACF,aAAO,MAAM;AAAA,QACX,cAAc,IAAI,IAAI,wBAAwB,KAAK,IAAI,YAAY,GAAG,CAAC;AAAA,MACzE;AAAA,IACF,SAAS,eAAe;AACtB,UAAI,CAAC,gBAAgB,aAAa,GAAG;AACnC,cAAM;AAAA,MACR;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,8BAA+C;AAC5D,MAAI;AACF,WAAO,MAAM,SAAS,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAAC,GAAG,MAAM;AAAA,EAC1F,SAAS,OAAO;AACd,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,YAAM;AAAA,IACR;AACA,QAAI;AACF,aAAO,MAAM;AAAA,QACX,cAAc,IAAI,IAAI,4BAA4B,YAAY,GAAG,CAAC;AAAA,QAClE;AAAA,MACF;AAAA,IACF,SAAS,eAAe;AACtB,UAAI,CAAC,gBAAgB,aAAa,GAAG;AACnC,cAAM;AAAA,MACR;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAA6B,SAAS;AAE3C;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI,MAAM,SAAS,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM;AAC3B;;;AC/SA;AAAA,EACE;AAAA,OAKK;AAEP;AAAA,EAEE;AAAA,OAGK;;;ACqBA,SAAS,4BAGS;AACvB,SAAO,IAAI,oBAAoB;AACjC;AAEA,IAAM,sBAAN,MAEA;AAAA,EACW,OAAO;AAAA,EACC,WAAW,oBAAI,IAAiC;AAAA,EAChD,SAAS,oBAAI,IAAyB;AAAA,EACtC,eAAe,oBAAI,IAAsC;AAAA,EACzD,eAAe,oBAAI,IAAqC;AAAA,EAEzE,aAAa,SAA2D;AACtE,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAC9B,OAAO,CAAC,YAAY,QAAQ,YAAY,UAAa,QAAQ,YAAY,QAAQ,OAAO,EACxF,KAAK,CAAC,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC,EAC9E,MAAM,GAAG,QAAQ,KAAK,EACtB,IAAI,cAAc;AAAA,EACvB;AAAA,EAEA,cAAc,OAAuD;AACnE,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,UAA+B;AAAA,MACnC,IAAI,MAAM;AAAA,MACV,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,MAC1D,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,MACd,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACnE,UAAU,CAAC;AAAA,MACX,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,IACT;AACA,SAAK,SAAS,IAAI,MAAM,IAAI,OAAO;AACnC,WAAO,eAAe,OAAO;AAAA,EAC/B;AAAA,EAEA,WAAW,IAAuC;AAChD,UAAM,UAAU,KAAK,SAAS,IAAI,EAAE;AACpC,WAAO,YAAY,SAAY,SAAY,mBAAmB,OAAO;AAAA,EACvE;AAAA,EAEA,KAAK,SAA4C;AAC/C,WAAO,QAAQ,QAAQ,KAAK,SAAS,IAAI,QAAQ,SAAS,GAAG,YAAY,CAAC,CAAC;AAAA,EAC7E;AAAA,EAEA,OAAO,OAAyC;AAC9C,UAAM,UAAU,KAAK,SAAS,IAAI,MAAM,QAAQ,SAAS;AACzD,QAAI,YAAY,QAAW;AACzB,cAAQ,SAAS,KAAK,GAAG,MAAM,QAAQ;AACvC,cAAQ,eAAe,QAAQ,SAAS;AACxC,cAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC7C;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAM,SAAuC;AAC3C,UAAM,UAAU,KAAK,SAAS,IAAI,QAAQ,SAAS;AACnD,QAAI,YAAY,QAAW;AACzB,cAAQ,WAAW,CAAC;AACpB,cAAQ,OAAO,CAAC;AAChB,cAAQ,eAAe;AACvB,cAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC7C;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,OAAwC;AACxD,UAAM,KAAK,yBAAyB;AAAA,MAClC,IAAI,MAAM,QAAQ;AAAA,MAClB,OAAO,YAAY,MAAM,OAAO,KAAK,MAAM;AAAA,MAC3C,YAAY,+BAA+B,MAAM,QAAQ;AAAA,MACzD,QAAQ;AAAA,MACR,OAAO,mBAAmB,MAAM,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyB,OAAmE;AAC1F,UAAM,UAAU,KAAK,SAAS,IAAI,MAAM,EAAE;AAC1C,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AACA,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,gBAAgB,QAAQ,KAAK,UAAU,CAACC,SAAQA,KAAI,UAAU,MAAM,KAAK;AAC/E,UAAM,MAAM;AAAA,MACV,GAAG;AAAA,MACH,YAAY,mBAAmB,MAAM,UAAU;AAAA,MAC/C,WAAW,kBAAkB,KAAK,MAAO,QAAQ,KAAK,aAAa,GAAG,aAAa;AAAA,MACnF,WAAW;AAAA,IACb;AACA,QAAI,kBAAkB,IAAI;AACxB,cAAQ,KAAK,KAAK,GAAG;AAAA,IACvB,OAAO;AACL,cAAQ,KAAK,aAAa,IAAI;AAAA,IAChC;AACA,YAAQ,YAAY;AACpB,WAAO,mBAAmB,OAAO;AAAA,EACnC;AAAA,EAEA,iBAAiB,OAA2D;AAC1E,UAAM,UAAU,KAAK,SAAS,IAAI,MAAM,SAAS;AACjD,UAAM,OAAO,SAAS,QAAQ,CAAC;AAC/B,UAAM,QAA+B;AAAA,MACnC,IAAI,WAAW,OAAO,WAAW;AAAA,MACjC,WAAW,MAAM;AAAA,MACjB,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,MAC1D,UAAU,KAAK;AAAA,MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACrE;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,KAAK,KAAK,KAAK;AACvB,cAAQ,YAAY,MAAM;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAA+D;AAC7E,YAAQ,KAAK,SAAS,IAAI,QAAQ,SAAS,GAAG,QAAQ,CAAC,GACpD,OAAO,CAAC,QAAQ,QAAQ,UAAU,UAAa,IAAI,WAAW,QAAQ,KAAK,EAC3E,MAAM,GAAG,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,cAAc,IAAqB;AACjC,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,UAAI,MAAM,cAAc,IAAI;AAC1B,aAAK,OAAO,OAAO,MAAM,EAAE;AAAA,MAC7B;AAAA,IACF;AACA,WAAO,KAAK,SAAS,OAAO,EAAE;AAAA,EAChC;AAAA,EAEA,WAAW,SAAuD;AAChE,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAC5B,OAAO,CAAC,UAAU,QAAQ,cAAc,UAAa,MAAM,cAAc,QAAQ,SAAS,EAC1F,OAAO,CAAC,UAAU,QAAQ,WAAW,UAAa,MAAM,WAAW,QAAQ,MAAM,EACjF,OAAO,CAAC,UAAU,QAAQ,YAAY,UAAa,aAAa,KAAK,MAAM,QAAQ,OAAO,EAC1F,KAAK,CAAC,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC,EAC9E,MAAM,GAAG,QAAQ,KAAK,EACtB,IAAI,YAAY;AAAA,EACrB;AAAA,EAEA,kBAAkB,SAA8D;AAC9E,WAAO,KAAK,WAAW,EAAE,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC/E;AAAA,EAEA,SAAS,IAAqC;AAC5C,WAAO,KAAK,OAAO,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAiC;AACzC,SAAK,OAAO,IAAI,MAAM,IAAI,KAAK;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,OAA6D;AAC7E,UAAM,OAAO,KAAK,aAAa,IAAI,MAAM,UAAU,KAAK,CAAC;AACzD,UAAM,QAAgC;AAAA,MACpC,IAAI,WAAW,OAAO,WAAW;AAAA,MACjC,YAAY,MAAM;AAAA,MAClB,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,MAC1D,UAAU,KAAK;AAAA,MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACrE;AACA,SAAK,aAAa,IAAI,MAAM,YAAY,CAAC,GAAG,MAAM,KAAK,CAAC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,SAAiE;AAChF,YAAQ,KAAK,aAAa,IAAI,QAAQ,UAAU,KAAK,CAAC,GACnD,OAAO,CAAC,QAAQ,QAAQ,UAAU,UAAa,IAAI,WAAW,QAAQ,KAAK,EAC3E,MAAM,GAAG,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,gBAAgB,OAA4D;AAC1E,UAAM,SAAkC;AAAA,MACtC,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,MACb,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC7D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,MAC1D,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACnE,WAAW,MAAM;AAAA,MACjB,GAAI,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;AAAA,MAChE,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,MAAM,WAAW;AAAA,IAC3E;AACA,SAAK,aAAa,IAAI,MAAM,OAAO,MAAM;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,SAAkE;AACjF,WAAO,CAAC,GAAG,KAAK,aAAa,OAAO,CAAC,EAClC,OAAO,CAAC,QAAQ,IAAI,eAAe,QAAQ,UAAU,EACrD,KAAK,CAAC,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC,EAC9E,MAAM,GAAG,QAAQ,KAAK;AAAA,EAC3B;AACF;AAEA,SAAS,eAAe,SAAoD;AAC1E,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,SAAS,QAAQ;AAAA,IACjB,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9D,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,cAAc,QAAQ,SAAS;AAAA,IAC/B,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,EACzE;AACF;AAEA,SAAS,mBAAmB,SAA6C;AACvE,SAAO;AAAA,IACL,GAAG,eAAe,OAAO;AAAA,IACzB,UAAU,CAAC,GAAG,QAAQ,QAAQ;AAAA,IAC9B,YAAY,mBAAmB,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,UAAU,CAAC;AAAA,EAC9E;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,IACvD,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;AAAA,IAChE,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,MAAM,WAAW;AAAA,IACzE,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACnE,kBAAkB,MAAM,aAAa;AAAA,EACvC;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,QAAM,iBAAiB,MAAM,UAAU;AACvC,SAAO,aAAa,cAAc,KAAK,OAAO,eAAe,YAAY,WACrE,eAAe,UACf;AACN;AAEA,SAAS,mBAAmB,SAA2D;AACrF,SAAO,QAAQ,IAAI,CAAC,OAAO,aAAa,EAAE,GAAG,OAAO,QAAQ,EAAE;AAChE;AAEA,SAAS,YAAY,SAA4C;AAC/D,QAAM,QAAQ,QAAQ,UAAU;AAChC,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,mBAAmB,OAA2B;AACrD,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACA,SAAO,YAAY,KAAK,IAAI,QAAQ,OAAO,KAAK;AAClD;AAEA,SAAS,+BAA+B,UAA8C;AACpF,QAAM,aAAsC,CAAC;AAC7C,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,UAAU;AAC7B;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAW,WAAW,QAAQ,SAAS;AACrC,YAAI,QAAQ,SAAS,QAAQ;AAC3B,qBAAW,KAAK;AAAA,YACd,SAAS,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,aAAa;AAChC,iBAAW,WAAW,QAAQ,SAAS;AACrC,YAAI,QAAQ,SAAS,QAAQ;AAC3B,qBAAW,KAAK;AAAA,YACd,SAAS,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAqC;AACzD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,OAAoC;AACvD,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,MAAM,WAAW;AAAA,EAChC;AACA,SAAO,aAAa,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,MAAM,WAAW;AACtE;;;AC1WA,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,SAAS,eAAe;AAqCjC,IAAI;AA2GG,SAAS,yBACd,UAAqC,CAAC,GACmD;AACzF,SAAO,IAAI,mBAAmB,QAAQ,QAAQ,UAAU;AAC1D;AAEA,IAAM,qBAAN,MAEA;AAAA,EAIE,YAA6B,MAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EAHpB,OAAO;AAAA,EACR;AAAA,EAIR,aAAa,SAA2D;AACtE,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,cAAc,QAAQ,YAAY,SAAY,KAAK;AACzD,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,WAIG,WAAW;AAAA;AAAA;AAAA;AAAA,IAIhB,EACC,IAAI;AAAA,MACH,UAAU,QAAQ,WAAW;AAAA,MAC7B,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAEH,WAAO,KAAK,IAAI,gBAAgB;AAAA,EAClC;AAAA,EAEA,cAAc,OAAuD;AACnE,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,OAAG;AAAA,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQF,EAAE,IAAI;AAAA,MACJ,KAAK,MAAM;AAAA,MACX,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM,SAAS;AAAA,MACvB,WAAW,MAAM,aAAa,SAAY,OAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,MAC9E,MAAM;AAAA,IACR,CAAC;AAED,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,MAC1D,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,MACd,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,WAAW,IAAuC;AAChD,UAAM,MAAM,KAAK,cAAc,EAAE;AAEjC,WAAO,QAAQ,SACX,SACA,UAAU,KAAK,KAAK,oBAAoB,EAAE,GAAG,KAAK,mBAAmB,EAAE,CAAC;AAAA,EAC9E;AAAA,EAEA,KAAK,SAA4C;AAC/C,UAAM,UAAU,KAAK,WAAW,QAAQ,SAAS;AACjD,WAAO,QAAQ,QAAQ,SAAS,YAAY,CAAC,CAAC;AAAA,EAChD;AAAA,EAEA,OAAO,OAAyC;AAC9C,UAAM,KAAK,KAAK,SAAS;AAEzB,QAAI;AACF,SAAG,KAAK,iBAAiB;AACzB,YAAM,MAAM,GACT;AAAA,QACC;AAAA;AAAA;AAAA,MAGF,EACC,IAAI,EAAE,KAAK,MAAM,QAAQ,UAAU,CAAC;AAEvC,UAAI,QAAQ,QAAW;AACrB,WAAG,KAAK,UAAU;AAClB,eAAO,QAAQ,QAAQ;AAAA,MACzB;AAEA,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,YAAM,YAAY,KAAK,iBAAiB,MAAM,QAAQ,SAAS;AAE/D,WAAK,eAAe,MAAM,QAAQ,WAAW,MAAM,UAAU,WAAW,SAAS;AACjF,SAAG;AAAA,QACD;AAAA;AAAA;AAAA,MAGF,EAAE,IAAI;AAAA,QACJ,KAAK,MAAM,QAAQ;AAAA,QACnB,YAAY;AAAA,MACd,CAAC;AACD,SAAG,KAAK,QAAQ;AAChB,aAAO,QAAQ,QAAQ;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,GAAG,eAAe;AACpB,WAAG,KAAK,UAAU;AAAA,MACpB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAuC;AAC3C,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,QAAI;AACF,SAAG,KAAK,iBAAiB;AACzB,SAAG;AAAA,QACD;AAAA;AAAA;AAAA,MAGF,EAAE,IAAI;AAAA,QACJ,KAAK,QAAQ;AAAA,QACb,YAAY;AAAA,MACd,CAAC;AACD,SAAG,QAAQ,kEAAkE,EAAE,IAAI;AAAA,QACjF,KAAK,QAAQ;AAAA,MACf,CAAC;AACD,SAAG,QAAQ,8DAA8D,EAAE,IAAI;AAAA,QAC7E,KAAK,QAAQ;AAAA,MACf,CAAC;AACD,SAAG,KAAK,QAAQ;AAChB,aAAO,QAAQ,QAAQ;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,GAAG,eAAe;AACpB,WAAG,KAAK,UAAU;AAAA,MACpB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAwC;AACxD,UAAM,QAAQC,aAAY,MAAM,OAAO,KAAK,MAAM;AAClD,UAAM,WAAW,KAAK,cAAc,MAAM,QAAQ,WAAW,KAAK;AAClE,UAAM,aACJ,aAAa,UACb,eAAsC,SAAS,eAAe,EAAE,WAAW,IACvEC,gCAA+B,MAAM,QAAQ,IAC7C,eAAsC,SAAS,eAAe;AACpE,UAAM,KAAK,yBAAyB;AAAA,MAClC,IAAI,MAAM,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,OAAOC,oBAAmB,MAAM,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyB,OAAmE;AAC1F,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,QAAI;AACF,SAAG,KAAK,iBAAiB;AACzB,YAAM,MAAM,KAAK,cAAc,MAAM,EAAE;AACvC,UAAI,QAAQ,QAAW;AACrB,WAAG,KAAK,UAAU;AAClB,eAAO;AAAA,MACT;AACA,YAAM,UAAU;AAAA,QACd;AAAA,QACA,KAAK,oBAAoB,MAAM,EAAE;AAAA,QACjC,KAAK,mBAAmB,MAAM,EAAE;AAAA,MAClC;AACA,YAAM,QAAQ,QAAQ,SAAS,MAAM;AAErC,SAAG;AAAA,QACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBF,EAAE,IAAI;AAAA,QACJ,QAAQ,MAAM;AAAA,QACd,YAAY,MAAM;AAAA,QAClB,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM,SAAS;AAAA,QACvB,aAAa,KAAK,UAAUC,oBAAmB,MAAM,UAAU,CAAC;AAAA,QAChE,QAAQ,MAAM,UAAU,SAAY,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,QACrE,MAAM;AAAA,MACR,CAAC;AAED,SAAG;AAAA,QACD;AAAA;AAAA;AAAA;AAAA,MAIF,EAAE,IAAI;AAAA,QACJ,KAAK,MAAM;AAAA,QACX,QAAQ,SAAS;AAAA,QACjB,YAAY;AAAA,MACd,CAAC;AACD,SAAG,KAAK,QAAQ;AAEhB,YAAM,UAAU,KAAK,WAAW,MAAM,EAAE;AACxC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,GAAG,eAAe;AACpB,WAAG,KAAK,UAAU;AAAA,MACpB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,iBAAiB,OAA2D;AAC1E,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,QAAI;AACF,SAAG,KAAK,iBAAiB;AACzB,YAAM,MAAM,KAAK,cAAc,MAAM,SAAS;AAC9C,UAAI,QAAQ,QAAW;AACrB,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AACA,YAAM,WAAW,KAAK,uBAAuB,MAAM,SAAS;AAC5D,YAAM,QAA+B;AAAA,QACnC,IAAI,WAAW,OAAO,WAAW;AAAA,QACjC,WAAW,MAAM;AAAA,QACjB,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,QAC1D;AAAA,QACA,WAAW;AAAA,QACX,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACrE;AAEA,SAAG;AAAA,QACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBF,EAAE,IAAI;AAAA,QACJ,KAAK,MAAM;AAAA,QACX,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM,SAAS;AAAA,QACvB,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM,aAAa,SAAY,OAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,MAChF,CAAC;AAED,SAAG,KAAK,QAAQ;AAChB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,GAAG,eAAe;AACpB,WAAG,KAAK,UAAU;AAAA,MACpB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAgB,SAA+D;AAC7E,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,cAAc,QAAQ,UAAU,SAAY,KAAK;AACvD,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,WAIG,WAAW;AAAA;AAAA;AAAA,IAGhB,EACC,IAAI;AAAA,MACH,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ,SAAS;AAAA,MACzB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAEH,WAAO,KAAK,IAAI,YAAY;AAAA,EAC9B;AAAA,EAEA,kBAAkB,OAA6D;AAC7E,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,QAAI;AACF,SAAG,KAAK,iBAAiB;AACzB,YAAM,WAAW,KAAK,wBAAwB,MAAM,UAAU;AAC9D,YAAM,QAAgC;AAAA,QACpC,IAAI,WAAW,OAAO,WAAW;AAAA,QACjC,YAAY,MAAM;AAAA,QAClB,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,QAC1D;AAAA,QACA,WAAW;AAAA,QACX,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACrE;AAEA,SAAG;AAAA,QACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBF,EAAE,IAAI;AAAA,QACJ,KAAK,MAAM;AAAA,QACX,aAAa,MAAM;AAAA,QACnB,QAAQ,MAAM,SAAS;AAAA,QACvB,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM,aAAa,SAAY,OAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,MAChF,CAAC;AAED,SAAG,KAAK,QAAQ;AAChB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,GAAG,eAAe;AACpB,WAAG,KAAK,UAAU;AAAA,MACpB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,iBAAiB,SAAiE;AAChF,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,cAAc,QAAQ,UAAU,SAAY,KAAK;AACvD,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,WAIG,WAAW;AAAA;AAAA;AAAA,IAGhB,EACC,IAAI;AAAA,MACH,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ,SAAS;AAAA,MACzB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAEH,WAAO,KAAK,IAAI,aAAa;AAAA,EAC/B;AAAA,EAEA,gBAAgB,OAA4D;AAC1E,UAAM,KAAK,KAAK,SAAS;AACzB,OAAG;AAAA,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiCF,EAAE,IAAI;AAAA,MACJ,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,QAAQ,KAAK,UAAU,MAAM,KAAK;AAAA,MAClC,SAAS,MAAM,WAAW,SAAY,OAAO,KAAK,UAAU,MAAM,MAAM;AAAA,MACxE,QAAQ,MAAM,UAAU,SAAY,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,MACrE,WAAW,MAAM,aAAa,SAAY,OAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,MAC9E,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM,WAAW;AAAA,MAC3B,aAAa,MAAM,cAAc;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,MACL,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,MACb,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC7D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,MAC1D,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACnE,WAAW,MAAM;AAAA,MACjB,GAAI,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;AAAA,MAChE,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,MAAM,WAAW;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,iBAAiB,SAAkE;AACjF,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,EACC,IAAI;AAAA,MACH,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAEH,WAAO,KAAK,IAAI,aAAa;AAAA,EAC/B;AAAA,EAEA,cAAc,IAAqB;AACjC,UAAM,KAAK,KAAK,SAAS;AAEzB,QAAI;AACF,SAAG,KAAK,iBAAiB;AACzB,SAAG,QAAQ,wDAAwD,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC;AACpF,SAAG,QAAQ,8DAA8D,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC;AAC1F,SAAG,QAAQ,8DAA8D,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC;AAC1F,YAAM,SAAS,GACZ,QAAQ,kDAAkD,EAC1D,IAAI,EAAE,KAAK,GAAG,CAAC;AAGlB,SAAG,KAAK,QAAQ;AAChB,aAAO,OAAO,OAAO,OAAO,IAAI;AAAA,IAClC,SAAS,OAAO;AACd,UAAI,GAAG,eAAe;AACpB,WAAG,KAAK,UAAU;AAAA,MACpB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,WAAW,SAAuD;AAChE,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,UAAoB,CAAC;AAC3B,UAAM,SAAiD;AAAA,MACrD,QAAQ,QAAQ;AAAA,IAClB;AAEA,QAAI,QAAQ,YAAY,QAAW;AACjC,cAAQ;AAAA,QACN;AAAA,MACF;AACA,aAAO,WAAW,QAAQ;AAAA,IAC5B;AACA,QAAI,QAAQ,cAAc,QAAW;AACnC,cAAQ,KAAK,2BAA2B;AACxC,aAAO,aAAa,QAAQ;AAAA,IAC9B;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,cAAQ,KAAK,oBAAoB;AACjC,aAAO,UAAU,QAAQ;AAAA,IAC3B;AAEA,UAAM,cAAc,QAAQ,WAAW,IAAI,KAAK,SAAS,QAAQ,KAAK,OAAO,CAAC;AAC9E,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA,WAKG,WAAW;AAAA;AAAA;AAAA,IAGhB,EACC,IAAI,MAAM;AAEb,WAAO,KAAK,IAAI,cAAc;AAAA,EAChC;AAAA,EAEA,kBAAkB,SAA8D;AAC9E,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,EACC,IAAI;AAAA,MACH,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAEH,WAAO,KAAK,IAAI,cAAc;AAAA,EAChC;AAAA,EAEA,SAAS,IAAqC;AAC5C,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,MAAM,GACT;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,IAIF,EACC,IAAI,EAAE,KAAK,GAAG,CAAC;AAElB,WAAO,QAAQ,SAAY,SAAY,QAAQ,GAAG;AAAA,EACpD;AAAA,EAEA,UAAU,OAAiC;AACzC,UAAM,KAAK,KAAK,SAAS;AACzB,OAAG;AAAA,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6CF,EAAE,IAAI;AAAA,MACJ,KAAK,MAAM;AAAA,MACX,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM,QAAQ;AAAA,MACrB,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM,UAAU,SAAY,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,MACrE,QAAQ,MAAM,UAAU,SAAY,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,MACrE,SAAS,MAAM,UAAU;AAAA,MACzB,QAAQ,MAAM,UAAU,SAAY,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,MACrE,QAAQ,MAAM,UAAU,SAAY,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,MACrE,WAAW,MAAM,aAAa,SAAY,OAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,MAC9E,eAAe,KAAK,UAAU,MAAM,YAAY;AAAA,MAChD,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM,WAAW;AAAA,MAC3B,aAAa,MAAM,cAAc;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,WAA6B;AACnC,QAAI,KAAK,OAAO,QAAW;AACzB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,SAAS,YAAY;AAC5B,gBAAU,QAAQ,QAAQ,KAAK,IAAI,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5D;AAEA,UAAM,KAAK,KAAK,iBAAiB,GAAG,KAAK,MAAM;AAAA,MAC7C,6BAA6B;AAAA,MAC7B,SAAS;AAAA,IACX,CAAC;AACD,OAAG,KAAK;AAAA;AAAA;AAAA,KAGP;AACD,oCAAgC,EAAE;AAClC,OAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA6GP;AAED,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,IAAoC;AACxD,WAAO,KAAK,SAAS,EAClB;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,EACpB;AAAA,EAEQ,cAAc,WAAmB,OAA0C;AACjF,WAAO,KAAK,SAAS,EAClB;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI,EAAE,YAAY,WAAW,QAAQ,MAAM,CAAC;AAAA,EACjD;AAAA,EAEQ,mBAAmB,WAAoC;AAC7D,WAAO,KAAK,SAAS,EAClB;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,IAIF,EACC,IAAI,EAAE,YAAY,UAAU,CAAC;AAAA,EAClC;AAAA,EAEQ,uBAAuB,WAA2B;AACxD,UAAM,MAAM,KAAK,SAAS,EACvB;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI,EAAE,YAAY,UAAU,CAAC;AAChC,WAAO,IAAI;AAAA,EACb;AAAA,EAEQ,wBAAwB,YAA4B;AAC1D,UAAM,MAAM,KAAK,SAAS,EACvB;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI,EAAE,aAAa,WAAW,CAAC;AAClC,WAAO,IAAI;AAAA,EACb;AAAA,EAEQ,oBAAoB,WAA8B;AACxD,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,cAAc,GACjB;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,IAIF,EACC,IAAI,EAAE,YAAY,UAAU,CAAC;AAEhC,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAAW,GACd;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,IAIF,EACC,IAAI,EAAE,YAAY,UAAU,CAAC;AAChC,UAAM,iBAAiB,oBAAI,IAA8B;AACzD,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,eAAe,IAAI,QAAQ,aAAa,KAAK,CAAC;AAC5D,YAAM,KAAK,OAAO;AAClB,qBAAe,IAAI,QAAQ,eAAe,KAAK;AAAA,IACjD;AAEA,WAAO,YAAY;AAAA,MAAI,CAAC,QACtB,gBAAgB,KAAK,eAAe,IAAI,IAAI,aAAa,KAAK,CAAC,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,iBAAiB,WAA2B;AAClD,UAAM,MAAM,KAAK,SAAS,EACvB;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI,EAAE,YAAY,UAAU,CAAC;AAChC,WAAO,IAAI;AAAA,EACb;AAAA,EAEQ,eACN,WACA,UACA,YACA,WACM;AACN,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,gBAAgB,GAAG;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOF;AACA,UAAM,aAAa,GAAG;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOF;AAEA,aAAS,QAAQ,CAAC,SAAS,kBAAkB;AAC3C,YAAM,eAAe,aAAa;AAClC,oBAAc,IAAI;AAAA,QAChB,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,YAAY,QAAQ,SAAS,cAAe,QAAQ,MAAM,OAAQ;AAAA,QAClE,YAAY;AAAA,MACd,CAAC;AAED,mBAAa,OAAO,EAAE,QAAQ,CAAC,MAAM,cAAc;AACjD,mBAAW,IAAI;AAAA,UACb,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,OAAO,KAAK;AAAA,UACZ,WAAW,KAAK,UAAU,KAAK,KAAK;AAAA,QACtC,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,SAAS,UACP,KACA,UACA,UAA2B,CAAC,GACb;AACf,QAAM,UAAU,iBAAiB,EAAE,GAAG,KAAK,eAAe,SAAS,OAAO,CAAC;AAC3E,QAAM,gBAAgB,QAAQ;AAAA,IAAQ,CAAC,WACrC,eAAsC,OAAO,eAAe;AAAA,EAC9D;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,YAAYA,oBAAmB,aAAa;AAAA,EAC9C;AACF;AAEA,SAAS,iBAAiB,KAA8C;AACtE,QAAM,WAAW,eAA2B,IAAI,aAAa;AAC7D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,SAAS,IAAI;AAAA,IACb,GAAI,IAAI,UAAU,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM;AAAA,IACjD,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,cAAc,IAAI;AAAA,IAClB,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,EAC/C;AACF;AAEA,SAAS,aAAa,KAA2C;AAC/D,QAAM,WAAW,eAA2B,IAAI,aAAa;AAC7D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAW,IAAI;AAAA,IACf,GAAI,IAAI,WAAW,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,OAAO;AAAA,IACnD,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,IACf,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,EAC/C;AACF;AAEA,SAAS,cAAc,KAA6C;AAClE,QAAM,WAAW,eAA2B,IAAI,aAAa;AAC7D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,YAAY,IAAI;AAAA,IAChB,GAAI,IAAI,WAAW,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,OAAO;AAAA,IACnD,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,IACf,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,EAC/C;AACF;AAEA,SAAS,cAAc,KAA8C;AACnE,QAAM,SAAS,eAA0B,IAAI,WAAW;AACxD,QAAM,QAAQ,eAA0B,IAAI,UAAU;AACtD,QAAM,WAAW,eAA2B,IAAI,aAAa;AAC7D,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,IAChB,QAAQ,IAAI;AAAA,IACZ,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IAChC,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,IACzC,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,WAAW,IAAI;AAAA,IACf,GAAI,IAAI,aAAa,OAAO,CAAC,IAAI,EAAE,SAAS,IAAI,SAAS;AAAA,IACzD,GAAI,IAAI,gBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,IAAI,YAAY;AAAA,EACpE;AACF;AAEA,SAAS,aAAa,SAAuC;AAC3D,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO,CAAC,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAAA,EAC1E;AAEA,SAAO,QAAQ,QAAQ,IAAI,CAAC,aAAa;AAAA,IACvC,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,EACT,EAAE;AACJ;AAEA,SAAS,gBAAgB,KAAiB,UAAqC;AAC7E,QAAM,QAAQ,SAAS,IAAI,CAAC,YAAY,KAAK,MAAM,QAAQ,SAAS,CAAY;AAEhF,MAAI,IAAI,SAAS,UAAU;AACzB,WAAO,EAAE,MAAM,UAAU,SAAS,uBAAuB,KAAK,EAAE;AAAA,EAClE;AACA,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,IAAI,SAAS,aAAa;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,GAAI,IAAI,eAAe,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,WAAW;AAAA,MACxD,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,oCAAoC,IAAI,IAAI,EAAE;AAChE;AAEA,SAAS,uBAAuB,OAA0B;AACxD,QAAM,QAAQ,MAAM,CAAC;AACrB,MACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,UACf,UAAU,SACV,OAAO,MAAM,SAAS,UACtB;AACA,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,gCAAgC,IAA4B;AACnE,QAAM,UAAU,GAAG,QAAQ,4CAA4C,EAAE,IAAI;AAC7E,MAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,eAAe,GAAG;AAC7D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAA4C;AACnD,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,KAAC,EAAE,aAAa,IAAI,cAAc,YAAY,GAAG;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,KAA4B;AAC3C,QAAM,QAAQ,eAAqC,IAAI,UAAU;AACjE,QAAM,QAAQ,eAAqC,IAAI,UAAU;AACjE,SAAO;AAAA,IACL,GAAG,eAAe,GAAG;AAAA,IACrB,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,cAAc,eAAoD,IAAI,iBAAiB;AAAA,EACzF;AACF;AAEA,SAAS,eAAe,KAAmC;AACzD,QAAM,eAAe,eAAoD,IAAI,iBAAiB;AAC9F,QAAM,QAAQ,eAA4C,IAAI,UAAU;AACxE,QAAM,QAAQ,eAA4C,IAAI,UAAU;AACxE,QAAM,WAAW,eAA2B,IAAI,aAAa;AAC7D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAW,IAAI;AAAA,IACf,GAAI,IAAI,SAAS,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK;AAAA,IAC9C,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,IACf,GAAI,IAAI,aAAa,OAAO,CAAC,IAAI,EAAE,SAAS,IAAI,SAAS;AAAA,IACzD,GAAI,IAAI,gBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,IAAI,YAAY;AAAA,IAClE,GAAI,IAAI,WAAW,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,OAAO;AAAA,IACpD,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,kBAAkB,aAAa;AAAA,EACjC;AACF;AAEA,SAAS,eAAkB,OAAoB;AAC7C,QAAM,SAAkB,KAAK,MAAM,KAAK;AACxC,SAAO,MAAM,QAAQ,MAAM,IAAK,SAAiB,CAAC;AACpD;AAEA,SAAS,eAAkB,OAAqC;AAC9D,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,SAASA,oBAAmB,SAA2D;AACrF,SAAO,QAAQ,IAAI,CAAC,OAAO,aAAa,EAAE,GAAG,OAAO,QAAQ,EAAE;AAChE;AAEA,SAASH,aAAY,SAA4C;AAC/D,QAAM,QAAQ,QAAQ,UAAU;AAChC,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAASE,oBAAmB,OAA2B;AACrD,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACA,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAASD,gCAA+B,UAA8C;AACpF,QAAM,aAAsC,CAAC;AAC7C,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,UAAU;AAC7B;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAW,WAAW,QAAQ,SAAS;AACrC,YAAI,QAAQ,SAAS,QAAQ;AAC3B,qBAAW,KAAK;AAAA,YACd,SAAS,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAW,WAAW,QAAQ,SAAS;AACrC,mBAAW,KAAK;AAAA,UACd,SAAS,WAAW;AAAA,UACpB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ,QAAQ,UAAU,QAAQ;AAAA,UAClC,QAAQ,QAAQ,QACb;AAAA,YAAI,CAAC,SACJ,UAAU,OAAO,KAAK,OAAO,UAAU,KAAK,aAAa,WAAW;AAAA,UACtE,EACC,KAAK,IAAI;AAAA,UACZ,kBAAkB,QAAQ;AAAA,QAC5B,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,eAAW,WAAW,QAAQ,SAAS;AACrC,UAAI,QAAQ,SAAS,QAAQ;AAC3B,sCAA8B,YAAY,QAAQ,IAAI;AAAA,MACxD,WAAW,QAAQ,SAAS,aAAa;AACvC,mBAAW,KAAK;AAAA,UACd,SAAS,WAAW;AAAA,UACpB,MAAM;AAAA,UACN,GAAI,QAAQ,OAAO,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,GAAG;AAAA,UAC9D,MAAM,QAAQ;AAAA,QAChB,CAAC;AAAA,MACH,WAAW,QAAQ,SAAS,aAAa;AACvC,mBAAW,KAAK;AAAA,UACd,SAAS,WAAW;AAAA,UACpB,MAAM;AAAA,UACN,UAAU,QAAQ,SAAS;AAAA,UAC3B,QAAQ,QAAQ,UAAU,QAAQ;AAAA,UAClC,MAAM,WAAW,QAAQ,SAAS,SAAS;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,YAAqC,MAAoB;AAC9F,QAAM,OAAO,WAAW,GAAG,EAAE;AAC7B,MAAI,MAAM,SAAS,aAAa,KAAK,SAAS,aAAa;AACzD,SAAK,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI;AAC/B;AAAA,EACF;AACA,aAAW,KAAK;AAAA,IACd,SAAS,WAAW;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAW,OAAwB;AAC1C,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;;;ACh4CO,SAASG,aAAY,OAA2B;AACrD,SAAO,oBAAoB,OAAO,oBAAI,QAAgB,CAAC;AACzD;AAEA,SAAS,oBAAoB,OAAgB,MAAkC;AAC7E,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AACd,QAAI;AACF,aAAO,MAAM,IAAI,CAAC,SAAS,oBAAoB,MAAM,IAAI,CAAC;AAAA,IAC5D,UAAE;AACA,WAAK,OAAO,KAAK;AAAA,IACnB;AAAA,EACF;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AACd,QAAI;AACF,aAAO,0BAA0B,OAAkC,IAAI;AAAA,IACzE,UAAE;AACA,WAAK,OAAO,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,SAASC,mBAAkB,QAA6C;AAC7E,SAAO,0BAA0B,QAAQ,oBAAI,QAAgB,CAAC;AAChE;AAEA,SAAS,0BACP,QACA,MACY;AACZ,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE;AAAA,IAAQ,CAAC,CAAC,KAAK,KAAK,MACzD,UAAU,SAAY,CAAC,IAAI,CAAC,CAAC,KAAK,oBAAoB,OAAO,IAAI,CAAC,CAAC;AAAA,EACrE;AACA,SAAO,OAAO,YAAY,OAAO;AACnC;AAEO,SAAS,iBAAiB,OAA2B;AAC1D,MAAI,iBAAiB,OAAO;AAC1B,WAAOA,mBAAkB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAOD,aAAY,KAAK;AAC1B;;;AClEA,SAAuB,eAAe;AAQtC,IAAM,wBAAwB,uBAAO,IAAI,yBAAyB;AAE3D,SAAS,eAAe,OAAqC;AAClE,SAAO;AAAA,IACL,GAAG,MAAM,MAAM,QAAQ,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,SAAkB,EAAE;AAAA,IACnF,GAAG,MAAM,MAAM,aAAa,QAAQ,CAAC,iBAAiB;AACpD,YAAM,eAAgB,aAAa,MAAgC;AACnE,UAAI,EAAE,wBAAwB,UAAU;AACtC,eAAO,CAAC;AAAA,MACV;AACA,aAAO,aAAa,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,UAAmB,EAAE;AAAA,IACnF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,iBAAiB,MAAgD;AAC/E,QAAM,WAAW,KAAK;AACtB,MAAI,aAAa,UAAa,OAAO,aAAa,YAAY,aAAa,MAAM;AAC/E,WAAO,EAAE,UAAU,MAAM;AAAA,EAC3B;AAEA,QAAM,SAAS;AAIf,SAAO;AAAA,IACL,UAAU;AAAA,IACV,GAAI,OAAO,OAAO,WAAW,WAAW,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,OAAO,kBAAkB,WAAW,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;AAAA,EAC5F;AACF;AAEO,SAAS,cAAc,MAAmC;AAC/D,QAAM,WAAY,KAA+C,qBAAqB;AACtF,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,WAAO;AAAA,EACT;AACA,QAAM,aAAc,SAAsC;AAC1D,SAAO,OAAO,eAAe,YAAY,WAAW,SAAS,IAAI,aAAa;AAChF;AAEO,SAAS,iBAAiB,OAA6B;AAC5D,SAAO,eAAe,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM,cAAc,IAAI,MAAM,MAAS;AACnF;;;ACHO,SAAS,cAAc,SAA+C;AAC3E,QAAM,eAAe,mBAAmB;AACxC,QAAM,WAAW,oBAAoB,SAAS,YAAY;AAC1D,QAAM,SAAS,kBAAkB,SAAS,UAAU,YAAY;AAChE,QAAM,eAAe,wBAAwB,SAAS,UAAU,YAAY;AAC5E,QAAM,eAAe,wBAAwB,SAAS,UAAU,cAAc,YAAY;AAC1F,SAAO;AAAA,IACL,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,IACzC,GAAI,iBAAiB,SAAY,CAAC,IAAI,EAAE,aAAa;AAAA,IACrD,GAAI,iBAAiB,SAAY,CAAC,IAAI,EAAE,aAAa;AAAA,EACvD;AACF;AAEA,SAAS,qBAGgB;AACvB,QAAM,aAAa,QAAQ,IAAI,mBAAmB,QAAQ,IAAI;AAC9D,SAAO,eAAe,SAClB,0BAA0B,IAC1B,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACnD;AAEA,SAAS,oBACP,SACA,cACgC;AAChC,MAAI,QAAQ,QAAQ,aAAa,OAAO;AACtC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ,aAAa,QAAW;AAC1C,WAAO,QAAQ,OAAO;AAAA,EACxB;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,SACA,cACA,cAC8B;AAC9B,MAAI,QAAQ,QAAQ,WAAW,QAAW;AACxC,WAAO,QAAQ,OAAO;AAAA,EACxB;AACA,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,aAAa,YAAY,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBACP,SACA,cACA,cACoC;AACpC,MAAI,QAAQ,QAAQ,iBAAiB,OAAO;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ,iBAAiB,QAAW;AAC9C,WAAO,QAAQ,OAAO;AAAA,EACxB;AACA,MAAI,iBAAiB,UAAa,mBAAmB,YAAY,GAAG;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBACP,SACA,cACA,kBACA,cACoC;AACpC,MAAI,QAAQ,QAAQ,iBAAiB,OAAO;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ,iBAAiB,QAAW;AAC9C,WAAO,QAAQ,OAAO;AAAA,EACxB;AACA,MAAI,iBAAiB,UAAa,mBAAmB,YAAY,GAAG;AAClE,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,UAAa,mBAAmB,gBAAgB,GAAG;AAC1E,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAA2E;AAC/F,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,sBAAsB,cACvC,OAAO,UAAU,aAAa,cAC9B,OAAO,UAAU,cAAc;AAEnC;AAEA,SAAS,mBACP,OACsD;AACtD,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,sBAAsB,cACvC,OAAO,UAAU,qBAAqB;AAE1C;AAEA,SAAS,mBAAmB,OAAyD;AACnF,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,oBAAoB,cACrC,OAAO,UAAU,qBAAqB;AAE1C;AAEO,SAAS,wBAAwB,QAA4C;AAClF,SAAO;AAAA,IACL,GAAI,OAAO,aAAa,SAAa,CAAC,UAAU,IAAc,CAAC;AAAA,IAC/D,GAAI,OAAO,WAAW,SAAa,CAAC,QAAQ,IAAc,CAAC;AAAA,EAC7D;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,QAAM,MAAM,oBAAI,IAAY;AAC5B,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,KAAK,MAAM,GAAG,KAAK;AACzB,QAAI,GAAG,WAAW,GAAG;AACnB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,QAAI,IAAI,IAAI,EAAE,GAAG;AACf,YAAM,IAAI,MAAM,8BAA8B,EAAE,EAAE;AAAA,IACpD;AACA,QAAI,IAAI,EAAE;AACV,WAAO,EAAE,GAAG,OAAO,GAAG;AAAA,EACxB,CAAC;AACH;AAEO,SAAS,mBAAmB,WAA+C;AAChF,QAAM,MAAM,oBAAI,IAAY;AAC5B,SAAO,UAAU,IAAI,CAAC,aAAa;AACjC,UAAM,KAAK,SAAS,GAAG,KAAK;AAC5B,QAAI,GAAG,WAAW,GAAG;AACnB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,IAAI,IAAI,EAAE,GAAG;AACf,YAAM,IAAI,MAAM,iCAAiC,EAAE,EAAE;AAAA,IACvD;AACA,QAAI,IAAI,EAAE;AACV,WAAO,EAAE,GAAG,UAAU,GAAG;AAAA,EAC3B,CAAC;AACH;AAEO,SAAS,YACd,SACA,QACA,WACA,QACc;AACd,SAAO;AAAA,IACL,IAAI,SAAS,OAAO;AAAA,IACpB,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC3D,GAAI,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAAA,IAChF,GAAI,QAAQ,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,IACpE,QAAQ,OAAO,IAAI,WAAW;AAAA,IAC9B,WAAW,UAAU,IAAI,cAAc;AAAA,IACvC,OAAO,QAAQ,MAAM,IAAI,UAAU;AAAA,IACnC,MAAM;AAAA,MACJ,cAAc,OAAO,YAAY,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9F;AAAA,IACA,cAAc,iBAAiB,SAAS,QAAQ,WAAW,MAAM;AAAA,IACjE,yBAAyB,wBAAwB,MAAM;AAAA,EACzD;AACF;AAEO,SAAS,SAAS,SAAuC;AAC9D,SAAO,QAAQ,MAAM;AACvB;AAEO,SAAS,YAAY,OAAuC;AACjE,QAAM,OAAO,MAAM,QAAQ,MAAM,MAAM;AACvC,QAAM,cAAc,MAAM,eAAe,MAAM,MAAM;AACrD,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY;AAAA,IACnD,cAAc,MAAM,gBAAgB,CAAC;AAAA,IACrC,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,EACrE;AACF;AAEO,SAAS,oBAAoB,OAA+C;AACjF,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,OAAO,MAAM,QAAQ,MAAM,MAAM;AACvC,QAAM,cAAc,MAAM,eAAe,MAAM,MAAM;AACrD,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY;AAAA,IACnD,OAAOE,aAAY,MAAM,MAAM,KAAK;AAAA,IACpC,WAAW,MAAM;AAAA,IACjB,iBAAiB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,EAAE;AAAA,IAClE,kBAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,SAAS,EAAE;AAAA,IACpE,mBAAmB,MAAM,OAAO,CAAC,SAAS,KAAK,KAAK,aAAa,MAAS,EAAE;AAAA,IAC5E,cAAc,MAAM,OAAO,CAAC,SAAS,cAAc,KAAK,IAAI,MAAM,MAAS,EAAE;AAAA,IAC7E,oBAAoB,MAAM,MAAM,cAAc;AAAA,IAC9C,qBAAqB,MAAM,MAAM,gBAAgB;AAAA,IACjD,eAAe,MAAM,MAAM,UAAU;AAAA,IACrC,WAAW,MAAM,MAAM,WAAW;AAAA,IAClC,SAAS,MAAM,MAAM,SAAS;AAAA,IAC9B,iBAAiB,MAAM,MAAM,iBAAiB;AAAA,IAC9C,GAAI,MAAM,MAAM,oBAAoB,SAChC,CAAC,IACD,EAAE,iBAAiB,MAAM,MAAM,gBAAgB;AAAA,IACnD,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,EACrE;AACF;AAEO,SAAS,eAAe,UAAgD;AAC7E,QAAM,QAAQ,SAAS,SAAS,MAAM;AACtC,QAAM,aAAa,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW,KAAK,SAAS,QAAQ;AAC/F,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,GAAI,SAAS,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK;AAAA,IAC7D,GAAI,SAAS,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,SAAS,YAAY;AAAA,IAClF,GAAI,SAAS,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,SAAS,SAAS;AAAA,IACzE,YAAY,WAAW;AAAA,IACvB,WAAW,MAAM,MAAM;AAAA,IACvB,mBAAmB,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU;AAAA,IACtE,YAAY,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EAAE;AAAA,IAChE,gBAAgB,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW,EAAE;AAAA,EAC1E;AACF;AAEO,SAAS,iBACd,UACA,QACA,WACA,QAC2D;AAC3D,QAAM,eAA0E;AAAA,IAC9E,QAAQ,EAAE,SAAS,KAAK;AAAA,IACxB,eAAe,EAAE,SAAS,KAAK;AAAA,IAC/B,QAAQ,EAAE,SAAS,KAAK;AAAA,EAC1B;AAEA,MAAI,OAAO,aAAa,QAAW;AACjC,iBAAa,WAAW,EAAE,SAAS,KAAK;AACxC,iBAAa,SAAS,EAAE,SAAS,KAAK;AAAA,EACxC;AACA,MAAI,OAAO,WAAW,QAAW;AAC/B,iBAAa,SAAS,EAAE,SAAS,KAAK;AAAA,EACxC;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,iBAAa,YAAY,EAAE,SAAS,KAAK;AAAA,EAC3C;AACA,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,iBAAa,QAAQ,EAAE,SAAS,KAAK;AAAA,EACvC;AACA,MACE,OAAO;AAAA,IACL,CAAC,UAAU,MAAM,MAAM,QAAQ,OAAO,EAAE,SAAS,KAAK,MAAM,MAAM,aAAa,SAAS;AAAA,EAC1F,GACA;AACA,iBAAa,QAAQ,EAAE,SAAS,KAAK;AAAA,EACvC;AACA,MAAI,OAAO,KAAK,gBAAgB,GAAG;AACjC,iBAAa,OAAO,EAAE,SAAS,KAAK;AAAA,EACtC;AAEA,MACE,OAAO;AAAA,IACL,CAAC,UACC,MAAM,MAAM,SAAS,UACrB,MAAM,MAAM,QAAQ,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,QAAQ;AAAA,EAC7D,GACA;AACA,iBAAa,YAAY,EAAE,SAAS,KAAK;AAAA,EAC3C;AACA,MACE,OAAO;AAAA,IACL,CAAC,UACC,MAAM,MAAM,cAAc,SAAS,KACnC,MAAM,MAAM,gBAAgB,SAAS,KACrC,MAAM,MAAM,aAAa,SAAS;AAAA,EACtC,GACA;AACA,iBAAa,YAAY,EAAE,SAAS,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAA+C;AACxE,SAAO;AAAA,IACL,IAAI,MAAM,MAAM,MAAM;AAAA,IACtB,MAAM,MAAM;AAAA,IACZ,GAAI,MAAM,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;AAAA,IAC5E,WAAW,MAAM,MAAM;AAAA,IACvB,aAAa,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,IACtD,GAAI,MAAM,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;AAAA,IAC5E,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,EACrE;AACF;AAEO,SAAS,oBAAoB,OAA+C;AACjF,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,YAAY,UAAa,QAAQ,WAAW,IAAI,SAAY;AACrE;AAEO,SAAS,WAAW,OAA+C;AACxE,MAAI,UAAU,UAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,OAAO,GAAG;AAC5B;AAEO,SAAS,iBAAiB,OAAkE;AACjG,QAAM,SAAS,oBAAoB,KAAK;AACxC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,SAAO,WAAW,aAAa,WAAW,aAAa,WAAW,UAAU,SAAS;AACvF;AAEO,SAAS,eAAe,OAA2C;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,KAAK;AACrD;AAEO,SAAS,UAAU,OAAkC;AAC1D,MAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAAU;AACtD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO,OAAO,MAAM,YAAY;AAAA,EAClC;AACA,MAAI,MAAM,SAAS,UAAU,MAAM,SAAS,eAAe,MAAM,SAAS,QAAQ;AAChF,WAAO,MAAM,QAAQ,MAAM,OAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAASC,cAAa,OAAqC;AAChE,SAAO,SAAS,KAAK,KAAK,OAAO,OAAO,KAAK,EAAE,MAAMC,YAAW;AAClE;AAEO,SAASA,aAAY,OAAoC;AAC9D,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,MAAMA,YAAW;AAAA,EAChC;AACA,SAAOD,cAAa,KAAK;AAC3B;AAEO,SAAS,oBAAoB,OAA4C;AAC9E,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,SACE,eAAe,MAAM,IAAI,KACzB,eAAe,MAAM,MAAM,KAC3B,eAAe,MAAM,SAAS,KAC9B,eAAe,MAAM,OAAO,KAC5B,eAAe,MAAM,OAAO,KAC5B,gBAAgB,MAAM,mBAAmB,KACzC,oBAAoB,MAAM,IAAI,KAC9B,eAAe,MAAM,QAAQ;AAEjC;AAEA,SAAS,eAAe,OAAyB;AAC/C,SAAO,UAAU,UAAa,OAAO,UAAU;AACjD;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,UAAU,UAAa,OAAO,UAAU;AACjD;AAEA,SAAS,oBAAoB,OAAyB;AACpD,SACE,UAAU,UAAc,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ;AAElG;AAEA,SAAS,eAAe,OAAyB;AAC/C,SAAO,UAAU,UAAa,SAAS,KAAK;AAC9C;AAEO,SAAS,qBAAqB,OAAiC;AACpE,SAAO,OAAO,UAAU,KAAK,KAAK,OAAO,UAAU,YAAY,SAAS;AAC1E;AAEO,SAAS,kBAAkB,OAAiC;AACjE,SAAO,OAAO,UAAU,KAAK,KAAK,OAAO,UAAU,YAAY,QAAQ;AACzE;AAEO,SAAS,sBAAsB,GAAY,YAAwC;AACxF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,UAAU;AAAA,IACzB,EAAE,WAAW;AAAA,EACf;AACF;AAEO,SAAS,cACd,GACA,QACA,MACA,SACA,SACU;AACV,QAAM,OAA4B;AAAA,IAChC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY,QAAW;AACzB,SAAK,MAAM,UAAU;AAAA,EACvB;AACA,SAAO,EAAE,KAAK,MAAM,MAAM;AAC5B;AAEO,SAASE,gBAAe,OAA2B;AACxD,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC5D;AAAA,EACF;AAEA,SAAOD,aAAY,KAAK,IAAI,QAAQ,OAAO,KAAK;AAClD;;;AL7aO,SAAS,uBAAuB,KAAW,WAAkC;AAClF,MAAI,IAAI,cAAc,CAAC,MAAM;AAC3B,UAAM,SAAS,oBAAoB,EAAE,IAAI,MAAM,QAAQ,CAAC;AACxD,QAAI,WAAW,OAAO;AACpB,aAAO,cAAc,GAAG,KAAK,eAAe,oCAAoC;AAAA,IAClF;AAEA,UAAM,UAA+B,CAAC;AACtC,UAAM,QAAQ,oBAAoB,EAAE,IAAI,MAAM,OAAO,CAAC;AACtD,UAAM,UAAU,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;AAC1D,UAAM,YAAY,oBAAoB,EAAE,IAAI,MAAM,WAAW,CAAC;AAC9D,QAAI,WAAW,QAAW;AACxB,cAAQ,SAAS;AAAA,IACnB;AACA,QAAI,UAAU,QAAW;AACvB,cAAQ,QAAQ;AAAA,IAClB;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,UAAU;AAAA,IACpB;AACA,QAAI,cAAc,QAAW;AAC3B,cAAQ,YAAY;AAAA,IACtB;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ,WAAW,UAAU,KAAK,OAAO;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,mCAAmC,OAAO,MAAM;AACvD,UAAM,OAAO,MAAM,6BAA6B,CAAC;AACjD,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,SAAS,UAAU,OAAO,EAAE,IAAI,MAAM,YAAY,GAAG,IAAI;AAC/D,QAAI,WAAW,WAAW;AACxB,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AACA,QAAI,WAAW,YAAY;AACzB,aAAO,cAAc,GAAG,KAAK,YAAY,8BAA8B;AAAA,IACzE;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,oBACP,OAC4C;AAC5C,QAAM,SAAS,oBAAoB,KAAK;AACxC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,SAAO,WAAW,aAAa,WAAW,aAAa,SAAS;AAClE;AAEA,eAAe,6BACb,GAC2D;AAC3D,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AACA,MAAI,OAAO,KAAK,aAAa,WAAW;AACtC,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,4BAA4B,EAAE;AAAA,EACrF;AACA,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,UAAU;AACvD,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,yBAAyB,EAAE;AAAA,EAClF;AAEA,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,GAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,KAAK,EAAE,SAAS,IAC/D,EAAE,QAAQ,KAAK,OAAO,KAAK,EAAE,IAC7B,CAAC;AAAA,EACP;AACF;AAEO,SAAS,wBAAyC;AACvD,QAAM,YAAY,oBAAI,IAAkD;AAExE,SAAO;AAAA,IACL;AAAA,IACA,WAAW,SAAS;AAClB,YAAM,wBAAqE,OACzE,EAAE,UAAU,YAAY,gBAAgB,MAAM,MAAM,QAAQ,GAC5D,YACG;AACH,cAAM,WAAW,MAAM,gBAAgB,WAAW,SAAS;AAAA,UACzD;AAAA,UACA,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,UACjD;AAAA,UACA;AAAA,UACA,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,UACjE,GAAI,QAAQ,kBAAkB,SAAY,CAAC,IAAI,EAAE,eAAe,QAAQ,cAAc;AAAA,QACxF,CAAC;AAED,eAAO,SAAS,WACZ,QAAQ,IAAI,IACZ,QAAQ,KAAK,SAAS,UAAU,QAAQ,iBAAiB,2BAA2B;AAAA,MAC1F;AACA,aAAO;AAAA,QACL,GAAG,WAAW;AAAA,UACZ,MAAM,WAAW,EAAE,UAAU,YAAY,gBAAgB,MAAM,MAAM,QAAQ,GAAG;AAC9E,kBAAM,iBAAiB,QAAQ,QAAQ,QAAQ;AAC/C,gBAAI,gBAAgB,aAAa,QAAW;AAC1C,qBAAO,QAAQ,IAAI;AAAA,YACrB;AACA,kBAAM,WAAW,eAAe;AAEhC,kBAAM,gBAAgB,cAAc,IAAI;AACxC,kBAAM,aAAa,eAAe,oBAAoB,aAAa,KAAK;AACxE,kBAAM,kBAAkB;AAAA,cACtB;AAAA,cACA,MAAM;AAAA,cACN,SAAS;AAAA,cACT,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,cACjD;AAAA,cACA,KAAK;AAAA,gBACH,SAAS,QAAQ;AAAA,gBACjB,OAAO,QAAQ;AAAA,gBACf,GAAI,QAAQ,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,gBAC1E,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,cACzE;AAAA,YACF;AAEA,kBAAM,WAAW,MAAM,SAAS,KAAK,eAAe;AACpD,gBAAI,CAAC,UAAU;AACb,qBAAO,QAAQ,IAAI;AAAA,YACrB;AAEA,kBAAM,SAAS,MAAM,oBAAoB,SAAS,QAAQ,eAAe;AACzE,kBAAM,gBAAgB,MAAM;AAAA,cAC1B,SAAS;AAAA,cACT;AAAA,YACF;AACA,kBAAM,WAAW,MAAM,gBAAgB,WAAW,SAAS;AAAA,cACzD;AAAA,cACA,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,cACjD;AAAA,cACA;AAAA,cACA,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,cACzC,GAAI,kBAAkB,SAAY,CAAC,IAAI,EAAE,cAAc;AAAA,YACzD,CAAC;AAED,mBAAO,SAAS,WACZ,QAAQ,IAAI,IACZ,QAAQ,KAAK,SAAS,UAAU,iBAAiB,2BAA2B;AAAA,UAClF;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,aAAO,CAAC,GAAG,UAAU,OAAO,CAAC,EAC1B,OAAO,CAAC,aAAa;AACpB,YAAI,QAAQ,WAAW,aAAa,SAAS,WAAW,WAAW;AACjE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,WAAW,cAAc,SAAS,WAAW,WAAW;AAClE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,UAAU,UAAa,SAAS,UAAU,QAAQ,OAAO;AACnE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,YAAY,UAAa,SAAS,YAAY,QAAQ,SAAS;AACzE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,cAAc,UAAa,SAAS,cAAc,QAAQ,WAAW;AAC/E,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC,EACA,IAAI,cAAc;AAAA,IACvB;AAAA,IACA,OAAO,IAAI,UAAU;AACnB,YAAM,WAAW,UAAU,IAAI,EAAE;AACjC,UAAI,aAAa,QAAW;AAC1B,eAAO;AAAA,MACT;AACA,UAAI,CAAC,kBAAkB,QAAQ,GAAG;AAChC,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,SAAS,WACpB,SAAS,SACR,SAAS,UAAU,SAAS,iBAAiB;AAClD,YAAM,WAAW,gBAAgB,UAAU,SAAS,WAAW,aAAa,YAAY;AAAA,QACtF,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MAC3C,CAAC;AACD,gBAAU,IAAI,IAAI,QAAQ;AAC1B,eAAS,OAAO,EAAE,MAAM,wBAAwB,UAAU,SAAS,CAAC;AACpE,eAAS,QAAQ;AAAA,QACf,UAAU,SAAS;AAAA,QACnB,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MAC3C,CAAC;AACD,aAAO,eAAe,QAAQ;AAAA,IAChC;AAAA,EACF;AACF;AAEA,eAAe,gBACb,WACA,SACA,SACqC;AACrC,QAAM,KAAK,WAAW,OAAO,WAAW;AACxC,QAAM,WAA4B;AAAA,IAChC;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,GAAI,QAAQ,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,IAC1E,UAAU,QAAQ;AAAA,IAClB,GAAI,QAAQ,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,WAAW;AAAA,IACzE,gBAAgB,QAAQ;AAAA,IACxB,MAAM,QAAQ;AAAA,IACd,QAAQ;AAAA,IACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,IACjE,GAAI,QAAQ,kBAAkB,SAAY,CAAC,IAAI,EAAE,eAAe,QAAQ,cAAc;AAAA,IACtF,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC3D,SAAS,MAAM;AAAA,IAAC;AAAA,EAClB;AAEA,QAAM,WAAW,IAAI,QAAoC,CAACE,aAAY;AACpE,aAAS,UAAU,CAACC,cAAa;AAC/B,YAAM,UAAU,UAAU,IAAI,EAAE;AAChC,UAAI,CAAC,kBAAkB,OAAO,GAAG;AAC/B,YAAI,YAAY,QAAW;AACzB,UAAAD,SAAQ;AAAA,YACN,UAAU,QAAQ,WAAW;AAAA,YAC7B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,UACnE,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,YAAM,SAASC,UAAS,WACpBA,UAAS,SACRA,UAAS,UAAU,QAAQ,iBAAiB;AACjD,YAAM,WAAW,gBAAgB,SAASA,UAAS,WAAW,aAAa,YAAY;AAAA,QACrF,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MAC3C,CAAC;AACD,gBAAU,IAAI,IAAI,QAAQ;AAC1B,cAAQ,OAAO,EAAE,MAAM,wBAAwB,UAAU,SAAS,CAAC;AACnE,MAAAD,SAAQ;AAAA,QACN,UAAUC,UAAS;AAAA,QACnB,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,YAAU,IAAI,IAAI,QAAQ;AAC1B,UAAQ,OAAO,EAAE,MAAM,yBAAyB,UAAU,eAAe,QAAQ,EAAE,CAAC;AACpF,SAAO;AACT;AAEA,eAAe,oBACb,OACA,SAC6B;AAC7B,SAAO,OAAO,UAAU,aAAa,MAAM,OAAO,IAAI;AACxD;AAEA,SAAS,kBACP,UAC6B;AAC7B,SAAO,aAAa,UAAa,SAAS,WAAW,aAAa,aAAa;AACjF;AAEA,SAAS,gBACP,UACA,QACA,UAA+B,CAAC,GACZ;AACpB,SAAO,eAAe;AAAA,IACpB,GAAG;AAAA,IACH;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,EACnE,CAAC;AACH;AAEA,SAAS,eAAe,UAAoE;AAC1F,QAAM,EAAE,MAAM,eAAe,SAAAD,UAAS,GAAG,KAAK,IAAI;AAClD,OAAK;AACL,OAAK;AACL,OAAKA;AACL,SAAO;AACT;;;AM9WA,SAAS,oBAAoB;AAMtB,SAAS,mBACd,KACA,OAIM;AACN,MAAI;AAAA,IAAI;AAAA,IAAU,CAAC,MACjB,EAAE,KAAK;AAAA,MACL,OAAO,MAAM,MAAM,IAAI,UAAU;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,kBAAkB,CAAC,MAAM;AAC/B,UAAM,QAAQ,MAAM,QAAQ,IAAI,EAAE,IAAI,MAAM,QAAQ,CAAC;AACrD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,sBAAsB;AAAA,IAClE;AACA,WAAO,EAAE,KAAK,WAAW,KAAK,CAAC;AAAA,EACjC,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAM;AAC3C,UAAM,QAAQ,MAAM,QAAQ,IAAI,EAAE,IAAI,MAAM,QAAQ,CAAC;AACrD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,sBAAsB;AAAA,IAClE;AAEA,UAAM,OAAO,MAAM,oBAAoB,CAAC;AACxC,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,QAAQ,WAAW,OAAO,WAAW;AAC3C,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC,GAAG;AAAA,MACH,GAAI,KAAK,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,KAAK,YAAY;AAAA,IAC5E,CAAC;AACD,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,aAAaE,aAAY,MAAM;AACrC,UAAM,WAAkC;AAAA,MACtC;AAAA,MACA,SAAS,MAAM,MAAM,MAAM;AAAA,MAC3B,WAAW,IAAI,KAAK,SAAS,EAAE,YAAY;AAAA,MAC3C,SAAS,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,MACvC,YAAY,UAAU;AAAA,MACtB,QAAQC,cAAa,UAAU,IAAI,aAAa,EAAE,OAAO,WAAW;AAAA,IACtE;AACA,WAAO,EAAE,KAAK,QAAQ;AAAA,EACxB,CAAC;AACH;AAEA,eAAe,oBACb,GACqD;AACrD,MAAI,OAAgB,CAAC;AACrB,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AAEA,QAAM,UAAgC,CAAC;AACvC,MAAI,iBAAiB,MAAM;AACzB,QAAI,CAAC,kBAAkB,KAAK,WAAW,GAAG;AACxC,aAAO;AAAA,QACL,OAAO,cAAc,GAAG,KAAK,eAAe,wCAAwC;AAAA,MACtF;AAAA,IACF;AACA,YAAQ,cAAc,KAAK;AAAA,EAC7B;AACA,SAAO;AACT;;;ACxDO,SAAS,wBACd,KACA,OAIM;AACN,MAAI,IAAI,cAAc,OAAO,MAAM;AACjC,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,eAAe;AAAA,IAC7D;AAEA,UAAM,UAAkC;AAAA,MACtC,QAAQ,MAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,oBAAoB,CAAC;AAAA,MAChE,UAAU,MAAM,wBAAwB,MAAM,YAAY,KAAK;AAAA,IACjE;AACA,WAAO,EAAE,KAAK,OAAO;AAAA,EACvB,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAM;AACvC,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,eAAe;AAAA,IAC7D;AAEA,UAAM,UAAU,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;AAC1D,UAAM,WAAW,oBAAoB,EAAE,IAAI,MAAM,UAAU,CAAC;AAC5D,QAAI,YAAY,UAAa,aAAa,QAAW;AACnD,aAAO,cAAc,GAAG,KAAK,eAAe,mCAAmC;AAAA,IACjF;AAEA,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO;AAC7D,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,UAAM,OAAO,MAAM,mBAAmB,OAAO,UAAU;AAAA,MACrD;AAAA,MACA,QAAQ,oBAAoB,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,IACnD,CAAC;AACD,QAAI,SAAS,QAAW;AACtB,aAAO,cAAc,GAAG,KAAK,aAAa,4BAA4B;AAAA,IACxE;AAEA,WAAO,EAAE,KAAK,IAAI;AAAA,EACpB,CAAC;AACH;AAUA,eAAe,qBAAqB,OAAyD;AAC3F,QAAM,YAAY,MAAM,QAAQ,MAAM,MAAM;AAC5C,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,IAC/C,SAAS,MAAM,iBAAiB,KAAK;AAAA,IACrC,eAAe,MAAM,MAAM,cAAc,IAAI,CAAC,cAAc;AAAA,MAC1D,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,GAAI,SAAS,oBAAoB,SAC7B,CAAC,IACD,EAAE,iBAAiB,qBAAqB,SAAS,eAAe,EAAE;AAAA,IACxE,EAAE;AAAA,EACJ;AACF;AAEA,eAAe,iBAAiB,OAA6D;AAC3F,QAAM,UAA0C;AAAA,IAC9C;AAAA,MACE,UAAU,eAAe;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM,MAAM,cAAc;AAAA,MACjC,aAAa;AAAA,MACb,WAAW,MAAM,MAAM,cAAc;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,wBAAwB,MAAM,QAAQ;AAAA,IAC1C,MAAM,MAAM,gBAAgB,IAAI,OAAO,cAAc,UAAU;AAC7D,YAAM,UAAU,UAAU,aAAa,KAAK;AAC5C,YAAM,QAAQ,MAAM,iBAAiB,SAAS,aAAa,QAAQ,MAAM;AACzE,aAAO;AAAA,QACL,UAAU,uBAAuB,KAAK;AAAA,QACtC,MAAM;AAAA,QACN,OAAO,mBAAmB,QAAQ,CAAC;AAAA,QACnC,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,MAAM,aAAa,QAAQ;AAAA,QAC3B,GAAI,aAAa,QAAQ,cAAc,SACnC,CAAC,IACD,EAAE,WAAW,aAAa,QAAQ,UAAU;AAAA,QAChD,aAAa,YAAY;AAAA,QACzB,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,MAAM,QAAQ;AAAA,IACvC,MAAM,MAAM,aAAa,IAAI,OAAO,cAAc,UAAU;AAC1D,YAAM,UAAU,UAAU,aAAa,KAAK;AAC5C,YAAM,QAAQ,MAAM,iBAAiB,SAAS,aAAa,QAAQ,MAAM;AACzE,aAAO;AAAA,QACL,UAAU,qBAAqB,KAAK;AAAA,QACpC,MAAM;AAAA,QACN,OAAO,iBAAiB,QAAQ,CAAC;AAAA,QACjC,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,MAAM,aAAa,QAAQ;AAAA,QAC3B,GAAI,aAAa,QAAQ,cAAc,SACnC,CAAC,IACD,EAAE,WAAW,aAAa,QAAQ,UAAU;AAAA,QAChD,aAAa,YAAY;AAAA,QACzB,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,SAAS,GAAG,uBAAuB,GAAG,kBAAkB;AACrE;AAEA,eAAe,iBACb,SACA,QAC6B;AAC7B,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;AAC/C,SAAO,KAAK;AACd;AAEA,eAAe,mBACb,OACA,UACA,SAC+C;AAC/C,MAAI,aAAa,eAAe,GAAG;AACjC,WAAO,yBAAyB,OAAO,OAAO;AAAA,EAChD;AAEA,QAAM,sBAAsB,mBAAmB,UAAU,iBAAiB;AAC1E,MAAI,wBAAwB,QAAW;AACrC,UAAM,eAAe,MAAM,MAAM,gBAAgB,mBAAmB;AACpE,QAAI,iBAAiB,QAAW;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,UAAU,UAAU,aAAa,KAAK;AAC5C,QAAI,YAAY,QAAW;AACzB,aAAO,mBAAmB,MAAM,IAAI,UAAU,iBAAiB;AAAA,IACjE;AACA,UAAM,OAAO,MAAM,QAAQ;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,QAAQ,aAAa,QAAQ;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO,KAAK,MAAM,IAAI,CAAC,SAAS,mBAAmB,IAAI,CAAC;AAAA,MACxD,GAAI,KAAK,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,KAAK,WAAW;AAAA,MACvE,GAAI,KAAK,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,KAAK,WAAW;AAAA,IACzE;AAAA,EACF;AAEA,QAAM,oBAAoB,mBAAmB,UAAU,eAAe;AACtE,MAAI,sBAAsB,QAAW;AACnC,UAAM,eAAe,MAAM,MAAM,aAAa,iBAAiB;AAC/D,QAAI,iBAAiB,QAAW;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,UAAU,UAAU,aAAa,KAAK;AAC5C,QAAI,YAAY,QAAW;AACzB,aAAO,mBAAmB,MAAM,IAAI,UAAU,eAAe;AAAA,IAC/D;AACA,UAAM,OAAO,MAAM,QAAQ;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,QAAQ,aAAa,QAAQ;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO,KAAK,MAAM,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC;AAAA,MACrD,GAAI,KAAK,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,KAAK,WAAW;AAAA,MACvE,GAAI,KAAK,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,KAAK,WAAW;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAAyD;AAC1E,MAAI,CAACC,UAAS,KAAK,KAAK,OAAO,MAAM,YAAY,YAAY;AAC3D,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM;AACtB,SAAO,CAAC,YACN,QAAQ,KAAK,OAAO,OAAO;AAC/B;AAEA,SAAS,yBACP,OACA,SAC0B;AAC1B,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,UAAU,GAAG,CAAC,CAAC;AACnE,QAAM,OAAO,MAAM,MAAM,cAAc,MAAM,OAAO,QAAQ,QAAQ,KAAK;AACzE,QAAM,aAAa,QAAQ,KAAK;AAChC,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,UAAU,eAAe;AAAA,IACzB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO,KAAK,IAAI,CAAC,cAAc;AAAA,MAC7B,IAAI,SAAS;AAAA,MACb,MAAM;AAAA,MACN,MAAM,SAAS;AAAA,MACf,GAAI,SAAS,oBAAoB,SAC7B,CAAC,IACD,EAAE,UAAU,qBAAqB,SAAS,eAAe,EAAE;AAAA,IACjE,EAAE;AAAA,IACF,GAAI,aAAa,MAAM,MAAM,cAAc,SAAS,EAAE,YAAY,OAAO,UAAU,EAAE,IAAI,CAAC;AAAA,IAC1F,YAAY,MAAM,MAAM,cAAc;AAAA,EACxC;AACF;AAEA,SAAS,mBACP,SACA,UACA,MAC0B;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,OAAO,CAAC;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,MAIJ;AACtB,QAAM,OACJA,UAAS,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS,SAAS,WACrD,KAAK,SAAS,OACd,OAAO,KAAK,aAAa,WACvB,KAAK,WACL;AACR,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,MAAM;AAAA,IACN,GAAI,SAAS,SAAY,EAAE,UAAUC,aAAY,KAAK,QAAQ,EAAE,IAAI,EAAE,KAAK;AAAA,IAC3E,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,qBAAqB,KAAK,QAAQ,EAAE;AAAA,EACzF;AACF;AAEA,SAAS,gBAAgB,MAID;AACtB,QAAM,WAAWD,UAAS,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AAC5D,QAAM,aAAaA,UAAS,SAAS,UAAU,IAAI,SAAS,aAAa,CAAC;AAC1E,QAAM,WACJ,OAAO,SAAS,aAAa,WACzB,SAAS,WACT,OAAO,WAAW,SAAS,WACzB,WAAW,OACX,KAAK;AACb,QAAM,cAAc,OAAO,WAAW,gBAAgB,WAAW,WAAW,cAAc;AAC1F,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe,cAAc,WAAW,UAAU;AAAA,IAClD,UAAUC,aAAY,KAAK,QAAQ;AAAA,IACnC,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,qBAAqB,KAAK,QAAQ,EAAE;AAAA,EACzF;AACF;AAEA,SAAS,cAAc,YAA+B;AACpD,MAAI,CAACD,UAAS,UAAU,KAAK,CAACA,UAAS,WAAW,UAAU,GAAG;AAC7D,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,KAAK,WAAW,UAAU;AAC1C;AAEA,SAAS,iBAAyB;AAChC,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,mBAAmB,KAAK;AACjC;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,mBACP,UACA,MACoB;AACpB,QAAM,SAAS,SAAS,oBAAoB,qBAAqB;AACjE,MAAI,CAAC,SAAS,WAAW,MAAM,GAAG;AAChC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,SAAS,MAAM,OAAO,MAAM,CAAC;AAClD,SAAO,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ;AACzD;AAEA,eAAe,wBACb,YACA,OACoC;AACpC,MAAI,YAAY,eAAe,QAAW;AACxC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ;AACd,QAAM,aAAa,MAAM;AACzB,MAAI,eAAe,QAAW;AAC5B,WAAO,CAAC;AAAA,EACV;AACA,QAAM,YAAY,MAAM,WAAW,KAAK,OAAO,EAAE,MAAM,CAAC;AACxD,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,UAAU,IAAI,CAAC,YAAY,QAAQ,QAAQ,MAAM,SAAS,QAAQ,EAAE,CAAC,EAAE,MAAM,MAAM,MAAS,CAAC;AAAA,EAC/F;AACA,SAAO,OAAO;AAAA,IAAQ,CAAC,UACrB,UAAU,SAAY,CAAC,IAAI,kBAAkB,KAAK;AAAA,EACpD;AACF;AAEA,SAAS,kBAAkB,OAA+C;AACxE,SAAO,MAAM,aAAa,QAAQ,CAAC,gBAAgB;AACjD,QAAI,YAAY,SAAS,gBAAgB,CAACA,UAAS,YAAY,KAAK,GAAG;AACrE,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,YAAY,MAAM,QAAQ,YAAY,MAAM,SAAS,IACvD,YAAY,MAAM,UAAU,QAAQ,CAAC,aAAa,iBAAiB,QAAQ,CAAC,IAC5E,CAAC;AACL,UAAM,QAAQ,MAAM,QAAQ,YAAY,MAAM,KAAK,IAC/C,YAAY,MAAM,MAAM,QAAQ,CAAC,SAAS,iBAAiB,IAAI,CAAC,IAChE,CAAC;AACL,QAAI,UAAU,WAAW,KAAK,MAAM,WAAW,GAAG;AAChD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,QAAQ,yBAAyB,YAAY,KAAK;AACxD,WAAO;AAAA,MACL;AAAA,QACE,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,QACjB,eAAe,YAAY;AAAA,QAC3B,iBAAiB,YAAY;AAAA,QAC7B,MAAM,YAAY;AAAA,QAClB,WAAW,YAAY;AAAA,QACvB,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,QACvC,eAAe,UAAU;AAAA,QACzB,WAAW,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,yBAAyB,OAAoD;AACpF,QAAM,aAAa,YAAY,MAAM,MAAM;AAC3C,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,MAAM,WAAW,GAAG;AACpC,aAAS,QAAQ,MAAM,YAAY,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACrE,YAAM,OAAO,YAAY,MAAM,YAAY,KAAK,CAAC;AACjD,UAAI,KAAK,SAAS,GAAG;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,MAAM,OAAO,GAAG;AAChC,aAAS,QAAQ,MAAM,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACjE,YAAM,OAAO,YAAY,MAAM,QAAQ,KAAK,CAAC;AAC7C,UAAI,KAAK,SAAS,GAAG;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,SAAS,UAAU;AAClC,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AACA,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,WAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B;AACA,MAAI,MAAM,QAAQ,MAAM,OAAO,GAAG;AAChC,WAAO,MAAM,QAAQ,IAAI,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,EACxE;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,SAAS,UAAU;AAClC,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAmD;AAC3E,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,KAAK,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK;AACrD,QAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,QAAM,kBAAkBA,UAAS,MAAM,eAAe,IAClD,qBAAqB,MAAM,eAAe,IAC1C;AACJ,MAAI,OAAO,UAAa,SAAS,UAAa,oBAAoB,QAAW;AAC3E,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL;AAAA,MACE,GAAI,OAAO,SAAY,CAAC,IAAI,EAAE,GAAG;AAAA,MACjC,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,MACrC,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAA0B;AAClD,MAAI,CAACA,UAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAAU;AACtD,WAAO,CAAC;AAAA,EACV;AACA,SAAO,CAAC,MAAM,IAAI;AACpB;AAEA,SAAS,qBAAqB,OAA4C;AACxE,SAAOE,mBAAkB,KAAK;AAChC;AAEA,SAASF,UAAS,OAA8D;AAC9E,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC9eO,SAAS,kBACd,KACA,OAGM;AACN,MAAI,IAAI,yBAAyB,OAAO,MAAM;AAC5C,UAAM,UAAU,EAAE,IAAI,MAAM,SAAS;AACrC,UAAM,QAAQ,MAAM,SAAS,IAAI,OAAO;AACxC,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,SAAS,MAAM,iBAAiB,KAAK;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,iBACpB,OACyC;AACzC,QAAM,UAAU,oBAAI,IAA0C;AAC9D,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,EAAE,MAAM,OAAO,KAAK,eAAe,KAAK,GAAG;AACpD,UAAM,aAAa,cAAc,IAAI;AACrC,QAAI,eAAe,QAAW;AAC5B;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KAAK,WAAW,EAAE;AAC3C,UAAM,MAAM,GAAG,UAAU,IAAI,MAAM,IAAI,WAAW,IAAI;AACtD,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AAEZ,UAAM,QAAQ,QAAQ,IAAI,UAAU,KAAK,CAAC;AAC1C,UAAM,KAAK;AAAA,MACT,MAAM,WAAW;AAAA,MACjB,aAAa,WAAW;AAAA,MACxB,YAAY,WAAW;AAAA,MACvB;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,YAAY,KAAK;AAAA,EAC/B;AAEA,SAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC,EACzB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AACtB,UAAM,cAAc,MAAM,KAAK,CAAC,MAAM,UAAU;AAC9C,UAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,eAAO,KAAK,WAAW,WAAW,KAAK;AAAA,MACzC;AACA,aAAO,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,IAC3C,CAAC;AACD,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf;AAAA,MACA,WAAW,YAAY;AAAA,MACvB,OAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAC9D;;;AC7DA,IAAM,kBAAkB;AAEjB,SAAS,qBACd,KACA,OAGM;AACN,MAAI,IAAI,iBAAiB,OAAO,MAAM;AACpC,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,WAAW,MAAM,MAAM,aAAa,aAAa,EAAE,OAAO,IAAI,CAAC;AACrE,UAAM,QAAQ,oBAAI,IAAoD;AACtE,eAAW,WAAW,UAAU;AAC9B,YAAM,SAAS,cAAc,OAAO;AACpC,YAAM,WAAW,MAAM,IAAI,MAAM;AACjC,UAAI,aAAa,QAAW;AAC1B,cAAM,IAAI,QAAQ;AAAA,UAChB;AAAA,UACA,mBAAmB;AAAA,UACnB,UAAU,CAAC,QAAQ,OAAO;AAAA,UAC1B,mBAAmB,QAAQ;AAAA,QAC7B,CAAC;AACD;AAAA,MACF;AACA,eAAS,qBAAqB;AAC9B,UAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,OAAO,GAAG;AAChD,iBAAS,SAAS,KAAK,QAAQ,OAAO;AAAA,MACxC;AACA,UAAI,IAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,SAAS,iBAAiB,EAAE,QAAQ,GAAG;AAC1F,iBAAS,oBAAoB,QAAQ;AAAA,MACvC;AAAA,IACF;AAEA,UAAM,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,EAC5B;AAAA,MACC,CAAC,MAAM,UACL,IAAI,KAAK,MAAM,iBAAiB,EAAE,QAAQ,IAAI,IAAI,KAAK,KAAK,iBAAiB,EAAE,QAAQ;AAAA,IAC3F,EACC,MAAM,GAAG,KAAK;AACjB,WAAO,EAAE,KAAK,EAAE,OAAO,MAAM,OAAO,MAAM,KAAK,CAAiC;AAAA,EAClF,CAAC;AAED,MAAI,IAAI,yBAAyB,OAAO,MAAM;AAC5C,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,UAAU,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;AAC1D,UAAM,SAAS,oBAAoB,EAAE,IAAI,MAAM,QAAQ,CAAC;AACxD,UAAM,WAAW,MAAM,MAAM,aAAa,aAAa;AAAA,MACrD,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AACD,UAAM,gBAAgB,SACnB,IAAI,yBAAyB,EAC7B,OAAO,CAAC,YAAY,WAAW,UAAa,QAAQ,WAAW,MAAM,EACrE,MAAM,GAAG,KAAK;AAEjB,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,OAAO,cAAc;AAAA,IACvB,CAAyC;AAAA,EAC3C,CAAC;AAED,MAAI,IAAI,kDAAkD,OAAO,MAAM;AACrE,UAAM,UAAU,MAAM,MAAM,aAAa,WAAW,EAAE,IAAI,MAAM,gBAAgB,CAAC;AACjF,QAAI,YAAY,QAAW;AACzB,aAAO,cAAc,GAAG,KAAK,aAAa,wBAAwB;AAAA,IACpE;AACA,WAAO,EAAE,KAAK;AAAA,MACZ,cAAc,0BAA0B,OAAO;AAAA,MAC/C,UAAU,QAAQ;AAAA,MAClB,YAAY,QAAQ;AAAA,IACtB,CAA4C;AAAA,EAC9C,CAAC;AAED,MAAI,IAAI,+CAA+C,OAAO,MAAM;AAClE,UAAM,UAAU,MAAM,MAAM,aAAa,WAAW,EAAE,IAAI,MAAM,gBAAgB,CAAC;AACjF,QAAI,YAAY,QAAW;AACzB,aAAO,cAAc,GAAG,KAAK,aAAa,wBAAwB;AAAA,IACpE;AACA,WAAO,EAAE,KAAK;AAAA,MACZ,cAAc,0BAA0B,OAAO;AAAA,MAC/C,OAAO,QAAQ;AAAA,IACjB,CAAyC;AAAA,EAC3C,CAAC;AACH;AAEA,SAAS,0BACP,SACiC;AACjC,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,QAAQ,cAAc,OAAO;AAAA,IAC7B,SAAS,QAAQ;AAAA,IACjB,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9D,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,cAAc,QAAQ;AAAA,IACtB,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,EACzE;AACF;AAEA,SAAS,cAAc,SAAkD;AACvE,QAAM,SAAS,QAAQ,UAAU;AACjC,SAAO,OAAO,WAAW,YAAY,OAAO,KAAK,EAAE,SAAS,IAAI,SAAS;AAC3E;;;AC5HA,SAAS,yBAAyB;AAQlC,IAAM,qBAAkC;AAAA,EACtC,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,qBAAqB;AACvB;AAEO,SAAS,kBAA0B,QAAyC;AACjF,SAAO,kBAAkB,uBAAuB,MAAM,GAAG;AAAA,IACvD,QAAQ;AAAA,IACR,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,uBACP,QACgD;AAChD,QAAM,WAAW,OAAO,OAAO,aAAa,EAAE;AAC9C,MAAI,OAAO;AAEX,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,IAAoD;AACvE,aAAO;AAAA,QACL,MAAM,OAAiE;AACrE,cAAI,MAAM;AACR,mBAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,UACxC;AAEA,cAAI;AACF,kBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAI,KAAK,SAAS,MAAM;AACtB,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT,SAAS,OAAO;AACd,mBAAO;AACP,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO,kBAAkB,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM,SAAmE;AACvE,iBAAO;AACP,gBAAM,SAAS,SAAS;AACxB,iBAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAAwC;AACjE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAOG,gBAAe,KAAK;AAAA,EAC7B;AACF;;;AC/CA,IAAM,oBAAoB;AAEnB,IAAM,yBAAN,MAA6B;AAAA,EACjB,gBAAgB,oBAAI,IAA+B;AAAA,EAEpE,KAAK,OAAuC;AAC1C,eAAW,gBAAgB,KAAK,eAAe;AAC7C,mBAAa,KAAK,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,UACE,UAAyD,CAAC,GAC/B;AAC3B,UAAM,eAAe,mBAAmB,QAAQ,KAAK;AACrD,SAAK,cAAc,IAAI,YAAY;AACnC,WAAO;AAAA,MACL,OAAO,MAAM;AACX,qBAAa,MAAM;AACnB,aAAK,cAAc,OAAO,YAAY;AAAA,MACxC;AAAA,MACA,MAAM,aAAa;AAAA,MACnB,MAAM,aAAa;AAAA,IACrB;AAAA,EACF;AACF;AAEO,SAAS,cAAc,QAAwB,KAA6C;AACjG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,OAAO,aAAa,SACpB,CAAC,IACD,EAAE,UAAU,oBAAoB,OAAO,UAAU,GAAG,EAAE;AAAA,IAC1D,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,kBAAkB,OAAO,QAAQ,GAAG,EAAE;AAAA,IACvF,GAAI,OAAO,iBAAiB,SACxB,CAAC,IACD,EAAE,cAAc,wBAAwB,OAAO,cAAc,GAAG,EAAE;AAAA,EACxE;AACF;AAEO,SAAS,4BAA4B,KAAW,KAAmC;AACxF,MAAI,IAAI,yBAAyB,CAAC,MAAM;AACtC,UAAM,QAAQ,gBAAgB,EAAE,IAAI,MAAM,MAAM,CAAC;AACjD,QAAI,UAAU,OAAO;AACnB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,kBAAkB,oBAAoB,KAAK,KAAK,CAAC;AAAA,EAC1D,CAAC;AACH;AAEA,SAAS,oBACP,KACA,OACyC;AACzC,QAAM,eAAe,IAAI,UAAU,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM,CAAC;AAEvE,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,QACL,MAAM,MAAM,aAAa,KAAK;AAAA,QAC9B,MAAM,SAAS;AACb,uBAAa,MAAM;AACnB,iBAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OAC2B;AAC3B,QAAM,SAAqC,CAAC;AAC5C,QAAM,YAA8E,CAAC;AACrF,MAAI,SAAS;AAEb,SAAO;AAAA,IACL,QAAQ;AACN,eAAS;AACT,iBAAWC,YAAW,UAAU,OAAO,CAAC,GAAG;AACzC,QAAAA,SAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,OAAO;AACL,YAAM,QAAQ,OAAO,MAAM;AAC3B,UAAI,UAAU,QAAW;AACvB,eAAO,QAAQ,QAAQ,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,MAC/C;AACA,UAAI,QAAQ;AACV,eAAO,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,MACzD;AACA,aAAO,IAAI,QAAQ,CAACA,aAAY,UAAU,KAAKA,QAAO,CAAC;AAAA,IACzD;AAAA,IACA,KAAK,OAAO;AACV,UAAI,UAAW,UAAU,UAAa,CAAC,MAAM,IAAI,MAAM,IAAI,GAAI;AAC7D;AAAA,MACF;AACA,YAAMA,WAAU,UAAU,MAAM;AAChC,UAAIA,aAAY,QAAW;AACzB,QAAAA,SAAQ,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC;AACrC;AAAA,MACF;AACA,UAAI,OAAO,UAAU,mBAAmB;AACtC,eAAO,MAAM;AAAA,MACf;AACA,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,oBACP,OACA,KACoB;AACpB,SAAO,IAAI,MAAM,OAAO;AAAA,IACtB,IAAI,QAAQ,UAAU,UAAU;AAC9B,UAAI,aAAa,oBAAoB;AACnC,eAAO,cAAc,QAAQ,UAAU,QAAQ;AAAA,MACjD;AACA,YAAMC,oBAAmB,OAAO,kBAAkB,KAAK,MAAM;AAC7D,UAAIA,sBAAqB,QAAW;AAClC,eAAO;AAAA,MACT;AACA,aAAO,UAAU,SAA0E;AACzF,cAAM,MAAM,MAAMA,kBAAiB,GAAG,IAAI;AAC1C,YAAI,KAAK,EAAE,MAAM,eAAe,IAAI,CAAC;AACrC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBACP,OACA,KACwB;AACxB,SAAO,IAAI,MAAM,OAAO;AAAA,IACtB,IAAI,QAAQ,UAAU,UAAU;AAC9B,UAAI,aAAa,qBAAqB;AACpC,eAAO,cAAc,QAAQ,UAAU,QAAQ;AAAA,MACjD;AACA,YAAMC,qBAAoB,OAAO,kBAAkB,KAAK,MAAM;AAC9D,aAAO,UAAU,SAAkE;AACjF,cAAM,MAAM,MAAMA,mBAAkB,GAAG,IAAI;AAC3C,YAAI,KAAK,EAAE,MAAM,gBAAgB,IAAI,CAAC;AACtC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkB,OAAyB,KAA+C;AACjG,SAAO,IAAI,MAAM,OAAO;AAAA,IACtB,IAAI,QAAQ,UAAU,UAAU;AAC9B,UAAI,aAAa,aAAa;AAC5B,eAAO,cAAc,QAAQ,UAAU,QAAQ;AAAA,MACjD;AACA,YAAM,YAAY,OAAO,UAAU,KAAK,MAAM;AAC9C,aAAO,UAAU,SAAoD;AACnE,cAAM,QAAQ,MAAM,UAAU,GAAG,IAAI;AACrC,YAAI,KAAK,EAAE,MAAM,SAAS,OAAOC,cAAa,KAAK,EAAE,CAAC;AACtD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cACP,QACA,UACA,UACS;AACT,QAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ;AACpD,SAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAC5D;AAEA,SAAS,gBACP,OACuD;AACvD,MAAI,UAAU,UAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,oBAAI,IAAkC;AACpD,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,YAAY,OAAO,GAAG;AACzB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,OAAO;AAAA,EACnB;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAsD;AACzE,SAAO,UAAU,iBAAiB,UAAU,kBAAkB,UAAU;AAC1E;AAEA,SAASA,cAAa,OAAwC;AAC5D,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,IACvD,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;AAAA,IAChE,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,MAAM,WAAW;AAAA,IACzE,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACnE,kBAAkB,MAAM,aAAa;AAAA,EACvC;AACF;;;ACvOA,eAAsB,kBACpB,OACA,OAC6C;AAC7C,SAAO,OAAO,kBAAkB,KAAK;AACvC;AAEA,gBAAuB,gBACrB,OACA,OACsE;AACtE,QAAM,MAAM,MAAM,kBAAkB,OAAO,KAAK;AAChD,MAAI,QAAQ,QAAW;AACrB,UAAM,EAAE,MAAM,gBAAgB,IAAI;AAAA,EACpC;AACF;AAEO,SAAS,uBAAuB,OAMN;AAC/B,SAAO;AAAA,IACL,YAAY,MAAM,SAAS;AAAA,IAC3B,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU,cAAc;AAAA,MACtB,QAAQ,MAAM;AAAA,MACd,YAAYC,YAAW,cAAc,MAAM,KAAK,CAAC;AAAA,MACjD,cAAc,OAAO,KAAK,MAAM,YAAY,CAAC,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,sBACd,UACA,OAC8B;AAC9B,QAAM,QAAQ,SAAS,SAAS,MAAM;AACtC,SAAO;AAAA,IACL,YAAY,SAAS;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU,cAAc;AAAA,MACtB,YAAY,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW,KAAK,SAAS,QAAQ,EACrF;AAAA,MACH,WAAW,MAAM,MAAM;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,wBAAwB,OAKP;AAC/B,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU,cAAc;AAAA,MACtB,YAAY,MAAM;AAAA,MAClB,aAAaA,YAAW,cAAc,MAAM,MAAM,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,qBACd,YACA,OACA,OACA,WAC8B;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU,cAAc;AAAA,MACtB,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,OAAOC,gBAAe,KAAK;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEO,SAAS,iBACd,YACA,OACA,OAC8B;AAC9B,QAAM,WAAW,cAAc,MAAM,IAAI;AACzC,MAAI,MAAM,SAAS,iBAAiB;AAClC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,OAAO,GAAG,MAAM,KAAK,IAAI;AAAA,MACzB,SAAS,GAAG,MAAM,KAAK,KAAK;AAAA,MAC5B,UAAU,aAAa,MAAM,IAAI;AAAA,IACnC;AAAA,EACF;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,OAAO,GAAG,MAAM,KAAK,IAAI;AAAA,MACzB,SAAS,GAAG,MAAM,KAAK,KAAK;AAAA,MAC5B,UAAU,cAAc;AAAA,QACtB,GAAG,aAAa,MAAM,IAAI;AAAA,QAC1B,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,OAAO,GAAG,MAAM,KAAK,IAAI;AAAA,IACzB,SAAS,GAAG,MAAM,KAAK,KAAK;AAAA,IAC5B,UAAU,cAAc;AAAA,MACtB,GAAG,aAAa,MAAM,IAAI;AAAA,MAC1B,YAAY,MAAM;AAAA,MAClB,OAAOA,gBAAe,MAAM,KAAK;AAAA,IACnC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,MAAmE;AACxF,MAAI,KAAK,SAAS,cAAc,KAAK,SAAS,UAAU;AACtD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAqC;AACzD,SAAO,cAAc;AAAA,IACnB,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,cAAc,OAA4C;AACjE,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,SAAS,MAAS;AAAA,EAC/D;AACF;AAEA,SAASD,YAAW,OAA+C;AACjE,SAAO,UAAU,SAAY,SAAY,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE;AAC3E;AAEA,SAAS,cAAc,OAAoC;AACzD,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC1KO,IAAM,kBAAN,MAAyB;AAAA,EACb,SAAc,CAAC;AAAA,EACf,YAAuD,CAAC;AAAA,EACjE,SAAS;AAAA,EAEjB,KAAK,OAAgB;AACnB,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AACA,UAAM,WAAW,KAAK,UAAU,MAAM;AACtC,QAAI,aAAa,QAAW;AAC1B,eAAS,EAAE,MAAM,OAAO,MAAM,CAAC;AAC/B;AAAA,IACF;AACA,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AACd,eAAW,YAAY,KAAK,UAAU,OAAO,CAAC,GAAG;AAC/C,eAAS,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,OAAmC;AACjC,UAAM,QAAQ,KAAK,OAAO,MAAM;AAChC,QAAI,UAAU,QAAW;AACvB,aAAO,QAAQ,QAAQ,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,IAC/C;AACA,QAAI,KAAK,QAAQ;AACf,aAAO,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,IACzD;AACA,WAAO,IAAI,QAAQ,CAACE,aAAY,KAAK,UAAU,KAAKA,QAAO,CAAC;AAAA,EAC9D;AACF;AAEA,gBAAuB,0BACrB,WACA,gBACoC;AAIpC,QAAM,cAAc,UAAU,OAAO,aAAa,EAAE;AACpD,MAAI,UAAU;AACd,MAAI,UAAiE,YAAY,KAAK;AACtF,MAAI,eACF,eAAe,KAAK;AAEtB,MAAI;AACF,WAAO,YAAY,UAAa,iBAAiB,QAAW;AAC1D,YAAM,UAAiC,CAAC;AACxC,UAAI,YAAY,QAAW;AACzB,gBAAQ,KAAK,QAAQ,KAAK,CAAC,WAAW,EAAE,QAAQ,OAAO,MAAM,EAAE,CAAC;AAAA,MAClE;AACA,UAAI,iBAAiB,QAAW;AAC9B,gBAAQ,KAAK,aAAa,KAAK,CAAC,WAAW,EAAE,QAAQ,YAAY,MAAM,EAAE,CAAC;AAAA,MAC5E;AAEA,YAAM,SAAS,MAAM,QAAQ,KAAK,OAAO;AAEzC,UAAI,OAAO,WAAW,OAAO;AAC3B,YAAI,OAAO,MAAM,SAAS,MAAM;AAC9B,oBAAU;AACV,oBAAU;AACV,yBAAe,MAAM;AAAA,QACvB,OAAO;AACL,oBAAU,YAAY,KAAK;AAC3B,gBAAM,OAAO,MAAM;AAAA,QACrB;AACA;AAAA,MACF;AAEA,UAAI,OAAO,MAAM,SAAS,MAAM;AAC9B,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe,eAAe,KAAK;AACnC,cAAM,OAAO,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,CAAC,WAAW,YAAY,WAAW,QAAW;AAChD,YAAM,YAAY,OAAO;AAAA,IAC3B;AACA,mBAAe,MAAM;AAAA,EACvB;AACF;AAEO,SAAS,qBACd,IACA,QACU;AACV,SAAO,kBAAkB,MAAM;AACjC;AAEO,SAAS,YACd,OACA,SACA,SACmB;AACnB,QAAM,WAAW;AAAA,IACf,GAAI,OAAO,YAAY,CAAC;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAI,SAAS,CAAC;AAAA,IACd;AAAA,IACA,GAAI,OAAO,cAAc,SACrB,EAAE,WAAW,MAAM,UAAU,IAC7B,YAAY,SACV,CAAC,IACD,EAAE,WAAW,QAAQ,GAAG;AAAA,EAChC;AACF;AAEA,gBAAuB,kCAAkC,OAMlB;AACrC,QAAM,aAAsC,CAAC,yBAAyB,MAAM,SAAS,CAAC,CAAC;AACvF,QAAM,QAAQ,cAAc,MAAM,OAAO;AAEzC,QAAM,MAAM,MAAM,yBAAyB;AAAA,IACzC,IAAI,MAAM,QAAQ;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,GAAG;AAAA,IACH;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAED,MAAI;AACF,qBAAiB,SAAS,MAAM,QAAQ;AACtC,kCAA4B,YAAY,KAAK;AAE7C,YAAM,cAAc,MAAM,MAAM,MAAM,yBAAyB;AAAA,QAC7D,IAAI,MAAM,QAAQ;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,GAAG;AAAA,QACH;AAAA,QACA,QAAQ,MAAM,SAAS,UAAU,YAAY,MAAM,SAAS,UAAU,UAAU;AAAA,QAChF,GAAI,MAAM,SAAS,UAAU,EAAE,OAAOC,gBAAe,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,MACzE,CAAC;AACD,UAAI,gBAAgB,QAAW;AAC7B,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAEA,YAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,mCAA+B,YAAY,UAAU,KAAK,CAAC;AAC3D,UAAM,MAAM,MAAM,yBAAyB;AAAA,MACzC,IAAI,MAAM,QAAQ;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,GAAG;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,MACR,OAAOA,gBAAe,KAAK;AAAA,IAC7B,CAAC;AACD,UAAM;AAAA,EACR;AACF;AAEA,SAAS,4BACP,YACA,OACM;AACN,MAAI,MAAM,SAAS,cAAc;AAC/B,kCAA8B,YAAY,MAAM,KAAK;AAAA,EACvD;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,kCAA8B,YAAY,MAAM,OAAO,MAAM,EAAE;AAAA,EACjE;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,eAAW,KAAK;AAAA,MACd,SAAS,WAAW;AAAA,MACpB,MAAM;AAAA,MACN,UAAU,MAAM,SAAS,SAAS;AAAA,MAClC,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,MAChD,MAAMC,YAAW,MAAM,SAAS,SAAS,SAAS;AAAA,IACpD,CAAC;AAAA,EACH;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,UAAM,UAAU,wBAAwB,YAAY,MAAM,UAAU,MAAM,UAAU;AACpF,QAAI,YAAY,QAAW;AACzB,iBAAW,KAAK;AAAA,QACd,SAAS,WAAW;AAAA,QACpB,MAAM;AAAA,QACN,UAAU,MAAM;AAAA,QAChB,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,WAAW;AAAA,QACrE,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,GAAI,MAAM,qBAAqB,SAC3B,CAAC,IACD,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,MACjD,CAAC;AACD;AAAA,IACF;AACA,YAAQ,OAAO,QAAQ,QAAQ,MAAM;AACrC,YAAQ,SAAS,MAAM;AACvB,QAAI,MAAM,qBAAqB,QAAW;AACxC,cAAQ,mBAAmB,MAAM;AAAA,IACnC;AAAA,EACF;AACA,MAAI,MAAM,SAAS,oBAAoB;AACrC,UAAM,UAAU,wBAAwB,YAAY,MAAM,UAAU,MAAM,UAAU;AACpF,QAAI,YAAY,QAAW;AACzB,iBAAW,KAAK;AAAA,QACd,SAAS,WAAW;AAAA,QACpB,MAAM;AAAA,QACN,UAAU,MAAM;AAAA,QAChB,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,WAAW;AAAA,QACrE,aAAa,CAAC,0BAA0B,KAAK,CAAC,EAAE;AAAA,UAC9C,CAAC,eAA8D,eAAe;AAAA,QAChF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,oCAAgC,SAAS,KAAK;AAAA,EAChD;AACA,MAAI,MAAM,SAAS,yBAAyB;AAC1C,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,SAAS;AAAA,MACf,eAAe,MAAM,QAAQ;AAAA,IAC/B;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,WAAW;AAAA,QACjB,IAAI,MAAM,SAAS;AAAA,QACnB,QAAQ,MAAM,SAAS;AAAA,QACvB,aAAa,MAAM,SAAS;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,wBAAwB;AACzC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,SAAS;AAAA,MACf,eAAe,MAAM,QAAQ;AAAA,IAC/B;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,WAAW;AAAA,QACjB,IAAI,MAAM,SAAS;AAAA,QACnB,QAAQ,MAAM,SAAS;AAAA,QACvB,aAAa,MAAM,SAAS;AAAA,QAC5B,GAAI,MAAM,SAAS,eAAe,SAC9B,CAAC,IACD,EAAE,YAAY,MAAM,SAAS,WAAW;AAAA,QAC5C,GAAI,MAAM,SAAS,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,SAAS,OAAO;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,yBAAyB;AAC1C,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,SAAS;AAAA,MACf,eAAe,MAAM,QAAQ;AAAA,IAC/B;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,WAAW;AAAA,QACjB,IAAI,MAAM,SAAS;AAAA,QACnB,QAAQ,MAAM,SAAS;AAAA,QACvB,aAAa,MAAM,SAAS;AAAA,QAC5B,WAAW,MAAM,SAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,wBAAwB;AACzC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,SAAS;AAAA,MACf,eAAe,MAAM,QAAQ;AAAA,IAC/B;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,WAAW;AAAA,QACjB,IAAI,MAAM,SAAS;AAAA,QACnB,QAAQ,MAAM,SAAS;AAAA,QACvB,aAAa,MAAM,SAAS;AAAA,QAC5B,GAAI,MAAM,SAAS,eAAe,SAC9B,CAAC,IACD,EAAE,YAAY,MAAM,SAAS,WAAW;AAAA,QAC5C,WAAW,MAAM,SAAS;AAAA,QAC1B,GAAI,MAAM,SAAS,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,SAAS,QAAQ;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,WAAW,MAAM,OAAO,YAAY,QAAW;AAChE,4BAAwB,YAAY,MAAM,MAAM,OAAO;AAAA,EACzD;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,mCAA+B,YAAY,UAAU,MAAM,KAAK,CAAC;AAAA,EACnE;AACF;AAEA,SAAS,eAAe,UAAwE;AAC9F,SAAO,SAAS,UAAU,SAAS;AACrC;AAEA,SAAS,eAAe,UAAwE;AAC9F,SAAO,SAAS,UAAU,SAAS;AACrC;AAEA,SAAS,gCACP,OACA,OACM;AACN,QAAM,aAAa,0BAA0B,KAAK;AAClD,MAAI,eAAe,QAAW;AAC5B;AAAA,EACF;AACA,QAAM,cAAc,MAAM,eAAe,CAAC;AAC1C,MAAI,WAAW,SAAS,WAAW;AACjC,UAAM,OAAO,YAAY,GAAG,EAAE;AAC9B,QAAI,MAAM,SAAS,aAAa,KAAK,YAAY,WAAW,SAAS;AACnE,WAAK,OAAO,GAAG,KAAK,IAAI,GAAG,WAAW,IAAI;AAAA,IAC5C,OAAO;AACL,kBAAY,KAAK,UAAU;AAAA,IAC7B;AAAA,EACF,WAAW,WAAW,SAAS,aAAa;AAC1C,UAAM,OAAO,YAAY,GAAG,EAAE;AAC9B,QACE,MAAM,SAAS,eACf,KAAK,YAAY,WAAW,YAC3B,KAAK,eAAe,SAAS,WAAW,eAAe,KACxD;AACA,WAAK,OAAO,GAAG,KAAK,IAAI,GAAG,WAAW,IAAI;AAAA,IAC5C,OAAO;AACL,kBAAY,KAAK,UAAU;AAAA,IAC7B;AAAA,EACF,OAAO;AACL,UAAM,UAAU,wBAAwB,aAAa,UAAU;AAC/D,QAAI,YAAY,QAAW;AACzB,kBAAY,KAAK,UAAU;AAAA,IAC7B,OAAO;AACL,UAAI,QAAQ,SAAS,UAAa,WAAW,SAAS,QAAW;AAC/D,gBAAQ,OAAO,WAAW;AAAA,MAC5B;AACA,UAAI,WAAW,WAAW,QAAW;AACnC,gBAAQ,SAAS,WAAW;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc;AACtB;AAEA,SAAS,0BACP,OAC6C;AAC7C,QAAM,QAAQ,MAAM;AACpB,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,MACtE,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AACA,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,MACtE,GAAI,MAAM,OAAO,SAAY,CAAC,IAAI,EAAE,aAAa,MAAM,GAAG;AAAA,MAC1D,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,MACtE,UAAU,MAAM,SAAS,SAAS;AAAA,MAClC,GAAI,MAAM,SAAS,WAAW,UAAa,MAAM,SAAS,OAAO,SAC7D,CAAC,IACD,EAAE,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS,GAAG;AAAA,MACzD,MAAMA,YAAW,MAAM,SAAS,SAAS,SAAS;AAAA,IACpD;AAAA,EACF;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,MACtE,UAAU,MAAM;AAAA,MAChB,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,WAAW;AAAA,MACrE,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,GAAI,MAAM,qBAAqB,SAAY,CAAC,IAAI,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,IAC7F;AAAA,EACF;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,MACtE,MAAM,UAAU,UAAU,MAAM,KAAK,CAAC;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAwB;AACzC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAUD,gBAAe,KAAK,CAAC;AAC7C;AAEA,SAAS,wBACP,aACA,OACwE;AACxE,WAAS,QAAQ,YAAY,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC/D,UAAM,aAAa,YAAY,KAAK;AACpC,QACE,YAAY,SAAS,UACrB,WAAW,YAAY,MAAM,WAC7B,WAAW,aAAa,MAAM,YAC9B,WAAW,WAAW,QACtB;AACA;AAAA,IACF;AACA,QAAI,MAAM,WAAW,UAAa,WAAW,WAAW,MAAM,QAAQ;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,UAA8C;AACnF,QAAM,aAAsC,CAAC;AAC7C,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,UAAU;AAC7B;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAW,WAAW,QAAQ,SAAS;AACrC,YAAI,QAAQ,SAAS,QAAQ;AAC3B,qBAAW,KAAK;AAAA,YACd,SAAS,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAW,WAAW,QAAQ,SAAS;AACrC,mBAAW,KAAK;AAAA,UACd,SAAS,WAAW;AAAA,UACpB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ,QAAQ,UAAU,QAAQ;AAAA,UAClC,QAAQ,QAAQ,QACb;AAAA,YAAI,CAAC,SACJ,UAAU,OAAO,KAAK,OAAO,UAAU,KAAK,aAAa,WAAW;AAAA,UACtE,EACC,KAAK,IAAI;AAAA,UACZ,kBAAkB,QAAQ;AAAA,QAC5B,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,eAAW,WAAW,QAAQ,SAAS;AACrC,UAAI,QAAQ,SAAS,QAAQ;AAC3B,sCAA8B,YAAY,QAAQ,IAAI;AAAA,MACxD,WAAW,QAAQ,SAAS,aAAa;AACvC,sCAA8B,YAAY,QAAQ,MAAM,QAAQ,EAAE;AAAA,MACpE,WAAW,QAAQ,SAAS,aAAa;AACvC,mBAAW,KAAK;AAAA,UACd,SAAS,WAAW;AAAA,UACpB,MAAM;AAAA,UACN,UAAU,QAAQ,SAAS;AAAA,UAC3B,QAAQ,QAAQ,UAAU,QAAQ;AAAA,UAClC,MAAMC,YAAW,QAAQ,SAAS,SAAS;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,SACA,SACuB;AACvB,QAAM,OAAO,OAAO,YAAY,YAAY,QAAQ,SAAS,cAAc,SAAS;AACpF,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,MAAM,mBAAmB,OAAO;AAAA,EAClC;AACF;AAEA,SAAS,8BAA8B,YAAqC,OAAqB;AAC/F,QAAM,OAAO,WAAW,GAAG,EAAE;AAC7B,MAAI,MAAM,SAAS,aAAa,KAAK,SAAS,eAAe,KAAK,SAAS,SAAS;AAClF,SAAK,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK;AAChC;AAAA,EACF;AACA,aAAW,KAAK;AAAA,IACd,SAAS,WAAW;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,+BAA+B,YAAqC,MAAoB;AAC/F,QAAM,OAAO,WAAW,GAAG,EAAE;AAC7B,MACE,MAAM,SAAS,aACf,KAAK,SAAS,eACd,KAAK,SAAS,WACd,KAAK,SAAS,MACd;AACA;AAAA,EACF;AACA,aAAW,KAAK;AAAA,IACd,SAAS,WAAW;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,wBAAwB,YAAqC,SAAuB;AAC3F,WAAS,QAAQ,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC9D,UAAM,QAAQ,WAAW,KAAK;AAC9B,QAAI,OAAO,SAAS,aAAa,MAAM,SAAS,aAAa;AAC3D,iBAAW,KAAK,IAAI,EAAE,GAAG,OAAO,QAAQ;AACxC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BACP,YACA,OACA,aACM;AACN,QAAM,OAAO,WAAW,GAAG,EAAE;AAC7B,MAAI,MAAM,SAAS,gBAAgB,KAAK,eAAe,SAAS,eAAe,KAAK;AAClF,SAAK,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK;AAChC;AAAA,EACF;AACA,aAAW,KAAK;AAAA,IACd,SAAS,WAAW;AAAA,IACpB,MAAM;AAAA,IACN,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY;AAAA,IACnD,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,wBACP,YACA,UACA,QAC8D;AAC9D,WAAS,QAAQ,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC9D,UAAM,QAAQ,WAAW,KAAK;AAC9B,QAAI,OAAO,SAAS,UAAU,MAAM,aAAa,YAAY,MAAM,WAAW,QAAW;AACvF;AAAA,IACF;AACA,QAAI,WAAW,UAAa,MAAM,WAAW,QAAQ;AACnD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAA+C;AACvE,QAAM,OAAO,mBAAmB,OAAO,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,QAAQ;AACxD;AAEO,SAAS,cAAc,SAA+C;AAC3E,QAAM,QAAQ,iBAAiB,OAAO;AACtC,SAAO,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAC5C;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO,QAAQ,QACZ,QAAQ,CAAC,SAAS;AACjB,QAAI,KAAK,SAAS,UAAU,KAAK,SAAS,aAAa;AACrD,aAAO,CAAC,KAAK,IAAI;AAAA,IACnB;AACA,QAAI,KAAK,SAAS,aAAa;AAC7B,aAAO,CAAC,GAAG,KAAK,SAAS,IAAI,IAAIA,YAAW,KAAK,SAAS,SAAS,CAAC,GAAG;AAAA,IACzE;AACA,QAAI,KAAK,SAAS,eAAe;AAC/B,aAAO,KAAK,QAAQ;AAAA,QAAI,CAAC,WACvB,UAAU,SAAS,OAAO,OAAO,UAAU,OAAO,aAAa,WAAW;AAAA,MAC5E;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAASA,YAAW,OAAwB;AAC1C,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,eAAsB,gBAAgB,GAA4D;AAChG,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AAEA,MAAI,EAAE,aAAa,SAAS,CAAC,eAAe,KAAK,OAAO,GAAG;AACzD,WAAO;AAAA,MACL,OAAO,cAAc,GAAG,KAAK,eAAe,2CAA2C;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,UAA2B;AAAA,IAC/B,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK;AAAA,EAClE;AAEA,MAAI,aAAa,MAAM;AACrB,QAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,KAAK,QAAQ,MAAM,SAAS,GAAG;AAClE,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,iCAAiC,EAAE;AAAA,IAC1F;AACA,YAAQ,UAAU,KAAK;AAAA,EACzB;AAEA,MAAI,eAAe,MAAM;AACvB,QAAI,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,EAAE,WAAW,GAAG;AAC5E,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,4BAA4B,EAAE;AAAA,IACrF;AACA,QAAI,QAAQ,YAAY,QAAW;AACjC,aAAO;AAAA,QACL,OAAO,cAAc,GAAG,KAAK,eAAe,2CAA2C;AAAA,MACzF;AAAA,IACF;AACA,YAAQ,YAAY,KAAK;AAAA,EAC3B;AAEA,MAAI,YAAY,MAAM;AACpB,QAAI,OAAO,KAAK,WAAW,WAAW;AACpC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,0BAA0B,EAAE;AAAA,IACnF;AACA,YAAQ,SAAS,KAAK;AAAA,EACxB;AAEA,MAAI,cAAc,MAAM;AACtB,QAAI,CAAC,qBAAqB,KAAK,QAAQ,GAAG;AACxC,aAAO;AAAA,QACL,OAAO,cAAc,GAAG,KAAK,eAAe,yCAAyC;AAAA,MACvF;AAAA,IACF;AACA,YAAQ,WAAW,KAAK;AAAA,EAC1B;AAEA,MAAI,qBAAqB,MAAM;AAC7B,QAAI,CAAC,kBAAkB,KAAK,eAAe,GAAG;AAC5C,aAAO;AAAA,QACL,OAAO,cAAc,GAAG,KAAK,eAAe,4CAA4C;AAAA,MAC1F;AAAA,IACF;AACA,YAAQ,kBAAkB,KAAK;AAAA,EACjC;AAEA,MAAI,cAAc,MAAM;AACtB,QAAI,CAACC,cAAa,KAAK,QAAQ,GAAG;AAChC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,4BAA4B,EAAE;AAAA,IACrF;AACA,YAAQ,WAAW,KAAK;AAAA,EAC1B;AAEA,MAAI,WAAW,MAAM;AACnB,QAAI,CAAC,oBAAoB,KAAK,KAAK,GAAG;AACpC,aAAO;AAAA,QACL,OAAO,cAAc,GAAG,KAAK,eAAe,2CAA2C;AAAA,MACzF;AAAA,IACF;AACA,YAAQ,QAAQ,KAAK;AAAA,EACvB;AAEA,SAAO;AACT;;;ACjsBO,SAAS,uBACd,KACA,OAMM;AACN,MAAI;AAAA,IAAI;AAAA,IAAc,CAAC,MACrB,EAAE,KAAK;AAAA,MACL,WAAW,MAAM,UAAU,IAAI,cAAc;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,0BAA0B,CAAC,MAAM;AACvC,UAAM,WAAW,MAAM,YAAY,IAAI,EAAE,IAAI,MAAM,YAAY,CAAC;AAChE,QAAI,aAAa,QAAW;AAC1B,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AACA,WAAO,EAAE,KAAK,eAAe,QAAQ,CAAC;AAAA,EACxC,CAAC;AAED,MAAI,IAAI,+BAA+B,OAAO,MAAM;AAClD,UAAM,aAAa,EAAE,IAAI,MAAM,YAAY;AAC3C,QAAI,CAAC,MAAM,YAAY,IAAI,UAAU,GAAG;AACtC,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AACA,QAAI,MAAM,aAAa,QAAW;AAChC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,YAAY,aAAa,WAAW,OAAO;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,QAAQ,sBAAsB,EAAE,IAAI,MAAM,OAAO,CAAC;AACxD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AACA,UAAM,QAAQ,sBAAsB,EAAE,IAAI,MAAM,OAAO,CAAC;AACxD,QAAI,UAAU,OAAO;AACnB,aAAO,cAAc,GAAG,KAAK,eAAe,sCAAsC;AAAA,IACpF;AAEA,UAAM,OAAO,MAAM,MAAM,SAAS,iBAAiB;AAAA,MACjD;AAAA,MACA;AAAA,MACA,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACzC,CAAC;AACD,UAAM,OAAO,KAAK,GAAG,EAAE;AACvB,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,GAAI,KAAK,WAAW,SAAS,SAAS,SAAY,EAAE,YAAY,KAAK,SAAS,IAAI,CAAC;AAAA,IACrF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,IAAI,+BAA+B,OAAO,MAAM;AAClD,UAAM,aAAa,EAAE,IAAI,MAAM,YAAY;AAC3C,QAAI,CAAC,MAAM,YAAY,IAAI,UAAU,GAAG;AACtC,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AACA,QAAI,MAAM,aAAa,QAAW;AAChC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,YAAY,aAAa,WAAW,OAAO;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,QAAQ,sBAAsB,EAAE,IAAI,MAAM,OAAO,CAAC;AACxD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,OAAO,MAAM,MAAM,SAAS,iBAAiB,EAAE,YAAY,MAAM,CAAC;AACxE,WAAO,EAAE,KAAK,EAAE,KAAK,CAAC;AAAA,EACxB,CAAC;AAED,MAAI,KAAK,+BAA+B,OAAO,MAAM;AACnD,UAAM,WAAW,MAAM,YAAY,IAAI,EAAE,IAAI,MAAM,YAAY,CAAC;AAChE,QAAI,aAAa,QAAW;AAC1B,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AAEA,UAAM,OAAO,MAAM,wBAAwB,CAAC;AAC5C,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,WAAO,mBAAmB,GAAG,OAAO,UAAU,IAAI;AAAA,EACpD,CAAC;AAED,MAAI,KAAK,6CAA6C,OAAO,MAAM;AACjE,UAAM,WAAW,MAAM,YAAY,IAAI,EAAE,IAAI,MAAM,YAAY,CAAC;AAChE,QAAI,aAAa,QAAW;AAC1B,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AACA,QAAI,MAAM,aAAa,QAAW;AAChC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,YAAY,aAAa,WAAW,OAAO;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,2BAA2B,CAAC;AAC/C,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,cAAc,EAAE,IAAI,MAAM,OAAO;AACvC,UAAM,OAAO,MAAM,MAAM,SAAS,iBAAiB;AAAA,MACjD,YAAY,SAAS;AAAA,MACrB,OAAO;AAAA,IACT,CAAC;AACD,UAAM,YAAY,KAAK,KAAK,CAAC,QAAQ,IAAI,UAAU,WAAW;AAC9D,QAAI,cAAc,QAAW;AAC3B,aAAO,cAAc,GAAG,KAAK,aAAa,wBAAwB;AAAA,IACpE;AACA,QAAI,UAAU,WAAW,WAAW;AAClC,aAAO,cAAc,GAAG,KAAK,YAAY,sCAAsC;AAAA,IACjF;AAEA,WAAO,mBAAmB,GAAG,OAAO,UAAU;AAAA,MAC5C,OAAO,UAAU;AAAA,MACjB,GAAI,KAAK,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO;AAAA,MAC3D,UAAU,eAAe,UAAU,UAAU,KAAK,UAAU,UAAU,KAAK;AAAA,IAC7E,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,mBACb,GACA,OAIA,UACA,MACmB;AACnB,QAAM,QAAQ,WAAW,OAAO,WAAW;AAC3C,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,eAAe,IAAI,KAAK,SAAS,EAAE,YAAY;AACrD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,WAAW;AAAA,MACxB,OAAO,KAAK;AAAA,MACZ,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,IACnE,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,YAAY,SAAS;AAAA,IACrB,QAAQ;AAAA,IACR,OAAO,KAAK;AAAA,IACZ,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,IACjE,WAAW;AAAA,EACb,CAAC;AAED,MAAI,KAAK,WAAW,MAAM;AACxB,WAAO,kBAAkB,GAAG;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,MACjE,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACnE,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,MAAI;AACF,UAAM,kBAAkB,MAAM,UAAU,sBAAsB,UAAU,KAAK,CAAC;AAC9E,UAAM,SAAS,MAAM,SAAS,SAAS,IAAI,KAAK,OAAO;AAAA,MACrD,UAAU;AAAA,QACR,MAAM,QAAQ,OAAO;AACnB,gBAAM,kBAAkB,MAAM,UAAU,iBAAiB,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,QACrF;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,aAAaC,aAAY,MAAM;AACrC,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,gBAAgB,MAAM,UAAU;AAAA,MACpC;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,MACjE,WAAW;AAAA,MACX,SAAS,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,MACvC,YAAY,UAAU;AAAA,IACxB,CAAC;AACD,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,wBAAwB;AAAA,QACtB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,UAAM,WAAsC;AAAA,MAC1C;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,IACV;AACA,WAAO,EAAE,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,gBAAgB,MAAM,UAAU;AAAA,MACpC;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,OAAOC,gBAAe,KAAK;AAAA,MAC3B,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,MACjE,WAAW;AAAA,MACX,SAAS,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,MACvC,YAAY,UAAU;AAAA,IACxB,CAAC;AACD,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,qBAAqB,SAAS,IAAI,OAAO,OAAO,SAAS;AAAA,IAC3D;AACA,WAAO,cAAc,GAAG,KAAK,kBAAkB,uBAAuBA,gBAAe,KAAK,CAAC;AAAA,EAC7F;AACF;AAEA,SAAS,eAAe,UAAgD;AACtE,QAAM,QAAQ,SAAS,SAAS,MAAM;AACtC,QAAM,KAAK,SAAS;AACpB,SAAO;AAAA,IACL,GAAG,eAAe,QAAQ;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,kBACP,IACA,OAUU;AACV,SAAO,kBAAkB,kBAAkB,KAAK,CAAC;AACnD;AAEA,gBAAgB,kBAAkB,OASK;AACrC,SAAO,gBAAgB,MAAM,UAAU,sBAAsB,MAAM,UAAU,MAAM,KAAK,CAAC;AAEzF,QAAM,SAAS,IAAI,gBAAqC;AACxD,QAAM,MAAM,MAAM,SAAS,SACxB,IAAI,MAAM,OAAO;AAAA,IAChB,UAAU;AAAA,MACR,MAAM,QAAQ,OAAyB;AACrC,cAAM,MAAM,MAAM;AAAA,UAChB,MAAM;AAAA,UACN,iBAAiB,MAAM,SAAS,IAAI,MAAM,OAAO,KAAK;AAAA,QACxD;AACA,YAAI,QAAQ,QAAW;AACrB,iBAAO,KAAK,EAAE,MAAM,gBAAgB,IAAI,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAK,OAAO,WAAW;AACtB,UAAM,aAAaD,aAAY,MAAM;AACrC,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,gBAAgB,MAAM,UAAU;AAAA,MACpC,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,SAAS;AAAA,MAC3B,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,MACR,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACnE,WAAW,MAAM;AAAA,MACjB,SAAS,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,MACvC,YAAY,UAAU,MAAM;AAAA,IAC9B,CAAC;AACD,UAAM,MAAM,MAAM;AAAA,MAChB,MAAM;AAAA,MACN,wBAAwB;AAAA,QACtB,YAAY,MAAM,SAAS;AAAA,QAC3B,OAAO,MAAM;AAAA,QACb,YAAY,UAAU,MAAM;AAAA,QAC5B,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,QAAW;AACrB,aAAO,KAAK,EAAE,MAAM,gBAAgB,IAAI,CAAC;AAAA,IAC3C;AACA,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,SAAS;AAAA,MAC3B,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC,EACA,MAAM,OAAO,UAAU;AACtB,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,gBAAgB,MAAM,UAAU;AAAA,MACpC,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,SAAS;AAAA,MAC3B,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,MACb,OAAOC,gBAAe,KAAK;AAAA,MAC3B,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,MACnE,WAAW,MAAM;AAAA,MACjB,SAAS,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,MACvC,YAAY,UAAU,MAAM;AAAA,IAC9B,CAAC;AACD,UAAM,MAAM,MAAM;AAAA,MAChB,MAAM;AAAA,MACN,qBAAqB,MAAM,SAAS,IAAI,MAAM,OAAO,OAAO,MAAM,SAAS;AAAA,IAC7E;AACA,QAAI,QAAQ,QAAW;AACrB,aAAO,KAAK,EAAE,MAAM,gBAAgB,IAAI,CAAC;AAAA,IAC3C;AACA,WAAO,KAAK,EAAE,MAAM,SAAS,OAAOA,gBAAe,KAAK,EAAE,CAAwB;AAAA,EACpF,CAAC,EACA,QAAQ,MAAM,OAAO,MAAM,CAAC;AAE/B,MAAI;AACF,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,UAAI,KAAK,SAAS,MAAM;AACtB;AAAA,MACF;AACA,YAAM,KAAK;AAAA,IACb;AAAA,EACF,UAAE;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,gBACb,OACA,OACA;AACA,SAAO,OAAO,gBAAgB,KAAK;AACrC;AAEA,eAAe,wBACb,GACyD;AACzD,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AACA,MAAI,EAAE,WAAW,SAAS,CAACC,aAAY,KAAK,KAAK,GAAG;AAClD,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,+BAA+B,EAAE;AAAA,EACxF;AAEA,QAAM,UAAoC;AAAA,IACxC,OAAO,KAAK;AAAA,EACd;AACA,MAAI,YAAY,MAAM;AACpB,QAAI,OAAO,KAAK,WAAW,WAAW;AACpC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,0BAA0B,EAAE;AAAA,IACnF;AACA,YAAQ,SAAS,KAAK;AAAA,EACxB;AACA,MAAI,cAAc,MAAM;AACtB,QAAI,CAACC,cAAa,KAAK,QAAQ,GAAG;AAChC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,4BAA4B,EAAE;AAAA,IACrF;AACA,YAAQ,WAAW,KAAK;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,eAAe,2BACb,GAC4D;AAC5D,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AAEA,QAAM,UAAuC,CAAC;AAC9C,MAAI,YAAY,MAAM;AACpB,QAAI,OAAO,KAAK,WAAW,WAAW;AACpC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,0BAA0B,EAAE;AAAA,IACnF;AACA,YAAQ,SAAS,KAAK;AAAA,EACxB;AACA,MAAI,cAAc,MAAM;AACtB,QAAI,CAACA,cAAa,KAAK,QAAQ,GAAG;AAChC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,4BAA4B,EAAE;AAAA,IACrF;AACA,YAAQ,WAAW,KAAK;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,eACP,gBACA,iBACA,aACY;AACZ,SAAO;AAAA,IACL,GAAI,kBAAkB,CAAC;AAAA,IACvB,GAAI,mBAAmB,CAAC;AAAA,IACxB,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,sBAAsB,OAA+C;AAC5E,MAAI,UAAU,UAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,OAAO,GAAI;AAC7B;AAEA,SAAS,sBAAsB,OAAuD;AACpF,MAAI,UAAU,UAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAASD,aAAY,OAAoC;AACvD,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO,OAAO,SAAS,KAAK,KAAK,OAAO,UAAU;AAAA,EACpD;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,MAAMA,YAAW;AAAA,EAChC;AACA,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,SAAS,SAAS,UAAaA,aAAY,IAAI,CAAC;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAASF,aAAY,OAA2B;AAC9C,MAAIE,aAAY,KAAK,GAAG;AACtB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAC/C,WAAOA,aAAY,MAAM,IAAI,SAAS,OAAO,KAAK;AAAA,EACpD,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;;;AC9gBA,SAAS,cAAAE,mBAAmC;AAE5C,SAAS,iBAAAC,sBAAqB;AAmDvB,SAAS,uBAAuB,KAAW,WAAkC;AAClF,MAAI,IAAI,cAAc,CAAC,MAAM;AAC3B,UAAM,SAAS,oBAAoB,EAAE,IAAI,MAAM,QAAQ,CAAC;AACxD,QAAI,WAAW,OAAO;AACpB,aAAO,cAAc,GAAG,KAAK,eAAe,oCAAoC;AAAA,IAClF;AAEA,UAAM,UAA+B,CAAC;AACtC,UAAM,QAAQ,oBAAoB,EAAE,IAAI,MAAM,OAAO,CAAC;AACtD,UAAM,UAAU,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;AAC1D,UAAM,YAAY,oBAAoB,EAAE,IAAI,MAAM,WAAW,CAAC;AAC9D,QAAI,WAAW,QAAW;AACxB,cAAQ,SAAS;AAAA,IACnB;AACA,QAAI,UAAU,QAAW;AACvB,cAAQ,QAAQ;AAAA,IAClB;AACA,QAAI,YAAY,QAAW;AACzB,cAAQ,UAAU;AAAA,IACpB;AACA,QAAI,cAAc,QAAW;AAC3B,cAAQ,YAAY;AAAA,IACtB;AAEA,WAAO,EAAE,KAAK,EAAE,WAAW,UAAU,KAAK,OAAO,EAAE,CAAC;AAAA,EACtD,CAAC;AAED,MAAI,KAAK,iCAAiC,OAAO,MAAM;AACrD,UAAM,OAAO,MAAM,2BAA2B,CAAC;AAC/C,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,SAAS,UAAU,OAAO,EAAE,IAAI,MAAM,YAAY,GAAG,KAAK,OAAO;AACvE,QAAI,WAAW,WAAW;AACxB,aAAO,cAAc,GAAG,KAAK,aAAa,oBAAoB;AAAA,IAChE;AACA,QAAI,WAAW,YAAY;AACzB,aAAO,cAAc,GAAG,KAAK,YAAY,8BAA8B;AAAA,IACzE;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,oBACP,OAC4C;AAC5C,QAAM,SAAS,oBAAoB,KAAK;AACxC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,SAAO,WAAW,aAAa,WAAW,aAAa,SAAS;AAClE;AAEA,eAAe,2BACb,GACwE;AACxE,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG;AAChC,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,0BAA0B,EAAE;AAAA,EACnF;AAEA,QAAM,UAAsC,CAAC;AAC7C,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,CAAC,SAAS,MAAM,GAAG;AACrB,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,8BAA8B,EAAE;AAAA,IACvF;AACA,QAAI,OAAO,OAAO,eAAe,YAAY,OAAO,WAAW,KAAK,EAAE,WAAW,GAAG;AAClF,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,6BAA6B,EAAE;AAAA,IACtF;AACA,QAAI,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK,EAAE,WAAW,GAAG;AAC1E,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,yBAAyB,EAAE;AAAA,IAClF;AACA,QAAI,YAAY,UAAU,OAAO,OAAO,WAAW,UAAU;AAC3D,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,yBAAyB,EAAE;AAAA,IAClF;AACA,QAAI,YAAY,UAAU,OAAO,OAAO,WAAW,WAAW;AAC5D,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,0BAA0B,EAAE;AAAA,IACnF;AACA,YAAQ,KAAK;AAAA,MACX,YAAY,OAAO,WAAW,KAAK;AAAA,MACnC,QAAQ,OAAO,OAAO,KAAK;AAAA,MAC3B,GAAI,OAAO,OAAO,WAAW,WAAW,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,MACrE,GAAI,OAAO,OAAO,WAAW,YAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ;AACnB;AAEO,SAAS,wBAAyC;AACvD,QAAM,YAAY,oBAAI,IAAkD;AAExE,SAAO;AAAA,IACL;AAAA,IACA,WAAW,SAAS;AAClB,aAAOC,YAAW;AAAA,QAChB,MAAM,WAAW,EAAE,UAAU,YAAY,gBAAgB,MAAM,MAAM,QAAQ,GAAG;AAC9E,cAAI,aAAa,gBAAgB;AAC/B,mBAAO,QAAQ,IAAI;AAAA,UACrB;AAEA,gBAAM,UAAU,yBAAyBC,eAAc,IAAI,CAAC;AAC5D,cAAI,WAAW,SAAS;AACtB,mBAAO,QAAQ,KAAK,QAAQ,KAAK;AAAA,UACnC;AAEA,gBAAM,UAAU,MAAM,gBAAgB,WAAW,SAAS;AAAA,YACxD;AAAA,YACA,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,YACjD;AAAA,YACA;AAAA,YACA,WAAW,QAAQ;AAAA,UACrB,CAAC;AAED,iBAAO,QAAQ,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK,SAAS;AACZ,aAAO,CAAC,GAAG,UAAU,OAAO,CAAC,EAC1B,OAAO,CAAC,aAAa;AACpB,YAAI,QAAQ,WAAW,aAAa,SAAS,WAAW,WAAW;AACjE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,WAAW,cAAc,SAAS,WAAW,WAAW;AAClE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,UAAU,UAAa,SAAS,UAAU,QAAQ,OAAO;AACnE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,YAAY,UAAa,SAAS,YAAY,QAAQ,SAAS;AACzE,iBAAO;AAAA,QACT;AACA,YAAI,QAAQ,cAAc,UAAa,SAAS,cAAc,QAAQ,WAAW;AAC/E,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC,EACA,IAAI,cAAc;AAAA,IACvB;AAAA,IACA,OAAO,IAAI,SAAS;AAClB,YAAM,WAAW,UAAU,IAAI,EAAE;AACjC,UAAI,aAAa,QAAW;AAC1B,eAAO;AAAA,MACT;AACA,UAAI,CAAC,kBAAkB,QAAQ,GAAG;AAChC,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,gBAAgB,UAAU,OAAO;AAClD,gBAAU,IAAI,IAAI,QAAQ;AAC1B,eAAS,OAAO,EAAE,MAAM,wBAAwB,UAAU,SAAS,CAAC;AACpE,eAAS,QAAQ,OAAO;AACxB,aAAO,eAAe,QAAQ;AAAA,IAChC;AAAA,EACF;AACF;AAEA,eAAe,gBACb,WACA,SACA,SACqC;AACrC,QAAM,KAAK,WAAW,OAAO,WAAW;AACxC,QAAM,WAA4B;AAAA,IAChC;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,GAAI,QAAQ,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,IAC1E,UAAU,QAAQ;AAAA,IAClB,GAAI,QAAQ,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,WAAW;AAAA,IACzE,gBAAgB,QAAQ;AAAA,IACxB,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ;AAAA,IACnB,QAAQ;AAAA,IACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC3D,SAAS,MAAM;AAAA,IAAC;AAAA,EAClB;AAEA,QAAM,SAAS,IAAI,QAAoC,CAACC,aAAY;AAClE,aAAS,UAAU,CAAC,YAAY;AAC9B,MAAAA,SAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAED,YAAU,IAAI,IAAI,QAAQ;AAC1B,UAAQ,OAAO,EAAE,MAAM,yBAAyB,UAAU,eAAe,QAAQ,EAAE,CAAC;AACpF,SAAO;AACT;AAEA,SAAS,yBACP,MAC+D;AAC/D,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,sDAAsD;AAAA,EACxE;AAEA,QAAM,eAAe,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC,IAAI;AAC3E,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,EAAE,OAAO,+CAA+C;AAAA,EACjE;AAEA,QAAM,YAAwC,CAAC;AAC/C,aAAW,CAAC,OAAO,QAAQ,KAAK,aAAa,QAAQ,GAAG;AACtD,UAAM,aAAa,wBAAwB,UAAU,KAAK;AAC1D,QAAI,eAAe,QAAW;AAC5B,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AACA,cAAU,KAAK,UAAU;AAAA,EAC3B;AACA,SAAO,EAAE,UAAU;AACrB;AAEA,SAAS,wBACP,OACA,OACsC;AACtC,MACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,aAAa,YAC1B,MAAM,SAAS,KAAK,EAAE,WAAW,GACjC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IACvC,MAAM,QACH,IAAI,uBAAuB,EAC3B,OAAO,CAAC,WAA+C,WAAW,MAAS,IAC9E,CAAC;AACL,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IACE,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,KAAK,EAAE,SAAS,IACrD,MAAM,GAAG,KAAK,IACd,YAAY,QAAQ,CAAC;AAAA,IAC3B,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAsD;AACrF,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,WAAO,EAAE,OAAO,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,EAAE;AAAA,EACpD;AACA,MAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1F,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,OAAO,MAAM,MAAM,KAAK;AAAA,IACxB,OACE,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,EAAE,SAAS,IAC3D,MAAM,MAAM,KAAK,IACjB,MAAM,MAAM,KAAK;AAAA,EACzB;AACF;AAEA,SAAS,kBACP,UAC6B;AAC7B,SAAO,aAAa,UAAa,SAAS,WAAW,aAAa,aAAa;AACjF;AAEA,SAAS,gBACP,UACA,SACoB;AACpB,SAAO,eAAe;AAAA,IACpB,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,UAAoE;AAC1F,QAAM,EAAE,MAAM,SAAAA,UAAS,GAAG,KAAK,IAAI;AACnC,OAAK;AACL,OAAKA;AACL,SAAO;AACT;;;ACnVA,eAAsB,iBACpB,OACA,OAC4C;AAC5C,SAAO,OAAO,mBAAmB,KAAK;AACxC;AAEA,gBAAuB,qBAAqB,OAML;AACrC,SAAO,QAAQ,MAAM,OAAO,cAAc,MAAM,SAAS,MAAM,KAAK,CAAC;AACrE,SAAO,QAAQ,MAAM,OAAO,gBAAgB,MAAM,SAAS,MAAM,KAAK,CAAC;AAEvE,MAAI;AACF,qBAAiB,SAAS,MAAM,QAAQ;AACtC,iBAAW,SAAS,oBAAoB;AAAA,QACtC;AAAA,QACA,OAAO,MAAM;AAAA,QACb,WAAW,MAAM,QAAQ;AAAA,QACzB,WAAW,MAAM;AAAA,MACnB,CAAC,GAAG;AACF,eAAO,QAAQ,MAAM,OAAO,KAAK;AAAA,MACnC;AACA,YAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,MAAM,QAAQ,IAAI,MAAM,OAAO,OAAO,MAAM,SAAS;AAAA,IACpE;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,kBACd,SAC6B;AAC7B,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUC,eAAc;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ,UAAU;AAAA,MAC5B,aAAa,QAAQ,OAAO,UAAU;AAAA,IACxC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,eAAe,OAUC;AAC9B,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUA,eAAc;AAAA,MACtB,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,SAAS,eAAe,MAAM,OAAO;AAAA,MACrC,UAAU,MAAM;AAAA,MAChB,iBAAiB,MAAM;AAAA,MACvB,UAAU,MAAM;AAAA,MAChB,cAAc,OAAO,KAAK,MAAM,YAAY,CAAC,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,cAAc,SAAwB,OAA4C;AAChG,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUA,eAAc;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,sBAAsB,QAAQ;AAAA,IAChC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,gBACd,SACA,OAC6B;AAC7B,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUA,eAAc;AAAA,MACtB,cAAc,QAAQ;AAAA,MACtB,mBAAmB,QAAQ,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,gBAAgB,OAOA;AAC9B,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUA,eAAc;AAAA,MACtB,YAAY,MAAM;AAAA,MAClB,OAAO,aAAa,MAAM,KAAK;AAAA,MAC/B,aAAaC,YAAW,MAAM,MAAM;AAAA,MACpC,cAAc,MAAM;AAAA,IACtB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,eAAe,OAIC;AAC9B,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUD,eAAc;AAAA,MACtB,cAAc,MAAM;AAAA,IACtB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,aACd,WACA,OACA,OACA,WAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAUA,eAAc;AAAA,MACtB,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,OAAOE,gBAAe,KAAK;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBAAoB,OAKK;AAChC,QAAM,EAAE,OAAO,WAAW,MAAM,IAAI;AACpC,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,QAAQ,MAAM,IAAI;AAAA,QAC3B,UAAUF,eAAc;AAAA,UACtB,MAAM,MAAM;AAAA,UACZ,QAAQ,eAAe,MAAM,MAAM;AAAA,UACnC,cAAc,MAAM,QAAQ;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,QAAQ,MAAM,SAAS,SAAS,IAAI;AAAA,QAC7C,UAAUA,eAAc;AAAA,UACtB,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM,SAAS,SAAS;AAAA,UAClC,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,UAChD,eAAeC,YAAWE,eAAc,MAAM,SAAS,SAAS,SAAS,CAAC;AAAA,QAC5E,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,QAAQ,MAAM,QAAQ;AAAA,QAC/B,UAAUH,eAAc;AAAA,UACtB,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,gBAAgB,MAAM;AAAA,UACtB,eAAeC,YAAW,MAAM,IAAI;AAAA,UACpC,aAAaA,YAAW,MAAM,MAAM;AAAA,UACpC,uBACE,MAAM,qBAAqB,SACvB,SACAA,YAAW,KAAK,UAAU,MAAM,gBAAgB,CAAC;AAAA,QACzD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,cAAc,MAAM,IAAI;AAAA,QACjC,UAAUD,eAAc;AAAA,UACtB,MAAM,MAAM;AAAA,UACZ,cAAc,MAAM,SAAS,OAAO;AAAA,UACpC,OAAO,aAAa,MAAM,SAAS,KAAK;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,QAC/B,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,cAAc,MAAM,SAAS;AAAA,MAC/B,CAAC;AAAA,MACD,eAAe,EAAE,WAAW,OAAO,cAAc,MAAM,SAAS,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO,CAAC,aAAa,WAAW,OAAO,MAAM,OAAO,MAAM,SAAS,CAAC;AAAA,EACtE;AACA,MAAI,MAAM,SAAS,yBAAyB;AAC1C,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,0BAA0B,MAAM,SAAS,QAAQ;AAAA,QAC1D,UAAUA,eAAc;AAAA,UACtB,YAAY,MAAM,SAAS;AAAA,UAC3B,UAAU,MAAM,SAAS;AAAA,UACzB,QAAQ,MAAM,SAAS;AAAA,UACvB,QAAQ,MAAM,SAAS;AAAA,UACvB,WAAW,MAAM,SAAS,WAAW;AAAA,UACrC,eAAeC,YAAW,MAAM,SAAS,IAAI;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,wBAAwB;AACzC,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO,MAAM,SAAS,WAAW,aAAa,SAAS;AAAA,QACvD,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,YAAY,MAAM,SAAS,MAAM,QAAQ,MAAM,SAAS,QAAQ;AAAA,QACzE,UAAUD,eAAc;AAAA,UACtB,YAAY,MAAM,SAAS;AAAA,UAC3B,UAAU,MAAM,SAAS;AAAA,UACzB,QAAQ,MAAM,SAAS;AAAA,UACvB,QAAQ,MAAM,SAAS;AAAA,UACvB,WAAW,MAAM,SAAS,WAAW;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,yBAAyB;AAC1C,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,yBAAyB,MAAM,SAAS,QAAQ;AAAA,QACzD,UAAUA,eAAc;AAAA,UACtB,YAAY,MAAM,SAAS;AAAA,UAC3B,UAAU,MAAM,SAAS;AAAA,UACzB,QAAQ,MAAM,SAAS;AAAA,UACvB,QAAQ,MAAM,SAAS;AAAA,UACvB,eAAe,MAAM,SAAS,UAAU;AAAA,UACxC,eAAeC,YAAW,MAAM,SAAS,IAAI;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,wBAAwB;AACzC,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,yBAAyB,MAAM,SAAS,QAAQ;AAAA,QACzD,UAAUD,eAAc;AAAA,UACtB,YAAY,MAAM,SAAS;AAAA,UAC3B,UAAU,MAAM,SAAS;AAAA,UACzB,QAAQ,MAAM,SAAS;AAAA,UACvB,QAAQ,MAAM,SAAS;AAAA,UACvB,aAAa,MAAM,SAAS,SAAS,UAAU;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,oBAAoB;AACrC,WAAO,cAAc,OAAO,WAAW,KAAK;AAAA,EAC9C;AACA,SAAO,CAAC;AACV;AAEA,gBAAgB,QACd,OACA,OACoC;AACpC,QAAM,MAAM,MAAM,iBAAiB,OAAO,KAAK;AAC/C,MAAI,QAAQ,QAAW;AACrB,UAAM,EAAE,MAAM,eAAe,IAAI;AAAA,EACnC;AACF;AAEA,SAAS,cACP,OACA,WACA,OAC+B;AAC/B,QAAM,QAAQ,MAAM;AACpB,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,eAAe,MAAM,aAAa,MAAM,OAAO,WAAW,MAAM,SAAS,SAAS,IAAI;AAAA,QAC/F,UAAUA,eAAc;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,SAAS,MAAM;AAAA,UACf,cAAc,MAAM,cAAc;AAAA,UAClC,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM,SAAS,SAAS;AAAA,UAClC,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,UAChD,eAAeC,YAAWE,eAAc,MAAM,SAAS,SAAS,SAAS,CAAC;AAAA,QAC5E,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,eAAe,MAAM,aAAa,MAAM,OAAO,cAAc,MAAM,QAAQ;AAAA,QACpF,UAAUH,eAAc;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,SAAS,MAAM;AAAA,UACf,cAAc,MAAM,cAAc;AAAA,UAClC,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,aAAaC,YAAW,MAAM,MAAM;AAAA,UACpC,uBACE,MAAM,qBAAqB,SACvB,SACAA,YAAW,KAAK,UAAU,MAAM,gBAAgB,CAAC;AAAA,QACzD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,eAAe,MAAM,aAAa,MAAM,OAAO,SAAS,MAAM,IAAI;AAAA,QAC3E,UAAUD,eAAc;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,SAAS,MAAM;AAAA,UACf,cAAc,MAAM,cAAc;AAAA,UAClC,WAAW,MAAM;AAAA,UACjB,cAAc,MAAM,QAAQ;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,eAAe,MAAM,aAAa,MAAM,OAAO;AAAA,QACxD,UAAUA,eAAc;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,SAAS,MAAM;AAAA,UACf,cAAc,MAAM,cAAc;AAAA,UAClC,OAAO,aAAa,MAAM,KAAK;AAAA,UAC/B,aAAaC,YAAW,MAAM,MAAM;AAAA,UACpC,cAAc,MAAM,SAAS;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,eAAe,MAAM,aAAa,MAAM,OAAO;AAAA,QACxD,UAAUD,eAAc;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,SAAS,MAAM;AAAA,UACf,cAAc,MAAM,cAAc;AAAA,UAClC,OAAOE,gBAAe,MAAM,KAAK;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,eAAe,SAAuC;AAC7D,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAYD,YAAW,OAAO;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,aAAa,MAAM,QAAQ,QAAQ,OAAO,IAAI,UAAU;AAAA,IACxD,WAAW,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,QAAQ,SAAS;AAAA,IACrE,YAAYA,YAAWE,eAAc,QAAQ,OAAO,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,MAAI,UAAU,UAAa,UAAU,QAAQ,OAAO,UAAU,UAAU;AACtE,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,SAAOH,eAAc;AAAA,IACnB,aAAa,aAAa,OAAO,WAAW;AAAA,IAC5C,cAAc,aAAa,OAAO,YAAY;AAAA,IAC9C,aAAa,aAAa,OAAO,WAAW;AAAA,IAC5C,mBAAmB,aAAa,OAAO,iBAAiB;AAAA,IACxD,0BAA0B,aAAa,OAAO,wBAAwB;AAAA,EACxE,CAAC;AACH;AAEA,SAASA,eAAc,OAA4C;AACjE,QAAM,UAAsB,CAAC;AAC7B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,SAAS,QAAW;AACtB;AAAA,IACF;AACA,UAAM,YAAY,eAAe,IAAI;AACrC,QAAI,cAAc,QAAW;AAC3B,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuC;AAC7D,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MACJ,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,EAClC,OAAO,CAAC,SAA4B,SAAS,MAAS;AAAA,EAC3D;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAOA,eAAc,KAAgC;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAoC;AACxD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAASC,YAAW,OAAmC;AACrD,SAAO,UAAU,SAAY,IAAI,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE;AACnE;AAEA,SAASE,eAAc,OAAwB;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;;;ACrjBO,SAAS,sBACd,KACA,OAKM;AACN,MAAI,IAAI,aAAa,OAAO,MAAM;AAChC,UAAM,UAAU,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;AAC1D,QAAI,YAAY,UAAa,CAAC,MAAM,SAAS,IAAI,OAAO,GAAG;AACzD,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,WAAW,MAAM,MAAM,aAAa,aAAa;AAAA,MACrD,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC3C;AAAA,IACF,CAAC;AACD,WAAO,EAAE,KAAK,EAAE,SAAS,CAAC;AAAA,EAC5B,CAAC;AAED,MAAI,KAAK,aAAa,OAAO,MAAM;AACjC,UAAM,OAAO,MAAM,0BAA0B,CAAC;AAC9C,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AACA,QAAI,CAAC,MAAM,SAAS,IAAI,KAAK,OAAO,GAAG;AACrC,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,UAAM,UAAU,MAAM,MAAM,aAAa,cAAc;AAAA,MACrD,IAAI,WAAW,OAAO,WAAW;AAAA,MACjC,SAAS,KAAK;AAAA,MACd,GAAI,KAAK,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;AAAA,MACxD,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,IACnE,CAAC;AACD,UAAM,iBAAiB,MAAM,cAAc,kBAAkB,OAAO,CAAC;AACrE,WAAO,EAAE,KAAK,SAAS,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,MAAM;AAC3C,UAAM,UAAU,MAAM,MAAM,aAAa,WAAW,EAAE,IAAI,MAAM,WAAW,CAAC;AAC5E,QAAI,YAAY,QAAW;AACzB,aAAO,cAAc,GAAG,KAAK,aAAa,mBAAmB;AAAA,IAC/D;AACA,WAAO,EAAE,KAAK,OAAO;AAAA,EACvB,CAAC;AAED,MAAI,IAAI,6BAA6B,OAAO,MAAM;AAChD,UAAM,YAAY,EAAE,IAAI,MAAM,WAAW;AACzC,UAAM,UAAU,MAAM,MAAM,aAAa,WAAW,SAAS;AAC7D,QAAI,YAAY,QAAW;AACzB,aAAO,cAAc,GAAG,KAAK,aAAa,mBAAmB;AAAA,IAC/D;AACA,QAAI,MAAM,aAAa,oBAAoB,QAAW;AACpD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,YAAY,YAAY,WAAW,OAAO;AAAA,MAC9C;AAAA,IACF;AAEA,UAAM,QAAQ,qBAAqB,EAAE,IAAI,MAAM,OAAO,CAAC;AACvD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AACA,UAAM,QAAQ,qBAAqB,EAAE,IAAI,MAAM,OAAO,CAAC;AACvD,QAAI,UAAU,OAAO;AACnB,aAAO,cAAc,GAAG,KAAK,eAAe,sCAAsC;AAAA,IACpF;AAEA,UAAM,OAAO,MAAM,MAAM,aAAa,gBAAgB;AAAA,MACpD;AAAA,MACA;AAAA,MACA,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACzC,CAAC;AACD,UAAM,OAAO,KAAK,GAAG,EAAE;AACvB,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,GAAI,KAAK,WAAW,SAAS,SAAS,SAAY,EAAE,YAAY,KAAK,SAAS,IAAI,CAAC;AAAA,IACrF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,OAAO,wBAAwB,OAAO,MAAM;AAC9C,QAAI,MAAM,aAAa,kBAAkB,QAAW;AAClD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,YAAY,YAAY,WAAW,SAAS;AAAA,MAChD;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,MAAM,aAAa,cAAc,EAAE,IAAI,MAAM,WAAW,CAAC;AAC/E,QAAI,CAAC,SAAS;AACZ,aAAO,cAAc,GAAG,KAAK,aAAa,mBAAmB;AAAA,IAC/D;AACA,WAAO,EAAE,KAAK,MAAM,GAAG;AAAA,EACzB,CAAC;AAED,MAAI,IAAI,+BAA+B,OAAO,MAAM;AAClD,QAAI,MAAM,eAAe,QAAW;AAClC,aAAO,sBAAsB,GAAG,QAAQ;AAAA,IAC1C;AACA,UAAM,YAAY,EAAE,IAAI,MAAM,WAAW;AACzC,UAAM,UAAU,MAAM,MAAM,aAAa,WAAW,SAAS;AAC7D,QAAI,YAAY,QAAW;AACzB,aAAO,cAAc,GAAG,KAAK,aAAa,mBAAmB;AAAA,IAC/D;AAEA,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,SAAS,MAAM,MAAM,WAAW,kBAAkB,EAAE,WAAW,MAAM,CAAC;AAC5E,WAAO,EAAE,KAAK,EAAE,OAAO,CAAC;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,qBAAqB,OAA+C;AAC3E,MAAI,UAAU,UAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,OAAO,GAAI;AAC7B;AAEA,SAAS,qBAAqB,OAAuD;AACnF,MAAI,UAAU,UAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,0BAA0B,GAOvC;AACA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AAEA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AAEA,MAAI,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,KAAK,EAAE,WAAW,GAAG;AACxE,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,0BAA0B,EAAE;AAAA,EACnF;AAEA,QAAM,UAAsE;AAAA,IAC1E,SAAS,KAAK,QAAQ,KAAK;AAAA,EAC7B;AACA,MAAI,WAAW,MAAM;AACnB,QAAI,OAAO,KAAK,UAAU,UAAU;AAClC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,wBAAwB,EAAE;AAAA,IACjF;AACA,UAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AACA,MAAI,cAAc,MAAM;AACtB,QAAI,CAACC,cAAa,KAAK,QAAQ,GAAG;AAChC,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,4BAA4B,EAAE;AAAA,IACrF;AACA,YAAQ,WAAW,KAAK;AAAA,EAC1B;AACA,SAAO;AACT;;;ACpMO,SAAS,qBACd,KACA,OAMM;AACN,MAAI,IAAI,WAAW,OAAO,MAAM;AAC9B,UAAM,UAA+B;AAAA,MACnC,QAAQ;AAAA,QACN,IAAI,SAAS,MAAM,OAAO;AAAA,QAC1B,GAAI,MAAM,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,QAAQ,KAAK;AAAA,QACvE,GAAI,MAAM,QAAQ,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,MAClF;AAAA,MACA,SAAS;AAAA,QACP,GAAI,MAAM,OAAO,UAAU,SAAS,SAChC,CAAC,IACD,EAAE,UAAU,MAAM,OAAO,SAAS,KAAK;AAAA,QAC3C,GAAI,MAAM,OAAO,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO,OAAO,KAAK;AAAA,QACtF,GAAI,MAAM,OAAO,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,YAAY;AAAA,QAC/E,GAAI,MAAM,OAAO,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,YAAY;AAAA,MACjF;AAAA,MACA,QAAQ;AAAA,QACN,QAAQ,MAAM,OAAO;AAAA,QACrB,WAAW,MAAM,UAAU;AAAA,QAC3B,GAAI,MAAM,OAAO,aAAa,SAC1B,CAAC,IACD,EAAE,WAAW,MAAM,MAAM,OAAO,SAAS,aAAa,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,QAClF,GAAI,MAAM,OAAO,QAAQ,eAAe,SACpC,CAAC,IACD,EAAE,SAAS,MAAM,MAAM,OAAO,OAAO,WAAW,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,QAC5E,GAAI,MAAM,OAAO,iBAAiB,UAAa,MAAM,UAAU,WAAW,IACtE,CAAC,IACD;AAAA,UACE,eACE,MAAM,QAAQ;AAAA,YACZ,MAAM,UAAU;AAAA,cAAI,CAAC,aACnB,MAAM,OAAO,cAAc,iBAAiB;AAAA,gBAC1C,YAAY,SAAS;AAAA,gBACrB,OAAO;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF,GACA,OAAO,CAAC,KAAK,SAAS,OAAO,MAAM,UAAU,IAAI,CAAC;AAAA,QACtD;AAAA,MACN;AAAA,MACA,cAAc,iBAAiB,MAAM,SAAS,MAAM,QAAQ,MAAM,WAAW,MAAM,MAAM;AAAA,MACzF,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AACA,WAAO,EAAE,KAAK,OAAO;AAAA,EACvB,CAAC;AACH;;;ACnDO,SAAS,mBACd,KACA,OAGM;AACN,MAAI,IAAI,0BAA0B,OAAO,MAAM;AAC7C,UAAM,UAAU,EAAE,IAAI,MAAM,SAAS;AACrC,UAAM,QAAQ,MAAM,SAAS,IAAI,OAAO;AACxC,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,OAAO,MAAM,kBAAkB,KAAK;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,yCAAyC,OAAO,MAAM;AAC7D,UAAM,UAAU,EAAE,IAAI,MAAM,SAAS;AACrC,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAM,QAAQ,MAAM,SAAS,IAAI,OAAO;AACxC,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AACA,QAAI,MAAM,MAAM,QAAQ,QAAQ,MAAM,QAAW;AAC/C,aAAO,cAAc,GAAG,KAAK,aAAa,gBAAgB;AAAA,IAC5D;AAEA,UAAM,OAAO,MAAM,oBAAoB,CAAC;AACxC,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,YAAY,IAAI,KAAK,OAAO,EAAE,YAAY;AAChD,UAAM,SAAoB,CAAC;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,MAAM,MAAM,SAAS,UAAU,KAAK,UAAU,KAAK,IAAI,GAAG;AAAA,QAC7E,gBAAgB,OAAO;AACrB,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,YAAM,QAAQ,KAAK,IAAI;AACvB,aAAO,EAAE,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQC,aAAY,MAAM;AAAA,QAC1B,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,SAAS,IAAI,KAAK,KAAK,EAAE,YAAY;AAAA,QACrC,QAAQ,OAAO,IAAIA,YAAW;AAAA,MAChC,CAAiC;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,QAAQ,KAAK,IAAI;AACvB,aAAO,EAAE;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,OAAO,iBAAiB,KAAK;AAAA,UAC7B,YAAY,QAAQ;AAAA,UACpB;AAAA,UACA,SAAS,IAAI,KAAK,KAAK,EAAE,YAAY;AAAA,UACrC,QAAQ,OAAO,IAAIA,YAAW;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAe,oBACb,GACqD;AACrD,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,EAAE,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,EACpF;AACA,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO,EAAE,MAAM,CAAC,EAAE;AAAA,EACpB;AACA,MAAI,CAACC,cAAa,IAAI,GAAG;AACvB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,gCAAgC,EAAE;AAAA,EACzF;AACA,QAAM,OAAO,OAAO,OAAO,MAAM,MAAM,IAAI,KAAK,OAAO,CAAC;AACxD,MAAI,CAACC,aAAY,IAAI,GAAG;AACtB,WAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,8BAA8B,EAAE;AAAA,EACvF;AACA,QAAM,UAAgC,EAAE,KAAK;AAC7C,MAAI,OAAO,OAAO,MAAM,SAAS,GAAG;AAClC,QAAI,CAACD,cAAa,KAAK,OAAO,GAAG;AAC/B,aAAO,EAAE,OAAO,cAAc,GAAG,KAAK,eAAe,2BAA2B,EAAE;AAAA,IACpF;AACA,YAAQ,UAAU,KAAK;AAAA,EACzB;AACA,SAAO;AACT;AAEA,eAAsB,kBAAkB,OAAwD;AAC9F,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,WAAsC,CAAC;AAC7C,aAAW,EAAE,MAAM,OAAO,KAAK,eAAe,KAAK,GAAG;AACpD,UAAM,MAAM,GAAG,MAAM,IAAI,KAAK,IAAI;AAClC,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AACZ,UAAM,aAAa,MAAM,KAAK,WAAW,EAAE;AAC3C,aAAS,KAAK;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,aAAa,WAAW;AAAA,MACxB,YAAY,WAAW;AAAA,MACvB;AAAA,MACA,UAAU,iBAAiB,IAAI;AAAA,IACjC,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,KAAK,CAAC,MAAM,UAAU;AACpC,QAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,aAAO,KAAK,WAAW,WAAW,KAAK;AAAA,IACzC;AACA,WAAO,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EAC3C,CAAC;AACH;;;ACxIO,SAAS,oBAAoB,KAAW,YAAoC;AACjF,MAAI,IAAI,WAAW,OAAO,MAAM;AAC9B,QAAI,WAAW,eAAe,QAAW;AACvC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,YAAY,UAAU,WAAW,OAAO;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,EAAE,IAAI,MAAM,OAAO,CAAC;AAC7C,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,SAAS,iBAAiB,EAAE,IAAI,MAAM,QAAQ,CAAC;AACrD,QAAI,WAAW,OAAO;AACpB,aAAO,cAAc,GAAG,KAAK,eAAe,2CAA2C;AAAA,IACzF;AAEA,UAAM,UAAU,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;AAC1D,UAAM,YAAY,oBAAoB,EAAE,IAAI,MAAM,WAAW,CAAC;AAC9D,UAAM,SAAS,MAAM,WAAW,WAAW;AAAA,MACzC;AAAA,MACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC3C,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,MAC/C,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,IAC3C,CAAC;AACD,WAAO,EAAE,KAAK,EAAE,OAAO,CAAC;AAAA,EAC1B,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAM;AACvC,UAAM,QAAQ,MAAM,WAAW,SAAS,EAAE,IAAI,MAAM,SAAS,CAAC;AAC9D,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AACA,WAAO,EAAE,KAAK,KAAK;AAAA,EACrB,CAAC;AACH;;;AvBgDO,IAAM,SAAN,MAAoC;AAAA,EACxB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAA0B,CAAC,GAAG,UAAyB,CAAC,GAAG;AACrE,SAAK,UAAU,yBAAyB,SAAS,OAAO;AACxD,SAAK,SAAS,gBAAgB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,IAAI,MAAY;AACd,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,SAAgD;AACpD,WAAO,KAAK,OAAO,MAAM,OAAO;AAAA,EAClC;AAAA,EAEA,SAAuB;AACrB,WAAO,KAAK,OAAO,OAAO;AAAA,EAC5B;AAAA,EAEA,gBAAqC;AACnC,WAAO,IAAI,oBAAoB;AAAA,MAC7B,OAAO,MAAM,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAmC,CAAC,GAAS;AACjD,SAAK,MAAM;AACX,SAAK,SAAS,gBAAgB,KAAK,OAAO;AAE1C,UAAM,OAAO,aAAa,QAAQ,OAAO,QAAQ,IAAI,eAAe,IAAI;AACxE,SAAK,SAAS,MAAM;AAAA,MAClB,OAAO,CAAC,YAAY,KAAK,MAAM,OAAO;AAAA,MACtC,GAAI,aAAa,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,aAAa,SAAS;AAAA,MACjF;AAAA,IACF,CAAC;AAED,UAAM,MAAM,aAAa,OAAO;AAChC,QAAI,KAAK;AACP,YAAM,OAAO,aAAa,YAAY;AACtC,UAAI,kBAAkB,KAAK,QAAQ,EAAE,GAAG;AACtC,cAAM,SAAS,kBAAkB,uBAAuB,KAAK,QAAQ,EAAE,CAAC;AACxE,gBAAQ,IAAI,qBAAqB,IAAI,IAAI,IAAI,GAAG,MAAM,EAAE;AAAA,MAC1D,OAAO;AACL,gBAAQ,IAAI,sBAAsB,IAAI,IAAI,IAAI,EAAE;AAAA,MAClD;AAAA,IACF;AAEA,SAAK,gBAAgB,MAAM;AACzB,WAAK,MAAM;AACX,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,KAAK,UAAU,KAAK,aAAa;AAEzC,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,kBAAkB,QAAW;AACpC,cAAQ,IAAI,UAAU,KAAK,aAAa;AACxC,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,QAAQ,MAAM;AACnB,SAAK,SAAS;AACd,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,yBACP,SACA,SACsB;AACtB,QAAM,SAAS,QAAQ,OAAO,CAAC,WAA4B,kBAAkB,KAAK;AAClF,QAAM,YAAY,QAAQ;AAAA;AAAA,IAExB,CAAC,WAAyC,kBAAkB;AAAA,EAC9D;AACA,SAAO;AAAA,IACL,QAAQ,kBAAkB,QAAQ,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IAC5D,WAAW,qBAAqB,SAAS;AAAA,IACzC,OAAO,QAAQ,SAAS,CAAC;AAAA,IACzB,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,IACjE,GAAI,QAAQ,OAAO,SAAY,CAAC,IAAI,EAAE,IAAI,QAAQ,GAAG;AAAA,EACvD;AACF;AAEA,SAAS,kBAAkB,QAAiB,cAAuD;AACjG,QAAM,MAAM,oBAAI,IAAY;AAC5B,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,KAAK,cAAc,MAAM,IAAI,GAAG;AACtC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,cAAc,aAAa,EAAE,KAAK,CAAC;AAAA,MACnC,UAAU,cAAc,KAAK;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;AAGA,SAAS,qBAAqB,WAAwD;AACpF,QAAM,MAAM,oBAAI,IAAY;AAC5B,SAAO,UAAU,IAAI,CAAC,aAAa;AACjC,UAAM,KAAK,cAAc,SAAS,MAAM,YAAY,GAAG;AACvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAI,SAAS,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK;AAAA,MAC7D,GAAI,SAAS,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,SAAS,YAAY;AAAA,MAClF,GAAI,SAAS,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,SAAS,SAAS;AAAA,IAC3E;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,QAAgB,KAA0B;AAC/D,MAAI,KAAK;AACT,MAAI,SAAS;AACb,SAAO,IAAI,IAAI,EAAE,GAAG;AAClB,SAAK,GAAG,MAAM,IAAI,MAAM;AACxB,cAAU;AAAA,EACZ;AACA,MAAI,IAAI,EAAE;AACV,SAAO;AACT;AAEA,SAAS,cAAc,OAA0B;AAC/C,SAAO;AAAA,IACL,GAAI,MAAM,oBAAoB,SAAY,CAAC,IAAI,EAAE,iBAAiB,MAAM,gBAAgB;AAAA,IACxF,oBAAoB,MAAM,cAAc;AAAA,IACxC,qBAAqB,MAAM,gBAAgB;AAAA,IAC3C,kBAAkB,MAAM,aAAa;AAAA,IACrC,iBAAiB,MAAM,iBAAiB;AAAA,IACxC,SAAS,MAAM,SAAS;AAAA,IACxB,eAAe,MAAM,UAAU;AAAA,IAC/B,mBAAmB,MAAM,QAAQ,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,aAAa,MAAS,EAAE;AAAA,EAC1F;AACF;AAEA,SAAS,gBAAgB,SAA0C;AACjE,QAAM,mBAAmB,IAAI,uBAAuB;AACpD,QAAM,SAAS,cAAc,cAAc,OAAO,GAAG,gBAAgB;AACrE,QAAM,SAAS,gBAAgB,QAAQ,MAAM,EAC1C,IAAI,CAAC,UAAU,wBAAwB,OAAO,OAAO,QAAQ,CAAC,EAC9D,IAAI,CAAC,UAAU,wBAAwB,OAAO,OAAO,MAAM,CAAC;AAC/D,QAAM,YAAY,mBAAmB,QAAQ,SAAS;AACtD,QAAM,WAAW,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AACjE,QAAM,cAAc,IAAI,IAAI,UAAU,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;AAChF,QAAM,UAAU,IAAI,IAAI,QAAQ,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC;AACrF,QAAM,kBAAkB,sBAAsB;AAC9C,QAAM,kBAAkB,sBAAsB;AAC9C,QAAM,MAAM,IAAI,QAAQ;AACxB,QAAM,YAAY,kBAAkB,QAAQ,EAAE,IAAI,uBAAuB,QAAQ,EAAE,IAAI;AAEvF,MAAI,cAAc,UAAa,CAAC,UAAU,cAAc;AACtD,qBAAiB,KAAK,SAAS;AAAA,EACjC;AAEA,MAAI,WAAW,cAAc;AAC3B,qBAAiB,KAAK,SAAS;AAAA,EACjC;AAEA,MAAI;AAAA,IAAI;AAAA,IAAW,CAAC,MAClB,EAAE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,IAAI,SAAS,OAAO;AAAA,QACpB,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,YAAY,SAAS,QAAQ,WAAW,MAAM,CAAC,CAAC;AACjF,uBAAqB,KAAK,EAAE,SAAS,QAAQ,WAAW,OAAO,CAAC;AAEhE,MAAI,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC;AAErE,MAAI,IAAI,oBAAoB,CAAC,MAAM;AACjC,UAAM,QAAQ,SAAS,IAAI,EAAE,IAAI,MAAM,SAAS,CAAC;AACjD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,WAAO,EAAE,KAAK,YAAY,KAAK,CAAC;AAAA,EAClC,CAAC;AAED,MAAI,IAAI,4BAA4B,CAAC,MAAM;AACzC,UAAM,QAAQ,SAAS,IAAI,EAAE,IAAI,MAAM,SAAS,CAAC;AACjD,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,WAAO,EAAE,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC1C,CAAC;AAED,oBAAkB,KAAK,EAAE,SAAS,CAAC;AACnC,qBAAmB,KAAK,EAAE,SAAS,CAAC;AACpC,yBAAuB,KAAK,eAAe;AAC3C,yBAAuB,KAAK,eAAe;AAC3C,8BAA4B,KAAK,gBAAgB;AACjD,qBAAmB,KAAK;AAAA,IACtB,OAAO,QAAQ;AAAA,IACf;AAAA,EACF,CAAC;AACD,0BAAwB,KAAK;AAAA,IAC3B;AAAA,IACA,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,OAAO,OAAO;AAAA,EACrE,CAAC;AACD,yBAAuB,KAAK;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,GAAI,OAAO,iBAAiB,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,aAAa;AAAA,IAC7E,GAAI,OAAO,iBAAiB,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,aAAa;AAAA,EAC/E,CAAC;AAED,MAAI,KAAK,yBAAyB,OAAO,MAAM;AAC7C,UAAM,UAAU,EAAE,IAAI,MAAM,SAAS;AACrC,UAAM,QAAQ,SAAS,IAAI,OAAO;AAClC,QAAI,UAAU,QAAW;AACvB,aAAO,cAAc,GAAG,KAAK,aAAa,iBAAiB;AAAA,IAC7D;AAEA,UAAM,OAAO,MAAM,gBAAgB,CAAC;AACpC,QAAI,WAAW,MAAM;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,cAAc,UAAa,OAAO,aAAa,QAAW;AACjE,aAAO,sBAAsB,GAAG,UAAU;AAAA,IAC5C;AAEA,UAAM,UACJ,KAAK,cAAc,SAAY,SAAY,MAAM,OAAO,UAAU,WAAW,KAAK,SAAS;AAC7F,QAAI,KAAK,cAAc,UAAa,YAAY,QAAW;AACzD,aAAO,cAAc,GAAG,KAAK,aAAa,mBAAmB;AAAA,IAC/D;AACA,QAAI,YAAY,UAAa,QAAQ,YAAY,SAAS;AACxD,aAAO,cAAc,GAAG,KAAK,eAAe,kCAAkC;AAAA,IAChF;AAEA,UAAM,QAAQ,WAAW,OAAO,WAAW;AAC3C,UAAM,eAAe,KAAK,IAAI;AAC9B,QAAI,YAAY,QAAW;AACzB,YAAM;AAAA,QACJ,OAAO;AAAA,QACP,eAAe;AAAA,UACb,WAAW,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,UACA,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK,WAAW;AAAA,UACxB,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,UACjE,GAAI,KAAK,oBAAoB,SAAY,CAAC,IAAI,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,UACtF,UAAU,KAAK,UAAU;AAAA,UACzB,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,QACnE,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,aAAa;AAAA,IACf;AACA,UAAM,UACJ,YAAY,SACR,MAAM,MAAM,QAAQ,QAAQ,IAAI,EAAE,UAAU,eAAe,CAAC,EAAE,OAAO,KAAK,OAAO,IACjF,MAAM,MAAM;AAAA,MACV,KAAK,YAAY,SACb,CAAC,GAAG,KAAK,SAAS,uBAAuB,KAAK,OAAO,CAAC,IACtD,KAAK;AAAA,IACX;AACN,QAAI,KAAK,aAAa,QAAW;AAC/B,cAAQ,SAAS,KAAK,QAAQ;AAAA,IAChC;AACA,QAAI,KAAK,oBAAoB,QAAW;AACtC,cAAQ,oBAAoB,KAAK,eAAe;AAAA,IAClD;AACA,QAAI,KAAK,UAAU,QAAW;AAC5B,cAAQ,UAAU,YAAY,KAAK,OAAO,SAAS,OAAO,CAAC;AAAA,IAC7D,WAAW,YAAY,QAAW;AAChC,cAAQ,UAAU,YAAY,QAAW,SAAS,OAAO,CAAC;AAAA,IAC5D;AAEA,QAAI,KAAK,WAAW,MAAM;AACxB,YAAM,gBAAgB,IAAI,gBAAqC;AAC/D,YAAM,gBAAgB;AAAA,QACpB;AAAA,UACE,MAAM,MAAM;AAAA,UACZ,gBAAgB,WAAW;AAAA,YACzB;AAAA,YACA;AAAA,YACA,GAAI,SAAS,OAAO,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG;AAAA,YAC7D,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,YACjE,SAAS,CAAC,aAAa,MAAM,MAAM,QAAQ,QAAQ;AAAA,YACnD,MAAM,CAAC,UAAU,cAAc,KAAK,KAAK;AAAA,UAC3C,CAAC;AAAA,QACH;AAAA,QACA,gBAAgB,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,UACA,GAAI,SAAS,OAAO,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG;AAAA,UAC7D,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,UACjE,MAAM,CAAC,UAAU,cAAc,KAAK,KAAK;AAAA,QAC3C,CAAC;AAAA,MACH;AACA,UAAI,kBAAkB,QAAW;AAC/B,gBAAQ,YAAY,aAAa;AAAA,MACnC;AACA,YAAM,YAAY,0BAA0B,QAAQ,OAAO,GAAG,aAAa;AAC3E,YAAM,SACJ,YAAY,UAAa,OAAO,aAAa,SACzC,YACA,kCAAkC;AAAA,QAChC,QAAQ,qBAAqB;AAAA,UAC3B,QAAQ;AAAA,UACR,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA,WAAW;AAAA,QACb,CAAC;AAAA,QACD,OAAO,OAAO;AAAA,QACd;AAAA,QACA,SAAS,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AACP,aAAO,qBAAqB,GAAG,MAAM;AAAA,IACvC;AAEA,QAAI;AACF,UAAI,YAAY,QAAW;AACzB,cAAM,iBAAiB,OAAO,UAAU,cAAc,SAAS,KAAK,CAAC;AACrE,cAAM,iBAAiB,OAAO,UAAU,gBAAgB,SAAS,KAAK,CAAC;AAAA,MACzE;AACA,YAAM,gBAAgB;AAAA,QACpB;AAAA,UACE,MAAM,MAAM;AAAA,UACZ,gBAAgB,WAAW;AAAA,YACzB;AAAA,YACA;AAAA,YACA,GAAI,SAAS,OAAO,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG;AAAA,YAC7D,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,YACjE,SAAS,CAAC,aAAa,MAAM,MAAM,QAAQ,QAAQ;AAAA,UACrD,CAAC;AAAA,QACH;AAAA,QACA,gBAAgB,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,UACA,GAAI,SAAS,OAAO,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG;AAAA,UAC7D,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,QACnE,CAAC;AAAA,MACH;AACA,UAAI,kBAAkB,QAAW;AAC/B,gBAAQ,YAAY,aAAa;AAAA,MACnC;AACA,YAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,UAAI,YAAY,UAAa,OAAO,aAAa,QAAW;AAC1D,cAAM,OAAO,SAAS,yBAAyB;AAAA,UAC7C,IAAI,QAAQ;AAAA,UACZ;AAAA,UACA,GAAG,cAAc,KAAK,OAAO;AAAA,UAC7B,YAAY,uBAAuB,SAAS,QAAQ;AAAA,UACpD,QAAQ;AAAA,QACV,CAAC;AACD,cAAM;AAAA,UACJ,OAAO;AAAA,UACP,gBAAgB;AAAA,YACd,WAAW,QAAQ;AAAA,YACnB;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,OAAO,SAAS;AAAA,YAChB,QAAQ,SAAS;AAAA,YACjB,cAAc,SAAS,SAAS;AAAA,UAClC,CAAC;AAAA,QACH;AACA,cAAM;AAAA,UACJ,OAAO;AAAA,UACP,eAAe;AAAA,YACb,WAAW,QAAQ;AAAA,YACnB;AAAA,YACA,cAAc,SAAS,SAAS;AAAA,UAClC,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO,EAAE,KAAK,QAAQ;AAAA,IACxB,SAAS,OAAO;AACd,UAAI,YAAY,UAAa,OAAO,aAAa,QAAW;AAC1D,cAAM,WAAW,MAAM,OAAO,SAAS,KAAK;AAAA,UAC1C,WAAW,QAAQ;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AACD,cAAM,OAAO,SAAS,yBAAyB;AAAA,UAC7C,IAAI,QAAQ;AAAA,UACZ;AAAA,UACA,GAAG,cAAc,KAAK,OAAO;AAAA,UAC7B,YAAY,uBAAuB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAAA,UACvE,QAAQ;AAAA,UACR,OAAOE,gBAAe,KAAK;AAAA,QAC7B,CAAC;AACD,cAAM;AAAA,UACJ,OAAO;AAAA,UACP,aAAa,QAAQ,IAAI,OAAO,OAAO,YAAY;AAAA,QACrD;AAAA,MACF;AACA,aAAO,cAAc,GAAG,KAAK,kBAAkB,oBAAoBA,gBAAe,KAAK,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,MAAI,OAAO,aAAa,QAAW;AACjC,yBAAqB,KAAK;AAAA,MACxB,cAAc,OAAO;AAAA,IACvB,CAAC;AACD,0BAAsB,KAAK;AAAA,MACzB;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,OAAO,OAAO;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,WAAW,QAAW;AAC/B,wBAAoB,KAAK,OAAO,MAAM;AAAA,EACxC;AAEA,aAAW,cAAc,wBAAwB,MAAM,GAAG;AACxD,QAAI,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AACrE,QAAI,IAAI,IAAI,UAAU,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,SAAgD;AACpD,aAAO,IAAI,MAAM,OAAO;AAAA,IAC1B;AAAA,IACA,SAAuB;AACrB,aAAO,YAAY,SAAS,QAAQ,WAAW,MAAM;AAAA,IACvD;AAAA,IACA,QAAQ;AAAA,IAAC;AAAA,IACT,GAAI,OAAO,aAAa,SAAY,CAAC,IAAI,EAAE,cAAc,OAAO,SAAS;AAAA,IACzE,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,OAAO,OAAO;AAAA,EACrE;AACF;AAEA,SAAS,uBAAuB,SAA4C;AAC1E,SAAO,OAAO,YAAY,WAAW,QAAQ,KAAK,OAAO,IAAI;AAC/D;AAEA,SAAS,wBACP,aACA,cACa;AACb,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,WAAW,YAAY,OAAO;AAAA,MACnC,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,SAAS,qBAAqB,EAAE,YAAY,UAAU,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBACP,aACA,YACa;AACb,MAAI,eAAe,UAAa,uBAAuB,YAAY,KAAK,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,WAAW,YAAY,OAAO;AAAA,MACnC,WAAW;AAAA,QACT,GAAG,YAAY,MAAM;AAAA,QACrB,EAAE,UAAU,IAAI,oBAAoB,EAAE,OAAO,WAAW,CAAC,EAAE;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,WACP,OACA,YAA6D,CAAC,GACvD;AACP,SAAO,IAAI,MAAM;AAAA,IACf,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM;AAAA,IACrB,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,iBAAiB,MAAM;AAAA,IACvB,MAAM,MAAM;AAAA,IACZ,cAAc,MAAM;AAAA,IACpB,WAAW,MAAM;AAAA,IACjB,iBAAiB,MAAM;AAAA,IACvB,cAAc,MAAM;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd,GAAG;AAAA,EACL,CAAC;AACH;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,MAAM,UAAU;AAAA,IACrB,CAAC,iBAAiB,aAAa,oBAAoB;AAAA,EACrD;AACF;AAEA,SAAS,aACP,OACA,QACwB;AACxB,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,SAAOC,YAAW;AAAA,IAChB,MAAM,iBAAiB,MAAuC;AAC5D,YAAM,cAAc,MAAM,MAAM,mBAAmB,IAAI;AACvD,aAAO,aAAa,SAAS,cACzB,cACE,MAAM,OAAO,mBAAmB,IAAI,KAAM;AAAA,IAClD;AAAA,IACA,MAAM,qBAAqB,MAAuC;AAChE,YAAM,cAAc,MAAM,MAAM,uBAAuB,IAAI;AAC3D,aAAO,aAAa,SAAS,cACzB,cACE,MAAM,OAAO,uBAAuB,IAAI,KAAM;AAAA,IACtD;AAAA,IACA,MAAM,WAAW,MAA+C;AAC9D,YAAM,cAAc,MAAM,MAAM,aAAa,IAAI;AACjD,UAAI,aAAa,SAAS,UAAU,aAAa,SAAS,aAAa;AACrE,eAAO;AAAA,MACT;AACA,UAAI,aAAa,SAAS,oBAAoB;AAC5C,eAAQ,MAAM,uBAAuB,MAAM,IAAI,MAAM,WAAW,KAAM;AAAA,MACxE;AACA,YAAM,eAAe,MAAM,OAAO,aAAa,IAAI;AACnD,aAAO,gBAAgB,eAAe;AAAA,IACxC;AAAA,IACA,MAAM,aAAa,MAAuC;AACxD,YAAM,cAAc,MAAM,MAAM,eAAe,IAAI;AACnD,aAAO,aAAa,SAAS,cACzB,cACE,MAAM,OAAO,eAAe,IAAI,KAAM;AAAA,IAC9C;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBACP,MACyD;AACzD,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,0BAA0B,aAC9C,UAAU,wBACV;AACN;","names":["createHook","run","studioRunId","transcriptFromMessagesFallback","serializeJsonError","renumberTranscript","toJsonValue","compactJsonObject","toJsonValue","isJsonObject","isJsonValue","serializeError","resolve","decision","toJsonValue","isJsonObject","isRecord","toJsonValue","compactJsonObject","serializeError","resolve","appendSessionLog","appendPipelineLog","traceSummary","byteLength","serializeError","resolve","serializeError","formatJson","isJsonObject","toJsonValue","serializeError","isJsonValue","isJsonObject","createHook","parseToolArgs","createHook","parseToolArgs","resolve","cleanMetadata","byteLength","serializeError","formatUnknown","isJsonObject","toJsonValue","isJsonObject","isJsonValue","serializeError","createHook"]}