framework-agents 0.1.3 → 0.1.6
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/agent-AXBAXCB5.js +7 -0
- package/dist/{agent-KV6TG47A.js → agent-Y4D6JSG5.js} +1 -1
- package/dist/{chunk-VIGLIWEY.js → chunk-AJI2QSJE.js} +94 -18
- package/dist/chunk-AJI2QSJE.js.map +1 -0
- package/dist/{chunk-G3CMR4MD.js → chunk-JUOOPH4Z.js} +102 -16
- package/dist/cli.js +103 -87
- package/dist/index.d.ts +31 -21
- package/dist/index.js +108 -88
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/agent-ZEGATFZY.js +0 -7
- package/dist/chunk-VIGLIWEY.js.map +0 -1
- /package/dist/{agent-ZEGATFZY.js.map → agent-AXBAXCB5.js.map} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/index.ts","../src/checkpoint/index.ts","../src/swarm/index.ts","../src/a2a/index.ts","../src/client/index.ts","../src/serve/index.ts","../src/models/capabilities.ts","../src/models/openai-compatible.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/models/factory.ts","../src/skills/index.ts","../src/rag/index.ts","../src/sandbox/index.ts","../src/evals/index.ts","../src/tracing/index.ts","../src/streaming/index.ts","../src/memory/compaction.ts","../src/models/index.ts","../src/observability/index.ts","../src/orchestration/index.ts","../src/workflows/index.ts","../src/mcp/index.ts","../src/prompts/index.ts","../src/semantic/index.ts","../src/semantic/remote-sparql.ts","../src/semantic/entity-linking.ts","../src/semantic/ontology-evolution.ts","../src/semantic/ontology-review.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { config } from \"dotenv\";\nimport { z } from \"zod\";\n\n// Load .env from cwd, then walk up (handles running from the package dir\n// inside the monorepo). FRAMEWORK_ENV_PATH overrides everything.\n// Each step is silent when the file is missing — never throws, never logs keys.\nfunction loadEnv(): void {\n if (process.env.FRAMEWORK_ENV_PATH) {\n config({ path: process.env.FRAMEWORK_ENV_PATH });\n return;\n }\n config();\n let dir = resolve(process.cwd());\n for (let i = 0; i < 3; i++) {\n dir = dirname(dir);\n const candidate = join(dir, \".env\");\n if (existsSync(candidate)) {\n config({ path: candidate });\n return;\n }\n }\n}\n\nloadEnv();\n\nconst ConfigSchema = z.object({\n TOGETHER_API_KEY: z.string().default(\"\"),\n TOGETHER_BASE_URL: z.string().default(\"https://api.together.xyz/v1\"),\n /** Small chat default — one model, no tiers. */\n TOGETHER_MODEL: z.string().default(\"Qwen/Qwen3.5-9B\"),\n OPENAI_BASE_URL: z.string().default(\"https://api.openai.com/v1\"),\n OPENAI_API_KEY: z.string().default(\"\"),\n OPENAI_MODEL: z.string().default(\"gpt-4o-mini\"),\n ANTHROPIC_API_KEY: z.string().default(\"\"),\n ANTHROPIC_BASE_URL: z.string().default(\"https://api.anthropic.com\"),\n ANTHROPIC_MODEL: z.string().default(\"claude-sonnet-4-6\"),\n OLLAMA_BASE_URL: z.string().default(\"http://localhost:11434/v1\"),\n OLLAMA_MODEL: z.string().default(\"qwen2.5\"),\n E2E_MODEL: z.string().default(\"\"),\n});\n\nexport type FrameworkConfig = z.infer<typeof ConfigSchema> & {\n /** Resolved provider settings: TogetherAI wins when its key is set. */\n active: { baseUrl: string; apiKey: string; model: string; source: \"together\" | \"openai\" };\n};\n\nlet cached: FrameworkConfig | undefined;\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): FrameworkConfig {\n if (cached) return cached;\n const parsed = ConfigSchema.parse({\n TOGETHER_API_KEY: env.TOGETHER_API_KEY ?? \"\",\n TOGETHER_BASE_URL: env.TOGETHER_BASE_URL,\n TOGETHER_MODEL: env.TOGETHER_MODEL,\n OPENAI_BASE_URL: env.OPENAI_BASE_URL,\n OPENAI_API_KEY: env.OPENAI_API_KEY ?? \"\",\n OPENAI_MODEL: env.OPENAI_MODEL,\n ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY ?? \"\",\n ANTHROPIC_BASE_URL: env.ANTHROPIC_BASE_URL,\n ANTHROPIC_MODEL: env.ANTHROPIC_MODEL,\n OLLAMA_BASE_URL: env.OLLAMA_BASE_URL,\n OLLAMA_MODEL: env.OLLAMA_MODEL,\n E2E_MODEL: env.E2E_MODEL ?? \"\",\n });\n const useTogether = parsed.TOGETHER_API_KEY.length > 0;\n const model = useTogether ? parsed.TOGETHER_MODEL : parsed.OPENAI_MODEL;\n cached = {\n ...parsed,\n active: useTogether\n ? { baseUrl: parsed.TOGETHER_BASE_URL, apiKey: parsed.TOGETHER_API_KEY, model, source: \"together\" }\n : { baseUrl: parsed.OPENAI_BASE_URL, apiKey: parsed.OPENAI_API_KEY, model, source: \"openai\" },\n };\n return cached;\n}\n\n/** Test-only: clear cache so tests can pass custom env objects. */\nexport function __resetConfig(): void {\n cached = undefined;\n}\n","import { mkdir, open, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AgentError } from \"../types/index.js\";\nimport type { ChatMessage } from \"../types/index.js\";\n\n/**\n * Local-first durability: file checkpointer + file locks. No services,\n * no third-party deps. Checkpointed HITL resume works fully offline.\n */\n\nexport interface ThreadCheckpoint {\n threadId: string;\n savedAt: string;\n messages: ChatMessage[];\n state: Record<string, unknown>;\n pending: { interruptId: string; tool: string; args: unknown }[];\n}\n\nexport interface Checkpointer {\n save(threadId: string, checkpoint: Omit<ThreadCheckpoint, \"threadId\" | \"savedAt\">): Promise<void>;\n load(threadId: string): Promise<ThreadCheckpoint | undefined>;\n delete(threadId: string): Promise<void>;\n}\n\n/**\n * Exclusive local lock via O_EXCL file creation. Stale locks (older than\n * staleMs) are reclaimed. Single-machine correctness; distributed locking\n * is explicitly out of scope (see roadmap P3).\n */\nexport async function withFileLock<T>(lockPath: string, fn: () => Promise<T>, opts: { staleMs?: number } = {}): Promise<T> {\n const staleMs = opts.staleMs ?? 30000;\n await mkdir(join(lockPath, \"..\"), { recursive: true });\n for (;;) {\n try {\n const handle = await open(lockPath, \"wx\");\n await handle.close();\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") throw err;\n try {\n const info = await stat(lockPath);\n if (Date.now() - info.mtimeMs < staleMs) {\n throw new Error(`Lock held: ${lockPath}`);\n }\n } catch (statErr) {\n if ((statErr as NodeJS.ErrnoException).code !== \"ENOENT\") throw statErr;\n }\n try {\n await unlink(lockPath);\n } catch {\n // Raced with another releaser; retry acquisition.\n }\n }\n }\n try {\n return await fn();\n } finally {\n try {\n await unlink(lockPath);\n } catch {\n // Already released or reclaimed; ignore.\n }\n }\n}\n\n/** JSON-file checkpointer: <root>/threads/<threadId>/checkpoint.json, lock-guarded. */\nexport class FileCheckpointer implements Checkpointer {\n constructor(private root: string) {}\n\n /** threadId lands in a filesystem path — keep it a single safe directory name. */\n private threadDir(threadId: string): string {\n if (threadId === \"\" || threadId === \".\" || threadId === \"..\" || threadId.includes(\"/\")) {\n throw new AgentError(\"THREAD_ID_INVALID\", `Invalid threadId: ${JSON.stringify(threadId)}`, false);\n }\n return join(this.root, \"threads\", threadId);\n }\n\n private file(threadId: string): string {\n return join(this.threadDir(threadId), \"checkpoint.json\");\n }\n\n private lock(threadId: string): string {\n return join(this.threadDir(threadId), \".lock\");\n }\n\n async save(threadId: string, checkpoint: Omit<ThreadCheckpoint, \"threadId\" | \"savedAt\">): Promise<void> {\n const record: ThreadCheckpoint = { threadId, savedAt: new Date().toISOString(), ...checkpoint };\n await withFileLock(this.lock(threadId), async () => {\n await mkdir(join(this.file(threadId), \"..\"), { recursive: true });\n await writeFile(this.file(threadId), JSON.stringify(record), \"utf8\");\n });\n }\n\n async load(threadId: string): Promise<ThreadCheckpoint | undefined> {\n return withFileLock(this.lock(threadId), async () => {\n try {\n return JSON.parse(await readFile(this.file(threadId), \"utf8\")) as ThreadCheckpoint;\n } catch {\n return undefined;\n }\n });\n }\n\n async delete(threadId: string): Promise<void> {\n await withFileLock(this.lock(threadId), async () => {\n try {\n await unlink(this.file(threadId));\n } catch {\n // Missing checkpoint is not an error.\n }\n });\n }\n}\n","import { z } from \"zod\";\nimport { AgentError, type AgentResult, type ContentBlock, type TokenUsage } from \"../types/index.js\";\nimport type { Agent, RunOptions } from \"../agent/index.js\";\nimport { defineTool } from \"../tools/index.js\";\nimport type { InvocationState } from \"../state/index.js\";\nimport type { StreamEvent } from \"../streaming/index.js\";\nimport { runWithBudget } from \"../runtime/index.js\";\n\n/**\n * Swarm: autonomous handoffs across specialists, no fixed path.\n * Each member gets a `handoff_to_agent` tool; shared context (task,\n * history, contributed knowledge, roster) is rebuilt for every turn.\n * Safety: max handoffs / iterations / timeouts + ping-pong detection.\n */\n\nexport interface SwarmOptions {\n agents: Agent[];\n /** First agent to run. Default: agents[0]. Accepts instance or name. */\n entryPoint?: Agent | string;\n maxHandoffs?: number;\n maxIterations?: number;\n executionTimeoutMs?: number;\n nodeTimeoutMs?: number;\n /** Ping-pong detection: window size + min unique agents (0 = disabled). */\n loopDetectionWindow?: number;\n minUniqueAgents?: number;\n}\n\nexport interface HandoffSignal {\n to: string;\n message: string;\n context?: Record<string, unknown>;\n}\n\nexport type SwarmStatus = \"COMPLETED\" | \"FAILED\";\n\nexport interface SwarmResult {\n status: SwarmStatus;\n text: string;\n nodeHistory: string[];\n results: Record<string, AgentResult>;\n iterations: number;\n handoffs: number;\n usage: TokenUsage;\n sharedContext: Record<string, Record<string, unknown>>;\n error?: string;\n}\n\nexport type SwarmStreamEvent =\n | { type: \"node_start\"; agent: string }\n | { type: \"node_done\"; agent: string }\n | { type: \"handoff\"; from: string; to: string }\n | { type: \"agent_event\"; agent: string; event: StreamEvent }\n | { type: \"result\"; result: SwarmResult };\n\nconst HANDOFF_TOOL = \"handoff_to_agent\";\n\nfunction handoffSignal(to: string, message: string, context?: Record<string, unknown>): AgentError {\n const err = new AgentError(\"SWARM_HANDOFF\", `Handoff to ${to}`, false);\n (err as unknown as { handoff: HandoffSignal }).handoff = { to, message, context };\n return err;\n}\n\nexport function readHandoffSignal(err: unknown): HandoffSignal | undefined {\n if (err instanceof AgentError && err.code === \"SWARM_HANDOFF\") {\n return (err as unknown as { handoff?: HandoffSignal }).handoff;\n }\n return undefined;\n}\n\nfunction combineAbort(parent?: AbortSignal, timeoutMs?: number): AbortSignal | undefined {\n if (!parent && !timeoutMs) return undefined;\n const controller = new AbortController();\n if (parent) {\n if (parent.aborted) controller.abort();\n else parent.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n if (timeoutMs) {\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n controller.signal.addEventListener(\"abort\", () => clearTimeout(timer), { once: true });\n }\n return controller.signal;\n}\n\nexport class Swarm {\n private agents: Agent[];\n private entryPoint: Agent;\n private maxHandoffs: number;\n private maxIterations: number;\n private executionTimeoutMs?: number;\n private nodeTimeoutMs?: number;\n private loopWindow: number;\n private minUniqueAgents: number;\n\n constructor(opts: SwarmOptions) {\n if (!opts.agents.length) throw new AgentError(\"SWARM_EMPTY\", \"Swarm needs at least one agent\", false);\n this.agents = opts.agents;\n this.entryPoint =\n typeof opts.entryPoint === \"string\"\n ? (opts.agents.find((a) => a.name === opts.entryPoint) ??\n (() => { throw new AgentError(\"SWARM_UNKNOWN_ENTRY\", `Unknown entry point: ${opts.entryPoint}`, false); })())\n : (opts.entryPoint ?? opts.agents[0]);\n this.maxHandoffs = opts.maxHandoffs ?? 20;\n this.maxIterations = opts.maxIterations ?? 20;\n this.executionTimeoutMs = opts.executionTimeoutMs;\n this.nodeTimeoutMs = opts.nodeTimeoutMs;\n this.loopWindow = opts.loopDetectionWindow ?? 0;\n // Setting a window alone must enable detection — default the uniqueness\n // threshold instead of requiring BOTH knobs (old behavior: window>0 with\n // minUniqueAgents unset silently detected nothing).\n this.minUniqueAgents = opts.minUniqueAgents ?? (this.loopWindow > 0 ? 2 : 0);\n }\n\n private roster(except?: string): string {\n return this.agents\n .filter((a) => a.name !== except)\n .map((a) => `- ${a.name}${a.description ? `: ${a.description}` : \"\"}`)\n .join(\"\\n\");\n }\n\n private buildInput(task: string, history: string[], shared: Record<string, Record<string, unknown>>, message: string, current: string): string {\n const knowledge = Object.entries(shared)\n .map(([agent, facts]) => `• ${agent}: ${JSON.stringify(facts)}`)\n .join(\"\\n\");\n return [\n `Original task: ${task}`,\n message ? `Handoff message: ${message}` : \"\",\n history.length ? `Agents so far: ${history.join(\" → \")}` : \"\",\n knowledge ? `Shared knowledge:\\n${knowledge}` : \"\",\n `Available collaborators:\\n${this.roster(current)}`,\n `If you need a collaborator, call ${HANDOFF_TOOL} with their name. Otherwise finish with your final answer as text.`,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n private memberWithHandoff(agent: Agent, shared: Record<string, Record<string, unknown>>): Agent {\n const handoff = defineTool({\n name: HANDOFF_TOOL,\n description: `Hand control to a specialist. Args: to (agent name), message (what you need), context (facts to share as an object).`,\n schema: z.object({ to: z.string(), message: z.string(), context: z.record(z.unknown()).optional() }),\n execute: async ({ to, message, context }: { to: string; message: string; context?: Record<string, unknown> }) => {\n if (!this.agents.some((a) => a.name === to)) {\n return `Error: unknown agent \"${to}\". Available: ${this.agents.map((a) => a.name).join(\", \")}. Pick one or finish yourself.`;\n }\n if (context && Object.keys(context).length) shared[agent.name] = { ...(shared[agent.name] ?? {}), ...context };\n throw handoffSignal(to, message, context);\n },\n });\n // Clone keeps the member's model/tools/middleware; only coordination is added.\n // Memory/sessions are intentionally fresh per handoff turn (shared\n // knowledge flows through the swarm input + invocationState instead).\n return agent.withTools(handoff);\n }\n\n async run(task: string | ContentBlock[], opts?: RunOptions & { sharedState?: InvocationState }): Promise<SwarmResult> {\n const stream = this.stream(task, opts);\n for (;;) {\n const next = await stream.next();\n if (next.done) return next.value;\n }\n }\n\n async *stream(\n task: string | ContentBlock[],\n opts?: RunOptions & { sharedState?: InvocationState },\n ): AsyncGenerator<SwarmStreamEvent, SwarmResult> {\n const taskText = typeof task === \"string\" ? task : task.map((b) => (b.type === \"text\" ? b.text : `[${b.type}]`)).join(\"\\n\");\n const invocationState = opts?.sharedState ?? {};\n const execSignal = combineAbort(opts?.signal, this.executionTimeoutMs);\n const shared: Record<string, Record<string, unknown>> = {};\n const history: string[] = [];\n const results: Record<string, AgentResult> = {};\n const usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n const handoffTrail: string[] = [];\n let current = this.entryPoint;\n let message = \"\";\n let iterations = 0;\n let handoffs = 0;\n let finalText = \"\";\n\n const fail = (error: string): SwarmResult =>\n this.finish(\"FAILED\", error, history, results, usage, shared, iterations, handoffs);\n\n for (;;) {\n iterations += 1;\n if (iterations > this.maxIterations) {\n return fail(`Exceeded maxIterations (${this.maxIterations})`);\n }\n yield { type: \"node_start\", agent: current.name };\n const runner = this.memberWithHandoff(current, shared);\n const nodeSignal = combineAbort(execSignal, this.nodeTimeoutMs);\n let result: AgentResult | undefined;\n try {\n const gen = runner.stream(this.buildInput(taskText, history, shared, message, current.name), {\n signal: nodeSignal,\n invocationState,\n });\n for (;;) {\n const next = await runWithBudget(() => gen.next(), { signal: execSignal });\n if (next.done) {\n result = next.value;\n break;\n }\n yield { type: \"agent_event\", agent: current.name, event: next.value };\n }\n } catch (err) {\n const handoff = readHandoffSignal(err);\n if (!handoff) {\n const messageText = err instanceof Error ? err.message : String(err);\n return fail(`Agent ${current.name} failed: ${messageText}`);\n }\n handoffs += 1;\n if (handoffs > this.maxHandoffs) {\n return fail(`Exceeded maxHandoffs (${this.maxHandoffs})`);\n }\n handoffTrail.push(current.name, handoff.to);\n yield { type: \"handoff\", from: current.name, to: handoff.to };\n const loop = this.detectLoop(handoffTrail);\n if (loop) {\n return fail(loop);\n }\n const next = this.agents.find((a) => a.name === handoff.to);\n if (!next) {\n return fail(`Handoff to unknown agent: ${handoff.to}`);\n }\n history.push(current.name);\n message = handoff.message;\n current = next;\n continue;\n }\n // Completed without handoff → final answer.\n if (!result) return fail(`Agent ${current.name} returned no result`);\n history.push(current.name);\n results[current.name] = result;\n usage.inputTokens += result.usage.inputTokens;\n usage.outputTokens += result.usage.outputTokens;\n usage.reasoningTokens = (usage.reasoningTokens ?? 0) + (result.usage.reasoningTokens ?? 0);\n finalText = result.text;\n yield { type: \"node_done\", agent: current.name };\n const done = this.finish(\"COMPLETED\", \"\", history, results, usage, shared, iterations, handoffs, finalText);\n yield { type: \"result\", result: done };\n return done;\n }\n }\n\n private detectLoop(trail: string[]): string | undefined {\n if (this.loopWindow <= 0 || this.minUniqueAgents <= 0) return undefined;\n const window = trail.slice(-this.loopWindow);\n if (window.length < this.loopWindow) return undefined;\n if (new Set(window).size < this.minUniqueAgents) {\n return `Repetitive handoff detected (${window.join(\" → \")}): fewer than ${this.minUniqueAgents} unique agents in the last ${this.loopWindow} trail entries`;\n }\n return undefined;\n }\n\n private finish(\n status: SwarmStatus,\n error: string,\n history: string[],\n results: Record<string, AgentResult>,\n usage: TokenUsage,\n shared: Record<string, Record<string, unknown>>,\n iterations: number,\n handoffs: number,\n text = \"\",\n ): SwarmResult {\n return {\n status,\n text,\n nodeHistory: [...history],\n results,\n iterations,\n handoffs,\n usage,\n sharedContext: shared,\n ...(error ? { error } : {}),\n };\n }\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { Agent } from \"../agent/index.js\";\nimport type { Checkpointer } from \"../checkpoint/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * Agent-to-Agent (A2A) interop — The Framework agents calling agents on\n * other platforms, and vice versa. Minimal core of the open protocol:\n * agent-card discovery + JSON-RPC message/send over HTTP, with per-context\n * isolation on the server side.\n */\n\nexport interface AgentCard {\n name: string;\n description?: string;\n version?: string;\n skills?: { name: string; description?: string }[];\n}\n\nexport interface A2AClientOptions {\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n}\n\nfunction textOfParts(parts: unknown): string {\n if (!Array.isArray(parts)) return \"\";\n return parts\n .map((p) => {\n if (typeof p === \"string\") return p;\n if (p && typeof p === \"object\") {\n const o = p as Record<string, unknown>;\n if (typeof o.text === \"string\") return o.text;\n }\n return \"\";\n })\n .join(\"\");\n}\n\nfunction parseSendResult(result: unknown): string {\n if (typeof result === \"string\") return result;\n if (result && typeof result === \"object\") {\n const o = result as Record<string, unknown>;\n const msg = o.message as { parts?: unknown } | undefined;\n if (msg?.parts) return textOfParts(msg.parts);\n if (typeof o.text === \"string\") return o.text;\n return JSON.stringify(result);\n }\n return String(result ?? \"\");\n}\n\n/** Consume a remote A2A agent like a local one. */\nexport class A2AClient {\n private fetchFn: typeof fetch;\n private timeoutMs: number;\n\n constructor(\n readonly endpoint: string,\n opts: A2AClientOptions = {},\n ) {\n this.endpoint = endpoint.replace(/\\/$/, \"\");\n this.fetchFn = opts.fetchFn ?? fetch;\n this.timeoutMs = opts.timeoutMs ?? 300000;\n }\n\n async getCard(): Promise<AgentCard> {\n let res: Response;\n try {\n res = await this.fetchFn(`${this.endpoint}/.well-known/agent-card.json`, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n throw new AgentError(\"A2A_TRANSPORT\", `Agent card fetch failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) throw new AgentError(\"A2A_CARD\", `Agent card fetch failed: HTTP ${res.status}`, res.status >= 500);\n const card = (await res.json()) as AgentCard;\n if (!card?.name) throw new AgentError(\"A2A_CARD\", \"Invalid agent card (missing name)\", false);\n return card;\n }\n\n async send(text: string, contextId?: string): Promise<{ text: string; contextId?: string }> {\n let res: Response;\n try {\n res = await this.fetchFn(this.endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: `a2a-${Date.now().toString(36)}`,\n method: \"message/send\",\n params: {\n message: { role: \"user\", parts: [{ kind: \"text\", text }] },\n ...(contextId ? { contextId } : {}),\n },\n }),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n throw new AgentError(\"A2A_TRANSPORT\", `A2A send failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) throw new AgentError(\"A2A_TRANSPORT\", `A2A HTTP ${res.status}`, res.status >= 500);\n const rpc = (await res.json()) as { result?: unknown; error?: { message: string; code: number } };\n if (rpc.error) throw new AgentError(\"A2A_ERROR\", `Remote agent error: ${rpc.error.message}`, false);\n // Servers return the (possibly newly minted) contextId inside `result`.\n const resultContextId =\n rpc.result && typeof rpc.result === \"object\" ? (rpc.result as { contextId?: string }).contextId : undefined;\n return { text: parseSendResult(rpc.result), contextId: resultContextId ?? contextId };\n }\n}\n\n/** Wrap a remote agent as a framework Tool for orchestrators. */\nexport function a2aAsTool(client: A2AClient, opts: { name?: string; description?: string } = {}): Tool {\n return defineTool({\n name: opts.name ?? \"remote_agent\",\n description: opts.description ?? `Remote A2A agent at ${client.endpoint}`,\n schema: z.object({ input: z.string(), contextId: z.string().optional() }),\n execute: async ({ input, contextId }: { input: string; contextId?: string }) =>\n (await client.send(input, contextId)).text,\n });\n}\n\nexport interface A2AServerOptions {\n card: AgentCard;\n /**\n * Fresh agent per contextId (isolation). Retained up to maxContexts (LRU).\n * Return the SAME agent for a contextId to keep state in memory across\n * turns of one conversation, but never share one instance across contexts —\n * shared history leaks conversations between users.\n */\n agentFactory: (contextId: string) => Agent | Promise<Agent>;\n maxContexts?: number;\n port?: number;\n host?: string;\n /** Durable HITL threads: runs execute with { checkpointer, threadId: contextId }. */\n checkpointer?: Checkpointer;\n /** Browser frontends: reflected as Access-Control-Allow-Origin (+ OPTIONS handling). */\n corsOrigins?: string[];\n /** Max JSON-RPC request body bytes. Default 10 MiB. */\n maxBodyBytes?: number;\n}\n\n/** Serve a Framework agent over A2A (card + message/send). */\nexport class A2AServer {\n private server?: Server;\n private contexts = new Map<string, Agent>();\n private maxContexts: number;\n\n constructor(private opts: A2AServerOptions) {\n this.maxContexts = Math.max(1, opts.maxContexts ?? 1000);\n }\n\n private corsHeaders(origin: string | undefined): Record<string, string> {\n const allowed = this.opts.corsOrigins ?? [];\n if (!allowed.length || !origin) return {};\n if (!allowed.includes(\"*\") && !allowed.includes(origin)) return {};\n return {\n \"access-control-allow-origin\": allowed.includes(\"*\") ? \"*\" : origin,\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, authorization\",\n };\n }\n\n private runOpts(contextId: string): { checkpointer?: Checkpointer; threadId?: string } {\n return this.opts.checkpointer ? { checkpointer: this.opts.checkpointer, threadId: contextId } : {};\n }\n\n private async agentFor(contextId: string): Promise<Agent> {\n const existing = this.contexts.get(contextId);\n if (existing) {\n this.contexts.delete(contextId);\n this.contexts.set(contextId, existing);\n return existing;\n }\n const agent = await this.opts.agentFactory(contextId);\n this.contexts.set(contextId, agent);\n while (this.contexts.size > this.maxContexts) {\n const oldest = this.contexts.keys().next().value;\n if (oldest === undefined) break;\n this.contexts.delete(oldest);\n }\n return agent;\n }\n\n /** Read a request body with a hard cap; JSON.parse errors to the caller. */\n private readBody(req: IncomingMessage): Promise<string> {\n const max = this.opts.maxBodyBytes ?? 10 * 1024 * 1024;\n return new Promise<string>((resolve, reject) => {\n let data = \"\";\n req.on(\"data\", (c) => {\n data += c;\n if (data.length > max) {\n req.destroy();\n reject(new AgentError(\"A2A_BODY_TOO_LARGE\", `Request body exceeds ${max} bytes`, false));\n }\n });\n req.on(\"end\", () => resolve(data));\n req.on(\"error\", reject);\n });\n }\n\n private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const cors = this.corsHeaders(req.headers.origin);\n const send = (code: number, body: unknown): void => {\n res.writeHead(code, { \"content-type\": \"application/json\", ...cors });\n res.end(JSON.stringify(body));\n };\n try {\n if (req.method === \"OPTIONS\") {\n res.writeHead(204, { ...cors });\n res.end();\n return;\n }\n if (req.method === \"GET\" && (req.url === \"/ok\" || req.url === \"/health\")) {\n send(200, { ok: true });\n return;\n }\n if (req.method === \"GET\" && req.url === \"/.well-known/agent-card.json\") {\n send(200, this.opts.card);\n return;\n }\n if (req.method === \"POST\" && (req.url === \"/\" || req.url === \"\")) {\n const rpc = JSON.parse(await this.readBody(req)) as {\n id?: number | string;\n method?: string;\n params?: { message?: { parts?: unknown }; contextId?: string };\n };\n if (rpc.method !== \"message/send\") {\n send(200, { jsonrpc: \"2.0\", id: rpc.id, error: { code: -32601, message: `Unknown method: ${rpc.method}` } });\n return;\n }\n const contextId = rpc.params?.contextId ?? `ctx-${Date.now().toString(36)}`;\n const text = textOfParts(rpc.params?.message?.parts);\n const result = await (await this.agentFor(contextId)).run(text, this.runOpts(contextId));\n send(200, {\n jsonrpc: \"2.0\",\n id: rpc.id,\n result: { message: { role: \"agent\", parts: [{ kind: \"text\", text: result.text }] }, contextId },\n });\n return;\n }\n if (req.method === \"POST\" && req.url === \"/stream\") {\n const rpc = JSON.parse(await this.readBody(req)) as {\n id?: number | string;\n params?: { message?: { parts?: unknown }; contextId?: string };\n };\n const contextId = rpc.params?.contextId ?? `ctx-${Date.now().toString(36)}`;\n const text = textOfParts(rpc.params?.message?.parts);\n res.writeHead(200, { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\", connection: \"keep-alive\" });\n const write = (payload: unknown): void => {\n res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n };\n // Stop the agent when the client disconnects (headers already sent, so\n // we can only report the abort on the wire as a final error frame).\n const disconnect = new AbortController();\n res.on(\"close\", () => {\n if (!res.writableEnded) disconnect.abort();\n });\n try {\n const gen = (await this.agentFor(contextId)).stream(text, {\n signal: disconnect.signal,\n ...this.runOpts(contextId),\n });\n for (;;) {\n const next = await gen.next();\n if (next.done) {\n write({ contextId, done: true, text: next.value.text });\n break;\n }\n write({ contextId, event: next.value });\n }\n } catch (err) {\n write({ contextId, error: err instanceof Error ? err.message : String(err) });\n }\n write(\"[DONE]\");\n res.end();\n return;\n }\n send(404, { error: \"not found\" });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (res.headersSent) {\n // Mid-stream failure (e.g. oversized body): SSE headers already out.\n try {\n res.write(`data: ${JSON.stringify({ error: message })}\\n\\n`);\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } catch {\n // Socket gone — nothing more to do.\n }\n return;\n }\n send(\n err instanceof AgentError && err.code === \"A2A_BODY_TOO_LARGE\" ? 413 : 200,\n { jsonrpc: \"2.0\", id: null, error: { code: -32603, message } },\n );\n }\n }\n\n async start(port?: number, host?: string): Promise<number> {\n const listenPort = port ?? this.opts.port ?? 0;\n const listenHost = host ?? this.opts.host ?? \"127.0.0.1\";\n this.server = createServer((req, res) => void this.handle(req, res));\n await new Promise<void>((resolve) => this.server?.listen(listenPort, listenHost, () => resolve()));\n return (this.server.address() as { port: number }).port;\n }\n\n async stop(): Promise<void> {\n await new Promise<void>((resolve, reject) =>\n this.server ? this.server.close((e) => (e ? reject(e) : resolve())) : resolve(),\n );\n this.server = undefined;\n this.contexts.clear();\n }\n}\n","import { AgentError } from \"../types/index.js\";\nimport type { StreamEvent } from \"../streaming/index.js\";\nimport { A2AClient } from \"../a2a/index.js\";\n\n/**\n * Frontend/server-component client for Framework agents.\n * Framework-agnostic (fetch + async iterators): use directly in TanStack\n * Query loaders, Next.js route handlers/components, Svelte, or plain DOM.\n * React bindings live in framework-agents-react (thin layer over this client).\n */\n\nexport interface AgentClientOptions {\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n}\n\nexport class AgentClient {\n private a2a: A2AClient;\n private fetchFn: typeof fetch;\n readonly endpoint: string;\n\n constructor(endpoint: string, opts: AgentClientOptions = {}) {\n this.endpoint = endpoint.replace(/\\/$/, \"\");\n this.fetchFn = opts.fetchFn ?? fetch;\n this.a2a = new A2AClient(this.endpoint, opts);\n }\n\n async card() {\n return this.a2a.getCard();\n }\n\n async send(text: string, contextId?: string): Promise<{ text: string; contextId?: string }> {\n return this.a2a.send(text, contextId);\n }\n\n /** Live StreamEvents over SSE (`POST /stream`). Throws AgentError on server errors. */\n async *stream(\n text: string,\n contextId?: string,\n signal?: AbortSignal,\n opts: { onContext?: (contextId: string) => void } = {},\n ): AsyncGenerator<StreamEvent> {\n let res: Response;\n try {\n res = await this.fetchFn(`${this.endpoint}/stream`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"text/event-stream\" },\n // JSON-RPC envelope — the server reads params.message.parts.\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: `a2a-${Date.now().toString(36)}`,\n method: \"message/stream\",\n params: {\n message: { role: \"user\", parts: [{ kind: \"text\", text }] },\n ...(contextId ? { contextId } : {}),\n },\n }),\n ...(signal ? { signal } : {}),\n });\n } catch (err) {\n throw new AgentError(\"A2A_TRANSPORT\", `Stream failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok || !res.body) throw new AgentError(\"A2A_TRANSPORT\", `Stream HTTP ${res.status}`, res.status >= 500);\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const flush = function* (chunk: string): Generator<StreamEvent> {\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (payload === \"[DONE]\") continue;\n let msg: { contextId?: string; event?: StreamEvent; error?: string };\n try {\n msg = JSON.parse(payload) as { contextId?: string; event?: StreamEvent; error?: string };\n } catch {\n continue;\n }\n if (msg.contextId) opts.onContext?.(msg.contextId);\n if (msg.error) throw new AgentError(\"A2A_ERROR\", msg.error, false);\n if (msg.event && typeof msg.event.type === \"string\") yield msg.event;\n }\n };\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield* flush(decoder.decode(value, { stream: true }));\n }\n yield* flush(decoder.decode());\n } finally {\n // Early break/throw/abort: release the connection and stop the\n // upstream agent instead of letting the run finish in the background.\n await reader.cancel().catch(() => {});\n }\n }\n}\n\n/**\n * Next.js / TanStack Start route handler bridge: POST { text, contextId? }\n * → SSE stream of agent events. `AgentClient.stream` posts to\n * `${endpoint}/stream`, so mount this at `app/api/agent/stream/route.ts` and\n * point `useAgent({ endpoint: \"/api/agent\" })` (or AgentClient) at the parent:\n *\n * import { AgentClient, handleAgentRoute } from \"framework-agents\";\n * const client = new AgentClient(process.env.AGENT_URL!);\n * export const POST = (req: Request) => handleAgentRoute(req, client);\n *\n * The browser disconnect (req.signal) stops the upstream agent run.\n */\nexport async function handleAgentRoute(req: Request, client: AgentClient): Promise<Response> {\n const { text, contextId } = (await req.json()) as { text: string; contextId?: string };\n let latestContextId = contextId;\n const stream = new ReadableStream({\n async start(controller) {\n const send = (payload: unknown): void => {\n controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify(payload)}\\n\\n`));\n };\n try {\n for await (const event of client.stream(text, contextId, req.signal, {\n onContext: (id) => (latestContextId = id),\n })) {\n send({ contextId: latestContextId, event });\n }\n send({ contextId: latestContextId });\n send(\"[DONE]\");\n } catch (err) {\n send({ error: err instanceof Error ? err.message : String(err) });\n } finally {\n try {\n controller.close();\n } catch {\n // Already closed (e.g. browser disconnect while flushing).\n }\n }\n },\n });\n return new Response(stream, { headers: { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\" } });\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { config as dotenvConfig } from \"dotenv\";\nimport { z } from \"zod\";\nimport { Agent } from \"../agent/index.js\";\nimport { initChatModel } from \"../models/factory.js\";\nimport { A2AServer } from \"../a2a/index.js\";\nimport { SessionManager } from \"../sessions/index.js\";\nimport { LocalFileStorage } from \"../sessions/index.js\";\nimport { discoverSkills, SkillRegistry } from \"../skills/index.js\";\nimport { FileCheckpointer } from \"../checkpoint/index.js\";\nimport { filesystemMiddleware, todoListMiddleware } from \"../middleware/index.js\";\nimport type { AgentMiddleware } from \"../middleware/index.js\";\n\n/**\n * framework.json — declare agents, launch them as A2A servers.\n * Relative paths resolve against the config file's directory.\n */\n\nconst AgentDefSchema = z.object({\n name: z.string().min(1),\n description: z.string().default(\"\"),\n systemPrompt: z.string().default(\"You are a helpful agent. Use tools when needed. Be concise.\"),\n model: z.string(),\n port: z.number().int().positive().optional(),\n skills: z.array(z.string()).default([]),\n filesystem: z.string().optional(),\n todos: z.boolean().default(false),\n maxSteps: z.number().int().positive().default(8),\n sessionDir: z.string().optional(),\n /** Extra env file for this agent (keys override framework-level). */\n envFile: z.string().optional(),\n});\n\n/**\n * An agent entry is either inline or a file reference:\n * `{ \"file\": \"./agents/helper.json\" }` (plus optional inline overrides).\n */\nconst AgentEntrySchema = z.union([\n AgentDefSchema,\n z.object({ file: z.string() }).catchall(z.unknown()),\n]);\n\nconst FrameworkFileSchema = z.object({\n server: z.object({ host: z.string().default(\"127.0.0.1\"), basePort: z.number().int().min(0).default(8484) }).default({}),\n /** Framework-level env file(s), loaded before agents resolve models. */\n envFile: z.union([z.string(), z.array(z.string())]).optional(),\n /** Inline env mapping (applied after env files, overrides them). */\n env: z.record(z.string()).optional(),\n /** Local checkpoint dir for served agents (durable HITL threads). */\n checkpointer: z.object({ dir: z.string() }).optional(),\n http: z.object({ corsOrigins: z.array(z.string()).default([]) }).default({}),\n agents: z.array(AgentEntrySchema).min(1),\n});\n\nexport { FrameworkFileSchema };\n\nexport type FrameworkFile = z.infer<typeof FrameworkFileSchema>;\nexport type ServedAgent = { name: string; url: string; cardUrl: string; server: A2AServer };\nexport type ResolvedAgentDef = z.infer<typeof AgentDefSchema>;\n\n/** loadFrameworkConfig output: every entry resolved to a concrete agent def. */\nexport interface LoadedFrameworkFile {\n server: { host: string; basePort: number };\n envFile?: string | string[];\n env?: Record<string, string>;\n checkpointer?: { dir: string };\n http: { corsOrigins: string[] };\n agents: ResolvedAgentDef[];\n}\n\n/**\n * Load an env file if present (silent when missing). `override: false` fills\n * gaps like plain dotenv (the process environment wins); `override: true`\n * lets later files beat earlier ones — used for agent-level files, which the\n * config schema documents as overriding framework-level keys.\n */\nexport function loadEnvFile(path: string, override = true): void {\n dotenvConfig({ path, override });\n}\n\nfunction resolveAgentPaths(\n def: z.infer<typeof AgentDefSchema>,\n dir: string,\n): ResolvedAgentDef {\n return {\n ...def,\n skills: def.skills.map((s) => resolve(dir, s)),\n ...(def.filesystem ? { filesystem: resolve(dir, def.filesystem) } : {}),\n ...(def.sessionDir ? { sessionDir: resolve(dir, def.sessionDir) } : {}),\n ...(def.envFile ? { envFile: resolve(dir, def.envFile) } : {}),\n };\n}\n\n/** Merge file-owned keys (resolved against the agent file's dir) with inline overrides (framework dir). */\nfunction resolveAgentEntry(\n fileRaw: Record<string, unknown>,\n overrides: Record<string, unknown>,\n agentDir: string,\n frameworkDir: string,\n): ResolvedAgentDef {\n const fileKeys = new Set(Object.keys(fileRaw));\n const merged = AgentDefSchema.parse({ ...fileRaw, ...overrides });\n const against = (key: string): string => (fileKeys.has(key) && !(key in overrides) ? agentDir : frameworkDir);\n return {\n ...merged,\n skills: merged.skills.map((s) => resolve(against(\"skills\"), s)),\n ...(merged.filesystem ? { filesystem: resolve(against(\"filesystem\"), merged.filesystem) } : {}),\n ...(merged.sessionDir ? { sessionDir: resolve(against(\"sessionDir\"), merged.sessionDir) } : {}),\n ...(merged.envFile ? { envFile: resolve(against(\"envFile\"), merged.envFile) } : {}),\n };\n}\n\nexport function loadFrameworkConfig(path: string): LoadedFrameworkFile {\n const raw = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\n const parsed = FrameworkFileSchema.parse(raw);\n const dir = dirname(resolve(path));\n\n for (const envFile of parsed.envFile ? [parsed.envFile].flat() : []) {\n // Framework-level files fill gaps only — real environment variables win.\n loadEnvFile(resolve(dir, envFile), false);\n }\n for (const [key, value] of Object.entries(parsed.env ?? {})) {\n process.env[key] = value;\n }\n\n return {\n server: parsed.server,\n ...(parsed.envFile ? { envFile: parsed.envFile } : {}),\n ...(parsed.env ? { env: parsed.env } : {}),\n ...(parsed.checkpointer ? { checkpointer: { dir: resolve(dir, parsed.checkpointer.dir) } } : {}),\n http: parsed.http,\n agents: parsed.agents.map((entry) => {\n if (\"file\" in entry && typeof entry.file === \"string\") {\n const agentPath = resolve(dir, entry.file);\n const agentDir = dirname(agentPath);\n const fileRaw = JSON.parse(readFileSync(agentPath, \"utf8\")) as Record<string, unknown>;\n const { file: _file, ...overrides } = entry as Record<string, unknown>;\n void _file;\n const resolved = resolveAgentEntry(fileRaw, overrides, agentDir, dir);\n if (resolved.envFile) loadEnvFile(resolved.envFile);\n return resolved;\n }\n const resolved = resolveAgentPaths(AgentDefSchema.parse(entry), dir);\n if (resolved.envFile) loadEnvFile(resolved.envFile);\n return resolved;\n }),\n };\n}\n\nexport async function buildServedAgent(\n def: ResolvedAgentDef,\n opts: { sessionId?: string } = {},\n): Promise<{ agent: Agent; card: { name: string; description?: string } }> {\n const middlewares: AgentMiddleware[] = [];\n if (def.filesystem) middlewares.push(filesystemMiddleware({ root: def.filesystem }));\n if (def.todos) middlewares.push(todoListMiddleware());\n\n let systemPrompt = def.systemPrompt;\n if (def.skills.length) {\n const registry = new SkillRegistry();\n for (const dir of def.skills) {\n for (const s of await discoverSkills([dir])) {\n try {\n registry.register(s);\n } catch {\n // Duplicate skill names across dirs: first wins.\n }\n }\n }\n const catalog = registry.list().map((s) => `- ${s.name}: ${s.description}`).join(\"\\n\");\n if (catalog) systemPrompt += `\\n\\nAvailable skill packs (mention $name to invoke):\\n${catalog}`;\n }\n\n const agent = new Agent({\n name: def.name,\n description: def.description,\n systemPrompt,\n model: initChatModel(def.model),\n maxSteps: def.maxSteps,\n middleware: middlewares,\n ...(def.sessionDir\n ? {\n // Context-scoped id keeps one def's sessions from mingling when\n // the server runs a fresh agent per A2A contextId.\n sessionManager: new SessionManager({\n sessionId: opts.sessionId ?? def.name,\n storage: new LocalFileStorage(def.sessionDir),\n }),\n }\n : {}),\n });\n return { agent, card: { name: def.name, ...(def.description ? { description: def.description } : {}) } };\n}\n\nexport async function serveFramework(file: LoadedFrameworkFile): Promise<{ agents: ServedAgent[]; stop: () => Promise<void> }> {\n const served: ServedAgent[] = [];\n const checkpointer = file.checkpointer ? new FileCheckpointer(file.checkpointer.dir) : undefined;\n let port = file.server.basePort;\n for (const def of file.agents) {\n const { card } = await buildServedAgent(def);\n const server = new A2AServer({\n card,\n // Fresh agent per A2A contextId — sharing one instance would leak one\n // conversation into another context's history.\n agentFactory: (contextId) =>\n buildServedAgent(def, def.sessionDir ? { sessionId: `${def.name}:${contextId}` } : {}).then((r) => r.agent),\n ...(checkpointer ? { checkpointer } : {}),\n corsOrigins: file.http.corsOrigins,\n host: file.server.host,\n });\n const actual = await server.start(def.port ?? port, file.server.host);\n port = actual + 1;\n const url = `http://${file.server.host}:${actual}`;\n served.push({ name: def.name, url, cardUrl: `${url}/.well-known/agent-card.json`, server });\n }\n return {\n agents: served,\n stop: async () => {\n for (const s of served) await s.server.stop();\n },\n };\n}\n","import { AgentError } from \"../types/index.js\";\n\n/**\n * Model capability registry — researched defaults live here so users never\n * pick tiers. Full per-model research (vision, tools, reasoning, context\n * limits) lands later; until then: explicit allowlist + fail-fast error.\n */\n\nexport type ModelCapability = \"vision\" | \"tools\" | \"reasoning-stream\";\n\n/** Model ids known to accept image inputs (researched 2026-10; extended as models are verified). */\nconst VISION_CAPABLE_PATTERNS: RegExp[] = [\n /qwen2.*vl/i,\n /qwen.*vl/i,\n /llama-3\\.2-11b-vision/i,\n /llama-3\\.2-90b-vision/i,\n /llava/i,\n /minicpm-v/i,\n /gpt-4o/i,\n /gpt-4\\.1/i,\n /claude.*sonnet/i,\n /claude.*opus/i,\n /gemini/i,\n];\n\nexport function supportsVision(modelId: string): boolean {\n return VISION_CAPABLE_PATTERNS.some((re) => re.test(modelId));\n}\n\n/** Throw AgentError(MODEL_CAPABILITY) when input needs vision the model lacks. */\nexport function assertCanHandle(modelId: string, needsVision: boolean): void {\n if (needsVision && !supportsVision(modelId)) {\n throw new AgentError(\n \"MODEL_CAPABILITY\",\n `Model \"${modelId}\" cannot take image input. Switch TOGETHER_MODEL to a vision-capable model (e.g. Qwen/Qwen2.5-VL-72B-Instruct) or drop the images.`,\n false,\n );\n }\n}\n","import type { ChatMessage, ContentBlock } from \"../types/index.js\";\nimport { AgentError, hasImages, imagesOf, wireTextOf } from \"../types/index.js\";\nimport type { CompleteOptions, ModelCompletion, ModelProvider } from \"./index.js\";\nimport { assertCanHandle } from \"./capabilities.js\";\n\nexport interface OpenAICompatibleOptions {\n baseUrl: string;\n apiKey: string;\n model: string;\n temperature?: number;\n maxTokens?: number;\n /** Stream responses (SSE) so text + thinking tokens flow via callbacks. Default false. */\n stream?: boolean;\n /** fetch-compatible; injectable for tests. Defaults to global fetch. */\n fetchFn?: typeof fetch;\n}\n\ninterface ChoiceMessage {\n content?: string | null;\n /** Thinking trace: Together sends `reasoning`, vLLM/DeepSeek `reasoning_content`. */\n reasoning?: string | null;\n reasoning_content?: string | null;\n tool_calls?: { id?: string; function: { name: string; arguments: string } }[];\n}\n\ninterface StreamDelta {\n content?: string | null;\n /** Thinking deltas: Together sends `reasoning`, vLLM/DeepSeek `reasoning_content`. */\n reasoning?: string | null;\n reasoning_content?: string | null;\n tool_calls?: { id?: string; index?: number; function: { name?: string; arguments?: string } }[];\n}\n\n/** Reasoning-token count: Together reports it top-level, OpenAI nested in details. */\nfunction reasoningOf(usage: {\n reasoning_tokens?: number;\n completion_tokens_details?: { reasoning_tokens?: number };\n}): number | undefined {\n return usage.reasoning_tokens ?? usage.completion_tokens_details?.reasoning_tokens;\n}\n\n/** Thinking trace across provider field spellings. */\nfunction thinkingOf(m: { reasoning?: string | null; reasoning_content?: string | null }): string | undefined {\n const trace = m.reasoning ?? m.reasoning_content;\n return trace ? trace : undefined;\n}\n\nfunction toWireRole(role: ChatMessage[\"role\"]): string {\n if (role === \"tool\") return \"tool\";\n return role;\n}\n\nfunction toWireContent(m: ChatMessage): unknown {\n if (typeof m.content === \"string\" && !hasImages(m.content)) return m.content;\n const text = wireTextOf(m.content);\n const imgs = imagesOf(m.content);\n if (!imgs.length) return text;\n return [\n ...(text ? [{ type: \"text\", text }] : []),\n ...imgs.map((img) => ({\n type: \"image_url\",\n image_url: { url: img.data ? `data:${img.mimeType ?? \"image/jpeg\"};base64,${img.data}` : img.url },\n })),\n ];\n}\n\nfunction toWireMessage(m: ChatMessage): Record<string, unknown> {\n const base: Record<string, unknown> = { role: toWireRole(m.role), content: toWireContent(m) };\n if (m.toolCallId) base.tool_call_id = m.toolCallId;\n if (typeof m.content !== \"string\") {\n const calls = m.content.filter(\n (b): b is Extract<ContentBlock, { type: \"tool_call\" }> => b.type === \"tool_call\",\n );\n if (calls.length) {\n base.tool_calls = calls.map((c) => ({\n id: c.id,\n type: \"function\",\n function: { name: c.name, arguments: JSON.stringify(c.args ?? {}) },\n }));\n }\n }\n return base;\n}\n\n/**\n * Minimal OpenAI-compatible chat provider (OpenAI, TogetherAI, vLLM, etc.).\n * POST {baseUrl}/chat/completions with tools; no SDK dependency.\n * - Images: fail fast with MODEL_CAPABILITY when the model can't see.\n * - Thinking: reasoning_content streams through onThinking (SSE when stream: true).\n */\nexport class OpenAICompatibleProvider implements ModelProvider {\n readonly id: string;\n readonly capabilities = { structuredOutput: true, streaming: true };\n private opts: OpenAICompatibleOptions;\n\n constructor(opts: OpenAICompatibleOptions) {\n if (!opts.apiKey) throw new Error(\"OpenAICompatibleProvider: apiKey is required (.env TOGETHER_API_KEY / OPENAI_API_KEY)\");\n this.opts = { temperature: 0.2, ...opts };\n this.id = `openai-compatible:${opts.model}`;\n }\n\n async complete(options: CompleteOptions): Promise<ModelCompletion> {\n const { fetchFn = fetch, baseUrl, apiKey, model, temperature, maxTokens, stream } = this.opts;\n const needsVision = options.messages.some((m) => hasImages(m.content));\n assertCanHandle(model, needsVision);\n\n const url = `${baseUrl.replace(/\\/$/, \"\")}/chat/completions`;\n const body = {\n model,\n temperature,\n ...(maxTokens ? { max_tokens: maxTokens } : {}),\n // stream_options makes OpenAI-compatible servers attach usage to the final\n // chunk; without it streaming runs report {0,0} — budgets/cost would be fiction.\n ...(stream ? { stream: true, stream_options: { include_usage: true } } : {}),\n ...(options.responseFormat\n ? {\n response_format: {\n type: \"json_schema\",\n json_schema: {\n name: options.responseFormat.name,\n strict: options.responseFormat.strict ?? true,\n schema: options.responseFormat.schema,\n },\n },\n }\n : {}),\n messages: options.messages.map(toWireMessage),\n ...(options.tools.length\n ? {\n tools: options.tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n // Without parameters the API advertises a zero-arg tool.\n ...(t.parametersSchema ? { parameters: t.parametersSchema } : {}),\n },\n })),\n }\n : {}),\n };\n\n let res: Response;\n try {\n res = await fetchFn(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", authorization: `Bearer ${apiKey}` },\n body: JSON.stringify(body),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n } catch (err) {\n throw new AgentError(\"MODEL_ERROR\", `Model request failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const retryable = res.status === 429 || res.status >= 500;\n throw new AgentError(\"MODEL_ERROR\", `Model HTTP ${res.status}: ${text.slice(0, 300)}`, retryable);\n }\n return stream\n ? this.readStream(res, options)\n : this.readJson(res, options);\n }\n\n private async readJson(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n const json = (await res.json()) as {\n choices: { message: ChoiceMessage; finish_reason?: string | null }[];\n usage?: { prompt_tokens: number; completion_tokens: number; reasoning_tokens?: number; completion_tokens_details?: { reasoning_tokens?: number } };\n };\n const choice = json.choices[0];\n const msg = choice?.message ?? {};\n const thinking = thinkingOf(msg);\n if (thinking) options.onThinking?.(thinking);\n if (msg.content) options.onToken?.(msg.content);\n const finishReason = choice?.finish_reason ?? undefined;\n // Reasoning-split guard: finish_reason=stop with EMPTY content, no tool\n // calls, and NON-EMPTY thinking means the whole answer landed in the\n // reasoning channel (thinking models do this on short replies). Partial\n // content with thinking keeps going.\n if (!msg.content && !(msg.tool_calls ?? []).length && thinking && finishReason === \"stop\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n \"Model stopped with finish_reason=stop having put the entire answer in the reasoning channel (empty content, no tool calls, thinking present). The reasoning/content split lost the reply — retry or raise maxTokens.\",\n true,\n );\n }\n // Silent-empty guard: a thinking model can burn its WHOLE maxTokens\n // budget before emitting any content. That must never come back as a\n // successful empty answer callers can't distinguish from a real reply.\n if (!msg.content && !(msg.tool_calls ?? []).length && finishReason === \"length\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n `Model spent its entire max_tokens budget (${json.usage?.completion_tokens ?? \"?\"} tokens, finish_reason=length) thinking without producing content. Raise maxTokens.`,\n false,\n );\n }\n const reasoningTokens = json.usage ? reasoningOf(json.usage) : undefined;\n return {\n text: msg.content ?? \"\",\n ...(thinking ? { thinking } : {}),\n toolCalls: parseToolCalls(msg.tool_calls ?? []),\n ...(finishReason ? { finishReason } : {}),\n usage: {\n inputTokens: json.usage?.prompt_tokens ?? 0,\n outputTokens: json.usage?.completion_tokens ?? 0,\n ...(reasoningTokens != null ? { reasoningTokens } : {}),\n },\n };\n }\n\n /** SSE: `data: {...}` lines; delta.content -> onToken, delta.reasoning_content -> onThinking. */\n private async readStream(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n if (!res.body) throw new Error(\"Streaming response has no body\");\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let text = \"\";\n let thinking = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens: number | undefined;\n let finishReason: string | undefined;\n const toolArgBuffers = new Map<number, { id: string; name: string; args: string }>();\n let buffer = \"\";\n\n const flush = (chunk: string) => {\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (payload === \"[DONE]\") continue;\n let evt: {\n choices?: { delta?: StreamDelta; finish_reason?: string | null }[];\n usage?: null | { prompt_tokens?: number; completion_tokens?: number; reasoning_tokens?: number; completion_tokens_details?: { reasoning_tokens?: number } };\n };\n try {\n evt = JSON.parse(payload);\n } catch {\n continue;\n }\n if (evt.choices?.[0]?.finish_reason) finishReason = evt.choices[0].finish_reason ?? undefined;\n // The usage-only final chunk has an empty/partial choices array and a\n // NON-NULL usage Together sends `\"usage\": null` on content chunks.\n if (evt.usage) {\n if (evt.usage.prompt_tokens != null) inputTokens = evt.usage.prompt_tokens;\n if (evt.usage.completion_tokens != null) outputTokens = evt.usage.completion_tokens;\n const rt = reasoningOf(evt.usage);\n if (rt != null) reasoningTokens = rt;\n continue;\n }\n const delta = evt.choices?.[0]?.delta;\n if (!delta) continue;\n const think = thinkingOf(delta);\n if (think) {\n thinking += think;\n options.onThinking?.(think);\n }\n if (delta.content) {\n text += delta.content;\n options.onToken?.(delta.content);\n }\n for (const [i, tc] of (delta.tool_calls ?? []).entries()) {\n const key = tc.index ?? i;\n const slot = toolArgBuffers.get(key) ?? { id: \"\", name: \"\", args: \"\" };\n if (tc.id) slot.id = tc.id;\n if (tc.function?.name) slot.name = tc.function.name;\n if (tc.function?.arguments) slot.args += tc.function.arguments;\n toolArgBuffers.set(key, slot);\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n flush(decoder.decode(value, { stream: true }));\n }\n flush(decoder.decode());\n\n // Same reasoning-split guard as readJson: answer landed in the reasoning\n // channel and the stream carried NO content or tool calls.\n if (!text && !toolArgBuffers.size && thinking && finishReason === \"stop\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n \"Stream ended at finish_reason=stop having put the entire answer in the reasoning channel (no content, no tool calls, thinking present). The reasoning/content split lost the reply — retry or raise maxTokens.\",\n true,\n );\n }\n // Same silent-empty guard as readJson: thought-past-budget stream.\n if (!text && !toolArgBuffers.size && finishReason === \"length\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n `Stream ended at finish_reason=length with no content (${outputTokens} tokens burned). Raise maxTokens.`,\n false,\n );\n }\n return {\n text,\n ...(thinking ? { thinking } : {}),\n ...(finishReason ? { finishReason } : {}),\n toolCalls: [...toolArgBuffers.values()]\n .filter((t) => t.name)\n // Streamed ids must not repeat across turns (Anthropic rejects duplicates).\n .map((t) => ({ id: t.id || `call_${++callSeq}`, name: t.name, args: safeJson(t.args) })),\n usage: {\n inputTokens,\n outputTokens,\n ...(reasoningTokens != null ? { reasoningTokens } : {}),\n },\n };\n }\n}\n\nlet callSeq = 0;\n\nfunction parseToolCalls(calls: { id?: string; function: { name: string; arguments: string } }[]): ModelCompletion[\"toolCalls\"] {\n return calls.map((c) => ({ id: c.id ?? `call_${++callSeq}`, name: c.function.name, args: safeJson(c.function.arguments || \"{}\") }));\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw || \"{}\");\n } catch {\n return {};\n }\n}\n\n/** Build a provider from env config (TogetherAI preferred when key present). */\nexport function providerFromEnv(\n active: { baseUrl: string; apiKey: string; model: string },\n extra?: Partial<OpenAICompatibleOptions>,\n): OpenAICompatibleProvider {\n return new OpenAICompatibleProvider({ baseUrl: active.baseUrl, apiKey: active.apiKey, model: active.model, ...extra });\n}\n","import { AgentError, hasImages, imagesOf, wireTextOf, type ChatMessage } from \"../types/index.js\";\nimport type { CompleteOptions, ModelCompletion, ModelProvider } from \"./index.js\";\nimport { assertCanHandle } from \"./capabilities.js\";\n\nexport interface AnthropicOptions {\n apiKey: string;\n model: string;\n baseUrl?: string;\n maxTokens?: number;\n temperature?: number;\n /** Extended thinking budget (tokens). Enables thinking blocks. */\n thinkingBudget?: number;\n stream?: boolean;\n fetchFn?: typeof fetch;\n}\n\ninterface AnthropicBlock {\n type: string;\n text?: string;\n thinking?: string;\n id?: string;\n name?: string;\n input?: unknown;\n}\n\n/** Anthropic calls its truncation stop reason differently — normalize. */\nfunction normalizeStopReason(stopReason?: string | null): string | undefined {\n if (!stopReason) return undefined;\n return stopReason === \"max_tokens\" ? \"length\" : stopReason;\n}\n\n/** Silent-empty guard: max_tokens burned with zero usable content. */\nfunction assertNotEmptyTruncation(text: string, toolCalls: unknown[], finishReason: string | undefined, tokenCount: number): void {\n if (!text && !toolCalls.length && finishReason === \"length\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n `Model stopped at max_tokens (${tokenCount} tokens) without producing content. Raise maxTokens.`,\n false,\n );\n }\n}\n\n/** Reasoning-split guard: finish_reason=stop with EMPTY text, no tool calls,\n * and NON-EMPTY thinking means the whole answer landed in the reasoning\n * channel (thinking models do this on short replies). Partial text with\n * thinking keeps going. */\nfunction assertNotEmptyReasoningSplit(text: string, toolCalls: unknown[], thinking: string, stopReason: string | undefined): void {\n if (!text && !toolCalls.length && thinking && stopReason === \"stop\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n \"Model stopped with stop_reason=stop having put the entire answer in the reasoning channel (empty content, no tool calls, thinking present). The reasoning/content split lost the reply — retry or raise maxTokens.\",\n true,\n );\n }\n}\n\nfunction toAnthropicContent(m: ChatMessage): unknown {\n if (typeof m.content === \"string\") return m.content;\n const parts: unknown[] = [];\n const text = wireTextOf(m.content);\n if (text) parts.push({ type: \"text\", text });\n for (const img of imagesOf(m.content)) {\n parts.push({\n type: \"image\",\n source: img.data\n ? { type: \"base64\", media_type: img.mimeType ?? \"image/jpeg\", data: img.data }\n : { type: \"url\", url: img.url },\n });\n }\n for (const b of m.content) {\n if (b.type === \"tool_call\") parts.push({ type: \"tool_use\", id: b.id, name: b.name, input: b.args ?? {} });\n }\n return parts;\n}\n\n/**\n * Native Anthropic Messages API (fetch-based, no SDK).\n * - tools become `tools` with input_schema; tool results become tool_result blocks\n * - thinking blocks stream/return via onThinking\n * - no native json_schema mode: capabilities.structuredOutput is false,\n * so `auto` responseFormat correctly falls back to the tool strategy\n */\nexport class AnthropicProvider implements ModelProvider {\n readonly id: string;\n readonly capabilities = { structuredOutput: false, streaming: true };\n private opts: AnthropicOptions;\n\n constructor(opts: AnthropicOptions) {\n if (!opts.apiKey) throw new Error(\"AnthropicProvider: apiKey is required (.env ANTHROPIC_API_KEY)\");\n this.opts = { baseUrl: \"https://api.anthropic.com\", maxTokens: 1024, ...opts };\n // Extended thinking requires max_tokens > budget_tokens — fail at\n // construction with the fix, not as a confusing API 400 on first call.\n if (this.opts.thinkingBudget && this.opts.maxTokens != null && this.opts.maxTokens <= this.opts.thinkingBudget) {\n throw new Error(\n `AnthropicProvider: maxTokens (${this.opts.maxTokens}) must exceed thinkingBudget (${this.opts.thinkingBudget}); raise maxTokens`,\n );\n }\n this.id = `anthropic:${opts.model}`;\n }\n\n async complete(options: CompleteOptions): Promise<ModelCompletion> {\n const { fetchFn = fetch, apiKey, model, baseUrl, maxTokens, temperature, thinkingBudget, stream } = this.opts;\n const needsVision = options.messages.some((m) => hasImages(m.content));\n assertCanHandle(model, needsVision);\n\n const system = options.messages.filter((m) => m.role === \"system\").map((m) => wireTextOf(m.content)).join(\"\\n\\n\");\n const messages: { role: \"user\" | \"assistant\"; content: unknown }[] = [];\n for (const m of options.messages.filter((x) => x.role !== \"system\")) {\n if (m.role === \"tool\") {\n // Anthropic expects ALL tool_results from one assistant turn in a\n // single user message — group consecutive tool messages.\n const result = { type: \"tool_result\", tool_use_id: m.toolCallId, content: toAnthropicContent(m) };\n const last = messages[messages.length - 1];\n if (last && last.role === \"user\" && Array.isArray(last.content) && last.content.some((b) => (b as { type?: string }).type === \"tool_result\")) {\n last.content.push(result);\n continue;\n }\n messages.push({ role: \"user\", content: [result] });\n continue;\n }\n messages.push({ role: m.role === \"assistant\" ? (\"assistant\" as const) : (\"user\" as const), content: toAnthropicContent(m) });\n }\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n ...(system ? { system } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(thinkingBudget ? { thinking: { type: \"enabled\", budget_tokens: thinkingBudget } } : {}),\n ...(stream ? { stream: true } : {}),\n messages,\n ...(options.tools.length\n ? {\n tools: options.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parametersSchema ?? { type: \"object\" },\n })),\n }\n : {}),\n };\n\n let res: Response;\n try {\n res = await fetchFn(`${baseUrl!.replace(/\\/$/, \"\")}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n ...(stream ? { accept: \"text/event-stream\" } : {}),\n },\n body: JSON.stringify(body),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n } catch (err) {\n throw new AgentError(\"MODEL_ERROR\", `Model request failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const retryable = res.status === 429 || res.status >= 500;\n throw new AgentError(\"MODEL_ERROR\", `Model HTTP ${res.status}: ${text.slice(0, 300)}`, retryable);\n }\n return stream ? this.readStream(res, options) : this.readJson(res, options);\n }\n\n private toCompletion(blocks: AnthropicBlock[], usage: { inputTokens: number; outputTokens: number }, options: CompleteOptions): ModelCompletion {\n let text = \"\";\n let thinking = \"\";\n const toolCalls: ModelCompletion[\"toolCalls\"] = [];\n for (const b of blocks) {\n if (b.type === \"text\" && b.text) {\n text += b.text;\n options.onToken?.(b.text);\n } else if (b.type === \"thinking\" && b.thinking) {\n thinking += b.thinking;\n options.onThinking?.(b.thinking);\n } else if (b.type === \"tool_use\" && b.name) {\n toolCalls.push({ id: b.id ?? `call_${toolCalls.length}`, name: b.name, args: b.input ?? {} });\n }\n }\n return { text, ...(thinking ? { thinking } : {}), toolCalls, usage };\n }\n\n private async readJson(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n const json = (await res.json()) as {\n content?: AnthropicBlock[];\n stop_reason?: string | null;\n usage?: { input_tokens: number; output_tokens: number };\n };\n const out = this.toCompletion(json.content ?? [], {\n inputTokens: json.usage?.input_tokens ?? 0,\n outputTokens: json.usage?.output_tokens ?? 0,\n }, options);\n const finishReason = normalizeStopReason(json.stop_reason);\n assertNotEmptyTruncation(out.text, out.toolCalls, finishReason, json.usage?.output_tokens ?? 0);\n assertNotEmptyReasoningSplit(out.text, out.toolCalls, out.thinking ?? \"\", finishReason);\n return finishReason ? { ...out, finishReason } : out;\n }\n\n private async readStream(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n if (!res.body) throw new Error(\"Streaming response has no body\");\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let event = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let stopReason: string | undefined;\n const blocks: AnthropicBlock[] = [];\n let current: AnthropicBlock | undefined;\n let jsonInput = \"\";\n\n const flush = (chunk: string) => {\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t) continue;\n if (t.startsWith(\"event:\")) {\n event = t.slice(6).trim();\n continue;\n }\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (!payload) continue;\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(payload) as Record<string, unknown>;\n } catch {\n continue;\n }\n if (event === \"message_start\") {\n // message_start carries the input-side usage up front.\n const mu = ((data.message ?? {}) as { usage?: { input_tokens?: number } }).usage;\n if (mu?.input_tokens != null) inputTokens = mu.input_tokens;\n } else if (event === \"message_delta\") {\n // message_delta.usage.output_tokens is cumulative — assign, don't add.\n const du = (data.usage ?? {}) as { output_tokens?: number };\n if (du.output_tokens != null) outputTokens = du.output_tokens;\n const sr = (data.delta ?? {}) as { stop_reason?: string };\n if (sr.stop_reason) stopReason = normalizeStopReason(sr.stop_reason);\n } else if (event === \"content_block_start\") {\n const block = (data.content_block ?? {}) as AnthropicBlock;\n current = { type: block.type, id: block.id, name: block.name };\n jsonInput = \"\";\n } else if (event === \"content_block_delta\") {\n const delta = (data.delta ?? {}) as { type?: string; text?: string; thinking?: string; partial_json?: string };\n if (delta.text) {\n current = current ?? { type: \"text\" };\n current.text = (current.text ?? \"\") + delta.text;\n } else if (delta.thinking) {\n current = current ?? { type: \"thinking\" };\n current.thinking = (current.thinking ?? \"\") + delta.thinking;\n } else if (delta.partial_json) {\n jsonInput += delta.partial_json;\n }\n } else if (event === \"content_block_stop\") {\n if (current) {\n if (current.type === \"tool_use\") {\n try {\n current.input = JSON.parse(jsonInput || \"{}\") as unknown;\n } catch {\n current.input = {};\n }\n }\n blocks.push(current);\n current = undefined;\n }\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n flush(decoder.decode(value, { stream: true }));\n }\n flush(decoder.decode());\n if (current) blocks.push(current);\n const out = this.toCompletion(blocks, { inputTokens, outputTokens }, options);\n assertNotEmptyTruncation(out.text, out.toolCalls, stopReason, outputTokens);\n assertNotEmptyReasoningSplit(out.text, out.toolCalls, out.thinking ?? \"\", stopReason);\n return stopReason ? { ...out, finishReason: stopReason } : out;\n }\n}\n","import { OpenAICompatibleProvider } from \"./openai-compatible.js\";\n\nexport interface OllamaOptions {\n model: string;\n /** Defaults to local Ollama. No key needed. */\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n stream?: boolean;\n fetchFn?: typeof fetch;\n}\n\n/**\n * Local-first Ollama provider via its OpenAI-compatible endpoint.\n * No API key, no account, no network beyond localhost. Tool support\n * depends on the model (qwen2.5, llama3.1+ work well).\n * structuredOutput stays false → `auto` format uses the tool strategy.\n */\nexport class OllamaProvider extends OpenAICompatibleProvider {\n override readonly id: string;\n override readonly capabilities = { structuredOutput: false, streaming: true };\n\n constructor(opts: OllamaOptions) {\n super({\n baseUrl: opts.baseUrl ?? \"http://localhost:11434/v1\",\n apiKey: \"ollama\",\n model: opts.model,\n ...(opts.temperature != null ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens != null ? { maxTokens: opts.maxTokens } : {}),\n ...(opts.stream != null ? { stream: opts.stream } : {}),\n ...(opts.fetchFn ? { fetchFn: opts.fetchFn } : {}),\n });\n this.id = `ollama:${opts.model}`;\n }\n}\n\nexport function ollama(opts: OllamaOptions): OllamaProvider {\n return new OllamaProvider(opts);\n}\n","import { loadConfig } from \"../config/index.js\";\nimport type { ModelProvider } from \"./index.js\";\nimport { OpenAICompatibleProvider, type OpenAICompatibleOptions } from \"./openai-compatible.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OllamaProvider } from \"./ollama.js\";\n\n/**\n * Resolve `provider:model` strings to a configured provider.\n * - `together:<id>` / bare `<id>` → TogetherAI (TOGETHER_API_KEY)\n * - `openai:<id>` → OpenAI (OPENAI_API_KEY)\n * - `anthropic:<id>` → Anthropic native API (ANTHROPIC_API_KEY)\n * - `ollama:<id>` → local Ollama (no key; OLLAMA_BASE_URL or localhost:11434)\n * - `custom:<id>` + baseUrl/apiKey → any OpenAI-compatible endpoint\n */\nexport function initChatModel(\n spec: string,\n opts: {\n apiKey?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n stream?: boolean;\n thinkingBudget?: number;\n } = {},\n): ModelProvider {\n const cfg = loadConfig();\n const extra: Partial<OpenAICompatibleOptions> = {\n ...(opts.temperature != null ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens != null ? { maxTokens: opts.maxTokens } : {}),\n ...(opts.stream != null ? { stream: opts.stream } : {}),\n };\n const colon = spec.indexOf(\":\");\n const provider = colon > 0 ? spec.slice(0, colon) : \"together\";\n const model = colon > 0 ? spec.slice(colon + 1) : spec;\n switch (provider) {\n case \"together\": {\n const apiKey = opts.apiKey ?? cfg.TOGETHER_API_KEY;\n if (!apiKey) throw new Error(\"initChatModel: set TOGETHER_API_KEY in .env (or pass apiKey)\");\n return new OpenAICompatibleProvider({ baseUrl: opts.baseUrl ?? cfg.TOGETHER_BASE_URL, apiKey, model, ...extra });\n }\n case \"openai\": {\n const apiKey = opts.apiKey ?? cfg.OPENAI_API_KEY;\n if (!apiKey) throw new Error(\"initChatModel: set OPENAI_API_KEY in .env (or pass apiKey)\");\n return new OpenAICompatibleProvider({ baseUrl: opts.baseUrl ?? cfg.OPENAI_BASE_URL, apiKey, model, ...extra });\n }\n case \"anthropic\": {\n const apiKey = opts.apiKey ?? cfg.ANTHROPIC_API_KEY;\n if (!apiKey) throw new Error(\"initChatModel: set ANTHROPIC_API_KEY in .env (or pass apiKey)\");\n return new AnthropicProvider({\n apiKey,\n model,\n ...(opts.baseUrl ? { baseUrl: opts.baseUrl } : { baseUrl: cfg.ANTHROPIC_BASE_URL }),\n ...(opts.thinkingBudget != null ? { thinkingBudget: opts.thinkingBudget } : {}),\n ...extra,\n });\n }\n case \"ollama\": {\n return new OllamaProvider({ model, ...(opts.baseUrl ? { baseUrl: opts.baseUrl } : { baseUrl: cfg.OLLAMA_BASE_URL }), ...extra });\n }\n case \"custom\": {\n if (!opts.baseUrl || !opts.apiKey) throw new Error(\"initChatModel: custom: needs baseUrl + apiKey\");\n return new OpenAICompatibleProvider({ baseUrl: opts.baseUrl, apiKey: opts.apiKey, model, ...extra });\n }\n default:\n throw new Error(`initChatModel: unknown provider \"${provider}\" (use together:|openai:|anthropic:|ollama:|custom:)`);\n }\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../tools/index.js\";\n\n/**\n * Skills: portable capability packs (SKILL.md + optional tools/resources).\n * Spec: a skill is a directory with SKILL.md frontmatter\n * (name, description, version) + markdown body. Loader discovers,\n * validates, and exposes skills as Tools or prompt injections.\n */\n\nexport interface Skill {\n name: string;\n description: string;\n version: string;\n path: string;\n body: string;\n tools?: Tool[];\n}\n\nexport interface SkillLoaderOptions {\n /** Directories to scan for SKILL.md files. */\n dirs: string[];\n /** If true, throw on invalid skill; else skip with warning. Default false. */\n strict?: boolean;\n}\n\nconst FrontmatterSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n version: z.string().default(\"0.1.0\"),\n});\n\n/** Parse SKILL.md content -> { meta, body }. Pure, testable, no FS. */\nexport function parseSkillFile(content: string, path = \"<inline>\"): Omit<Skill, \"tools\"> {\n // Tolerate a leading BOM and CRLF line endings (frontmatter at EOF is fine).\n const raw = content.startsWith(\"\") ? content.slice(1) : content;\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error(`Invalid SKILL.md (missing frontmatter): ${path}`);\n const [, fm, body] = match;\n const meta: Record<string, string> = {};\n for (const line of fm.split(\"\\n\")) {\n const i = line.indexOf(\":\");\n if (i > 0) meta[line.slice(0, i).trim()] = line.slice(i + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n const parsed = FrontmatterSchema.parse(meta);\n if (!body.trim()) throw new Error(`Invalid SKILL.md (empty body): ${path}`);\n return { ...parsed, path, body: body.trim() };\n}\n\n/** Registry of loaded skills — activation is explicit, never magic. */\nexport class SkillRegistry {\n private skills = new Map<string, Skill>();\n\n register(skill: Skill): this {\n if (this.skills.has(skill.name)) throw new Error(`Skill already registered: ${skill.name}`);\n this.skills.set(skill.name, skill);\n return this;\n }\n\n get(name: string): Skill | undefined {\n return this.skills.get(name);\n }\n\n list(): Skill[] {\n return [...this.skills.values()];\n }\n\n /** Expose each skill's tools (if any) for Agent consumption. */\n asTools(): Tool[] {\n return this.list().flatMap((s) => s.tools ?? []);\n }\n}\n\n/**\n * Scan directories for SKILL.md files (one level, plus direct files).\n * Invalid skills are skipped (or throw when `strict`). Never throws for\n * missing directories — returns what it finds.\n */\nexport async function discoverSkills(dirs: string[], opts: { strict?: boolean } = {}): Promise<Skill[]> {\n const found: Skill[] = [];\n for (const dir of dirs) {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n continue;\n }\n for (const entry of entries) {\n const full = join(dir, entry);\n let stat;\n try {\n stat = statSync(full);\n } catch {\n continue;\n }\n const file = stat.isDirectory() ? join(full, \"SKILL.md\") : full;\n if (!file.endsWith(\"SKILL.md\")) continue;\n try {\n found.push({ ...parseSkillFile(readFileSync(file, \"utf8\"), file), tools: [] });\n } catch (err) {\n if (opts.strict) throw err;\n }\n }\n }\n return found;\n}\n\n/** Load + register every discoverable skill. Duplicate names throw. */\nexport async function loadSkillsInto(registry: SkillRegistry, dirs: string[], opts: { strict?: boolean } = {}): Promise<Skill[]> {\n const skills = await discoverSkills(dirs, opts);\n for (const s of skills) registry.register(s);\n return skills;\n}\n\n/**\n * Local skill routing — dependency-free TF-IDF cosine over skill\n * name+description. Explicit `$name` mentions always win. No embedding\n * APIs, no network. A pluggable embedder can replace `scoreSkills`\n * later without changing `matchSkills`.\n */\nexport function tokenize(text: string): string[] {\n return text.toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length > 1);\n}\n\nexport function scoreSkills(registry: SkillRegistry, input: string): { skill: Skill; score: number }[] {\n const skills = registry.list();\n const docs = skills.map((s) => tokenize(`${s.name} ${s.description}`));\n const query = tokenize(input);\n const df = new Map<string, number>();\n for (const doc of docs) {\n for (const term of new Set(doc)) df.set(term, (df.get(term) ?? 0) + 1);\n }\n const idf = (term: string): number => Math.log((docs.length + 1) / ((df.get(term) ?? 0) + 1)) + 1;\n const qtf = new Map<string, number>();\n for (const t of query) qtf.set(t, (qtf.get(t) ?? 0) + 1);\n const qnorm = Math.sqrt([...qtf.values()].reduce((n, c) => n + c * c, 0)) || 1;\n\n return skills.map((skill, i) => {\n // Word-boundary match: `$test` must not fire on `$testing`, nor `$art` on\n // `$artillery` (bare substring includes did both).\n if (new RegExp(`\\\\$${skill.name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(?![\\\\w-])`).test(input)) {\n return { skill, score: Number.POSITIVE_INFINITY };\n }\n const dtf = new Map<string, number>();\n for (const t of docs[i]) dtf.set(t, (dtf.get(t) ?? 0) + 1);\n let dot = 0;\n let dnorm = 0;\n for (const [term, count] of dtf) {\n const w = count * idf(term);\n dnorm += w * w;\n if (qtf.has(term)) dot += w * (qtf.get(term) ?? 0) * idf(term);\n }\n const denom = Math.sqrt(dnorm) * qnorm || 1;\n return { skill, score: dot / denom };\n });\n}\n\nexport function matchSkills(registry: SkillRegistry, input: string, threshold = 0.05): Skill[] {\n return scoreSkills(registry, input)\n .filter(({ score }) => score >= threshold)\n .sort((a, b) => b.score - a.score)\n .map(({ skill }) => skill);\n}\n","import { z } from \"zod\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\nimport { tokenize } from \"../skills/index.js\";\n\n/**\n * Retrieval interface — no bundled vector DB (local-first).\n * Adapters: InMemoryRetriever (TF-IDF, dependency-free), SparqlRetriever\n * over any GraphStore. retrievalTool() exposes them to agents.\n */\n\nexport interface ScoredDoc {\n id: string;\n text: string;\n score: number;\n meta?: Record<string, unknown>;\n}\n\nexport interface Retriever {\n readonly id: string;\n search(query: string, k?: number): Promise<ScoredDoc[]>;\n}\n\n/** Dependency-free TF-IDF retriever over static documents. */\nexport class InMemoryRetriever implements Retriever {\n readonly id = \"tfidf\";\n private docs: { id: string; text: string; meta?: Record<string, unknown>; terms: Map<string, number> }[];\n private df = new Map<string, number>();\n\n constructor(docs: { id: string; text: string; meta?: Record<string, unknown> }[]) {\n this.docs = docs.map((d) => {\n const terms = new Map<string, number>();\n for (const t of tokenize(d.text)) terms.set(t, (terms.get(t) ?? 0) + 1);\n return { ...d, terms };\n });\n for (const d of this.docs) {\n for (const t of new Set(d.terms.keys())) this.df.set(t, (this.df.get(t) ?? 0) + 1);\n }\n }\n\n private idf(term: string): number {\n return Math.log((this.docs.length + 1) / ((this.df.get(term) ?? 0) + 1)) + 1;\n }\n\n async search(query: string, k = 4): Promise<ScoredDoc[]> {\n const qtf = new Map<string, number>();\n for (const t of tokenize(query)) qtf.set(t, (qtf.get(t) ?? 0) + 1);\n return this.docs\n .map((d) => {\n let dot = 0;\n let norm = 0;\n for (const [term, count] of d.terms) {\n const w = count * this.idf(term);\n norm += w * w;\n if (qtf.has(term)) dot += w * (qtf.get(term) ?? 0) * this.idf(term);\n }\n const qnorm = Math.sqrt([...qtf.values()].reduce((n, c) => n + c * c, 0)) || 1;\n return { id: d.id, text: d.text, meta: d.meta, score: dot / ((Math.sqrt(norm) || 1) * qnorm) };\n })\n .filter((d) => d.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n }\n}\n\nexport function retrievalTool(retriever: Retriever, opts: { k?: number; name?: string } = {}) {\n return defineTool({\n name: opts.name ?? \"retrieve\",\n description: `Search the knowledge base (${retriever.id}). Returns top passages with scores.`,\n schema: z.object({ query: z.string().min(1).max(500), k: z.number().int().min(1).max(10).default(opts.k ?? 4) }),\n execute: async ({ query, k }: { query: string; k?: number }) => retriever.search(query, k),\n });\n}\n\n/** SPARQL-backed retriever: keyword match over the closure, rendered as text. */\nexport function sparqlRetriever(\n store: { match: (s: string | null, p: string | null, o: string | null) => Promise<{ subject: string; predicate: string; object: string }[]> },\n opts: { id?: string } = {},\n): Retriever {\n return {\n id: opts.id ?? \"sparql\",\n search: async (query: string, k = 4) => {\n const terms = new Set(tokenize(query));\n if (!terms.size) return [];\n const quads = await store.match(null, null, null);\n return quads\n .map((q, i) => {\n const hay = `${q.subject} ${q.predicate} ${q.object}`.toLowerCase();\n let score = 0;\n for (const t of terms) if (hay.includes(t)) score += 1;\n return { id: `q${i}`, text: `${q.subject} ${q.predicate} ${q.object}`, score };\n })\n .filter((d) => d.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n },\n };\n}\n\nexport type { Tool };\n","import { runInNewContext } from \"node:vm\";\nimport { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * Sandboxed JavaScript execution (node:vm, fresh context per call).\n * Code runs as a program (completion value returned — wrap object literals\n * in parens). No require/fetch/process by default; timeout enforced; output\n * must be JSON-serializable (returned) or a string. For untrusted code\n * prefer an external container — this is a speed bump, not a security boundary.\n */\nexport function runJavascriptTool(opts: { timeoutMs?: number; maxOutputChars?: number } = {}) {\n const timeoutMs = opts.timeoutMs ?? 2000;\n const maxOutputChars = opts.maxOutputChars ?? 4000;\n return defineTool({\n name: \"run_javascript\",\n description: \"Execute JavaScript in a sandbox (no network, no fs, timeout). Completion value becomes the result.\",\n schema: z.object({ code: z.string().min(1).max(8000) }),\n execute: async ({ code }: { code: string }) => {\n let result: unknown;\n try {\n result = runInNewContext(code, Object.freeze({ Math, JSON }), { timeout: timeoutMs });\n } catch (err) {\n // NOTE: vm errors may be cross-realm (instanceof unreliable) — match on message.\n const message = err instanceof Error ? err.message : String(err);\n if (/timed out/i.test(message)) {\n throw new AgentError(\"SANDBOX_TIMEOUT\", `Sandbox exceeded ${timeoutMs}ms`, true);\n }\n throw new AgentError(\"SANDBOX_ERROR\", `Sandbox failed: ${message}`, false);\n }\n const text = typeof result === \"string\" ? result : JSON.stringify(result ?? null);\n return text.length > maxOutputChars ? `${text.slice(0, maxOutputChars)}…[truncated]` : (result ?? null);\n },\n });\n}\n\nimport { execFile } from \"node:child_process\";\nimport { readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join, relative, resolve } from \"node:path\";\nimport { filesystemTools } from \"../middleware/index.js\";\n\n/**\n * Sandbox backend (local-first): one rooted workspace with shell `execute`\n * plus file tools, matching the Deep Agents backend shape (ls, read_file,\n * write_file, edit_file, glob, grep + execute).\n *\n * Isolation, honestly scoped: fresh cwd jail per call, scrubbed env (no\n * secrets/proxies inherited), timeouts, output caps with spill-to-file.\n * This is NOT a container boundary: never put secrets in the sandbox env,\n * gate `execute` with human-in-the-loop for sensitive work, and treat all\n * outputs as untrusted input.\n */\n\nexport interface SandboxOptions {\n /** Workspace root. Defaults to cwd. */\n root?: string;\n timeoutMs?: number;\n maxOutputChars?: number;\n /** Extra env vars for shell commands (merged over the scrubbed base). */\n env?: Record<string, string>;\n}\n\nexport interface SandboxBackend {\n readonly root: string;\n tools(): Tool[];\n}\n\nconst SCRUBBED_ENV = [\"PATH\", \"HOME\", \"LANG\", \"LC_ALL\", \"TZ\", \"TERM\", \"NO_COLOR\"];\n\nfunction baseEnv(extra: Record<string, string> = {}): Record<string, string> {\n const env: Record<string, string> = {};\n for (const k of SCRUBBED_ENV) {\n const v = process.env[k];\n if (v !== undefined) env[k] = v;\n }\n return { ...env, ...extra };\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Minimal glob (*, ?, and double-star for crossing directories) over paths relative to root. */\nexport function matchGlob(pattern: string, path: string): boolean {\n const parts = pattern.split(\"**/\");\n let rx = \"^\";\n parts.forEach((part, index) => {\n if (index > 0) rx += \"(.*/)?\";\n for (let i = 0; i < part.length; i++) {\n const c = part[i];\n if (c === \"*\" && part[i + 1] === \"*\") {\n rx += \".*\";\n i += 1;\n } else if (c === \"*\") rx += \"[^/]*\";\n else if (c === \"?\") rx += \"[^/]\";\n else rx += escapeRegExp(c);\n }\n });\n return new RegExp(`${rx}$`).test(path);\n}\n\nasync function walkFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n const walk = async (dir: string): Promise<void> => {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n const full = join(dir, e.name);\n if (e.isDirectory()) await walk(full);\n else if (e.isFile()) out.push(relative(root, full));\n }\n };\n await walk(root);\n return out.sort();\n}\n\nexport function createSandboxBackend(opts: SandboxOptions = {}): SandboxBackend {\n const root = resolve(opts.root ?? process.cwd());\n const timeoutMs = opts.timeoutMs ?? 30000;\n const maxOutputChars = opts.maxOutputChars ?? 12000;\n const env = baseEnv(opts.env);\n let spills = 0;\n\n const spill = async (text: string): Promise<string> => {\n spills += 1;\n const name = `.spill-${spills}.txt`;\n await writeFile(join(root, name), text, \"utf8\");\n return `${text.slice(0, maxOutputChars)}\\n…[truncated ${text.length - maxOutputChars} chars → read ${name} with read_file]`;\n };\n\n const executeTool = defineTool({\n name: \"execute\",\n description: \"Run a shell command in the sandbox workspace (cwd=root, scrubbed env, timeout). Large output spills to a file.\",\n schema: z.object({ command: z.string().min(1).max(4000) }),\n execute: ({ command }: { command: string }): Promise<string> =>\n new Promise<string>((resolveExec, reject) => {\n execFile(\"sh\", [\"-c\", command], { cwd: root, env, timeout: timeoutMs, maxBuffer: 4 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err && (err as { killed?: boolean }).killed) {\n // killed=true covers TWO cases with different codes; don't report\n // an instant output overflow as a 30s timeout.\n if ((err as { code?: unknown }).code === \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\") {\n reject(new AgentError(\"SANDBOX_OUTPUT_TOO_LARGE\", \"Command output exceeded the 4MB buffer; write output to a file and read it in chunks\", false));\n return;\n }\n reject(new AgentError(\"SANDBOX_TIMEOUT\", `Command exceeded ${timeoutMs}ms`, true));\n return;\n }\n const code = err && \"code\" in err ? (err as { code: number }).code : 0;\n const combined = `${stdout}${stderr ? `\\n[stderr]\\n${stderr}` : \"\"}`;\n if (combined.length <= maxOutputChars) {\n resolveExec(err ? `${combined}\\n[Command failed with exit code ${code}]` : combined || \"[Command succeeded with exit code 0]\");\n return;\n }\n void spill(combined).then(\n (pointer) => resolveExec(`${pointer}\\n[exit ${code}]`),\n reject,\n );\n });\n }),\n });\n\n const globTool = defineTool({\n name: \"glob\",\n description: \"List workspace files matching a glob (*, ?, **).\",\n schema: z.object({ pattern: z.string().min(1).max(300) }),\n execute: async ({ pattern }: { pattern: string }) => (await walkFiles(root)).filter((f) => matchGlob(pattern, f)).join(\"\\n\"),\n });\n\n const grepTool = defineTool({\n name: \"grep\",\n description: \"Search file contents (literal substring) under a glob. Returns path:line matches.\",\n schema: z.object({ query: z.string().min(1).max(300), pattern: z.string().default(\"**\") }),\n execute: async ({ query, pattern }: { query: string; pattern?: string }) => {\n const files = (await walkFiles(root)).filter((f) => matchGlob(pattern ?? \"**\", f));\n const hits: string[] = [];\n for (const f of files.slice(0, 200)) {\n let info;\n try {\n info = await stat(join(root, f));\n } catch {\n continue;\n }\n if (info.size > 512 * 1024) continue;\n let content: string;\n try {\n content = await readFile(join(root, f), \"utf8\");\n } catch {\n continue;\n }\n content.split(\"\\n\").forEach((line, i) => {\n if (line.includes(query)) hits.push(`${f}:${i + 1}:${line.slice(0, 200)}`);\n });\n if (hits.length >= 50) break;\n }\n return hits.join(\"\\n\") || \"(no matches)\";\n },\n });\n\n return {\n root,\n tools: () => [...filesystemTools(root), globTool, grepTool, executeTool],\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Agent } from \"../agent/index.js\";\nimport type { TokenUsage } from \"../types/index.js\";\n\n/**\n * Evals: JSONL datasets + scoring + pass-rate reporter.\n * Offline by default (stub models); set EVAL_LIVE=1 to run cases\n * against the configured provider instead.\n */\n\nexport interface EvalExpect {\n contains?: string[];\n toolUsed?: string[];\n noStructuredError?: boolean;\n}\n\nexport interface EvalCase {\n id: string;\n input: string;\n expect?: EvalExpect;\n}\n\nexport interface EvalScore {\n id: string;\n pass: boolean;\n detail: string;\n usage: TokenUsage;\n}\n\nexport function loadJsonl(path: string): EvalCase[] {\n return readFileSync(path, \"utf8\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .map((l) => JSON.parse(l) as EvalCase);\n}\n\nexport async function runEval(cases: EvalCase[], makeAgent: (c: EvalCase) => Agent): Promise<{ scores: EvalScore[]; passRate: number }> {\n const scores: EvalScore[] = [];\n for (const c of cases) {\n try {\n const res = await makeAgent(c).run(c.input);\n const missing = (c.expect?.contains ?? []).filter((s) => !res.text.includes(s));\n const missingTools = (c.expect?.toolUsed ?? []).filter((t) => !res.toolCalls.some((tc) => tc.name === t));\n const pass = !missing.length && !missingTools.length;\n scores.push({\n id: c.id,\n pass,\n detail: pass ? \"ok\" : `missing text ${JSON.stringify(missing)} tools ${JSON.stringify(missingTools)} :: ${res.text.slice(0, 120)}`,\n usage: res.usage,\n });\n } catch (err) {\n scores.push({\n id: c.id,\n pass: false,\n detail: `threw: ${err instanceof Error ? err.message : String(err)}`,\n usage: { inputTokens: 0, outputTokens: 0 },\n });\n }\n }\n const passRate = scores.length ? scores.filter((s) => s.pass).length / scores.length : 1;\n return { scores, passRate };\n}\n\nexport function printReport(scores: EvalScore[], passRate: number): void {\n for (const s of scores) {\n console.log(`${s.pass ? \"PASS\" : \"FAIL\"} ${s.id} ${s.detail}`);\n }\n console.log(`\\npass rate: ${(passRate * 100).toFixed(1)}% (${scores.filter((s) => s.pass).length}/${scores.length})`);\n}\n","import { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { AgentError } from \"../types/index.js\";\nimport { ToolRejection, type AgentMiddleware } from \"../middleware/index.js\";\nimport type { AgentEvents, StepEvent, ToolCallEvent, ToolResultEvent, DoneEvent } from \"../observability/index.js\";\n\n/**\n * Tracing exporter: OTel-shaped spans (trace/span ids, timestamps,\n * attributes) from AgentEvents, sunk to console or JSONL. No OTel SDK —\n * the shape is compatible, the transport is local-first. Adapters to\n * Langfuse/LangSmith-style HTTP endpoints can POST these spans unchanged.\n */\n\nexport interface Span {\n traceId: string;\n spanId: string;\n parentId?: string;\n name: string;\n startedAt: string;\n endedAt?: string;\n attributes: Record<string, unknown>;\n}\n\nfunction hex(n: number): string {\n return [...Array(n)].map(() => Math.floor(Math.random() * 16).toString(16)).join(\"\");\n}\n\nexport interface SpanSink {\n emit(span: Span): void;\n}\n\nexport class ConsoleSpanSink implements SpanSink {\n emit(span: Span): void {\n console.log(`[trace] ${span.name}`, JSON.stringify(span.attributes));\n }\n}\n\nexport class JsonlSpanSink implements SpanSink {\n constructor(private path: string) {\n mkdirSync(dirname(path), { recursive: true });\n }\n emit(span: Span): void {\n appendFileSync(this.path, `${JSON.stringify(span)}\\n`, \"utf8\");\n }\n}\n\nexport class MemorySpanSink implements SpanSink {\n spans: Span[] = [];\n emit(span: Span): void {\n this.spans.push(span);\n }\n}\n\n/** Build AgentEvents that project run/step/tool lifecycle into spans. */\nexport function tracingEvents(sink: SpanSink, opts: { traceId?: string } = {}): AgentEvents {\n const traceId = opts.traceId ?? hex(32);\n const open = new Map<string, Span>();\n const emit = (name: string, attributes: Record<string, unknown>, parentId?: string): Span => {\n const span: Span = {\n traceId,\n spanId: hex(16),\n ...(parentId ? { parentId } : {}),\n name,\n startedAt: new Date().toISOString(),\n endedAt: new Date().toISOString(),\n attributes,\n };\n sink.emit(span);\n return span;\n };\n return {\n onStep: (e: StepEvent) => {\n emit(\"agent.step\", { step: e.step, messages: e.messages.length });\n },\n onToolCall: (e: ToolCallEvent) => {\n const span = emit(\"tool.call\", { tool: e.tool, args: e.args });\n open.set(e.tool, span);\n },\n onToolResult: (e: ToolResultEvent) => {\n const parent = open.get(e.tool);\n open.delete(e.tool);\n emit(\"tool.result\", { tool: e.tool, output: e.output }, parent?.spanId);\n },\n onToken: (delta: string) => {\n emit(\"model.token\", { delta: delta.slice(0, 200) });\n },\n onThinking: (delta: string) => {\n emit(\"model.thinking\", { delta: delta.slice(0, 200) });\n },\n onDone: (e: DoneEvent) => {\n emit(\"agent.done\", { text: e.text.slice(0, 500), toolCalls: e.toolCalls.length });\n },\n };\n}\n\n/**\n * Policy filter: allow/deny tool calls by name pattern before execution.\n * Denied calls become ToolRejection feedback (model continues) or throw\n * POLICY_DENY with exitBehavior \"error\".\n */\nexport function policyFilterMiddleware(opts: {\n allow?: (string | RegExp)[];\n deny?: (string | RegExp)[];\n exitBehavior?: \"continue\" | \"error\";\n}): AgentMiddleware {\n const match = (list: (string | RegExp)[] | undefined, name: string): boolean =>\n // `g`-flagged regexes are stateful across .test() calls — clone without\n // the flag so one tool name can't alternate denied/allowed.\n (list ?? []).some((p) =>\n typeof p === \"string\" ? p === name : new RegExp(p.source, p.flags.replace(\"g\", \"\")).test(name),\n );\n return {\n name: \"policy-filter\",\n beforeTool: (call) => {\n if (opts.deny && match(opts.deny, call.name)) {\n if (opts.exitBehavior === \"error\") {\n throw new AgentError(\"POLICY_DENY\", `Policy denies tool \"${call.name}\"`, false);\n }\n throw new ToolRejection(`Policy denies tool \"${call.name}\". Do not retry it; finish another way.`);\n }\n if (opts.allow && !match(opts.allow, call.name)) {\n throw new ToolRejection(`Policy allows only [${opts.allow.join(\", \")}]; \"${call.name}\" is not allowed.`);\n }\n return undefined;\n },\n };\n}\n","import type { AgentResult } from \"../types/index.js\";\n\n/**\n * Typed run events with independent projections.\n * Consume via `for await (const e of agent.stream(input))`.\n */\nexport type StreamEvent =\n | { type: \"step\"; step: number }\n | { type: \"token\"; delta: string }\n | { type: \"thinking\"; delta: string }\n | { type: \"tool_call\"; name: string; args: unknown }\n | { type: \"tool_result\"; name: string; output: unknown }\n | { type: \"done\"; text: string };\n\n/** Collect a stream into buckets — handy for tests and simple UIs. */\nexport async function collectStream(\n stream: AsyncGenerator<StreamEvent, AgentResult>,\n): Promise<{ events: StreamEvent[]; result: AgentResult }> {\n const events: StreamEvent[] = [];\n for (;;) {\n const next = await stream.next();\n if (next.done) return { events, result: next.value };\n events.push(next.value);\n }\n}\n","import { textOf, type ChatMessage } from \"../types/index.js\";\nimport type { Memory } from \"../memory/index.js\";\n\n/**\n * Compaction: keep long runs inside the context window without losing meaning.\n * Strategy (P1): oldest messages -> model/pluggable summarizer -> single\n * boundary message. Semantic variant keeps extracted triples, drops prose.\n */\n\nexport interface CompactionOptions {\n /** Compact when messages exceed this count. Default 40. */\n maxMessages?: number;\n /** Summarizer: (messages to compress) -> summary text. Default: extractive stub. */\n summarize?: (messages: ChatMessage[]) => Promise<string>;\n}\n\nexport function defaultSummarize(messages: ChatMessage[]): Promise<string> {\n const head = messages\n .filter((m) => m.role !== \"system\")\n .slice(0, 5)\n .map((m) => `[${m.role}] ${textOf(m.content).slice(0, 200)}`)\n .join(\"\\n\");\n return Promise.resolve(`Prior context summary (${messages.length} msgs):\\n${head}`);\n}\n\n/** Wrap any Memory with auto-compaction. */\nexport class CompactedMemory implements Memory {\n constructor(\n private inner: Memory,\n private opts: CompactionOptions = {},\n ) {}\n\n async load(): Promise<ChatMessage[]> {\n return this.inner.load();\n }\n\n async save(messages: ChatMessage[]): Promise<void> {\n await this.inner.save(messages);\n const max = this.opts.maxMessages ?? 40;\n const current = await this.inner.load();\n if (current.length <= max) return;\n const summarize = this.opts.summarize ?? defaultSummarize;\n const overflow = current.slice(0, current.length - max + 1);\n const rest = current.slice(current.length - max + 1);\n const summary = await summarize(overflow);\n await this.inner.clear();\n await this.inner.save([{ role: \"assistant\", content: summary }, ...rest]);\n }\n\n async clear(): Promise<void> {\n return this.inner.clear();\n }\n}\n","import type { ChatMessage, TokenUsage } from \"../types/index.js\";\n\nexport interface ToolCallRequest {\n /** Provider tool-call id; generated when the provider omits it. */\n id: string;\n name: string;\n args: unknown;\n}\n\nexport interface ModelCompletion {\n text: string;\n /** Thinking/reasoning trace, when the provider exposes it. */\n thinking?: string;\n toolCalls: ToolCallRequest[];\n usage: TokenUsage;\n /**\n * Provider stop reason when reported (\"stop\", \"length\"/\"max_tokens\",\n * \"tool_calls\", ...). Consumers can detect truncation; a TOTAL truncation\n * (no content at all) throws MODEL_ERROR at the provider instead.\n */\n finishReason?: string;\n}\n\nexport interface ResponseFormatWire {\n name: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n}\n\nexport interface CompleteOptions {\n messages: ChatMessage[];\n /** Tool metadata; `parametersSchema` (JSON Schema) lets models call with real args — omit only for zero-arg tools. */\n tools: { name: string; description: string; parametersSchema?: Record<string, unknown> }[];\n /** Native structured output (OpenAI `response_format`). Honored when the provider supports it. */\n responseFormat?: ResponseFormatWire;\n /** Streamed text deltas (non-thinking). */\n onToken?: (delta: string) => void;\n /** Streamed thinking/reasoning deltas (reasoning_content). */\n onThinking?: (delta: string) => void;\n /** Aborts the in-flight provider request (fetch). */\n signal?: AbortSignal;\n}\n\n/** Provider abstraction — implement OpenAI/Anthropic/etc. behind this. */\nexport interface ModelProvider {\n readonly id: string;\n readonly capabilities?: { structuredOutput?: boolean; vision?: boolean; streaming?: boolean };\n complete(options: CompleteOptions): Promise<ModelCompletion>;\n}\n\n/** Deterministic mock for tests/examples — no network. */\nexport class MockModelProvider implements ModelProvider {\n readonly id = \"mock\";\n readonly capabilities = { structuredOutput: false, streaming: false };\n private calls = 0;\n\n async complete(_options: CompleteOptions): Promise<ModelCompletion> {\n this.calls += 1;\n return {\n text: `mock-response-${this.calls}`,\n toolCalls: [],\n usage: { inputTokens: 10, outputTokens: 5 },\n };\n }\n}\n\nexport * from \"./openai-compatible.js\";\nexport * from \"./capabilities.js\";\nexport * from \"./factory.js\";\nexport * from \"./anthropic.js\";\nexport * from \"./ollama.js\";\nexport * from \"./pricing.js\";\n","import type { ChatMessage, AgentResult } from \"../types/index.js\";\n\nexport interface StepEvent {\n step: number;\n messages: ChatMessage[];\n}\n\nexport interface ToolCallEvent {\n tool: string;\n args: unknown;\n}\n\nexport interface ToolResultEvent {\n tool: string;\n output: unknown;\n}\n\nexport interface DoneEvent {\n text: string;\n toolCalls: AgentResult[\"toolCalls\"];\n}\n\n/** Observability hooks — plug logger/tracer here, keep core dependency-free. */\nexport interface AgentEvents {\n onStep?: (e: StepEvent) => void;\n onToolCall?: (e: ToolCallEvent) => void;\n onToolResult?: (e: ToolResultEvent) => void;\n onDone?: (e: DoneEvent) => void;\n /** Streamed text deltas. */\n onToken?: (delta: string) => void;\n /** Streamed thinking/reasoning deltas. */\n onThinking?: (delta: string) => void;\n}\n\n/** Minimal ANSI colors, dependency-free. Honors NO_COLOR and non-TTY. */\nexport function supportsColor(): boolean {\n return !process.env.NO_COLOR && !!process.stdout?.isTTY;\n}\n\nconst C = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n cyan: \"\\x1b[36m\",\n yellow: \"\\x1b[33m\",\n green: \"\\x1b[32m\",\n magenta: \"\\x1b[35m\",\n red: \"\\x1b[31m\",\n};\n\nfunction paint(color: keyof typeof C, text: string, on: boolean): string {\n if (!on || color === \"reset\") return text;\n return `${C[color]}${text}${C.reset}`;\n}\n\nexport interface ConsoleEventsOptions {\n prefix?: string;\n /** Force colors on/off. Default: auto (TTY without NO_COLOR). */\n colors?: boolean;\n}\n\nexport function consoleEvents(prefix?: string, opts?: ConsoleEventsOptions): AgentEvents;\nexport function consoleEvents(opts: ConsoleEventsOptions): AgentEvents;\nexport function consoleEvents(prefixOrOpts: string | ConsoleEventsOptions = \"[agent]\", maybeOpts: ConsoleEventsOptions = {}): AgentEvents {\n const { prefix, colors }: { prefix: string; colors: boolean } =\n typeof prefixOrOpts === \"string\"\n ? { prefix: prefixOrOpts, colors: maybeOpts.colors ?? supportsColor() }\n : { prefix: prefixOrOpts.prefix ?? \"[agent]\", colors: prefixOrOpts.colors ?? supportsColor() };\n const tag = (color: keyof typeof C, label: string): string => `${paint(color, `${prefix} ${label}`, colors)}`;\n return {\n onStep: (e) => console.log(tag(\"cyan\", `step ${e.step} (${e.messages.length} msgs)`)),\n onToolCall: (e) => console.log(tag(\"yellow\", `tool:call ${e.tool}`), e.args),\n onToolResult: (e) => console.log(tag(\"green\", `tool:result ${e.tool}`), e.output),\n onDone: (e) => console.log(tag(\"green\", paint(\"bold\", \"done:\", colors)), e.text),\n onToken: (d) => process.stdout.write(d),\n onThinking: (d) => process.stdout.write(paint(\"dim\", d, colors)),\n };\n}\n\n/** Red error line for failures (pairs with consoleEvents). */\nexport function logError(prefix: string, err: unknown, colors?: boolean): void {\n const on = colors ?? supportsColor();\n const message = err instanceof Error ? (err.stack ?? err.message) : String(err);\n console.error(paint(\"red\", `${prefix} error:`, on), message);\n}\n","import { AgentError, type AgentResult } from \"../types/index.js\";\nimport type { Agent, RunOptions } from \"../agent/index.js\";\nimport type { InvocationState } from \"../state/index.js\";\nimport type { ModelProvider } from \"../models/index.js\";\nimport type { AgentEvents } from \"../observability/index.js\";\n\nexport type OrchestrationStrategy = \"sequential\" | \"parallel\" | \"router\";\n\nexport interface OrchestrationPlan {\n strategy: OrchestrationStrategy;\n agents: Agent[];\n /** Max concurrent agents for parallel. Default: all at once. */\n concurrency?: number;\n /** Model that picks the agent for router. Defaults to the first agent's model. */\n routerModel?: ModelProvider;\n events?: AgentEvents;\n}\n\nexport interface OrchestratedResult {\n strategy: OrchestrationStrategy;\n results: AgentResult[];\n /** Combined text: last result (sequential/router), joined (parallel). */\n text: string;\n /** Router only: index of the chosen agent. */\n routedTo?: number;\n}\n\nfunction requireAgents(plan: OrchestrationPlan): void {\n if (!plan.agents.length) throw new AgentError(\"ORCHESTRATION_EMPTY\", \"Orchestration needs at least one agent\", false);\n}\n\n/** Chain: each agent receives the previous agent's text appended to the input. */\nasync function runSequential(\n plan: OrchestrationPlan,\n input: string,\n opts: { signal?: AbortSignal; invocationState?: InvocationState } = {},\n): Promise<OrchestratedResult> {\n requireAgents(plan);\n const results: AgentResult[] = [];\n let current = input;\n for (let i = 0; i < plan.agents.length; i++) {\n opts.signal?.throwIfAborted();\n plan.events?.onStep?.({ step: i, messages: [] });\n const res = await plan.agents[i].run(current, { signal: opts.signal, invocationState: opts.invocationState });\n results.push(res);\n current = `${input}\\n\\nPrevious result (${plan.agents[i].name}):\\n${res.text}`;\n }\n return { strategy: \"sequential\", results, text: results.at(-1)?.text ?? \"\" };\n}\n\n/** Fan-out with a concurrency cap; results keep agent order. */\nasync function runParallel(\n plan: OrchestrationPlan,\n input: string,\n opts: { signal?: AbortSignal; invocationState?: InvocationState } = {},\n): Promise<OrchestratedResult> {\n requireAgents(plan);\n const limit = Math.max(1, plan.concurrency ?? plan.agents.length);\n const results: AgentResult[] = new Array(plan.agents.length);\n let next = 0;\n const workers = Array.from({ length: Math.min(limit, plan.agents.length) }, async () => {\n for (;;) {\n opts.signal?.throwIfAborted();\n const i = next++;\n if (i >= plan.agents.length) return;\n results[i] = await plan.agents[i].run(input, { signal: opts.signal, invocationState: opts.invocationState });\n }\n });\n await Promise.all(workers);\n return { strategy: \"parallel\", results, text: results.map((r) => r.text).join(\"\\n\\n\") };\n}\n\n/** One model call picks the agent by index; only that agent runs. */\nasync function runRouter(\n plan: OrchestrationPlan,\n input: string,\n opts: { signal?: AbortSignal; invocationState?: InvocationState } = {},\n): Promise<OrchestratedResult> {\n requireAgents(plan);\n const routerModel = plan.routerModel ?? plan.agents[0].model;\n const menu = plan.agents.map((a, i) => `${i}: ${a.name}${a.description ? ` — ${a.description}` : \"\"}`).join(\"\\n\");\n const pick = await routerModel.complete({\n messages: [\n { role: \"system\", content: \"You route user requests to specialist agents. Reply with ONLY the agent number.\" },\n { role: \"user\", content: `Agents:\\n${menu}\\n\\nRequest: ${input}` },\n ],\n tools: [],\n });\n const match = pick.text.match(/\\d+/);\n const idx = match ? Number.parseInt(match[0], 10) : Number.NaN;\n if (!Number.isInteger(idx) || idx < 0 || idx >= plan.agents.length) {\n throw new AgentError(\"ROUTER_NO_MATCH\", `Router picked invalid agent: ${JSON.stringify(pick.text)}`, false);\n }\n const res = await plan.agents[idx].run(input, { signal: opts.signal, invocationState: opts.invocationState });\n return { strategy: \"router\", results: [res], text: res.text, routedTo: idx };\n}\n\nexport async function runOrchestrated(plan: OrchestrationPlan, input: string, signal?: AbortSignal): Promise<OrchestratedResult>;\nexport async function runOrchestrated(plan: OrchestrationPlan, input: string, opts?: RunOptions): Promise<OrchestratedResult>;\nexport async function runOrchestrated(\n plan: OrchestrationPlan,\n input: string,\n signalOrOpts?: AbortSignal | RunOptions,\n): Promise<OrchestratedResult> {\n const opts: RunOptions = signalOrOpts instanceof AbortSignal ? { signal: signalOrOpts } : (signalOrOpts ?? {});\n switch (plan.strategy) {\n case \"sequential\":\n return runSequential(plan, input, opts);\n case \"parallel\":\n return runParallel(plan, input, opts);\n case \"router\":\n return runRouter(plan, input, opts);\n }\n}\n","import { AgentError } from \"../types/index.js\";\nimport type { InvocationState } from \"../state/index.js\";\nimport { sleep } from \"../utils/index.js\";\n\n/** DAG workflow node. `ctx` maps completed node ids to their results. */\nexport interface WorkflowNode {\n id: string;\n run: (ctx: Record<string, unknown>, invocationState?: InvocationState) => Promise<unknown>;\n dependsOn?: string[];\n /** Retry policy. Default: no retry (attempts: 1). Abort always rethrows. */\n retry?: { attempts?: number; backoffMs?: number };\n}\n\nexport interface WorkflowOptions {\n signal?: AbortSignal;\n /** Shared per-run data passed to every node (never sent to models by itself). */\n invocationState?: InvocationState;\n}\n\nfunction sortTopo(nodes: WorkflowNode[]): WorkflowNode[][] {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n if (byId.size !== nodes.length) throw new AgentError(\"WORKFLOW_DUPLICATE_ID\", \"Workflow node ids must be unique\", false);\n for (const n of nodes) {\n for (const dep of n.dependsOn ?? []) {\n if (!byId.has(dep)) throw new AgentError(\"WORKFLOW_UNKNOWN_DEP\", `Node \"${n.id}\" depends on unknown node \"${dep}\"`, false);\n if (dep === n.id) throw new AgentError(\"WORKFLOW_CYCLE\", `Node \"${n.id}\" depends on itself`, false);\n }\n }\n // Deduplicate: `dependsOn: [\"a\", \"a\"]` is one edge, not two — counting it\n // twice wedges indegree at 1 and misreports a legal graph as a cycle.\n const indegree = new Map(nodes.map((n) => [n.id, n.dependsOn ? new Set(n.dependsOn).size : 0]));\n const levels: WorkflowNode[][] = [];\n let ready = nodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);\n while (ready.length) {\n levels.push(ready);\n const next: WorkflowNode[] = [];\n for (const n of nodes) {\n if (!ready.includes(n)) continue;\n for (const m of nodes) {\n if (!(m.dependsOn ?? []).includes(n.id)) continue;\n indegree.set(m.id, (indegree.get(m.id) ?? 1) - 1);\n if (indegree.get(m.id) === 0) next.push(m);\n }\n }\n ready = next;\n }\n if (levels.flat().length !== nodes.length) {\n throw new AgentError(\"WORKFLOW_CYCLE\", \"Workflow has a dependency cycle\", false);\n }\n return levels;\n}\n\nasync function runWithRetry(\n node: WorkflowNode,\n ctx: Record<string, unknown>,\n signal?: AbortSignal,\n invocationState?: InvocationState,\n): Promise<unknown> {\n const attempts = Math.max(1, node.retry?.attempts ?? 1);\n const backoffMs = node.retry?.backoffMs ?? 0;\n let last: unknown;\n for (let i = 0; i < attempts; i++) {\n signal?.throwIfAborted();\n try {\n return await node.run(ctx, invocationState);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") throw err;\n last = err;\n if (i < attempts - 1 && backoffMs > 0) await sleep(backoffMs, signal);\n }\n }\n throw last;\n}\n\n/**\n * Execute a DAG: topological levels run in order, nodes within a level\n * run concurrently. Returns id -> result. Throws structured WORKFLOW_* errors.\n */\nexport async function runWorkflow(nodes: WorkflowNode[], opts: WorkflowOptions = {}): Promise<Record<string, unknown>> {\n const ctx: Record<string, unknown> = {};\n for (const level of sortTopo(nodes)) {\n opts.signal?.throwIfAborted();\n const entries = await Promise.all(\n level.map(async (n) => [n.id, await runWithRetry(n, ctx, opts.signal, opts.invocationState)] as const),\n );\n for (const [id, value] of entries) ctx[id] = value;\n }\n return ctx;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * MCP (Model Context Protocol) client.\n * - Streamable HTTP transport (POST JSON-RPC; JSON or SSE responses).\n * - stdio transport (spawned server, line-delimited JSON-RPC).\n * - `mcpToolsToFramework` bridges MCP tool defs to framework Tools,\n * converting JSON Schema input schemas to zod.\n */\n\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface McpClientOptions {\n fetchFn?: typeof fetch;\n headers?: Record<string, string>;\n clientName?: string;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id?: number | string;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\nlet rpcSeq = 0;\n\n/** Minimal JSON Schema -> zod (objects, string/number/integer/boolean/array/enum/null; else unknown). */\nexport function jsonSchemaToZod(schema: Record<string, unknown>): z.ZodType<unknown> {\n const type = schema.type as string | undefined;\n if (Array.isArray(schema.enum)) {\n // JSON Schema enums may be numbers or mixed — z.enum needs strings.\n const values = schema.enum as unknown[];\n if (values.length && values.every((v) => typeof v === \"string\")) return z.enum(values as [string, ...string[]]);\n if (values.length) {\n const literals = values.map((v) => z.literal(v as string | number | bigint | boolean | null));\n return literals.length > 1 ? z.union(literals as unknown as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]) : literals[0];\n }\n return z.never();\n }\n switch (type) {\n case \"string\":\n return z.string();\n case \"number\":\n return z.number();\n case \"integer\":\n return z.number().int();\n case \"boolean\":\n return z.boolean();\n case \"null\":\n return z.null();\n case \"array\": {\n const items = schema.items as Record<string, unknown> | undefined;\n return z.array(items ? jsonSchemaToZod(items) : z.unknown());\n }\n case \"object\": {\n const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required ?? []) as string[]);\n const shape: Record<string, z.ZodType<unknown>> = {};\n for (const [key, sub] of Object.entries(props)) {\n const inner = jsonSchemaToZod(sub);\n shape[key] = required.has(key) ? inner : inner.optional();\n }\n return z.object(shape).passthrough();\n }\n default:\n return z.unknown();\n }\n}\n\nasync function parseStreamableResponse(res: Response): Promise<JsonRpcResponse> {\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"text/event-stream\")) {\n const text = await res.text();\n let last: JsonRpcResponse | undefined;\n for (const line of text.split(\"\\n\")) {\n const t = line.trim();\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (payload === \"[DONE]\") continue;\n try {\n const msg = JSON.parse(payload) as JsonRpcResponse;\n if (msg.id !== undefined || msg.result !== undefined || msg.error) last = msg;\n } catch {\n continue;\n }\n }\n if (!last) throw new AgentError(\"MCP_PROTOCOL\", \"Empty SSE response from MCP server\", true);\n return last;\n }\n return (await res.json()) as JsonRpcResponse;\n}\n\nfunction checkRpc(res: JsonRpcResponse, what: string): unknown {\n if (res.error) throw new AgentError(\"MCP_ERROR\", `MCP ${what}: ${res.error.message} (${res.error.code})`, false);\n return res.result;\n}\n\n/** MCP client over Streamable HTTP. */\nexport class McpHttpClient {\n readonly serverId: string;\n private url: string;\n private headers: Record<string, string>;\n private fetchFn: typeof fetch;\n private clientName: string;\n private sessionId?: string;\n private connected = false;\n\n constructor(url: string, opts: McpClientOptions & { serverId?: string } = {}) {\n this.url = url.replace(/\\/$/, \"\");\n this.serverId = opts.serverId ?? url;\n this.headers = opts.headers ?? {};\n this.fetchFn = opts.fetchFn ?? fetch;\n this.clientName = opts.clientName ?? \"framework-agents\";\n }\n\n private async rpc(method: string, params?: unknown): Promise<unknown> {\n return this.rpcInner(method, params, true);\n }\n\n /** JSON-RPC notification — no id, no response expected. */\n private async notify(method: string, params?: unknown): Promise<void> {\n await this.rpcInner(method, params, false);\n }\n\n private async rpcInner(method: string, params: unknown | undefined, withId: boolean): Promise<unknown> {\n let res: Response;\n try {\n res = await this.fetchFn(this.url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n ...(this.sessionId ? { \"mcp-session-id\": this.sessionId } : {}),\n ...this.headers,\n },\n body: JSON.stringify(\n withId ? { jsonrpc: \"2.0\", id: ++rpcSeq, method, params: params ?? {} } : { jsonrpc: \"2.0\", method, params: params ?? {} },\n ),\n });\n } catch (err) {\n throw new AgentError(\"MCP_TRANSPORT\", `MCP request failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n const session = res.headers.get(\"mcp-session-id\");\n if (session) this.sessionId = session;\n if (!res.ok) throw new AgentError(\"MCP_TRANSPORT\", `MCP HTTP ${res.status}`, res.status >= 500);\n if (!withId) {\n // Notifications carry no id: no response will ever match. Read and\n // discard whatever the server sends instead of hanging on it.\n await res.text().catch(() => \"\");\n return undefined;\n }\n return checkRpc(await parseStreamableResponse(res), method);\n }\n\n async connect(): Promise<{ name: string; version?: string }> {\n const result = (await this.rpc(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: this.clientName, version: \"0.1.0\" },\n })) as { serverInfo?: { name: string; version?: string } };\n await this.notify(\"notifications/initialized\", {}).catch(() => undefined);\n this.connected = true;\n return { name: result.serverInfo?.name ?? this.serverId, version: result.serverInfo?.version };\n }\n\n private requireConnected(): void {\n if (!this.connected) throw new AgentError(\"MCP_NOT_CONNECTED\", \"Call connect() first\", false);\n }\n\n async listTools(): Promise<McpToolDef[]> {\n this.requireConnected();\n const result = (await this.rpc(\"tools/list\")) as { tools?: McpToolDef[] };\n return result.tools ?? [];\n }\n\n async callTool(name: string, args: unknown): Promise<unknown> {\n this.requireConnected();\n const result = (await this.rpc(\"tools/call\", { name, arguments: args ?? {} })) as {\n content?: { type: string; text?: string }[];\n isError?: boolean;\n };\n const text = (result.content ?? [])\n .filter((c) => c.type === \"text\")\n .map((c) => c.text ?? \"\")\n .join(\"\\n\");\n if (result.isError) throw new AgentError(\"MCP_TOOL_ERROR\", `MCP tool \"${name}\" failed: ${text}`, false);\n return text;\n }\n\n async close(): Promise<void> {\n this.connected = false;\n this.sessionId = undefined;\n }\n}\n\n/** MCP client over stdio (spawns `command args`, speaks line-delimited JSON-RPC). */\nexport class McpStdioClient {\n readonly serverId: string;\n private child?: ChildProcess;\n private buffer = \"\";\n private pending = new Map<number | string, (res: JsonRpcResponse) => void>();\n private clientName: string;\n\n constructor(\n private command: string,\n private args: string[] = [],\n opts: { serverId?: string; clientName?: string } = {},\n ) {\n this.serverId = opts.serverId ?? `${command} ${args.join(\" \")}`.trim();\n this.clientName = opts.clientName ?? \"framework-agents\";\n }\n\n async connect(): Promise<void> {\n try {\n this.child = spawn(this.command, this.args, { stdio: [\"pipe\", \"pipe\", \"ignore\"] });\n } catch (err) {\n throw new AgentError(\"MCP_TRANSPORT\", `Cannot spawn MCP server: ${err instanceof Error ? err.message : String(err)}`, false);\n }\n if (!this.child.stdout || !this.child.stdin) {\n throw new AgentError(\"MCP_TRANSPORT\", \"MCP stdio pipes unavailable\", false);\n }\n this.child.on(\"error\", (err) => {\n for (const [, respond] of this.pending) {\n respond({ jsonrpc: \"2.0\", error: { code: -32000, message: `MCP server failed: ${err.message}` } });\n }\n this.pending.clear();\n });\n // Spawn succeeded but the process later dies (crash, OOM, exit):\n // without this, in-flight requests hang forever — 'error' never fires.\n this.child.on(\"exit\", (code, signal) => {\n for (const [, respond] of this.pending) {\n respond({ jsonrpc: \"2.0\", error: { code: -32000, message: `MCP server exited (code ${code ?? \"null\"}, signal ${signal ?? \"none\"})` } });\n }\n this.pending.clear();\n });\n this.child.stdout.on(\"data\", (chunk: Buffer) => {\n this.buffer += chunk.toString(\"utf8\");\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t) continue;\n try {\n const msg = JSON.parse(t) as JsonRpcResponse;\n if (msg.id !== undefined) this.pending.get(msg.id)?.(msg);\n } catch {\n continue;\n }\n }\n });\n const result = (await this.request(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: this.clientName, version: \"0.1.0\" },\n })) as { serverInfo?: { name: string } };\n void result;\n }\n\n private request(method: string, params: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (!this.child?.stdin) {\n reject(new AgentError(\"MCP_NOT_CONNECTED\", \"Call connect() first\", false));\n return;\n }\n const id = ++rpcSeq;\n this.pending.set(id, (res) => {\n this.pending.delete(id);\n try {\n resolve(checkRpc(res, method));\n } catch (err) {\n reject(err);\n }\n });\n this.child.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, method, params })}\\n`, (err) => {\n if (err) {\n this.pending.delete(id);\n reject(new AgentError(\"MCP_TRANSPORT\", `MCP stdio write failed: ${err.message}`, true));\n }\n });\n });\n }\n\n async listTools(): Promise<McpToolDef[]> {\n const result = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n return result.tools ?? [];\n }\n\n async callTool(name: string, args: unknown): Promise<unknown> {\n const result = (await this.request(\"tools/call\", { name, arguments: args ?? {} })) as {\n content?: { type: string; text?: string }[];\n isError?: boolean;\n };\n const text = (result.content ?? [])\n .filter((c) => c.type === \"text\")\n .map((c) => c.text ?? \"\")\n .join(\"\\n\");\n if (result.isError) throw new AgentError(\"MCP_TOOL_ERROR\", `MCP tool \"${name}\" failed: ${text}`, false);\n return text;\n }\n\n async close(): Promise<void> {\n this.child?.kill();\n this.child = undefined;\n // Settle in-flight requests — clearing without responding would leave\n // their promises pending forever.\n for (const [, respond] of this.pending) {\n respond({ jsonrpc: \"2.0\", error: { code: -32000, message: \"MCP client closed\" } });\n }\n this.pending.clear();\n }\n}\n\nexport type AnyMcpClient = Pick<McpHttpClient, \"serverId\" | \"listTools\" | \"callTool\" | \"close\">;\n\nexport interface McpClient {\n readonly serverId: string;\n listTools(): Promise<McpToolDef[]>;\n callTool(name: string, args: unknown): Promise<unknown>;\n close(): Promise<void>;\n}\n\n/** Turn MCP tool defs into framework Tools (namespaced `server.tool` on collision). */\nexport async function mcpToolsToFramework(client: McpClient, defs?: McpToolDef[]): Promise<Tool[]> {\n const list = defs ?? (await client.listTools());\n const seen = new Set<string>();\n return list.map((d) => {\n const name = seen.has(d.name) ? `${client.serverId}.${d.name}` : d.name;\n seen.add(d.name);\n return defineTool({\n name,\n description: d.description ?? `MCP tool ${d.name} (via ${client.serverId})`,\n schema: jsonSchemaToZod(d.inputSchema ?? { type: \"object\" }),\n execute: async (args: unknown) => client.callTool(d.name, args),\n });\n });\n}\n\nexport async function connectMcpHttp(url: string, opts?: McpClientOptions): Promise<McpHttpClient> {\n const client = new McpHttpClient(url, opts);\n await client.connect();\n return client;\n}\n\nexport async function connectMcpStdio(command: string, args: string[] = []): Promise<McpStdioClient> {\n const client = new McpStdioClient(command, args);\n await client.connect();\n return client;\n}\n","/**\n * Prompts: versioned, renderable templates. No magic strings in agent code.\n * Sources: inline definePrompt, markdown files with frontmatter, A/B variants.\n */\nimport { readFileSync } from \"node:fs\";\n\nexport interface PromptTemplate {\n name: string;\n version: string;\n template: string;\n render(vars: Record<string, string | number>): string;\n}\n\nexport function definePrompt(name: string, template: string, version = \"0.1.0\"): PromptTemplate {\n return {\n name,\n version,\n template,\n render(vars) {\n return template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n if (!(key in vars)) throw new Error(`Missing prompt var: ${key} (prompt: ${name})`);\n return String(vars[key]);\n });\n },\n };\n}\n\n/** Load `--- name, version ---` frontmatter + markdown body from disk. */\nexport function loadPromptFile(path: string): PromptTemplate {\n const file = readFileSync(path, \"utf8\");\n // Tolerate a leading BOM and CRLF line endings (frontmatter at EOF is fine).\n const raw = file.startsWith(\"\") ? file.slice(1) : file;\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error(`Invalid prompt file (missing frontmatter): ${path}`);\n const meta: Record<string, string> = {};\n for (const line of match[1].split(\"\\n\")) {\n const i = line.indexOf(\":\");\n if (i > 0) meta[line.slice(0, i).trim()] = line.slice(i + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n if (!meta.name) throw new Error(`Invalid prompt file (missing name): ${path}`);\n return definePrompt(meta.name, match[2].trim(), meta.version ?? \"0.1.0\");\n}\n\n/** A/B variants: pick by traffic split (weighted random) or explicit variant. */\nexport function abPrompts(\n variants: { name: string; template: string; version?: string; weight?: number }[],\n pick?: string,\n): PromptTemplate {\n if (pick) {\n const found = variants.find((v) => (v.version ? `${v.name}@${v.version}` : v.name) === pick || v.name === pick);\n if (!found) throw new Error(`Unknown prompt variant: ${pick}`);\n return definePrompt(found.name, found.template, found.version);\n }\n const total = variants.reduce((n, v) => n + (v.weight ?? 1), 0);\n let roll = Math.random() * total;\n for (const v of variants) {\n roll -= v.weight ?? 1;\n if (roll <= 0) return definePrompt(v.name, v.template, v.version);\n }\n const last = variants[variants.length - 1];\n return definePrompt(last.name, last.template, last.version);\n}\n","/**\n * Semantic layer. See docs/07-semantics-governance.md.\n * In-memory store: RDFS-subset + OWL property axioms entailment with proofs,\n * SHACL-subset validation, versioned CONSTRUCT-style rules, SPARQL-subset\n * read tools, and GraphMemory. Remote SPARQL, entity linking + JSON-LD I/O,\n * and TBox evolution live in sibling modules, re-exported here.\n */\n\nexport interface Quad {\n subject: string;\n predicate: string;\n object: string;\n graph?: string;\n /** Provenance: who vouched, source URI, valid-until. Required on agent writes. */\n source?: string;\n derivedFrom?: string;\n rule?: string;\n}\n\nexport interface ShapeReport {\n valid: boolean;\n violations: { message: string; node?: string; path?: string }[];\n}\n\n/** Minimal triple-store contract — N3 in-memory first, remote SPARQL later. */\nexport interface GraphStore {\n add(quads: Quad[]): Promise<void>;\n /**\n * Match by pattern; null/undefined = wildcard (including the graph slot).\n * Queries the entailment closure. A `graph` value selects ONE named\n * graph — the same s/p/o CAN live in several graphs; identity includes it.\n */\n match(s?: string | null, p?: string | null, o?: string | null, g?: string | null): Promise<Quad[]>;\n validate(quads: Quad[]): Promise<ShapeReport>;\n /** Proof chain for an entailed fact: premises + rule id. Null for explicit facts. */\n why(quad: Quad): Promise<{ premises: Quad[]; rule: string } | null>;\n}\n\nconst RDF_TYPE = new Set([\"rdf:type\", \"a\", \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"]);\nconst SUB_CLASS = new Set([\"rdfs:subClassOf\", \"http://www.w3.org/2000/01/rdf-schema#subClassOf\"]);\nconst SUB_PROP = new Set([\"rdfs:subPropertyOf\", \"http://www.w3.org/2000/01/rdf-schema#subPropertyOf\"]);\nconst DOMAIN = new Set([\"rdfs:domain\", \"http://www.w3.org/2000/01/rdf-schema#domain\"]);\nconst RANGE = new Set([\"rdfs:range\", \"http://www.w3.org/2000/01/rdf-schema#range\"]);\nconst OWL_TRANSITIVE = new Set([\"owl:TransitiveProperty\", \"http://www.w3.org/2002/07/owl#TransitiveProperty\"]);\nconst OWL_SYMMETRIC = new Set([\"owl:SymmetricProperty\", \"http://www.w3.org/2002/07/owl#SymmetricProperty\"]);\nconst OWL_FUNCTIONAL = new Set([\"owl:FunctionalProperty\", \"http://www.w3.org/2002/07/owl#FunctionalProperty\"]);\nconst OWL_INVERSE = new Set([\"owl:inverseOf\", \"http://www.w3.org/2002/07/owl#inverseOf\"]);\n\n/** SHACL-subset shape: class-scoped property constraints. */\nexport interface PropertyShape {\n path: string;\n minCount?: number;\n maxCount?: number;\n datatype?: string;\n nodeKind?: \"iri\" | \"literal\";\n hasValue?: string;\n}\n\nexport interface NodeShape {\n targetClass: string;\n properties: PropertyShape[];\n}\n\n/** Versioned CONSTRUCT-style rule over triple patterns (?vars). */\nexport interface TriplePattern {\n subject: string;\n predicate: string;\n object: string;\n}\n\nexport interface GraphRule {\n id: string;\n version?: string;\n where: TriplePattern[];\n construct: TriplePattern[];\n}\n\nexport interface StoreOptions {\n shapes?: NodeShape[];\n rules?: GraphRule[];\n}\n\nfunction isLiteral(term: string): boolean {\n if (term.startsWith('\"')) return true;\n if (/^(-?\\d+(\\.\\d+)?|true|false)$/.test(term)) return true;\n if (term.startsWith(\"<\") || /^[a-zA-Z][\\w-]*:/.test(term)) return false;\n return true;\n}\n\nfunction termDatatype(term: string): string | undefined {\n const m = term.match(/\\^\\^<?([\\w:/#.-]+)>?$/);\n if (m) return m[1];\n if (/^\".*\"@[\\w-]+$/.test(term)) return \"rdf:langString\";\n if (/^\".*\"$/.test(term)) return \"xsd:string\";\n if (/^-?\\d+$/.test(term)) return \"xsd:integer\";\n if (/^-?\\d*\\.\\d+$/.test(term)) return \"xsd:decimal\";\n if (/^(true|false)$/.test(term)) return \"xsd:boolean\";\n return undefined;\n}\n\nexport class InMemoryGraphStore implements GraphStore {\n private quads: Quad[] = [];\n private derivations = new Map<string, { premises: Quad[]; rule: string }>();\n private shapes: NodeShape[] = [];\n private rules: GraphRule[] = [];\n\n constructor(opts: StoreOptions = {}) {\n this.shapes = [...(opts.shapes ?? [])];\n this.rules = [...(opts.rules ?? [])];\n }\n\n addShapes(...shapes: NodeShape[]): this {\n this.shapes.push(...shapes);\n return this;\n }\n\n addRules(...rules: GraphRule[]): this {\n this.rules.push(...rules);\n return this;\n }\n\n /** Registered SHACL shapes (carried to new stores by TBox migrations). */\n ontologyShapes(): NodeShape[] {\n return [...this.shapes];\n }\n\n /** Registered CONSTRUCT rules (versioned with the ontology they encode). */\n ontologyRules(): GraphRule[] {\n return [...this.rules];\n }\n\n /** Identity includes the named graph: the same s/p/o in two graphs are two quads. */\n private key(q: Pick<Quad, \"subject\" | \"predicate\" | \"object\" | \"graph\">): string {\n return `${q.subject}|${q.predicate}|${q.object}|${q.graph ?? \"\"}`;\n }\n\n async add(quads: Quad[]): Promise<void> {\n const report = await this.validate(quads);\n if (!report.valid) {\n throw new Error(`SHACL violation: ${report.violations.map((v) => v.message).join(\"; \")}`);\n }\n const known = new Set(this.quads.map((q) => this.key(q)));\n const addedKeys: string[] = [];\n for (const q of quads) {\n if (!known.has(this.key(q))) {\n known.add(this.key(q));\n addedKeys.push(this.key(q));\n this.quads.push(q);\n }\n }\n const rollback = (): void => {\n const doomed = new Set(addedKeys);\n this.quads = this.quads.filter((q) => !doomed.has(this.key(q)));\n for (const k of doomed) this.derivations.delete(k);\n };\n const conflicts = this.checkFunctional();\n if (conflicts.length) {\n rollback();\n throw new Error(`Functional property violation: ${conflicts.join(\"; \")}`);\n }\n const shapeReport = this.checkShapes(this.quads);\n if (!shapeReport.valid) {\n rollback();\n throw new Error(`SHACL violation: ${shapeReport.violations.map((v) => v.message).join(\"; \")}`);\n }\n this.entailToFixpoint(known);\n }\n\n async match(s?: string | null, p?: string | null, o?: string | null, g?: string | null): Promise<Quad[]> {\n return this.quads.filter(\n (q) =>\n (!s || q.subject === s) && (!p || q.predicate === p) && (!o || q.object === o) && (!g || q.graph === g),\n );\n }\n\n /** Structural + provenance check. Full SHACL engine lands in P1-sem. */\n async validate(quads: Quad[]): Promise<ShapeReport> {\n const violations = quads\n .filter((q) => !q.subject || !q.predicate || !q.object)\n .map((q) => ({ message: `Incomplete triple: ${JSON.stringify(q)}` }));\n const noSource = quads\n .filter((q) => !q.source)\n .map((q) => ({ message: `Missing provenance (source) on ${q.subject} ${q.predicate} ${q.object}` }));\n return { valid: violations.length + noSource.length === 0, violations: [...violations, ...noSource] };\n }\n\n async why(quad: Quad): Promise<{ premises: Quad[]; rule: string } | null> {\n return this.derivations.get(this.key(quad)) ?? null;\n }\n\n /** Functional properties must have at most one value per subject (conflict, not a second fact). */\n private checkFunctional(): string[] {\n const functionalProps = new Set(\n this.quads.filter((q) => RDF_TYPE.has(q.predicate) && OWL_FUNCTIONAL.has(q.object)).map((q) => q.subject),\n );\n const conflicts: string[] = [];\n for (const prop of functionalProps) {\n const bySubject = new Map<string, Set<string>>();\n for (const q of this.quads) {\n if (q.predicate !== prop) continue;\n const values = bySubject.get(q.subject) ?? new Set<string>();\n values.add(q.object);\n bySubject.set(q.subject, values);\n }\n for (const [subject, values] of bySubject) {\n if (values.size > 1) conflicts.push(`${subject} has ${values.size} values for functional ${prop}`);\n }\n }\n return conflicts;\n }\n\n /** SHACL-subset validation over a quad set. */\n checkShapes(quads: Quad[]): ShapeReport {\n const violations: ShapeReport[\"violations\"] = [];\n for (const shape of this.shapes) {\n const targets = quads.filter((q) => RDF_TYPE.has(q.predicate) && q.object === shape.targetClass).map((q) => q.subject);\n for (const node of new Set(targets)) {\n for (const prop of shape.properties) {\n const values = quads.filter((q) => q.subject === node && q.predicate === prop.path).map((q) => q.object);\n if (prop.minCount != null && values.length < prop.minCount) {\n violations.push({ message: `${node} needs >= ${prop.minCount} ${prop.path}`, node, path: prop.path });\n }\n if (prop.maxCount != null && values.length > prop.maxCount) {\n violations.push({ message: `${node} allows <= ${prop.maxCount} ${prop.path}`, node, path: prop.path });\n }\n for (const v of values) {\n if (prop.datatype && termDatatype(v) !== prop.datatype && !(prop.datatype === \"xsd:string\" && isLiteral(v))) {\n violations.push({ message: `${node} ${prop.path}=${v} is not ${prop.datatype}`, node, path: prop.path });\n }\n if (prop.nodeKind === \"iri\" && isLiteral(v)) {\n violations.push({ message: `${node} ${prop.path}=${v} must be an IRI`, node, path: prop.path });\n }\n if (prop.nodeKind === \"literal\" && !isLiteral(v)) {\n violations.push({ message: `${node} ${prop.path}=${v} must be a literal`, node, path: prop.path });\n }\n if (prop.hasValue !== undefined && v !== prop.hasValue) {\n violations.push({ message: `${node} ${prop.path} must be ${prop.hasValue}`, node, path: prop.path });\n }\n }\n }\n }\n }\n return { valid: violations.length === 0, violations };\n }\n\n private insert(q: Quad, premises: Quad[], rule: string, known: Set<string>): boolean {\n const k = this.key(q);\n if (known.has(k)) return false;\n known.add(k);\n this.quads.push(q);\n this.derivations.set(k, { premises, rule });\n return true;\n }\n\n /**\n * RDFS subset + OWL property axioms + versioned rules, to fixpoint:\n * - RDFS-SUB-TRANS / RDFS-TYPE / RDFS-SUBPROP-TRANS / RDFS-SUBPROP / RDFS-DOMAIN / RDFS-RANGE\n * - OWL-TRANSITIVE / OWL-SYMMETRIC / OWL-INVERSE (inverseOf both directions)\n * - <ruleId>@<version> for each applied GraphRule (premises tracked for why())\n */\n private entailToFixpoint(known: Set<string>): void {\n for (;;) {\n let added = false;\n const snapshot = [...this.quads];\n const byPred = (ps: Set<string>) => snapshot.filter((q) => ps.has(q.predicate));\n const insert = (q: Quad, premises: Quad[], rule: string): boolean => {\n const addedOne = this.insert(q, premises, rule, known);\n added = addedOne || added;\n return addedOne;\n };\n\n for (const ab of byPred(SUB_CLASS)) {\n for (const bc of byPred(SUB_CLASS).filter((q) => q.subject === ab.object)) {\n added = this.insert(\n { subject: ab.subject, predicate: ab.predicate, object: bc.object, source: \"entailment\", rule: \"RDFS-SUB-TRANS\" },\n [ab, bc],\n \"RDFS-SUB-TRANS\",\n known,\n ) || added;\n }\n }\n for (const t of byPred(RDF_TYPE)) {\n for (const sc of byPred(SUB_CLASS).filter((q) => q.subject === t.object)) {\n added = this.insert(\n { subject: t.subject, predicate: t.predicate, object: sc.object, source: \"entailment\", rule: \"RDFS-TYPE\" },\n [t, sc],\n \"RDFS-TYPE\",\n known,\n ) || added;\n }\n }\n for (const ab of byPred(SUB_PROP)) {\n for (const bc of byPred(SUB_PROP).filter((q) => q.subject === ab.object)) {\n added = this.insert(\n { subject: ab.subject, predicate: ab.predicate, object: bc.object, source: \"entailment\", rule: \"RDFS-SUBPROP-TRANS\" },\n [ab, bc],\n \"RDFS-SUBPROP-TRANS\",\n known,\n ) || added;\n }\n for (const use of snapshot.filter((q) => q.predicate === ab.subject)) {\n added = this.insert(\n { subject: use.subject, predicate: ab.object, object: use.object, source: \"entailment\", rule: \"RDFS-SUBPROP\" },\n [ab, use],\n \"RDFS-SUBPROP\",\n known,\n ) || added;\n }\n }\n for (const d of byPred(DOMAIN)) {\n for (const use of snapshot.filter((q) => q.predicate === d.subject)) {\n added = this.insert(\n { subject: use.subject, predicate: \"rdf:type\", object: d.object, source: \"entailment\", rule: \"RDFS-DOMAIN\" },\n [d, use],\n \"RDFS-DOMAIN\",\n known,\n ) || added;\n }\n }\n for (const r of byPred(RANGE)) {\n for (const use of snapshot.filter((q) => q.predicate === r.subject)) {\n if (insert(\n { subject: use.object, predicate: \"rdf:type\", object: r.object, source: \"entailment\", rule: \"RDFS-RANGE\" },\n [r, use],\n \"RDFS-RANGE\",\n )) added = true;\n }\n }\n added = this.applyOwl(snapshot, insert) || added;\n added = this.applyRules(snapshot, insert) || added;\n if (!added) return;\n }\n }\n\n private applyOwl(snapshot: Quad[], insert: (q: Quad, premises: Quad[], rule: string) => boolean): boolean {\n let added = false;\n const transitive = new Set(\n snapshot.filter((q) => RDF_TYPE.has(q.predicate) && OWL_TRANSITIVE.has(q.object)).map((q) => q.subject),\n );\n const symmetric = new Set(\n snapshot.filter((q) => RDF_TYPE.has(q.predicate) && OWL_SYMMETRIC.has(q.object)).map((q) => q.subject),\n );\n for (const p of transitive) {\n const uses = snapshot.filter((q) => q.predicate === p);\n for (const xy of uses) {\n for (const yz of uses.filter((q) => q.subject === xy.object)) {\n if (insert({ subject: xy.subject, predicate: p, object: yz.object, source: \"entailment\", rule: \"OWL-TRANSITIVE\" }, [xy, yz], \"OWL-TRANSITIVE\")) added = true;\n }\n }\n }\n for (const p of symmetric) {\n for (const xy of snapshot.filter((q) => q.predicate === p)) {\n if (insert({ subject: xy.object, predicate: p, object: xy.subject, source: \"entailment\", rule: \"OWL-SYMMETRIC\" }, [xy], \"OWL-SYMMETRIC\")) added = true;\n }\n }\n for (const inv of snapshot.filter((q) => OWL_INVERSE.has(q.predicate))) {\n for (const use of snapshot.filter((q) => q.predicate === inv.subject || q.predicate === inv.object)) {\n const flipped = use.predicate === inv.subject ? inv.object : inv.subject;\n if (insert({ subject: use.object, predicate: flipped, object: use.subject, source: \"entailment\", rule: \"OWL-INVERSE\" }, [inv, use], \"OWL-INVERSE\")) added = true;\n }\n }\n return added;\n }\n\n private applyRules(snapshot: Quad[], insert: (q: Quad, premises: Quad[], rule: string) => boolean): boolean {\n let added = false;\n for (const rule of this.rules) {\n const tag = rule.version ? `${rule.id}@${rule.version}` : rule.id;\n for (const binding of matchPatterns(rule.where, snapshot)) {\n for (const pattern of rule.construct) {\n const built: TriplePattern = {\n subject: instantiate(pattern.subject, binding.vars),\n predicate: instantiate(pattern.predicate, binding.vars),\n object: instantiate(pattern.object, binding.vars),\n };\n if (built.subject == null || built.predicate == null || built.object == null) continue;\n if (insert(\n { subject: built.subject, predicate: built.predicate, object: built.object, source: \"entailment\", rule: tag, derivedFrom: tag },\n binding.quads,\n tag,\n )) added = true;\n }\n }\n }\n return added;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pattern matching + SPARQL-subset (SELECT with conjunctive triple patterns)\n// ---------------------------------------------------------------------------\n\nexport interface PatternBinding {\n vars: Map<string, string>;\n quads: Quad[];\n}\n\nfunction isVar(term: string): boolean {\n return term.startsWith(\"?\");\n}\n\nfunction matchTerm(pattern: string, value: string, vars: Map<string, string>): Map<string, string> | undefined {\n if (isVar(pattern)) {\n const bound = vars.get(pattern);\n if (bound === undefined) {\n const next = new Map(vars);\n next.set(pattern, value);\n return next;\n }\n return bound === value ? vars : undefined;\n }\n return pattern === value ? vars : undefined;\n}\n\nfunction matchOne(pattern: TriplePattern, quad: Quad, vars: Map<string, string>): Map<string, string> | undefined {\n let v = matchTerm(pattern.subject, quad.subject, vars);\n if (!v) return undefined;\n v = matchTerm(pattern.predicate, quad.predicate, v);\n if (!v) return undefined;\n return matchTerm(pattern.object, quad.object, v);\n}\n\n/** Conjunctive matching of patterns against quads (nested-loop join). */\nexport function matchPatterns(patterns: TriplePattern[], quads: Quad[]): PatternBinding[] {\n let bindings: PatternBinding[] = [{ vars: new Map(), quads: [] }];\n for (const pattern of patterns) {\n const next: PatternBinding[] = [];\n for (const b of bindings) {\n for (const q of quads) {\n const vars = matchOne(pattern, q, b.vars);\n if (vars) next.push({ vars, quads: [...b.quads, q] });\n }\n }\n bindings = next;\n if (!bindings.length) break;\n }\n return bindings;\n}\n\nexport function instantiate(term: string, vars: Map<string, string>): string {\n return isVar(term) ? (vars.get(term) ?? term) : term;\n}\n\nexport interface SparqlSelect {\n variables: string[];\n patterns: TriplePattern[];\n}\n\nfunction tokenizeSparql(input: string): string[] {\n const tokens: string[] = [];\n const re = /\"[^\"]*\"(?:\\^\\^<?[\\w:/#.-]+>?|@[\\w-]+)?|<[^>]*>|[{}().;]|\\S+/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(input)) !== null) tokens.push(m[0]);\n return tokens;\n}\n\n/**\n * Minimal SELECT parser: `SELECT ?a ?b WHERE { s p o . ... }`.\n * Terms: ?vars, <iris>, prefixed names, \"literals\" (^^datatype/@lang ok).\n * Anything else throws — this is a documented subset, not full SPARQL.\n */\nexport function parseSelect(query: string): SparqlSelect {\n const tokens = tokenizeSparql(query);\n let i = 0;\n const expect = (want: string): void => {\n if (tokens[i]?.toUpperCase() !== want) throw new Error(`SPARQL: expected ${want}, got ${tokens[i] ?? \"end\"}`);\n i += 1;\n };\n expect(\"SELECT\");\n const variables: string[] = [];\n while (i < tokens.length && tokens[i].startsWith(\"?\")) {\n variables.push(tokens[i]);\n i += 1;\n }\n if (!variables.length) throw new Error(\"SPARQL: SELECT needs at least one variable\");\n expect(\"WHERE\");\n expect(\"{\");\n const patterns: TriplePattern[] = [];\n while (i < tokens.length && tokens[i] !== \"}\") {\n const s = tokens[i++];\n const p = tokens[i++];\n const o = tokens[i++];\n if (s == null || p == null || o == null || s === \".\" || p === \".\" || o === \".\") {\n throw new Error(\"SPARQL: malformed triple pattern\");\n }\n patterns.push({ subject: s, predicate: p, object: o });\n if (tokens[i] === \".\") i += 1;\n }\n expect(\"}\");\n return { variables, patterns };\n}\n\n/** Execute a SELECT against the store closure. Returns variable bindings. */\nexport async function executeSelect(store: GraphStore, query: string): Promise<Record<string, string>[]> {\n const { variables, patterns } = parseSelect(query);\n const quads = await store.match(null, null, null);\n return matchPatterns(patterns, quads).map((b) => {\n const row: Record<string, string> = {};\n for (const v of variables) row[v] = b.vars.get(v) ?? \"\";\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Agent tools: read, write (autonomous, validated), verify\n// ---------------------------------------------------------------------------\n\nimport { z } from \"zod\";\nimport { defineTool } from \"../tools/index.js\";\n\n/** Read-only SPARQL SELECT over the entailment closure. */\nexport function sparqlSelectTool(store: GraphStore) {\n return defineTool({\n name: \"sparql_select\",\n description: \"Query the knowledge graph. Subset: SELECT ?vars WHERE { s p o . ... } over the inferred closure.\",\n schema: z.object({ query: z.string().min(1).max(4000) }),\n execute: async ({ query }: { query: string }) => executeSelect(store, query),\n });\n}\n\n/** Ontology lookup: find classes/properties/labels matching a term. */\nexport function ontologyLookupTool(store: GraphStore) {\n return defineTool({\n name: \"ontology_lookup\",\n description: \"Look up ontology terms (classes, properties, labels) instead of inventing predicates.\",\n schema: z.object({ term: z.string().min(1).max(200), limit: z.number().int().min(1).max(20).default(8) }),\n execute: async ({ term, limit }: { term: string; limit?: number }) => {\n const needle = term.toLowerCase();\n const quads = await store.match(null, null, null);\n return quads\n .filter((q) => `${q.subject} ${q.predicate} ${q.object}`.toLowerCase().includes(needle))\n .slice(0, limit ?? 8)\n .map((q) => ({ subject: q.subject, predicate: q.predicate, object: q.object }));\n },\n });\n}\n\nexport const TurtleQuadSchema = z.object({\n subject: z.string().min(1),\n predicate: z.string().min(1),\n object: z.string().min(1),\n source: z.string().min(1).describe(\"Provenance URI (required — writes without it are rejected)\"),\n});\n\n/**\n * Autonomous validated write: SHACL + provenance + functional checks run\n * inside the store. Violations return as tool results (not throws) so the\n * model repairs and retries on its own — autonomy without anarchy.\n */\nexport function graphAddTool(store: GraphStore) {\n return defineTool({\n name: \"graph_add\",\n description: \"Write facts to the knowledge graph. Validated (SHACL/provenance/functional); violations return repair feedback.\",\n schema: z.object({ quads: z.array(TurtleQuadSchema).min(1).max(50) }),\n execute: async ({ quads }: { quads: { subject: string; predicate: string; object: string; source: string }[] }) => {\n try {\n await store.add(quads);\n const inferred = (await store.match(null, null, null)).filter((q) => q.source === \"entailment\");\n return { committed: quads.length, inferred: inferred.length };\n } catch (err) {\n return `Validation failed — fix and retry: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n toResult: (output: unknown) => ({\n content: typeof output === \"string\" ? output : JSON.stringify(output),\n artifact: typeof output === \"string\" ? undefined : { committed: (output as { committed: number }).committed },\n }),\n });\n}\n\nexport type ClaimVerdict = \"grounded\" | \"unknown\" | \"contradicted\";\n\n/**\n * Anti-hallucination primitive: is this triple in the closure (grounded),\n * absent (unknown — do not assert), or clashing with a functional value\n * (contradicted)? Ask before answering from memory.\n */\nexport function claimCheckTool(store: GraphStore) {\n return defineTool({\n name: \"claim_check\",\n description: \"Verify a fact against the graph before asserting it. Returns grounded | unknown | contradicted with proof.\",\n schema: z.object({ subject: z.string().min(1), predicate: z.string().min(1), object: z.string().min(1) }),\n execute: async ({ subject, predicate, object }: { subject: string; predicate: string; object: string }) => {\n const direct = await store.match(subject, predicate, object);\n if (direct.length) {\n return { verdict: \"grounded\" as ClaimVerdict, proof: await store.why(direct[0]) };\n }\n const siblings = await store.match(subject, predicate, null);\n const declarations = await store.match(predicate, null, null);\n const functional = declarations.some((q) => RDF_TYPE.has(q.predicate) && OWL_FUNCTIONAL.has(q.object));\n const clash = siblings.filter((q) => q.object !== object);\n if (functional && clash.length) {\n return {\n verdict: \"contradicted\" as ClaimVerdict,\n proof: { existing: clash.map((q) => q.object) },\n };\n }\n return {\n verdict: \"unknown\" as ClaimVerdict,\n proof: siblings.length ? { related: siblings.map((q) => q.object) } : null,\n };\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// GraphMemory: closure-aware session memory + long-term store\n// ---------------------------------------------------------------------------\n\nimport type { ChatMessage } from \"../types/index.js\";\nimport type { Memory } from \"../memory/index.js\";\nimport { tokenize } from \"../skills/index.js\";\n\n/**\n * Session memory + long-term store in one:\n * - load(): recent messages + top-k closure facts relevant to the latest\n * user turn (keyword overlap), rendered as a knowledge message.\n * - save(): delegates to inner memory (extraction of triples from prose\n * stays model-driven via graph_add — never silent parsing).\n * - exportState()/importState(): quads JSON for SessionManager snapshots (LTS).\n */\nexport class GraphMemory implements Memory {\n constructor(\n private store: GraphStore,\n private inner: Memory,\n private opts: { facts?: number } = {},\n ) {}\n\n async load(): Promise<ChatMessage[]> {\n const messages = await this.inner.load();\n const lastUser = [...messages].reverse().find((m) => m.role === \"user\");\n if (!lastUser) return messages;\n const terms = new Set(tokenize(typeof lastUser.content === \"string\" ? lastUser.content : \"\"));\n if (!terms.size) return messages;\n const quads = await this.store.match(null, null, null);\n const scored = quads\n .map((q) => {\n const hay = `${q.subject} ${q.predicate} ${q.object}`.toLowerCase();\n let score = 0;\n for (const t of terms) if (hay.includes(t)) score += 1;\n return { q, score };\n })\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, this.opts.facts ?? 8);\n if (!scored.length) return messages;\n const lines = scored.map((s) => `- ${s.q.subject} ${s.q.predicate} ${s.q.object}`);\n return [...messages, { role: \"assistant\", content: `Relevant known facts (ground answers in these):\\n${lines.join(\"\\n\")}` }];\n }\n\n async save(messages: ChatMessage[]): Promise<void> {\n await this.inner.save(messages);\n }\n\n async clear(): Promise<void> {\n await this.inner.clear();\n }\n\n /** Serialize the closure for snapshots / long-term persistence. */\n async exportState(): Promise<{ quads: Quad[] }> {\n return { quads: await this.store.match(null, null, null) };\n }\n\n /** Restore a previously exported closure (facts become explicit again). */\n async importState(state: { quads: Quad[] }): Promise<void> {\n const fresh = state.quads.filter((q) => q.source !== \"entailment\");\n if (fresh.length) await this.store.add(fresh);\n }\n}\n\nexport * from \"./remote-sparql.js\";\nexport * from \"./entity-linking.js\";\nexport * from \"./ontology-evolution.js\";\nexport * from \"./ontology-review.js\";\n","import { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * Remote SPARQL adapter (roadmap P2-sem): talk to real SPARQL endpoints —\n * Wikidata Query Service, Fuseki, GraphDB, Virtuoso — with auth and pinned\n * prefixes. The local GraphStore stays the read path for closures; this is\n * for data that lives OUTSIDE the agent's own graph.\n *\n * Protocol: SPARQL 1.1 — SELECT via POST `application/sparql-query`,\n * UPDATE via POST `application/sparql-update`; SELECT responses must be\n * `application/sparql-results+json` (we ask for it in Accept).\n */\n\nexport type SparqlAuth =\n | { type: \"basic\"; user: string; password: string }\n | { type: \"bearer\"; token: string }\n | { type: \"header\"; name: string; value: string };\n\nexport interface RemoteSparqlOptions {\n /** Query endpoint URL (e.g. https://query.wikidata.org/sparql). */\n endpoint: string;\n /** Update endpoint; defaults to `endpoint`. */\n updateEndpoint?: string;\n auth?: SparqlAuth;\n /** Pinned prefixes, prepended to every query as PREFIX declarations. */\n prefixes?: Record<string, string>;\n /** Extra request headers (merged over the defaults below). */\n headers?: Record<string, string>;\n fetchFn?: typeof fetch;\n /** Per-request timeout. Default 30s. */\n timeoutMs?: number;\n /**\n * Built-in retries for transient endpoints (429/5xx/network). Rate limits\n * are common on public SPARQL endpoints; the middleware retry is a separate\n * layer for MODEL calls only. Default 2. Honors Retry-After when present.\n */\n maxRetries?: number;\n}\n\n/** One SELECT result row: variable name -> plain string term. */\nexport type SparqlRow = Record<string, string>;\n\nconst DEFAULT_PREFIXES: Record<string, string> = {\n rdf: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n rdfs: \"http://www.w3.org/2000/01/rdf-schema#\",\n owl: \"http://www.w3.org/2002/07/owl#\",\n xsd: \"http://www.w3.org/2001/XMLSchema#\",\n skos: \"http://www.w3.org/2004/02/skos/core#\",\n dct: \"http://purl.org/dc/terms/\",\n prov: \"http://www.w3.org/ns/prov#\",\n schema: \"https://schema.org/\",\n};\n\nexport class RemoteSparqlAdapter {\n readonly endpoint: string;\n private readonly updateEndpoint: string;\n private readonly prefixes: Record<string, string>;\n private readonly extraHeaders: Record<string, string>;\n private readonly fetchFn: typeof fetch;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly auth?: SparqlAuth;\n\n constructor(opts: RemoteSparqlOptions) {\n this.endpoint = opts.endpoint.replace(/\\/$/, \"\");\n this.updateEndpoint = (opts.updateEndpoint ?? opts.endpoint).replace(/\\/$/, \"\");\n this.prefixes = { ...DEFAULT_PREFIXES, ...opts.prefixes };\n this.extraHeaders = opts.headers ?? {};\n this.fetchFn = opts.fetchFn ?? fetch;\n this.timeoutMs = opts.timeoutMs ?? 30000;\n this.maxRetries = Math.max(0, opts.maxRetries ?? 2);\n this.auth = opts.auth;\n }\n\n /** Prepend pinned PREFIX declarations so caller queries stay short. */\n withPrefixes(query: string): string {\n const declarations = Object.entries(this.prefixes)\n .map(([prefix, iri]) => `PREFIX ${prefix}: <${iri}>`)\n .join(\"\\n\");\n return `${declarations}\\n${query}`;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const out: Record<string, string> = { ...extra, ...this.extraHeaders };\n // Public endpoints (Wikidata notably) REJECT requests without a\n // descriptive User-Agent with 403 — send one by default.\n out[\"user-agent\"] ??= \"agent-framework/0.1 (+RemoteSparqlAdapter)\";\n if (!this.auth) return out;\n if (this.auth.type === \"basic\") {\n out.authorization = `Basic ${Buffer.from(`${this.auth.user}:${this.auth.password}`).toString(\"base64\")}`;\n } else if (this.auth.type === \"bearer\") {\n out.authorization = `Bearer ${this.auth.token}`;\n } else {\n out[this.auth.name] = this.auth.value;\n }\n return out;\n }\n\n private async post(\n url: string,\n contentType: string,\n body: string,\n accept: string,\n ): Promise<Response> {\n let lastError: AgentError | undefined;\n let retryDelayMs: number | undefined;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n // Public SPARQL endpoints rate-limit aggressively (429 with empty\n // bodies is common); honor Retry-After when the server sends it.\n await new Promise((r) => setTimeout(r, retryDelayMs ?? Math.min(2000 * 2 ** (attempt - 1), 10000)));\n }\n let res: Response;\n try {\n res = await this.fetchFn(url, {\n method: \"POST\",\n headers: this.headers({ \"content-type\": contentType, accept }),\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n lastError = new AgentError(\n \"REMOTE_SPARQL\",\n `SPARQL request failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n retryDelayMs = undefined; // no server hint — retry loop uses its own backoff\n continue;\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const retryable = res.status === 429 || res.status >= 500;\n const err = new AgentError(\n \"REMOTE_SPARQL\",\n `${url} HTTP ${res.status}: ${text.slice(0, 300)}`,\n retryable,\n );\n const retryAfterHeader = Number.parseInt(res.headers.get(\"retry-after\") ?? \"\", 10);\n retryDelayMs = Number.isFinite(retryAfterHeader) ? Math.min(retryAfterHeader * 1000, 60000) : undefined;\n if (!retryable || attempt === this.maxRetries) throw err;\n lastError = err;\n continue;\n }\n return res;\n }\n // Unreachable for the non-ok path (throws above); a network error on the\n // final attempt lands here.\n throw lastError ?? new AgentError(\"REMOTE_SPARQL\", \"request failed\", true);\n }\n\n /**\n * SELECT over the remote endpoint. Returns rows of plain-string terms\n * (same shape as the local `executeSelect`) so both path kinds compose.\n */\n async select(query: string): Promise<SparqlRow[]> {\n const res = await this.post(\n this.endpoint,\n \"application/sparql-query\",\n this.withPrefixes(query),\n \"application/sparql-results+json\",\n );\n let json: { head?: { vars?: string[] }; results?: { bindings?: Record<string, { value?: string }>[] } };\n try {\n json = (await res.json()) as typeof json;\n } catch (err) {\n // Server ignored Accept and sent something else (or truncated).\n throw new AgentError(\n \"REMOTE_SPARQL\",\n `Endpoint returned non-JSON results (expected sparql-results+json): ${err instanceof Error ? err.message : String(err)}`,\n false,\n );\n }\n const vars = json.head?.vars ?? [];\n const bindings = json.results?.bindings ?? [];\n return bindings.map((b) => {\n const row: SparqlRow = {};\n for (const v of vars) row[v] = b[v]?.value ?? \"\";\n return row;\n });\n }\n\n /**\n * SPARQL 1.1 UPDATE (INSERT/DELETE DATA, DELETE WHERE...) against the\n * update endpoint. Opt-in — never wire this into a read-only agent.\n */\n async update(query: string): Promise<void> {\n await this.post(\n this.updateEndpoint,\n \"application/sparql-update\",\n this.withPrefixes(query),\n \"*/*\",\n );\n }\n}\n\n/** Agent-facing tool. SELECT always; UPDATE only when `allowUpdate`. */\nexport function remoteSparqlTool(adapter: RemoteSparqlAdapter, opts: { allowUpdate?: boolean } = {}): Tool {\n if (!opts.allowUpdate) {\n return defineTool({\n name: \"remote_sparql_select\",\n description: \"Query a remote SPARQL endpoint (read-only SELECT).\",\n schema: z.object({ query: z.string().min(1).max(20000) }),\n execute: async ({ query }: { query: string }) => adapter.select(query),\n });\n }\n return defineTool({\n name: \"remote_sparql\",\n description: \"Query or mutate a remote SPARQL endpoint (SELECT, or UPDATE with { update: true }).\",\n schema: z.object({ query: z.string().min(1).max(20000), update: z.boolean().default(false) }),\n execute: async ({ query, update }: { query: string; update?: boolean }) => {\n if (update) {\n await adapter.update(query);\n return { updated: true };\n }\n return adapter.select(query);\n },\n });\n}","import { z } from \"zod\";\nimport { defineTool } from \"../tools/index.js\";\nimport type { GraphStore, Quad } from \"./index.js\";\n\n/**\n * Entity linking (roadmap P2-sem): turn free-text mentions into graph IRIs.\n * Case-insensitive label index (rdfs:label / skos:prefLabel / skos:altLabel)\n * over the store closure, canonicalized through owl:sameAs groups — a\n * mention linked through any alias resolves to ONE representative IRI.\n *\n * docs/07 rule 2, autonomy-first: the model calls `propose_mapping` and the\n * mapping commits on proposal (default) as a provenance-carrying\n * skos:altLabel the linker sees from then on — matching the autonomous write\n * path everywhere else (graph_add). Human review is the opt-out:\n * `new MappingProposals({ autonomy: false })` queues proposals for decide(),\n * or gate the tool with humanInTheLoopMiddleware. Provenance is mandatory\n * either way.\n */\n\nexport const LABEL_PREDICATES = new Set([\n \"rdfs:label\",\n \"http://www.w3.org/2000/01/rdf-schema#label\",\n \"skos:prefLabel\",\n \"http://www.w3.org/2004/02/skos/core#prefLabel\",\n \"skos:altLabel\",\n \"http://www.w3.org/2004/02/skos/core#altLabel\",\n]);\nconst SAME_AS = new Set([\"owl:sameAs\", \"http://www.w3.org/2002/07/owl#sameAs\"]);\n\n/** Prefixes used to expand/compact IRIs for JSON-LD I/O (nullable values pass through). */\nexport const JSONLD_PREFIXES: Record<string, string> = {\n rdf: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n rdfs: \"http://www.w3.org/2000/01/rdf-schema#\",\n owl: \"http://www.w3.org/2002/07/owl#\",\n xsd: \"http://www.w3.org/2001/XMLSchema#\",\n skos: \"http://www.w3.org/2004/02/skos/core#\",\n dct: \"http://purl.org/dc/terms/\",\n prov: \"http://www.w3.org/ns/prov#\",\n schema: \"https://schema.org/\",\n ex: \"urn:example:\",\n};\n\nexport interface LinkedEntity {\n /** Canonical (sameAs-group representative) IRI, in the store's term form. */\n iri: string;\n label?: string;\n score: number;\n /** Other IRIs the same entity is known as (the sameAs group). */\n sameAsGroup: string[];\n}\n\nexport class EntityLinker {\n constructor(private store: GraphStore) {}\n\n /** Union-find over owl:sameAs pairs: every alias cluster -> one representative. */\n private async sameAsGroups(): Promise<Map<string, string>> {\n const pairs = (await this.store.match(null, null, null)).filter((q) => SAME_AS.has(q.predicate));\n const parent = new Map<string, string>();\n const find = (x: string): string => {\n let root = x;\n while (parent.get(root) !== root && parent.has(root)) root = parent.get(root)!;\n return root;\n };\n const union = (a: string, b: string): void => {\n const ra = find(a);\n const rb = find(b);\n if (ra !== rb) parent.set(ra, rb);\n };\n for (const q of pairs) {\n if (!parent.has(q.subject)) parent.set(q.subject, q.subject);\n if (!parent.has(q.object)) parent.set(q.object, q.object);\n union(q.subject, q.object);\n }\n const representative = new Map<string, string>();\n for (const member of parent.keys()) representative.set(member, find(member));\n return representative;\n }\n\n /** Mention -> candidate entities, best first, canonicalized via sameAs. */\n async link(mention: string, k = 5): Promise<LinkedEntity[]> {\n const needle = mention.trim().toLowerCase();\n if (!needle) return [];\n const quads = await this.store.match(null, null, null);\n const canonical = await this.sameAsGroups();\n const labels = new Map<string, string>(); // iri -> best label (pref > rdfs > alt)\n const labelScore = new Map<string, number>(); // iri -> score of best label predicate (lower wins)\n\n const candidates: { iri: string; label?: string; score: number }[] = [];\n for (const q of quads) {\n // IRI local-name match (ex:ada -> \"ada\", also the full-IRI tail).\n const localPart = localName(q.subject);\n const fullTail = q.subject.includes(\"/\") || q.subject.includes(\"#\") ? q.subject.split(/[#/]/).pop() ?? \"\" : localPart;\n if (localPart === needle) candidates.push({ iri: q.subject, score: 40 });\n else if (localPart.startsWith(needle)) candidates.push({ iri: q.subject, score: 25 });\n else if (fullTail.toLowerCase() === needle) candidates.push({ iri: q.subject, score: 40 });\n\n if (LABEL_PREDICATES.has(q.predicate)) {\n const label = stripLiteral(q.object).toLowerCase();\n const trust = q.predicate.includes(\"altLabel\") ? 2 : q.predicate.includes(\"prefLabel\") ? 0 : 1;\n if (label === needle) candidates.push({ iri: q.subject, label: stripLiteral(q.object), score: 100 });\n else if (label.startsWith(needle)) candidates.push({ iri: q.subject, label: stripLiteral(q.object), score: 60 });\n else if (label.includes(needle)) candidates.push({ iri: q.subject, label: stripLiteral(q.object), score: 30 });\n // Track each iri's best (most authoritative) label for output.\n const prev = labelScore.get(q.subject);\n if (prev === undefined || trust < prev) {\n labels.set(q.subject, stripLiteral(q.object));\n labelScore.set(q.subject, trust);\n }\n }\n }\n\n // Merge per canonical IRI, keep the best score + the group members.\n const merged = new Map<string, LinkedEntity>();\n for (const c of candidates) {\n const rep = canonical.get(c.iri) ?? c.iri;\n const existing = merged.get(rep);\n if (existing) {\n existing.score = Math.max(existing.score, c.score);\n if (c.label && !existing.label) existing.label = c.label;\n if (!existing.sameAsGroup.includes(c.iri)) existing.sameAsGroup.push(c.iri);\n } else {\n merged.set(rep, {\n iri: rep,\n label: c.label ?? labels.get(rep),\n score: c.score,\n sameAsGroup: [c.iri, ...(rep !== c.iri ? [rep] : [])],\n });\n }\n }\n for (const group of merged.values()) {\n group.label ??= labels.get(group.iri);\n if (group.sameAsGroup.length < 2) {\n const members = [...canonical.keys()].filter((m) => canonical.get(m) === canonical.get(group.iri));\n if (members.length > 1) group.sameAsGroup = members;\n }\n }\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n }\n}\n\nfunction stripLiteral(term: string): string {\n const m = term.match(/^\"(.*)\"(\\^\\^<?[\\w:/#.-]+>?|@[\\w-]+)?$/);\n return m ? m[1] : term;\n}\n\nfunction localName(iri: string): string {\n const tail = iri.split(/[#/:]/).pop() ?? \"\";\n return tail.toLowerCase();\n}\n\n/** link_entity agent tool: mention -> canonical IRIs with scores. */\nexport function linkEntityTool(linker: EntityLinker) {\n return defineTool({\n name: \"link_entity\",\n description:\n \"Link a text mention to known graph entities (labels + sameAs canonicalized). Returns canonical IRIs with scores — never invent IRIs.\",\n schema: z.object({ mention: z.string().min(1).max(200), k: z.number().int().min(1).max(10).default(5) }),\n execute: async ({ mention, k }: { mention: string; k?: number }) => linker.link(mention, k),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mapping proposals: LLM proposes, humans approve (docs/07 rule 2)\n// ---------------------------------------------------------------------------\n\nexport interface MappingProposal {\n id: string;\n /** The source-side term: usually a raw column header / mention string. */\n from: string;\n /** The proposed target: a canonical ontology IRI. */\n to: string;\n /** Provenance for the eventual commit (required by GraphStore.validate). */\n source: string;\n status: \"pending\" | \"approved\" | \"rejected\";\n /** True when autonomy committed it on proposal (no human turn). */\n committedByAutonomy?: boolean;\n proposedAt: string;\n}\n\nexport type MappingDecision = \"approved\" | \"rejected\";\n\nexport interface MappingProposalsOptions {\n /**\n * Autonomy: proposals commit IMMEDIATELY on proposal. DEFAULT ON — the\n * agent's whole write path is autonomous (graph_add), so mapping should\n * not be the one gate keeping a human in the loop. Set `autonomy: false`\n * to queue proposals for human decide() instead, or gate the tool with\n * humanInTheLoopMiddleware.\n */\n autonomy?: boolean;\n /** Store to commit against. Without one there is nowhere to commit — proposals queue as pending. */\n store?: GraphStore;\n}\n\nexport class MappingProposals {\n private seq = 0;\n private items = new Map<string, MappingProposal>();\n\n constructor(private opts: MappingProposalsOptions = {}) {}\n\n /** True when proposals commit themselves (autonomy on AND a store bound). */\n get autonomy(): boolean {\n return this.opts.autonomy !== false && !!this.opts.store;\n }\n\n private async commit(proposal: MappingProposal, store: GraphStore): Promise<void> {\n // Promotion = a provenance-carrying alias the linker can see forever.\n await store.add([\n {\n subject: proposal.to,\n predicate: \"skos:altLabel\",\n object: `\"${proposal.from}\"`,\n source: proposal.source,\n derivedFrom: `mapping:${proposal.id}`,\n },\n ]);\n }\n\n /**\n * Record an LLM-proposed mapping. With autonomy (default) + a bound store\n * it commits right away, provenance required; with `autonomy: false` (or\n * no store bound) it queues as pending until decide().\n */\n async propose(from: string, to: string, source: string): Promise<MappingProposal> {\n const existing = [...this.items.values()].find(\n (p) => p.from === from && p.to === to && (p.status === \"pending\" || (this.autonomy && p.status === \"approved\")),\n );\n if (existing) return existing;\n const proposal: MappingProposal = {\n id: `map-${++this.seq}`,\n from,\n to,\n source,\n status: \"pending\",\n proposedAt: new Date().toISOString(),\n };\n if (this.autonomy && this.opts.store) {\n await this.commit(proposal, this.opts.store);\n proposal.status = \"approved\";\n proposal.committedByAutonomy = true;\n }\n this.items.set(proposal.id, proposal);\n return proposal;\n }\n\n list(status?: MappingProposal[\"status\"]): MappingProposal[] {\n return [...this.items.values()].filter((p) => !status || p.status === status);\n }\n\n /** Human decision. `approved` also commits the alias into the graph. */\n async decide(store: GraphStore, id: string, decision: MappingDecision): Promise<MappingProposal | undefined> {\n const proposal = this.items.get(id);\n if (!proposal || proposal.status !== \"pending\") return undefined;\n proposal.status = decision;\n if (decision === \"approved\") {\n await this.commit(proposal, store);\n }\n return proposal;\n }\n}\n\nexport function proposeMappingTool(proposals: MappingProposals) {\n return defineTool({\n name: \"propose_mapping\",\n description: \"Map a raw term to a canonical ontology IRI. Autonomy mode commits the alias immediately (provenance required); review mode queues it for human approval.\",\n schema: z.object({\n from: z.string().min(1).max(200),\n to: z.string().min(1).max(500),\n source: z.string().min(1).describe(\"Provenance URI for the committed alias\"),\n }),\n execute: async ({ from, to, source }: { from: string; to: string; source: string }) => {\n let p: MappingProposal;\n try {\n p = await proposals.propose(from, to, source);\n } catch (err) {\n // Same contract as graph_add: violations are repair feedback, not a\n // thrown tool error that would kill the run.\n return `Commit rejected — fix and retry: ${err instanceof Error ? err.message : String(err)}`;\n }\n return p.committedByAutonomy\n ? { id: p.id, status: \"approved\", committed: true }\n : { id: p.id, status: \"pending\", note: \"Review mode: awaits a human decide() before writing.\" };\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// JSON-LD expand/compact I/O (roadmap P2-sem)\n// ---------------------------------------------------------------------------\n\ninterface JsonLdValue {\n \"@id\"?: string;\n \"@value\"?: string;\n \"@type\"?: string;\n \"@language\"?: string;\n}\n\nfunction resolveIri(term: string, prefixes: Record<string, string>): string | undefined {\n const m = term.match(/^([a-zA-Z][\\w-]*):(.+)$/);\n const base = m ? prefixes[m[1]] : undefined;\n if (m && base) return `${base}${m[2]}`;\n if (/^https?:\\/\\//.test(term)) return term;\n return undefined; // literal or unknown prefix\n}\n\nfunction compactIri(iri: string, prefixes: Record<string, string>): string {\n for (const [prefix, base] of Object.entries(prefixes)) {\n if (iri.startsWith(base)) return `${prefix}:${iri.slice(base.length)}`;\n }\n return iri;\n}\n\nfunction termToJsonLd(term: string, prefixes: Record<string, string>): JsonLdValue {\n const iri = resolveIri(term, prefixes);\n if (iri) return { \"@id\": iri };\n const lang = term.match(/^\"(.*)\"@([\\w-]+)$/);\n if (lang) return { \"@value\": lang[1], \"@language\": lang[2] };\n const typed = term.match(/^\"(.*)\"\\^\\^<?([\\w:/#.-]+)>?$/);\n if (typed) {\n const type = resolveIri(typed[2], prefixes) ?? typed[2];\n return { \"@value\": typed[1], \"@type\": type };\n }\n const plain = term.match(/^\"(.*)\"$/);\n if (plain) return { \"@value\": plain[1] };\n if (/^-?\\d+(\\.\\d+)?$/.test(term) || /^(true|false)$/.test(term)) return { \"@value\": term };\n return { \"@value\": term };\n}\n\nfunction jsonLdToTerm(value: JsonLdValue | string | number | boolean, prefixes: Record<string, string>): string | undefined {\n if (value === null || typeof value !== \"object\") {\n const native = String(value);\n return /^-?\\d+(\\.\\d+)?$/.test(native) || native === \"true\" || native === \"false\" ? native : `\"${native}\"`;\n }\n if (value[\"@id\"]) return compactIri(value[\"@id\"], prefixes);\n if (value[\"@value\"] !== undefined) {\n if (value[\"@language\"]) return `\"${value[\"@value\"]}\"@${value[\"@language\"]}`;\n if (value[\"@type\"]) {\n const type = compactIri(value[\"@type\"], prefixes);\n return `\"${value[\"@value\"]}\"^^${type}`;\n }\n return `\"${value[\"@value\"]}\"`;\n }\n return undefined;\n}\n\n/**\n * Quads -> expanded JSON-LD. Named graphs round-trip: quads carrying a\n * `graph` become JSON-LD named-graph entries ({\"@id\": graph, \"@graph\": ...}),\n * graph-less quads land in the default graph. Provenance fields\n * (source/rule) do not round-trip — JSON-LD carries the statements, the\n * store keeps the evidence.\n */\nexport function quadsToJsonLd(quads: Quad[], prefixes: Record<string, string> = JSONLD_PREFIXES): Record<string, unknown> {\n const byGraph = new Map<string, Quad[]>();\n for (const q of quads) {\n const g = q.graph ?? \"\";\n byGraph.set(g, [...(byGraph.get(g) ?? []), q]);\n }\n const buildNodes = (group: Quad[]): Record<string, unknown>[] => {\n const nodes = new Map<string, Record<string, unknown>>();\n const nodeOf = (id: string): Record<string, unknown> => {\n let n = nodes.get(id);\n if (!n) {\n n = { \"@id\": resolveIri(id, prefixes) ?? id };\n nodes.set(id, n);\n }\n return n;\n };\n for (const q of group) {\n const node = nodeOf(q.subject);\n if (q.predicate === \"rdf:type\" || q.predicate === \"a\") {\n const existing = node[\"@type\"];\n const typeIri = resolveIri(q.object, prefixes) ?? q.object;\n node[\"@type\"] = Array.isArray(existing) ? [...existing, typeIri].filter((t, i, a) => a.indexOf(t) === i) : existing ? [existing, typeIri] : typeIri;\n continue;\n }\n const key = resolveIri(q.predicate, prefixes) ?? q.predicate;\n const value = termToJsonLd(q.object, prefixes);\n const existing = node[key];\n node[key] = Array.isArray(existing) ? [...existing, value] : existing ? [existing, value] : value;\n }\n return [...nodes.values()];\n };\n const graphEntries: unknown[] = [];\n for (const [g, group] of byGraph) {\n const nodes = buildNodes(group);\n if (g === \"\") graphEntries.push(...nodes);\n else graphEntries.push({ \"@id\": resolveIri(g, prefixes) ?? g, \"@graph\": nodes });\n }\n return { \"@context\": prefixes, \"@graph\": graphEntries };\n}\n\n/** Expanded JSON-LD -> quads (named graphs preserved; prefixed terms restored where the map covers them). */\nexport function jsonldToQuads(\n doc: { \"@graph\"?: unknown[] } & Record<string, unknown>,\n prefixes: Record<string, string> = JSONLD_PREFIXES,\n): { subject: string; predicate: string; object: string; graph?: string }[] {\n const out: { subject: string; predicate: string; object: string; graph?: string }[] = [];\n let blank = 0;\n const convertNode = (node: Record<string, unknown>, graphName: string | undefined): void => {\n const subjectId = (node[\"@id\"] ? String(node[\"@id\"]) : \"\") ? compactIri(String(node[\"@id\"]), prefixes) : `_:b${blank++}`;\n const types = node[\"@type\"];\n for (const t of Array.isArray(types) ? types : types ? [types] : []) {\n out.push({ subject: subjectId, predicate: \"rdf:type\", object: compactIri(String(t), prefixes), ...(graphName ? { graph: graphName } : {}) });\n }\n for (const [key, raw] of Object.entries(node)) {\n if (key === \"@id\" || key === \"@type\") continue;\n const predicate = compactIri(key.includes(\":\") ? resolveIri(key, prefixes) ?? key : key, prefixes);\n for (const v of Array.isArray(raw) ? raw : [raw]) {\n const object = jsonLdToTerm(v as JsonLdValue | string, prefixes);\n if (object !== undefined) out.push({ subject: subjectId, predicate, object, ...(graphName ? { graph: graphName } : {}) });\n }\n }\n };\n for (const entry of doc[\"@graph\"] ?? []) {\n if (entry && typeof entry === \"object\" && Array.isArray((entry as Record<string, unknown>)[\"@graph\"])) {\n const named = entry as { \"@id\"?: string; \"@graph\": Record<string, unknown>[] };\n const graphName = named[\"@id\"] ? compactIri(named[\"@id\"], prefixes) : `_:g${out.length}`;\n for (const node of named[\"@graph\"]) convertNode(node, graphName);\n continue;\n }\n convertNode(entry as Record<string, unknown>, undefined);\n }\n return out;\n}","import type { NodeShape, Quad, StoreOptions } from \"./index.js\";\nimport { InMemoryGraphStore, executeSelect } from \"./index.js\";\n\n/**\n * Ontology evolution (roadmap P2-sem, docs/07 lifecycle stage \"evolve\"):\n * TBox v3 -> v4 with a migration that is checked before AND after by a\n * conformance battery, and that never destroys the old store.\n *\n * The store has no delete by design; migration therefore REBUILDS: explicit\n * facts are exported from the old store, transformed (axiom add/remove,\n * term renames, deprecations), re-validated and re-entailed into a fresh\n * v4 store. The v3 store survives untouched — rollback is \"don't adopt\".\n */\n\nexport interface ConformanceCheck {\n id: string;\n /**\n * SPARQL-subset SELECT (see executeSelect). Passes when the row count is\n * within [minRows, maxRows]. Default: at least one row (ask-style);\n * `minRows: 0, maxRows: 0` asserts absence.\n */\n ask?: string;\n minRows?: number;\n maxRows?: number;\n /** An extra SHACL shape the closure must satisfy. */\n shape?: NodeShape;\n /** Why this check matters — surfaces in failure reports. */\n reason?: string;\n}\n\nexport interface ConformanceResult {\n id: string;\n passed: boolean;\n detail: string;\n}\n\nexport interface ConformanceReport {\n passed: boolean;\n results: ConformanceResult[];\n}\n\n/** Run a battery of checks against a store's closure. */\nexport async function runConformance(\n store: InMemoryGraphStore,\n battery: ConformanceCheck[],\n): Promise<ConformanceReport> {\n const results: ConformanceResult[] = [];\n const runner = async (check: ConformanceCheck, closure: Quad[]): Promise<void> => {\n if (check.ask) {\n const rows = await executeSelect(store, check.ask);\n const min = check.minRows ?? 1;\n const ok = rows.length >= min && (check.maxRows == null || rows.length <= check.maxRows);\n results.push({\n id: check.id,\n passed: ok,\n detail: `${rows.length} rows (expected >= ${min}${check.maxRows == null ? \"\" : `, <= ${check.maxRows}`})`,\n });\n return;\n }\n if (check.shape) {\n // Battery shapes aren't store-registered: validate with a scratch\n // store carrying ONLY this shape (checkShapes is pure — no entailment).\n const scratch = new InMemoryGraphStore({ shapes: [check.shape] });\n const mine = scratch.checkShapes(closure).violations;\n results.push({\n id: check.id,\n passed: mine.length === 0,\n detail: mine.length ? mine.map((v) => v.message).join(\"; \") : \"shape holds\",\n });\n return;\n }\n results.push({\n id: check.id,\n passed: false,\n detail: `check has neither ask nor shape${check.reason ? ` (${check.reason})` : \"\"}`,\n });\n };\n const closure = await store.match(null, null, null);\n for (const check of battery) {\n try {\n await runner(check, closure);\n } catch (err) {\n results.push({ id: check.id, passed: false, detail: err instanceof Error ? err.message : String(err) });\n }\n }\n return { passed: results.every((r) => r.passed), results };\n}\n\nexport interface TBoxMigrationSpec {\n from: string;\n to: string;\n /** New TBox axioms to add (provenance required by the store). */\n added?: Quad[];\n /** Exact axioms to retract (matched on subject|predicate|object). */\n removed?: { subject: string; predicate: string; object: string }[];\n /**\n * Term renames applied to BOTH the TBox and ABox in all three positions\n * (subject/predicate/object): class splits, predicate renames, IRI moves.\n */\n renames?: { from: string; to: string }[];\n /** Terms deprecated in this version; with `replacement`, uses are rewritten. */\n deprecations?: { term: string; replacement?: string; reason: string }[];\n /** Shapes/rules carried by the NEW store (defaults to the old store's). */\n shapes?: NodeShape[];\n rules?: StoreOptions[\"rules\"];\n}\n\nexport interface MigrationReport {\n from: string;\n to: string;\n status: \"migrated\" | \"aborted\" | \"failed\";\n addedQuads: number;\n removedQuads: number;\n rewrittenQuads: number;\n /** Named graph the v4 TBox axioms were written to (match(.., ..., tboxGraph)). */\n tboxGraph?: string;\n deprecatedWarnings: string[];\n errors: string[];\n preBattery?: ConformanceReport;\n postBattery?: ConformanceReport;\n}\n\nexport interface MigrationResult {\n report: MigrationReport;\n /** Present on success — the new-version store with a fresh closure. The v3 store is untouched. */\n store?: InMemoryGraphStore;\n}\n\nfunction termKey(q: { subject: string; predicate: string; object: string }): string {\n return `${q.subject}|${q.predicate}|${q.object}`;\n}\n\n/** Ontology-defining predicates: shared with the review auditor. */\nexport const TBOX_PREDICATES = new Set([\n \"rdfs:subClassOf\",\n \"http://www.w3.org/2000/01/rdf-schema#subClassOf\",\n \"rdfs:subPropertyOf\",\n \"http://www.w3.org/2000/01/rdf-schema#subPropertyOf\",\n \"rdfs:domain\",\n \"http://www.w3.org/2000/01/rdf-schema#domain\",\n \"rdfs:range\",\n \"http://www.w3.org/2000/01/rdf-schema#range\",\n \"owl:inverseOf\",\n \"http://www.w3.org/2002/07/owl#inverseOf\",\n]);\n\n/** rdf:type objects that mark a TERM declaration, not an instance fact. */\nexport const OWL_VOCAB = new Set([\n \"owl:TransitiveProperty\",\n \"http://www.w3.org/2002/07/owl#TransitiveProperty\",\n \"owl:SymmetricProperty\",\n \"http://www.w3.org/2002/07/owl#SymmetricProperty\",\n \"owl:FunctionalProperty\",\n \"http://www.w3.org/2002/07/owl#FunctionalProperty\",\n \"owl:Class\",\n \"http://www.w3.org/2002/07/owl#Class\",\n \"rdfs:Class\",\n \"http://www.w3.org/2000/01/rdf-schema#Class\",\n \"rdfs:Datatype\",\n \"http://www.w3.org/2000/01/rdf-schema#Datatype\",\n]);\n\n/**\n * Migrate a TBox. Order: pre-battery (abort on failure) -> rebuild ->\n * post-battery (report failure; caller decides whether to adopt).\n */\nexport async function migrateTBox(\n oldStore: InMemoryGraphStore,\n spec: TBoxMigrationSpec,\n opts: { battery?: ConformanceCheck[]; factory?: (opts: StoreOptions) => InMemoryGraphStore; tboxGraph?: string | false } = {},\n): Promise<MigrationResult> {\n const report: MigrationReport = {\n from: spec.from,\n to: spec.to,\n status: \"migrated\",\n addedQuads: 0,\n removedQuads: 0,\n rewrittenQuads: 0,\n deprecatedWarnings: [],\n errors: [],\n };\n\n if (opts.battery?.length) {\n report.preBattery = await runConformance(oldStore, opts.battery);\n if (!report.preBattery.passed) {\n report.status = \"aborted\";\n report.errors.push(\"pre-migration conformance battery failed — ontology not migrated\");\n return { report };\n }\n }\n\n const removeKeys = new Set((spec.removed ?? []).map(termKey));\n const renameMap = new Map<string, string>();\n for (const r of spec.renames ?? []) renameMap.set(r.from, r.to);\n for (const d of spec.deprecations ?? []) {\n if (d.replacement) {\n renameMap.set(d.term, d.replacement);\n report.deprecatedWarnings.push(`${d.term} deprecated (${d.reason}) — rewritten to ${d.replacement}`);\n } else {\n report.deprecatedWarnings.push(`${d.term} deprecated (${d.reason}) — uses kept, flagged`);\n }\n }\n\n const rewriteTerm = (term: string): string => renameMap.get(term) ?? term;\n\n const factory = opts.factory ?? ((o: StoreOptions) => new InMemoryGraphStore(o));\n const newStore = factory({\n shapes: spec.shapes ?? oldStore.ontologyShapes(),\n rules: spec.rules ?? oldStore.ontologyRules(),\n });\n\n const explicit = (await oldStore.match(null, null, null)).filter((q) => q.source !== \"entailment\");\n // Named-graph use: the v4 ontology is its OWN dataset inside the store —\n // every version stays addressable (match(null, null, null, tboxGraph)),\n // JSON-LD round-trips it as a named graph, and `false` opts out.\n const tboxGraph = opts.tboxGraph === false ? undefined : opts.tboxGraph ?? `urn:framework:ontology:${spec.to}`;\n report.tboxGraph = tboxGraph;\n const isAxiom = (q: Quad, predicatesInUse: Set<string>): boolean => {\n if (TBOX_PREDICATES.has(q.predicate)) return true;\n // rdf:type is TBox when it types a TERM (property/class used somewhere)\n // or carries an OWL vocabulary marker — it's ABox for plain instances\n // (prefixed and full-IRI forms both count).\n if (q.predicate === \"rdf:type\" || q.predicate === \"a\" || q.predicate === \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\") {\n return predicatesInUse.has(q.subject) || OWL_VOCAB.has(q.object);\n }\n return false;\n };\n const predicatesInUse = new Set(explicit.filter((q) => !removeKeys.has(termKey(q))).map((q) => rewriteTerm(q.predicate)));\n\n const rewrittenSpecAdded = (spec.added ?? []).map((aq) =>\n tboxGraph ? { ...aq, graph: tboxGraph, derivedFrom: `migration:${spec.from}->${spec.to}` } : { ...aq, derivedFrom: `migration:${spec.from}->${spec.to}` },\n );\n const rebuilt: Quad[] = [];\n for (const q of explicit) {\n if (removeKeys.has(termKey(q))) {\n report.removedQuads += 1;\n continue;\n }\n const next: Quad = {\n subject: rewriteTerm(q.subject),\n predicate: rewriteTerm(q.predicate),\n object: rewriteTerm(q.object),\n source: q.source,\n ...(q.graph ? { graph: q.graph } : {}),\n ...(q.derivedFrom ? { derivedFrom: q.derivedFrom } : {}),\n };\n if (isAxiom(next, predicatesInUse) && tboxGraph) next.graph = tboxGraph;\n if (termKey(next) !== termKey(q)) {\n report.rewrittenQuads += 1;\n next.derivedFrom = `${next.derivedFrom ? `${next.derivedFrom};` : \"\"}migration:${spec.from}->${spec.to}`;\n }\n rebuilt.push(next);\n }\n for (const aq of rewrittenSpecAdded) rebuilt.push(aq);\n report.addedQuads = (spec.added ?? []).length;\n\n try {\n await newStore.add(rebuilt);\n } catch (err) {\n report.status = \"failed\";\n report.errors.push(`v4 store rejected migrated facts: ${err instanceof Error ? err.message : String(err)}`);\n return { report };\n }\n\n if (opts.battery?.length) {\n report.postBattery = await runConformance(newStore, opts.battery);\n if (!report.postBattery.passed) {\n report.status = \"failed\";\n const failed = report.postBattery.results.filter((r) => !r.passed).map((r) => `${r.id}: ${r.detail}`);\n report.errors.push(`post-migration conformance battery failed — ${failed.join(\"; \")}`);\n return { report };\n }\n }\n\n return { report, store: newStore };\n}","import { z } from \"zod\";\nimport { defineTool } from \"../tools/index.js\";\nimport type { NodeShape, Quad } from \"./index.js\";\nimport { InMemoryGraphStore } from \"./index.js\";\nimport { LABEL_PREDICATES } from \"./entity-linking.js\";\nimport { TBOX_PREDICATES, OWL_VOCAB } from \"./ontology-evolution.js\";\n\n/**\n * Ontology self-review (extends docs/07 lifecycle: enforce -> evolve):\n * the agent audits what its own ontology IS — not what it wishes it were —\n * directly from the store, and identifies what to add:\n *\n * 1. reviewOntology(): inventory + gaps. Used-but-undeclared terms,\n * declared-but-unused terms, unlabeled terms, properties missing\n * rdfs:domain/range. \"Where is X used?\", \"what's missing?\" — one call.\n * 2. proposeShapes(): SHACL INDUCTION from instance data — observe each\n * class's instances, emit candidate NodeShapes (minCount/maxCount,\n * datatype, nodeKind) that explain the observed data. Per docs/07 the\n * builder owns shapes: these are PROPOSALS — adopt via adoptShapes()\n * (validates the existing closure first) or the next\n * migrateTBox({ shapes }); never a silent self-adoption.\n */\n\nconst RDF_TYPE = new Set([\"rdf:type\", \"a\", \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"]);\n\nexport interface TermStat {\n term: string;\n kind: \"class\" | \"property\";\n /** Explicit ABox uses: instance-of counts for classes, fact counts for properties. */\n uses: number;\n /** TBox axioms mentioning the term (declarations, subClassOf, domain/range, ...). */\n axiomCount: number;\n label?: string;\n}\n\nexport interface OntologyReview {\n classes: TermStat[];\n properties: TermStat[];\n /** Used in data with zero TBox declarations — the \"what to add\" list. */\n undeclared: TermStat[];\n /** Declared but never used in any explicit fact. */\n unused: string[];\n /** Terms without rdfs:label / skos:prefLabel / altLabel. */\n unlabeled: string[];\n /** Properties missing rdfs:domain / rdfs:range axioms. */\n missingDomain: string[];\n missingRange: string[];\n /** Explicit quads vs closure size — how much the ontology explains. */\n explicitQuads: number;\n closureQuads: number;\n}\n\n/** True when the quad is an ontology statement, not a fact. */\nconst isAxiomQuad = (q: Quad, predicatesInUse: Set<string>): boolean =>\n TBOX_PREDICATES.has(q.predicate) ||\n (RDF_TYPE.has(q.predicate) && (predicatesInUse.has(q.subject) || OWL_VOCAB.has(q.object)));\n\nfunction strip(term: string): string {\n const m = term.match(/^\"(.*)\"(\\^\\^<?[\\w:/#.-]+>?|@[\\w-]+)?$/);\n return m ? m[1] : term;\n}\n\n/** Audit the store: inventory + gap list. Pure read — never mutates. */\nexport async function reviewOntology(store: InMemoryGraphStore): Promise<OntologyReview> {\n const closure = await store.match(null, null, null);\n const explicit = closure.filter((q) => q.source !== \"entailment\");\n const predicatesInUse = new Set(explicit.map((q) => q.predicate));\n\n const labels = new Map<string, string>();\n for (const q of closure) {\n if (LABEL_PREDICATES.has(q.predicate)) labels.set(q.subject, strip(q.object));\n }\n\n const classes = new Map<string, TermStat>();\n const properties = new Map<string, TermStat>();\n const class_ = (term: string): TermStat => {\n let s = classes.get(term);\n if (!s) {\n s = { term, kind: \"class\", uses: 0, axiomCount: 0, label: labels.get(term) };\n classes.set(term, s);\n }\n return s;\n };\n const property = (term: string): TermStat => {\n let s = properties.get(term);\n if (!s) {\n s = { term, kind: \"property\", uses: 0, axiomCount: 0, label: labels.get(term) };\n properties.set(term, s);\n }\n return s;\n };\n\n const domains = new Map<string, number>();\n const ranges = new Map<string, number>();\n for (const q of explicit) {\n const axiom = isAxiomQuad(q, predicatesInUse);\n\n // rdf:type: axiom = term declaration (TBox) ; fact = instance typing (ABox).\n if (RDF_TYPE.has(q.predicate)) {\n if (axiom) class_(q.subject).axiomCount += 1;\n else class_(q.object).uses += 1;\n continue;\n }\n\n if (TBOX_PREDICATES.has(q.predicate)) {\n // TBox statements introduce/declare their subject term.\n const subject = q.predicate.includes(\"subClassOf\") ? class_(q.subject) : property(q.subject);\n subject.axiomCount += 1;\n // Their object is a class term (domain/range/subClassOf targets).\n if (!q.predicate.includes(\"inverseOf\")) class_(q.object).axiomCount += 1;\n if (q.predicate.includes(\"domain\")) domains.set(q.subject, (domains.get(q.subject) ?? 0) + 1);\n if (q.predicate.includes(\"range\")) ranges.set(q.subject, (ranges.get(q.subject) ?? 0) + 1);\n continue;\n }\n\n // ABox fact: a property use with actual data behind it.\n property(q.predicate).uses += 1;\n }\n // owl:inverseOf subjects/objects are property terms too (handled below via\n // the property map only when they carry any axiom or use).\n\n const all = [...classes.values(), ...properties.values()];\n const undeclared = all.filter((t) => t.uses > 0 && t.axiomCount === 0);\n const unused = all.filter((t) => t.axiomCount > 0 && t.uses === 0).map((t) => t.term);\n const unlabeled = all.filter((t) => !t.label).map((t) => t.term);\n const missingDomain = [...properties.values()]\n .filter((t) => t.axiomCount > 0 || t.uses > 0) // known terms only; no vocab noise\n .filter((t) => !domains.has(t.term))\n .map((t) => t.term);\n const missingRange = [...properties.values()]\n .filter((t) => t.axiomCount > 0 || t.uses > 0)\n .filter((t) => !ranges.has(t.term))\n .map((t) => t.term);\n\n return {\n classes: [...classes.values()].sort((a, b) => b.uses - a.uses || a.term.localeCompare(b.term)),\n properties: [...properties.values()].sort((a, b) => b.uses - a.uses || a.term.localeCompare(b.term)),\n undeclared: undeclared.sort((a, b) => b.uses - a.uses),\n unused,\n unlabeled,\n missingDomain,\n missingRange,\n explicitQuads: explicit.length,\n closureQuads: closure.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// SHACL induction from instance data\n// ---------------------------------------------------------------------------\n\nexport interface ShapeInductionOptions {\n /** Classes with fewer instances produce no shape. Default 2. */\n minInstances?: number;\n /** Only emit a property shape when >= this fraction of instances have it. Default 0.5. */\n coverage?: number;\n}\n\n/**\n * Propose NodeShapes by observing explicit instance data: for each class,\n * per-property coverage, cardinality, datatypes, node kinds across its\n * instances. PROPOSAL ONLY per docs/07 (shapes are builder-owned).\n */\nexport async function proposeShapes(\n store: InMemoryGraphStore,\n opts: ShapeInductionOptions = {},\n): Promise<NodeShape[]> {\n const minInstances = opts.minInstances ?? 2;\n const coverage = opts.coverage ?? 0.5;\n const explicit = (await store.match(null, null, null)).filter((q) => q.source !== \"entailment\");\n const predicatesInUse = new Set(explicit.map((q) => q.predicate));\n\n // Class -> instance subjects, from EXPLICIT type facts only (closure types\n // would smear subclass properties up into parent shapes).\n const instancesOf = new Map<string, Set<string>>();\n for (const q of explicit) {\n if (!RDF_TYPE.has(q.predicate) || isAxiomQuad(q, predicatesInUse)) continue;\n const set = instancesOf.get(q.object) ?? new Set<string>();\n set.add(q.subject);\n instancesOf.set(q.object, set);\n }\n\n const shapes: NodeShape[] = [];\n for (const [cls, subjects] of instancesOf) {\n if (subjects.size < minInstances) continue;\n // Per-property observation across this class's instances.\n const observed = new Map<\n string,\n { present: number; maxSeen: number; datatypes: Set<string>; nodeKinds: Set<\"iri\" | \"literal\"> }\n >();\n const bySubject = new Map<string, Quad[]>();\n for (const q of explicit) {\n if (!subjects.has(q.subject)) continue;\n bySubject.set(q.subject, [...(bySubject.get(q.subject) ?? []), q]);\n }\n for (const [, quads] of bySubject) {\n const byPath = new Map<string, Quad[]>();\n for (const q of quads) {\n if (RDF_TYPE.has(q.predicate)) continue;\n byPath.set(q.predicate, [...(byPath.get(q.predicate) ?? []), q]);\n }\n for (const [path, pathQuads] of byPath) {\n const o = observed.get(path) ?? { present: 0, maxSeen: 0, datatypes: new Set<string>(), nodeKinds: new Set<\"iri\" | \"literal\">() };\n o.present += 1;\n o.maxSeen = Math.max(o.maxSeen, pathQuads.length);\n for (const q of pathQuads) {\n o.nodeKinds.add(isLiteralTerm(q.object) ? \"literal\" : \"iri\");\n const dt = datatypeOf(q.object);\n if (dt) o.datatypes.add(dt);\n }\n observed.set(path, o);\n }\n }\n const properties: NodeShape[\"properties\"] = [];\n for (const [path, o] of observed) {\n if (o.present / subjects.size < coverage) continue;\n const shape: NodeShape[\"properties\"][number] = { path };\n if (o.present === subjects.size) shape.minCount = 1;\n if (o.maxSeen === 1) shape.maxCount = 1;\n if (o.datatypes.size === 1) shape.datatype = [...o.datatypes][0];\n if (o.nodeKinds.size === 1) shape.nodeKind = [...o.nodeKinds][0];\n properties.push(shape);\n }\n if (properties.length) shapes.push({ targetClass: cls, properties });\n }\n return shapes;\n}\n\nfunction isLiteralTerm(term: string): boolean {\n if (term.startsWith('\"')) return true;\n if (/^(-?\\d+(\\.\\d+)?|true|false)$/.test(term)) return true;\n if (term.startsWith(\"<\") || /^[a-zA-Z][\\w-]*:/.test(term)) return false;\n return true;\n}\n\nfunction datatypeOf(term: string): string | undefined {\n const m = term.match(/\\^\\^<?([\\w:/#.-]+)>?$/);\n if (m) return m[1];\n if (/^\".*\"@[\\w-]+$/.test(term)) return \"rdf:langString\";\n if (/^\".*\"$/.test(term)) return \"xsd:string\";\n if (/^-?\\d+$/.test(term)) return \"xsd:integer\";\n if (/^-?\\d*\\.\\d+$/.test(term)) return \"xsd:decimal\";\n if (/^(true|false)$/.test(term)) return \"xsd:boolean\";\n return undefined;\n}\n\n/**\n * Adopt proposed shapes: each shape is validated against the CURRENT closure\n * in isolation — a shape the existing data already violates is rejected with\n * its violations (1:1 mapping, no guesswork), the clean ones are registered.\n * Versioned adoption: migrateTBox({ shapes }) instead.\n */\nexport async function adoptShapes(\n store: InMemoryGraphStore,\n shapes: NodeShape[],\n): Promise<{ adopted: NodeShape[]; rejected: { shape: NodeShape; violations: string[] }[] }> {\n const closure = await store.match(null, null, null);\n const adopted: NodeShape[] = [];\n const rejected: { shape: NodeShape; violations: string[] }[] = [];\n for (const shape of shapes) {\n // Validate with ONLY this shape: violations map to it unambiguously.\n const violations = new InMemoryGraphStore({ shapes: [shape] }).checkShapes(closure).violations;\n if (violations.length) rejected.push({ shape, violations: violations.map((v) => v.message) });\n else adopted.push(shape);\n }\n if (adopted.length) store.addShapes(...adopted);\n return { adopted, rejected };\n}\n\n/** review_ontology agent tool: inventory + gaps, straight from the store. */\nexport function reviewOntologyTool(store: InMemoryGraphStore) {\n return defineTool({\n name: \"review_ontology\",\n description:\n \"Audit the knowledge graph's ontology: classes/properties with usage counts, used-but-undeclared terms, unlabeled/unused terms, properties missing domain or range. Read-only.\",\n schema: z.object({}),\n execute: async () => reviewOntology(store),\n });\n}\n\n/** propose_shapes agent tool: SHACL candidates induced from instance data. */\nexport function proposeShapesTool(store: InMemoryGraphStore, opts: ShapeInductionOptions = {}) {\n return defineTool({\n name: \"propose_shapes\",\n description:\n \"Induce candidate SHACL shapes from existing instance data (>= 2 instances per class, >= 50% property coverage). PROPOSAL: adoption is the builder's call via adoptShapes(), never automatic.\",\n schema: z.object({}),\n execute: async () => proposeShapes(store, opts),\n });\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,SAAS,MAAM,eAAe;AACvC,SAAS,cAAc;AACvB,SAAS,SAAS;AAKlB,SAAS,UAAgB;AACvB,MAAI,QAAQ,IAAI,oBAAoB;AAClC,WAAO,EAAE,MAAM,QAAQ,IAAI,mBAAmB,CAAC;AAC/C;AAAA,EACF;AACA,SAAO;AACP,MAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,QAAQ,GAAG;AACjB,UAAM,YAAY,KAAK,KAAK,MAAM;AAClC,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO,EAAE,MAAM,UAAU,CAAC;AAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEA,QAAQ;AAER,IAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACvC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,6BAA6B;AAAA;AAAA,EAEnE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,iBAAiB;AAAA,EACpD,iBAAiB,EAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,EAC/D,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACrC,cAAc,EAAE,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9C,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACxC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,EAClE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,mBAAmB;AAAA,EACvD,iBAAiB,EAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,EAC/D,cAAc,EAAE,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1C,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE;AAClC,CAAC;AAOD,IAAI;AAEG,SAAS,WAAW,MAAyB,QAAQ,KAAsB;AAChF,MAAI,OAAQ,QAAO;AACnB,QAAM,SAAS,aAAa,MAAM;AAAA,IAChC,kBAAkB,IAAI,oBAAoB;AAAA,IAC1C,mBAAmB,IAAI;AAAA,IACvB,gBAAgB,IAAI;AAAA,IACpB,iBAAiB,IAAI;AAAA,IACrB,gBAAgB,IAAI,kBAAkB;AAAA,IACtC,cAAc,IAAI;AAAA,IAClB,mBAAmB,IAAI,qBAAqB;AAAA,IAC5C,oBAAoB,IAAI;AAAA,IACxB,iBAAiB,IAAI;AAAA,IACrB,iBAAiB,IAAI;AAAA,IACrB,cAAc,IAAI;AAAA,IAClB,WAAW,IAAI,aAAa;AAAA,EAC9B,CAAC;AACD,QAAM,cAAc,OAAO,iBAAiB,SAAS;AACrD,QAAM,QAAQ,cAAc,OAAO,iBAAiB,OAAO;AAC3D,WAAS;AAAA,IACP,GAAG;AAAA,IACH,QAAQ,cACJ,EAAE,SAAS,OAAO,mBAAmB,QAAQ,OAAO,kBAAkB,OAAO,QAAQ,WAAW,IAChG,EAAE,SAAS,OAAO,iBAAiB,QAAQ,OAAO,gBAAgB,OAAO,QAAQ,SAAS;AAAA,EAChG;AACA,SAAO;AACT;AAGO,SAAS,gBAAsB;AACpC,WAAS;AACX;;;AChFA,SAAS,OAAO,MAAM,UAAU,MAAM,QAAQ,iBAAiB;AAC/D,SAAS,QAAAA,aAAY;AA4BrB,eAAsB,aAAgB,UAAkB,IAAsB,OAA6B,CAAC,GAAe;AACzH,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,MAAMC,MAAK,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,aAAS;AACP,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AACxC,YAAM,OAAO,MAAM;AACnB;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,OAAQ,IAA8B;AAC5C,UAAI,SAAS,SAAU,OAAM;AAC7B,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,YAAI,KAAK,IAAI,IAAI,KAAK,UAAU,SAAS;AACvC,gBAAM,IAAI,MAAM,cAAc,QAAQ,EAAE;AAAA,QAC1C;AAAA,MACF,SAAS,SAAS;AAChB,YAAK,QAAkC,SAAS,SAAU,OAAM;AAAA,MAClE;AACA,UAAI;AACF,cAAM,OAAO,QAAQ;AAAA,MACvB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,QAAI;AACF,YAAM,OAAO,QAAQ;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAGO,IAAM,mBAAN,MAA+C;AAAA,EACpD,YAAoB,MAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA;AAAA,EAGZ,UAAU,UAA0B;AAC1C,QAAI,aAAa,MAAM,aAAa,OAAO,aAAa,QAAQ,SAAS,SAAS,GAAG,GAAG;AACtF,YAAM,IAAI,WAAW,qBAAqB,qBAAqB,KAAK,UAAU,QAAQ,CAAC,IAAI,KAAK;AAAA,IAClG;AACA,WAAOA,MAAK,KAAK,MAAM,WAAW,QAAQ;AAAA,EAC5C;AAAA,EAEQ,KAAK,UAA0B;AACrC,WAAOA,MAAK,KAAK,UAAU,QAAQ,GAAG,iBAAiB;AAAA,EACzD;AAAA,EAEQ,KAAK,UAA0B;AACrC,WAAOA,MAAK,KAAK,UAAU,QAAQ,GAAG,OAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAK,UAAkB,YAA2E;AACtG,UAAM,SAA2B,EAAE,UAAU,UAAS,oBAAI,KAAK,GAAE,YAAY,GAAG,GAAG,WAAW;AAC9F,UAAM,aAAa,KAAK,KAAK,QAAQ,GAAG,YAAY;AAClD,YAAM,MAAMA,MAAK,KAAK,KAAK,QAAQ,GAAG,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,YAAM,UAAU,KAAK,KAAK,QAAQ,GAAG,KAAK,UAAU,MAAM,GAAG,MAAM;AAAA,IACrE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,UAAyD;AAClE,WAAO,aAAa,KAAK,KAAK,QAAQ,GAAG,YAAY;AACnD,UAAI;AACF,eAAO,KAAK,MAAM,MAAM,SAAS,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC;AAAA,MAC/D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,UAAM,aAAa,KAAK,KAAK,QAAQ,GAAG,YAAY;AAClD,UAAI;AACF,cAAM,OAAO,KAAK,KAAK,QAAQ,CAAC;AAAA,MAClC,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACjHA,SAAS,KAAAC,UAAS;AAuDlB,IAAM,eAAe;AAErB,SAAS,cAAc,IAAY,SAAiB,SAA+C;AACjG,QAAM,MAAM,IAAI,WAAW,iBAAiB,cAAc,EAAE,IAAI,KAAK;AACrE,EAAC,IAA8C,UAAU,EAAE,IAAI,SAAS,QAAQ;AAChF,SAAO;AACT;AAEO,SAAS,kBAAkB,KAAyC;AACzE,MAAI,eAAe,cAAc,IAAI,SAAS,iBAAiB;AAC7D,WAAQ,IAA+C;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAAsB,WAA6C;AACvF,MAAI,CAAC,UAAU,CAAC,UAAW,QAAO;AAClC,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI,QAAQ;AACV,QAAI,OAAO,QAAS,YAAW,MAAM;AAAA,QAChC,QAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EAChF;AACA,MAAI,WAAW;AACb,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC5D,eAAW,OAAO,iBAAiB,SAAS,MAAM,aAAa,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EACvF;AACA,SAAO,WAAW;AACpB;AAEO,IAAM,QAAN,MAAY;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAoB;AAC9B,QAAI,CAAC,KAAK,OAAO,OAAQ,OAAM,IAAI,WAAW,eAAe,kCAAkC,KAAK;AACpG,SAAK,SAAS,KAAK;AACnB,SAAK,aACH,OAAO,KAAK,eAAe,WACtB,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,UAAU,MAClD,MAAM;AAAE,YAAM,IAAI,WAAW,uBAAuB,wBAAwB,KAAK,UAAU,IAAI,KAAK;AAAA,IAAG,GAAG,IAC1G,KAAK,cAAc,KAAK,OAAO,CAAC;AACvC,SAAK,cAAc,KAAK,eAAe;AACvC,SAAK,gBAAgB,KAAK,iBAAiB;AAC3C,SAAK,qBAAqB,KAAK;AAC/B,SAAK,gBAAgB,KAAK;AAC1B,SAAK,aAAa,KAAK,uBAAuB;AAI9C,SAAK,kBAAkB,KAAK,oBAAoB,KAAK,aAAa,IAAI,IAAI;AAAA,EAC5E;AAAA,EAEQ,OAAO,QAAyB;AACtC,WAAO,KAAK,OACT,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,GAAG,EAAE,cAAc,KAAK,EAAE,WAAW,KAAK,EAAE,EAAE,EACpE,KAAK,IAAI;AAAA,EACd;AAAA,EAEQ,WAAW,MAAc,SAAmB,QAAiD,SAAiB,SAAyB;AAC7I,UAAM,YAAY,OAAO,QAAQ,MAAM,EACpC,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,UAAK,KAAK,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,EAC9D,KAAK,IAAI;AACZ,WAAO;AAAA,MACL,kBAAkB,IAAI;AAAA,MACtB,UAAU,oBAAoB,OAAO,KAAK;AAAA,MAC1C,QAAQ,SAAS,kBAAkB,QAAQ,KAAK,UAAK,CAAC,KAAK;AAAA,MAC3D,YAAY;AAAA,EAAsB,SAAS,KAAK;AAAA,MAChD;AAAA,EAA6B,KAAK,OAAO,OAAO,CAAC;AAAA,MACjD,oCAAoC,YAAY;AAAA,IAClD,EACG,OAAO,OAAO,EACd,KAAK,MAAM;AAAA,EAChB;AAAA,EAEQ,kBAAkB,OAAc,QAAwD;AAC9F,UAAM,UAAU,WAAW;AAAA,MACzB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQC,GAAE,OAAO,EAAE,IAAIA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAOA,GAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;AAAA,MACnG,SAAS,OAAO,EAAE,IAAI,SAAS,QAAQ,MAA0E;AAC/G,YAAI,CAAC,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG;AAC3C,iBAAO,yBAAyB,EAAE,iBAAiB,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,QAC9F;AACA,YAAI,WAAW,OAAO,KAAK,OAAO,EAAE,OAAQ,QAAO,MAAM,IAAI,IAAI,EAAE,GAAI,OAAO,MAAM,IAAI,KAAK,CAAC,GAAI,GAAG,QAAQ;AAC7G,cAAM,cAAc,IAAI,SAAS,OAAO;AAAA,MAC1C;AAAA,IACF,CAAC;AAID,WAAO,MAAM,UAAU,OAAO;AAAA,EAChC;AAAA,EAEA,MAAM,IAAI,MAA+B,MAA6E;AACpH,UAAM,SAAS,KAAK,OAAO,MAAM,IAAI;AACrC,eAAS;AACP,YAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,UAAI,KAAK,KAAM,QAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,OAAO,OACL,MACA,MAC+C;AAC/C,UAAM,WAAW,OAAO,SAAS,WAAW,OAAO,KAAK,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,EAAE,OAAO,IAAI,EAAE,IAAI,GAAI,EAAE,KAAK,IAAI;AAC1H,UAAM,kBAAkB,MAAM,eAAe,CAAC;AAC9C,UAAM,aAAa,aAAa,MAAM,QAAQ,KAAK,kBAAkB;AACrE,UAAM,SAAkD,CAAC;AACzD,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAuC,CAAC;AAC9C,UAAM,QAAoB,EAAE,aAAa,GAAG,cAAc,EAAE;AAC5D,UAAM,eAAyB,CAAC;AAChC,QAAI,UAAU,KAAK;AACnB,QAAI,UAAU;AACd,QAAI,aAAa;AACjB,QAAI,WAAW;AACf,QAAI,YAAY;AAEhB,UAAM,OAAO,CAAC,UACZ,KAAK,OAAO,UAAU,OAAO,SAAS,SAAS,OAAO,QAAQ,YAAY,QAAQ;AAEpF,eAAS;AACP,oBAAc;AACd,UAAI,aAAa,KAAK,eAAe;AACnC,eAAO,KAAK,2BAA2B,KAAK,aAAa,GAAG;AAAA,MAC9D;AACA,YAAM,EAAE,MAAM,cAAc,OAAO,QAAQ,KAAK;AAChD,YAAM,SAAS,KAAK,kBAAkB,SAAS,MAAM;AACrD,YAAM,aAAa,aAAa,YAAY,KAAK,aAAa;AAC9D,UAAI;AACJ,UAAI;AACF,cAAM,MAAM,OAAO,OAAO,KAAK,WAAW,UAAU,SAAS,QAAQ,SAAS,QAAQ,IAAI,GAAG;AAAA,UAC3F,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AACD,mBAAS;AACP,gBAAM,OAAO,MAAM,cAAc,MAAM,IAAI,KAAK,GAAG,EAAE,QAAQ,WAAW,CAAC;AACzE,cAAI,KAAK,MAAM;AACb,qBAAS,KAAK;AACd;AAAA,UACF;AACA,gBAAM,EAAE,MAAM,eAAe,OAAO,QAAQ,MAAM,OAAO,KAAK,MAAM;AAAA,QACtE;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,UAAU,kBAAkB,GAAG;AACrC,YAAI,CAAC,SAAS;AACZ,gBAAM,cAAc,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACnE,iBAAO,KAAK,SAAS,QAAQ,IAAI,YAAY,WAAW,EAAE;AAAA,QAC5D;AACA,oBAAY;AACZ,YAAI,WAAW,KAAK,aAAa;AAC/B,iBAAO,KAAK,yBAAyB,KAAK,WAAW,GAAG;AAAA,QAC1D;AACA,qBAAa,KAAK,QAAQ,MAAM,QAAQ,EAAE;AAC1C,cAAM,EAAE,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,QAAQ,GAAG;AAC5D,cAAM,OAAO,KAAK,WAAW,YAAY;AACzC,YAAI,MAAM;AACR,iBAAO,KAAK,IAAI;AAAA,QAClB;AACA,cAAM,OAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE;AAC1D,YAAI,CAAC,MAAM;AACT,iBAAO,KAAK,6BAA6B,QAAQ,EAAE,EAAE;AAAA,QACvD;AACA,gBAAQ,KAAK,QAAQ,IAAI;AACzB,kBAAU,QAAQ;AAClB,kBAAU;AACV;AAAA,MACF;AAEA,UAAI,CAAC,OAAQ,QAAO,KAAK,SAAS,QAAQ,IAAI,qBAAqB;AACnE,cAAQ,KAAK,QAAQ,IAAI;AACzB,cAAQ,QAAQ,IAAI,IAAI;AACxB,YAAM,eAAe,OAAO,MAAM;AAClC,YAAM,gBAAgB,OAAO,MAAM;AACnC,YAAM,mBAAmB,MAAM,mBAAmB,MAAM,OAAO,MAAM,mBAAmB;AACxF,kBAAY,OAAO;AACnB,YAAM,EAAE,MAAM,aAAa,OAAO,QAAQ,KAAK;AAC/C,YAAM,OAAO,KAAK,OAAO,aAAa,IAAI,SAAS,SAAS,OAAO,QAAQ,YAAY,UAAU,SAAS;AAC1G,YAAM,EAAE,MAAM,UAAU,QAAQ,KAAK;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,WAAW,OAAqC;AACtD,QAAI,KAAK,cAAc,KAAK,KAAK,mBAAmB,EAAG,QAAO;AAC9D,UAAM,SAAS,MAAM,MAAM,CAAC,KAAK,UAAU;AAC3C,QAAI,OAAO,SAAS,KAAK,WAAY,QAAO;AAC5C,QAAI,IAAI,IAAI,MAAM,EAAE,OAAO,KAAK,iBAAiB;AAC/C,aAAO,gCAAgC,OAAO,KAAK,UAAK,CAAC,iBAAiB,KAAK,eAAe,8BAA8B,KAAK,UAAU;AAAA,IAC7I;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OACN,QACA,OACA,SACA,SACA,OACA,QACA,YACA,UACA,OAAO,IACM;AACb,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa,CAAC,GAAG,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC3B;AAAA,EACF;AACF;;;ACvRA,SAAS,oBAA4E;AACrF,SAAS,KAAAC,UAAS;AAyBlB,SAAS,YAAY,OAAwB;AAC3C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,SAAO,MACJ,IAAI,CAAC,MAAM;AACV,QAAI,OAAO,MAAM,SAAU,QAAO;AAClC,QAAI,KAAK,OAAO,MAAM,UAAU;AAC9B,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,gBAAgB,QAAyB;AAChD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,IAAI;AACV,UAAM,MAAM,EAAE;AACd,QAAI,KAAK,MAAO,QAAO,YAAY,IAAI,KAAK;AAC5C,QAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AACzC,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B;AACA,SAAO,OAAO,UAAU,EAAE;AAC5B;AAGO,IAAM,YAAN,MAAgB;AAAA,EAIrB,YACW,UACT,OAAyB,CAAC,GAC1B;AAFS;AAGT,SAAK,WAAW,SAAS,QAAQ,OAAO,EAAE;AAC1C,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,YAAY,KAAK,aAAa;AAAA,EACrC;AAAA,EANW;AAAA,EAJH;AAAA,EACA;AAAA,EAWR,MAAM,UAA8B;AAClC,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,QAAQ,gCAAgC;AAAA,QACvE,SAAS,EAAE,QAAQ,mBAAmB;AAAA,QACtC,QAAQ,YAAY,QAAQ,KAAK,SAAS;AAAA,MAC5C,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,iBAAiB,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,IAAI;AAAA,IAC5H;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,WAAW,YAAY,iCAAiC,IAAI,MAAM,IAAI,IAAI,UAAU,GAAG;AAC9G,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,CAAC,MAAM,KAAM,OAAM,IAAI,WAAW,YAAY,qCAAqC,KAAK;AAC5F,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,MAAc,WAAmE;AAC1F,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,QAAQ,KAAK,UAAU;AAAA,QACtC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,QAC1E,MAAM,KAAK,UAAU;AAAA,UACnB,SAAS;AAAA,UACT,IAAI,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,UAClC,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,SAAS,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,YACzD,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,QACD,QAAQ,YAAY,QAAQ,KAAK,SAAS;AAAA,MAC5C,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,iBAAiB,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,IAAI;AAAA,IACpH;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,WAAW,iBAAiB,YAAY,IAAI,MAAM,IAAI,IAAI,UAAU,GAAG;AAC9F,UAAM,MAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,IAAI,MAAO,OAAM,IAAI,WAAW,aAAa,uBAAuB,IAAI,MAAM,OAAO,IAAI,KAAK;AAElG,UAAM,kBACJ,IAAI,UAAU,OAAO,IAAI,WAAW,WAAY,IAAI,OAAkC,YAAY;AACpG,WAAO,EAAE,MAAM,gBAAgB,IAAI,MAAM,GAAG,WAAW,mBAAmB,UAAU;AAAA,EACtF;AACF;AAGO,SAAS,UAAU,QAAmB,OAAgD,CAAC,GAAS;AACrG,SAAO,WAAW;AAAA,IAChB,MAAM,KAAK,QAAQ;AAAA,IACnB,aAAa,KAAK,eAAe,uBAAuB,OAAO,QAAQ;AAAA,IACvE,QAAQC,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,IACxE,SAAS,OAAO,EAAE,OAAO,UAAU,OAChC,MAAM,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,EAC1C,CAAC;AACH;AAuBO,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAoB,MAAwB;AAAxB;AAClB,SAAK,cAAc,KAAK,IAAI,GAAG,KAAK,eAAe,GAAI;AAAA,EACzD;AAAA,EAFoB;AAAA,EAJZ;AAAA,EACA,WAAW,oBAAI,IAAmB;AAAA,EAClC;AAAA,EAMA,YAAY,QAAoD;AACtE,UAAM,UAAU,KAAK,KAAK,eAAe,CAAC;AAC1C,QAAI,CAAC,QAAQ,UAAU,CAAC,OAAQ,QAAO,CAAC;AACxC,QAAI,CAAC,QAAQ,SAAS,GAAG,KAAK,CAAC,QAAQ,SAAS,MAAM,EAAG,QAAO,CAAC;AACjE,WAAO;AAAA,MACL,+BAA+B,QAAQ,SAAS,GAAG,IAAI,MAAM;AAAA,MAC7D,gCAAgC;AAAA,MAChC,gCAAgC;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,QAAQ,WAAuE;AACrF,WAAO,KAAK,KAAK,eAAe,EAAE,cAAc,KAAK,KAAK,cAAc,UAAU,UAAU,IAAI,CAAC;AAAA,EACnG;AAAA,EAEA,MAAc,SAAS,WAAmC;AACxD,UAAM,WAAW,KAAK,SAAS,IAAI,SAAS;AAC5C,QAAI,UAAU;AACZ,WAAK,SAAS,OAAO,SAAS;AAC9B,WAAK,SAAS,IAAI,WAAW,QAAQ;AACrC,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,MAAM,KAAK,KAAK,aAAa,SAAS;AACpD,SAAK,SAAS,IAAI,WAAW,KAAK;AAClC,WAAO,KAAK,SAAS,OAAO,KAAK,aAAa;AAC5C,YAAM,SAAS,KAAK,SAAS,KAAK,EAAE,KAAK,EAAE;AAC3C,UAAI,WAAW,OAAW;AAC1B,WAAK,SAAS,OAAO,MAAM;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,SAAS,KAAuC;AACtD,UAAM,MAAM,KAAK,KAAK,gBAAgB,KAAK,OAAO;AAClD,WAAO,IAAI,QAAgB,CAACC,UAAS,WAAW;AAC9C,UAAI,OAAO;AACX,UAAI,GAAG,QAAQ,CAAC,MAAM;AACpB,gBAAQ;AACR,YAAI,KAAK,SAAS,KAAK;AACrB,cAAI,QAAQ;AACZ,iBAAO,IAAI,WAAW,sBAAsB,wBAAwB,GAAG,UAAU,KAAK,CAAC;AAAA,QACzF;AAAA,MACF,CAAC;AACD,UAAI,GAAG,OAAO,MAAMA,SAAQ,IAAI,CAAC;AACjC,UAAI,GAAG,SAAS,MAAM;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,OAAO,KAAsB,KAAoC;AAC7E,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ,MAAM;AAChD,UAAM,OAAO,CAAC,MAAc,SAAwB;AAClD,UAAI,UAAU,MAAM,EAAE,gBAAgB,oBAAoB,GAAG,KAAK,CAAC;AACnE,UAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,IAC9B;AACA,QAAI;AACF,UAAI,IAAI,WAAW,WAAW;AAC5B,YAAI,UAAU,KAAK,EAAE,GAAG,KAAK,CAAC;AAC9B,YAAI,IAAI;AACR;AAAA,MACF;AACA,UAAI,IAAI,WAAW,UAAU,IAAI,QAAQ,SAAS,IAAI,QAAQ,YAAY;AACxE,aAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AACtB;AAAA,MACF;AACA,UAAI,IAAI,WAAW,SAAS,IAAI,QAAQ,gCAAgC;AACtE,aAAK,KAAK,KAAK,KAAK,IAAI;AACxB;AAAA,MACF;AACA,UAAI,IAAI,WAAW,WAAW,IAAI,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAChE,cAAM,MAAM,KAAK,MAAM,MAAM,KAAK,SAAS,GAAG,CAAC;AAK/C,YAAI,IAAI,WAAW,gBAAgB;AACjC,eAAK,KAAK,EAAE,SAAS,OAAO,IAAI,IAAI,IAAI,OAAO,EAAE,MAAM,QAAQ,SAAS,mBAAmB,IAAI,MAAM,GAAG,EAAE,CAAC;AAC3G;AAAA,QACF;AACA,cAAM,YAAY,IAAI,QAAQ,aAAa,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AACzE,cAAM,OAAO,YAAY,IAAI,QAAQ,SAAS,KAAK;AACnD,cAAM,SAAS,OAAO,MAAM,KAAK,SAAS,SAAS,GAAG,IAAI,MAAM,KAAK,QAAQ,SAAS,CAAC;AACvF,aAAK,KAAK;AAAA,UACR,SAAS;AAAA,UACT,IAAI,IAAI;AAAA,UACR,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,EAAE,GAAG,UAAU;AAAA,QAChG,CAAC;AACD;AAAA,MACF;AACA,UAAI,IAAI,WAAW,UAAU,IAAI,QAAQ,WAAW;AAClD,cAAM,MAAM,KAAK,MAAM,MAAM,KAAK,SAAS,GAAG,CAAC;AAI/C,cAAM,YAAY,IAAI,QAAQ,aAAa,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AACzE,cAAM,OAAO,YAAY,IAAI,QAAQ,SAAS,KAAK;AACnD,YAAI,UAAU,KAAK,EAAE,gBAAgB,qBAAqB,iBAAiB,YAAY,YAAY,aAAa,CAAC;AACjH,cAAM,QAAQ,CAAC,YAA2B;AACxC,cAAI,MAAM,SAAS,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA,CAAM;AAAA,QAClD;AAGA,cAAM,aAAa,IAAI,gBAAgB;AACvC,YAAI,GAAG,SAAS,MAAM;AACpB,cAAI,CAAC,IAAI,cAAe,YAAW,MAAM;AAAA,QAC3C,CAAC;AACD,YAAI;AACF,gBAAM,OAAO,MAAM,KAAK,SAAS,SAAS,GAAG,OAAO,MAAM;AAAA,YACxD,QAAQ,WAAW;AAAA,YACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,UAC3B,CAAC;AACD,qBAAS;AACP,kBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,gBAAI,KAAK,MAAM;AACb,oBAAM,EAAE,WAAW,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,CAAC;AACtD;AAAA,YACF;AACA,kBAAM,EAAE,WAAW,OAAO,KAAK,MAAM,CAAC;AAAA,UACxC;AAAA,QACF,SAAS,KAAK;AACZ,gBAAM,EAAE,WAAW,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QAC9E;AACA,cAAM,QAAQ;AACd,YAAI,IAAI;AACR;AAAA,MACF;AACA,WAAK,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAI,IAAI,aAAa;AAEnB,YAAI;AACF,cAAI,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA;AAAA,CAAM;AAC3D,cAAI,MAAM,kBAAkB;AAC5B,cAAI,IAAI;AAAA,QACV,QAAQ;AAAA,QAER;AACA;AAAA,MACF;AACA;AAAA,QACE,eAAe,cAAc,IAAI,SAAS,uBAAuB,MAAM;AAAA,QACvE,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAe,MAAgC;AACzD,UAAM,aAAa,QAAQ,KAAK,KAAK,QAAQ;AAC7C,UAAM,aAAa,QAAQ,KAAK,KAAK,QAAQ;AAC7C,SAAK,SAAS,aAAa,CAAC,KAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,GAAG,CAAC;AACnE,UAAM,IAAI,QAAc,CAACA,aAAY,KAAK,QAAQ,OAAO,YAAY,YAAY,MAAMA,SAAQ,CAAC,CAAC;AACjG,WAAQ,KAAK,OAAO,QAAQ,EAAuB;AAAA,EACrD;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,IAAI;AAAA,MAAc,CAACA,UAAS,WAChC,KAAK,SAAS,KAAK,OAAO,MAAM,CAAC,MAAO,IAAI,OAAO,CAAC,IAAIA,SAAQ,CAAE,IAAIA,SAAQ;AAAA,IAChF;AACA,SAAK,SAAS;AACd,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;;;AC3SO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EACC;AAAA,EAET,YAAY,UAAkB,OAA2B,CAAC,GAAG;AAC3D,SAAK,WAAW,SAAS,QAAQ,OAAO,EAAE;AAC1C,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,MAAM,IAAI,UAAU,KAAK,UAAU,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO;AACX,WAAO,KAAK,IAAI,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,KAAK,MAAc,WAAmE;AAC1F,WAAO,KAAK,IAAI,KAAK,MAAM,SAAS;AAAA,EACtC;AAAA;AAAA,EAGA,OAAO,OACL,MACA,WACA,QACA,OAAoD,CAAC,GACxB;AAC7B,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,QAAQ,WAAW;AAAA,QAClD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,oBAAoB;AAAA;AAAA,QAE3E,MAAM,KAAK,UAAU;AAAA,UACnB,SAAS;AAAA,UACT,IAAI,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,UAClC,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,SAAS,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,YACzD,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,QACD,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC7B,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,iBAAiB,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,IAAI;AAAA,IAClH;AACA,QAAI,CAAC,IAAI,MAAM,CAAC,IAAI,KAAM,OAAM,IAAI,WAAW,iBAAiB,eAAe,IAAI,MAAM,IAAI,IAAI,UAAU,GAAG;AAC9G,UAAM,SAAS,IAAI,KAAK,UAAU;AAClC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AACb,UAAM,QAAQ,WAAW,OAAuC;AAC9D,gBAAU;AACV,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AACxB,iBAAW,QAAQ,OAAO;AACxB,cAAM,IAAI,KAAK,KAAK;AACpB,YAAI,CAAC,EAAE,WAAW,OAAO,EAAG;AAC5B,cAAM,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK;AAChC,YAAI,YAAY,SAAU;AAC1B,YAAI;AACJ,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B,QAAQ;AACN;AAAA,QACF;AACA,YAAI,IAAI,UAAW,MAAK,YAAY,IAAI,SAAS;AACjD,YAAI,IAAI,MAAO,OAAM,IAAI,WAAW,aAAa,IAAI,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,OAAO,IAAI,MAAM,SAAS,SAAU,OAAM,IAAI;AAAA,MACjE;AAAA,IACF;AACA,QAAI;AACF,iBAAS;AACP,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AACV,eAAO,MAAM,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,MACtD;AACA,aAAO,MAAM,QAAQ,OAAO,CAAC;AAAA,IAC/B,UAAE;AAGA,YAAM,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACtC;AAAA,EACF;AACF;AAcA,eAAsB,iBAAiB,KAAc,QAAwC;AAC3F,QAAM,EAAE,MAAM,UAAU,IAAK,MAAM,IAAI,KAAK;AAC5C,MAAI,kBAAkB;AACtB,QAAM,SAAS,IAAI,eAAe;AAAA,IAChC,MAAM,MAAM,YAAY;AACtB,YAAM,OAAO,CAAC,YAA2B;AACvC,mBAAW,QAAQ,IAAI,YAAY,EAAE,OAAO,SAAS,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA,CAAM,CAAC;AAAA,MACrF;AACA,UAAI;AACF,yBAAiB,SAAS,OAAO,OAAO,MAAM,WAAW,IAAI,QAAQ;AAAA,UACnE,WAAW,CAAC,OAAQ,kBAAkB;AAAA,QACxC,CAAC,GAAG;AACF,eAAK,EAAE,WAAW,iBAAiB,MAAM,CAAC;AAAA,QAC5C;AACA,aAAK,EAAE,WAAW,gBAAgB,CAAC;AACnC,aAAK,QAAQ;AAAA,MACf,SAAS,KAAK;AACZ,aAAK,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,MAClE,UAAE;AACA,YAAI;AACF,qBAAW,MAAM;AAAA,QACnB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO,IAAI,SAAS,QAAQ,EAAE,SAAS,EAAE,gBAAgB,qBAAqB,iBAAiB,WAAW,EAAE,CAAC;AAC/G;;;AC7IA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AACjC,SAAS,UAAU,oBAAoB;AACvC,SAAS,KAAAC,UAAS;;;ACQlB,IAAM,0BAAoC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,eAAe,SAA0B;AACvD,SAAO,wBAAwB,KAAK,CAAC,OAAO,GAAG,KAAK,OAAO,CAAC;AAC9D;AAGO,SAAS,gBAAgB,SAAiB,aAA4B;AAC3E,MAAI,eAAe,CAAC,eAAe,OAAO,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR;AAAA,MACA,UAAU,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;;;ACJA,SAAS,YAAY,OAGE;AACrB,SAAO,MAAM,oBAAoB,MAAM,2BAA2B;AACpE;AAGA,SAAS,WAAW,GAAyF;AAC3G,QAAM,QAAQ,EAAE,aAAa,EAAE;AAC/B,SAAO,QAAQ,QAAQ;AACzB;AAEA,SAAS,WAAW,MAAmC;AACrD,MAAI,SAAS,OAAQ,QAAO;AAC5B,SAAO;AACT;AAEA,SAAS,cAAc,GAAyB;AAC9C,MAAI,OAAO,EAAE,YAAY,YAAY,CAAC,UAAU,EAAE,OAAO,EAAG,QAAO,EAAE;AACrE,QAAM,OAAO,WAAW,EAAE,OAAO;AACjC,QAAM,OAAO,SAAS,EAAE,OAAO;AAC/B,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,SAAO;AAAA,IACL,GAAI,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,IACvC,GAAG,KAAK,IAAI,CAAC,SAAS;AAAA,MACpB,MAAM;AAAA,MACN,WAAW,EAAE,KAAK,IAAI,OAAO,QAAQ,IAAI,YAAY,YAAY,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,IACnG,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,cAAc,GAAyC;AAC9D,QAAM,OAAgC,EAAE,MAAM,WAAW,EAAE,IAAI,GAAG,SAAS,cAAc,CAAC,EAAE;AAC5F,MAAI,EAAE,WAAY,MAAK,eAAe,EAAE;AACxC,MAAI,OAAO,EAAE,YAAY,UAAU;AACjC,UAAM,QAAQ,EAAE,QAAQ;AAAA,MACtB,CAAC,MAAyD,EAAE,SAAS;AAAA,IACvE;AACA,QAAI,MAAM,QAAQ;AAChB,WAAK,aAAa,MAAM,IAAI,CAAC,OAAO;AAAA,QAClC,IAAI,EAAE;AAAA,QACN,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE;AAAA,MACpE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAQO,IAAM,2BAAN,MAAwD;AAAA,EACpD;AAAA,EACA,eAAe,EAAE,kBAAkB,MAAM,WAAW,KAAK;AAAA,EAC1D;AAAA,EAER,YAAY,MAA+B;AACzC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,uFAAuF;AACzH,SAAK,OAAO,EAAE,aAAa,KAAK,GAAG,KAAK;AACxC,SAAK,KAAK,qBAAqB,KAAK,KAAK;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAS,SAAoD;AACjE,UAAM,EAAE,UAAU,OAAO,SAAS,QAAQ,OAAO,aAAa,WAAW,OAAO,IAAI,KAAK;AACzF,UAAM,cAAc,QAAQ,SAAS,KAAK,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC;AACrE,oBAAgB,OAAO,WAAW;AAElC,UAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC;AACzC,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,GAAI,YAAY,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA,MAGjD,GAAI,SAAS,EAAE,QAAQ,MAAM,gBAAgB,EAAE,eAAe,KAAK,EAAE,IAAI,CAAC;AAAA,MACtE,GAAI,QAAQ,iBACR;AAAA,QACE,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,YACX,MAAM,QAAQ,eAAe;AAAA,YAC7B,QAAQ,QAAQ,eAAe,UAAU;AAAA,YACzC,QAAQ,QAAQ,eAAe;AAAA,UACjC;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,MACL,UAAU,QAAQ,SAAS,IAAI,aAAa;AAAA,MAC5C,GAAI,QAAQ,MAAM,SACd;AAAA,QACE,OAAO,QAAQ,MAAM,IAAI,CAAC,OAAO;AAAA,UAC/B,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA;AAAA,YAEf,GAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,UACjE;AAAA,QACF,EAAE;AAAA,MACJ,IACA,CAAC;AAAA,IACP;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,QAAQ,KAAK;AAAA,QACvB,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,eAAe,UAAU,MAAM,GAAG;AAAA,QACjF,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,MACrD,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,eAAe,yBAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,IAAI;AAAA,IACvH;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,YAAM,YAAY,IAAI,WAAW,OAAO,IAAI,UAAU;AACtD,YAAM,IAAI,WAAW,eAAe,cAAc,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,SAAS;AAAA,IAClG;AACA,WAAO,SACH,KAAK,WAAW,KAAK,OAAO,IAC5B,KAAK,SAAS,KAAK,OAAO;AAAA,EAChC;AAAA,EAEA,MAAc,SAAS,KAAe,SAAoD;AACxF,UAAM,OAAQ,MAAM,IAAI,KAAK;AAI7B,UAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,UAAM,MAAM,QAAQ,WAAW,CAAC;AAChC,UAAM,WAAW,WAAW,GAAG;AAC/B,QAAI,SAAU,SAAQ,aAAa,QAAQ;AAC3C,QAAI,IAAI,QAAS,SAAQ,UAAU,IAAI,OAAO;AAC9C,UAAM,eAAe,QAAQ,iBAAiB;AAK9C,QAAI,CAAC,IAAI,WAAW,EAAE,IAAI,cAAc,CAAC,GAAG,UAAU,YAAY,iBAAiB,QAAQ;AACzF,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAIA,QAAI,CAAC,IAAI,WAAW,EAAE,IAAI,cAAc,CAAC,GAAG,UAAU,iBAAiB,UAAU;AAC/E,YAAM,IAAI;AAAA,QACR;AAAA,QACA,6CAA6C,KAAK,OAAO,qBAAqB,GAAG;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AACA,UAAM,kBAAkB,KAAK,QAAQ,YAAY,KAAK,KAAK,IAAI;AAC/D,WAAO;AAAA,MACL,MAAM,IAAI,WAAW;AAAA,MACrB,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B,WAAW,eAAe,IAAI,cAAc,CAAC,CAAC;AAAA,MAC9C,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,OAAO;AAAA,QACL,aAAa,KAAK,OAAO,iBAAiB;AAAA,QAC1C,cAAc,KAAK,OAAO,qBAAqB;AAAA,QAC/C,GAAI,mBAAmB,OAAO,EAAE,gBAAgB,IAAI,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,WAAW,KAAe,SAAoD;AAC1F,QAAI,CAAC,IAAI,KAAM,OAAM,IAAI,MAAM,gCAAgC;AAC/D,UAAM,SAAS,IAAI,KAAK,UAAU;AAClC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,OAAO;AACX,QAAI,WAAW;AACf,QAAI,cAAc;AAClB,QAAI,eAAe;AACnB,QAAI;AACJ,QAAI;AACJ,UAAM,iBAAiB,oBAAI,IAAwD;AACnF,QAAI,SAAS;AAEb,UAAM,QAAQ,CAAC,UAAkB;AAC/B,gBAAU;AACV,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AACxB,iBAAW,QAAQ,OAAO;AACxB,cAAM,IAAI,KAAK,KAAK;AACpB,YAAI,CAAC,EAAE,WAAW,OAAO,EAAG;AAC5B,cAAM,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK;AAChC,YAAI,YAAY,SAAU;AAC1B,YAAI;AAIJ,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B,QAAQ;AACN;AAAA,QACF;AACA,YAAI,IAAI,UAAU,CAAC,GAAG,cAAe,gBAAe,IAAI,QAAQ,CAAC,EAAE,iBAAiB;AAGpF,YAAI,IAAI,OAAO;AACb,cAAI,IAAI,MAAM,iBAAiB,KAAM,eAAc,IAAI,MAAM;AAC7D,cAAI,IAAI,MAAM,qBAAqB,KAAM,gBAAe,IAAI,MAAM;AAClE,gBAAM,KAAK,YAAY,IAAI,KAAK;AAChC,cAAI,MAAM,KAAM,mBAAkB;AAClC;AAAA,QACF;AACA,cAAM,QAAQ,IAAI,UAAU,CAAC,GAAG;AAChC,YAAI,CAAC,MAAO;AACZ,cAAM,QAAQ,WAAW,KAAK;AAC9B,YAAI,OAAO;AACT,sBAAY;AACZ,kBAAQ,aAAa,KAAK;AAAA,QAC5B;AACA,YAAI,MAAM,SAAS;AACjB,kBAAQ,MAAM;AACd,kBAAQ,UAAU,MAAM,OAAO;AAAA,QACjC;AACA,mBAAW,CAAC,GAAG,EAAE,MAAM,MAAM,cAAc,CAAC,GAAG,QAAQ,GAAG;AACxD,gBAAM,MAAM,GAAG,SAAS;AACxB,gBAAM,OAAO,eAAe,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,MAAM,IAAI,MAAM,GAAG;AACrE,cAAI,GAAG,GAAI,MAAK,KAAK,GAAG;AACxB,cAAI,GAAG,UAAU,KAAM,MAAK,OAAO,GAAG,SAAS;AAC/C,cAAI,GAAG,UAAU,UAAW,MAAK,QAAQ,GAAG,SAAS;AACrD,yBAAe,IAAI,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,eAAS;AACP,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,YAAM,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,IAC/C;AACA,UAAM,QAAQ,OAAO,CAAC;AAItB,QAAI,CAAC,QAAQ,CAAC,eAAe,QAAQ,YAAY,iBAAiB,QAAQ;AACxE,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,CAAC,eAAe,QAAQ,iBAAiB,UAAU;AAC9D,YAAM,IAAI;AAAA,QACR;AAAA,QACA,yDAAyD,YAAY;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,WAAW,CAAC,GAAG,eAAe,OAAO,CAAC,EACnC,OAAO,CAAC,MAAM,EAAE,IAAI,EAEpB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,MAAM,SAAS,EAAE,IAAI,EAAE,EAAE;AAAA,MACzF,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,GAAI,mBAAmB,OAAO,EAAE,gBAAgB,IAAI,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,UAAU;AAEd,SAAS,eAAe,OAAuG;AAC7H,SAAO,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,OAAO,IAAI,MAAM,EAAE,SAAS,MAAM,MAAM,SAAS,EAAE,SAAS,aAAa,IAAI,EAAE,EAAE;AACpI;AAEA,SAAS,SAAS,KAAsB;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,OAAO,IAAI;AAAA,EAC/B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGO,SAAS,gBACd,QACA,OAC0B;AAC1B,SAAO,IAAI,yBAAyB,EAAE,SAAS,OAAO,SAAS,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO,GAAG,MAAM,CAAC;AACvH;;;ACpTA,SAAS,oBAAoB,YAAgD;AAC3E,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,eAAe,eAAe,WAAW;AAClD;AAGA,SAAS,yBAAyB,MAAc,WAAsB,cAAkC,YAA0B;AAChI,MAAI,CAAC,QAAQ,CAAC,UAAU,UAAU,iBAAiB,UAAU;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,MACA,gCAAgC,UAAU;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,6BAA6B,MAAc,WAAsB,UAAkB,YAAsC;AAChI,MAAI,CAAC,QAAQ,CAAC,UAAU,UAAU,YAAY,eAAe,QAAQ;AACnE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,GAAyB;AACnD,MAAI,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AAC5C,QAAM,QAAmB,CAAC;AAC1B,QAAM,OAAO,WAAW,EAAE,OAAO;AACjC,MAAI,KAAM,OAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAC3C,aAAW,OAAO,SAAS,EAAE,OAAO,GAAG;AACrC,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,IAAI,OACR,EAAE,MAAM,UAAU,YAAY,IAAI,YAAY,cAAc,MAAM,IAAI,KAAK,IAC3E,EAAE,MAAM,OAAO,KAAK,IAAI,IAAI;AAAA,IAClC,CAAC;AAAA,EACH;AACA,aAAW,KAAK,EAAE,SAAS;AACzB,QAAI,EAAE,SAAS,YAAa,OAAM,KAAK,EAAE,MAAM,YAAY,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,EAC1G;AACA,SAAO;AACT;AASO,IAAM,oBAAN,MAAiD;AAAA,EAC7C;AAAA,EACA,eAAe,EAAE,kBAAkB,OAAO,WAAW,KAAK;AAAA,EAC3D;AAAA,EAER,YAAY,MAAwB;AAClC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gEAAgE;AAClG,SAAK,OAAO,EAAE,SAAS,6BAA6B,WAAW,MAAM,GAAG,KAAK;AAG7E,QAAI,KAAK,KAAK,kBAAkB,KAAK,KAAK,aAAa,QAAQ,KAAK,KAAK,aAAa,KAAK,KAAK,gBAAgB;AAC9G,YAAM,IAAI;AAAA,QACR,iCAAiC,KAAK,KAAK,SAAS,iCAAiC,KAAK,KAAK,cAAc;AAAA,MAC/G;AAAA,IACF;AACA,SAAK,KAAK,aAAa,KAAK,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,SAAS,SAAoD;AACjE,UAAM,EAAE,UAAU,OAAO,QAAQ,OAAO,SAAS,WAAW,aAAa,gBAAgB,OAAO,IAAI,KAAK;AACzG,UAAM,cAAc,QAAQ,SAAS,KAAK,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC;AACrE,oBAAgB,OAAO,WAAW;AAElC,UAAMC,UAAS,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,IAAI,CAAC,MAAM,WAAW,EAAE,OAAO,CAAC,EAAE,KAAK,MAAM;AAChH,UAAM,WAA+D,CAAC;AACtE,eAAW,KAAK,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG;AACnE,UAAI,EAAE,SAAS,QAAQ;AAGrB,cAAM,SAAS,EAAE,MAAM,eAAe,aAAa,EAAE,YAAY,SAAS,mBAAmB,CAAC,EAAE;AAChG,cAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,YAAI,QAAQ,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,QAAQ,KAAK,CAAC,MAAO,EAAwB,SAAS,aAAa,GAAG;AAC5I,eAAK,QAAQ,KAAK,MAAM;AACxB;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;AACjD;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,EAAE,SAAS,cAAe,cAAyB,QAAkB,SAAS,mBAAmB,CAAC,EAAE,CAAC;AAAA,IAC7H;AAEA,UAAM,OAAgC;AAAA,MACpC;AAAA,MACA,YAAY;AAAA,MACZ,GAAIA,UAAS,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3B,GAAI,eAAe,OAAO,EAAE,YAAY,IAAI,CAAC;AAAA,MAC7C,GAAI,iBAAiB,EAAE,UAAU,EAAE,MAAM,WAAW,eAAe,eAAe,EAAE,IAAI,CAAC;AAAA,MACzF,GAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,MACA,GAAI,QAAQ,MAAM,SACd;AAAA,QACE,OAAO,QAAQ,MAAM,IAAI,CAAC,OAAO;AAAA,UAC/B,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,cAAc,EAAE,oBAAoB,EAAE,MAAM,SAAS;AAAA,QACvD,EAAE;AAAA,MACJ,IACA,CAAC;AAAA,IACP;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,QAAQ,GAAG,QAAS,QAAQ,OAAO,EAAE,CAAC,gBAAgB;AAAA,QAChE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa;AAAA,UACb,qBAAqB;AAAA,UACrB,GAAI,SAAS,EAAE,QAAQ,oBAAoB,IAAI,CAAC;AAAA,QAClD;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,MACrD,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,eAAe,yBAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,IAAI;AAAA,IACvH;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,YAAM,YAAY,IAAI,WAAW,OAAO,IAAI,UAAU;AACtD,YAAM,IAAI,WAAW,eAAe,cAAc,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,SAAS;AAAA,IAClG;AACA,WAAO,SAAS,KAAK,WAAW,KAAK,OAAO,IAAI,KAAK,SAAS,KAAK,OAAO;AAAA,EAC5E;AAAA,EAEQ,aAAa,QAA0B,OAAsD,SAA2C;AAC9I,QAAI,OAAO;AACX,QAAI,WAAW;AACf,UAAM,YAA0C,CAAC;AACjD,eAAW,KAAK,QAAQ;AACtB,UAAI,EAAE,SAAS,UAAU,EAAE,MAAM;AAC/B,gBAAQ,EAAE;AACV,gBAAQ,UAAU,EAAE,IAAI;AAAA,MAC1B,WAAW,EAAE,SAAS,cAAc,EAAE,UAAU;AAC9C,oBAAY,EAAE;AACd,gBAAQ,aAAa,EAAE,QAAQ;AAAA,MACjC,WAAW,EAAE,SAAS,cAAc,EAAE,MAAM;AAC1C,kBAAU,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,UAAU,MAAM,IAAI,MAAM,EAAE,MAAM,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,MAC9F;AAAA,IACF;AACA,WAAO,EAAE,MAAM,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,GAAI,WAAW,MAAM;AAAA,EACrE;AAAA,EAEA,MAAc,SAAS,KAAe,SAAoD;AACxF,UAAM,OAAQ,MAAM,IAAI,KAAK;AAK7B,UAAM,MAAM,KAAK,aAAa,KAAK,WAAW,CAAC,GAAG;AAAA,MAChD,aAAa,KAAK,OAAO,gBAAgB;AAAA,MACzC,cAAc,KAAK,OAAO,iBAAiB;AAAA,IAC7C,GAAG,OAAO;AACV,UAAM,eAAe,oBAAoB,KAAK,WAAW;AACzD,6BAAyB,IAAI,MAAM,IAAI,WAAW,cAAc,KAAK,OAAO,iBAAiB,CAAC;AAC9F,iCAA6B,IAAI,MAAM,IAAI,WAAW,IAAI,YAAY,IAAI,YAAY;AACtF,WAAO,eAAe,EAAE,GAAG,KAAK,aAAa,IAAI;AAAA,EACnD;AAAA,EAEA,MAAc,WAAW,KAAe,SAAoD;AAC1F,QAAI,CAAC,IAAI,KAAM,OAAM,IAAI,MAAM,gCAAgC;AAC/D,UAAM,SAAS,IAAI,KAAK,UAAU;AAClC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AACb,QAAI,QAAQ;AACZ,QAAI,cAAc;AAClB,QAAI,eAAe;AACnB,QAAI;AACJ,UAAM,SAA2B,CAAC;AAClC,QAAI;AACJ,QAAI,YAAY;AAEhB,UAAM,QAAQ,CAAC,UAAkB;AAC/B,gBAAU;AACV,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AACxB,iBAAW,QAAQ,OAAO;AACxB,cAAM,IAAI,KAAK,KAAK;AACpB,YAAI,CAAC,EAAG;AACR,YAAI,EAAE,WAAW,QAAQ,GAAG;AAC1B,kBAAQ,EAAE,MAAM,CAAC,EAAE,KAAK;AACxB;AAAA,QACF;AACA,YAAI,CAAC,EAAE,WAAW,OAAO,EAAG;AAC5B,cAAM,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK;AAChC,YAAI,CAAC,QAAS;AACd,YAAI;AACJ,YAAI;AACF,iBAAO,KAAK,MAAM,OAAO;AAAA,QAC3B,QAAQ;AACN;AAAA,QACF;AACA,YAAI,UAAU,iBAAiB;AAE7B,gBAAM,MAAO,KAAK,WAAW,CAAC,GAA6C;AAC3E,cAAI,IAAI,gBAAgB,KAAM,eAAc,GAAG;AAAA,QACjD,WAAW,UAAU,iBAAiB;AAEpC,gBAAM,KAAM,KAAK,SAAS,CAAC;AAC3B,cAAI,GAAG,iBAAiB,KAAM,gBAAe,GAAG;AAChD,gBAAM,KAAM,KAAK,SAAS,CAAC;AAC3B,cAAI,GAAG,YAAa,cAAa,oBAAoB,GAAG,WAAW;AAAA,QACrE,WAAW,UAAU,uBAAuB;AAC1C,gBAAM,QAAS,KAAK,iBAAiB,CAAC;AACtC,oBAAU,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM,MAAM,KAAK;AAC7D,sBAAY;AAAA,QACd,WAAW,UAAU,uBAAuB;AAC1C,gBAAM,QAAS,KAAK,SAAS,CAAC;AAC9B,cAAI,MAAM,MAAM;AACd,sBAAU,WAAW,EAAE,MAAM,OAAO;AACpC,oBAAQ,QAAQ,QAAQ,QAAQ,MAAM,MAAM;AAAA,UAC9C,WAAW,MAAM,UAAU;AACzB,sBAAU,WAAW,EAAE,MAAM,WAAW;AACxC,oBAAQ,YAAY,QAAQ,YAAY,MAAM,MAAM;AAAA,UACtD,WAAW,MAAM,cAAc;AAC7B,yBAAa,MAAM;AAAA,UACrB;AAAA,QACF,WAAW,UAAU,sBAAsB;AACzC,cAAI,SAAS;AACX,gBAAI,QAAQ,SAAS,YAAY;AAC/B,kBAAI;AACF,wBAAQ,QAAQ,KAAK,MAAM,aAAa,IAAI;AAAA,cAC9C,QAAQ;AACN,wBAAQ,QAAQ,CAAC;AAAA,cACnB;AAAA,YACF;AACA,mBAAO,KAAK,OAAO;AACnB,sBAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,eAAS;AACP,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,YAAM,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,IAC/C;AACA,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,QAAS,QAAO,KAAK,OAAO;AAChC,UAAM,MAAM,KAAK,aAAa,QAAQ,EAAE,aAAa,aAAa,GAAG,OAAO;AAC5E,6BAAyB,IAAI,MAAM,IAAI,WAAW,YAAY,YAAY;AAC1E,iCAA6B,IAAI,MAAM,IAAI,WAAW,IAAI,YAAY,IAAI,UAAU;AACpF,WAAO,aAAa,EAAE,GAAG,KAAK,cAAc,WAAW,IAAI;AAAA,EAC7D;AACF;;;AC5QO,IAAM,iBAAN,cAA6B,yBAAyB;AAAA,EACzC;AAAA,EACA,eAAe,EAAE,kBAAkB,OAAO,WAAW,KAAK;AAAA,EAE5E,YAAY,MAAqB;AAC/B,UAAM;AAAA,MACJ,SAAS,KAAK,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,GAAI,KAAK,eAAe,OAAO,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,MACpE,GAAI,KAAK,aAAa,OAAO,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MAC9D,GAAI,KAAK,UAAU,OAAO,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,MACrD,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAClD,CAAC;AACD,SAAK,KAAK,UAAU,KAAK,KAAK;AAAA,EAChC;AACF;AAEO,SAAS,OAAO,MAAqC;AAC1D,SAAO,IAAI,eAAe,IAAI;AAChC;;;ACxBO,SAAS,cACd,MACA,OAOI,CAAC,GACU;AACf,QAAM,MAAM,WAAW;AACvB,QAAM,QAA0C;AAAA,IAC9C,GAAI,KAAK,eAAe,OAAO,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,IACpE,GAAI,KAAK,aAAa,OAAO,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,UAAU,OAAO,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EACvD;AACA,QAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,QAAM,WAAW,QAAQ,IAAI,KAAK,MAAM,GAAG,KAAK,IAAI;AACpD,QAAM,QAAQ,QAAQ,IAAI,KAAK,MAAM,QAAQ,CAAC,IAAI;AAClD,UAAQ,UAAU;AAAA,IAChB,KAAK,YAAY;AACf,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8DAA8D;AAC3F,aAAO,IAAI,yBAAyB,EAAE,SAAS,KAAK,WAAW,IAAI,mBAAmB,QAAQ,OAAO,GAAG,MAAM,CAAC;AAAA,IACjH;AAAA,IACA,KAAK,UAAU;AACb,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4DAA4D;AACzF,aAAO,IAAI,yBAAyB,EAAE,SAAS,KAAK,WAAW,IAAI,iBAAiB,QAAQ,OAAO,GAAG,MAAM,CAAC;AAAA,IAC/G;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,+DAA+D;AAC5F,aAAO,IAAI,kBAAkB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,EAAE,SAAS,IAAI,mBAAmB;AAAA,QACjF,GAAI,KAAK,kBAAkB,OAAO,EAAE,gBAAgB,KAAK,eAAe,IAAI,CAAC;AAAA,QAC7E,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA,KAAK,UAAU;AACb,aAAO,IAAI,eAAe,EAAE,OAAO,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,EAAE,SAAS,IAAI,gBAAgB,GAAI,GAAG,MAAM,CAAC;AAAA,IACjI;AAAA,IACA,KAAK,UAAU;AACb,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;AAClG,aAAO,IAAI,yBAAyB,EAAE,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,OAAO,GAAG,MAAM,CAAC;AAAA,IACrG;AAAA,IACA;AACE,YAAM,IAAI,MAAM,oCAAoC,QAAQ,sDAAsD;AAAA,EACtH;AACF;;;AClEA,SAAS,aAAa,cAAc,gBAAgB;AACpD,SAAS,QAAAC,aAAY;AACrB,SAAS,KAAAC,UAAS;AA0BlB,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,SAASA,GAAE,OAAO,EAAE,QAAQ,OAAO;AACrC,CAAC;AAGM,SAAS,eAAe,SAAiB,OAAO,YAAkC;AAEvF,QAAM,MAAM,QAAQ,WAAW,QAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AACzD,QAAM,QAAQ,IAAI,MAAM,6CAA6C;AACrE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,2CAA2C,IAAI,EAAE;AAC7E,QAAM,CAAC,EAAE,IAAI,IAAI,IAAI;AACrB,QAAM,OAA+B,CAAC;AACtC,aAAW,QAAQ,GAAG,MAAM,IAAI,GAAG;AACjC,UAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,QAAI,IAAI,EAAG,MAAK,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAAA,EAChG;AACA,QAAM,SAAS,kBAAkB,MAAM,IAAI;AAC3C,MAAI,CAAC,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,kCAAkC,IAAI,EAAE;AAC1E,SAAO,EAAE,GAAG,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE;AAC9C;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACjB,SAAS,oBAAI,IAAmB;AAAA,EAExC,SAAS,OAAoB;AAC3B,QAAI,KAAK,OAAO,IAAI,MAAM,IAAI,EAAG,OAAM,IAAI,MAAM,6BAA6B,MAAM,IAAI,EAAE;AAC1F,SAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAiC;AACnC,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAgB;AACd,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;AAAA,EACjC;AAAA;AAAA,EAGA,UAAkB;AAChB,WAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,EACjD;AACF;AAOA,eAAsB,eAAe,MAAgB,OAA6B,CAAC,GAAqB;AACtG,QAAM,QAAiB,CAAC;AACxB,aAAW,OAAO,MAAM;AACtB,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,GAAG;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,YAAM,OAAOD,MAAK,KAAK,KAAK;AAC5B,UAAIE;AACJ,UAAI;AACF,QAAAA,QAAO,SAAS,IAAI;AAAA,MACtB,QAAQ;AACN;AAAA,MACF;AACA,YAAM,OAAOA,MAAK,YAAY,IAAIF,MAAK,MAAM,UAAU,IAAI;AAC3D,UAAI,CAAC,KAAK,SAAS,UAAU,EAAG;AAChC,UAAI;AACF,cAAM,KAAK,EAAE,GAAG,eAAe,aAAa,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,MAC/E,SAAS,KAAK;AACZ,YAAI,KAAK,OAAQ,OAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,eAAe,UAAyB,MAAgB,OAA6B,CAAC,GAAqB;AAC/H,QAAM,SAAS,MAAM,eAAe,MAAM,IAAI;AAC9C,aAAW,KAAK,OAAQ,UAAS,SAAS,CAAC;AAC3C,SAAO;AACT;AAQO,SAAS,SAAS,MAAwB;AAC/C,SAAO,KAAK,YAAY,EAAE,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC1E;AAEO,SAAS,YAAY,UAAyB,OAAkD;AACrG,QAAM,SAAS,SAAS,KAAK;AAC7B,QAAM,OAAO,OAAO,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;AACrE,QAAM,QAAQ,SAAS,KAAK;AAC5B,QAAM,KAAK,oBAAI,IAAoB;AACnC,aAAW,OAAO,MAAM;AACtB,eAAW,QAAQ,IAAI,IAAI,GAAG,EAAG,IAAG,IAAI,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EACvE;AACA,QAAM,MAAM,CAAC,SAAyB,KAAK,KAAK,KAAK,SAAS,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI;AAChG,QAAM,MAAM,oBAAI,IAAoB;AACpC,aAAW,KAAK,MAAO,KAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;AACvD,QAAM,QAAQ,KAAK,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK;AAE7E,SAAO,OAAO,IAAI,CAAC,OAAO,MAAM;AAG9B,QAAI,IAAI,OAAO,MAAM,MAAM,KAAK,QAAQ,uBAAuB,MAAM,CAAC,YAAY,EAAE,KAAK,KAAK,GAAG;AAC/F,aAAO,EAAE,OAAO,OAAO,OAAO,kBAAkB;AAAA,IAClD;AACA,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAW,KAAK,KAAK,CAAC,EAAG,KAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;AACzD,QAAI,MAAM;AACV,QAAI,QAAQ;AACZ,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK;AAC/B,YAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,eAAS,IAAI;AACb,UAAI,IAAI,IAAI,IAAI,EAAG,QAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI;AAAA,IAC/D;AACA,UAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,SAAS;AAC1C,WAAO,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,EACrC,CAAC;AACH;AAEO,SAAS,YAAY,UAAyB,OAAe,YAAY,MAAe;AAC7F,SAAO,YAAY,UAAU,KAAK,EAC/B,OAAO,CAAC,EAAE,MAAM,MAAM,SAAS,SAAS,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK;AAC7B;;;ANjJA,IAAM,iBAAiBG,GAAE,OAAO;AAAA,EAC9B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAClC,cAAcA,GAAE,OAAO,EAAE,QAAQ,6DAA6D;AAAA,EAC9F,OAAOA,GAAE,OAAO;AAAA,EAChB,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,OAAOA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC/C,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEhC,SAASA,GAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAMD,IAAM,mBAAmBA,GAAE,MAAM;AAAA,EAC/B;AAAA,EACAA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,CAAC,EAAE,SAASA,GAAE,QAAQ,CAAC;AACrD,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,QAAQA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,QAAQ,WAAW,GAAG,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEvH,SAASA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,EAE7D,KAAKA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAEnC,cAAcA,GAAE,OAAO,EAAE,KAAKA,GAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AAAA,EACrD,MAAMA,GAAE,OAAO,EAAE,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3E,QAAQA,GAAE,MAAM,gBAAgB,EAAE,IAAI,CAAC;AACzC,CAAC;AAwBM,SAAS,YAAY,MAAc,WAAW,MAAY;AAC/D,eAAa,EAAE,MAAM,SAAS,CAAC;AACjC;AAEA,SAAS,kBACP,KACA,KACkB;AAClB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAMC,SAAQ,KAAK,CAAC,CAAC;AAAA,IAC7C,GAAI,IAAI,aAAa,EAAE,YAAYA,SAAQ,KAAK,IAAI,UAAU,EAAE,IAAI,CAAC;AAAA,IACrE,GAAI,IAAI,aAAa,EAAE,YAAYA,SAAQ,KAAK,IAAI,UAAU,EAAE,IAAI,CAAC;AAAA,IACrE,GAAI,IAAI,UAAU,EAAE,SAASA,SAAQ,KAAK,IAAI,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9D;AACF;AAGA,SAAS,kBACP,SACA,WACA,UACA,cACkB;AAClB,QAAM,WAAW,IAAI,IAAI,OAAO,KAAK,OAAO,CAAC;AAC7C,QAAM,SAAS,eAAe,MAAM,EAAE,GAAG,SAAS,GAAG,UAAU,CAAC;AAChE,QAAM,UAAU,CAAC,QAAyB,SAAS,IAAI,GAAG,KAAK,EAAE,OAAO,aAAa,WAAW;AAChG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,OAAO,OAAO,IAAI,CAAC,MAAMA,SAAQ,QAAQ,QAAQ,GAAG,CAAC,CAAC;AAAA,IAC9D,GAAI,OAAO,aAAa,EAAE,YAAYA,SAAQ,QAAQ,YAAY,GAAG,OAAO,UAAU,EAAE,IAAI,CAAC;AAAA,IAC7F,GAAI,OAAO,aAAa,EAAE,YAAYA,SAAQ,QAAQ,YAAY,GAAG,OAAO,UAAU,EAAE,IAAI,CAAC;AAAA,IAC7F,GAAI,OAAO,UAAU,EAAE,SAASA,SAAQ,QAAQ,SAAS,GAAG,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,EACnF;AACF;AAEO,SAAS,oBAAoB,MAAmC;AACrE,QAAM,MAAM,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AACjD,QAAM,SAAS,oBAAoB,MAAM,GAAG;AAC5C,QAAM,MAAMC,SAAQF,SAAQ,IAAI,CAAC;AAEjC,aAAW,WAAW,OAAO,UAAU,CAAC,OAAO,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG;AAEnE,gBAAYA,SAAQ,KAAK,OAAO,GAAG,KAAK;AAAA,EAC1C;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,GAAG;AAC3D,YAAQ,IAAI,GAAG,IAAI;AAAA,EACrB;AAEA,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACpD,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,IACxC,GAAI,OAAO,eAAe,EAAE,cAAc,EAAE,KAAKA,SAAQ,KAAK,OAAO,aAAa,GAAG,EAAE,EAAE,IAAI,CAAC;AAAA,IAC9F,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO,OAAO,IAAI,CAAC,UAAU;AACnC,UAAI,UAAU,SAAS,OAAO,MAAM,SAAS,UAAU;AACrD,cAAM,YAAYA,SAAQ,KAAK,MAAM,IAAI;AACzC,cAAM,WAAWE,SAAQ,SAAS;AAClC,cAAM,UAAU,KAAK,MAAMD,cAAa,WAAW,MAAM,CAAC;AAC1D,cAAM,EAAE,MAAM,OAAO,GAAG,UAAU,IAAI;AACtC,aAAK;AACL,cAAME,YAAW,kBAAkB,SAAS,WAAW,UAAU,GAAG;AACpE,YAAIA,UAAS,QAAS,aAAYA,UAAS,OAAO;AAClD,eAAOA;AAAA,MACT;AACA,YAAM,WAAW,kBAAkB,eAAe,MAAM,KAAK,GAAG,GAAG;AACnE,UAAI,SAAS,QAAS,aAAY,SAAS,OAAO;AAClD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,iBACpB,KACA,OAA+B,CAAC,GACyC;AACzE,QAAM,cAAiC,CAAC;AACxC,MAAI,IAAI,WAAY,aAAY,KAAK,qBAAqB,EAAE,MAAM,IAAI,WAAW,CAAC,CAAC;AACnF,MAAI,IAAI,MAAO,aAAY,KAAK,mBAAmB,CAAC;AAEpD,MAAI,eAAe,IAAI;AACvB,MAAI,IAAI,OAAO,QAAQ;AACrB,UAAM,WAAW,IAAI,cAAc;AACnC,eAAW,OAAO,IAAI,QAAQ;AAC5B,iBAAW,KAAK,MAAM,eAAe,CAAC,GAAG,CAAC,GAAG;AAC3C,YAAI;AACF,mBAAS,SAAS,CAAC;AAAA,QACrB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,SAAS,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI;AACrF,QAAI,QAAS,iBAAgB;AAAA;AAAA;AAAA,EAAyD,OAAO;AAAA,EAC/F;AAEA,QAAM,QAAQ,IAAI,MAAM;AAAA,IACtB,MAAM,IAAI;AAAA,IACV,aAAa,IAAI;AAAA,IACjB;AAAA,IACA,OAAO,cAAc,IAAI,KAAK;AAAA,IAC9B,UAAU,IAAI;AAAA,IACd,YAAY;AAAA,IACZ,GAAI,IAAI,aACJ;AAAA;AAAA;AAAA,MAGE,gBAAgB,IAAI,eAAe;AAAA,QACjC,WAAW,KAAK,aAAa,IAAI;AAAA,QACjC,SAAS,IAAI,iBAAiB,IAAI,UAAU;AAAA,MAC9C,CAAC;AAAA,IACH,IACA,CAAC;AAAA,EACP,CAAC;AACD,SAAO,EAAE,OAAO,MAAM,EAAE,MAAM,IAAI,MAAM,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC,EAAG,EAAE;AACzG;AAEA,eAAsB,eAAe,MAA0F;AAC7H,QAAM,SAAwB,CAAC;AAC/B,QAAM,eAAe,KAAK,eAAe,IAAI,iBAAiB,KAAK,aAAa,GAAG,IAAI;AACvF,MAAI,OAAO,KAAK,OAAO;AACvB,aAAW,OAAO,KAAK,QAAQ;AAC7B,UAAM,EAAE,KAAK,IAAI,MAAM,iBAAiB,GAAG;AAC3C,UAAM,SAAS,IAAI,UAAU;AAAA,MAC3B;AAAA;AAAA;AAAA,MAGA,cAAc,CAAC,cACb,iBAAiB,KAAK,IAAI,aAAa,EAAE,WAAW,GAAG,IAAI,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,MAC5G,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,aAAa,KAAK,KAAK;AAAA,MACvB,MAAM,KAAK,OAAO;AAAA,IACpB,CAAC;AACD,UAAM,SAAS,MAAM,OAAO,MAAM,IAAI,QAAQ,MAAM,KAAK,OAAO,IAAI;AACpE,WAAO,SAAS;AAChB,UAAM,MAAM,UAAU,KAAK,OAAO,IAAI,IAAI,MAAM;AAChD,WAAO,KAAK,EAAE,MAAM,IAAI,MAAM,KAAK,SAAS,GAAG,GAAG,gCAAgC,OAAO,CAAC;AAAA,EAC5F;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,YAAY;AAChB,iBAAW,KAAK,OAAQ,OAAM,EAAE,OAAO,KAAK;AAAA,IAC9C;AAAA,EACF;AACF;;;AO9NA,SAAS,KAAAC,UAAS;AAuBX,IAAM,oBAAN,MAA6C;AAAA,EACzC,KAAK;AAAA,EACN;AAAA,EACA,KAAK,oBAAI,IAAoB;AAAA,EAErC,YAAY,MAAsE;AAChF,SAAK,OAAO,KAAK,IAAI,CAAC,MAAM;AAC1B,YAAM,QAAQ,oBAAI,IAAoB;AACtC,iBAAW,KAAK,SAAS,EAAE,IAAI,EAAG,OAAM,IAAI,IAAI,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC;AACtE,aAAO,EAAE,GAAG,GAAG,MAAM;AAAA,IACvB,CAAC;AACD,eAAW,KAAK,KAAK,MAAM;AACzB,iBAAW,KAAK,IAAI,IAAI,EAAE,MAAM,KAAK,CAAC,EAAG,MAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IACnF;AAAA,EACF;AAAA,EAEQ,IAAI,MAAsB;AAChC,WAAO,KAAK,KAAK,KAAK,KAAK,SAAS,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI;AAAA,EAC7E;AAAA,EAEA,MAAM,OAAO,OAAe,IAAI,GAAyB;AACvD,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAW,KAAK,SAAS,KAAK,EAAG,KAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;AACjE,WAAO,KAAK,KACT,IAAI,CAAC,MAAM;AACV,UAAI,MAAM;AACV,UAAI,OAAO;AACX,iBAAW,CAAC,MAAM,KAAK,KAAK,EAAE,OAAO;AACnC,cAAM,IAAI,QAAQ,KAAK,IAAI,IAAI;AAC/B,gBAAQ,IAAI;AACZ,YAAI,IAAI,IAAI,IAAI,EAAG,QAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI;AAAA,MACpE;AACA,YAAM,QAAQ,KAAK,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK;AAC7E,aAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,OAAO,QAAQ,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO;AAAA,IAC/F,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC;AAAA,EACf;AACF;AAEO,SAAS,cAAc,WAAsB,OAAsC,CAAC,GAAG;AAC5F,SAAO,WAAW;AAAA,IAChB,MAAM,KAAK,QAAQ;AAAA,IACnB,aAAa,8BAA8B,UAAU,EAAE;AAAA,IACvD,QAAQC,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,GAAGA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,IAC/G,SAAS,OAAO,EAAE,OAAO,EAAE,MAAqC,UAAU,OAAO,OAAO,CAAC;AAAA,EAC3F,CAAC;AACH;AAGO,SAAS,gBACd,OACA,OAAwB,CAAC,GACd;AACX,SAAO;AAAA,IACL,IAAI,KAAK,MAAM;AAAA,IACf,QAAQ,OAAO,OAAe,IAAI,MAAM;AACtC,YAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,CAAC;AACrC,UAAI,CAAC,MAAM,KAAM,QAAO,CAAC;AACzB,YAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,aAAO,MACJ,IAAI,CAAC,GAAG,MAAM;AACb,cAAM,MAAM,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,YAAY;AAClE,YAAI,QAAQ;AACZ,mBAAW,KAAK,MAAO,KAAI,IAAI,SAAS,CAAC,EAAG,UAAS;AACrD,eAAO,EAAE,IAAI,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,MAAM;AAAA,MAC/E,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC;AAAA,IACf;AAAA,EACF;AACF;;;AChGA,SAAS,uBAAuB;AAChC,SAAS,KAAAC,UAAS;AAoClB,SAAS,gBAAgB;AACzB,SAAS,SAAS,YAAAC,WAAU,QAAAC,OAAM,aAAAC,kBAAiB;AACnD,SAAS,QAAAC,OAAM,UAAU,WAAAC,gBAAe;AA3BjC,SAAS,kBAAkB,OAAwD,CAAC,GAAG;AAC5F,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,iBAAiB,KAAK,kBAAkB;AAC9C,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQC,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,CAAC;AAAA,IACtD,SAAS,OAAO,EAAE,KAAK,MAAwB;AAC7C,UAAI;AACJ,UAAI;AACF,iBAAS,gBAAgB,MAAM,OAAO,OAAO,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,SAAS,UAAU,CAAC;AAAA,MACtF,SAAS,KAAK;AAEZ,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAI,aAAa,KAAK,OAAO,GAAG;AAC9B,gBAAM,IAAI,WAAW,mBAAmB,oBAAoB,SAAS,MAAM,IAAI;AAAA,QACjF;AACA,cAAM,IAAI,WAAW,iBAAiB,mBAAmB,OAAO,IAAI,KAAK;AAAA,MAC3E;AACA,YAAM,OAAO,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,UAAU,IAAI;AAChF,aAAO,KAAK,SAAS,iBAAiB,GAAG,KAAK,MAAM,GAAG,cAAc,CAAC,sBAAkB,UAAU;AAAA,IACpG;AAAA,EACF,CAAC;AACH;AAiCA,IAAM,eAAe,CAAC,QAAQ,QAAQ,QAAQ,UAAU,MAAM,QAAQ,UAAU;AAEhF,SAAS,QAAQ,QAAgC,CAAC,GAA2B;AAC3E,QAAM,MAA8B,CAAC;AACrC,aAAW,KAAK,cAAc;AAC5B,UAAM,IAAI,QAAQ,IAAI,CAAC;AACvB,QAAI,MAAM,OAAW,KAAI,CAAC,IAAI;AAAA,EAChC;AACA,SAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAC5B;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,qBAAqB,MAAM;AAC9C;AAGO,SAAS,UAAU,SAAiB,MAAuB;AAChE,QAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,MAAI,KAAK;AACT,QAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,QAAI,QAAQ,EAAG,OAAM;AACrB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,IAAI,KAAK,CAAC;AAChB,UAAI,MAAM,OAAO,KAAK,IAAI,CAAC,MAAM,KAAK;AACpC,cAAM;AACN,aAAK;AAAA,MACP,WAAW,MAAM,IAAK,OAAM;AAAA,eACnB,MAAM,IAAK,OAAM;AAAA,UACrB,OAAM,aAAa,CAAC;AAAA,IAC3B;AAAA,EACF,CAAC;AACD,SAAO,IAAI,OAAO,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI;AACvC;AAEA,eAAe,UAAU,MAAiC;AACxD,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,OAAO,QAA+B;AACjD,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACtD,QAAQ;AACN;AAAA,IACF;AACA,eAAW,KAAK,SAAS;AACvB,YAAM,OAAOC,MAAK,KAAK,EAAE,IAAI;AAC7B,UAAI,EAAE,YAAY,EAAG,OAAM,KAAK,IAAI;AAAA,eAC3B,EAAE,OAAO,EAAG,KAAI,KAAK,SAAS,MAAM,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AACA,QAAM,KAAK,IAAI;AACf,SAAO,IAAI,KAAK;AAClB;AAEO,SAAS,qBAAqB,OAAuB,CAAC,GAAmB;AAC9E,QAAM,OAAOC,SAAQ,KAAK,QAAQ,QAAQ,IAAI,CAAC;AAC/C,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,iBAAiB,KAAK,kBAAkB;AAC9C,QAAM,MAAM,QAAQ,KAAK,GAAG;AAC5B,MAAI,SAAS;AAEb,QAAM,QAAQ,OAAO,SAAkC;AACrD,cAAU;AACV,UAAM,OAAO,UAAU,MAAM;AAC7B,UAAMC,WAAUF,MAAK,MAAM,IAAI,GAAG,MAAM,MAAM;AAC9C,WAAO,GAAG,KAAK,MAAM,GAAG,cAAc,CAAC;AAAA,mBAAiB,KAAK,SAAS,cAAc,sBAAiB,IAAI;AAAA,EAC3G;AAEA,QAAM,cAAc,WAAW;AAAA,IAC7B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQD,GAAE,OAAO,EAAE,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,CAAC;AAAA,IACzD,SAAS,CAAC,EAAE,QAAQ,MAClB,IAAI,QAAgB,CAAC,aAAa,WAAW;AAC3C,eAAS,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,KAAK,SAAS,WAAW,WAAW,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,QAAQ,WAAW;AAC3H,YAAI,OAAQ,IAA6B,QAAQ;AAG/C,cAAK,IAA2B,SAAS,qCAAqC;AAC5E,mBAAO,IAAI,WAAW,4BAA4B,wFAAwF,KAAK,CAAC;AAChJ;AAAA,UACF;AACA,iBAAO,IAAI,WAAW,mBAAmB,oBAAoB,SAAS,MAAM,IAAI,CAAC;AACjF;AAAA,QACF;AACA,cAAM,OAAO,OAAO,UAAU,MAAO,IAAyB,OAAO;AACrE,cAAM,WAAW,GAAG,MAAM,GAAG,SAAS;AAAA;AAAA,EAAe,MAAM,KAAK,EAAE;AAClE,YAAI,SAAS,UAAU,gBAAgB;AACrC,sBAAY,MAAM,GAAG,QAAQ;AAAA,iCAAoC,IAAI,MAAM,YAAY,sCAAsC;AAC7H;AAAA,QACF;AACA,aAAK,MAAM,QAAQ,EAAE;AAAA,UACnB,CAAC,YAAY,YAAY,GAAG,OAAO;AAAA,QAAW,IAAI,GAAG;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACL,CAAC;AAED,QAAM,WAAW,WAAW;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,GAAE,OAAO,EAAE,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,IACxD,SAAS,OAAO,EAAE,QAAQ,OAA4B,MAAM,UAAU,IAAI,GAAG,OAAO,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC7H,CAAC;AAED,QAAM,WAAW,WAAW;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,SAASA,GAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;AAAA,IACzF,SAAS,OAAO,EAAE,OAAO,QAAQ,MAA2C;AAC1E,YAAM,SAAS,MAAM,UAAU,IAAI,GAAG,OAAO,CAAC,MAAM,UAAU,WAAW,MAAM,CAAC,CAAC;AACjF,YAAM,OAAiB,CAAC;AACxB,iBAAW,KAAK,MAAM,MAAM,GAAG,GAAG,GAAG;AACnC,YAAI;AACJ,YAAI;AACF,iBAAO,MAAMI,MAAKH,MAAK,MAAM,CAAC,CAAC;AAAA,QACjC,QAAQ;AACN;AAAA,QACF;AACA,YAAI,KAAK,OAAO,MAAM,KAAM;AAC5B,YAAI;AACJ,YAAI;AACF,oBAAU,MAAMI,UAASJ,MAAK,MAAM,CAAC,GAAG,MAAM;AAAA,QAChD,QAAQ;AACN;AAAA,QACF;AACA,gBAAQ,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,MAAM;AACvC,cAAI,KAAK,SAAS,KAAK,EAAG,MAAK,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,QAC3E,CAAC;AACD,YAAI,KAAK,UAAU,GAAI;AAAA,MACzB;AACA,aAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,CAAC,GAAG,gBAAgB,IAAI,GAAG,UAAU,UAAU,WAAW;AAAA,EACzE;AACF;;;AC/MA,SAAS,gBAAAK,qBAAoB;AA6BtB,SAAS,UAAU,MAA0B;AAClD,SAAOA,cAAa,MAAM,MAAM,EAC7B,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACd,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAa;AACzC;AAEA,eAAsB,QAAQ,OAAmB,WAAuF;AACtI,QAAM,SAAsB,CAAC;AAC7B,aAAW,KAAK,OAAO;AACrB,QAAI;AACF,YAAM,MAAM,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK;AAC1C,YAAM,WAAW,EAAE,QAAQ,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC9E,YAAM,gBAAgB,EAAE,QAAQ,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AACxG,YAAM,OAAO,CAAC,QAAQ,UAAU,CAAC,aAAa;AAC9C,aAAO,KAAK;AAAA,QACV,IAAI,EAAE;AAAA,QACN;AAAA,QACA,QAAQ,OAAO,OAAO,gBAAgB,KAAK,UAAU,OAAO,CAAC,UAAU,KAAK,UAAU,YAAY,CAAC,OAAO,IAAI,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,QAChI,OAAO,IAAI;AAAA,MACb,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO,KAAK;AAAA,QACV,IAAI,EAAE;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAClE,OAAO,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,WAAW,OAAO,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,SAAS;AACvF,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAEO,SAAS,YAAY,QAAqB,UAAwB;AACvE,aAAW,KAAK,QAAQ;AACtB,YAAQ,IAAI,GAAG,EAAE,OAAO,SAAS,MAAM,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;AAAA,EACjE;AACA,UAAQ,IAAI;AAAA,cAAiB,WAAW,KAAK,QAAQ,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,MAAM,GAAG;AACtH;;;ACrEA,SAAS,gBAAgB,iBAAiB;AAC1C,SAAS,WAAAC,gBAAe;AAsBxB,SAAS,IAAI,GAAmB;AAC9B,SAAO,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE;AACrF;AAMO,IAAM,kBAAN,MAA0C;AAAA,EAC/C,KAAK,MAAkB;AACrB,YAAQ,IAAI,WAAW,KAAK,IAAI,IAAI,KAAK,UAAU,KAAK,UAAU,CAAC;AAAA,EACrE;AACF;AAEO,IAAM,gBAAN,MAAwC;AAAA,EAC7C,YAAoB,MAAc;AAAd;AAClB,cAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAAA,EAFoB;AAAA,EAGpB,KAAK,MAAkB;AACrB,mBAAe,KAAK,MAAM,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,GAAM,MAAM;AAAA,EAC/D;AACF;AAEO,IAAM,iBAAN,MAAyC;AAAA,EAC9C,QAAgB,CAAC;AAAA,EACjB,KAAK,MAAkB;AACrB,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AACF;AAGO,SAAS,cAAc,MAAgB,OAA6B,CAAC,GAAgB;AAC1F,QAAM,UAAU,KAAK,WAAW,IAAI,EAAE;AACtC,QAAMC,QAAO,oBAAI,IAAkB;AACnC,QAAM,OAAO,CAAC,MAAc,YAAqC,aAA4B;AAC3F,UAAM,OAAa;AAAA,MACjB;AAAA,MACA,QAAQ,IAAI,EAAE;AAAA,MACd,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC;AAAA,IACF;AACA,SAAK,KAAK,IAAI;AACd,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ,CAAC,MAAiB;AACxB,WAAK,cAAc,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,SAAS,OAAO,CAAC;AAAA,IAClE;AAAA,IACA,YAAY,CAAC,MAAqB;AAChC,YAAM,OAAO,KAAK,aAAa,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC;AAC7D,MAAAA,MAAK,IAAI,EAAE,MAAM,IAAI;AAAA,IACvB;AAAA,IACA,cAAc,CAAC,MAAuB;AACpC,YAAM,SAASA,MAAK,IAAI,EAAE,IAAI;AAC9B,MAAAA,MAAK,OAAO,EAAE,IAAI;AAClB,WAAK,eAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE,OAAO,GAAG,QAAQ,MAAM;AAAA,IACxE;AAAA,IACA,SAAS,CAAC,UAAkB;AAC1B,WAAK,eAAe,EAAE,OAAO,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC;AAAA,IACpD;AAAA,IACA,YAAY,CAAC,UAAkB;AAC7B,WAAK,kBAAkB,EAAE,OAAO,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC;AAAA,IACvD;AAAA,IACA,QAAQ,CAAC,MAAiB;AACxB,WAAK,cAAc,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,GAAG,GAAG,WAAW,EAAE,UAAU,OAAO,CAAC;AAAA,IAClF;AAAA,EACF;AACF;AAOO,SAAS,uBAAuB,MAInB;AAClB,QAAM,QAAQ,CAAC,MAAuC;AAAA;AAAA;AAAA,KAGnD,QAAQ,CAAC,GAAG;AAAA,MAAK,CAAC,MACjB,OAAO,MAAM,WAAW,MAAM,OAAO,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI;AAAA,IAC/F;AAAA;AACF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,CAAC,SAAS;AACpB,UAAI,KAAK,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI,GAAG;AAC5C,YAAI,KAAK,iBAAiB,SAAS;AACjC,gBAAM,IAAI,WAAW,eAAe,uBAAuB,KAAK,IAAI,KAAK,KAAK;AAAA,QAChF;AACA,cAAM,IAAI,cAAc,uBAAuB,KAAK,IAAI,yCAAyC;AAAA,MACnG;AACA,UAAI,KAAK,SAAS,CAAC,MAAM,KAAK,OAAO,KAAK,IAAI,GAAG;AAC/C,cAAM,IAAI,cAAc,uBAAuB,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,KAAK,IAAI,mBAAmB;AAAA,MACzG;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC/GA,eAAsB,cACpB,QACyD;AACzD,QAAM,SAAwB,CAAC;AAC/B,aAAS;AACP,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,KAAK,KAAM,QAAO,EAAE,QAAQ,QAAQ,KAAK,MAAM;AACnD,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AACF;;;ACRO,SAAS,iBAAiB,UAA0C;AACzE,QAAM,OAAO,SACV,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,EACjC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE,EAC3D,KAAK,IAAI;AACZ,SAAO,QAAQ,QAAQ,0BAA0B,SAAS,MAAM;AAAA,EAAY,IAAI,EAAE;AACpF;AAGO,IAAM,kBAAN,MAAwC;AAAA,EAC7C,YACU,OACA,OAA0B,CAAC,GACnC;AAFQ;AACA;AAAA,EACP;AAAA,EAFO;AAAA,EACA;AAAA,EAGV,MAAM,OAA+B;AACnC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,MAAM,KAAK,UAAwC;AACjD,UAAM,KAAK,MAAM,KAAK,QAAQ;AAC9B,UAAM,MAAM,KAAK,KAAK,eAAe;AACrC,UAAM,UAAU,MAAM,KAAK,MAAM,KAAK;AACtC,QAAI,QAAQ,UAAU,IAAK;AAC3B,UAAM,YAAY,KAAK,KAAK,aAAa;AACzC,UAAM,WAAW,QAAQ,MAAM,GAAG,QAAQ,SAAS,MAAM,CAAC;AAC1D,UAAM,OAAO,QAAQ,MAAM,QAAQ,SAAS,MAAM,CAAC;AACnD,UAAM,UAAU,MAAM,UAAU,QAAQ;AACxC,UAAM,KAAK,MAAM,MAAM;AACvB,UAAM,KAAK,MAAM,KAAK,CAAC,EAAE,MAAM,aAAa,SAAS,QAAQ,GAAG,GAAG,IAAI,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,QAAuB;AAC3B,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AACF;;;ACDO,IAAM,oBAAN,MAAiD;AAAA,EAC7C,KAAK;AAAA,EACL,eAAe,EAAE,kBAAkB,OAAO,WAAW,MAAM;AAAA,EAC5D,QAAQ;AAAA,EAEhB,MAAM,SAAS,UAAqD;AAClE,SAAK,SAAS;AACd,WAAO;AAAA,MACL,MAAM,iBAAiB,KAAK,KAAK;AAAA,MACjC,WAAW,CAAC;AAAA,MACZ,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE;AAAA,IAC5C;AAAA,EACF;AACF;;;AC7BO,SAAS,gBAAyB;AACvC,SAAO,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,QAAQ,QAAQ;AACpD;AAEA,IAAM,IAAI;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AACP;AAEA,SAAS,MAAM,OAAuB,MAAc,IAAqB;AACvE,MAAI,CAAC,MAAM,UAAU,QAAS,QAAO;AACrC,SAAO,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK;AACrC;AAUO,SAAS,cAAc,eAA8C,WAAW,YAAkC,CAAC,GAAgB;AACxI,QAAM,EAAE,QAAQ,OAAO,IACrB,OAAO,iBAAiB,WACpB,EAAE,QAAQ,cAAc,QAAQ,UAAU,UAAU,cAAc,EAAE,IACpE,EAAE,QAAQ,aAAa,UAAU,WAAW,QAAQ,aAAa,UAAU,cAAc,EAAE;AACjG,QAAM,MAAM,CAAC,OAAuB,UAA0B,GAAG,MAAM,OAAO,GAAG,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC;AAC3G,SAAO;AAAA,IACL,QAAQ,CAAC,MAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ,EAAE,IAAI,KAAK,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,IACpF,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,UAAU,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;AAAA,IAC3E,cAAc,CAAC,MAAM,QAAQ,IAAI,IAAI,SAAS,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM;AAAA,IAChF,QAAQ,CAAC,MAAM,QAAQ,IAAI,IAAI,SAAS,MAAM,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE,IAAI;AAAA,IAC/E,SAAS,CAAC,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,IACtC,YAAY,CAAC,MAAM,QAAQ,OAAO,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,EACjE;AACF;AAGO,SAAS,SAAS,QAAgB,KAAc,QAAwB;AAC7E,QAAM,KAAK,UAAU,cAAc;AACnC,QAAM,UAAU,eAAe,QAAS,IAAI,SAAS,IAAI,UAAW,OAAO,GAAG;AAC9E,UAAQ,MAAM,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,GAAG,OAAO;AAC7D;;;ACzDA,SAAS,cAAc,MAA+B;AACpD,MAAI,CAAC,KAAK,OAAO,OAAQ,OAAM,IAAI,WAAW,uBAAuB,0CAA0C,KAAK;AACtH;AAGA,eAAe,cACb,MACA,OACA,OAAoE,CAAC,GACxC;AAC7B,gBAAc,IAAI;AAClB,QAAM,UAAyB,CAAC;AAChC,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC3C,SAAK,QAAQ,eAAe;AAC5B,SAAK,QAAQ,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC;AAC/C,UAAM,MAAM,MAAM,KAAK,OAAO,CAAC,EAAE,IAAI,SAAS,EAAE,QAAQ,KAAK,QAAQ,iBAAiB,KAAK,gBAAgB,CAAC;AAC5G,YAAQ,KAAK,GAAG;AAChB,cAAU,GAAG,KAAK;AAAA;AAAA,mBAAwB,KAAK,OAAO,CAAC,EAAE,IAAI;AAAA,EAAO,IAAI,IAAI;AAAA,EAC9E;AACA,SAAO,EAAE,UAAU,cAAc,SAAS,MAAM,QAAQ,GAAG,EAAE,GAAG,QAAQ,GAAG;AAC7E;AAGA,eAAe,YACb,MACA,OACA,OAAoE,CAAC,GACxC;AAC7B,gBAAc,IAAI;AAClB,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,eAAe,KAAK,OAAO,MAAM;AAChE,QAAM,UAAyB,IAAI,MAAM,KAAK,OAAO,MAAM;AAC3D,MAAI,OAAO;AACX,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,KAAK,OAAO,MAAM,EAAE,GAAG,YAAY;AACtF,eAAS;AACP,WAAK,QAAQ,eAAe;AAC5B,YAAM,IAAI;AACV,UAAI,KAAK,KAAK,OAAO,OAAQ;AAC7B,cAAQ,CAAC,IAAI,MAAM,KAAK,OAAO,CAAC,EAAE,IAAI,OAAO,EAAE,QAAQ,KAAK,QAAQ,iBAAiB,KAAK,gBAAgB,CAAC;AAAA,IAC7G;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,IAAI,OAAO;AACzB,SAAO,EAAE,UAAU,YAAY,SAAS,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE;AACxF;AAGA,eAAe,UACb,MACA,OACA,OAAoE,CAAC,GACxC;AAC7B,gBAAc,IAAI;AAClB,QAAM,cAAc,KAAK,eAAe,KAAK,OAAO,CAAC,EAAE;AACvD,QAAM,OAAO,KAAK,OAAO,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK,EAAE,EAAE,EAAE,KAAK,IAAI;AAChH,QAAM,OAAO,MAAM,YAAY,SAAS;AAAA,IACtC,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,kFAAkF;AAAA,MAC7G,EAAE,MAAM,QAAQ,SAAS;AAAA,EAAY,IAAI;AAAA;AAAA,WAAgB,KAAK,GAAG;AAAA,IACnE;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACD,QAAM,QAAQ,KAAK,KAAK,MAAM,KAAK;AACnC,QAAM,MAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,IAAI,OAAO;AAC3D,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO,QAAQ;AAClE,UAAM,IAAI,WAAW,mBAAmB,gCAAgC,KAAK,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,EAC5G;AACA,QAAM,MAAM,MAAM,KAAK,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,QAAQ,KAAK,QAAQ,iBAAiB,KAAK,gBAAgB,CAAC;AAC5G,SAAO,EAAE,UAAU,UAAU,SAAS,CAAC,GAAG,GAAG,MAAM,IAAI,MAAM,UAAU,IAAI;AAC7E;AAIA,eAAsB,gBACpB,MACA,OACA,cAC6B;AAC7B,QAAM,OAAmB,wBAAwB,cAAc,EAAE,QAAQ,aAAa,IAAK,gBAAgB,CAAC;AAC5G,UAAQ,KAAK,UAAU;AAAA,IACrB,KAAK;AACH,aAAO,cAAc,MAAM,OAAO,IAAI;AAAA,IACxC,KAAK;AACH,aAAO,YAAY,MAAM,OAAO,IAAI;AAAA,IACtC,KAAK;AACH,aAAO,UAAU,MAAM,OAAO,IAAI;AAAA,EACtC;AACF;;;AC9FA,SAAS,SAAS,OAAyC;AACzD,QAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAChD,MAAI,KAAK,SAAS,MAAM,OAAQ,OAAM,IAAI,WAAW,yBAAyB,oCAAoC,KAAK;AACvH,aAAW,KAAK,OAAO;AACrB,eAAW,OAAO,EAAE,aAAa,CAAC,GAAG;AACnC,UAAI,CAAC,KAAK,IAAI,GAAG,EAAG,OAAM,IAAI,WAAW,wBAAwB,SAAS,EAAE,EAAE,8BAA8B,GAAG,KAAK,KAAK;AACzH,UAAI,QAAQ,EAAE,GAAI,OAAM,IAAI,WAAW,kBAAkB,SAAS,EAAE,EAAE,uBAAuB,KAAK;AAAA,IACpG;AAAA,EACF;AAGA,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9F,QAAM,SAA2B,CAAC;AAClC,MAAI,QAAQ,MAAM,OAAO,CAAC,OAAO,SAAS,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC;AAC/D,SAAO,MAAM,QAAQ;AACnB,WAAO,KAAK,KAAK;AACjB,UAAM,OAAuB,CAAC;AAC9B,eAAW,KAAK,OAAO;AACrB,UAAI,CAAC,MAAM,SAAS,CAAC,EAAG;AACxB,iBAAW,KAAK,OAAO;AACrB,YAAI,EAAE,EAAE,aAAa,CAAC,GAAG,SAAS,EAAE,EAAE,EAAG;AACzC,iBAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,EAAE,KAAK,KAAK,CAAC;AAChD,YAAI,SAAS,IAAI,EAAE,EAAE,MAAM,EAAG,MAAK,KAAK,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,YAAQ;AAAA,EACV;AACA,MAAI,OAAO,KAAK,EAAE,WAAW,MAAM,QAAQ;AACzC,UAAM,IAAI,WAAW,kBAAkB,mCAAmC,KAAK;AAAA,EACjF;AACA,SAAO;AACT;AAEA,eAAe,aACb,MACA,KACA,QACA,iBACkB;AAClB,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,OAAO,YAAY,CAAC;AACtD,QAAM,YAAY,KAAK,OAAO,aAAa;AAC3C,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAQ,eAAe;AACvB,QAAI;AACF,aAAO,MAAM,KAAK,IAAI,KAAK,eAAe;AAAA,IAC5C,SAAS,KAAK;AACZ,UAAI,eAAe,gBAAgB,IAAI,SAAS,aAAc,OAAM;AACpE,aAAO;AACP,UAAI,IAAI,WAAW,KAAK,YAAY,EAAG,OAAM,MAAM,WAAW,MAAM;AAAA,IACtE;AAAA,EACF;AACA,QAAM;AACR;AAMA,eAAsB,YAAY,OAAuB,OAAwB,CAAC,GAAqC;AACrH,QAAM,MAA+B,CAAC;AACtC,aAAW,SAAS,SAAS,KAAK,GAAG;AACnC,SAAK,QAAQ,eAAe;AAC5B,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,MAAM,IAAI,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM,aAAa,GAAG,KAAK,KAAK,QAAQ,KAAK,eAAe,CAAC,CAAU;AAAA,IACvG;AACA,eAAW,CAAC,IAAI,KAAK,KAAK,QAAS,KAAI,EAAE,IAAI;AAAA,EAC/C;AACA,SAAO;AACT;;;ACxFA,SAAS,aAAgC;AACzC,SAAS,KAAAC,UAAS;AA+BlB,IAAI,SAAS;AAGN,SAAS,gBAAgB,QAAqD;AACnF,QAAM,OAAO,OAAO;AACpB,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAE9B,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,UAAU,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,EAAG,QAAOC,GAAE,KAAK,MAA+B;AAC9G,QAAI,OAAO,QAAQ;AACjB,YAAM,WAAW,OAAO,IAAI,CAAC,MAAMA,GAAE,QAAQ,CAA8C,CAAC;AAC5F,aAAO,SAAS,SAAS,IAAIA,GAAE,MAAM,QAAsE,IAAI,SAAS,CAAC;AAAA,IAC3H;AACA,WAAOA,GAAE,MAAM;AAAA,EACjB;AACA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAOA,GAAE,OAAO;AAAA,IAClB,KAAK;AACH,aAAOA,GAAE,OAAO;AAAA,IAClB,KAAK;AACH,aAAOA,GAAE,OAAO,EAAE,IAAI;AAAA,IACxB,KAAK;AACH,aAAOA,GAAE,QAAQ;AAAA,IACnB,KAAK;AACH,aAAOA,GAAE,KAAK;AAAA,IAChB,KAAK,SAAS;AACZ,YAAM,QAAQ,OAAO;AACrB,aAAOA,GAAE,MAAM,QAAQ,gBAAgB,KAAK,IAAIA,GAAE,QAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,KAAK,UAAU;AACb,YAAM,QAAS,OAAO,cAAc,CAAC;AACrC,YAAM,WAAW,IAAI,IAAK,OAAO,YAAY,CAAC,CAAc;AAC5D,YAAM,QAA4C,CAAC;AACnD,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,cAAM,QAAQ,gBAAgB,GAAG;AACjC,cAAM,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,SAAS;AAAA,MAC1D;AACA,aAAOA,GAAE,OAAO,KAAK,EAAE,YAAY;AAAA,IACrC;AAAA,IACA;AACE,aAAOA,GAAE,QAAQ;AAAA,EACrB;AACF;AAEA,eAAe,wBAAwB,KAAyC;AAC9E,QAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,MAAI,YAAY,SAAS,mBAAmB,GAAG;AAC7C,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI;AACJ,eAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,YAAM,IAAI,KAAK,KAAK;AACpB,UAAI,CAAC,EAAE,WAAW,OAAO,EAAG;AAC5B,YAAM,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK;AAChC,UAAI,YAAY,SAAU;AAC1B,UAAI;AACF,cAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAI,IAAI,OAAO,UAAa,IAAI,WAAW,UAAa,IAAI,MAAO,QAAO;AAAA,MAC5E,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAM,OAAM,IAAI,WAAW,gBAAgB,sCAAsC,IAAI;AAC1F,WAAO;AAAA,EACT;AACA,SAAQ,MAAM,IAAI,KAAK;AACzB;AAEA,SAAS,SAAS,KAAsB,MAAuB;AAC7D,MAAI,IAAI,MAAO,OAAM,IAAI,WAAW,aAAa,OAAO,IAAI,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK;AAC/G,SAAO,IAAI;AACb;AAGO,IAAM,gBAAN,MAAoB;AAAA,EAChB;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EAEpB,YAAY,KAAa,OAAiD,CAAC,GAAG;AAC5E,SAAK,MAAM,IAAI,QAAQ,OAAO,EAAE;AAChC,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,UAAU,KAAK,WAAW,CAAC;AAChC,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,aAAa,KAAK,cAAc;AAAA,EACvC;AAAA,EAEA,MAAc,IAAI,QAAgB,QAAoC;AACpE,WAAO,KAAK,SAAS,QAAQ,QAAQ,IAAI;AAAA,EAC3C;AAAA;AAAA,EAGA,MAAc,OAAO,QAAgB,QAAiC;AACpE,UAAM,KAAK,SAAS,QAAQ,QAAQ,KAAK;AAAA,EAC3C;AAAA,EAEA,MAAc,SAAS,QAAgB,QAA6B,QAAmC;AACrG,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,QAAQ,KAAK,KAAK;AAAA,QACjC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,GAAI,KAAK,YAAY,EAAE,kBAAkB,KAAK,UAAU,IAAI,CAAC;AAAA,UAC7D,GAAG,KAAK;AAAA,QACV;AAAA,QACA,MAAM,KAAK;AAAA,UACT,SAAS,EAAE,SAAS,OAAO,IAAI,EAAE,QAAQ,QAAQ,QAAQ,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,OAAO,QAAQ,QAAQ,UAAU,CAAC,EAAE;AAAA,QAC3H;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,iBAAiB,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,IAAI;AAAA,IACvH;AACA,UAAM,UAAU,IAAI,QAAQ,IAAI,gBAAgB;AAChD,QAAI,QAAS,MAAK,YAAY;AAC9B,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,WAAW,iBAAiB,YAAY,IAAI,MAAM,IAAI,IAAI,UAAU,GAAG;AAC9F,QAAI,CAAC,QAAQ;AAGX,YAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC/B,aAAO;AAAA,IACT;AACA,WAAO,SAAS,MAAM,wBAAwB,GAAG,GAAG,MAAM;AAAA,EAC5D;AAAA,EAEA,MAAM,UAAuD;AAC3D,UAAM,SAAU,MAAM,KAAK,IAAI,cAAc;AAAA,MAC3C,iBAAiB;AAAA,MACjB,cAAc,CAAC;AAAA,MACf,YAAY,EAAE,MAAM,KAAK,YAAY,SAAS,QAAQ;AAAA,IACxD,CAAC;AACD,UAAM,KAAK,OAAO,6BAA6B,CAAC,CAAC,EAAE,MAAM,MAAM,MAAS;AACxE,SAAK,YAAY;AACjB,WAAO,EAAE,MAAM,OAAO,YAAY,QAAQ,KAAK,UAAU,SAAS,OAAO,YAAY,QAAQ;AAAA,EAC/F;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,WAAW,qBAAqB,wBAAwB,KAAK;AAAA,EAC9F;AAAA,EAEA,MAAM,YAAmC;AACvC,SAAK,iBAAiB;AACtB,UAAM,SAAU,MAAM,KAAK,IAAI,YAAY;AAC3C,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAS,MAAc,MAAiC;AAC5D,SAAK,iBAAiB;AACtB,UAAM,SAAU,MAAM,KAAK,IAAI,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC,EAAE,CAAC;AAI5E,UAAM,QAAQ,OAAO,WAAW,CAAC,GAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EACvB,KAAK,IAAI;AACZ,QAAI,OAAO,QAAS,OAAM,IAAI,WAAW,kBAAkB,aAAa,IAAI,aAAa,IAAI,IAAI,KAAK;AACtG,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AACF;AAGO,IAAM,iBAAN,MAAqB;AAAA,EAO1B,YACU,SACA,OAAiB,CAAC,GAC1B,OAAmD,CAAC,GACpD;AAHQ;AACA;AAGR,SAAK,WAAW,KAAK,YAAY,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG,KAAK;AACrE,SAAK,aAAa,KAAK,cAAc;AAAA,EACvC;AAAA,EANU;AAAA,EACA;AAAA,EARD;AAAA,EACD;AAAA,EACA,SAAS;AAAA,EACT,UAAU,oBAAI,IAAqD;AAAA,EACnE;AAAA,EAWR,MAAM,UAAyB;AAC7B,QAAI;AACF,WAAK,QAAQ,MAAM,KAAK,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACnF,SAAS,KAAK;AACZ,YAAM,IAAI,WAAW,iBAAiB,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,KAAK;AAAA,IAC7H;AACA,QAAI,CAAC,KAAK,MAAM,UAAU,CAAC,KAAK,MAAM,OAAO;AAC3C,YAAM,IAAI,WAAW,iBAAiB,+BAA+B,KAAK;AAAA,IAC5E;AACA,SAAK,MAAM,GAAG,SAAS,CAAC,QAAQ;AAC9B,iBAAW,CAAC,EAAE,OAAO,KAAK,KAAK,SAAS;AACtC,gBAAQ,EAAE,SAAS,OAAO,OAAO,EAAE,MAAM,OAAQ,SAAS,sBAAsB,IAAI,OAAO,GAAG,EAAE,CAAC;AAAA,MACnG;AACA,WAAK,QAAQ,MAAM;AAAA,IACrB,CAAC;AAGD,SAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACtC,iBAAW,CAAC,EAAE,OAAO,KAAK,KAAK,SAAS;AACtC,gBAAQ,EAAE,SAAS,OAAO,OAAO,EAAE,MAAM,OAAQ,SAAS,2BAA2B,QAAQ,MAAM,YAAY,UAAU,MAAM,IAAI,EAAE,CAAC;AAAA,MACxI;AACA,WAAK,QAAQ,MAAM;AAAA,IACrB,CAAC;AACD,SAAK,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAC9C,WAAK,UAAU,MAAM,SAAS,MAAM;AACpC,YAAM,QAAQ,KAAK,OAAO,MAAM,IAAI;AACpC,WAAK,SAAS,MAAM,IAAI,KAAK;AAC7B,iBAAW,QAAQ,OAAO;AACxB,cAAM,IAAI,KAAK,KAAK;AACpB,YAAI,CAAC,EAAG;AACR,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,CAAC;AACxB,cAAI,IAAI,OAAO,OAAW,MAAK,QAAQ,IAAI,IAAI,EAAE,IAAI,GAAG;AAAA,QAC1D,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,SAAU,MAAM,KAAK,QAAQ,cAAc;AAAA,MAC/C,iBAAiB;AAAA,MACjB,cAAc,CAAC;AAAA,MACf,YAAY,EAAE,MAAM,KAAK,YAAY,SAAS,QAAQ;AAAA,IACxD,CAAC;AACD,SAAK;AAAA,EACP;AAAA,EAEQ,QAAQ,QAAgB,QAAmC;AACjE,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAI,CAAC,KAAK,OAAO,OAAO;AACtB,eAAO,IAAI,WAAW,qBAAqB,wBAAwB,KAAK,CAAC;AACzE;AAAA,MACF;AACA,YAAM,KAAK,EAAE;AACb,WAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ;AAC5B,aAAK,QAAQ,OAAO,EAAE;AACtB,YAAI;AACF,UAAAA,SAAQ,SAAS,KAAK,MAAM,CAAC;AAAA,QAC/B,SAAS,KAAK;AACZ,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,CAAC;AACD,WAAK,MAAM,MAAM,MAAM,GAAG,KAAK,UAAU,EAAE,SAAS,OAAO,IAAI,QAAQ,OAAO,CAAC,CAAC;AAAA,GAAM,CAAC,QAAQ;AAC7F,YAAI,KAAK;AACP,eAAK,QAAQ,OAAO,EAAE;AACtB,iBAAO,IAAI,WAAW,iBAAiB,2BAA2B,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,QACxF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAmC;AACvC,UAAM,SAAU,MAAM,KAAK,QAAQ,cAAc,CAAC,CAAC;AACnD,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAS,MAAc,MAAiC;AAC5D,UAAM,SAAU,MAAM,KAAK,QAAQ,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC,EAAE,CAAC;AAIhF,UAAM,QAAQ,OAAO,WAAW,CAAC,GAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EACvB,KAAK,IAAI;AACZ,QAAI,OAAO,QAAS,OAAM,IAAI,WAAW,kBAAkB,aAAa,IAAI,aAAa,IAAI,IAAI,KAAK;AACtG,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,OAAO,KAAK;AACjB,SAAK,QAAQ;AAGb,eAAW,CAAC,EAAE,OAAO,KAAK,KAAK,SAAS;AACtC,cAAQ,EAAE,SAAS,OAAO,OAAO,EAAE,MAAM,OAAQ,SAAS,oBAAoB,EAAE,CAAC;AAAA,IACnF;AACA,SAAK,QAAQ,MAAM;AAAA,EACrB;AACF;AAYA,eAAsB,oBAAoB,QAAmB,MAAsC;AACjG,QAAM,OAAO,QAAS,MAAM,OAAO,UAAU;AAC7C,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,KAAK,IAAI,CAAC,MAAM;AACrB,UAAM,OAAO,KAAK,IAAI,EAAE,IAAI,IAAI,GAAG,OAAO,QAAQ,IAAI,EAAE,IAAI,KAAK,EAAE;AACnE,SAAK,IAAI,EAAE,IAAI;AACf,WAAO,WAAW;AAAA,MAChB;AAAA,MACA,aAAa,EAAE,eAAe,YAAY,EAAE,IAAI,SAAS,OAAO,QAAQ;AAAA,MACxE,QAAQ,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAAA,MAC3D,SAAS,OAAO,SAAkB,OAAO,SAAS,EAAE,MAAM,IAAI;AAAA,IAChE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,eAAe,KAAa,MAAiD;AACjG,QAAM,SAAS,IAAI,cAAc,KAAK,IAAI;AAC1C,QAAM,OAAO,QAAQ;AACrB,SAAO;AACT;AAEA,eAAsB,gBAAgB,SAAiB,OAAiB,CAAC,GAA4B;AACnG,QAAM,SAAS,IAAI,eAAe,SAAS,IAAI;AAC/C,QAAM,OAAO,QAAQ;AACrB,SAAO;AACT;;;AC/VA,SAAS,gBAAAC,qBAAoB;AAStB,SAAS,aAAa,MAAc,UAAkB,UAAU,SAAyB;AAC9F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AACX,aAAO,SAAS,QAAQ,wBAAwB,CAAC,GAAG,QAAgB;AAClE,YAAI,EAAE,OAAO,MAAO,OAAM,IAAI,MAAM,uBAAuB,GAAG,aAAa,IAAI,GAAG;AAClF,eAAO,OAAO,KAAK,GAAG,CAAC;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,eAAe,MAA8B;AAC3D,QAAM,OAAOA,cAAa,MAAM,MAAM;AAEtC,QAAM,MAAM,KAAK,WAAW,QAAG,IAAI,KAAK,MAAM,CAAC,IAAI;AACnD,QAAM,QAAQ,IAAI,MAAM,6CAA6C;AACrE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,8CAA8C,IAAI,EAAE;AAChF,QAAM,OAA+B,CAAC;AACtC,aAAW,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG;AACvC,UAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,QAAI,IAAI,EAAG,MAAK,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAAA,EAChG;AACA,MAAI,CAAC,KAAK,KAAM,OAAM,IAAI,MAAM,uCAAuC,IAAI,EAAE;AAC7E,SAAO,aAAa,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,WAAW,OAAO;AACzE;AAGO,SAAS,UACd,UACA,MACgB;AAChB,MAAI,MAAM;AACR,UAAM,QAAQ,SAAS,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,EAAE,IAAI,IAAI,EAAE,OAAO,KAAK,EAAE,UAAU,QAAQ,EAAE,SAAS,IAAI;AAC9G,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,2BAA2B,IAAI,EAAE;AAC7D,WAAO,aAAa,MAAM,MAAM,MAAM,UAAU,MAAM,OAAO;AAAA,EAC/D;AACA,QAAM,QAAQ,SAAS,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,IAAI,CAAC;AAC9D,MAAI,OAAO,KAAK,OAAO,IAAI;AAC3B,aAAW,KAAK,UAAU;AACxB,YAAQ,EAAE,UAAU;AACpB,QAAI,QAAQ,EAAG,QAAO,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;AAAA,EAClE;AACA,QAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,SAAO,aAAa,KAAK,MAAM,KAAK,UAAU,KAAK,OAAO;AAC5D;;;AC8bA,SAAS,KAAAC,WAAS;;;AC3flB,SAAS,KAAAC,UAAS;AA4ClB,IAAM,mBAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AACV;AAEO,IAAM,sBAAN,MAA0B;AAAA,EACtB;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,MAA2B;AACrC,SAAK,WAAW,KAAK,SAAS,QAAQ,OAAO,EAAE;AAC/C,SAAK,kBAAkB,KAAK,kBAAkB,KAAK,UAAU,QAAQ,OAAO,EAAE;AAC9E,SAAK,WAAW,EAAE,GAAG,kBAAkB,GAAG,KAAK,SAAS;AACxD,SAAK,eAAe,KAAK,WAAW,CAAC;AACrC,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,aAAa,KAAK,IAAI,GAAG,KAAK,cAAc,CAAC;AAClD,SAAK,OAAO,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,aAAa,OAAuB;AAClC,UAAM,eAAe,OAAO,QAAQ,KAAK,QAAQ,EAC9C,IAAI,CAAC,CAAC,QAAQ,GAAG,MAAM,UAAU,MAAM,MAAM,GAAG,GAAG,EACnD,KAAK,IAAI;AACZ,WAAO,GAAG,YAAY;AAAA,EAAK,KAAK;AAAA,EAClC;AAAA,EAEQ,QAAQ,QAAgC,CAAC,GAA2B;AAC1E,UAAM,MAA8B,EAAE,GAAG,OAAO,GAAG,KAAK,aAAa;AAGrE,QAAI,YAAY,MAAM;AACtB,QAAI,CAAC,KAAK,KAAM,QAAO;AACvB,QAAI,KAAK,KAAK,SAAS,SAAS;AAC9B,UAAI,gBAAgB,SAAS,OAAO,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,EAAE,SAAS,QAAQ,CAAC;AAAA,IACxG,WAAW,KAAK,KAAK,SAAS,UAAU;AACtC,UAAI,gBAAgB,UAAU,KAAK,KAAK,KAAK;AAAA,IAC/C,OAAO;AACL,UAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,KACZ,KACA,aACA,MACA,QACmB;AACnB,QAAI;AACJ,QAAI;AACJ,aAAS,UAAU,GAAG,WAAW,KAAK,YAAY,WAAW;AAC3D,UAAI,UAAU,GAAG;AAGf,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,gBAAgB,KAAK,IAAI,MAAO,MAAM,UAAU,IAAI,GAAK,CAAC,CAAC;AAAA,MACpG;AACA,UAAI;AACJ,UAAI;AACF,cAAM,MAAM,KAAK,QAAQ,KAAK;AAAA,UAC5B,QAAQ;AAAA,UACR,SAAS,KAAK,QAAQ,EAAE,gBAAgB,aAAa,OAAO,CAAC;AAAA,UAC7D;AAAA,UACA,QAAQ,YAAY,QAAQ,KAAK,SAAS;AAAA,QAC5C,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,oBAAY,IAAI;AAAA,UACd;AAAA,UACA,0BAA0B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UAC1E;AAAA,QACF;AACA,uBAAe;AACf;AAAA,MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,cAAM,YAAY,IAAI,WAAW,OAAO,IAAI,UAAU;AACtD,cAAM,MAAM,IAAI;AAAA,UACd;AAAA,UACA,GAAG,GAAG,SAAS,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,UAChD;AAAA,QACF;AACA,cAAM,mBAAmB,OAAO,SAAS,IAAI,QAAQ,IAAI,aAAa,KAAK,IAAI,EAAE;AACjF,uBAAe,OAAO,SAAS,gBAAgB,IAAI,KAAK,IAAI,mBAAmB,KAAM,GAAK,IAAI;AAC9F,YAAI,CAAC,aAAa,YAAY,KAAK,WAAY,OAAM;AACrD,oBAAY;AACZ;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,IAAI,WAAW,iBAAiB,kBAAkB,IAAI;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAAqC;AAChD,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,KAAK,aAAa,KAAK;AAAA,MACvB;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,aAAQ,MAAM,IAAI,KAAK;AAAA,IACzB,SAAS,KAAK;AAEZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA,sEAAsE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACtH;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAO,KAAK,MAAM,QAAQ,CAAC;AACjC,UAAM,WAAW,KAAK,SAAS,YAAY,CAAC;AAC5C,WAAO,SAAS,IAAI,CAAC,MAAM;AACzB,YAAM,MAAiB,CAAC;AACxB,iBAAW,KAAK,KAAM,KAAI,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS;AAC9C,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAA8B;AACzC,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA,KAAK,aAAa,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,iBAAiB,SAA8B,OAAkC,CAAC,GAAS;AACzG,MAAI,CAAC,KAAK,aAAa;AACrB,WAAO,WAAW;AAAA,MAChB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQC,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK,EAAE,CAAC;AAAA,MACxD,SAAS,OAAO,EAAE,MAAM,MAAyB,QAAQ,OAAO,KAAK;AAAA,IACvE,CAAC;AAAA,EACH;AACA,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK,GAAG,QAAQA,GAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,IAC5F,SAAS,OAAO,EAAE,OAAO,OAAO,MAA2C;AACzE,UAAI,QAAQ;AACV,cAAM,QAAQ,OAAO,KAAK;AAC1B,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AACA,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AACH;;;AC3NA,SAAS,KAAAC,WAAS;AAmBX,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,UAAU,oBAAI,IAAI,CAAC,cAAc,sCAAsC,CAAC;AAGvE,IAAM,kBAA0C;AAAA,EACrD,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AACN;AAWO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,OAAmB;AAAnB;AAAA,EAAoB;AAAA,EAApB;AAAA;AAAA,EAGpB,MAAc,eAA6C;AACzD,UAAM,SAAS,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,SAAS,CAAC;AAC/F,UAAM,SAAS,oBAAI,IAAoB;AACvC,UAAM,OAAO,CAAC,MAAsB;AAClC,UAAI,OAAO;AACX,aAAO,OAAO,IAAI,IAAI,MAAM,QAAQ,OAAO,IAAI,IAAI,EAAG,QAAO,OAAO,IAAI,IAAI;AAC5E,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,CAAC,GAAW,MAAoB;AAC5C,YAAM,KAAK,KAAK,CAAC;AACjB,YAAM,KAAK,KAAK,CAAC;AACjB,UAAI,OAAO,GAAI,QAAO,IAAI,IAAI,EAAE;AAAA,IAClC;AACA,eAAW,KAAK,OAAO;AACrB,UAAI,CAAC,OAAO,IAAI,EAAE,OAAO,EAAG,QAAO,IAAI,EAAE,SAAS,EAAE,OAAO;AAC3D,UAAI,CAAC,OAAO,IAAI,EAAE,MAAM,EAAG,QAAO,IAAI,EAAE,QAAQ,EAAE,MAAM;AACxD,YAAM,EAAE,SAAS,EAAE,MAAM;AAAA,IAC3B;AACA,UAAM,iBAAiB,oBAAI,IAAoB;AAC/C,eAAW,UAAU,OAAO,KAAK,EAAG,gBAAe,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC3E,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAK,SAAiB,IAAI,GAA4B;AAC1D,UAAM,SAAS,QAAQ,KAAK,EAAE,YAAY;AAC1C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AACrD,UAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,UAAM,SAAS,oBAAI,IAAoB;AACvC,UAAM,aAAa,oBAAI,IAAoB;AAE3C,UAAM,aAA+D,CAAC;AACtE,eAAW,KAAK,OAAO;AAErB,YAAM,YAAY,UAAU,EAAE,OAAO;AACrC,YAAM,WAAW,EAAE,QAAQ,SAAS,GAAG,KAAK,EAAE,QAAQ,SAAS,GAAG,IAAI,EAAE,QAAQ,MAAM,MAAM,EAAE,IAAI,KAAK,KAAK;AAC5G,UAAI,cAAc,OAAQ,YAAW,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,GAAG,CAAC;AAAA,eAC9D,UAAU,WAAW,MAAM,EAAG,YAAW,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,GAAG,CAAC;AAAA,eAC3E,SAAS,YAAY,MAAM,OAAQ,YAAW,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,GAAG,CAAC;AAEzF,UAAI,iBAAiB,IAAI,EAAE,SAAS,GAAG;AACrC,cAAM,QAAQ,aAAa,EAAE,MAAM,EAAE,YAAY;AACjD,cAAM,QAAQ,EAAE,UAAU,SAAS,UAAU,IAAI,IAAI,EAAE,UAAU,SAAS,WAAW,IAAI,IAAI;AAC7F,YAAI,UAAU,OAAQ,YAAW,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,aAAa,EAAE,MAAM,GAAG,OAAO,IAAI,CAAC;AAAA,iBAC1F,MAAM,WAAW,MAAM,EAAG,YAAW,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,CAAC;AAAA,iBACtG,MAAM,SAAS,MAAM,EAAG,YAAW,KAAK,EAAE,KAAK,EAAE,SAAS,OAAO,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,CAAC;AAE7G,cAAM,OAAO,WAAW,IAAI,EAAE,OAAO;AACrC,YAAI,SAAS,UAAa,QAAQ,MAAM;AACtC,iBAAO,IAAI,EAAE,SAAS,aAAa,EAAE,MAAM,CAAC;AAC5C,qBAAW,IAAI,EAAE,SAAS,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,SAAS,oBAAI,IAA0B;AAC7C,eAAW,KAAK,YAAY;AAC1B,YAAM,MAAM,UAAU,IAAI,EAAE,GAAG,KAAK,EAAE;AACtC,YAAM,WAAW,OAAO,IAAI,GAAG;AAC/B,UAAI,UAAU;AACZ,iBAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,EAAE,KAAK;AACjD,YAAI,EAAE,SAAS,CAAC,SAAS,MAAO,UAAS,QAAQ,EAAE;AACnD,YAAI,CAAC,SAAS,YAAY,SAAS,EAAE,GAAG,EAAG,UAAS,YAAY,KAAK,EAAE,GAAG;AAAA,MAC5E,OAAO;AACL,eAAO,IAAI,KAAK;AAAA,UACd,KAAK;AAAA,UACL,OAAO,EAAE,SAAS,OAAO,IAAI,GAAG;AAAA,UAChC,OAAO,EAAE;AAAA,UACT,aAAa,CAAC,EAAE,KAAK,GAAI,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAE;AAAA,QACtD,CAAC;AAAA,MACH;AAAA,IACF;AACA,eAAW,SAAS,OAAO,OAAO,GAAG;AACnC,YAAM,UAAU,OAAO,IAAI,MAAM,GAAG;AACpC,UAAI,MAAM,YAAY,SAAS,GAAG;AAChC,cAAM,UAAU,CAAC,GAAG,UAAU,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,UAAU,IAAI,MAAM,GAAG,CAAC;AACjG,YAAI,QAAQ,SAAS,EAAG,OAAM,cAAc;AAAA,MAC9C;AAAA,IACF;AACA,WAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC;AAAA,EACf;AACF;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,IAAI,KAAK,MAAM,uCAAuC;AAC5D,SAAO,IAAI,EAAE,CAAC,IAAI;AACpB;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,OAAO,IAAI,MAAM,OAAO,EAAE,IAAI,KAAK;AACzC,SAAO,KAAK,YAAY;AAC1B;AAGO,SAAS,eAAe,QAAsB;AACnD,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aACE;AAAA,IACF,QAAQC,IAAE,OAAO,EAAE,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,GAAGA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,IACvG,SAAS,OAAO,EAAE,SAAS,EAAE,MAAuC,OAAO,KAAK,SAAS,CAAC;AAAA,EAC5F,CAAC;AACH;AAmCO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAoB,OAAgC,CAAC,GAAG;AAApC;AAAA,EAAqC;AAAA,EAArC;AAAA,EAHZ,MAAM;AAAA,EACN,QAAQ,oBAAI,IAA6B;AAAA;AAAA,EAKjD,IAAI,WAAoB;AACtB,WAAO,KAAK,KAAK,aAAa,SAAS,CAAC,CAAC,KAAK,KAAK;AAAA,EACrD;AAAA,EAEA,MAAc,OAAO,UAA2B,OAAkC;AAEhF,UAAM,MAAM,IAAI;AAAA,MACd;AAAA,QACE,SAAS,SAAS;AAAA,QAClB,WAAW;AAAA,QACX,QAAQ,IAAI,SAAS,IAAI;AAAA,QACzB,QAAQ,SAAS;AAAA,QACjB,aAAa,WAAW,SAAS,EAAE;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,MAAc,IAAY,QAA0C;AAChF,UAAM,WAAW,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE;AAAA,MACxC,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,OAAO,OAAO,EAAE,WAAW,aAAc,KAAK,YAAY,EAAE,WAAW;AAAA,IACrG;AACA,QAAI,SAAU,QAAO;AACrB,UAAM,WAA4B;AAAA,MAChC,IAAI,OAAO,EAAE,KAAK,GAAG;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC;AACA,QAAI,KAAK,YAAY,KAAK,KAAK,OAAO;AACpC,YAAM,KAAK,OAAO,UAAU,KAAK,KAAK,KAAK;AAC3C,eAAS,SAAS;AAClB,eAAS,sBAAsB;AAAA,IACjC;AACA,SAAK,MAAM,IAAI,SAAS,IAAI,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,QAAuD;AAC1D,WAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,MAAM;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,OAAO,OAAmB,IAAY,UAAiE;AAC3G,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAClC,QAAI,CAAC,YAAY,SAAS,WAAW,UAAW,QAAO;AACvD,aAAS,SAAS;AAClB,QAAI,aAAa,YAAY;AAC3B,YAAM,KAAK,OAAO,UAAU,KAAK;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,WAA6B;AAC9D,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,IAAE,OAAO;AAAA,MACf,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MAC/B,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MAC7B,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,wCAAwC;AAAA,IAC7E,CAAC;AAAA,IACD,SAAS,OAAO,EAAE,MAAM,IAAI,OAAO,MAAoD;AACrF,UAAI;AACJ,UAAI;AACF,YAAI,MAAM,UAAU,QAAQ,MAAM,IAAI,MAAM;AAAA,MAC9C,SAAS,KAAK;AAGZ,eAAO,yCAAoC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC7F;AACA,aAAO,EAAE,sBACL,EAAE,IAAI,EAAE,IAAI,QAAQ,YAAY,WAAW,KAAK,IAChD,EAAE,IAAI,EAAE,IAAI,QAAQ,WAAW,MAAM,uDAAuD;AAAA,IAClG;AAAA,EACF,CAAC;AACH;AAaA,SAAS,WAAW,MAAc,UAAsD;AACtF,QAAM,IAAI,KAAK,MAAM,yBAAyB;AAC9C,QAAM,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,IAAI;AAClC,MAAI,KAAK,KAAM,QAAO,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;AACpC,MAAI,eAAe,KAAK,IAAI,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,UAA0C;AACzE,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,QAAI,IAAI,WAAW,IAAI,EAAG,QAAO,GAAG,MAAM,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC;AAAA,EACtE;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,UAA+C;AACjF,QAAM,MAAM,WAAW,MAAM,QAAQ;AACrC,MAAI,IAAK,QAAO,EAAE,OAAO,IAAI;AAC7B,QAAM,OAAO,KAAK,MAAM,mBAAmB;AAC3C,MAAI,KAAM,QAAO,EAAE,UAAU,KAAK,CAAC,GAAG,aAAa,KAAK,CAAC,EAAE;AAC3D,QAAM,QAAQ,KAAK,MAAM,8BAA8B;AACvD,MAAI,OAAO;AACT,UAAM,OAAO,WAAW,MAAM,CAAC,GAAG,QAAQ,KAAK,MAAM,CAAC;AACtD,WAAO,EAAE,UAAU,MAAM,CAAC,GAAG,SAAS,KAAK;AAAA,EAC7C;AACA,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,MAAI,MAAO,QAAO,EAAE,UAAU,MAAM,CAAC,EAAE;AACvC,MAAI,kBAAkB,KAAK,IAAI,KAAK,iBAAiB,KAAK,IAAI,EAAG,QAAO,EAAE,UAAU,KAAK;AACzF,SAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,SAAS,aAAa,OAAgD,UAAsD;AAC1H,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,UAAM,SAAS,OAAO,KAAK;AAC3B,WAAO,kBAAkB,KAAK,MAAM,KAAK,WAAW,UAAU,WAAW,UAAU,SAAS,IAAI,MAAM;AAAA,EACxG;AACA,MAAI,MAAM,KAAK,EAAG,QAAO,WAAW,MAAM,KAAK,GAAG,QAAQ;AAC1D,MAAI,MAAM,QAAQ,MAAM,QAAW;AACjC,QAAI,MAAM,WAAW,EAAG,QAAO,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,WAAW,CAAC;AACzE,QAAI,MAAM,OAAO,GAAG;AAClB,YAAM,OAAO,WAAW,MAAM,OAAO,GAAG,QAAQ;AAChD,aAAO,IAAI,MAAM,QAAQ,CAAC,MAAM,IAAI;AAAA,IACtC;AACA,WAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,EAC5B;AACA,SAAO;AACT;AASO,SAAS,cAAc,OAAe,WAAmC,iBAA0C;AACxH,QAAM,UAAU,oBAAI,IAAoB;AACxC,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,EAAE,SAAS;AACrB,YAAQ,IAAI,GAAG,CAAC,GAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC;AAAA,EAC/C;AACA,QAAM,aAAa,CAAC,UAA6C;AAC/D,UAAM,QAAQ,oBAAI,IAAqC;AACvD,UAAM,SAAS,CAAC,OAAwC;AACtD,UAAI,IAAI,MAAM,IAAI,EAAE;AACpB,UAAI,CAAC,GAAG;AACN,YAAI,EAAE,OAAO,WAAW,IAAI,QAAQ,KAAK,GAAG;AAC5C,cAAM,IAAI,IAAI,CAAC;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AACA,eAAW,KAAK,OAAO;AACrB,YAAM,OAAO,OAAO,EAAE,OAAO;AAC7B,UAAI,EAAE,cAAc,cAAc,EAAE,cAAc,KAAK;AACrD,cAAMC,YAAW,KAAK,OAAO;AAC7B,cAAM,UAAU,WAAW,EAAE,QAAQ,QAAQ,KAAK,EAAE;AACpD,aAAK,OAAO,IAAI,MAAM,QAAQA,SAAQ,IAAI,CAAC,GAAGA,WAAU,OAAO,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAIA,YAAW,CAACA,WAAU,OAAO,IAAI;AAC5I;AAAA,MACF;AACA,YAAM,MAAM,WAAW,EAAE,WAAW,QAAQ,KAAK,EAAE;AACnD,YAAM,QAAQ,aAAa,EAAE,QAAQ,QAAQ;AAC7C,YAAM,WAAW,KAAK,GAAG;AACzB,WAAK,GAAG,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,UAAU,KAAK,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI;AAAA,IAC9F;AACA,WAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAAA,EAC3B;AACA,QAAM,eAA0B,CAAC;AACjC,aAAW,CAAC,GAAG,KAAK,KAAK,SAAS;AAChC,UAAM,QAAQ,WAAW,KAAK;AAC9B,QAAI,MAAM,GAAI,cAAa,KAAK,GAAG,KAAK;AAAA,QACnC,cAAa,KAAK,EAAE,OAAO,WAAW,GAAG,QAAQ,KAAK,GAAG,UAAU,MAAM,CAAC;AAAA,EACjF;AACA,SAAO,EAAE,YAAY,UAAU,UAAU,aAAa;AACxD;AAGO,SAAS,cACd,KACA,WAAmC,iBACuC;AAC1E,QAAM,MAAgF,CAAC;AACvF,MAAI,QAAQ;AACZ,QAAM,cAAc,CAAC,MAA+B,cAAwC;AAC1F,UAAM,aAAa,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI,MAAM,WAAW,OAAO,KAAK,KAAK,CAAC,GAAG,QAAQ,IAAI,MAAM,OAAO;AACtH,UAAM,QAAQ,KAAK,OAAO;AAC1B,eAAW,KAAK,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC,GAAG;AACnE,UAAI,KAAK,EAAE,SAAS,WAAW,WAAW,YAAY,QAAQ,WAAW,OAAO,CAAC,GAAG,QAAQ,GAAG,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,IAC7I;AACA,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC7C,UAAI,QAAQ,SAAS,QAAQ,QAAS;AACtC,YAAM,YAAY,WAAW,IAAI,SAAS,GAAG,IAAI,WAAW,KAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ;AACjG,iBAAW,KAAK,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG;AAChD,cAAM,SAAS,aAAa,GAA2B,QAAQ;AAC/D,YAAI,WAAW,OAAW,KAAI,KAAK,EAAE,SAAS,WAAW,WAAW,QAAQ,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,MAC1H;AAAA,IACF;AAAA,EACF;AACA,aAAW,SAAS,IAAI,QAAQ,KAAK,CAAC,GAAG;AACvC,QAAI,SAAS,OAAO,UAAU,YAAY,MAAM,QAAS,MAAkC,QAAQ,CAAC,GAAG;AACrG,YAAM,QAAQ;AACd,YAAM,YAAY,MAAM,KAAK,IAAI,WAAW,MAAM,KAAK,GAAG,QAAQ,IAAI,MAAM,IAAI,MAAM;AACtF,iBAAW,QAAQ,MAAM,QAAQ,EAAG,aAAY,MAAM,SAAS;AAC/D;AAAA,IACF;AACA,gBAAY,OAAkC,MAAS;AAAA,EACzD;AACA,SAAO;AACT;;;AChYA,eAAsB,eACpB,OACA,SAC4B;AAC5B,QAAM,UAA+B,CAAC;AACtC,QAAM,SAAS,OAAO,OAAyBC,aAAmC;AAChF,QAAI,MAAM,KAAK;AACb,YAAM,OAAO,MAAM,cAAc,OAAO,MAAM,GAAG;AACjD,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,KAAK,KAAK,UAAU,QAAQ,MAAM,WAAW,QAAQ,KAAK,UAAU,MAAM;AAChF,cAAQ,KAAK;AAAA,QACX,IAAI,MAAM;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,GAAG,KAAK,MAAM,sBAAsB,GAAG,GAAG,MAAM,WAAW,OAAO,KAAK,QAAQ,MAAM,OAAO,EAAE;AAAA,MACxG,CAAC;AACD;AAAA,IACF;AACA,QAAI,MAAM,OAAO;AAGf,YAAM,UAAU,IAAI,mBAAmB,EAAE,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC;AAChE,YAAM,OAAO,QAAQ,YAAYA,QAAO,EAAE;AAC1C,cAAQ,KAAK;AAAA,QACX,IAAI,MAAM;AAAA,QACV,QAAQ,KAAK,WAAW;AAAA,QACxB,QAAQ,KAAK,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;AAAA,MAChE,CAAC;AACD;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACT,IAAI,MAAM;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,kCAAkC,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,EAAE;AAAA,IACpF,CAAC;AAAA,EACL;AACA,QAAM,UAAU,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAClD,aAAW,SAAS,SAAS;AAC3B,QAAI;AACF,YAAM,OAAO,OAAO,OAAO;AAAA,IAC7B,SAAS,KAAK;AACZ,cAAQ,KAAK,EAAE,IAAI,MAAM,IAAI,QAAQ,OAAO,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IACxG;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;AAC3D;AA0CA,SAAS,QAAQ,GAAmE;AAClF,SAAO,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM;AAChD;AAGO,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,YAAY,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,eAAsB,YACpB,UACA,MACA,OAA2H,CAAC,GAClG;AAC1B,QAAM,SAA0B;AAAA,IAC9B,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,oBAAoB,CAAC;AAAA,IACrB,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,aAAa,MAAM,eAAe,UAAU,KAAK,OAAO;AAC/D,QAAI,CAAC,OAAO,WAAW,QAAQ;AAC7B,aAAO,SAAS;AAChB,aAAO,OAAO,KAAK,uEAAkE;AACrF,aAAO,EAAE,OAAO;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,KAAK,KAAK,WAAW,CAAC,GAAG,IAAI,OAAO,CAAC;AAC5D,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,KAAK,KAAK,WAAW,CAAC,EAAG,WAAU,IAAI,EAAE,MAAM,EAAE,EAAE;AAC9D,aAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG;AACvC,QAAI,EAAE,aAAa;AACjB,gBAAU,IAAI,EAAE,MAAM,EAAE,WAAW;AACnC,aAAO,mBAAmB,KAAK,GAAG,EAAE,IAAI,gBAAgB,EAAE,MAAM,yBAAoB,EAAE,WAAW,EAAE;AAAA,IACrG,OAAO;AACL,aAAO,mBAAmB,KAAK,GAAG,EAAE,IAAI,gBAAgB,EAAE,MAAM,6BAAwB;AAAA,IAC1F;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,SAAyB,UAAU,IAAI,IAAI,KAAK;AAErE,QAAM,UAAU,KAAK,YAAY,CAAC,MAAoB,IAAI,mBAAmB,CAAC;AAC9E,QAAM,WAAW,QAAQ;AAAA,IACvB,QAAQ,KAAK,UAAU,SAAS,eAAe;AAAA,IAC/C,OAAO,KAAK,SAAS,SAAS,cAAc;AAAA,EAC9C,CAAC;AAED,QAAM,YAAY,MAAM,SAAS,MAAM,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAIjG,QAAM,YAAY,KAAK,cAAc,QAAQ,SAAY,KAAK,aAAa,0BAA0B,KAAK,EAAE;AAC5G,SAAO,YAAY;AACnB,QAAM,UAAU,CAAC,GAASC,qBAA0C;AAClE,QAAI,gBAAgB,IAAI,EAAE,SAAS,EAAG,QAAO;AAI7C,QAAI,EAAE,cAAc,cAAc,EAAE,cAAc,OAAO,EAAE,cAAc,mDAAmD;AAC1H,aAAOA,iBAAgB,IAAI,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,MAAM;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AACA,QAAM,kBAAkB,IAAI,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAExH,QAAM,sBAAsB,KAAK,SAAS,CAAC,GAAG;AAAA,IAAI,CAAC,OACjD,YAAY,EAAE,GAAG,IAAI,OAAO,WAAW,aAAa,aAAa,KAAK,IAAI,KAAK,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,aAAa,aAAa,KAAK,IAAI,KAAK,KAAK,EAAE,GAAG;AAAA,EAC1J;AACA,QAAM,UAAkB,CAAC;AACzB,aAAW,KAAK,UAAU;AACxB,QAAI,WAAW,IAAI,QAAQ,CAAC,CAAC,GAAG;AAC9B,aAAO,gBAAgB;AACvB;AAAA,IACF;AACA,UAAM,OAAa;AAAA,MACjB,SAAS,YAAY,EAAE,OAAO;AAAA,MAC9B,WAAW,YAAY,EAAE,SAAS;AAAA,MAClC,QAAQ,YAAY,EAAE,MAAM;AAAA,MAC5B,QAAQ,EAAE;AAAA,MACV,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,MACpC,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,IACxD;AACA,QAAI,QAAQ,MAAM,eAAe,KAAK,UAAW,MAAK,QAAQ;AAC9D,QAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC,GAAG;AAChC,aAAO,kBAAkB;AACzB,WAAK,cAAc,GAAG,KAAK,cAAc,GAAG,KAAK,WAAW,MAAM,EAAE,aAAa,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,IACxG;AACA,YAAQ,KAAK,IAAI;AAAA,EACnB;AACA,aAAW,MAAM,mBAAoB,SAAQ,KAAK,EAAE;AACpD,SAAO,cAAc,KAAK,SAAS,CAAC,GAAG;AAEvC,MAAI;AACF,UAAM,SAAS,IAAI,OAAO;AAAA,EAC5B,SAAS,KAAK;AACZ,WAAO,SAAS;AAChB,WAAO,OAAO,KAAK,qCAAqC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1G,WAAO,EAAE,OAAO;AAAA,EAClB;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,cAAc,MAAM,eAAe,UAAU,KAAK,OAAO;AAChE,QAAI,CAAC,OAAO,YAAY,QAAQ;AAC9B,aAAO,SAAS;AAChB,YAAM,SAAS,OAAO,YAAY,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;AACpG,aAAO,OAAO,KAAK,oDAA+C,OAAO,KAAK,IAAI,CAAC,EAAE;AACrF,aAAO,EAAE,OAAO;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,OAAO,SAAS;AACnC;;;ACnRA,SAAS,KAAAC,WAAS;AAuBlB,IAAM,WAAW,oBAAI,IAAI,CAAC,YAAY,KAAK,iDAAiD,CAAC;AA8B7F,IAAM,cAAc,CAAC,GAAS,oBAC5B,gBAAgB,IAAI,EAAE,SAAS,KAC9B,SAAS,IAAI,EAAE,SAAS,MAAM,gBAAgB,IAAI,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,MAAM;AAEzF,SAAS,MAAM,MAAsB;AACnC,QAAM,IAAI,KAAK,MAAM,uCAAuC;AAC5D,SAAO,IAAI,EAAE,CAAC,IAAI;AACpB;AAGA,eAAsB,eAAe,OAAoD;AACvF,QAAM,UAAU,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAClD,QAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAChE,QAAM,kBAAkB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AAEhE,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,KAAK,SAAS;AACvB,QAAI,iBAAiB,IAAI,EAAE,SAAS,EAAG,QAAO,IAAI,EAAE,SAAS,MAAM,EAAE,MAAM,CAAC;AAAA,EAC9E;AAEA,QAAM,UAAU,oBAAI,IAAsB;AAC1C,QAAM,aAAa,oBAAI,IAAsB;AAC7C,QAAM,SAAS,CAAC,SAA2B;AACzC,QAAI,IAAI,QAAQ,IAAI,IAAI;AACxB,QAAI,CAAC,GAAG;AACN,UAAI,EAAE,MAAM,MAAM,SAAS,MAAM,GAAG,YAAY,GAAG,OAAO,OAAO,IAAI,IAAI,EAAE;AAC3E,cAAQ,IAAI,MAAM,CAAC;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,CAAC,SAA2B;AAC3C,QAAI,IAAI,WAAW,IAAI,IAAI;AAC3B,QAAI,CAAC,GAAG;AACN,UAAI,EAAE,MAAM,MAAM,YAAY,MAAM,GAAG,YAAY,GAAG,OAAO,OAAO,IAAI,IAAI,EAAE;AAC9E,iBAAW,IAAI,MAAM,CAAC;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,KAAK,UAAU;AACxB,UAAM,QAAQ,YAAY,GAAG,eAAe;AAG5C,QAAI,SAAS,IAAI,EAAE,SAAS,GAAG;AAC7B,UAAI,MAAO,QAAO,EAAE,OAAO,EAAE,cAAc;AAAA,UACtC,QAAO,EAAE,MAAM,EAAE,QAAQ;AAC9B;AAAA,IACF;AAEA,QAAI,gBAAgB,IAAI,EAAE,SAAS,GAAG;AAEpC,YAAM,UAAU,EAAE,UAAU,SAAS,YAAY,IAAI,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,OAAO;AAC3F,cAAQ,cAAc;AAEtB,UAAI,CAAC,EAAE,UAAU,SAAS,WAAW,EAAG,QAAO,EAAE,MAAM,EAAE,cAAc;AACvE,UAAI,EAAE,UAAU,SAAS,QAAQ,EAAG,SAAQ,IAAI,EAAE,UAAU,QAAQ,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC;AAC5F,UAAI,EAAE,UAAU,SAAS,OAAO,EAAG,QAAO,IAAI,EAAE,UAAU,OAAO,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC;AACzF;AAAA,IACF;AAGA,aAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,EAChC;AAIA,QAAM,MAAM,CAAC,GAAG,QAAQ,OAAO,GAAG,GAAG,WAAW,OAAO,CAAC;AACxD,QAAM,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,eAAe,CAAC;AACrE,QAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACpF,QAAM,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC/D,QAAM,gBAAgB,CAAC,GAAG,WAAW,OAAO,CAAC,EAC1C,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE,OAAO,CAAC,EAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,IAAI,CAAC,EAClC,IAAI,CAAC,MAAM,EAAE,IAAI;AACpB,QAAM,eAAe,CAAC,GAAG,WAAW,OAAO,CAAC,EACzC,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE,OAAO,CAAC,EAC5C,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,IAAI,CAAC,EACjC,IAAI,CAAC,MAAM,EAAE,IAAI;AAEpB,SAAO;AAAA,IACL,SAAS,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,IAC7F,YAAY,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,IACnG,YAAY,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,SAAS;AAAA,IACxB,cAAc,QAAQ;AAAA,EACxB;AACF;AAkBA,eAAsB,cACpB,OACA,OAA8B,CAAC,GACT;AACtB,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAC9F,QAAM,kBAAkB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AAIhE,QAAM,cAAc,oBAAI,IAAyB;AACjD,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,SAAS,IAAI,EAAE,SAAS,KAAK,YAAY,GAAG,eAAe,EAAG;AACnE,UAAM,MAAM,YAAY,IAAI,EAAE,MAAM,KAAK,oBAAI,IAAY;AACzD,QAAI,IAAI,EAAE,OAAO;AACjB,gBAAY,IAAI,EAAE,QAAQ,GAAG;AAAA,EAC/B;AAEA,QAAM,SAAsB,CAAC;AAC7B,aAAW,CAAC,KAAK,QAAQ,KAAK,aAAa;AACzC,QAAI,SAAS,OAAO,aAAc;AAElC,UAAM,WAAW,oBAAI,IAGnB;AACF,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,KAAK,UAAU;AACxB,UAAI,CAAC,SAAS,IAAI,EAAE,OAAO,EAAG;AAC9B,gBAAU,IAAI,EAAE,SAAS,CAAC,GAAI,UAAU,IAAI,EAAE,OAAO,KAAK,CAAC,GAAI,CAAC,CAAC;AAAA,IACnE;AACA,eAAW,CAAC,EAAE,KAAK,KAAK,WAAW;AACjC,YAAM,SAAS,oBAAI,IAAoB;AACvC,iBAAW,KAAK,OAAO;AACrB,YAAI,SAAS,IAAI,EAAE,SAAS,EAAG;AAC/B,eAAO,IAAI,EAAE,WAAW,CAAC,GAAI,OAAO,IAAI,EAAE,SAAS,KAAK,CAAC,GAAI,CAAC,CAAC;AAAA,MACjE;AACA,iBAAW,CAAC,MAAM,SAAS,KAAK,QAAQ;AACtC,cAAM,IAAI,SAAS,IAAI,IAAI,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,oBAAI,IAAY,GAAG,WAAW,oBAAI,IAAuB,EAAE;AAChI,UAAE,WAAW;AACb,UAAE,UAAU,KAAK,IAAI,EAAE,SAAS,UAAU,MAAM;AAChD,mBAAW,KAAK,WAAW;AACzB,YAAE,UAAU,IAAI,cAAc,EAAE,MAAM,IAAI,YAAY,KAAK;AAC3D,gBAAM,KAAK,WAAW,EAAE,MAAM;AAC9B,cAAI,GAAI,GAAE,UAAU,IAAI,EAAE;AAAA,QAC5B;AACA,iBAAS,IAAI,MAAM,CAAC;AAAA,MACtB;AAAA,IACF;AACA,UAAM,aAAsC,CAAC;AAC7C,eAAW,CAAC,MAAM,CAAC,KAAK,UAAU;AAChC,UAAI,EAAE,UAAU,SAAS,OAAO,SAAU;AAC1C,YAAM,QAAyC,EAAE,KAAK;AACtD,UAAI,EAAE,YAAY,SAAS,KAAM,OAAM,WAAW;AAClD,UAAI,EAAE,YAAY,EAAG,OAAM,WAAW;AACtC,UAAI,EAAE,UAAU,SAAS,EAAG,OAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;AAC/D,UAAI,EAAE,UAAU,SAAS,EAAG,OAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;AAC/D,iBAAW,KAAK,KAAK;AAAA,IACvB;AACA,QAAI,WAAW,OAAQ,QAAO,KAAK,EAAE,aAAa,KAAK,WAAW,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAuB;AAC5C,MAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,MAAI,+BAA+B,KAAK,IAAI,EAAG,QAAO;AACtD,MAAI,KAAK,WAAW,GAAG,KAAK,mBAAmB,KAAK,IAAI,EAAG,QAAO;AAClE,SAAO;AACT;AAEA,SAAS,WAAW,MAAkC;AACpD,QAAM,IAAI,KAAK,MAAM,uBAAuB;AAC5C,MAAI,EAAG,QAAO,EAAE,CAAC;AACjB,MAAI,gBAAgB,KAAK,IAAI,EAAG,QAAO;AACvC,MAAI,SAAS,KAAK,IAAI,EAAG,QAAO;AAChC,MAAI,UAAU,KAAK,IAAI,EAAG,QAAO;AACjC,MAAI,eAAe,KAAK,IAAI,EAAG,QAAO;AACtC,MAAI,iBAAiB,KAAK,IAAI,EAAG,QAAO;AACxC,SAAO;AACT;AAQA,eAAsB,YACpB,OACA,QAC2F;AAC3F,QAAM,UAAU,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAClD,QAAM,UAAuB,CAAC;AAC9B,QAAM,WAAyD,CAAC;AAChE,aAAW,SAAS,QAAQ;AAE1B,UAAM,aAAa,IAAI,mBAAmB,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,OAAO,EAAE;AACpF,QAAI,WAAW,OAAQ,UAAS,KAAK,EAAE,OAAO,YAAY,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,QACvF,SAAQ,KAAK,KAAK;AAAA,EACzB;AACA,MAAI,QAAQ,OAAQ,OAAM,UAAU,GAAG,OAAO;AAC9C,SAAO,EAAE,SAAS,SAAS;AAC7B;AAGO,SAAS,mBAAmB,OAA2B;AAC5D,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aACE;AAAA,IACF,QAAQC,IAAE,OAAO,CAAC,CAAC;AAAA,IACnB,SAAS,YAAY,eAAe,KAAK;AAAA,EAC3C,CAAC;AACH;AAGO,SAAS,kBAAkB,OAA2B,OAA8B,CAAC,GAAG;AAC7F,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aACE;AAAA,IACF,QAAQA,IAAE,OAAO,CAAC,CAAC;AAAA,IACnB,SAAS,YAAY,cAAc,OAAO,IAAI;AAAA,EAChD,CAAC;AACH;;;AJ3PA,IAAMC,YAAW,oBAAI,IAAI,CAAC,YAAY,KAAK,iDAAiD,CAAC;AAC7F,IAAM,YAAY,oBAAI,IAAI,CAAC,mBAAmB,iDAAiD,CAAC;AAChG,IAAM,WAAW,oBAAI,IAAI,CAAC,sBAAsB,oDAAoD,CAAC;AACrG,IAAM,SAAS,oBAAI,IAAI,CAAC,eAAe,6CAA6C,CAAC;AACrF,IAAM,QAAQ,oBAAI,IAAI,CAAC,cAAc,4CAA4C,CAAC;AAClF,IAAM,iBAAiB,oBAAI,IAAI,CAAC,0BAA0B,kDAAkD,CAAC;AAC7G,IAAM,gBAAgB,oBAAI,IAAI,CAAC,yBAAyB,iDAAiD,CAAC;AAC1G,IAAM,iBAAiB,oBAAI,IAAI,CAAC,0BAA0B,kDAAkD,CAAC;AAC7G,IAAM,cAAc,oBAAI,IAAI,CAAC,iBAAiB,yCAAyC,CAAC;AAoCxF,SAAS,UAAU,MAAuB;AACxC,MAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,MAAI,+BAA+B,KAAK,IAAI,EAAG,QAAO;AACtD,MAAI,KAAK,WAAW,GAAG,KAAK,mBAAmB,KAAK,IAAI,EAAG,QAAO;AAClE,SAAO;AACT;AAEA,SAAS,aAAa,MAAkC;AACtD,QAAM,IAAI,KAAK,MAAM,uBAAuB;AAC5C,MAAI,EAAG,QAAO,EAAE,CAAC;AACjB,MAAI,gBAAgB,KAAK,IAAI,EAAG,QAAO;AACvC,MAAI,SAAS,KAAK,IAAI,EAAG,QAAO;AAChC,MAAI,UAAU,KAAK,IAAI,EAAG,QAAO;AACjC,MAAI,eAAe,KAAK,IAAI,EAAG,QAAO;AACtC,MAAI,iBAAiB,KAAK,IAAI,EAAG,QAAO;AACxC,SAAO;AACT;AAEO,IAAM,qBAAN,MAA+C;AAAA,EAC5C,QAAgB,CAAC;AAAA,EACjB,cAAc,oBAAI,IAAgD;AAAA,EAClE,SAAsB,CAAC;AAAA,EACvB,QAAqB,CAAC;AAAA,EAE9B,YAAY,OAAqB,CAAC,GAAG;AACnC,SAAK,SAAS,CAAC,GAAI,KAAK,UAAU,CAAC,CAAE;AACrC,SAAK,QAAQ,CAAC,GAAI,KAAK,SAAS,CAAC,CAAE;AAAA,EACrC;AAAA,EAEA,aAAa,QAA2B;AACtC,SAAK,OAAO,KAAK,GAAG,MAAM;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAA0B;AACpC,SAAK,MAAM,KAAK,GAAG,KAAK;AACxB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,iBAA8B;AAC5B,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA,EAGA,gBAA6B;AAC3B,WAAO,CAAC,GAAG,KAAK,KAAK;AAAA,EACvB;AAAA;AAAA,EAGQ,IAAI,GAAqE;AAC/E,WAAO,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,EAAE,SAAS,EAAE;AAAA,EACjE;AAAA,EAEA,MAAM,IAAI,OAA8B;AACtC,UAAM,SAAS,MAAM,KAAK,SAAS,KAAK;AACxC,QAAI,CAAC,OAAO,OAAO;AACjB,YAAM,IAAI,MAAM,oBAAoB,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1F;AACA,UAAM,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;AACxD,UAAM,YAAsB,CAAC;AAC7B,eAAW,KAAK,OAAO;AACrB,UAAI,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG;AAC3B,cAAM,IAAI,KAAK,IAAI,CAAC,CAAC;AACrB,kBAAU,KAAK,KAAK,IAAI,CAAC,CAAC;AAC1B,aAAK,MAAM,KAAK,CAAC;AAAA,MACnB;AAAA,IACF;AACA,UAAM,WAAW,MAAY;AAC3B,YAAM,SAAS,IAAI,IAAI,SAAS;AAChC,WAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AAC9D,iBAAW,KAAK,OAAQ,MAAK,YAAY,OAAO,CAAC;AAAA,IACnD;AACA,UAAM,YAAY,KAAK,gBAAgB;AACvC,QAAI,UAAU,QAAQ;AACpB,eAAS;AACT,YAAM,IAAI,MAAM,kCAAkC,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1E;AACA,UAAM,cAAc,KAAK,YAAY,KAAK,KAAK;AAC/C,QAAI,CAAC,YAAY,OAAO;AACtB,eAAS;AACT,YAAM,IAAI,MAAM,oBAAoB,YAAY,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/F;AACA,SAAK,iBAAiB,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,MAAM,GAAmB,GAAmB,GAAmB,GAAoC;AACvG,WAAO,KAAK,MAAM;AAAA,MAChB,CAAC,OACE,CAAC,KAAK,EAAE,YAAY,OAAO,CAAC,KAAK,EAAE,cAAc,OAAO,CAAC,KAAK,EAAE,WAAW,OAAO,CAAC,KAAK,EAAE,UAAU;AAAA,IACzG;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,OAAqC;AAClD,UAAM,aAAa,MAChB,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,EACrD,IAAI,CAAC,OAAO,EAAE,SAAS,sBAAsB,KAAK,UAAU,CAAC,CAAC,GAAG,EAAE;AACtE,UAAM,WAAW,MACd,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EACvB,IAAI,CAAC,OAAO,EAAE,SAAS,kCAAkC,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,EAAE;AACrG,WAAO,EAAE,OAAO,WAAW,SAAS,SAAS,WAAW,GAAG,YAAY,CAAC,GAAG,YAAY,GAAG,QAAQ,EAAE;AAAA,EACtG;AAAA,EAEA,MAAM,IAAI,MAAgE;AACxE,WAAO,KAAK,YAAY,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK;AAAA,EACjD;AAAA;AAAA,EAGQ,kBAA4B;AAClC,UAAM,kBAAkB,IAAI;AAAA,MAC1B,KAAK,MAAM,OAAO,CAAC,MAAMA,UAAS,IAAI,EAAE,SAAS,KAAK,eAAe,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IAC1G;AACA,UAAM,YAAsB,CAAC;AAC7B,eAAW,QAAQ,iBAAiB;AAClC,YAAM,YAAY,oBAAI,IAAyB;AAC/C,iBAAW,KAAK,KAAK,OAAO;AAC1B,YAAI,EAAE,cAAc,KAAM;AAC1B,cAAM,SAAS,UAAU,IAAI,EAAE,OAAO,KAAK,oBAAI,IAAY;AAC3D,eAAO,IAAI,EAAE,MAAM;AACnB,kBAAU,IAAI,EAAE,SAAS,MAAM;AAAA,MACjC;AACA,iBAAW,CAAC,SAAS,MAAM,KAAK,WAAW;AACzC,YAAI,OAAO,OAAO,EAAG,WAAU,KAAK,GAAG,OAAO,QAAQ,OAAO,IAAI,0BAA0B,IAAI,EAAE;AAAA,MACnG;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,OAA4B;AACtC,UAAM,aAAwC,CAAC;AAC/C,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,UAAU,MAAM,OAAO,CAAC,MAAMA,UAAS,IAAI,EAAE,SAAS,KAAK,EAAE,WAAW,MAAM,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AACrH,iBAAW,QAAQ,IAAI,IAAI,OAAO,GAAG;AACnC,mBAAW,QAAQ,MAAM,YAAY;AACnC,gBAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,YAAY,QAAQ,EAAE,cAAc,KAAK,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACvG,cAAI,KAAK,YAAY,QAAQ,OAAO,SAAS,KAAK,UAAU;AAC1D,uBAAW,KAAK,EAAE,SAAS,GAAG,IAAI,aAAa,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,UACtG;AACA,cAAI,KAAK,YAAY,QAAQ,OAAO,SAAS,KAAK,UAAU;AAC1D,uBAAW,KAAK,EAAE,SAAS,GAAG,IAAI,cAAc,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,UACvG;AACA,qBAAW,KAAK,QAAQ;AACtB,gBAAI,KAAK,YAAY,aAAa,CAAC,MAAM,KAAK,YAAY,EAAE,KAAK,aAAa,gBAAgB,UAAU,CAAC,IAAI;AAC3G,yBAAW,KAAK,EAAE,SAAS,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,YACzG;AACA,gBAAI,KAAK,aAAa,SAAS,UAAU,CAAC,GAAG;AAC3C,yBAAW,KAAK,EAAE,SAAS,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,mBAAmB,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,YAChG;AACA,gBAAI,KAAK,aAAa,aAAa,CAAC,UAAU,CAAC,GAAG;AAChD,yBAAW,KAAK,EAAE,SAAS,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,sBAAsB,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,YACnG;AACA,gBAAI,KAAK,aAAa,UAAa,MAAM,KAAK,UAAU;AACtD,yBAAW,KAAK,EAAE,SAAS,GAAG,IAAI,IAAI,KAAK,IAAI,YAAY,KAAK,QAAQ,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,YACrG;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,OAAO,WAAW,WAAW,GAAG,WAAW;AAAA,EACtD;AAAA,EAEQ,OAAO,GAAS,UAAkB,MAAc,OAA6B;AACnF,UAAM,IAAI,KAAK,IAAI,CAAC;AACpB,QAAI,MAAM,IAAI,CAAC,EAAG,QAAO;AACzB,UAAM,IAAI,CAAC;AACX,SAAK,MAAM,KAAK,CAAC;AACjB,SAAK,YAAY,IAAI,GAAG,EAAE,UAAU,KAAK,CAAC;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBAAiB,OAA0B;AACjD,eAAS;AACP,UAAI,QAAQ;AACZ,YAAM,WAAW,CAAC,GAAG,KAAK,KAAK;AAC/B,YAAM,SAAS,CAAC,OAAoB,SAAS,OAAO,CAAC,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC;AAC9E,YAAM,SAAS,CAAC,GAAS,UAAkB,SAA0B;AACnE,cAAM,WAAW,KAAK,OAAO,GAAG,UAAU,MAAM,KAAK;AACrD,gBAAQ,YAAY;AACpB,eAAO;AAAA,MACT;AAEA,iBAAW,MAAM,OAAO,SAAS,GAAG;AAClC,mBAAW,MAAM,OAAO,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG;AACzE,kBAAQ,KAAK;AAAA,YACX,EAAE,SAAS,GAAG,SAAS,WAAW,GAAG,WAAW,QAAQ,GAAG,QAAQ,QAAQ,cAAc,MAAM,iBAAiB;AAAA,YAChH,CAAC,IAAI,EAAE;AAAA,YACP;AAAA,YACA;AAAA,UACF,KAAK;AAAA,QACP;AAAA,MACF;AACA,iBAAW,KAAK,OAAOA,SAAQ,GAAG;AAChC,mBAAW,MAAM,OAAO,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;AACxE,kBAAQ,KAAK;AAAA,YACX,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,WAAW,QAAQ,GAAG,QAAQ,QAAQ,cAAc,MAAM,YAAY;AAAA,YACzG,CAAC,GAAG,EAAE;AAAA,YACN;AAAA,YACA;AAAA,UACF,KAAK;AAAA,QACP;AAAA,MACF;AACA,iBAAW,MAAM,OAAO,QAAQ,GAAG;AACjC,mBAAW,MAAM,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG;AACxE,kBAAQ,KAAK;AAAA,YACX,EAAE,SAAS,GAAG,SAAS,WAAW,GAAG,WAAW,QAAQ,GAAG,QAAQ,QAAQ,cAAc,MAAM,qBAAqB;AAAA,YACpH,CAAC,IAAI,EAAE;AAAA,YACP;AAAA,YACA;AAAA,UACF,KAAK;AAAA,QACP;AACA,mBAAW,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,GAAG;AACpE,kBAAQ,KAAK;AAAA,YACX,EAAE,SAAS,IAAI,SAAS,WAAW,GAAG,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,cAAc,MAAM,eAAe;AAAA,YAC7G,CAAC,IAAI,GAAG;AAAA,YACR;AAAA,YACA;AAAA,UACF,KAAK;AAAA,QACP;AAAA,MACF;AACA,iBAAW,KAAK,OAAO,MAAM,GAAG;AAC9B,mBAAW,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG;AACnE,kBAAQ,KAAK;AAAA,YACX,EAAE,SAAS,IAAI,SAAS,WAAW,YAAY,QAAQ,EAAE,QAAQ,QAAQ,cAAc,MAAM,cAAc;AAAA,YAC3G,CAAC,GAAG,GAAG;AAAA,YACP;AAAA,YACA;AAAA,UACF,KAAK;AAAA,QACP;AAAA,MACF;AACA,iBAAW,KAAK,OAAO,KAAK,GAAG;AAC7B,mBAAW,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG;AACnE,cAAI;AAAA,YACF,EAAE,SAAS,IAAI,QAAQ,WAAW,YAAY,QAAQ,EAAE,QAAQ,QAAQ,cAAc,MAAM,aAAa;AAAA,YACzG,CAAC,GAAG,GAAG;AAAA,YACP;AAAA,UACF,EAAG,SAAQ;AAAA,QACb;AAAA,MACF;AACA,cAAQ,KAAK,SAAS,UAAU,MAAM,KAAK;AAC3C,cAAQ,KAAK,WAAW,UAAU,MAAM,KAAK;AAC7C,UAAI,CAAC,MAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,SAAS,UAAkB,QAAuE;AACxG,QAAI,QAAQ;AACZ,UAAM,aAAa,IAAI;AAAA,MACrB,SAAS,OAAO,CAAC,MAAMA,UAAS,IAAI,EAAE,SAAS,KAAK,eAAe,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IACxG;AACA,UAAM,YAAY,IAAI;AAAA,MACpB,SAAS,OAAO,CAAC,MAAMA,UAAS,IAAI,EAAE,SAAS,KAAK,cAAc,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IACvG;AACA,eAAW,KAAK,YAAY;AAC1B,YAAM,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;AACrD,iBAAW,MAAM,MAAM;AACrB,mBAAW,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG;AAC5D,cAAI,OAAO,EAAE,SAAS,GAAG,SAAS,WAAW,GAAG,QAAQ,GAAG,QAAQ,QAAQ,cAAc,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,GAAG,gBAAgB,EAAG,SAAQ;AAAA,QAC1J;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,WAAW;AACzB,iBAAW,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG;AAC1D,YAAI,OAAO,EAAE,SAAS,GAAG,QAAQ,WAAW,GAAG,QAAQ,GAAG,SAAS,QAAQ,cAAc,MAAM,gBAAgB,GAAG,CAAC,EAAE,GAAG,eAAe,EAAG,SAAQ;AAAA,MACpJ;AAAA,IACF;AACA,eAAW,OAAO,SAAS,OAAO,CAAC,MAAM,YAAY,IAAI,EAAE,SAAS,CAAC,GAAG;AACtE,iBAAW,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,WAAW,EAAE,cAAc,IAAI,MAAM,GAAG;AACnG,cAAM,UAAU,IAAI,cAAc,IAAI,UAAU,IAAI,SAAS,IAAI;AACjE,YAAI,OAAO,EAAE,SAAS,IAAI,QAAQ,WAAW,SAAS,QAAQ,IAAI,SAAS,QAAQ,cAAc,MAAM,cAAc,GAAG,CAAC,KAAK,GAAG,GAAG,aAAa,EAAG,SAAQ;AAAA,MAC9J;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,UAAkB,QAAuE;AAC1G,QAAI,QAAQ;AACZ,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,MAAM,KAAK,UAAU,GAAG,KAAK,EAAE,IAAI,KAAK,OAAO,KAAK,KAAK;AAC/D,iBAAW,WAAW,cAAc,KAAK,OAAO,QAAQ,GAAG;AACzD,mBAAW,WAAW,KAAK,WAAW;AACpC,gBAAM,QAAuB;AAAA,YAC3B,SAAS,YAAY,QAAQ,SAAS,QAAQ,IAAI;AAAA,YAClD,WAAW,YAAY,QAAQ,WAAW,QAAQ,IAAI;AAAA,YACtD,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,IAAI;AAAA,UAClD;AACA,cAAI,MAAM,WAAW,QAAQ,MAAM,aAAa,QAAQ,MAAM,UAAU,KAAM;AAC9E,cAAI;AAAA,YACF,EAAE,SAAS,MAAM,SAAS,WAAW,MAAM,WAAW,QAAQ,MAAM,QAAQ,QAAQ,cAAc,MAAM,KAAK,aAAa,IAAI;AAAA,YAC9H,QAAQ;AAAA,YACR;AAAA,UACF,EAAG,SAAQ;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAWA,SAAS,MAAM,MAAuB;AACpC,SAAO,KAAK,WAAW,GAAG;AAC5B;AAEA,SAAS,UAAU,SAAiB,OAAe,MAA4D;AAC7G,MAAI,MAAM,OAAO,GAAG;AAClB,UAAM,QAAQ,KAAK,IAAI,OAAO;AAC9B,QAAI,UAAU,QAAW;AACvB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,SAAS,KAAK;AACvB,aAAO;AAAA,IACT;AACA,WAAO,UAAU,QAAQ,OAAO;AAAA,EAClC;AACA,SAAO,YAAY,QAAQ,OAAO;AACpC;AAEA,SAAS,SAAS,SAAwB,MAAY,MAA4D;AAChH,MAAI,IAAI,UAAU,QAAQ,SAAS,KAAK,SAAS,IAAI;AACrD,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,UAAU,QAAQ,WAAW,KAAK,WAAW,CAAC;AAClD,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,UAAU,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AACjD;AAGO,SAAS,cAAc,UAA2B,OAAiC;AACxF,MAAI,WAA6B,CAAC,EAAE,MAAM,oBAAI,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC;AAChE,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAyB,CAAC;AAChC,eAAW,KAAK,UAAU;AACxB,iBAAW,KAAK,OAAO;AACrB,cAAM,OAAO,SAAS,SAAS,GAAG,EAAE,IAAI;AACxC,YAAI,KAAM,MAAK,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,MACtD;AAAA,IACF;AACA,eAAW;AACX,QAAI,CAAC,SAAS,OAAQ;AAAA,EACxB;AACA,SAAO;AACT;AAEO,SAAS,YAAY,MAAc,MAAmC;AAC3E,SAAO,MAAM,IAAI,IAAK,KAAK,IAAI,IAAI,KAAK,OAAQ;AAClD;AAOA,SAAS,eAAe,OAAyB;AAC/C,QAAM,SAAmB,CAAC;AAC1B,QAAM,KAAK;AACX,MAAI;AACJ,UAAQ,IAAI,GAAG,KAAK,KAAK,OAAO,KAAM,QAAO,KAAK,EAAE,CAAC,CAAC;AACtD,SAAO;AACT;AAOO,SAAS,YAAY,OAA6B;AACvD,QAAM,SAAS,eAAe,KAAK;AACnC,MAAI,IAAI;AACR,QAAM,SAAS,CAAC,SAAuB;AACrC,QAAI,OAAO,CAAC,GAAG,YAAY,MAAM,KAAM,OAAM,IAAI,MAAM,oBAAoB,IAAI,SAAS,OAAO,CAAC,KAAK,KAAK,EAAE;AAC5G,SAAK;AAAA,EACP;AACA,SAAO,QAAQ;AACf,QAAM,YAAsB,CAAC;AAC7B,SAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,WAAW,GAAG,GAAG;AACrD,cAAU,KAAK,OAAO,CAAC,CAAC;AACxB,SAAK;AAAA,EACP;AACA,MAAI,CAAC,UAAU,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AACnF,SAAO,OAAO;AACd,SAAO,GAAG;AACV,QAAM,WAA4B,CAAC;AACnC,SAAO,IAAI,OAAO,UAAU,OAAO,CAAC,MAAM,KAAK;AAC7C,UAAM,IAAI,OAAO,GAAG;AACpB,UAAM,IAAI,OAAO,GAAG;AACpB,UAAM,IAAI,OAAO,GAAG;AACpB,QAAI,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAC9E,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,aAAS,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,EAAE,CAAC;AACrD,QAAI,OAAO,CAAC,MAAM,IAAK,MAAK;AAAA,EAC9B;AACA,SAAO,GAAG;AACV,SAAO,EAAE,WAAW,SAAS;AAC/B;AAGA,eAAsB,cAAc,OAAmB,OAAkD;AACvG,QAAM,EAAE,WAAW,SAAS,IAAI,YAAY,KAAK;AACjD,QAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,SAAO,cAAc,UAAU,KAAK,EAAE,IAAI,CAAC,MAAM;AAC/C,UAAM,MAA8B,CAAC;AACrC,eAAW,KAAK,UAAW,KAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK;AACrD,WAAO;AAAA,EACT,CAAC;AACH;AAUO,SAAS,iBAAiB,OAAmB;AAClD,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQC,IAAE,OAAO,EAAE,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,CAAC;AAAA,IACvD,SAAS,OAAO,EAAE,MAAM,MAAyB,cAAc,OAAO,KAAK;AAAA,EAC7E,CAAC;AACH;AAGO,SAAS,mBAAmB,OAAmB;AACpD,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,IACxG,SAAS,OAAO,EAAE,MAAM,MAAM,MAAwC;AACpE,YAAM,SAAS,KAAK,YAAY;AAChC,YAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,aAAO,MACJ,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,SAAS,MAAM,CAAC,EACtF,MAAM,GAAG,SAAS,CAAC,EACnB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,WAAW,QAAQ,EAAE,OAAO,EAAE;AAAA,IAClF;AAAA,EACF,CAAC;AACH;AAEO,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,WAAWA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,iEAA4D;AACjG,CAAC;AAOM,SAAS,aAAa,OAAmB;AAC9C,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,IAAE,OAAO,EAAE,OAAOA,IAAE,MAAM,gBAAgB,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,IACpE,SAAS,OAAO,EAAE,MAAM,MAA2F;AACjH,UAAI;AACF,cAAM,MAAM,IAAI,KAAK;AACrB,cAAM,YAAY,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAC9F,eAAO,EAAE,WAAW,MAAM,QAAQ,UAAU,SAAS,OAAO;AAAA,MAC9D,SAAS,KAAK;AACZ,eAAO,2CAAsC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC/F;AAAA,IACF;AAAA,IACA,UAAU,CAAC,YAAqB;AAAA,MAC9B,SAAS,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AAAA,MACpE,UAAU,OAAO,WAAW,WAAW,SAAY,EAAE,WAAY,OAAiC,UAAU;AAAA,IAC9G;AAAA,EACF,CAAC;AACH;AASO,SAAS,eAAe,OAAmB;AAChD,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQA,IAAE,OAAO,EAAE,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC,GAAG,WAAWA,IAAE,OAAO,EAAE,IAAI,CAAC,GAAG,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,IACxG,SAAS,OAAO,EAAE,SAAS,WAAW,OAAO,MAA8D;AACzG,YAAM,SAAS,MAAM,MAAM,MAAM,SAAS,WAAW,MAAM;AAC3D,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,SAAS,YAA4B,OAAO,MAAM,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,MAClF;AACA,YAAM,WAAW,MAAM,MAAM,MAAM,SAAS,WAAW,IAAI;AAC3D,YAAM,eAAe,MAAM,MAAM,MAAM,WAAW,MAAM,IAAI;AAC5D,YAAM,aAAa,aAAa,KAAK,CAAC,MAAMD,UAAS,IAAI,EAAE,SAAS,KAAK,eAAe,IAAI,EAAE,MAAM,CAAC;AACrG,YAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AACxD,UAAI,cAAc,MAAM,QAAQ;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,EAAE,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;AAAA,QAChD;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,SAAS,SAAS,EAAE,SAAS,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI;AAAA,MACxE;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAkBO,IAAM,cAAN,MAAoC;AAAA,EACzC,YACU,OACA,OACA,OAA2B,CAAC,GACpC;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EAHO;AAAA,EACA;AAAA,EACA;AAAA,EAGV,MAAM,OAA+B;AACnC,UAAM,WAAW,MAAM,KAAK,MAAM,KAAK;AACvC,UAAM,WAAW,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AACtE,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,QAAQ,IAAI,IAAI,SAAS,OAAO,SAAS,YAAY,WAAW,SAAS,UAAU,EAAE,CAAC;AAC5F,QAAI,CAAC,MAAM,KAAM,QAAO;AACxB,UAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AACrD,UAAM,SAAS,MACZ,IAAI,CAAC,MAAM;AACV,YAAM,MAAM,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,YAAY;AAClE,UAAI,QAAQ;AACZ,iBAAW,KAAK,MAAO,KAAI,IAAI,SAAS,CAAC,EAAG,UAAS;AACrD,aAAO,EAAE,GAAG,MAAM;AAAA,IACpB,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC;AAChC,QAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,UAAM,QAAQ,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE;AACjF,WAAO,CAAC,GAAG,UAAU,EAAE,MAAM,aAAa,SAAS;AAAA,EAAoD,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,EAC7H;AAAA,EAEA,MAAM,KAAK,UAAwC;AACjD,UAAM,KAAK,MAAM,KAAK,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,cAA0C;AAC9C,WAAO,EAAE,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI,EAAE;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,YAAY,OAAyC;AACzD,UAAM,QAAQ,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AACjE,QAAI,MAAM,OAAQ,OAAM,KAAK,MAAM,IAAI,KAAK;AAAA,EAC9C;AACF;","names":["join","join","z","z","z","z","resolve","readFileSync","dirname","resolve","z","system","join","z","stat","z","resolve","readFileSync","dirname","resolved","z","z","z","readFile","stat","writeFile","join","resolve","z","join","resolve","writeFile","stat","readFile","readFileSync","dirname","dirname","open","z","z","resolve","readFileSync","z","z","z","z","z","existing","closure","predicatesInUse","z","z","RDF_TYPE","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/index.ts","../src/checkpoint/index.ts","../src/swarm/index.ts","../src/a2a/index.ts","../src/client/index.ts","../src/serve/index.ts","../src/models/capabilities.ts","../src/models/openai-compatible.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/models/factory.ts","../src/skills/index.ts","../src/rag/index.ts","../src/sandbox/index.ts","../src/evals/index.ts","../src/tracing/index.ts","../src/streaming/index.ts","../src/memory/compaction.ts","../src/models/index.ts","../src/observability/index.ts","../src/orchestration/index.ts","../src/workflows/index.ts","../src/mcp/index.ts","../src/prompts/index.ts","../src/semantic/index.ts","../src/semantic/remote-sparql.ts","../src/semantic/entity-linking.ts","../src/semantic/ontology-evolution.ts","../src/semantic/ontology-review.ts","../src/index.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { config } from \"dotenv\";\nimport { z } from \"zod\";\n\n// Load .env from cwd, then walk up (handles running from the package dir\n// inside the monorepo). FRAMEWORK_ENV_PATH overrides everything.\n// Each step is silent when the file is missing — never throws, never logs keys.\nfunction loadEnv(): void {\n if (process.env.FRAMEWORK_ENV_PATH) {\n config({ path: process.env.FRAMEWORK_ENV_PATH });\n return;\n }\n config();\n let dir = resolve(process.cwd());\n for (let i = 0; i < 3; i++) {\n dir = dirname(dir);\n const candidate = join(dir, \".env\");\n if (existsSync(candidate)) {\n config({ path: candidate });\n return;\n }\n }\n}\n\nloadEnv();\n\nconst ConfigSchema = z.object({\n TOGETHER_API_KEY: z.string().default(\"\"),\n TOGETHER_BASE_URL: z.string().default(\"https://api.together.xyz/v1\"),\n /** Small chat default — one model, no tiers. */\n TOGETHER_MODEL: z.string().default(\"Qwen/Qwen3.5-9B\"),\n OPENAI_BASE_URL: z.string().default(\"https://api.openai.com/v1\"),\n OPENAI_API_KEY: z.string().default(\"\"),\n OPENAI_MODEL: z.string().default(\"gpt-4o-mini\"),\n ANTHROPIC_API_KEY: z.string().default(\"\"),\n ANTHROPIC_BASE_URL: z.string().default(\"https://api.anthropic.com\"),\n ANTHROPIC_MODEL: z.string().default(\"claude-sonnet-4-6\"),\n OLLAMA_BASE_URL: z.string().default(\"http://localhost:11434/v1\"),\n OLLAMA_MODEL: z.string().default(\"qwen2.5\"),\n E2E_MODEL: z.string().default(\"\"),\n});\n\nexport type FrameworkConfig = z.infer<typeof ConfigSchema> & {\n /** Resolved provider settings: TogetherAI wins when its key is set. */\n active: { baseUrl: string; apiKey: string; model: string; source: \"together\" | \"openai\" };\n};\n\nlet cached: FrameworkConfig | undefined;\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): FrameworkConfig {\n if (cached) return cached;\n const parsed = ConfigSchema.parse({\n TOGETHER_API_KEY: env.TOGETHER_API_KEY ?? \"\",\n TOGETHER_BASE_URL: env.TOGETHER_BASE_URL,\n TOGETHER_MODEL: env.TOGETHER_MODEL,\n OPENAI_BASE_URL: env.OPENAI_BASE_URL,\n OPENAI_API_KEY: env.OPENAI_API_KEY ?? \"\",\n OPENAI_MODEL: env.OPENAI_MODEL,\n ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY ?? \"\",\n ANTHROPIC_BASE_URL: env.ANTHROPIC_BASE_URL,\n ANTHROPIC_MODEL: env.ANTHROPIC_MODEL,\n OLLAMA_BASE_URL: env.OLLAMA_BASE_URL,\n OLLAMA_MODEL: env.OLLAMA_MODEL,\n E2E_MODEL: env.E2E_MODEL ?? \"\",\n });\n const useTogether = parsed.TOGETHER_API_KEY.length > 0;\n const model = useTogether ? parsed.TOGETHER_MODEL : parsed.OPENAI_MODEL;\n cached = {\n ...parsed,\n active: useTogether\n ? { baseUrl: parsed.TOGETHER_BASE_URL, apiKey: parsed.TOGETHER_API_KEY, model, source: \"together\" }\n : { baseUrl: parsed.OPENAI_BASE_URL, apiKey: parsed.OPENAI_API_KEY, model, source: \"openai\" },\n };\n return cached;\n}\n\n/** Test-only: clear cache so tests can pass custom env objects. */\nexport function __resetConfig(): void {\n cached = undefined;\n}\n","import { mkdir, open, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AgentError } from \"../types/index.js\";\nimport type { ChatMessage } from \"../types/index.js\";\n\n/**\n * Local-first durability: file checkpointer + file locks. No services,\n * no third-party deps. Checkpointed HITL resume works fully offline.\n */\n\nexport interface ThreadCheckpoint {\n threadId: string;\n savedAt: string;\n messages: ChatMessage[];\n state: Record<string, unknown>;\n pending: { interruptId: string; tool: string; args: unknown }[];\n}\n\nexport interface Checkpointer {\n save(threadId: string, checkpoint: Omit<ThreadCheckpoint, \"threadId\" | \"savedAt\">): Promise<void>;\n load(threadId: string): Promise<ThreadCheckpoint | undefined>;\n delete(threadId: string): Promise<void>;\n}\n\n/**\n * Exclusive local lock via O_EXCL file creation. Stale locks (older than\n * staleMs) are reclaimed. Single-machine correctness; distributed locking\n * is explicitly out of scope (see roadmap P3).\n */\nexport async function withFileLock<T>(lockPath: string, fn: () => Promise<T>, opts: { staleMs?: number } = {}): Promise<T> {\n const staleMs = opts.staleMs ?? 30000;\n await mkdir(join(lockPath, \"..\"), { recursive: true });\n for (;;) {\n try {\n const handle = await open(lockPath, \"wx\");\n await handle.close();\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") throw err;\n try {\n const info = await stat(lockPath);\n if (Date.now() - info.mtimeMs < staleMs) {\n throw new Error(`Lock held: ${lockPath}`);\n }\n } catch (statErr) {\n if ((statErr as NodeJS.ErrnoException).code !== \"ENOENT\") throw statErr;\n }\n try {\n await unlink(lockPath);\n } catch {\n // Raced with another releaser; retry acquisition.\n }\n }\n }\n try {\n return await fn();\n } finally {\n try {\n await unlink(lockPath);\n } catch {\n // Already released or reclaimed; ignore.\n }\n }\n}\n\n/** JSON-file checkpointer: <root>/threads/<threadId>/checkpoint.json, lock-guarded. */\nexport class FileCheckpointer implements Checkpointer {\n constructor(private root: string) {}\n\n /** threadId lands in a filesystem path — keep it a single safe directory name. */\n private threadDir(threadId: string): string {\n if (threadId === \"\" || threadId === \".\" || threadId === \"..\" || threadId.includes(\"/\")) {\n throw new AgentError(\"THREAD_ID_INVALID\", `Invalid threadId: ${JSON.stringify(threadId)}`, false);\n }\n return join(this.root, \"threads\", threadId);\n }\n\n private file(threadId: string): string {\n return join(this.threadDir(threadId), \"checkpoint.json\");\n }\n\n private lock(threadId: string): string {\n return join(this.threadDir(threadId), \".lock\");\n }\n\n async save(threadId: string, checkpoint: Omit<ThreadCheckpoint, \"threadId\" | \"savedAt\">): Promise<void> {\n const record: ThreadCheckpoint = { threadId, savedAt: new Date().toISOString(), ...checkpoint };\n await withFileLock(this.lock(threadId), async () => {\n await mkdir(join(this.file(threadId), \"..\"), { recursive: true });\n await writeFile(this.file(threadId), JSON.stringify(record), \"utf8\");\n });\n }\n\n async load(threadId: string): Promise<ThreadCheckpoint | undefined> {\n return withFileLock(this.lock(threadId), async () => {\n try {\n return JSON.parse(await readFile(this.file(threadId), \"utf8\")) as ThreadCheckpoint;\n } catch {\n return undefined;\n }\n });\n }\n\n async delete(threadId: string): Promise<void> {\n await withFileLock(this.lock(threadId), async () => {\n try {\n await unlink(this.file(threadId));\n } catch {\n // Missing checkpoint is not an error.\n }\n });\n }\n}\n","import { z } from \"zod\";\nimport { AgentError, type AgentResult, type ContentBlock, type TokenUsage } from \"../types/index.js\";\nimport type { Agent, RunOptions } from \"../agent/index.js\";\nimport { defineTool } from \"../tools/index.js\";\nimport type { InvocationState } from \"../state/index.js\";\nimport type { StreamEvent } from \"../streaming/index.js\";\nimport { runWithBudget } from \"../runtime/index.js\";\n\n/**\n * Swarm: autonomous handoffs across specialists, no fixed path.\n * Each member gets a `handoff_to_agent` tool; shared context (task,\n * history, contributed knowledge, roster) is rebuilt for every turn.\n * Safety: max handoffs / iterations / timeouts + ping-pong detection.\n */\n\nexport interface SwarmOptions {\n agents: Agent[];\n /** First agent to run. Default: agents[0]. Accepts instance or name. */\n entryPoint?: Agent | string;\n maxHandoffs?: number;\n maxIterations?: number;\n executionTimeoutMs?: number;\n nodeTimeoutMs?: number;\n /** Ping-pong detection: window size + min unique agents (0 = disabled). */\n loopDetectionWindow?: number;\n minUniqueAgents?: number;\n}\n\nexport interface HandoffSignal {\n to: string;\n message: string;\n context?: Record<string, unknown>;\n}\n\nexport type SwarmStatus = \"COMPLETED\" | \"FAILED\";\n\nexport interface SwarmResult {\n status: SwarmStatus;\n text: string;\n nodeHistory: string[];\n results: Record<string, AgentResult>;\n iterations: number;\n handoffs: number;\n usage: TokenUsage;\n sharedContext: Record<string, Record<string, unknown>>;\n error?: string;\n}\n\nexport type SwarmStreamEvent =\n | { type: \"node_start\"; agent: string }\n | { type: \"node_done\"; agent: string }\n | { type: \"handoff\"; from: string; to: string }\n | { type: \"agent_event\"; agent: string; event: StreamEvent }\n | { type: \"result\"; result: SwarmResult };\n\nconst HANDOFF_TOOL = \"handoff_to_agent\";\n\nfunction handoffSignal(to: string, message: string, context?: Record<string, unknown>): AgentError {\n const err = new AgentError(\"SWARM_HANDOFF\", `Handoff to ${to}`, false);\n (err as unknown as { handoff: HandoffSignal }).handoff = { to, message, context };\n return err;\n}\n\nexport function readHandoffSignal(err: unknown): HandoffSignal | undefined {\n if (err instanceof AgentError && err.code === \"SWARM_HANDOFF\") {\n return (err as unknown as { handoff?: HandoffSignal }).handoff;\n }\n return undefined;\n}\n\nfunction combineAbort(parent?: AbortSignal, timeoutMs?: number): AbortSignal | undefined {\n if (!parent && !timeoutMs) return undefined;\n const controller = new AbortController();\n if (parent) {\n if (parent.aborted) controller.abort();\n else parent.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n if (timeoutMs) {\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n controller.signal.addEventListener(\"abort\", () => clearTimeout(timer), { once: true });\n }\n return controller.signal;\n}\n\nexport class Swarm {\n private agents: Agent[];\n private entryPoint: Agent;\n private maxHandoffs: number;\n private maxIterations: number;\n private executionTimeoutMs?: number;\n private nodeTimeoutMs?: number;\n private loopWindow: number;\n private minUniqueAgents: number;\n\n constructor(opts: SwarmOptions) {\n if (!opts.agents.length) throw new AgentError(\"SWARM_EMPTY\", \"Swarm needs at least one agent\", false);\n this.agents = opts.agents;\n this.entryPoint =\n typeof opts.entryPoint === \"string\"\n ? (opts.agents.find((a) => a.name === opts.entryPoint) ??\n (() => { throw new AgentError(\"SWARM_UNKNOWN_ENTRY\", `Unknown entry point: ${opts.entryPoint}`, false); })())\n : (opts.entryPoint ?? opts.agents[0]);\n this.maxHandoffs = opts.maxHandoffs ?? 20;\n this.maxIterations = opts.maxIterations ?? 20;\n this.executionTimeoutMs = opts.executionTimeoutMs;\n this.nodeTimeoutMs = opts.nodeTimeoutMs;\n this.loopWindow = opts.loopDetectionWindow ?? 0;\n // Setting a window alone must enable detection — default the uniqueness\n // threshold instead of requiring BOTH knobs (old behavior: window>0 with\n // minUniqueAgents unset silently detected nothing).\n this.minUniqueAgents = opts.minUniqueAgents ?? (this.loopWindow > 0 ? 2 : 0);\n }\n\n private roster(except?: string): string {\n return this.agents\n .filter((a) => a.name !== except)\n .map((a) => `- ${a.name}${a.description ? `: ${a.description}` : \"\"}`)\n .join(\"\\n\");\n }\n\n private buildInput(task: string, history: string[], shared: Record<string, Record<string, unknown>>, message: string, current: string): string {\n const knowledge = Object.entries(shared)\n .map(([agent, facts]) => `• ${agent}: ${JSON.stringify(facts)}`)\n .join(\"\\n\");\n return [\n `Original task: ${task}`,\n message ? `Handoff message: ${message}` : \"\",\n history.length ? `Agents so far: ${history.join(\" → \")}` : \"\",\n knowledge ? `Shared knowledge:\\n${knowledge}` : \"\",\n `Available collaborators:\\n${this.roster(current)}`,\n `If you need a collaborator, call ${HANDOFF_TOOL} with their name. Otherwise finish with your final answer as text.`,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n private memberWithHandoff(agent: Agent, shared: Record<string, Record<string, unknown>>): Agent {\n const handoff = defineTool({\n name: HANDOFF_TOOL,\n description: `Hand control to a specialist. Args: to (agent name), message (what you need), context (facts to share as an object).`,\n schema: z.object({ to: z.string(), message: z.string(), context: z.record(z.unknown()).optional() }),\n execute: async ({ to, message, context }: { to: string; message: string; context?: Record<string, unknown> }) => {\n if (!this.agents.some((a) => a.name === to)) {\n return `Error: unknown agent \"${to}\". Available: ${this.agents.map((a) => a.name).join(\", \")}. Pick one or finish yourself.`;\n }\n if (context && Object.keys(context).length) shared[agent.name] = { ...(shared[agent.name] ?? {}), ...context };\n throw handoffSignal(to, message, context);\n },\n });\n // Clone keeps the member's model/tools/middleware; only coordination is added.\n // Memory/sessions are intentionally fresh per handoff turn (shared\n // knowledge flows through the swarm input + invocationState instead).\n return agent.withTools(handoff);\n }\n\n async run(task: string | ContentBlock[], opts?: RunOptions & { sharedState?: InvocationState }): Promise<SwarmResult> {\n const stream = this.stream(task, opts);\n for (;;) {\n const next = await stream.next();\n if (next.done) return next.value;\n }\n }\n\n async *stream(\n task: string | ContentBlock[],\n opts?: RunOptions & { sharedState?: InvocationState },\n ): AsyncGenerator<SwarmStreamEvent, SwarmResult> {\n const taskText = typeof task === \"string\" ? task : task.map((b) => (b.type === \"text\" ? b.text : `[${b.type}]`)).join(\"\\n\");\n const invocationState = opts?.sharedState ?? {};\n const execSignal = combineAbort(opts?.signal, this.executionTimeoutMs);\n const shared: Record<string, Record<string, unknown>> = {};\n const history: string[] = [];\n const results: Record<string, AgentResult> = {};\n const usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n const handoffTrail: string[] = [];\n let current = this.entryPoint;\n let message = \"\";\n let iterations = 0;\n let handoffs = 0;\n let finalText = \"\";\n\n const fail = (error: string): SwarmResult =>\n this.finish(\"FAILED\", error, history, results, usage, shared, iterations, handoffs);\n\n for (;;) {\n iterations += 1;\n if (iterations > this.maxIterations) {\n return fail(`Exceeded maxIterations (${this.maxIterations})`);\n }\n yield { type: \"node_start\", agent: current.name };\n const runner = this.memberWithHandoff(current, shared);\n const nodeSignal = combineAbort(execSignal, this.nodeTimeoutMs);\n let result: AgentResult | undefined;\n try {\n const gen = runner.stream(this.buildInput(taskText, history, shared, message, current.name), {\n signal: nodeSignal,\n invocationState,\n });\n for (;;) {\n const next = await runWithBudget(() => gen.next(), { signal: execSignal });\n if (next.done) {\n result = next.value;\n break;\n }\n yield { type: \"agent_event\", agent: current.name, event: next.value };\n }\n } catch (err) {\n const handoff = readHandoffSignal(err);\n if (!handoff) {\n const messageText = err instanceof Error ? err.message : String(err);\n return fail(`Agent ${current.name} failed: ${messageText}`);\n }\n handoffs += 1;\n if (handoffs > this.maxHandoffs) {\n return fail(`Exceeded maxHandoffs (${this.maxHandoffs})`);\n }\n handoffTrail.push(current.name, handoff.to);\n yield { type: \"handoff\", from: current.name, to: handoff.to };\n const loop = this.detectLoop(handoffTrail);\n if (loop) {\n return fail(loop);\n }\n const next = this.agents.find((a) => a.name === handoff.to);\n if (!next) {\n return fail(`Handoff to unknown agent: ${handoff.to}`);\n }\n history.push(current.name);\n message = handoff.message;\n current = next;\n continue;\n }\n // Completed without handoff → final answer.\n if (!result) return fail(`Agent ${current.name} returned no result`);\n history.push(current.name);\n results[current.name] = result;\n usage.inputTokens += result.usage.inputTokens;\n usage.outputTokens += result.usage.outputTokens;\n usage.reasoningTokens = (usage.reasoningTokens ?? 0) + (result.usage.reasoningTokens ?? 0);\n finalText = result.text;\n yield { type: \"node_done\", agent: current.name };\n const done = this.finish(\"COMPLETED\", \"\", history, results, usage, shared, iterations, handoffs, finalText);\n yield { type: \"result\", result: done };\n return done;\n }\n }\n\n private detectLoop(trail: string[]): string | undefined {\n if (this.loopWindow <= 0 || this.minUniqueAgents <= 0) return undefined;\n const window = trail.slice(-this.loopWindow);\n if (window.length < this.loopWindow) return undefined;\n if (new Set(window).size < this.minUniqueAgents) {\n return `Repetitive handoff detected (${window.join(\" → \")}): fewer than ${this.minUniqueAgents} unique agents in the last ${this.loopWindow} trail entries`;\n }\n return undefined;\n }\n\n private finish(\n status: SwarmStatus,\n error: string,\n history: string[],\n results: Record<string, AgentResult>,\n usage: TokenUsage,\n shared: Record<string, Record<string, unknown>>,\n iterations: number,\n handoffs: number,\n text = \"\",\n ): SwarmResult {\n return {\n status,\n text,\n nodeHistory: [...history],\n results,\n iterations,\n handoffs,\n usage,\n sharedContext: shared,\n ...(error ? { error } : {}),\n };\n }\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { Agent } from \"../agent/index.js\";\nimport type { Checkpointer } from \"../checkpoint/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * Agent-to-Agent (A2A) interop — The Framework agents calling agents on\n * other platforms, and vice versa. Minimal core of the open protocol:\n * agent-card discovery + JSON-RPC message/send over HTTP, with per-context\n * isolation on the server side.\n */\n\nexport interface AgentCard {\n name: string;\n description?: string;\n version?: string;\n skills?: { name: string; description?: string }[];\n}\n\nexport interface A2AClientOptions {\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n}\n\nfunction textOfParts(parts: unknown): string {\n if (!Array.isArray(parts)) return \"\";\n return parts\n .map((p) => {\n if (typeof p === \"string\") return p;\n if (p && typeof p === \"object\") {\n const o = p as Record<string, unknown>;\n if (typeof o.text === \"string\") return o.text;\n }\n return \"\";\n })\n .join(\"\");\n}\n\nfunction parseSendResult(result: unknown): string {\n if (typeof result === \"string\") return result;\n if (result && typeof result === \"object\") {\n const o = result as Record<string, unknown>;\n const msg = o.message as { parts?: unknown } | undefined;\n if (msg?.parts) return textOfParts(msg.parts);\n if (typeof o.text === \"string\") return o.text;\n return JSON.stringify(result);\n }\n return String(result ?? \"\");\n}\n\n/** Consume a remote A2A agent like a local one. */\nexport class A2AClient {\n private fetchFn: typeof fetch;\n private timeoutMs: number;\n\n constructor(\n readonly endpoint: string,\n opts: A2AClientOptions = {},\n ) {\n this.endpoint = endpoint.replace(/\\/$/, \"\");\n this.fetchFn = opts.fetchFn ?? fetch;\n this.timeoutMs = opts.timeoutMs ?? 300000;\n }\n\n async getCard(): Promise<AgentCard> {\n let res: Response;\n try {\n res = await this.fetchFn(`${this.endpoint}/.well-known/agent-card.json`, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n throw new AgentError(\"A2A_TRANSPORT\", `Agent card fetch failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) throw new AgentError(\"A2A_CARD\", `Agent card fetch failed: HTTP ${res.status}`, res.status >= 500);\n const card = (await res.json()) as AgentCard;\n if (!card?.name) throw new AgentError(\"A2A_CARD\", \"Invalid agent card (missing name)\", false);\n return card;\n }\n\n async send(text: string, contextId?: string): Promise<{ text: string; contextId?: string }> {\n let res: Response;\n try {\n res = await this.fetchFn(this.endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: `a2a-${Date.now().toString(36)}`,\n method: \"message/send\",\n params: {\n message: { role: \"user\", parts: [{ kind: \"text\", text }] },\n ...(contextId ? { contextId } : {}),\n },\n }),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n throw new AgentError(\"A2A_TRANSPORT\", `A2A send failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) throw new AgentError(\"A2A_TRANSPORT\", `A2A HTTP ${res.status}`, res.status >= 500);\n const rpc = (await res.json()) as { result?: unknown; error?: { message: string; code: number } };\n if (rpc.error) throw new AgentError(\"A2A_ERROR\", `Remote agent error: ${rpc.error.message}`, false);\n // Servers return the (possibly newly minted) contextId inside `result`.\n const resultContextId =\n rpc.result && typeof rpc.result === \"object\" ? (rpc.result as { contextId?: string }).contextId : undefined;\n return { text: parseSendResult(rpc.result), contextId: resultContextId ?? contextId };\n }\n}\n\n/** Wrap a remote agent as a framework Tool for orchestrators. */\nexport function a2aAsTool(client: A2AClient, opts: { name?: string; description?: string } = {}): Tool {\n return defineTool({\n name: opts.name ?? \"remote_agent\",\n description: opts.description ?? `Remote A2A agent at ${client.endpoint}`,\n schema: z.object({ input: z.string(), contextId: z.string().optional() }),\n execute: async ({ input, contextId }: { input: string; contextId?: string }) =>\n (await client.send(input, contextId)).text,\n });\n}\n\nexport interface A2AServerOptions {\n card: AgentCard;\n /**\n * Fresh agent per contextId (isolation). Retained up to maxContexts (LRU).\n * Return the SAME agent for a contextId to keep state in memory across\n * turns of one conversation, but never share one instance across contexts —\n * shared history leaks conversations between users.\n */\n agentFactory: (contextId: string) => Agent | Promise<Agent>;\n maxContexts?: number;\n port?: number;\n host?: string;\n /** Durable HITL threads: runs execute with { checkpointer, threadId: contextId }. */\n checkpointer?: Checkpointer;\n /** Browser frontends: reflected as Access-Control-Allow-Origin (+ OPTIONS handling). */\n corsOrigins?: string[];\n /** Max JSON-RPC request body bytes. Default 10 MiB. */\n maxBodyBytes?: number;\n}\n\n/** Serve a Framework agent over A2A (card + message/send). */\nexport class A2AServer {\n private server?: Server;\n private contexts = new Map<string, Agent>();\n private maxContexts: number;\n\n constructor(private opts: A2AServerOptions) {\n this.maxContexts = Math.max(1, opts.maxContexts ?? 1000);\n }\n\n private corsHeaders(origin: string | undefined): Record<string, string> {\n const allowed = this.opts.corsOrigins ?? [];\n if (!allowed.length || !origin) return {};\n if (!allowed.includes(\"*\") && !allowed.includes(origin)) return {};\n return {\n \"access-control-allow-origin\": allowed.includes(\"*\") ? \"*\" : origin,\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, authorization\",\n };\n }\n\n private runOpts(contextId: string): { checkpointer?: Checkpointer; threadId?: string } {\n return this.opts.checkpointer ? { checkpointer: this.opts.checkpointer, threadId: contextId } : {};\n }\n\n private async agentFor(contextId: string): Promise<Agent> {\n const existing = this.contexts.get(contextId);\n if (existing) {\n this.contexts.delete(contextId);\n this.contexts.set(contextId, existing);\n return existing;\n }\n const agent = await this.opts.agentFactory(contextId);\n this.contexts.set(contextId, agent);\n while (this.contexts.size > this.maxContexts) {\n const oldest = this.contexts.keys().next().value;\n if (oldest === undefined) break;\n this.contexts.delete(oldest);\n }\n return agent;\n }\n\n /** Read a request body with a hard cap; JSON.parse errors to the caller. */\n private readBody(req: IncomingMessage): Promise<string> {\n const max = this.opts.maxBodyBytes ?? 10 * 1024 * 1024;\n return new Promise<string>((resolve, reject) => {\n let data = \"\";\n req.on(\"data\", (c) => {\n data += c;\n if (data.length > max) {\n req.destroy();\n reject(new AgentError(\"A2A_BODY_TOO_LARGE\", `Request body exceeds ${max} bytes`, false));\n }\n });\n req.on(\"end\", () => resolve(data));\n req.on(\"error\", reject);\n });\n }\n\n private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const cors = this.corsHeaders(req.headers.origin);\n const send = (code: number, body: unknown): void => {\n res.writeHead(code, { \"content-type\": \"application/json\", ...cors });\n res.end(JSON.stringify(body));\n };\n try {\n if (req.method === \"OPTIONS\") {\n res.writeHead(204, { ...cors });\n res.end();\n return;\n }\n if (req.method === \"GET\" && (req.url === \"/ok\" || req.url === \"/health\")) {\n send(200, { ok: true });\n return;\n }\n if (req.method === \"GET\" && req.url === \"/.well-known/agent-card.json\") {\n send(200, this.opts.card);\n return;\n }\n if (req.method === \"POST\" && (req.url === \"/\" || req.url === \"\")) {\n const rpc = JSON.parse(await this.readBody(req)) as {\n id?: number | string;\n method?: string;\n params?: { message?: { parts?: unknown }; contextId?: string };\n };\n if (rpc.method !== \"message/send\") {\n send(200, { jsonrpc: \"2.0\", id: rpc.id, error: { code: -32601, message: `Unknown method: ${rpc.method}` } });\n return;\n }\n const contextId = rpc.params?.contextId ?? `ctx-${Date.now().toString(36)}`;\n const text = textOfParts(rpc.params?.message?.parts);\n const result = await (await this.agentFor(contextId)).run(text, this.runOpts(contextId));\n send(200, {\n jsonrpc: \"2.0\",\n id: rpc.id,\n result: { message: { role: \"agent\", parts: [{ kind: \"text\", text: result.text }] }, contextId },\n });\n return;\n }\n if (req.method === \"POST\" && req.url === \"/stream\") {\n const rpc = JSON.parse(await this.readBody(req)) as {\n id?: number | string;\n params?: { message?: { parts?: unknown }; contextId?: string };\n };\n const contextId = rpc.params?.contextId ?? `ctx-${Date.now().toString(36)}`;\n const text = textOfParts(rpc.params?.message?.parts);\n res.writeHead(200, { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\", connection: \"keep-alive\" });\n const write = (payload: unknown): void => {\n res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n };\n // Stop the agent when the client disconnects (headers already sent, so\n // we can only report the abort on the wire as a final error frame).\n const disconnect = new AbortController();\n res.on(\"close\", () => {\n if (!res.writableEnded) disconnect.abort();\n });\n try {\n const gen = (await this.agentFor(contextId)).stream(text, {\n signal: disconnect.signal,\n ...this.runOpts(contextId),\n });\n for (;;) {\n const next = await gen.next();\n if (next.done) {\n write({ contextId, done: true, text: next.value.text });\n break;\n }\n write({ contextId, event: next.value });\n }\n } catch (err) {\n write({ contextId, error: err instanceof Error ? err.message : String(err) });\n }\n write(\"[DONE]\");\n res.end();\n return;\n }\n send(404, { error: \"not found\" });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (res.headersSent) {\n // Mid-stream failure (e.g. oversized body): SSE headers already out.\n try {\n res.write(`data: ${JSON.stringify({ error: message })}\\n\\n`);\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } catch {\n // Socket gone — nothing more to do.\n }\n return;\n }\n send(\n err instanceof AgentError && err.code === \"A2A_BODY_TOO_LARGE\" ? 413 : 200,\n { jsonrpc: \"2.0\", id: null, error: { code: -32603, message } },\n );\n }\n }\n\n async start(port?: number, host?: string): Promise<number> {\n const listenPort = port ?? this.opts.port ?? 0;\n const listenHost = host ?? this.opts.host ?? \"127.0.0.1\";\n this.server = createServer((req, res) => void this.handle(req, res));\n await new Promise<void>((resolve) => this.server?.listen(listenPort, listenHost, () => resolve()));\n return (this.server.address() as { port: number }).port;\n }\n\n async stop(): Promise<void> {\n await new Promise<void>((resolve, reject) =>\n this.server ? this.server.close((e) => (e ? reject(e) : resolve())) : resolve(),\n );\n this.server = undefined;\n this.contexts.clear();\n }\n}\n","import { AgentError } from \"../types/index.js\";\nimport type { StreamEvent } from \"../streaming/index.js\";\nimport { A2AClient } from \"../a2a/index.js\";\n\n/**\n * Frontend/server-component client for Framework agents.\n * Framework-agnostic (fetch + async iterators): use directly in TanStack\n * Query loaders, Next.js route handlers/components, Svelte, or plain DOM.\n * React bindings live in framework-agents-react (thin layer over this client).\n */\n\nexport interface AgentClientOptions {\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n}\n\nexport class AgentClient {\n private a2a: A2AClient;\n private fetchFn: typeof fetch;\n readonly endpoint: string;\n\n constructor(endpoint: string, opts: AgentClientOptions = {}) {\n this.endpoint = endpoint.replace(/\\/$/, \"\");\n this.fetchFn = opts.fetchFn ?? fetch;\n this.a2a = new A2AClient(this.endpoint, opts);\n }\n\n async card() {\n return this.a2a.getCard();\n }\n\n async send(text: string, contextId?: string): Promise<{ text: string; contextId?: string }> {\n return this.a2a.send(text, contextId);\n }\n\n /** Live StreamEvents over SSE (`POST /stream`). Throws AgentError on server errors. */\n async *stream(\n text: string,\n contextId?: string,\n signal?: AbortSignal,\n opts: { onContext?: (contextId: string) => void } = {},\n ): AsyncGenerator<StreamEvent> {\n let res: Response;\n try {\n res = await this.fetchFn(`${this.endpoint}/stream`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"text/event-stream\" },\n // JSON-RPC envelope — the server reads params.message.parts.\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: `a2a-${Date.now().toString(36)}`,\n method: \"message/stream\",\n params: {\n message: { role: \"user\", parts: [{ kind: \"text\", text }] },\n ...(contextId ? { contextId } : {}),\n },\n }),\n ...(signal ? { signal } : {}),\n });\n } catch (err) {\n throw new AgentError(\"A2A_TRANSPORT\", `Stream failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok || !res.body) throw new AgentError(\"A2A_TRANSPORT\", `Stream HTTP ${res.status}`, res.status >= 500);\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const flush = function* (chunk: string): Generator<StreamEvent> {\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (payload === \"[DONE]\") continue;\n let msg: { contextId?: string; event?: StreamEvent; error?: string };\n try {\n msg = JSON.parse(payload) as { contextId?: string; event?: StreamEvent; error?: string };\n } catch {\n continue;\n }\n if (msg.contextId) opts.onContext?.(msg.contextId);\n if (msg.error) throw new AgentError(\"A2A_ERROR\", msg.error, false);\n if (msg.event && typeof msg.event.type === \"string\") yield msg.event;\n }\n };\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield* flush(decoder.decode(value, { stream: true }));\n }\n yield* flush(decoder.decode());\n } finally {\n // Early break/throw/abort: release the connection and stop the\n // upstream agent instead of letting the run finish in the background.\n await reader.cancel().catch(() => {});\n }\n }\n}\n\n/**\n * Next.js / TanStack Start route handler bridge: POST { text, contextId? }\n * → SSE stream of agent events. `AgentClient.stream` posts to\n * `${endpoint}/stream`, so mount this at `app/api/agent/stream/route.ts` and\n * point `useAgent({ endpoint: \"/api/agent\" })` (or AgentClient) at the parent:\n *\n * import { AgentClient, handleAgentRoute } from \"framework-agents\";\n * const client = new AgentClient(process.env.AGENT_URL!);\n * export const POST = (req: Request) => handleAgentRoute(req, client);\n *\n * The browser disconnect (req.signal) stops the upstream agent run.\n */\nexport async function handleAgentRoute(req: Request, client: AgentClient): Promise<Response> {\n const { text, contextId } = (await req.json()) as { text: string; contextId?: string };\n let latestContextId = contextId;\n const stream = new ReadableStream({\n async start(controller) {\n const send = (payload: unknown): void => {\n controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify(payload)}\\n\\n`));\n };\n try {\n for await (const event of client.stream(text, contextId, req.signal, {\n onContext: (id) => (latestContextId = id),\n })) {\n send({ contextId: latestContextId, event });\n }\n send({ contextId: latestContextId });\n send(\"[DONE]\");\n } catch (err) {\n send({ error: err instanceof Error ? err.message : String(err) });\n } finally {\n try {\n controller.close();\n } catch {\n // Already closed (e.g. browser disconnect while flushing).\n }\n }\n },\n });\n return new Response(stream, { headers: { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\" } });\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { config as dotenvConfig } from \"dotenv\";\nimport { z } from \"zod\";\nimport { Agent } from \"../agent/index.js\";\nimport { initChatModel } from \"../models/factory.js\";\nimport { A2AServer } from \"../a2a/index.js\";\nimport { SessionManager } from \"../sessions/index.js\";\nimport { LocalFileStorage } from \"../sessions/index.js\";\nimport { discoverSkills, SkillRegistry } from \"../skills/index.js\";\nimport { FileCheckpointer } from \"../checkpoint/index.js\";\nimport { filesystemMiddleware, todoListMiddleware } from \"../middleware/index.js\";\nimport type { AgentMiddleware } from \"../middleware/index.js\";\n\n/**\n * framework.json — declare agents, launch them as A2A servers.\n * Relative paths resolve against the config file's directory.\n */\n\nconst AgentDefSchema = z.object({\n name: z.string().min(1),\n description: z.string().default(\"\"),\n systemPrompt: z.string().default(\"You are a helpful agent. Use tools when needed. Be concise.\"),\n model: z.string(),\n port: z.number().int().positive().optional(),\n skills: z.array(z.string()).default([]),\n filesystem: z.string().optional(),\n todos: z.boolean().default(false),\n maxSteps: z.number().int().positive().default(8),\n sessionDir: z.string().optional(),\n /** Extra env file for this agent (keys override framework-level). */\n envFile: z.string().optional(),\n});\n\n/**\n * An agent entry is either inline or a file reference:\n * `{ \"file\": \"./agents/helper.json\" }` (plus optional inline overrides).\n */\nconst AgentEntrySchema = z.union([\n AgentDefSchema,\n z.object({ file: z.string() }).catchall(z.unknown()),\n]);\n\nconst FrameworkFileSchema = z.object({\n server: z.object({ host: z.string().default(\"127.0.0.1\"), basePort: z.number().int().min(0).default(8484) }).default({}),\n /** Framework-level env file(s), loaded before agents resolve models. */\n envFile: z.union([z.string(), z.array(z.string())]).optional(),\n /** Inline env mapping (applied after env files, overrides them). */\n env: z.record(z.string()).optional(),\n /** Local checkpoint dir for served agents (durable HITL threads). */\n checkpointer: z.object({ dir: z.string() }).optional(),\n http: z.object({ corsOrigins: z.array(z.string()).default([]) }).default({}),\n agents: z.array(AgentEntrySchema).min(1),\n});\n\nexport { FrameworkFileSchema };\n\nexport type FrameworkFile = z.infer<typeof FrameworkFileSchema>;\nexport type ServedAgent = { name: string; url: string; cardUrl: string; server: A2AServer };\nexport type ResolvedAgentDef = z.infer<typeof AgentDefSchema>;\n\n/** loadFrameworkConfig output: every entry resolved to a concrete agent def. */\nexport interface LoadedFrameworkFile {\n server: { host: string; basePort: number };\n envFile?: string | string[];\n env?: Record<string, string>;\n checkpointer?: { dir: string };\n http: { corsOrigins: string[] };\n agents: ResolvedAgentDef[];\n}\n\n/**\n * Load an env file if present (silent when missing). `override: false` fills\n * gaps like plain dotenv (the process environment wins); `override: true`\n * lets later files beat earlier ones — used for agent-level files, which the\n * config schema documents as overriding framework-level keys.\n */\nexport function loadEnvFile(path: string, override = true): void {\n dotenvConfig({ path, override });\n}\n\nfunction resolveAgentPaths(\n def: z.infer<typeof AgentDefSchema>,\n dir: string,\n): ResolvedAgentDef {\n return {\n ...def,\n skills: def.skills.map((s) => resolve(dir, s)),\n ...(def.filesystem ? { filesystem: resolve(dir, def.filesystem) } : {}),\n ...(def.sessionDir ? { sessionDir: resolve(dir, def.sessionDir) } : {}),\n ...(def.envFile ? { envFile: resolve(dir, def.envFile) } : {}),\n };\n}\n\n/** Merge file-owned keys (resolved against the agent file's dir) with inline overrides (framework dir). */\nfunction resolveAgentEntry(\n fileRaw: Record<string, unknown>,\n overrides: Record<string, unknown>,\n agentDir: string,\n frameworkDir: string,\n): ResolvedAgentDef {\n const fileKeys = new Set(Object.keys(fileRaw));\n const merged = AgentDefSchema.parse({ ...fileRaw, ...overrides });\n const against = (key: string): string => (fileKeys.has(key) && !(key in overrides) ? agentDir : frameworkDir);\n return {\n ...merged,\n skills: merged.skills.map((s) => resolve(against(\"skills\"), s)),\n ...(merged.filesystem ? { filesystem: resolve(against(\"filesystem\"), merged.filesystem) } : {}),\n ...(merged.sessionDir ? { sessionDir: resolve(against(\"sessionDir\"), merged.sessionDir) } : {}),\n ...(merged.envFile ? { envFile: resolve(against(\"envFile\"), merged.envFile) } : {}),\n };\n}\n\nexport function loadFrameworkConfig(path: string): LoadedFrameworkFile {\n const raw = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\n const parsed = FrameworkFileSchema.parse(raw);\n const dir = dirname(resolve(path));\n\n for (const envFile of parsed.envFile ? [parsed.envFile].flat() : []) {\n // Framework-level files fill gaps only — real environment variables win.\n loadEnvFile(resolve(dir, envFile), false);\n }\n for (const [key, value] of Object.entries(parsed.env ?? {})) {\n process.env[key] = value;\n }\n\n return {\n server: parsed.server,\n ...(parsed.envFile ? { envFile: parsed.envFile } : {}),\n ...(parsed.env ? { env: parsed.env } : {}),\n ...(parsed.checkpointer ? { checkpointer: { dir: resolve(dir, parsed.checkpointer.dir) } } : {}),\n http: parsed.http,\n agents: parsed.agents.map((entry) => {\n if (\"file\" in entry && typeof entry.file === \"string\") {\n const agentPath = resolve(dir, entry.file);\n const agentDir = dirname(agentPath);\n const fileRaw = JSON.parse(readFileSync(agentPath, \"utf8\")) as Record<string, unknown>;\n const { file: _file, ...overrides } = entry as Record<string, unknown>;\n void _file;\n const resolved = resolveAgentEntry(fileRaw, overrides, agentDir, dir);\n if (resolved.envFile) loadEnvFile(resolved.envFile);\n return resolved;\n }\n const resolved = resolveAgentPaths(AgentDefSchema.parse(entry), dir);\n if (resolved.envFile) loadEnvFile(resolved.envFile);\n return resolved;\n }),\n };\n}\n\nexport async function buildServedAgent(\n def: ResolvedAgentDef,\n opts: { sessionId?: string } = {},\n): Promise<{ agent: Agent; card: { name: string; description?: string } }> {\n const middlewares: AgentMiddleware[] = [];\n if (def.filesystem) middlewares.push(filesystemMiddleware({ root: def.filesystem }));\n if (def.todos) middlewares.push(todoListMiddleware());\n\n let systemPrompt = def.systemPrompt;\n if (def.skills.length) {\n const registry = new SkillRegistry();\n for (const dir of def.skills) {\n for (const s of await discoverSkills([dir])) {\n try {\n registry.register(s);\n } catch {\n // Duplicate skill names across dirs: first wins.\n }\n }\n }\n const catalog = registry.list().map((s) => `- ${s.name}: ${s.description}`).join(\"\\n\");\n if (catalog) systemPrompt += `\\n\\nAvailable skill packs (mention $name to invoke):\\n${catalog}`;\n }\n\n const agent = new Agent({\n name: def.name,\n description: def.description,\n systemPrompt,\n model: initChatModel(def.model),\n maxSteps: def.maxSteps,\n middleware: middlewares,\n ...(def.sessionDir\n ? {\n // Context-scoped id keeps one def's sessions from mingling when\n // the server runs a fresh agent per A2A contextId.\n sessionManager: new SessionManager({\n sessionId: opts.sessionId ?? def.name,\n storage: new LocalFileStorage(def.sessionDir),\n }),\n }\n : {}),\n });\n return { agent, card: { name: def.name, ...(def.description ? { description: def.description } : {}) } };\n}\n\nexport async function serveFramework(file: LoadedFrameworkFile): Promise<{ agents: ServedAgent[]; stop: () => Promise<void> }> {\n const served: ServedAgent[] = [];\n const checkpointer = file.checkpointer ? new FileCheckpointer(file.checkpointer.dir) : undefined;\n let port = file.server.basePort;\n for (const def of file.agents) {\n const { card } = await buildServedAgent(def);\n const server = new A2AServer({\n card,\n // Fresh agent per A2A contextId — sharing one instance would leak one\n // conversation into another context's history.\n agentFactory: (contextId) =>\n buildServedAgent(def, def.sessionDir ? { sessionId: `${def.name}:${contextId}` } : {}).then((r) => r.agent),\n ...(checkpointer ? { checkpointer } : {}),\n corsOrigins: file.http.corsOrigins,\n host: file.server.host,\n });\n const actual = await server.start(def.port ?? port, file.server.host);\n port = actual + 1;\n const url = `http://${file.server.host}:${actual}`;\n served.push({ name: def.name, url, cardUrl: `${url}/.well-known/agent-card.json`, server });\n }\n return {\n agents: served,\n stop: async () => {\n for (const s of served) await s.server.stop();\n },\n };\n}\n","import { AgentError } from \"../types/index.js\";\n\n/**\n * Model capability registry — researched defaults live here so users never\n * pick tiers. Full per-model research (vision, tools, reasoning, context\n * limits) lands later; until then: explicit allowlist + fail-fast error.\n */\n\nexport type ModelCapability = \"vision\" | \"tools\" | \"reasoning-stream\";\n\n/** Model ids known to accept image inputs (researched 2026-10; extended as models are verified). */\nconst VISION_CAPABLE_PATTERNS: RegExp[] = [\n /qwen2.*vl/i,\n /qwen.*vl/i,\n /llama-3\\.2-11b-vision/i,\n /llama-3\\.2-90b-vision/i,\n /llava/i,\n /minicpm-v/i,\n /gpt-4o/i,\n /gpt-4\\.1/i,\n /claude.*sonnet/i,\n /claude.*opus/i,\n /gemini/i,\n];\n\nexport function supportsVision(modelId: string): boolean {\n return VISION_CAPABLE_PATTERNS.some((re) => re.test(modelId));\n}\n\n/** Throw AgentError(MODEL_CAPABILITY) when input needs vision the model lacks. */\nexport function assertCanHandle(modelId: string, needsVision: boolean): void {\n if (needsVision && !supportsVision(modelId)) {\n throw new AgentError(\n \"MODEL_CAPABILITY\",\n `Model \"${modelId}\" cannot take image input. Switch TOGETHER_MODEL to a vision-capable model (e.g. Qwen/Qwen2.5-VL-72B-Instruct) or drop the images.`,\n false,\n );\n }\n}\n","import type { ChatMessage, ContentBlock } from \"../types/index.js\";\nimport { AgentError, hasImages, imagesOf, wireTextOf } from \"../types/index.js\";\nimport type { CompleteOptions, ModelCompletion, ModelProvider } from \"./index.js\";\nimport { assertCanHandle } from \"./capabilities.js\";\n\nexport interface OpenAICompatibleOptions {\n baseUrl: string;\n apiKey: string;\n model: string;\n temperature?: number;\n maxTokens?: number;\n /** Stream responses (SSE) so text + thinking tokens flow via callbacks. Default false. */\n stream?: boolean;\n /** fetch-compatible; injectable for tests. Defaults to global fetch. */\n fetchFn?: typeof fetch;\n}\n\ninterface ChoiceMessage {\n content?: string | null;\n /** Thinking trace: Together sends `reasoning`, vLLM/DeepSeek `reasoning_content`. */\n reasoning?: string | null;\n reasoning_content?: string | null;\n tool_calls?: { id?: string; function: { name: string; arguments: string } }[];\n}\n\ninterface StreamDelta {\n content?: string | null;\n /** Thinking deltas: Together sends `reasoning`, vLLM/DeepSeek `reasoning_content`. */\n reasoning?: string | null;\n reasoning_content?: string | null;\n tool_calls?: { id?: string; index?: number; function: { name?: string; arguments?: string } }[];\n}\n\n/** Reasoning-token count: Together reports it top-level, OpenAI nested in details. */\nfunction reasoningOf(usage: {\n reasoning_tokens?: number;\n completion_tokens_details?: { reasoning_tokens?: number };\n}): number | undefined {\n return usage.reasoning_tokens ?? usage.completion_tokens_details?.reasoning_tokens;\n}\n\n/** Thinking trace across provider field spellings. */\nfunction thinkingOf(m: { reasoning?: string | null; reasoning_content?: string | null }): string | undefined {\n const trace = m.reasoning ?? m.reasoning_content;\n return trace ? trace : undefined;\n}\n\nfunction toWireRole(role: ChatMessage[\"role\"]): string {\n if (role === \"tool\") return \"tool\";\n return role;\n}\n\nfunction toWireContent(m: ChatMessage): unknown {\n if (typeof m.content === \"string\" && !hasImages(m.content)) return m.content;\n const text = wireTextOf(m.content);\n const imgs = imagesOf(m.content);\n if (!imgs.length) return text;\n return [\n ...(text ? [{ type: \"text\", text }] : []),\n ...imgs.map((img) => ({\n type: \"image_url\",\n image_url: { url: img.data ? `data:${img.mimeType ?? \"image/jpeg\"};base64,${img.data}` : img.url },\n })),\n ];\n}\n\nfunction toWireMessage(m: ChatMessage): Record<string, unknown> {\n const base: Record<string, unknown> = { role: toWireRole(m.role), content: toWireContent(m) };\n if (m.toolCallId) base.tool_call_id = m.toolCallId;\n if (typeof m.content !== \"string\") {\n const calls = m.content.filter(\n (b): b is Extract<ContentBlock, { type: \"tool_call\" }> => b.type === \"tool_call\",\n );\n if (calls.length) {\n base.tool_calls = calls.map((c) => ({\n id: c.id,\n type: \"function\",\n function: { name: c.name, arguments: JSON.stringify(c.args ?? {}) },\n }));\n }\n }\n return base;\n}\n\n/**\n * Minimal OpenAI-compatible chat provider (OpenAI, TogetherAI, vLLM, etc.).\n * POST {baseUrl}/chat/completions with tools; no SDK dependency.\n * - Images: fail fast with MODEL_CAPABILITY when the model can't see.\n * - Thinking: reasoning_content streams through onThinking (SSE when stream: true).\n */\nexport class OpenAICompatibleProvider implements ModelProvider {\n readonly id: string;\n readonly capabilities = { structuredOutput: true, streaming: true };\n private opts: OpenAICompatibleOptions;\n\n constructor(opts: OpenAICompatibleOptions) {\n if (!opts.apiKey) throw new Error(\"OpenAICompatibleProvider: apiKey is required (.env TOGETHER_API_KEY / OPENAI_API_KEY)\");\n this.opts = { temperature: 0.2, ...opts };\n this.id = `openai-compatible:${opts.model}`;\n }\n\n async complete(options: CompleteOptions): Promise<ModelCompletion> {\n const { fetchFn = fetch, baseUrl, apiKey, model, temperature, maxTokens, stream } = this.opts;\n const needsVision = options.messages.some((m) => hasImages(m.content));\n assertCanHandle(model, needsVision);\n\n const url = `${baseUrl.replace(/\\/$/, \"\")}/chat/completions`;\n const body = {\n model,\n temperature,\n ...(maxTokens ? { max_tokens: maxTokens } : {}),\n // stream_options makes OpenAI-compatible servers attach usage to the final\n // chunk; without it streaming runs report {0,0} — budgets/cost would be fiction.\n ...(stream ? { stream: true, stream_options: { include_usage: true } } : {}),\n ...(options.responseFormat\n ? {\n response_format: {\n type: \"json_schema\",\n json_schema: {\n name: options.responseFormat.name,\n strict: options.responseFormat.strict ?? true,\n schema: options.responseFormat.schema,\n },\n },\n }\n : {}),\n messages: options.messages.map(toWireMessage),\n ...(options.tools?.length\n ? {\n tools: (options.tools ?? []).map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n // Without parameters the API advertises a zero-arg tool.\n ...(t.parametersSchema ? { parameters: t.parametersSchema } : {}),\n },\n })),\n }\n : {}),\n };\n\n let res: Response;\n try {\n res = await fetchFn(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", authorization: `Bearer ${apiKey}` },\n body: JSON.stringify(body),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n } catch (err) {\n throw new AgentError(\"MODEL_ERROR\", `Model request failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const retryable = res.status === 429 || res.status >= 500;\n throw new AgentError(\"MODEL_ERROR\", `Model HTTP ${res.status}: ${text.slice(0, 300)}`, retryable);\n }\n return stream\n ? this.readStream(res, options)\n : this.readJson(res, options);\n }\n\n private async readJson(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n const json = (await res.json()) as {\n choices: { message: ChoiceMessage; finish_reason?: string | null }[];\n usage?: { prompt_tokens: number; completion_tokens: number; reasoning_tokens?: number; completion_tokens_details?: { reasoning_tokens?: number } };\n };\n const choice = json.choices[0];\n const msg = choice?.message ?? {};\n const thinking = thinkingOf(msg);\n if (thinking) options.onThinking?.(thinking);\n if (msg.content) options.onToken?.(msg.content);\n const finishReason = choice?.finish_reason ?? undefined;\n // Reasoning-split guard: finish_reason=stop with EMPTY content, no tool\n // calls, and NON-EMPTY thinking means the whole answer landed in the\n // reasoning channel (thinking models do this on short replies). Partial\n // content with thinking keeps going.\n if (!msg.content && !(msg.tool_calls ?? []).length && thinking && finishReason === \"stop\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n \"Model stopped with finish_reason=stop having put the entire answer in the reasoning channel (empty content, no tool calls, thinking present). The reasoning/content split lost the reply — retry or raise maxTokens.\",\n true,\n );\n }\n // Silent-empty guard: a thinking model can burn its WHOLE maxTokens\n // budget before emitting any content. That must never come back as a\n // successful empty answer callers can't distinguish from a real reply.\n if (!msg.content && !(msg.tool_calls ?? []).length && finishReason === \"length\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n `Model spent its entire max_tokens budget (${json.usage?.completion_tokens ?? \"?\"} tokens, finish_reason=length) thinking without producing content. Raise maxTokens.`,\n false,\n );\n }\n const reasoningTokens = json.usage ? reasoningOf(json.usage) : undefined;\n return {\n text: msg.content ?? \"\",\n ...(thinking ? { thinking } : {}),\n toolCalls: parseToolCalls(msg.tool_calls ?? []),\n ...(finishReason ? { finishReason } : {}),\n usage: {\n inputTokens: json.usage?.prompt_tokens ?? 0,\n outputTokens: json.usage?.completion_tokens ?? 0,\n ...(reasoningTokens != null ? { reasoningTokens } : {}),\n },\n };\n }\n\n /** SSE: `data: {...}` lines; delta.content -> onToken, delta.reasoning_content -> onThinking. */\n private async readStream(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n if (!res.body) throw new Error(\"Streaming response has no body\");\n return this._readSse(res.body, options).catch((err) => {\n // aborts rethrown; AgentErrors carry their (delivered-aware) verdict\n if (err instanceof AgentError || (err instanceof Error && err.name === \"AbortError\")) throw err;\n throw new AgentError(\"MODEL_ERROR\", `Stream broke mid-response: ${err}`, false);\n });\n }\n\n private async _readSse(body: ReadableStream<Uint8Array>, options: CompleteOptions): Promise<ModelCompletion> {\n // Retry-verdict rule: once deltas reach the caller, a mid-stream failure\n // is NON-retryable (re-running would duplicate already-streamed text);\n // before any delta, failures stay retryable (nothing was delivered).\n let delivered = false;\n try {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let text = \"\";\n let thinking = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens: number | undefined;\n let finishReason: string | undefined;\n const toolArgBuffers = new Map<number, { id: string; name: string; args: string }>();\n let buffer = \"\";\n\n const flush = (chunk: string) => {\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (payload === \"[DONE]\") continue;\n let evt: {\n choices?: { delta?: StreamDelta; finish_reason?: string | null }[];\n usage?: null | { prompt_tokens?: number; completion_tokens?: number; reasoning_tokens?: number; completion_tokens_details?: { reasoning_tokens?: number } };\n };\n try {\n evt = JSON.parse(payload);\n } catch {\n continue;\n }\n if (evt.choices?.[0]?.finish_reason) finishReason = evt.choices[0].finish_reason ?? undefined;\n // The usage-only final chunk has an empty/partial choices array and a\n // NON-NULL usage Together sends `\"usage\": null` on content chunks.\n if (evt.usage) {\n if (evt.usage.prompt_tokens != null) inputTokens = evt.usage.prompt_tokens;\n if (evt.usage.completion_tokens != null) outputTokens = evt.usage.completion_tokens;\n const rt = reasoningOf(evt.usage);\n if (rt != null) reasoningTokens = rt;\n continue;\n }\n const delta = evt.choices?.[0]?.delta;\n if (!delta) continue;\n const think = thinkingOf(delta);\n if (think) {\n thinking += think;\n // Thinking deltas reach the caller like token deltas do — the\n // delivered verdict covers them (as well as tool fragments).\n delivered = true;\n options.onThinking?.(think);\n }\n if (delta.content) {\n text += delta.content;\n delivered = true;\n options.onToken?.(delta.content);\n }\n for (const [i, tc] of (delta.tool_calls ?? []).entries()) {\n const key = tc.index ?? i;\n // Tool-call fragments are delivered state too: a retry would\n // re-issue a call mid-assembly, so treat the attempt as spent.\n delivered = true;\n const slot = toolArgBuffers.get(key) ?? { id: \"\", name: \"\", args: \"\" };\n if (tc.id) slot.id = tc.id;\n if (tc.function?.name) slot.name = tc.function.name;\n if (tc.function?.arguments) slot.args += tc.function.arguments;\n toolArgBuffers.set(key, slot);\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n flush(decoder.decode(value, { stream: true }));\n }\n flush(decoder.decode());\n\n // Same reasoning-split guard as readJson: answer landed in the reasoning\n // channel and the stream carried NO content or tool calls.\n if (!text && !toolArgBuffers.size && thinking && finishReason === \"stop\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n \"Stream ended at finish_reason=stop having put the entire answer in the reasoning channel (no content, no tool calls, thinking present). The reasoning/content split lost the reply \\u2014 retry or raise maxTokens.\",\n true,\n );\n }\n // Same silent-empty guard as readJson: thought-past-budget stream.\n if (!text && !toolArgBuffers.size && finishReason === \"length\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n `Stream ended at finish_reason=length with no content (${outputTokens} tokens burned). Raise maxTokens.`,\n false,\n );\n }\n return {\n text,\n ...(thinking ? { thinking } : {}),\n ...(finishReason ? { finishReason } : {}),\n toolCalls: [...toolArgBuffers.values()]\n // Streamed ids must not repeat across turns (Anthropic rejects duplicates).\n .map((t) => ({ id: t.id || `call_${++callSeq}`, name: t.name, args: safeJson(t.args) })),\n usage: {\n inputTokens,\n outputTokens,\n ...(reasoningTokens != null ? { reasoningTokens } : {}),\n },\n };\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") throw err;\n // Explicit AgentError verdicts (reasoning-split / silent-empty guards)\n // pass through untouched.\n if (err instanceof AgentError) throw err;\n // delivered-aware verdict: deltas already streamed => non-retryable\n throw new AgentError(\"MODEL_ERROR\", `Stream broke mid-response${delivered ? \" (deltas already delivered)\" : \"\"}: ${err}`, !delivered);\n }\n }\n}\n\nlet callSeq = 0;\n\nfunction parseToolCalls(calls: { id?: string; function: { name: string; arguments: string } }[]): ModelCompletion[\"toolCalls\"] {\n return calls.map((c) => ({ id: c.id ?? `call_${++callSeq}`, name: c.function.name, args: safeJson(c.function.arguments || \"{}\") }));\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw || \"{}\");\n } catch {\n return {};\n }\n}\n\n/** Build a provider from env config (TogetherAI preferred when key present). */\nexport function providerFromEnv(\n active: { baseUrl: string; apiKey: string; model: string },\n extra?: Partial<OpenAICompatibleOptions>,\n): OpenAICompatibleProvider {\n return new OpenAICompatibleProvider({ baseUrl: active.baseUrl, apiKey: active.apiKey, model: active.model, ...extra });\n}\n","import { AgentError, hasImages, imagesOf, wireTextOf, type ChatMessage } from \"../types/index.js\";\nimport type { CompleteOptions, ModelCompletion, ModelProvider } from \"./index.js\";\nimport { assertCanHandle } from \"./capabilities.js\";\n\nexport interface AnthropicOptions {\n apiKey: string;\n model: string;\n baseUrl?: string;\n maxTokens?: number;\n temperature?: number;\n /** Extended thinking budget (tokens). Enables thinking blocks. */\n thinkingBudget?: number;\n stream?: boolean;\n fetchFn?: typeof fetch;\n}\n\ninterface AnthropicBlock {\n type: string;\n text?: string;\n thinking?: string;\n id?: string;\n name?: string;\n input?: unknown;\n}\n\n/** Anthropic calls its truncation stop reason differently — normalize. */\nfunction normalizeStopReason(stopReason?: string | null): string | undefined {\n if (!stopReason) return undefined;\n return stopReason === \"max_tokens\" ? \"length\" : stopReason;\n}\n\n/** Silent-empty guard: max_tokens burned with zero usable content. */\nfunction assertNotEmptyTruncation(text: string, toolCalls: unknown[], finishReason: string | undefined, tokenCount: number): void {\n if (!text && !toolCalls.length && finishReason === \"length\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n `Model stopped at max_tokens (${tokenCount} tokens) without producing content. Raise maxTokens.`,\n false,\n );\n }\n}\n\n/** Reasoning-split guard: finish_reason=stop with EMPTY text, no tool calls,\n * and NON-EMPTY thinking means the whole answer landed in the reasoning\n * channel (thinking models do this on short replies). Partial text with\n * thinking keeps going. */\nfunction assertNotEmptyReasoningSplit(text: string, toolCalls: unknown[], thinking: string, stopReason: string | undefined): void {\n if (!text && !toolCalls.length && thinking && stopReason === \"stop\") {\n throw new AgentError(\n \"MODEL_ERROR\",\n \"Model stopped with stop_reason=stop having put the entire answer in the reasoning channel (empty content, no tool calls, thinking present). The reasoning/content split lost the reply — retry or raise maxTokens.\",\n true,\n );\n }\n}\n\nfunction toAnthropicContent(m: ChatMessage): unknown {\n if (typeof m.content === \"string\") return m.content;\n const parts: unknown[] = [];\n const text = wireTextOf(m.content);\n if (text) parts.push({ type: \"text\", text });\n for (const img of imagesOf(m.content)) {\n parts.push({\n type: \"image\",\n source: img.data\n ? { type: \"base64\", media_type: img.mimeType ?? \"image/jpeg\", data: img.data }\n : { type: \"url\", url: img.url },\n });\n }\n for (const b of m.content) {\n if (b.type === \"tool_call\") parts.push({ type: \"tool_use\", id: b.id, name: b.name, input: b.args ?? {} });\n }\n return parts;\n}\n\n/**\n * Native Anthropic Messages API (fetch-based, no SDK).\n * - tools become `tools` with input_schema; tool results become tool_result blocks\n * - thinking blocks stream/return via onThinking\n * - no native json_schema mode: capabilities.structuredOutput is false,\n * so `auto` responseFormat correctly falls back to the tool strategy\n */\nexport class AnthropicProvider implements ModelProvider {\n readonly id: string;\n readonly capabilities = { structuredOutput: false, streaming: true };\n private opts: AnthropicOptions;\n\n constructor(opts: AnthropicOptions) {\n if (!opts.apiKey) throw new Error(\"AnthropicProvider: apiKey is required (.env ANTHROPIC_API_KEY)\");\n this.opts = { baseUrl: \"https://api.anthropic.com\", maxTokens: 1024, ...opts };\n // Extended thinking requires max_tokens > budget_tokens — fail at\n // construction with the fix, not as a confusing API 400 on first call.\n if (this.opts.thinkingBudget && this.opts.maxTokens != null && this.opts.maxTokens <= this.opts.thinkingBudget) {\n throw new Error(\n `AnthropicProvider: maxTokens (${this.opts.maxTokens}) must exceed thinkingBudget (${this.opts.thinkingBudget}); raise maxTokens`,\n );\n }\n this.id = `anthropic:${opts.model}`;\n }\n\n async complete(options: CompleteOptions): Promise<ModelCompletion> {\n const { fetchFn = fetch, apiKey, model, baseUrl, maxTokens, temperature, thinkingBudget, stream } = this.opts;\n const needsVision = options.messages.some((m) => hasImages(m.content));\n assertCanHandle(model, needsVision);\n\n const system = options.messages.filter((m) => m.role === \"system\").map((m) => wireTextOf(m.content)).join(\"\\n\\n\");\n const messages: { role: \"user\" | \"assistant\"; content: unknown }[] = [];\n for (const m of options.messages.filter((x) => x.role !== \"system\")) {\n if (m.role === \"tool\") {\n // Anthropic expects ALL tool_results from one assistant turn in a\n // single user message — group consecutive tool messages.\n const result = { type: \"tool_result\", tool_use_id: m.toolCallId, content: toAnthropicContent(m) };\n const last = messages[messages.length - 1];\n if (last && last.role === \"user\" && Array.isArray(last.content) && last.content.some((b) => (b as { type?: string }).type === \"tool_result\")) {\n last.content.push(result);\n continue;\n }\n messages.push({ role: \"user\", content: [result] });\n continue;\n }\n messages.push({ role: m.role === \"assistant\" ? (\"assistant\" as const) : (\"user\" as const), content: toAnthropicContent(m) });\n }\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n ...(system ? { system } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(thinkingBudget ? { thinking: { type: \"enabled\", budget_tokens: thinkingBudget } } : {}),\n ...(stream ? { stream: true } : {}),\n messages,\n ...(options.tools?.length\n ? {\n tools: (options.tools ?? []).map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parametersSchema ?? { type: \"object\" },\n })),\n }\n : {}),\n };\n\n let res: Response;\n try {\n res = await fetchFn(`${baseUrl!.replace(/\\/$/, \"\")}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n ...(stream ? { accept: \"text/event-stream\" } : {}),\n },\n body: JSON.stringify(body),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n } catch (err) {\n throw new AgentError(\"MODEL_ERROR\", `Model request failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const retryable = res.status === 429 || res.status >= 500;\n throw new AgentError(\"MODEL_ERROR\", `Model HTTP ${res.status}: ${text.slice(0, 300)}`, retryable);\n }\n return stream ? this.readStream(res, options) : this.readJson(res, options);\n }\n\n private toCompletion(blocks: AnthropicBlock[], usage: { inputTokens: number; outputTokens: number }, options: CompleteOptions): ModelCompletion {\n let text = \"\";\n let thinking = \"\";\n const toolCalls: ModelCompletion[\"toolCalls\"] = [];\n for (const b of blocks) {\n if (b.type === \"text\" && b.text) {\n text += b.text;\n options.onToken?.(b.text);\n } else if (b.type === \"thinking\" && b.thinking) {\n thinking += b.thinking;\n options.onThinking?.(b.thinking);\n } else if (b.type === \"tool_use\" && b.name) {\n toolCalls.push({ id: b.id ?? `call_${toolCalls.length}`, name: b.name, args: b.input ?? {} });\n }\n }\n return { text, ...(thinking ? { thinking } : {}), toolCalls, usage };\n }\n\n private async readJson(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n const json = (await res.json()) as {\n content?: AnthropicBlock[];\n stop_reason?: string | null;\n usage?: { input_tokens: number; output_tokens: number };\n };\n const out = this.toCompletion(json.content ?? [], {\n inputTokens: json.usage?.input_tokens ?? 0,\n outputTokens: json.usage?.output_tokens ?? 0,\n }, options);\n const finishReason = normalizeStopReason(json.stop_reason);\n assertNotEmptyTruncation(out.text, out.toolCalls, finishReason, json.usage?.output_tokens ?? 0);\n assertNotEmptyReasoningSplit(out.text, out.toolCalls, out.thinking ?? \"\", finishReason);\n return finishReason ? { ...out, finishReason } : out;\n }\n\n private async readStream(res: Response, options: CompleteOptions): Promise<ModelCompletion> {\n if (!res.body) throw new Error(\"Streaming response has no body\");\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let event = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let stopReason: string | undefined;\n const blocks: AnthropicBlock[] = [];\n let current: AnthropicBlock | undefined;\n let jsonInput = \"\";\n\n const flush = (chunk: string) => {\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t) continue;\n if (t.startsWith(\"event:\")) {\n event = t.slice(6).trim();\n continue;\n }\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (!payload) continue;\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(payload) as Record<string, unknown>;\n } catch {\n continue;\n }\n if (event === \"message_start\") {\n // message_start carries the input-side usage up front.\n const mu = ((data.message ?? {}) as { usage?: { input_tokens?: number } }).usage;\n if (mu?.input_tokens != null) inputTokens = mu.input_tokens;\n } else if (event === \"message_delta\") {\n // message_delta.usage.output_tokens is cumulative — assign, don't add.\n const du = (data.usage ?? {}) as { output_tokens?: number };\n if (du.output_tokens != null) outputTokens = du.output_tokens;\n const sr = (data.delta ?? {}) as { stop_reason?: string };\n if (sr.stop_reason) stopReason = normalizeStopReason(sr.stop_reason);\n } else if (event === \"content_block_start\") {\n const block = (data.content_block ?? {}) as AnthropicBlock;\n current = { type: block.type, id: block.id, name: block.name };\n jsonInput = \"\";\n } else if (event === \"content_block_delta\") {\n const delta = (data.delta ?? {}) as { type?: string; text?: string; thinking?: string; partial_json?: string };\n if (delta.text) {\n current = current ?? { type: \"text\" };\n current.text = (current.text ?? \"\") + delta.text;\n } else if (delta.thinking) {\n current = current ?? { type: \"thinking\" };\n current.thinking = (current.thinking ?? \"\") + delta.thinking;\n } else if (delta.partial_json) {\n jsonInput += delta.partial_json;\n }\n } else if (event === \"content_block_stop\") {\n if (current) {\n if (current.type === \"tool_use\") {\n try {\n current.input = JSON.parse(jsonInput || \"{}\") as unknown;\n } catch {\n current.input = {};\n }\n }\n blocks.push(current);\n current = undefined;\n }\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n flush(decoder.decode(value, { stream: true }));\n }\n flush(decoder.decode());\n if (current) blocks.push(current);\n const out = this.toCompletion(blocks, { inputTokens, outputTokens }, options);\n assertNotEmptyTruncation(out.text, out.toolCalls, stopReason, outputTokens);\n assertNotEmptyReasoningSplit(out.text, out.toolCalls, out.thinking ?? \"\", stopReason);\n return stopReason ? { ...out, finishReason: stopReason } : out;\n }\n}\n","import { OpenAICompatibleProvider } from \"./openai-compatible.js\";\n\nexport interface OllamaOptions {\n model: string;\n /** Defaults to local Ollama. No key needed. */\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n stream?: boolean;\n fetchFn?: typeof fetch;\n}\n\n/**\n * Local-first Ollama provider via its OpenAI-compatible endpoint.\n * No API key, no account, no network beyond localhost. Tool support\n * depends on the model (qwen2.5, llama3.1+ work well).\n * structuredOutput stays false → `auto` format uses the tool strategy.\n */\nexport class OllamaProvider extends OpenAICompatibleProvider {\n override readonly id: string;\n override readonly capabilities = { structuredOutput: false, streaming: true };\n\n constructor(opts: OllamaOptions) {\n super({\n baseUrl: opts.baseUrl ?? \"http://localhost:11434/v1\",\n apiKey: \"ollama\",\n model: opts.model,\n ...(opts.temperature != null ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens != null ? { maxTokens: opts.maxTokens } : {}),\n ...(opts.stream != null ? { stream: opts.stream } : {}),\n ...(opts.fetchFn ? { fetchFn: opts.fetchFn } : {}),\n });\n this.id = `ollama:${opts.model}`;\n }\n}\n\nexport function ollama(opts: OllamaOptions): OllamaProvider {\n return new OllamaProvider(opts);\n}\n","import { loadConfig } from \"../config/index.js\";\nimport type { ModelProvider } from \"./index.js\";\nimport { OpenAICompatibleProvider, type OpenAICompatibleOptions } from \"./openai-compatible.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OllamaProvider } from \"./ollama.js\";\n\n/**\n * Resolve `provider:model` strings to a configured provider.\n * - `together:<id>` / bare `<id>` → TogetherAI (TOGETHER_API_KEY)\n * - `openai:<id>` → OpenAI (OPENAI_API_KEY)\n * - `anthropic:<id>` → Anthropic native API (ANTHROPIC_API_KEY)\n * - `ollama:<id>` → local Ollama (no key; OLLAMA_BASE_URL or localhost:11434)\n * - `custom:<id>` + baseUrl/apiKey → any OpenAI-compatible endpoint\n */\nexport function initChatModel(\n spec: string,\n opts: {\n apiKey?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n stream?: boolean;\n thinkingBudget?: number;\n } = {},\n): ModelProvider {\n const cfg = loadConfig();\n const extra: Partial<OpenAICompatibleOptions> = {\n ...(opts.temperature != null ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens != null ? { maxTokens: opts.maxTokens } : {}),\n ...(opts.stream != null ? { stream: opts.stream } : {}),\n };\n const colon = spec.indexOf(\":\");\n const provider = colon > 0 ? spec.slice(0, colon) : \"together\";\n const model = colon > 0 ? spec.slice(colon + 1) : spec;\n switch (provider) {\n case \"together\": {\n const apiKey = opts.apiKey ?? cfg.TOGETHER_API_KEY;\n if (!apiKey) throw new Error(\"initChatModel: set TOGETHER_API_KEY in .env (or pass apiKey)\");\n return new OpenAICompatibleProvider({ baseUrl: opts.baseUrl ?? cfg.TOGETHER_BASE_URL, apiKey, model, ...extra });\n }\n case \"openai\": {\n const apiKey = opts.apiKey ?? cfg.OPENAI_API_KEY;\n if (!apiKey) throw new Error(\"initChatModel: set OPENAI_API_KEY in .env (or pass apiKey)\");\n return new OpenAICompatibleProvider({ baseUrl: opts.baseUrl ?? cfg.OPENAI_BASE_URL, apiKey, model, ...extra });\n }\n case \"anthropic\": {\n const apiKey = opts.apiKey ?? cfg.ANTHROPIC_API_KEY;\n if (!apiKey) throw new Error(\"initChatModel: set ANTHROPIC_API_KEY in .env (or pass apiKey)\");\n return new AnthropicProvider({\n apiKey,\n model,\n ...(opts.baseUrl ? { baseUrl: opts.baseUrl } : { baseUrl: cfg.ANTHROPIC_BASE_URL }),\n ...(opts.thinkingBudget != null ? { thinkingBudget: opts.thinkingBudget } : {}),\n ...extra,\n });\n }\n case \"ollama\": {\n return new OllamaProvider({ model, ...(opts.baseUrl ? { baseUrl: opts.baseUrl } : { baseUrl: cfg.OLLAMA_BASE_URL }), ...extra });\n }\n case \"custom\": {\n if (!opts.baseUrl || !opts.apiKey) throw new Error(\"initChatModel: custom: needs baseUrl + apiKey\");\n return new OpenAICompatibleProvider({ baseUrl: opts.baseUrl, apiKey: opts.apiKey, model, ...extra });\n }\n default:\n throw new Error(`initChatModel: unknown provider \"${provider}\" (use together:|openai:|anthropic:|ollama:|custom:)`);\n }\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Tool } from \"../tools/index.js\";\n\n/**\n * Skills: portable capability packs (SKILL.md + optional tools/resources).\n * Spec: a skill is a directory with SKILL.md frontmatter\n * (name, description, version) + markdown body. Loader discovers,\n * validates, and exposes skills as Tools or prompt injections.\n */\n\nexport interface Skill {\n name: string;\n description: string;\n version: string;\n path: string;\n body: string;\n tools?: Tool[];\n}\n\nexport interface SkillLoaderOptions {\n /** Directories to scan for SKILL.md files. */\n dirs: string[];\n /** If true, throw on invalid skill; else skip with warning. Default false. */\n strict?: boolean;\n}\n\nconst FrontmatterSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n version: z.string().default(\"0.1.0\"),\n});\n\n/** Parse SKILL.md content -> { meta, body }. Pure, testable, no FS. */\nexport function parseSkillFile(content: string, path = \"<inline>\"): Omit<Skill, \"tools\"> {\n // Tolerate a leading BOM and CRLF line endings (frontmatter at EOF is fine).\n const raw = content.startsWith(\"\") ? content.slice(1) : content;\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error(`Invalid SKILL.md (missing frontmatter): ${path}`);\n const [, fm, body] = match;\n const meta: Record<string, string> = {};\n for (const line of fm.split(\"\\n\")) {\n const i = line.indexOf(\":\");\n if (i > 0) meta[line.slice(0, i).trim()] = line.slice(i + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n const parsed = FrontmatterSchema.parse(meta);\n if (!body.trim()) throw new Error(`Invalid SKILL.md (empty body): ${path}`);\n return { ...parsed, path, body: body.trim() };\n}\n\n/** Registry of loaded skills — activation is explicit, never magic. */\nexport class SkillRegistry {\n private skills = new Map<string, Skill>();\n\n register(skill: Skill): this {\n if (this.skills.has(skill.name)) throw new Error(`Skill already registered: ${skill.name}`);\n this.skills.set(skill.name, skill);\n return this;\n }\n\n get(name: string): Skill | undefined {\n return this.skills.get(name);\n }\n\n list(): Skill[] {\n return [...this.skills.values()];\n }\n\n /** Expose each skill's tools (if any) for Agent consumption. */\n asTools(): Tool[] {\n return this.list().flatMap((s) => s.tools ?? []);\n }\n}\n\n/**\n * Scan directories for SKILL.md files (one level, plus direct files).\n * Invalid skills are skipped (or throw when `strict`). Never throws for\n * missing directories — returns what it finds.\n */\nexport async function discoverSkills(dirs: string[], opts: { strict?: boolean } = {}): Promise<Skill[]> {\n const found: Skill[] = [];\n for (const dir of dirs) {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n continue;\n }\n for (const entry of entries) {\n const full = join(dir, entry);\n let stat;\n try {\n stat = statSync(full);\n } catch {\n continue;\n }\n const file = stat.isDirectory() ? join(full, \"SKILL.md\") : full;\n if (!file.endsWith(\"SKILL.md\")) continue;\n try {\n found.push({ ...parseSkillFile(readFileSync(file, \"utf8\"), file), tools: [] });\n } catch (err) {\n if (opts.strict) throw err;\n }\n }\n }\n return found;\n}\n\n/** Load + register every discoverable skill. Duplicate names throw. */\nexport async function loadSkillsInto(registry: SkillRegistry, dirs: string[], opts: { strict?: boolean } = {}): Promise<Skill[]> {\n const skills = await discoverSkills(dirs, opts);\n for (const s of skills) registry.register(s);\n return skills;\n}\n\n/**\n * Local skill routing — dependency-free TF-IDF cosine over skill\n * name+description. Explicit `$name` mentions always win. No embedding\n * APIs, no network. A pluggable embedder can replace `scoreSkills`\n * later without changing `matchSkills`.\n */\nexport function tokenize(text: string): string[] {\n return text.toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length > 1);\n}\n\nexport function scoreSkills(registry: SkillRegistry, input: string): { skill: Skill; score: number }[] {\n const skills = registry.list();\n const docs = skills.map((s) => tokenize(`${s.name} ${s.description}`));\n const query = tokenize(input);\n const df = new Map<string, number>();\n for (const doc of docs) {\n for (const term of new Set(doc)) df.set(term, (df.get(term) ?? 0) + 1);\n }\n const idf = (term: string): number => Math.log((docs.length + 1) / ((df.get(term) ?? 0) + 1)) + 1;\n const qtf = new Map<string, number>();\n for (const t of query) qtf.set(t, (qtf.get(t) ?? 0) + 1);\n const qnorm = Math.sqrt([...qtf.values()].reduce((n, c) => n + c * c, 0)) || 1;\n\n return skills.map((skill, i) => {\n // Word-boundary match: `$test` must not fire on `$testing`, nor `$art` on\n // `$artillery` (bare substring includes did both).\n if (new RegExp(`\\\\$${skill.name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(?![\\\\w-])`).test(input)) {\n return { skill, score: Number.POSITIVE_INFINITY };\n }\n const dtf = new Map<string, number>();\n for (const t of docs[i]) dtf.set(t, (dtf.get(t) ?? 0) + 1);\n let dot = 0;\n let dnorm = 0;\n for (const [term, count] of dtf) {\n const w = count * idf(term);\n dnorm += w * w;\n if (qtf.has(term)) dot += w * (qtf.get(term) ?? 0) * idf(term);\n }\n const denom = Math.sqrt(dnorm) * qnorm || 1;\n return { skill, score: dot / denom };\n });\n}\n\nexport function matchSkills(registry: SkillRegistry, input: string, threshold = 0.05): Skill[] {\n return scoreSkills(registry, input)\n .filter(({ score }) => score >= threshold)\n .sort((a, b) => b.score - a.score)\n .map(({ skill }) => skill);\n}\n","import { z } from \"zod\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\nimport { tokenize } from \"../skills/index.js\";\n\n/**\n * Retrieval interface — no bundled vector DB (local-first).\n * Adapters: InMemoryRetriever (TF-IDF, dependency-free), SparqlRetriever\n * over any GraphStore. retrievalTool() exposes them to agents.\n */\n\nexport interface ScoredDoc {\n id: string;\n text: string;\n score: number;\n meta?: Record<string, unknown>;\n}\n\nexport interface Retriever {\n readonly id: string;\n search(query: string, k?: number): Promise<ScoredDoc[]>;\n}\n\n/** Dependency-free TF-IDF retriever over static documents. */\nexport class InMemoryRetriever implements Retriever {\n readonly id = \"tfidf\";\n private docs: { id: string; text: string; meta?: Record<string, unknown>; terms: Map<string, number> }[];\n private df = new Map<string, number>();\n\n constructor(docs: { id: string; text: string; meta?: Record<string, unknown> }[]) {\n this.docs = docs.map((d) => {\n const terms = new Map<string, number>();\n for (const t of tokenize(d.text)) terms.set(t, (terms.get(t) ?? 0) + 1);\n return { ...d, terms };\n });\n for (const d of this.docs) {\n for (const t of new Set(d.terms.keys())) this.df.set(t, (this.df.get(t) ?? 0) + 1);\n }\n }\n\n private idf(term: string): number {\n return Math.log((this.docs.length + 1) / ((this.df.get(term) ?? 0) + 1)) + 1;\n }\n\n async search(query: string, k = 4): Promise<ScoredDoc[]> {\n const qtf = new Map<string, number>();\n for (const t of tokenize(query)) qtf.set(t, (qtf.get(t) ?? 0) + 1);\n return this.docs\n .map((d) => {\n let dot = 0;\n let norm = 0;\n for (const [term, count] of d.terms) {\n const w = count * this.idf(term);\n norm += w * w;\n if (qtf.has(term)) dot += w * (qtf.get(term) ?? 0) * this.idf(term);\n }\n const qnorm = Math.sqrt([...qtf.values()].reduce((n, c) => n + c * c, 0)) || 1;\n return { id: d.id, text: d.text, meta: d.meta, score: dot / ((Math.sqrt(norm) || 1) * qnorm) };\n })\n .filter((d) => d.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n }\n}\n\nexport function retrievalTool(retriever: Retriever, opts: { k?: number; name?: string } = {}) {\n return defineTool({\n name: opts.name ?? \"retrieve\",\n description: `Search the knowledge base (${retriever.id}). Returns top passages with scores.`,\n schema: z.object({ query: z.string().min(1).max(500), k: z.number().int().min(1).max(10).default(opts.k ?? 4) }),\n execute: async ({ query, k }: { query: string; k?: number }) => retriever.search(query, k),\n });\n}\n\n/** SPARQL-backed retriever: keyword match over the closure, rendered as text. */\nexport function sparqlRetriever(\n store: { match: (s: string | null, p: string | null, o: string | null) => Promise<{ subject: string; predicate: string; object: string }[]> },\n opts: { id?: string } = {},\n): Retriever {\n return {\n id: opts.id ?? \"sparql\",\n search: async (query: string, k = 4) => {\n const terms = new Set(tokenize(query));\n if (!terms.size) return [];\n const quads = await store.match(null, null, null);\n return quads\n .map((q, i) => {\n const hay = `${q.subject} ${q.predicate} ${q.object}`.toLowerCase();\n let score = 0;\n for (const t of terms) if (hay.includes(t)) score += 1;\n return { id: `q${i}`, text: `${q.subject} ${q.predicate} ${q.object}`, score };\n })\n .filter((d) => d.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n },\n };\n}\n\nexport type { Tool };\n","import { runInNewContext } from \"node:vm\";\nimport { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * Sandboxed JavaScript execution (node:vm, fresh context per call).\n * Code runs as a program (completion value returned — wrap object literals\n * in parens). No require/fetch/process by default; timeout enforced; output\n * must be JSON-serializable (returned) or a string. For untrusted code\n * prefer an external container — this is a speed bump, not a security boundary.\n */\nexport function runJavascriptTool(opts: { timeoutMs?: number; maxOutputChars?: number } = {}) {\n const timeoutMs = opts.timeoutMs ?? 2000;\n const maxOutputChars = opts.maxOutputChars ?? 4000;\n return defineTool({\n name: \"run_javascript\",\n description: \"Execute JavaScript in a sandbox (no network, no fs, timeout). Completion value becomes the result.\",\n schema: z.object({ code: z.string().min(1).max(8000) }),\n execute: async ({ code }: { code: string }) => {\n let result: unknown;\n try {\n result = runInNewContext(code, Object.freeze({ Math, JSON }), { timeout: timeoutMs });\n } catch (err) {\n // NOTE: vm errors may be cross-realm (instanceof unreliable) — match on message.\n const message = err instanceof Error ? err.message : String(err);\n if (/timed out/i.test(message)) {\n throw new AgentError(\"SANDBOX_TIMEOUT\", `Sandbox exceeded ${timeoutMs}ms`, true);\n }\n throw new AgentError(\"SANDBOX_ERROR\", `Sandbox failed: ${message}`, false);\n }\n const text = typeof result === \"string\" ? result : JSON.stringify(result ?? null);\n return text.length > maxOutputChars ? `${text.slice(0, maxOutputChars)}…[truncated]` : (result ?? null);\n },\n });\n}\n\nimport { execFile } from \"node:child_process\";\nimport { readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join, relative, resolve } from \"node:path\";\nimport { filesystemTools } from \"../middleware/index.js\";\n\n/**\n * Sandbox backend (local-first): one rooted workspace with shell `execute`\n * plus file tools, matching the Deep Agents backend shape (ls, read_file,\n * write_file, edit_file, glob, grep + execute).\n *\n * Isolation, honestly scoped: fresh cwd jail per call, scrubbed env (no\n * secrets/proxies inherited), timeouts, output caps with spill-to-file.\n * This is NOT a container boundary: never put secrets in the sandbox env,\n * gate `execute` with human-in-the-loop for sensitive work, and treat all\n * outputs as untrusted input.\n */\n\nexport interface SandboxOptions {\n /** Workspace root. Defaults to cwd. */\n root?: string;\n timeoutMs?: number;\n maxOutputChars?: number;\n /** Extra env vars for shell commands (merged over the scrubbed base). */\n env?: Record<string, string>;\n}\n\nexport interface SandboxBackend {\n readonly root: string;\n tools(): Tool[];\n}\n\nconst SCRUBBED_ENV = [\"PATH\", \"HOME\", \"LANG\", \"LC_ALL\", \"TZ\", \"TERM\", \"NO_COLOR\"];\n\nfunction baseEnv(extra: Record<string, string> = {}): Record<string, string> {\n const env: Record<string, string> = {};\n for (const k of SCRUBBED_ENV) {\n const v = process.env[k];\n if (v !== undefined) env[k] = v;\n }\n return { ...env, ...extra };\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Minimal glob (*, ?, and double-star for crossing directories) over paths relative to root. */\nexport function matchGlob(pattern: string, path: string): boolean {\n const parts = pattern.split(\"**/\");\n let rx = \"^\";\n parts.forEach((part, index) => {\n if (index > 0) rx += \"(.*/)?\";\n for (let i = 0; i < part.length; i++) {\n const c = part[i];\n if (c === \"*\" && part[i + 1] === \"*\") {\n rx += \".*\";\n i += 1;\n } else if (c === \"*\") rx += \"[^/]*\";\n else if (c === \"?\") rx += \"[^/]\";\n else rx += escapeRegExp(c);\n }\n });\n return new RegExp(`${rx}$`).test(path);\n}\n\nasync function walkFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n const walk = async (dir: string): Promise<void> => {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n const full = join(dir, e.name);\n if (e.isDirectory()) await walk(full);\n else if (e.isFile()) out.push(relative(root, full));\n }\n };\n await walk(root);\n return out.sort();\n}\n\nexport function createSandboxBackend(opts: SandboxOptions = {}): SandboxBackend {\n const root = resolve(opts.root ?? process.cwd());\n const timeoutMs = opts.timeoutMs ?? 30000;\n const maxOutputChars = opts.maxOutputChars ?? 12000;\n const env = baseEnv(opts.env);\n let spills = 0;\n\n const spill = async (text: string): Promise<string> => {\n spills += 1;\n const name = `.spill-${spills}.txt`;\n await writeFile(join(root, name), text, \"utf8\");\n return `${text.slice(0, maxOutputChars)}\\n…[truncated ${text.length - maxOutputChars} chars → read ${name} with read_file]`;\n };\n\n const executeTool = defineTool({\n name: \"execute\",\n description: \"Run a shell command in the sandbox workspace (cwd=root, scrubbed env, timeout). Large output spills to a file.\",\n schema: z.object({ command: z.string().min(1).max(4000) }),\n execute: ({ command }: { command: string }): Promise<string> =>\n new Promise<string>((resolveExec, reject) => {\n execFile(\"sh\", [\"-c\", command], { cwd: root, env, timeout: timeoutMs, maxBuffer: 4 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err && (err as { killed?: boolean }).killed) {\n // killed=true covers TWO cases with different codes; don't report\n // an instant output overflow as a 30s timeout.\n if ((err as { code?: unknown }).code === \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\") {\n reject(new AgentError(\"SANDBOX_OUTPUT_TOO_LARGE\", \"Command output exceeded the 4MB buffer; write output to a file and read it in chunks\", false));\n return;\n }\n reject(new AgentError(\"SANDBOX_TIMEOUT\", `Command exceeded ${timeoutMs}ms`, true));\n return;\n }\n const code = err && \"code\" in err ? (err as { code: number }).code : 0;\n const combined = `${stdout}${stderr ? `\\n[stderr]\\n${stderr}` : \"\"}`;\n if (combined.length <= maxOutputChars) {\n resolveExec(err ? `${combined}\\n[Command failed with exit code ${code}]` : combined || \"[Command succeeded with exit code 0]\");\n return;\n }\n void spill(combined).then(\n (pointer) => resolveExec(`${pointer}\\n[exit ${code}]`),\n reject,\n );\n });\n }),\n });\n\n const globTool = defineTool({\n name: \"glob\",\n description: \"List workspace files matching a glob (*, ?, **).\",\n schema: z.object({ pattern: z.string().min(1).max(300) }),\n execute: async ({ pattern }: { pattern: string }) => (await walkFiles(root)).filter((f) => matchGlob(pattern, f)).join(\"\\n\"),\n });\n\n const grepTool = defineTool({\n name: \"grep\",\n description: \"Search file contents (literal substring) under a glob. Returns path:line matches.\",\n schema: z.object({ query: z.string().min(1).max(300), pattern: z.string().default(\"**\") }),\n execute: async ({ query, pattern }: { query: string; pattern?: string }) => {\n const files = (await walkFiles(root)).filter((f) => matchGlob(pattern ?? \"**\", f));\n const hits: string[] = [];\n for (const f of files.slice(0, 200)) {\n let info;\n try {\n info = await stat(join(root, f));\n } catch {\n continue;\n }\n if (info.size > 512 * 1024) continue;\n let content: string;\n try {\n content = await readFile(join(root, f), \"utf8\");\n } catch {\n continue;\n }\n content.split(\"\\n\").forEach((line, i) => {\n if (line.includes(query)) hits.push(`${f}:${i + 1}:${line.slice(0, 200)}`);\n });\n if (hits.length >= 50) break;\n }\n return hits.join(\"\\n\") || \"(no matches)\";\n },\n });\n\n return {\n root,\n tools: () => [...filesystemTools(root), globTool, grepTool, executeTool],\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Agent } from \"../agent/index.js\";\nimport type { TokenUsage } from \"../types/index.js\";\n\n/**\n * Evals: JSONL datasets + scoring + pass-rate reporter.\n * Offline by default (stub models); set EVAL_LIVE=1 to run cases\n * against the configured provider instead.\n */\n\nexport interface EvalExpect {\n contains?: string[];\n toolUsed?: string[];\n noStructuredError?: boolean;\n}\n\nexport interface EvalCase {\n id: string;\n input: string;\n expect?: EvalExpect;\n}\n\nexport interface EvalScore {\n id: string;\n pass: boolean;\n detail: string;\n usage: TokenUsage;\n}\n\nexport function loadJsonl(path: string): EvalCase[] {\n return readFileSync(path, \"utf8\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .map((l) => JSON.parse(l) as EvalCase);\n}\n\nexport async function runEval(cases: EvalCase[], makeAgent: (c: EvalCase) => Agent): Promise<{ scores: EvalScore[]; passRate: number }> {\n const scores: EvalScore[] = [];\n for (const c of cases) {\n try {\n const res = await makeAgent(c).run(c.input);\n const missing = (c.expect?.contains ?? []).filter((s) => !res.text.includes(s));\n const missingTools = (c.expect?.toolUsed ?? []).filter((t) => !res.toolCalls.some((tc) => tc.name === t));\n const pass = !missing.length && !missingTools.length;\n scores.push({\n id: c.id,\n pass,\n detail: pass ? \"ok\" : `missing text ${JSON.stringify(missing)} tools ${JSON.stringify(missingTools)} :: ${res.text.slice(0, 120)}`,\n usage: res.usage,\n });\n } catch (err) {\n scores.push({\n id: c.id,\n pass: false,\n detail: `threw: ${err instanceof Error ? err.message : String(err)}`,\n usage: { inputTokens: 0, outputTokens: 0 },\n });\n }\n }\n const passRate = scores.length ? scores.filter((s) => s.pass).length / scores.length : 1;\n return { scores, passRate };\n}\n\nexport function printReport(scores: EvalScore[], passRate: number): void {\n for (const s of scores) {\n console.log(`${s.pass ? \"PASS\" : \"FAIL\"} ${s.id} ${s.detail}`);\n }\n console.log(`\\npass rate: ${(passRate * 100).toFixed(1)}% (${scores.filter((s) => s.pass).length}/${scores.length})`);\n}\n","import { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { AgentError } from \"../types/index.js\";\nimport { ToolRejection, type AgentMiddleware } from \"../middleware/index.js\";\nimport type { AgentEvents, StepEvent, ToolCallEvent, ToolResultEvent, DoneEvent } from \"../observability/index.js\";\n\n/**\n * Tracing exporter: OTel-shaped spans (trace/span ids, timestamps,\n * attributes) from AgentEvents, sunk to console or JSONL. No OTel SDK —\n * the shape is compatible, the transport is local-first. Adapters to\n * Langfuse/LangSmith-style HTTP endpoints can POST these spans unchanged.\n */\n\nexport interface Span {\n traceId: string;\n spanId: string;\n parentId?: string;\n name: string;\n startedAt: string;\n endedAt?: string;\n attributes: Record<string, unknown>;\n}\n\nfunction hex(n: number): string {\n return [...Array(n)].map(() => Math.floor(Math.random() * 16).toString(16)).join(\"\");\n}\n\nexport interface SpanSink {\n emit(span: Span): void;\n}\n\nexport class ConsoleSpanSink implements SpanSink {\n emit(span: Span): void {\n console.log(`[trace] ${span.name}`, JSON.stringify(span.attributes));\n }\n}\n\nexport class JsonlSpanSink implements SpanSink {\n constructor(private path: string) {\n mkdirSync(dirname(path), { recursive: true });\n }\n emit(span: Span): void {\n appendFileSync(this.path, `${JSON.stringify(span)}\\n`, \"utf8\");\n }\n}\n\nexport class MemorySpanSink implements SpanSink {\n spans: Span[] = [];\n emit(span: Span): void {\n this.spans.push(span);\n }\n}\n\n/** Build AgentEvents that project run/step/tool lifecycle into spans. */\nexport function tracingEvents(sink: SpanSink, opts: { traceId?: string } = {}): AgentEvents {\n const traceId = opts.traceId ?? hex(32);\n const open = new Map<string, Span>();\n const emit = (name: string, attributes: Record<string, unknown>, parentId?: string): Span => {\n const span: Span = {\n traceId,\n spanId: hex(16),\n ...(parentId ? { parentId } : {}),\n name,\n startedAt: new Date().toISOString(),\n endedAt: new Date().toISOString(),\n attributes,\n };\n sink.emit(span);\n return span;\n };\n return {\n onStep: (e: StepEvent) => {\n emit(\"agent.step\", { step: e.step, messages: e.messages.length });\n },\n onToolCall: (e: ToolCallEvent) => {\n const span = emit(\"tool.call\", { tool: e.tool, args: e.args });\n open.set(e.tool, span);\n },\n onToolResult: (e: ToolResultEvent) => {\n const parent = open.get(e.tool);\n open.delete(e.tool);\n emit(\"tool.result\", { tool: e.tool, output: e.output }, parent?.spanId);\n },\n onToken: (delta: string) => {\n emit(\"model.token\", { delta: delta.slice(0, 200) });\n },\n onThinking: (delta: string) => {\n emit(\"model.thinking\", { delta: delta.slice(0, 200) });\n },\n onDone: (e: DoneEvent) => {\n emit(\"agent.done\", { text: e.text.slice(0, 500), toolCalls: e.toolCalls.length });\n },\n };\n}\n\n/**\n * Policy filter: allow/deny tool calls by name pattern before execution.\n * Denied calls become ToolRejection feedback (model continues) or throw\n * POLICY_DENY with exitBehavior \"error\".\n */\nexport function policyFilterMiddleware(opts: {\n allow?: (string | RegExp)[];\n deny?: (string | RegExp)[];\n exitBehavior?: \"continue\" | \"error\";\n}): AgentMiddleware {\n const match = (list: (string | RegExp)[] | undefined, name: string): boolean =>\n // `g`-flagged regexes are stateful across .test() calls — clone without\n // the flag so one tool name can't alternate denied/allowed.\n (list ?? []).some((p) =>\n typeof p === \"string\" ? p === name : new RegExp(p.source, p.flags.replace(\"g\", \"\")).test(name),\n );\n return {\n name: \"policy-filter\",\n beforeTool: (call) => {\n if (opts.deny && match(opts.deny, call.name)) {\n if (opts.exitBehavior === \"error\") {\n throw new AgentError(\"POLICY_DENY\", `Policy denies tool \"${call.name}\"`, false);\n }\n throw new ToolRejection(`Policy denies tool \"${call.name}\". Do not retry it; finish another way.`);\n }\n if (opts.allow && !match(opts.allow, call.name)) {\n throw new ToolRejection(`Policy allows only [${opts.allow.join(\", \")}]; \"${call.name}\" is not allowed.`);\n }\n return undefined;\n },\n };\n}\n","import type { AgentResult } from \"../types/index.js\";\n\n/**\n * Typed run events with independent projections.\n * Consume via `for await (const e of agent.stream(input))`.\n */\nexport type StreamEvent =\n | { type: \"step\"; step: number }\n | { type: \"token\"; delta: string }\n | { type: \"thinking\"; delta: string }\n | { type: \"tool_call\"; name: string; args: unknown }\n | { type: \"tool_result\"; name: string; output: unknown }\n | { type: \"done\"; text: string };\n\n/** Collect a stream into buckets — handy for tests and simple UIs. */\nexport async function collectStream(\n stream: AsyncGenerator<StreamEvent, AgentResult>,\n): Promise<{ events: StreamEvent[]; result: AgentResult }> {\n const events: StreamEvent[] = [];\n for (;;) {\n const next = await stream.next();\n if (next.done) return { events, result: next.value };\n events.push(next.value);\n }\n}\n","import { textOf, type ChatMessage } from \"../types/index.js\";\nimport type { Memory } from \"../memory/index.js\";\n\n/**\n * Compaction: keep long runs inside the context window without losing meaning.\n * Strategy (P1): oldest messages -> model/pluggable summarizer -> single\n * boundary message. Semantic variant keeps extracted triples, drops prose.\n */\n\nexport interface CompactionOptions {\n /** Compact when messages exceed this count. Default 40. */\n maxMessages?: number;\n /** Summarizer: (messages to compress) -> summary text. Default: extractive stub. */\n summarize?: (messages: ChatMessage[]) => Promise<string>;\n}\n\nexport function defaultSummarize(messages: ChatMessage[]): Promise<string> {\n const head = messages\n .filter((m) => m.role !== \"system\")\n .slice(0, 5)\n .map((m) => `[${m.role}] ${textOf(m.content).slice(0, 200)}`)\n .join(\"\\n\");\n return Promise.resolve(`Prior context summary (${messages.length} msgs):\\n${head}`);\n}\n\n/** Wrap any Memory with auto-compaction. */\nexport class CompactedMemory implements Memory {\n constructor(\n private inner: Memory,\n private opts: CompactionOptions = {},\n ) {}\n\n async load(): Promise<ChatMessage[]> {\n return this.inner.load();\n }\n\n async save(messages: ChatMessage[]): Promise<void> {\n await this.inner.save(messages);\n const max = this.opts.maxMessages ?? 40;\n const current = await this.inner.load();\n if (current.length <= max) return;\n const summarize = this.opts.summarize ?? defaultSummarize;\n const overflow = current.slice(0, current.length - max + 1);\n const rest = current.slice(current.length - max + 1);\n const summary = await summarize(overflow);\n await this.inner.clear();\n await this.inner.save([{ role: \"assistant\", content: summary }, ...rest]);\n }\n\n async clear(): Promise<void> {\n return this.inner.clear();\n }\n}\n","import type { ChatMessage, TokenUsage } from \"../types/index.js\";\n\nexport interface ToolCallRequest {\n /** Provider tool-call id; generated when the provider omits it. */\n id: string;\n name: string;\n args: unknown;\n}\n\nexport interface ModelCompletion {\n text: string;\n /** Thinking/reasoning trace, when the provider exposes it. */\n thinking?: string;\n toolCalls: ToolCallRequest[];\n usage: TokenUsage;\n /**\n * Provider stop reason when reported (\"stop\", \"length\"/\"max_tokens\",\n * \"tool_calls\", ...). Consumers can detect truncation; a TOTAL truncation\n * (no content at all) throws MODEL_ERROR at the provider instead.\n */\n finishReason?: string;\n}\n\nexport interface ResponseFormatWire {\n name: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n}\n\nexport interface CompleteOptions {\n messages: ChatMessage[];\n /** Tool metadata; `parametersSchema` (JSON Schema) lets models call with real args — omit only for zero-arg tools. */\n tools?: { name: string; description: string; parametersSchema?: Record<string, unknown> }[];\n /** Native structured output (OpenAI `response_format`). Honored when the provider supports it. */\n responseFormat?: ResponseFormatWire;\n /** Streamed text deltas (non-thinking). */\n onToken?: (delta: string) => void;\n /** Streamed thinking/reasoning deltas (reasoning_content). */\n onThinking?: (delta: string) => void;\n /** Aborts the in-flight provider request (fetch). */\n signal?: AbortSignal;\n}\n\n/** Provider abstraction — implement OpenAI/Anthropic/etc. behind this. */\nexport interface ModelProvider {\n readonly id: string;\n readonly capabilities?: { structuredOutput?: boolean; vision?: boolean; streaming?: boolean };\n complete(options: CompleteOptions): Promise<ModelCompletion>;\n}\n\n/** Deterministic mock for tests/examples — no network. */\nexport class MockModelProvider implements ModelProvider {\n readonly id = \"mock\";\n readonly capabilities = { structuredOutput: false, streaming: false };\n private calls = 0;\n\n async complete(_options: CompleteOptions): Promise<ModelCompletion> {\n this.calls += 1;\n return {\n text: `mock-response-${this.calls}`,\n toolCalls: [],\n usage: { inputTokens: 10, outputTokens: 5 },\n };\n }\n}\n\nexport * from \"./openai-compatible.js\";\nexport * from \"./capabilities.js\";\nexport * from \"./factory.js\";\nexport * from \"./anthropic.js\";\nexport * from \"./ollama.js\";\nexport * from \"./pricing.js\";\n","import type { ChatMessage, AgentResult } from \"../types/index.js\";\n\nexport interface StepEvent {\n step: number;\n messages: ChatMessage[];\n}\n\nexport interface ToolCallEvent {\n tool: string;\n args: unknown;\n}\n\nexport interface ToolResultEvent {\n tool: string;\n output: unknown;\n}\n\nexport interface DoneEvent {\n text: string;\n toolCalls: AgentResult[\"toolCalls\"];\n}\n\n/** Observability hooks — plug logger/tracer here, keep core dependency-free. */\nexport interface AgentEvents {\n onStep?: (e: StepEvent) => void;\n onToolCall?: (e: ToolCallEvent) => void;\n onToolResult?: (e: ToolResultEvent) => void;\n onDone?: (e: DoneEvent) => void;\n /** Streamed text deltas. */\n onToken?: (delta: string) => void;\n /** Streamed thinking/reasoning deltas. */\n onThinking?: (delta: string) => void;\n}\n\n/** Minimal ANSI colors, dependency-free. Honors NO_COLOR and non-TTY. */\nexport function supportsColor(): boolean {\n return !process.env.NO_COLOR && !!process.stdout?.isTTY;\n}\n\nconst C = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n cyan: \"\\x1b[36m\",\n yellow: \"\\x1b[33m\",\n green: \"\\x1b[32m\",\n magenta: \"\\x1b[35m\",\n red: \"\\x1b[31m\",\n};\n\nfunction paint(color: keyof typeof C, text: string, on: boolean): string {\n if (!on || color === \"reset\") return text;\n return `${C[color]}${text}${C.reset}`;\n}\n\nexport interface ConsoleEventsOptions {\n prefix?: string;\n /** Force colors on/off. Default: auto (TTY without NO_COLOR). */\n colors?: boolean;\n}\n\nexport function consoleEvents(prefix?: string, opts?: ConsoleEventsOptions): AgentEvents;\nexport function consoleEvents(opts: ConsoleEventsOptions): AgentEvents;\nexport function consoleEvents(prefixOrOpts: string | ConsoleEventsOptions = \"[agent]\", maybeOpts: ConsoleEventsOptions = {}): AgentEvents {\n const { prefix, colors }: { prefix: string; colors: boolean } =\n typeof prefixOrOpts === \"string\"\n ? { prefix: prefixOrOpts, colors: maybeOpts.colors ?? supportsColor() }\n : { prefix: prefixOrOpts.prefix ?? \"[agent]\", colors: prefixOrOpts.colors ?? supportsColor() };\n const tag = (color: keyof typeof C, label: string): string => `${paint(color, `${prefix} ${label}`, colors)}`;\n return {\n onStep: (e) => console.log(tag(\"cyan\", `step ${e.step} (${e.messages.length} msgs)`)),\n onToolCall: (e) => console.log(tag(\"yellow\", `tool:call ${e.tool}`), e.args),\n onToolResult: (e) => console.log(tag(\"green\", `tool:result ${e.tool}`), e.output),\n onDone: (e) => console.log(tag(\"green\", paint(\"bold\", \"done:\", colors)), e.text),\n onToken: (d) => process.stdout.write(d),\n onThinking: (d) => process.stdout.write(paint(\"dim\", d, colors)),\n };\n}\n\n/** Red error line for failures (pairs with consoleEvents). */\nexport function logError(prefix: string, err: unknown, colors?: boolean): void {\n const on = colors ?? supportsColor();\n const message = err instanceof Error ? (err.stack ?? err.message) : String(err);\n console.error(paint(\"red\", `${prefix} error:`, on), message);\n}\n","import { AgentError, type AgentResult } from \"../types/index.js\";\nimport type { Agent, RunOptions } from \"../agent/index.js\";\nimport type { InvocationState } from \"../state/index.js\";\nimport type { ModelProvider } from \"../models/index.js\";\nimport type { AgentEvents } from \"../observability/index.js\";\n\nexport type OrchestrationStrategy = \"sequential\" | \"parallel\" | \"router\";\n\nexport interface OrchestrationPlan {\n strategy: OrchestrationStrategy;\n agents: Agent[];\n /** Max concurrent agents for parallel. Default: all at once. */\n concurrency?: number;\n /** Model that picks the agent for router. Defaults to the first agent's model. */\n routerModel?: ModelProvider;\n events?: AgentEvents;\n}\n\nexport interface OrchestratedResult {\n strategy: OrchestrationStrategy;\n results: AgentResult[];\n /** Combined text: last result (sequential/router), joined (parallel). */\n text: string;\n /** Router only: index of the chosen agent. */\n routedTo?: number;\n}\n\nfunction requireAgents(plan: OrchestrationPlan): void {\n if (!plan.agents.length) throw new AgentError(\"ORCHESTRATION_EMPTY\", \"Orchestration needs at least one agent\", false);\n}\n\n/** Chain: each agent receives the previous agent's text appended to the input. */\nasync function runSequential(\n plan: OrchestrationPlan,\n input: string,\n opts: { signal?: AbortSignal; invocationState?: InvocationState } = {},\n): Promise<OrchestratedResult> {\n requireAgents(plan);\n const results: AgentResult[] = [];\n let current = input;\n for (let i = 0; i < plan.agents.length; i++) {\n opts.signal?.throwIfAborted();\n plan.events?.onStep?.({ step: i, messages: [] });\n const res = await plan.agents[i].run(current, { signal: opts.signal, invocationState: opts.invocationState });\n results.push(res);\n current = `${input}\\n\\nPrevious result (${plan.agents[i].name}):\\n${res.text}`;\n }\n return { strategy: \"sequential\", results, text: results.at(-1)?.text ?? \"\" };\n}\n\n/** Fan-out with a concurrency cap; results keep agent order. */\nasync function runParallel(\n plan: OrchestrationPlan,\n input: string,\n opts: { signal?: AbortSignal; invocationState?: InvocationState } = {},\n): Promise<OrchestratedResult> {\n requireAgents(plan);\n const limit = Math.max(1, plan.concurrency ?? plan.agents.length);\n const results: AgentResult[] = new Array(plan.agents.length);\n let next = 0;\n const workers = Array.from({ length: Math.min(limit, plan.agents.length) }, async () => {\n for (;;) {\n opts.signal?.throwIfAborted();\n const i = next++;\n if (i >= plan.agents.length) return;\n results[i] = await plan.agents[i].run(input, { signal: opts.signal, invocationState: opts.invocationState });\n }\n });\n await Promise.all(workers);\n return { strategy: \"parallel\", results, text: results.map((r) => r.text).join(\"\\n\\n\") };\n}\n\n/** One model call picks the agent by index; only that agent runs. */\nasync function runRouter(\n plan: OrchestrationPlan,\n input: string,\n opts: { signal?: AbortSignal; invocationState?: InvocationState } = {},\n): Promise<OrchestratedResult> {\n requireAgents(plan);\n const routerModel = plan.routerModel ?? plan.agents[0].model;\n const menu = plan.agents.map((a, i) => `${i}: ${a.name}${a.description ? ` — ${a.description}` : \"\"}`).join(\"\\n\");\n const pick = await routerModel.complete({\n messages: [\n { role: \"system\", content: \"You route user requests to specialist agents. Reply with ONLY the agent number.\" },\n { role: \"user\", content: `Agents:\\n${menu}\\n\\nRequest: ${input}` },\n ],\n tools: [],\n });\n const match = pick.text.match(/\\d+/);\n const idx = match ? Number.parseInt(match[0], 10) : Number.NaN;\n if (!Number.isInteger(idx) || idx < 0 || idx >= plan.agents.length) {\n throw new AgentError(\"ROUTER_NO_MATCH\", `Router picked invalid agent: ${JSON.stringify(pick.text)}`, false);\n }\n const res = await plan.agents[idx].run(input, { signal: opts.signal, invocationState: opts.invocationState });\n return { strategy: \"router\", results: [res], text: res.text, routedTo: idx };\n}\n\nexport async function runOrchestrated(plan: OrchestrationPlan, input: string, signal?: AbortSignal): Promise<OrchestratedResult>;\nexport async function runOrchestrated(plan: OrchestrationPlan, input: string, opts?: RunOptions): Promise<OrchestratedResult>;\nexport async function runOrchestrated(\n plan: OrchestrationPlan,\n input: string,\n signalOrOpts?: AbortSignal | RunOptions,\n): Promise<OrchestratedResult> {\n const opts: RunOptions = signalOrOpts instanceof AbortSignal ? { signal: signalOrOpts } : (signalOrOpts ?? {});\n switch (plan.strategy) {\n case \"sequential\":\n return runSequential(plan, input, opts);\n case \"parallel\":\n return runParallel(plan, input, opts);\n case \"router\":\n return runRouter(plan, input, opts);\n }\n}\n","import { AgentError } from \"../types/index.js\";\nimport type { InvocationState } from \"../state/index.js\";\nimport { sleep } from \"../utils/index.js\";\n\n/** DAG workflow node. `ctx` maps completed node ids to their results. */\nexport interface WorkflowNode {\n id: string;\n run: (ctx: Record<string, unknown>, invocationState?: InvocationState) => Promise<unknown>;\n dependsOn?: string[];\n /** Retry policy. Default: no retry (attempts: 1). Abort always rethrows. */\n retry?: { attempts?: number; backoffMs?: number };\n}\n\nexport interface WorkflowOptions {\n signal?: AbortSignal;\n /** Shared per-run data passed to every node (never sent to models by itself). */\n invocationState?: InvocationState;\n}\n\nfunction sortTopo(nodes: WorkflowNode[]): WorkflowNode[][] {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n if (byId.size !== nodes.length) throw new AgentError(\"WORKFLOW_DUPLICATE_ID\", \"Workflow node ids must be unique\", false);\n for (const n of nodes) {\n for (const dep of n.dependsOn ?? []) {\n if (!byId.has(dep)) throw new AgentError(\"WORKFLOW_UNKNOWN_DEP\", `Node \"${n.id}\" depends on unknown node \"${dep}\"`, false);\n if (dep === n.id) throw new AgentError(\"WORKFLOW_CYCLE\", `Node \"${n.id}\" depends on itself`, false);\n }\n }\n // Deduplicate: `dependsOn: [\"a\", \"a\"]` is one edge, not two — counting it\n // twice wedges indegree at 1 and misreports a legal graph as a cycle.\n const indegree = new Map(nodes.map((n) => [n.id, n.dependsOn ? new Set(n.dependsOn).size : 0]));\n const levels: WorkflowNode[][] = [];\n let ready = nodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);\n while (ready.length) {\n levels.push(ready);\n const next: WorkflowNode[] = [];\n for (const n of nodes) {\n if (!ready.includes(n)) continue;\n for (const m of nodes) {\n if (!(m.dependsOn ?? []).includes(n.id)) continue;\n indegree.set(m.id, (indegree.get(m.id) ?? 1) - 1);\n if (indegree.get(m.id) === 0) next.push(m);\n }\n }\n ready = next;\n }\n if (levels.flat().length !== nodes.length) {\n throw new AgentError(\"WORKFLOW_CYCLE\", \"Workflow has a dependency cycle\", false);\n }\n return levels;\n}\n\nasync function runWithRetry(\n node: WorkflowNode,\n ctx: Record<string, unknown>,\n signal?: AbortSignal,\n invocationState?: InvocationState,\n): Promise<unknown> {\n const attempts = Math.max(1, node.retry?.attempts ?? 1);\n const backoffMs = node.retry?.backoffMs ?? 0;\n let last: unknown;\n for (let i = 0; i < attempts; i++) {\n signal?.throwIfAborted();\n try {\n return await node.run(ctx, invocationState);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"AbortError\") throw err;\n last = err;\n if (i < attempts - 1 && backoffMs > 0) await sleep(backoffMs, signal);\n }\n }\n throw last;\n}\n\n/**\n * Execute a DAG: topological levels run in order, nodes within a level\n * run concurrently. Returns id -> result. Throws structured WORKFLOW_* errors.\n */\nexport async function runWorkflow(nodes: WorkflowNode[], opts: WorkflowOptions = {}): Promise<Record<string, unknown>> {\n const ctx: Record<string, unknown> = {};\n for (const level of sortTopo(nodes)) {\n opts.signal?.throwIfAborted();\n const entries = await Promise.all(\n level.map(async (n) => [n.id, await runWithRetry(n, ctx, opts.signal, opts.invocationState)] as const),\n );\n for (const [id, value] of entries) ctx[id] = value;\n }\n return ctx;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * MCP (Model Context Protocol) client.\n * - Streamable HTTP transport (POST JSON-RPC; JSON or SSE responses).\n * - stdio transport (spawned server, line-delimited JSON-RPC).\n * - `mcpToolsToFramework` bridges MCP tool defs to framework Tools,\n * converting JSON Schema input schemas to zod.\n */\n\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface McpClientOptions {\n fetchFn?: typeof fetch;\n headers?: Record<string, string>;\n clientName?: string;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id?: number | string;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\nlet rpcSeq = 0;\n\n/** Minimal JSON Schema -> zod (objects, string/number/integer/boolean/array/enum/null; else unknown). */\nexport function jsonSchemaToZod(schema: Record<string, unknown>): z.ZodType<unknown> {\n const type = schema.type as string | undefined;\n if (Array.isArray(schema.enum)) {\n // JSON Schema enums may be numbers or mixed — z.enum needs strings.\n const values = schema.enum as unknown[];\n if (values.length && values.every((v) => typeof v === \"string\")) return z.enum(values as [string, ...string[]]);\n if (values.length) {\n const literals = values.map((v) => z.literal(v as string | number | bigint | boolean | null));\n return literals.length > 1 ? z.union(literals as unknown as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]) : literals[0];\n }\n return z.never();\n }\n switch (type) {\n case \"string\":\n return z.string();\n case \"number\":\n return z.number();\n case \"integer\":\n return z.number().int();\n case \"boolean\":\n return z.boolean();\n case \"null\":\n return z.null();\n case \"array\": {\n const items = schema.items as Record<string, unknown> | undefined;\n return z.array(items ? jsonSchemaToZod(items) : z.unknown());\n }\n case \"object\": {\n const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required ?? []) as string[]);\n const shape: Record<string, z.ZodType<unknown>> = {};\n for (const [key, sub] of Object.entries(props)) {\n const inner = jsonSchemaToZod(sub);\n shape[key] = required.has(key) ? inner : inner.optional();\n }\n return z.object(shape).passthrough();\n }\n default:\n return z.unknown();\n }\n}\n\nasync function parseStreamableResponse(res: Response): Promise<JsonRpcResponse> {\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"text/event-stream\")) {\n const text = await res.text();\n let last: JsonRpcResponse | undefined;\n for (const line of text.split(\"\\n\")) {\n const t = line.trim();\n if (!t.startsWith(\"data:\")) continue;\n const payload = t.slice(5).trim();\n if (payload === \"[DONE]\") continue;\n try {\n const msg = JSON.parse(payload) as JsonRpcResponse;\n if (msg.id !== undefined || msg.result !== undefined || msg.error) last = msg;\n } catch {\n continue;\n }\n }\n if (!last) throw new AgentError(\"MCP_PROTOCOL\", \"Empty SSE response from MCP server\", true);\n return last;\n }\n return (await res.json()) as JsonRpcResponse;\n}\n\nfunction checkRpc(res: JsonRpcResponse, what: string): unknown {\n if (res.error) throw new AgentError(\"MCP_ERROR\", `MCP ${what}: ${res.error.message} (${res.error.code})`, false);\n return res.result;\n}\n\n/** MCP client over Streamable HTTP. */\nexport class McpHttpClient {\n readonly serverId: string;\n private url: string;\n private headers: Record<string, string>;\n private fetchFn: typeof fetch;\n private clientName: string;\n private sessionId?: string;\n private connected = false;\n\n constructor(url: string, opts: McpClientOptions & { serverId?: string } = {}) {\n this.url = url.replace(/\\/$/, \"\");\n this.serverId = opts.serverId ?? url;\n this.headers = opts.headers ?? {};\n this.fetchFn = opts.fetchFn ?? fetch;\n this.clientName = opts.clientName ?? \"framework-agents\";\n }\n\n private async rpc(method: string, params?: unknown): Promise<unknown> {\n return this.rpcInner(method, params, true);\n }\n\n /** JSON-RPC notification — no id, no response expected. */\n private async notify(method: string, params?: unknown): Promise<void> {\n await this.rpcInner(method, params, false);\n }\n\n private async rpcInner(method: string, params: unknown | undefined, withId: boolean): Promise<unknown> {\n let res: Response;\n try {\n res = await this.fetchFn(this.url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n ...(this.sessionId ? { \"mcp-session-id\": this.sessionId } : {}),\n ...this.headers,\n },\n body: JSON.stringify(\n withId ? { jsonrpc: \"2.0\", id: ++rpcSeq, method, params: params ?? {} } : { jsonrpc: \"2.0\", method, params: params ?? {} },\n ),\n });\n } catch (err) {\n throw new AgentError(\"MCP_TRANSPORT\", `MCP request failed: ${err instanceof Error ? err.message : String(err)}`, true);\n }\n const session = res.headers.get(\"mcp-session-id\");\n if (session) this.sessionId = session;\n if (!res.ok) throw new AgentError(\"MCP_TRANSPORT\", `MCP HTTP ${res.status}`, res.status >= 500);\n if (!withId) {\n // Notifications carry no id: no response will ever match. Read and\n // discard whatever the server sends instead of hanging on it.\n await res.text().catch(() => \"\");\n return undefined;\n }\n return checkRpc(await parseStreamableResponse(res), method);\n }\n\n async connect(): Promise<{ name: string; version?: string }> {\n const result = (await this.rpc(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: this.clientName, version: \"0.1.0\" },\n })) as { serverInfo?: { name: string; version?: string } };\n await this.notify(\"notifications/initialized\", {}).catch(() => undefined);\n this.connected = true;\n return { name: result.serverInfo?.name ?? this.serverId, version: result.serverInfo?.version };\n }\n\n private requireConnected(): void {\n if (!this.connected) throw new AgentError(\"MCP_NOT_CONNECTED\", \"Call connect() first\", false);\n }\n\n async listTools(): Promise<McpToolDef[]> {\n this.requireConnected();\n const result = (await this.rpc(\"tools/list\")) as { tools?: McpToolDef[] };\n return result.tools ?? [];\n }\n\n async callTool(name: string, args: unknown): Promise<unknown> {\n this.requireConnected();\n const result = (await this.rpc(\"tools/call\", { name, arguments: args ?? {} })) as {\n content?: { type: string; text?: string }[];\n isError?: boolean;\n };\n const text = (result.content ?? [])\n .filter((c) => c.type === \"text\")\n .map((c) => c.text ?? \"\")\n .join(\"\\n\");\n if (result.isError) throw new AgentError(\"MCP_TOOL_ERROR\", `MCP tool \"${name}\" failed: ${text}`, false);\n return text;\n }\n\n async close(): Promise<void> {\n this.connected = false;\n this.sessionId = undefined;\n }\n}\n\n/** MCP client over stdio (spawns `command args`, speaks line-delimited JSON-RPC). */\nexport class McpStdioClient {\n readonly serverId: string;\n private child?: ChildProcess;\n private buffer = \"\";\n private pending = new Map<number | string, (res: JsonRpcResponse) => void>();\n private clientName: string;\n\n constructor(\n private command: string,\n private args: string[] = [],\n opts: { serverId?: string; clientName?: string } = {},\n ) {\n this.serverId = opts.serverId ?? `${command} ${args.join(\" \")}`.trim();\n this.clientName = opts.clientName ?? \"framework-agents\";\n }\n\n async connect(): Promise<void> {\n try {\n this.child = spawn(this.command, this.args, { stdio: [\"pipe\", \"pipe\", \"ignore\"] });\n } catch (err) {\n throw new AgentError(\"MCP_TRANSPORT\", `Cannot spawn MCP server: ${err instanceof Error ? err.message : String(err)}`, false);\n }\n if (!this.child.stdout || !this.child.stdin) {\n throw new AgentError(\"MCP_TRANSPORT\", \"MCP stdio pipes unavailable\", false);\n }\n this.child.on(\"error\", (err) => {\n for (const [, respond] of this.pending) {\n respond({ jsonrpc: \"2.0\", error: { code: -32000, message: `MCP server failed: ${err.message}` } });\n }\n this.pending.clear();\n });\n // Spawn succeeded but the process later dies (crash, OOM, exit):\n // without this, in-flight requests hang forever — 'error' never fires.\n this.child.on(\"exit\", (code, signal) => {\n for (const [, respond] of this.pending) {\n respond({ jsonrpc: \"2.0\", error: { code: -32000, message: `MCP server exited (code ${code ?? \"null\"}, signal ${signal ?? \"none\"})` } });\n }\n this.pending.clear();\n });\n this.child.stdout.on(\"data\", (chunk: Buffer) => {\n this.buffer += chunk.toString(\"utf8\");\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t) continue;\n try {\n const msg = JSON.parse(t) as JsonRpcResponse;\n if (msg.id !== undefined) this.pending.get(msg.id)?.(msg);\n } catch {\n continue;\n }\n }\n });\n const result = (await this.request(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: this.clientName, version: \"0.1.0\" },\n })) as { serverInfo?: { name: string } };\n void result;\n }\n\n private request(method: string, params: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (!this.child?.stdin) {\n reject(new AgentError(\"MCP_NOT_CONNECTED\", \"Call connect() first\", false));\n return;\n }\n const id = ++rpcSeq;\n this.pending.set(id, (res) => {\n this.pending.delete(id);\n try {\n resolve(checkRpc(res, method));\n } catch (err) {\n reject(err);\n }\n });\n this.child.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, method, params })}\\n`, (err) => {\n if (err) {\n this.pending.delete(id);\n reject(new AgentError(\"MCP_TRANSPORT\", `MCP stdio write failed: ${err.message}`, true));\n }\n });\n });\n }\n\n async listTools(): Promise<McpToolDef[]> {\n const result = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n return result.tools ?? [];\n }\n\n async callTool(name: string, args: unknown): Promise<unknown> {\n const result = (await this.request(\"tools/call\", { name, arguments: args ?? {} })) as {\n content?: { type: string; text?: string }[];\n isError?: boolean;\n };\n const text = (result.content ?? [])\n .filter((c) => c.type === \"text\")\n .map((c) => c.text ?? \"\")\n .join(\"\\n\");\n if (result.isError) throw new AgentError(\"MCP_TOOL_ERROR\", `MCP tool \"${name}\" failed: ${text}`, false);\n return text;\n }\n\n async close(): Promise<void> {\n this.child?.kill();\n this.child = undefined;\n // Settle in-flight requests — clearing without responding would leave\n // their promises pending forever.\n for (const [, respond] of this.pending) {\n respond({ jsonrpc: \"2.0\", error: { code: -32000, message: \"MCP client closed\" } });\n }\n this.pending.clear();\n }\n}\n\nexport type AnyMcpClient = Pick<McpHttpClient, \"serverId\" | \"listTools\" | \"callTool\" | \"close\">;\n\nexport interface McpClient {\n readonly serverId: string;\n listTools(): Promise<McpToolDef[]>;\n callTool(name: string, args: unknown): Promise<unknown>;\n close(): Promise<void>;\n}\n\n/** Turn MCP tool defs into framework Tools (namespaced `server.tool` on collision). */\nexport async function mcpToolsToFramework(client: McpClient, defs?: McpToolDef[]): Promise<Tool[]> {\n const list = defs ?? (await client.listTools());\n const seen = new Set<string>();\n return list.map((d) => {\n const name = seen.has(d.name) ? `${client.serverId}.${d.name}` : d.name;\n seen.add(d.name);\n return defineTool({\n name,\n description: d.description ?? `MCP tool ${d.name} (via ${client.serverId})`,\n schema: jsonSchemaToZod(d.inputSchema ?? { type: \"object\" }),\n execute: async (args: unknown) => client.callTool(d.name, args),\n });\n });\n}\n\nexport async function connectMcpHttp(url: string, opts?: McpClientOptions): Promise<McpHttpClient> {\n const client = new McpHttpClient(url, opts);\n await client.connect();\n return client;\n}\n\nexport async function connectMcpStdio(command: string, args: string[] = []): Promise<McpStdioClient> {\n const client = new McpStdioClient(command, args);\n await client.connect();\n return client;\n}\n","/**\n * Prompts: versioned, renderable templates. No magic strings in agent code.\n * Sources: inline definePrompt, markdown files with frontmatter, A/B variants.\n */\nimport { readFileSync } from \"node:fs\";\n\nexport interface PromptTemplate {\n name: string;\n version: string;\n template: string;\n render(vars: Record<string, string | number>): string;\n}\n\nexport function definePrompt(name: string, template: string, version = \"0.1.0\"): PromptTemplate {\n return {\n name,\n version,\n template,\n render(vars) {\n return template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n if (!(key in vars)) throw new Error(`Missing prompt var: ${key} (prompt: ${name})`);\n return String(vars[key]);\n });\n },\n };\n}\n\n/** Load `--- name, version ---` frontmatter + markdown body from disk. */\nexport function loadPromptFile(path: string): PromptTemplate {\n const file = readFileSync(path, \"utf8\");\n // Tolerate a leading BOM and CRLF line endings (frontmatter at EOF is fine).\n const raw = file.startsWith(\"\") ? file.slice(1) : file;\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error(`Invalid prompt file (missing frontmatter): ${path}`);\n const meta: Record<string, string> = {};\n for (const line of match[1].split(\"\\n\")) {\n const i = line.indexOf(\":\");\n if (i > 0) meta[line.slice(0, i).trim()] = line.slice(i + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n if (!meta.name) throw new Error(`Invalid prompt file (missing name): ${path}`);\n return definePrompt(meta.name, match[2].trim(), meta.version ?? \"0.1.0\");\n}\n\n/** A/B variants: pick by traffic split (weighted random) or explicit variant. */\nexport function abPrompts(\n variants: { name: string; template: string; version?: string; weight?: number }[],\n pick?: string,\n): PromptTemplate {\n if (pick) {\n const found = variants.find((v) => (v.version ? `${v.name}@${v.version}` : v.name) === pick || v.name === pick);\n if (!found) throw new Error(`Unknown prompt variant: ${pick}`);\n return definePrompt(found.name, found.template, found.version);\n }\n const total = variants.reduce((n, v) => n + (v.weight ?? 1), 0);\n let roll = Math.random() * total;\n for (const v of variants) {\n roll -= v.weight ?? 1;\n if (roll <= 0) return definePrompt(v.name, v.template, v.version);\n }\n const last = variants[variants.length - 1];\n return definePrompt(last.name, last.template, last.version);\n}\n","/**\n * Semantic layer. See docs/07-semantics-governance.md.\n * In-memory store: RDFS-subset + OWL property axioms entailment with proofs,\n * SHACL-subset validation, versioned CONSTRUCT-style rules, SPARQL-subset\n * read tools, and GraphMemory. Remote SPARQL, entity linking + JSON-LD I/O,\n * and TBox evolution live in sibling modules, re-exported here.\n */\n\nexport interface Quad {\n subject: string;\n predicate: string;\n object: string;\n graph?: string;\n /** Provenance: who vouched, source URI, valid-until. Required on agent writes. */\n source?: string;\n derivedFrom?: string;\n rule?: string;\n}\n\nexport interface ShapeReport {\n valid: boolean;\n violations: { message: string; node?: string; path?: string }[];\n}\n\n/** Minimal triple-store contract — N3 in-memory first, remote SPARQL later. */\nexport interface GraphStore {\n add(quads: Quad[]): Promise<void>;\n /**\n * Match by pattern; null/undefined = wildcard (including the graph slot).\n * Queries the entailment closure. A `graph` value selects ONE named\n * graph — the same s/p/o CAN live in several graphs; identity includes it.\n */\n match(s?: string | null, p?: string | null, o?: string | null, g?: string | null): Promise<Quad[]>;\n validate(quads: Quad[]): Promise<ShapeReport>;\n /** Proof chain for an entailed fact: premises + rule id. Null for explicit facts. */\n why(quad: Quad): Promise<{ premises: Quad[]; rule: string } | null>;\n}\n\nconst RDF_TYPE = new Set([\"rdf:type\", \"a\", \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"]);\nconst SUB_CLASS = new Set([\"rdfs:subClassOf\", \"http://www.w3.org/2000/01/rdf-schema#subClassOf\"]);\nconst SUB_PROP = new Set([\"rdfs:subPropertyOf\", \"http://www.w3.org/2000/01/rdf-schema#subPropertyOf\"]);\nconst DOMAIN = new Set([\"rdfs:domain\", \"http://www.w3.org/2000/01/rdf-schema#domain\"]);\nconst RANGE = new Set([\"rdfs:range\", \"http://www.w3.org/2000/01/rdf-schema#range\"]);\nconst OWL_TRANSITIVE = new Set([\"owl:TransitiveProperty\", \"http://www.w3.org/2002/07/owl#TransitiveProperty\"]);\nconst OWL_SYMMETRIC = new Set([\"owl:SymmetricProperty\", \"http://www.w3.org/2002/07/owl#SymmetricProperty\"]);\nconst OWL_FUNCTIONAL = new Set([\"owl:FunctionalProperty\", \"http://www.w3.org/2002/07/owl#FunctionalProperty\"]);\nconst OWL_INVERSE = new Set([\"owl:inverseOf\", \"http://www.w3.org/2002/07/owl#inverseOf\"]);\n\n/** SHACL-subset shape: class-scoped property constraints. */\nexport interface PropertyShape {\n path: string;\n minCount?: number;\n maxCount?: number;\n datatype?: string;\n nodeKind?: \"iri\" | \"literal\";\n hasValue?: string;\n}\n\nexport interface NodeShape {\n targetClass: string;\n properties: PropertyShape[];\n}\n\n/** Versioned CONSTRUCT-style rule over triple patterns (?vars). */\nexport interface TriplePattern {\n subject: string;\n predicate: string;\n object: string;\n}\n\nexport interface GraphRule {\n id: string;\n version?: string;\n where: TriplePattern[];\n construct: TriplePattern[];\n}\n\nexport interface StoreOptions {\n shapes?: NodeShape[];\n rules?: GraphRule[];\n}\n\nfunction isLiteral(term: string): boolean {\n if (term.startsWith('\"')) return true;\n if (/^(-?\\d+(\\.\\d+)?|true|false)$/.test(term)) return true;\n if (term.startsWith(\"<\") || /^[a-zA-Z][\\w-]*:/.test(term)) return false;\n return true;\n}\n\nfunction termDatatype(term: string): string | undefined {\n const m = term.match(/\\^\\^<?([\\w:/#.-]+)>?$/);\n if (m) return m[1];\n if (/^\".*\"@[\\w-]+$/.test(term)) return \"rdf:langString\";\n if (/^\".*\"$/.test(term)) return \"xsd:string\";\n if (/^-?\\d+$/.test(term)) return \"xsd:integer\";\n if (/^-?\\d*\\.\\d+$/.test(term)) return \"xsd:decimal\";\n if (/^(true|false)$/.test(term)) return \"xsd:boolean\";\n return undefined;\n}\n\nexport class InMemoryGraphStore implements GraphStore {\n private quads: Quad[] = [];\n private derivations = new Map<string, { premises: Quad[]; rule: string }>();\n private shapes: NodeShape[] = [];\n private rules: GraphRule[] = [];\n\n constructor(opts: StoreOptions = {}) {\n this.shapes = [...(opts.shapes ?? [])];\n this.rules = [...(opts.rules ?? [])];\n }\n\n addShapes(...shapes: NodeShape[]): this {\n this.shapes.push(...shapes);\n return this;\n }\n\n addRules(...rules: GraphRule[]): this {\n this.rules.push(...rules);\n return this;\n }\n\n /** Registered SHACL shapes (carried to new stores by TBox migrations). */\n ontologyShapes(): NodeShape[] {\n return [...this.shapes];\n }\n\n /** Registered CONSTRUCT rules (versioned with the ontology they encode). */\n ontologyRules(): GraphRule[] {\n return [...this.rules];\n }\n\n /** Identity includes the named graph: the same s/p/o in two graphs are two quads. */\n private key(q: Pick<Quad, \"subject\" | \"predicate\" | \"object\" | \"graph\">): string {\n return `${q.subject}|${q.predicate}|${q.object}|${q.graph ?? \"\"}`;\n }\n\n async add(quads: Quad[]): Promise<void> {\n const report = await this.validate(quads);\n if (!report.valid) {\n throw new Error(`SHACL violation: ${report.violations.map((v) => v.message).join(\"; \")}`);\n }\n const known = new Set(this.quads.map((q) => this.key(q)));\n const addedKeys: string[] = [];\n for (const q of quads) {\n if (!known.has(this.key(q))) {\n known.add(this.key(q));\n addedKeys.push(this.key(q));\n this.quads.push(q);\n }\n }\n const rollback = (): void => {\n const doomed = new Set(addedKeys);\n this.quads = this.quads.filter((q) => !doomed.has(this.key(q)));\n for (const k of doomed) this.derivations.delete(k);\n };\n const conflicts = this.checkFunctional();\n if (conflicts.length) {\n rollback();\n throw new Error(`Functional property violation: ${conflicts.join(\"; \")}`);\n }\n const shapeReport = this.checkShapes(this.quads);\n if (!shapeReport.valid) {\n rollback();\n throw new Error(`SHACL violation: ${shapeReport.violations.map((v) => v.message).join(\"; \")}`);\n }\n this.entailToFixpoint(known);\n }\n\n async match(s?: string | null, p?: string | null, o?: string | null, g?: string | null): Promise<Quad[]> {\n return this.quads.filter(\n (q) =>\n (!s || q.subject === s) && (!p || q.predicate === p) && (!o || q.object === o) && (!g || q.graph === g),\n );\n }\n\n /** Structural + provenance check. Full SHACL engine lands in P1-sem. */\n async validate(quads: Quad[]): Promise<ShapeReport> {\n const violations = quads\n .filter((q) => !q.subject || !q.predicate || !q.object)\n .map((q) => ({ message: `Incomplete triple: ${JSON.stringify(q)}` }));\n const noSource = quads\n .filter((q) => !q.source)\n .map((q) => ({ message: `Missing provenance (source) on ${q.subject} ${q.predicate} ${q.object}` }));\n return { valid: violations.length + noSource.length === 0, violations: [...violations, ...noSource] };\n }\n\n async why(quad: Quad): Promise<{ premises: Quad[]; rule: string } | null> {\n return this.derivations.get(this.key(quad)) ?? null;\n }\n\n /** Functional properties must have at most one value per subject (conflict, not a second fact). */\n private checkFunctional(): string[] {\n const functionalProps = new Set(\n this.quads.filter((q) => RDF_TYPE.has(q.predicate) && OWL_FUNCTIONAL.has(q.object)).map((q) => q.subject),\n );\n const conflicts: string[] = [];\n for (const prop of functionalProps) {\n const bySubject = new Map<string, Set<string>>();\n for (const q of this.quads) {\n if (q.predicate !== prop) continue;\n const values = bySubject.get(q.subject) ?? new Set<string>();\n values.add(q.object);\n bySubject.set(q.subject, values);\n }\n for (const [subject, values] of bySubject) {\n if (values.size > 1) conflicts.push(`${subject} has ${values.size} values for functional ${prop}`);\n }\n }\n return conflicts;\n }\n\n /** SHACL-subset validation over a quad set. */\n checkShapes(quads: Quad[]): ShapeReport {\n const violations: ShapeReport[\"violations\"] = [];\n for (const shape of this.shapes) {\n const targets = quads.filter((q) => RDF_TYPE.has(q.predicate) && q.object === shape.targetClass).map((q) => q.subject);\n for (const node of new Set(targets)) {\n for (const prop of shape.properties) {\n const values = quads.filter((q) => q.subject === node && q.predicate === prop.path).map((q) => q.object);\n if (prop.minCount != null && values.length < prop.minCount) {\n violations.push({ message: `${node} needs >= ${prop.minCount} ${prop.path}`, node, path: prop.path });\n }\n if (prop.maxCount != null && values.length > prop.maxCount) {\n violations.push({ message: `${node} allows <= ${prop.maxCount} ${prop.path}`, node, path: prop.path });\n }\n for (const v of values) {\n if (prop.datatype && termDatatype(v) !== prop.datatype && !(prop.datatype === \"xsd:string\" && isLiteral(v))) {\n violations.push({ message: `${node} ${prop.path}=${v} is not ${prop.datatype}`, node, path: prop.path });\n }\n if (prop.nodeKind === \"iri\" && isLiteral(v)) {\n violations.push({ message: `${node} ${prop.path}=${v} must be an IRI`, node, path: prop.path });\n }\n if (prop.nodeKind === \"literal\" && !isLiteral(v)) {\n violations.push({ message: `${node} ${prop.path}=${v} must be a literal`, node, path: prop.path });\n }\n if (prop.hasValue !== undefined && v !== prop.hasValue) {\n violations.push({ message: `${node} ${prop.path} must be ${prop.hasValue}`, node, path: prop.path });\n }\n }\n }\n }\n }\n return { valid: violations.length === 0, violations };\n }\n\n private insert(q: Quad, premises: Quad[], rule: string, known: Set<string>): boolean {\n const k = this.key(q);\n if (known.has(k)) return false;\n known.add(k);\n this.quads.push(q);\n this.derivations.set(k, { premises, rule });\n return true;\n }\n\n /**\n * RDFS subset + OWL property axioms + versioned rules, to fixpoint:\n * - RDFS-SUB-TRANS / RDFS-TYPE / RDFS-SUBPROP-TRANS / RDFS-SUBPROP / RDFS-DOMAIN / RDFS-RANGE\n * - OWL-TRANSITIVE / OWL-SYMMETRIC / OWL-INVERSE (inverseOf both directions)\n * - <ruleId>@<version> for each applied GraphRule (premises tracked for why())\n */\n private entailToFixpoint(known: Set<string>): void {\n for (;;) {\n let added = false;\n const snapshot = [...this.quads];\n const byPred = (ps: Set<string>) => snapshot.filter((q) => ps.has(q.predicate));\n const insert = (q: Quad, premises: Quad[], rule: string): boolean => {\n const addedOne = this.insert(q, premises, rule, known);\n added = addedOne || added;\n return addedOne;\n };\n\n for (const ab of byPred(SUB_CLASS)) {\n for (const bc of byPred(SUB_CLASS).filter((q) => q.subject === ab.object)) {\n added = this.insert(\n { subject: ab.subject, predicate: ab.predicate, object: bc.object, source: \"entailment\", rule: \"RDFS-SUB-TRANS\" },\n [ab, bc],\n \"RDFS-SUB-TRANS\",\n known,\n ) || added;\n }\n }\n for (const t of byPred(RDF_TYPE)) {\n for (const sc of byPred(SUB_CLASS).filter((q) => q.subject === t.object)) {\n added = this.insert(\n { subject: t.subject, predicate: t.predicate, object: sc.object, source: \"entailment\", rule: \"RDFS-TYPE\" },\n [t, sc],\n \"RDFS-TYPE\",\n known,\n ) || added;\n }\n }\n for (const ab of byPred(SUB_PROP)) {\n for (const bc of byPred(SUB_PROP).filter((q) => q.subject === ab.object)) {\n added = this.insert(\n { subject: ab.subject, predicate: ab.predicate, object: bc.object, source: \"entailment\", rule: \"RDFS-SUBPROP-TRANS\" },\n [ab, bc],\n \"RDFS-SUBPROP-TRANS\",\n known,\n ) || added;\n }\n for (const use of snapshot.filter((q) => q.predicate === ab.subject)) {\n added = this.insert(\n { subject: use.subject, predicate: ab.object, object: use.object, source: \"entailment\", rule: \"RDFS-SUBPROP\" },\n [ab, use],\n \"RDFS-SUBPROP\",\n known,\n ) || added;\n }\n }\n for (const d of byPred(DOMAIN)) {\n for (const use of snapshot.filter((q) => q.predicate === d.subject)) {\n added = this.insert(\n { subject: use.subject, predicate: \"rdf:type\", object: d.object, source: \"entailment\", rule: \"RDFS-DOMAIN\" },\n [d, use],\n \"RDFS-DOMAIN\",\n known,\n ) || added;\n }\n }\n for (const r of byPred(RANGE)) {\n for (const use of snapshot.filter((q) => q.predicate === r.subject)) {\n if (insert(\n { subject: use.object, predicate: \"rdf:type\", object: r.object, source: \"entailment\", rule: \"RDFS-RANGE\" },\n [r, use],\n \"RDFS-RANGE\",\n )) added = true;\n }\n }\n added = this.applyOwl(snapshot, insert) || added;\n added = this.applyRules(snapshot, insert) || added;\n if (!added) return;\n }\n }\n\n private applyOwl(snapshot: Quad[], insert: (q: Quad, premises: Quad[], rule: string) => boolean): boolean {\n let added = false;\n const transitive = new Set(\n snapshot.filter((q) => RDF_TYPE.has(q.predicate) && OWL_TRANSITIVE.has(q.object)).map((q) => q.subject),\n );\n const symmetric = new Set(\n snapshot.filter((q) => RDF_TYPE.has(q.predicate) && OWL_SYMMETRIC.has(q.object)).map((q) => q.subject),\n );\n for (const p of transitive) {\n const uses = snapshot.filter((q) => q.predicate === p);\n for (const xy of uses) {\n for (const yz of uses.filter((q) => q.subject === xy.object)) {\n if (insert({ subject: xy.subject, predicate: p, object: yz.object, source: \"entailment\", rule: \"OWL-TRANSITIVE\" }, [xy, yz], \"OWL-TRANSITIVE\")) added = true;\n }\n }\n }\n for (const p of symmetric) {\n for (const xy of snapshot.filter((q) => q.predicate === p)) {\n if (insert({ subject: xy.object, predicate: p, object: xy.subject, source: \"entailment\", rule: \"OWL-SYMMETRIC\" }, [xy], \"OWL-SYMMETRIC\")) added = true;\n }\n }\n for (const inv of snapshot.filter((q) => OWL_INVERSE.has(q.predicate))) {\n for (const use of snapshot.filter((q) => q.predicate === inv.subject || q.predicate === inv.object)) {\n const flipped = use.predicate === inv.subject ? inv.object : inv.subject;\n if (insert({ subject: use.object, predicate: flipped, object: use.subject, source: \"entailment\", rule: \"OWL-INVERSE\" }, [inv, use], \"OWL-INVERSE\")) added = true;\n }\n }\n return added;\n }\n\n private applyRules(snapshot: Quad[], insert: (q: Quad, premises: Quad[], rule: string) => boolean): boolean {\n let added = false;\n for (const rule of this.rules) {\n const tag = rule.version ? `${rule.id}@${rule.version}` : rule.id;\n for (const binding of matchPatterns(rule.where, snapshot)) {\n for (const pattern of rule.construct) {\n const built: TriplePattern = {\n subject: instantiate(pattern.subject, binding.vars),\n predicate: instantiate(pattern.predicate, binding.vars),\n object: instantiate(pattern.object, binding.vars),\n };\n if (built.subject == null || built.predicate == null || built.object == null) continue;\n if (insert(\n { subject: built.subject, predicate: built.predicate, object: built.object, source: \"entailment\", rule: tag, derivedFrom: tag },\n binding.quads,\n tag,\n )) added = true;\n }\n }\n }\n return added;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pattern matching + SPARQL-subset (SELECT with conjunctive triple patterns)\n// ---------------------------------------------------------------------------\n\nexport interface PatternBinding {\n vars: Map<string, string>;\n quads: Quad[];\n}\n\nfunction isVar(term: string): boolean {\n return term.startsWith(\"?\");\n}\n\nfunction matchTerm(pattern: string, value: string, vars: Map<string, string>): Map<string, string> | undefined {\n if (isVar(pattern)) {\n const bound = vars.get(pattern);\n if (bound === undefined) {\n const next = new Map(vars);\n next.set(pattern, value);\n return next;\n }\n return bound === value ? vars : undefined;\n }\n return pattern === value ? vars : undefined;\n}\n\nfunction matchOne(pattern: TriplePattern, quad: Quad, vars: Map<string, string>): Map<string, string> | undefined {\n let v = matchTerm(pattern.subject, quad.subject, vars);\n if (!v) return undefined;\n v = matchTerm(pattern.predicate, quad.predicate, v);\n if (!v) return undefined;\n return matchTerm(pattern.object, quad.object, v);\n}\n\n/** Conjunctive matching of patterns against quads (nested-loop join). */\nexport function matchPatterns(patterns: TriplePattern[], quads: Quad[]): PatternBinding[] {\n let bindings: PatternBinding[] = [{ vars: new Map(), quads: [] }];\n for (const pattern of patterns) {\n const next: PatternBinding[] = [];\n for (const b of bindings) {\n for (const q of quads) {\n const vars = matchOne(pattern, q, b.vars);\n if (vars) next.push({ vars, quads: [...b.quads, q] });\n }\n }\n bindings = next;\n if (!bindings.length) break;\n }\n return bindings;\n}\n\nexport function instantiate(term: string, vars: Map<string, string>): string {\n return isVar(term) ? (vars.get(term) ?? term) : term;\n}\n\nexport interface SparqlSelect {\n variables: string[];\n patterns: TriplePattern[];\n}\n\nfunction tokenizeSparql(input: string): string[] {\n const tokens: string[] = [];\n const re = /\"[^\"]*\"(?:\\^\\^<?[\\w:/#.-]+>?|@[\\w-]+)?|<[^>]*>|[{}().;]|\\S+/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(input)) !== null) tokens.push(m[0]);\n return tokens;\n}\n\n/**\n * Minimal SELECT parser: `SELECT ?a ?b WHERE { s p o . ... }`.\n * Terms: ?vars, <iris>, prefixed names, \"literals\" (^^datatype/@lang ok).\n * Anything else throws — this is a documented subset, not full SPARQL.\n */\nexport function parseSelect(query: string): SparqlSelect {\n const tokens = tokenizeSparql(query);\n let i = 0;\n const expect = (want: string): void => {\n if (tokens[i]?.toUpperCase() !== want) throw new Error(`SPARQL: expected ${want}, got ${tokens[i] ?? \"end\"}`);\n i += 1;\n };\n expect(\"SELECT\");\n const variables: string[] = [];\n while (i < tokens.length && tokens[i].startsWith(\"?\")) {\n variables.push(tokens[i]);\n i += 1;\n }\n if (!variables.length) throw new Error(\"SPARQL: SELECT needs at least one variable\");\n expect(\"WHERE\");\n expect(\"{\");\n const patterns: TriplePattern[] = [];\n while (i < tokens.length && tokens[i] !== \"}\") {\n const s = tokens[i++];\n const p = tokens[i++];\n const o = tokens[i++];\n if (s == null || p == null || o == null || s === \".\" || p === \".\" || o === \".\") {\n throw new Error(\"SPARQL: malformed triple pattern\");\n }\n patterns.push({ subject: s, predicate: p, object: o });\n if (tokens[i] === \".\") i += 1;\n }\n expect(\"}\");\n return { variables, patterns };\n}\n\n/** Execute a SELECT against the store closure. Returns variable bindings. */\nexport async function executeSelect(store: GraphStore, query: string): Promise<Record<string, string>[]> {\n const { variables, patterns } = parseSelect(query);\n const quads = await store.match(null, null, null);\n return matchPatterns(patterns, quads).map((b) => {\n const row: Record<string, string> = {};\n for (const v of variables) row[v] = b.vars.get(v) ?? \"\";\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Agent tools: read, write (autonomous, validated), verify\n// ---------------------------------------------------------------------------\n\nimport { z } from \"zod\";\nimport { defineTool } from \"../tools/index.js\";\n\n/** Read-only SPARQL SELECT over the entailment closure. */\nexport function sparqlSelectTool(store: GraphStore) {\n return defineTool({\n name: \"sparql_select\",\n description: \"Query the knowledge graph. Subset: SELECT ?vars WHERE { s p o . ... } over the inferred closure.\",\n schema: z.object({ query: z.string().min(1).max(4000) }),\n execute: async ({ query }: { query: string }) => executeSelect(store, query),\n });\n}\n\n/** Ontology lookup: find classes/properties/labels matching a term. */\nexport function ontologyLookupTool(store: GraphStore) {\n return defineTool({\n name: \"ontology_lookup\",\n description: \"Look up ontology terms (classes, properties, labels) instead of inventing predicates.\",\n schema: z.object({ term: z.string().min(1).max(200), limit: z.number().int().min(1).max(20).default(8) }),\n execute: async ({ term, limit }: { term: string; limit?: number }) => {\n const needle = term.toLowerCase();\n const quads = await store.match(null, null, null);\n return quads\n .filter((q) => `${q.subject} ${q.predicate} ${q.object}`.toLowerCase().includes(needle))\n .slice(0, limit ?? 8)\n .map((q) => ({ subject: q.subject, predicate: q.predicate, object: q.object }));\n },\n });\n}\n\nexport const TurtleQuadSchema = z.object({\n subject: z.string().min(1),\n predicate: z.string().min(1),\n object: z.string().min(1),\n source: z.string().min(1).describe(\"Provenance URI (required — writes without it are rejected)\"),\n});\n\n/**\n * Autonomous validated write: SHACL + provenance + functional checks run\n * inside the store. Violations return as tool results (not throws) so the\n * model repairs and retries on its own — autonomy without anarchy.\n */\nexport function graphAddTool(store: GraphStore) {\n return defineTool({\n name: \"graph_add\",\n description: \"Write facts to the knowledge graph. Validated (SHACL/provenance/functional); violations return repair feedback.\",\n schema: z.object({ quads: z.array(TurtleQuadSchema).min(1).max(50) }),\n execute: async ({ quads }: { quads: { subject: string; predicate: string; object: string; source: string }[] }) => {\n try {\n await store.add(quads);\n const inferred = (await store.match(null, null, null)).filter((q) => q.source === \"entailment\");\n return { committed: quads.length, inferred: inferred.length };\n } catch (err) {\n return `Validation failed — fix and retry: ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n toResult: (output: unknown) => ({\n content: typeof output === \"string\" ? output : JSON.stringify(output),\n artifact: typeof output === \"string\" ? undefined : { committed: (output as { committed: number }).committed },\n }),\n });\n}\n\nexport type ClaimVerdict = \"grounded\" | \"unknown\" | \"contradicted\";\n\n/**\n * Anti-hallucination primitive: is this triple in the closure (grounded),\n * absent (unknown — do not assert), or clashing with a functional value\n * (contradicted)? Ask before answering from memory.\n */\nexport function claimCheckTool(store: GraphStore) {\n return defineTool({\n name: \"claim_check\",\n description: \"Verify a fact against the graph before asserting it. Returns grounded | unknown | contradicted with proof.\",\n schema: z.object({ subject: z.string().min(1), predicate: z.string().min(1), object: z.string().min(1) }),\n execute: async ({ subject, predicate, object }: { subject: string; predicate: string; object: string }) => {\n const direct = await store.match(subject, predicate, object);\n if (direct.length) {\n return { verdict: \"grounded\" as ClaimVerdict, proof: await store.why(direct[0]) };\n }\n const siblings = await store.match(subject, predicate, null);\n const declarations = await store.match(predicate, null, null);\n const functional = declarations.some((q) => RDF_TYPE.has(q.predicate) && OWL_FUNCTIONAL.has(q.object));\n const clash = siblings.filter((q) => q.object !== object);\n if (functional && clash.length) {\n return {\n verdict: \"contradicted\" as ClaimVerdict,\n proof: { existing: clash.map((q) => q.object) },\n };\n }\n return {\n verdict: \"unknown\" as ClaimVerdict,\n proof: siblings.length ? { related: siblings.map((q) => q.object) } : null,\n };\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// GraphMemory: closure-aware session memory + long-term store\n// ---------------------------------------------------------------------------\n\nimport type { ChatMessage } from \"../types/index.js\";\nimport type { Memory } from \"../memory/index.js\";\nimport { tokenize } from \"../skills/index.js\";\n\n/**\n * Session memory + long-term store in one:\n * - load(): recent messages + top-k closure facts relevant to the latest\n * user turn (keyword overlap), rendered as a knowledge message.\n * - save(): delegates to inner memory (extraction of triples from prose\n * stays model-driven via graph_add — never silent parsing).\n * - exportState()/importState(): quads JSON for SessionManager snapshots (LTS).\n */\nexport class GraphMemory implements Memory {\n constructor(\n private store: GraphStore,\n private inner: Memory,\n private opts: { facts?: number } = {},\n ) {}\n\n async load(): Promise<ChatMessage[]> {\n const messages = await this.inner.load();\n const lastUser = [...messages].reverse().find((m) => m.role === \"user\");\n if (!lastUser) return messages;\n const terms = new Set(tokenize(typeof lastUser.content === \"string\" ? lastUser.content : \"\"));\n if (!terms.size) return messages;\n const quads = await this.store.match(null, null, null);\n const scored = quads\n .map((q) => {\n const hay = `${q.subject} ${q.predicate} ${q.object}`.toLowerCase();\n let score = 0;\n for (const t of terms) if (hay.includes(t)) score += 1;\n return { q, score };\n })\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, this.opts.facts ?? 8);\n if (!scored.length) return messages;\n const lines = scored.map((s) => `- ${s.q.subject} ${s.q.predicate} ${s.q.object}`);\n return [...messages, { role: \"assistant\", content: `Relevant known facts (ground answers in these):\\n${lines.join(\"\\n\")}` }];\n }\n\n async save(messages: ChatMessage[]): Promise<void> {\n await this.inner.save(messages);\n }\n\n async clear(): Promise<void> {\n await this.inner.clear();\n }\n\n /** Serialize the closure for snapshots / long-term persistence. */\n async exportState(): Promise<{ quads: Quad[] }> {\n return { quads: await this.store.match(null, null, null) };\n }\n\n /** Restore a previously exported closure (facts become explicit again). */\n async importState(state: { quads: Quad[] }): Promise<void> {\n const fresh = state.quads.filter((q) => q.source !== \"entailment\");\n if (fresh.length) await this.store.add(fresh);\n }\n}\n\nexport * from \"./remote-sparql.js\";\nexport * from \"./entity-linking.js\";\nexport * from \"./ontology-evolution.js\";\nexport * from \"./ontology-review.js\";\n","import { z } from \"zod\";\nimport { AgentError } from \"../types/index.js\";\nimport { defineTool, type Tool } from \"../tools/index.js\";\n\n/**\n * Remote SPARQL adapter (roadmap P2-sem): talk to real SPARQL endpoints —\n * Wikidata Query Service, Fuseki, GraphDB, Virtuoso — with auth and pinned\n * prefixes. The local GraphStore stays the read path for closures; this is\n * for data that lives OUTSIDE the agent's own graph.\n *\n * Protocol: SPARQL 1.1 — SELECT via POST `application/sparql-query`,\n * UPDATE via POST `application/sparql-update`; SELECT responses must be\n * `application/sparql-results+json` (we ask for it in Accept).\n */\n\nexport type SparqlAuth =\n | { type: \"basic\"; user: string; password: string }\n | { type: \"bearer\"; token: string }\n | { type: \"header\"; name: string; value: string };\n\nexport interface RemoteSparqlOptions {\n /** Query endpoint URL (e.g. https://query.wikidata.org/sparql). */\n endpoint: string;\n /** Update endpoint; defaults to `endpoint`. */\n updateEndpoint?: string;\n auth?: SparqlAuth;\n /** Pinned prefixes, prepended to every query as PREFIX declarations. */\n prefixes?: Record<string, string>;\n /** Extra request headers (merged over the defaults below). */\n headers?: Record<string, string>;\n fetchFn?: typeof fetch;\n /** Per-request timeout. Default 30s. */\n timeoutMs?: number;\n /**\n * Built-in retries for transient endpoints (429/5xx/network). Rate limits\n * are common on public SPARQL endpoints; the middleware retry is a separate\n * layer for MODEL calls only. Default 2. Honors Retry-After when present.\n */\n maxRetries?: number;\n}\n\n/** One SELECT result row: variable name -> plain string term. */\nexport type SparqlRow = Record<string, string>;\n\nconst DEFAULT_PREFIXES: Record<string, string> = {\n rdf: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n rdfs: \"http://www.w3.org/2000/01/rdf-schema#\",\n owl: \"http://www.w3.org/2002/07/owl#\",\n xsd: \"http://www.w3.org/2001/XMLSchema#\",\n skos: \"http://www.w3.org/2004/02/skos/core#\",\n dct: \"http://purl.org/dc/terms/\",\n prov: \"http://www.w3.org/ns/prov#\",\n schema: \"https://schema.org/\",\n};\n\nexport class RemoteSparqlAdapter {\n readonly endpoint: string;\n private readonly updateEndpoint: string;\n private readonly prefixes: Record<string, string>;\n private readonly extraHeaders: Record<string, string>;\n private readonly fetchFn: typeof fetch;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly auth?: SparqlAuth;\n\n constructor(opts: RemoteSparqlOptions) {\n this.endpoint = opts.endpoint.replace(/\\/$/, \"\");\n this.updateEndpoint = (opts.updateEndpoint ?? opts.endpoint).replace(/\\/$/, \"\");\n this.prefixes = { ...DEFAULT_PREFIXES, ...opts.prefixes };\n this.extraHeaders = opts.headers ?? {};\n this.fetchFn = opts.fetchFn ?? fetch;\n this.timeoutMs = opts.timeoutMs ?? 30000;\n this.maxRetries = Math.max(0, opts.maxRetries ?? 2);\n this.auth = opts.auth;\n }\n\n /** Prepend pinned PREFIX declarations so caller queries stay short. */\n withPrefixes(query: string): string {\n const declarations = Object.entries(this.prefixes)\n .map(([prefix, iri]) => `PREFIX ${prefix}: <${iri}>`)\n .join(\"\\n\");\n return `${declarations}\\n${query}`;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const out: Record<string, string> = { ...extra, ...this.extraHeaders };\n // Public endpoints (Wikidata notably) REJECT requests without a\n // descriptive User-Agent with 403 — send one by default.\n out[\"user-agent\"] ??= \"agent-framework/0.1 (+RemoteSparqlAdapter)\";\n if (!this.auth) return out;\n if (this.auth.type === \"basic\") {\n out.authorization = `Basic ${Buffer.from(`${this.auth.user}:${this.auth.password}`).toString(\"base64\")}`;\n } else if (this.auth.type === \"bearer\") {\n out.authorization = `Bearer ${this.auth.token}`;\n } else {\n out[this.auth.name] = this.auth.value;\n }\n return out;\n }\n\n private async post(\n url: string,\n contentType: string,\n body: string,\n accept: string,\n ): Promise<Response> {\n let lastError: AgentError | undefined;\n let retryDelayMs: number | undefined;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n // Public SPARQL endpoints rate-limit aggressively (429 with empty\n // bodies is common); honor Retry-After when the server sends it.\n await new Promise((r) => setTimeout(r, retryDelayMs ?? Math.min(2000 * 2 ** (attempt - 1), 10000)));\n }\n let res: Response;\n try {\n res = await this.fetchFn(url, {\n method: \"POST\",\n headers: this.headers({ \"content-type\": contentType, accept }),\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n lastError = new AgentError(\n \"REMOTE_SPARQL\",\n `SPARQL request failed: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n retryDelayMs = undefined; // no server hint — retry loop uses its own backoff\n continue;\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const retryable = res.status === 429 || res.status >= 500;\n const err = new AgentError(\n \"REMOTE_SPARQL\",\n `${url} HTTP ${res.status}: ${text.slice(0, 300)}`,\n retryable,\n );\n const retryAfterHeader = Number.parseInt(res.headers.get(\"retry-after\") ?? \"\", 10);\n retryDelayMs = Number.isFinite(retryAfterHeader) ? Math.min(retryAfterHeader * 1000, 60000) : undefined;\n if (!retryable || attempt === this.maxRetries) throw err;\n lastError = err;\n continue;\n }\n return res;\n }\n // Unreachable for the non-ok path (throws above); a network error on the\n // final attempt lands here.\n throw lastError ?? new AgentError(\"REMOTE_SPARQL\", \"request failed\", true);\n }\n\n /**\n * SELECT over the remote endpoint. Returns rows of plain-string terms\n * (same shape as the local `executeSelect`) so both path kinds compose.\n */\n async select(query: string): Promise<SparqlRow[]> {\n const res = await this.post(\n this.endpoint,\n \"application/sparql-query\",\n this.withPrefixes(query),\n \"application/sparql-results+json\",\n );\n let json: { head?: { vars?: string[] }; results?: { bindings?: Record<string, { value?: string }>[] } };\n try {\n json = (await res.json()) as typeof json;\n } catch (err) {\n // Server ignored Accept and sent something else (or truncated).\n throw new AgentError(\n \"REMOTE_SPARQL\",\n `Endpoint returned non-JSON results (expected sparql-results+json): ${err instanceof Error ? err.message : String(err)}`,\n false,\n );\n }\n const vars = json.head?.vars ?? [];\n const bindings = json.results?.bindings ?? [];\n return bindings.map((b) => {\n const row: SparqlRow = {};\n for (const v of vars) row[v] = b[v]?.value ?? \"\";\n return row;\n });\n }\n\n /**\n * SPARQL 1.1 UPDATE (INSERT/DELETE DATA, DELETE WHERE...) against the\n * update endpoint. Opt-in — never wire this into a read-only agent.\n */\n async update(query: string): Promise<void> {\n await this.post(\n this.updateEndpoint,\n \"application/sparql-update\",\n this.withPrefixes(query),\n \"*/*\",\n );\n }\n}\n\n/** Agent-facing tool. SELECT always; UPDATE only when `allowUpdate`. */\nexport function remoteSparqlTool(adapter: RemoteSparqlAdapter, opts: { allowUpdate?: boolean } = {}): Tool {\n if (!opts.allowUpdate) {\n return defineTool({\n name: \"remote_sparql_select\",\n description: \"Query a remote SPARQL endpoint (read-only SELECT).\",\n schema: z.object({ query: z.string().min(1).max(20000) }),\n execute: async ({ query }: { query: string }) => adapter.select(query),\n });\n }\n return defineTool({\n name: \"remote_sparql\",\n description: \"Query or mutate a remote SPARQL endpoint (SELECT, or UPDATE with { update: true }).\",\n schema: z.object({ query: z.string().min(1).max(20000), update: z.boolean().default(false) }),\n execute: async ({ query, update }: { query: string; update?: boolean }) => {\n if (update) {\n await adapter.update(query);\n return { updated: true };\n }\n return adapter.select(query);\n },\n });\n}","import { z } from \"zod\";\nimport { defineTool } from \"../tools/index.js\";\nimport type { GraphStore, Quad } from \"./index.js\";\n\n/**\n * Entity linking (roadmap P2-sem): turn free-text mentions into graph IRIs.\n * Case-insensitive label index (rdfs:label / skos:prefLabel / skos:altLabel)\n * over the store closure, canonicalized through owl:sameAs groups — a\n * mention linked through any alias resolves to ONE representative IRI.\n *\n * docs/07 rule 2, autonomy-first: the model calls `propose_mapping` and the\n * mapping commits on proposal (default) as a provenance-carrying\n * skos:altLabel the linker sees from then on — matching the autonomous write\n * path everywhere else (graph_add). Human review is the opt-out:\n * `new MappingProposals({ autonomy: false })` queues proposals for decide(),\n * or gate the tool with humanInTheLoopMiddleware. Provenance is mandatory\n * either way.\n */\n\nexport const LABEL_PREDICATES = new Set([\n \"rdfs:label\",\n \"http://www.w3.org/2000/01/rdf-schema#label\",\n \"skos:prefLabel\",\n \"http://www.w3.org/2004/02/skos/core#prefLabel\",\n \"skos:altLabel\",\n \"http://www.w3.org/2004/02/skos/core#altLabel\",\n]);\nconst SAME_AS = new Set([\"owl:sameAs\", \"http://www.w3.org/2002/07/owl#sameAs\"]);\n\n/** Prefixes used to expand/compact IRIs for JSON-LD I/O (nullable values pass through). */\nexport const JSONLD_PREFIXES: Record<string, string> = {\n rdf: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n rdfs: \"http://www.w3.org/2000/01/rdf-schema#\",\n owl: \"http://www.w3.org/2002/07/owl#\",\n xsd: \"http://www.w3.org/2001/XMLSchema#\",\n skos: \"http://www.w3.org/2004/02/skos/core#\",\n dct: \"http://purl.org/dc/terms/\",\n prov: \"http://www.w3.org/ns/prov#\",\n schema: \"https://schema.org/\",\n ex: \"urn:example:\",\n};\n\nexport interface LinkedEntity {\n /** Canonical (sameAs-group representative) IRI, in the store's term form. */\n iri: string;\n label?: string;\n score: number;\n /** Other IRIs the same entity is known as (the sameAs group). */\n sameAsGroup: string[];\n}\n\nexport class EntityLinker {\n constructor(private store: GraphStore) {}\n\n /** Union-find over owl:sameAs pairs: every alias cluster -> one representative. */\n private async sameAsGroups(): Promise<Map<string, string>> {\n const pairs = (await this.store.match(null, null, null)).filter((q) => SAME_AS.has(q.predicate));\n const parent = new Map<string, string>();\n const find = (x: string): string => {\n let root = x;\n while (parent.get(root) !== root && parent.has(root)) root = parent.get(root)!;\n return root;\n };\n const union = (a: string, b: string): void => {\n const ra = find(a);\n const rb = find(b);\n if (ra !== rb) parent.set(ra, rb);\n };\n for (const q of pairs) {\n if (!parent.has(q.subject)) parent.set(q.subject, q.subject);\n if (!parent.has(q.object)) parent.set(q.object, q.object);\n union(q.subject, q.object);\n }\n const representative = new Map<string, string>();\n for (const member of parent.keys()) representative.set(member, find(member));\n return representative;\n }\n\n /** Mention -> candidate entities, best first, canonicalized via sameAs. */\n async link(mention: string, k = 5): Promise<LinkedEntity[]> {\n const needle = mention.trim().toLowerCase();\n if (!needle) return [];\n const quads = await this.store.match(null, null, null);\n const canonical = await this.sameAsGroups();\n const labels = new Map<string, string>(); // iri -> best label (pref > rdfs > alt)\n const labelScore = new Map<string, number>(); // iri -> score of best label predicate (lower wins)\n\n const candidates: { iri: string; label?: string; score: number }[] = [];\n for (const q of quads) {\n // IRI local-name match (ex:ada -> \"ada\", also the full-IRI tail).\n const localPart = localName(q.subject);\n const fullTail = q.subject.includes(\"/\") || q.subject.includes(\"#\") ? q.subject.split(/[#/]/).pop() ?? \"\" : localPart;\n if (localPart === needle) candidates.push({ iri: q.subject, score: 40 });\n else if (localPart.startsWith(needle)) candidates.push({ iri: q.subject, score: 25 });\n else if (fullTail.toLowerCase() === needle) candidates.push({ iri: q.subject, score: 40 });\n\n if (LABEL_PREDICATES.has(q.predicate)) {\n const label = stripLiteral(q.object).toLowerCase();\n const trust = q.predicate.includes(\"altLabel\") ? 2 : q.predicate.includes(\"prefLabel\") ? 0 : 1;\n if (label === needle) candidates.push({ iri: q.subject, label: stripLiteral(q.object), score: 100 });\n else if (label.startsWith(needle)) candidates.push({ iri: q.subject, label: stripLiteral(q.object), score: 60 });\n else if (label.includes(needle)) candidates.push({ iri: q.subject, label: stripLiteral(q.object), score: 30 });\n // Track each iri's best (most authoritative) label for output.\n const prev = labelScore.get(q.subject);\n if (prev === undefined || trust < prev) {\n labels.set(q.subject, stripLiteral(q.object));\n labelScore.set(q.subject, trust);\n }\n }\n }\n\n // Merge per canonical IRI, keep the best score + the group members.\n const merged = new Map<string, LinkedEntity>();\n for (const c of candidates) {\n const rep = canonical.get(c.iri) ?? c.iri;\n const existing = merged.get(rep);\n if (existing) {\n existing.score = Math.max(existing.score, c.score);\n if (c.label && !existing.label) existing.label = c.label;\n if (!existing.sameAsGroup.includes(c.iri)) existing.sameAsGroup.push(c.iri);\n } else {\n merged.set(rep, {\n iri: rep,\n label: c.label ?? labels.get(rep),\n score: c.score,\n sameAsGroup: [c.iri, ...(rep !== c.iri ? [rep] : [])],\n });\n }\n }\n for (const group of merged.values()) {\n group.label ??= labels.get(group.iri);\n if (group.sameAsGroup.length < 2) {\n const members = [...canonical.keys()].filter((m) => canonical.get(m) === canonical.get(group.iri));\n if (members.length > 1) group.sameAsGroup = members;\n }\n }\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n }\n}\n\nfunction stripLiteral(term: string): string {\n const m = term.match(/^\"(.*)\"(\\^\\^<?[\\w:/#.-]+>?|@[\\w-]+)?$/);\n return m ? m[1] : term;\n}\n\nfunction localName(iri: string): string {\n const tail = iri.split(/[#/:]/).pop() ?? \"\";\n return tail.toLowerCase();\n}\n\n/** link_entity agent tool: mention -> canonical IRIs with scores. */\nexport function linkEntityTool(linker: EntityLinker) {\n return defineTool({\n name: \"link_entity\",\n description:\n \"Link a text mention to known graph entities (labels + sameAs canonicalized). Returns canonical IRIs with scores — never invent IRIs.\",\n schema: z.object({ mention: z.string().min(1).max(200), k: z.number().int().min(1).max(10).default(5) }),\n execute: async ({ mention, k }: { mention: string; k?: number }) => linker.link(mention, k),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mapping proposals: LLM proposes, humans approve (docs/07 rule 2)\n// ---------------------------------------------------------------------------\n\nexport interface MappingProposal {\n id: string;\n /** The source-side term: usually a raw column header / mention string. */\n from: string;\n /** The proposed target: a canonical ontology IRI. */\n to: string;\n /** Provenance for the eventual commit (required by GraphStore.validate). */\n source: string;\n status: \"pending\" | \"approved\" | \"rejected\";\n /** True when autonomy committed it on proposal (no human turn). */\n committedByAutonomy?: boolean;\n proposedAt: string;\n}\n\nexport type MappingDecision = \"approved\" | \"rejected\";\n\nexport interface MappingProposalsOptions {\n /**\n * Autonomy: proposals commit IMMEDIATELY on proposal. DEFAULT ON — the\n * agent's whole write path is autonomous (graph_add), so mapping should\n * not be the one gate keeping a human in the loop. Set `autonomy: false`\n * to queue proposals for human decide() instead, or gate the tool with\n * humanInTheLoopMiddleware.\n */\n autonomy?: boolean;\n /** Store to commit against. Without one there is nowhere to commit — proposals queue as pending. */\n store?: GraphStore;\n}\n\nexport class MappingProposals {\n private seq = 0;\n private items = new Map<string, MappingProposal>();\n\n constructor(private opts: MappingProposalsOptions = {}) {}\n\n /** True when proposals commit themselves (autonomy on AND a store bound). */\n get autonomy(): boolean {\n return this.opts.autonomy !== false && !!this.opts.store;\n }\n\n private async commit(proposal: MappingProposal, store: GraphStore): Promise<void> {\n // Promotion = a provenance-carrying alias the linker can see forever.\n await store.add([\n {\n subject: proposal.to,\n predicate: \"skos:altLabel\",\n object: `\"${proposal.from}\"`,\n source: proposal.source,\n derivedFrom: `mapping:${proposal.id}`,\n },\n ]);\n }\n\n /**\n * Record an LLM-proposed mapping. With autonomy (default) + a bound store\n * it commits right away, provenance required; with `autonomy: false` (or\n * no store bound) it queues as pending until decide().\n */\n async propose(from: string, to: string, source: string): Promise<MappingProposal> {\n const existing = [...this.items.values()].find(\n (p) => p.from === from && p.to === to && (p.status === \"pending\" || (this.autonomy && p.status === \"approved\")),\n );\n if (existing) return existing;\n const proposal: MappingProposal = {\n id: `map-${++this.seq}`,\n from,\n to,\n source,\n status: \"pending\",\n proposedAt: new Date().toISOString(),\n };\n if (this.autonomy && this.opts.store) {\n await this.commit(proposal, this.opts.store);\n proposal.status = \"approved\";\n proposal.committedByAutonomy = true;\n }\n this.items.set(proposal.id, proposal);\n return proposal;\n }\n\n list(status?: MappingProposal[\"status\"]): MappingProposal[] {\n return [...this.items.values()].filter((p) => !status || p.status === status);\n }\n\n /** Human decision. `approved` also commits the alias into the graph. */\n async decide(store: GraphStore, id: string, decision: MappingDecision): Promise<MappingProposal | undefined> {\n const proposal = this.items.get(id);\n if (!proposal || proposal.status !== \"pending\") return undefined;\n proposal.status = decision;\n if (decision === \"approved\") {\n await this.commit(proposal, store);\n }\n return proposal;\n }\n}\n\nexport function proposeMappingTool(proposals: MappingProposals) {\n return defineTool({\n name: \"propose_mapping\",\n description: \"Map a raw term to a canonical ontology IRI. Autonomy mode commits the alias immediately (provenance required); review mode queues it for human approval.\",\n schema: z.object({\n from: z.string().min(1).max(200),\n to: z.string().min(1).max(500),\n source: z.string().min(1).describe(\"Provenance URI for the committed alias\"),\n }),\n execute: async ({ from, to, source }: { from: string; to: string; source: string }) => {\n let p: MappingProposal;\n try {\n p = await proposals.propose(from, to, source);\n } catch (err) {\n // Same contract as graph_add: violations are repair feedback, not a\n // thrown tool error that would kill the run.\n return `Commit rejected — fix and retry: ${err instanceof Error ? err.message : String(err)}`;\n }\n return p.committedByAutonomy\n ? { id: p.id, status: \"approved\", committed: true }\n : { id: p.id, status: \"pending\", note: \"Review mode: awaits a human decide() before writing.\" };\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// JSON-LD expand/compact I/O (roadmap P2-sem)\n// ---------------------------------------------------------------------------\n\ninterface JsonLdValue {\n \"@id\"?: string;\n \"@value\"?: string;\n \"@type\"?: string;\n \"@language\"?: string;\n}\n\nfunction resolveIri(term: string, prefixes: Record<string, string>): string | undefined {\n const m = term.match(/^([a-zA-Z][\\w-]*):(.+)$/);\n const base = m ? prefixes[m[1]] : undefined;\n if (m && base) return `${base}${m[2]}`;\n if (/^https?:\\/\\//.test(term)) return term;\n return undefined; // literal or unknown prefix\n}\n\nfunction compactIri(iri: string, prefixes: Record<string, string>): string {\n for (const [prefix, base] of Object.entries(prefixes)) {\n if (iri.startsWith(base)) return `${prefix}:${iri.slice(base.length)}`;\n }\n return iri;\n}\n\nfunction termToJsonLd(term: string, prefixes: Record<string, string>): JsonLdValue {\n const iri = resolveIri(term, prefixes);\n if (iri) return { \"@id\": iri };\n const lang = term.match(/^\"(.*)\"@([\\w-]+)$/);\n if (lang) return { \"@value\": lang[1], \"@language\": lang[2] };\n const typed = term.match(/^\"(.*)\"\\^\\^<?([\\w:/#.-]+)>?$/);\n if (typed) {\n const type = resolveIri(typed[2], prefixes) ?? typed[2];\n return { \"@value\": typed[1], \"@type\": type };\n }\n const plain = term.match(/^\"(.*)\"$/);\n if (plain) return { \"@value\": plain[1] };\n if (/^-?\\d+(\\.\\d+)?$/.test(term) || /^(true|false)$/.test(term)) return { \"@value\": term };\n return { \"@value\": term };\n}\n\nfunction jsonLdToTerm(value: JsonLdValue | string | number | boolean, prefixes: Record<string, string>): string | undefined {\n if (value === null || typeof value !== \"object\") {\n const native = String(value);\n return /^-?\\d+(\\.\\d+)?$/.test(native) || native === \"true\" || native === \"false\" ? native : `\"${native}\"`;\n }\n if (value[\"@id\"]) return compactIri(value[\"@id\"], prefixes);\n if (value[\"@value\"] !== undefined) {\n if (value[\"@language\"]) return `\"${value[\"@value\"]}\"@${value[\"@language\"]}`;\n if (value[\"@type\"]) {\n const type = compactIri(value[\"@type\"], prefixes);\n return `\"${value[\"@value\"]}\"^^${type}`;\n }\n return `\"${value[\"@value\"]}\"`;\n }\n return undefined;\n}\n\n/**\n * Quads -> expanded JSON-LD. Named graphs round-trip: quads carrying a\n * `graph` become JSON-LD named-graph entries ({\"@id\": graph, \"@graph\": ...}),\n * graph-less quads land in the default graph. Provenance fields\n * (source/rule) do not round-trip — JSON-LD carries the statements, the\n * store keeps the evidence.\n */\nexport function quadsToJsonLd(quads: Quad[], prefixes: Record<string, string> = JSONLD_PREFIXES): Record<string, unknown> {\n const byGraph = new Map<string, Quad[]>();\n for (const q of quads) {\n const g = q.graph ?? \"\";\n byGraph.set(g, [...(byGraph.get(g) ?? []), q]);\n }\n const buildNodes = (group: Quad[]): Record<string, unknown>[] => {\n const nodes = new Map<string, Record<string, unknown>>();\n const nodeOf = (id: string): Record<string, unknown> => {\n let n = nodes.get(id);\n if (!n) {\n n = { \"@id\": resolveIri(id, prefixes) ?? id };\n nodes.set(id, n);\n }\n return n;\n };\n for (const q of group) {\n const node = nodeOf(q.subject);\n if (q.predicate === \"rdf:type\" || q.predicate === \"a\") {\n const existing = node[\"@type\"];\n const typeIri = resolveIri(q.object, prefixes) ?? q.object;\n node[\"@type\"] = Array.isArray(existing) ? [...existing, typeIri].filter((t, i, a) => a.indexOf(t) === i) : existing ? [existing, typeIri] : typeIri;\n continue;\n }\n const key = resolveIri(q.predicate, prefixes) ?? q.predicate;\n const value = termToJsonLd(q.object, prefixes);\n const existing = node[key];\n node[key] = Array.isArray(existing) ? [...existing, value] : existing ? [existing, value] : value;\n }\n return [...nodes.values()];\n };\n const graphEntries: unknown[] = [];\n for (const [g, group] of byGraph) {\n const nodes = buildNodes(group);\n if (g === \"\") graphEntries.push(...nodes);\n else graphEntries.push({ \"@id\": resolveIri(g, prefixes) ?? g, \"@graph\": nodes });\n }\n return { \"@context\": prefixes, \"@graph\": graphEntries };\n}\n\n/** Expanded JSON-LD -> quads (named graphs preserved; prefixed terms restored where the map covers them). */\nexport function jsonldToQuads(\n doc: { \"@graph\"?: unknown[] } & Record<string, unknown>,\n prefixes: Record<string, string> = JSONLD_PREFIXES,\n): { subject: string; predicate: string; object: string; graph?: string }[] {\n const out: { subject: string; predicate: string; object: string; graph?: string }[] = [];\n let blank = 0;\n const convertNode = (node: Record<string, unknown>, graphName: string | undefined): void => {\n const subjectId = (node[\"@id\"] ? String(node[\"@id\"]) : \"\") ? compactIri(String(node[\"@id\"]), prefixes) : `_:b${blank++}`;\n const types = node[\"@type\"];\n for (const t of Array.isArray(types) ? types : types ? [types] : []) {\n out.push({ subject: subjectId, predicate: \"rdf:type\", object: compactIri(String(t), prefixes), ...(graphName ? { graph: graphName } : {}) });\n }\n for (const [key, raw] of Object.entries(node)) {\n if (key === \"@id\" || key === \"@type\") continue;\n const predicate = compactIri(key.includes(\":\") ? resolveIri(key, prefixes) ?? key : key, prefixes);\n for (const v of Array.isArray(raw) ? raw : [raw]) {\n const object = jsonLdToTerm(v as JsonLdValue | string, prefixes);\n if (object !== undefined) out.push({ subject: subjectId, predicate, object, ...(graphName ? { graph: graphName } : {}) });\n }\n }\n };\n for (const entry of doc[\"@graph\"] ?? []) {\n if (entry && typeof entry === \"object\" && Array.isArray((entry as Record<string, unknown>)[\"@graph\"])) {\n const named = entry as { \"@id\"?: string; \"@graph\": Record<string, unknown>[] };\n const graphName = named[\"@id\"] ? compactIri(named[\"@id\"], prefixes) : `_:g${out.length}`;\n for (const node of named[\"@graph\"]) convertNode(node, graphName);\n continue;\n }\n convertNode(entry as Record<string, unknown>, undefined);\n }\n return out;\n}","import type { NodeShape, Quad, StoreOptions } from \"./index.js\";\nimport { InMemoryGraphStore, executeSelect } from \"./index.js\";\n\n/**\n * Ontology evolution (roadmap P2-sem, docs/07 lifecycle stage \"evolve\"):\n * TBox v3 -> v4 with a migration that is checked before AND after by a\n * conformance battery, and that never destroys the old store.\n *\n * The store has no delete by design; migration therefore REBUILDS: explicit\n * facts are exported from the old store, transformed (axiom add/remove,\n * term renames, deprecations), re-validated and re-entailed into a fresh\n * v4 store. The v3 store survives untouched — rollback is \"don't adopt\".\n */\n\nexport interface ConformanceCheck {\n id: string;\n /**\n * SPARQL-subset SELECT (see executeSelect). Passes when the row count is\n * within [minRows, maxRows]. Default: at least one row (ask-style);\n * `minRows: 0, maxRows: 0` asserts absence.\n */\n ask?: string;\n minRows?: number;\n maxRows?: number;\n /** An extra SHACL shape the closure must satisfy. */\n shape?: NodeShape;\n /** Why this check matters — surfaces in failure reports. */\n reason?: string;\n}\n\nexport interface ConformanceResult {\n id: string;\n passed: boolean;\n detail: string;\n}\n\nexport interface ConformanceReport {\n passed: boolean;\n results: ConformanceResult[];\n}\n\n/** Run a battery of checks against a store's closure. */\nexport async function runConformance(\n store: InMemoryGraphStore,\n battery: ConformanceCheck[],\n): Promise<ConformanceReport> {\n const results: ConformanceResult[] = [];\n const runner = async (check: ConformanceCheck, closure: Quad[]): Promise<void> => {\n if (check.ask) {\n const rows = await executeSelect(store, check.ask);\n const min = check.minRows ?? 1;\n const ok = rows.length >= min && (check.maxRows == null || rows.length <= check.maxRows);\n results.push({\n id: check.id,\n passed: ok,\n detail: `${rows.length} rows (expected >= ${min}${check.maxRows == null ? \"\" : `, <= ${check.maxRows}`})`,\n });\n return;\n }\n if (check.shape) {\n // Battery shapes aren't store-registered: validate with a scratch\n // store carrying ONLY this shape (checkShapes is pure — no entailment).\n const scratch = new InMemoryGraphStore({ shapes: [check.shape] });\n const mine = scratch.checkShapes(closure).violations;\n results.push({\n id: check.id,\n passed: mine.length === 0,\n detail: mine.length ? mine.map((v) => v.message).join(\"; \") : \"shape holds\",\n });\n return;\n }\n results.push({\n id: check.id,\n passed: false,\n detail: `check has neither ask nor shape${check.reason ? ` (${check.reason})` : \"\"}`,\n });\n };\n const closure = await store.match(null, null, null);\n for (const check of battery) {\n try {\n await runner(check, closure);\n } catch (err) {\n results.push({ id: check.id, passed: false, detail: err instanceof Error ? err.message : String(err) });\n }\n }\n return { passed: results.every((r) => r.passed), results };\n}\n\nexport interface TBoxMigrationSpec {\n from: string;\n to: string;\n /** New TBox axioms to add (provenance required by the store). */\n added?: Quad[];\n /** Exact axioms to retract (matched on subject|predicate|object). */\n removed?: { subject: string; predicate: string; object: string }[];\n /**\n * Term renames applied to BOTH the TBox and ABox in all three positions\n * (subject/predicate/object): class splits, predicate renames, IRI moves.\n */\n renames?: { from: string; to: string }[];\n /** Terms deprecated in this version; with `replacement`, uses are rewritten. */\n deprecations?: { term: string; replacement?: string; reason: string }[];\n /** Shapes/rules carried by the NEW store (defaults to the old store's). */\n shapes?: NodeShape[];\n rules?: StoreOptions[\"rules\"];\n}\n\nexport interface MigrationReport {\n from: string;\n to: string;\n status: \"migrated\" | \"aborted\" | \"failed\";\n addedQuads: number;\n removedQuads: number;\n rewrittenQuads: number;\n /** Named graph the v4 TBox axioms were written to (match(.., ..., tboxGraph)). */\n tboxGraph?: string;\n deprecatedWarnings: string[];\n errors: string[];\n preBattery?: ConformanceReport;\n postBattery?: ConformanceReport;\n}\n\nexport interface MigrationResult {\n report: MigrationReport;\n /** Present on success — the new-version store with a fresh closure. The v3 store is untouched. */\n store?: InMemoryGraphStore;\n}\n\nfunction termKey(q: { subject: string; predicate: string; object: string }): string {\n return `${q.subject}|${q.predicate}|${q.object}`;\n}\n\n/** Ontology-defining predicates: shared with the review auditor. */\nexport const TBOX_PREDICATES = new Set([\n \"rdfs:subClassOf\",\n \"http://www.w3.org/2000/01/rdf-schema#subClassOf\",\n \"rdfs:subPropertyOf\",\n \"http://www.w3.org/2000/01/rdf-schema#subPropertyOf\",\n \"rdfs:domain\",\n \"http://www.w3.org/2000/01/rdf-schema#domain\",\n \"rdfs:range\",\n \"http://www.w3.org/2000/01/rdf-schema#range\",\n \"owl:inverseOf\",\n \"http://www.w3.org/2002/07/owl#inverseOf\",\n]);\n\n/** rdf:type objects that mark a TERM declaration, not an instance fact. */\nexport const OWL_VOCAB = new Set([\n \"owl:TransitiveProperty\",\n \"http://www.w3.org/2002/07/owl#TransitiveProperty\",\n \"owl:SymmetricProperty\",\n \"http://www.w3.org/2002/07/owl#SymmetricProperty\",\n \"owl:FunctionalProperty\",\n \"http://www.w3.org/2002/07/owl#FunctionalProperty\",\n \"owl:Class\",\n \"http://www.w3.org/2002/07/owl#Class\",\n \"rdfs:Class\",\n \"http://www.w3.org/2000/01/rdf-schema#Class\",\n \"rdfs:Datatype\",\n \"http://www.w3.org/2000/01/rdf-schema#Datatype\",\n]);\n\n/**\n * Migrate a TBox. Order: pre-battery (abort on failure) -> rebuild ->\n * post-battery (report failure; caller decides whether to adopt).\n */\nexport async function migrateTBox(\n oldStore: InMemoryGraphStore,\n spec: TBoxMigrationSpec,\n opts: { battery?: ConformanceCheck[]; factory?: (opts: StoreOptions) => InMemoryGraphStore; tboxGraph?: string | false } = {},\n): Promise<MigrationResult> {\n const report: MigrationReport = {\n from: spec.from,\n to: spec.to,\n status: \"migrated\",\n addedQuads: 0,\n removedQuads: 0,\n rewrittenQuads: 0,\n deprecatedWarnings: [],\n errors: [],\n };\n\n if (opts.battery?.length) {\n report.preBattery = await runConformance(oldStore, opts.battery);\n if (!report.preBattery.passed) {\n report.status = \"aborted\";\n report.errors.push(\"pre-migration conformance battery failed — ontology not migrated\");\n return { report };\n }\n }\n\n const removeKeys = new Set((spec.removed ?? []).map(termKey));\n const renameMap = new Map<string, string>();\n for (const r of spec.renames ?? []) renameMap.set(r.from, r.to);\n for (const d of spec.deprecations ?? []) {\n if (d.replacement) {\n renameMap.set(d.term, d.replacement);\n report.deprecatedWarnings.push(`${d.term} deprecated (${d.reason}) — rewritten to ${d.replacement}`);\n } else {\n report.deprecatedWarnings.push(`${d.term} deprecated (${d.reason}) — uses kept, flagged`);\n }\n }\n\n const rewriteTerm = (term: string): string => renameMap.get(term) ?? term;\n\n const factory = opts.factory ?? ((o: StoreOptions) => new InMemoryGraphStore(o));\n const newStore = factory({\n shapes: spec.shapes ?? oldStore.ontologyShapes(),\n rules: spec.rules ?? oldStore.ontologyRules(),\n });\n\n const explicit = (await oldStore.match(null, null, null)).filter((q) => q.source !== \"entailment\");\n // Named-graph use: the v4 ontology is its OWN dataset inside the store —\n // every version stays addressable (match(null, null, null, tboxGraph)),\n // JSON-LD round-trips it as a named graph, and `false` opts out.\n const tboxGraph = opts.tboxGraph === false ? undefined : opts.tboxGraph ?? `urn:framework:ontology:${spec.to}`;\n report.tboxGraph = tboxGraph;\n const isAxiom = (q: Quad, predicatesInUse: Set<string>): boolean => {\n if (TBOX_PREDICATES.has(q.predicate)) return true;\n // rdf:type is TBox when it types a TERM (property/class used somewhere)\n // or carries an OWL vocabulary marker — it's ABox for plain instances\n // (prefixed and full-IRI forms both count).\n if (q.predicate === \"rdf:type\" || q.predicate === \"a\" || q.predicate === \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\") {\n return predicatesInUse.has(q.subject) || OWL_VOCAB.has(q.object);\n }\n return false;\n };\n const predicatesInUse = new Set(explicit.filter((q) => !removeKeys.has(termKey(q))).map((q) => rewriteTerm(q.predicate)));\n\n const rewrittenSpecAdded = (spec.added ?? []).map((aq) =>\n tboxGraph ? { ...aq, graph: tboxGraph, derivedFrom: `migration:${spec.from}->${spec.to}` } : { ...aq, derivedFrom: `migration:${spec.from}->${spec.to}` },\n );\n const rebuilt: Quad[] = [];\n for (const q of explicit) {\n if (removeKeys.has(termKey(q))) {\n report.removedQuads += 1;\n continue;\n }\n const next: Quad = {\n subject: rewriteTerm(q.subject),\n predicate: rewriteTerm(q.predicate),\n object: rewriteTerm(q.object),\n source: q.source,\n ...(q.graph ? { graph: q.graph } : {}),\n ...(q.derivedFrom ? { derivedFrom: q.derivedFrom } : {}),\n };\n if (isAxiom(next, predicatesInUse) && tboxGraph) next.graph = tboxGraph;\n if (termKey(next) !== termKey(q)) {\n report.rewrittenQuads += 1;\n next.derivedFrom = `${next.derivedFrom ? `${next.derivedFrom};` : \"\"}migration:${spec.from}->${spec.to}`;\n }\n rebuilt.push(next);\n }\n for (const aq of rewrittenSpecAdded) rebuilt.push(aq);\n report.addedQuads = (spec.added ?? []).length;\n\n try {\n await newStore.add(rebuilt);\n } catch (err) {\n report.status = \"failed\";\n report.errors.push(`v4 store rejected migrated facts: ${err instanceof Error ? err.message : String(err)}`);\n return { report };\n }\n\n if (opts.battery?.length) {\n report.postBattery = await runConformance(newStore, opts.battery);\n if (!report.postBattery.passed) {\n report.status = \"failed\";\n const failed = report.postBattery.results.filter((r) => !r.passed).map((r) => `${r.id}: ${r.detail}`);\n report.errors.push(`post-migration conformance battery failed — ${failed.join(\"; \")}`);\n return { report };\n }\n }\n\n return { report, store: newStore };\n}","import { z } from \"zod\";\nimport { defineTool } from \"../tools/index.js\";\nimport type { NodeShape, Quad } from \"./index.js\";\nimport { InMemoryGraphStore } from \"./index.js\";\nimport { LABEL_PREDICATES } from \"./entity-linking.js\";\nimport { TBOX_PREDICATES, OWL_VOCAB } from \"./ontology-evolution.js\";\n\n/**\n * Ontology self-review (extends docs/07 lifecycle: enforce -> evolve):\n * the agent audits what its own ontology IS — not what it wishes it were —\n * directly from the store, and identifies what to add:\n *\n * 1. reviewOntology(): inventory + gaps. Used-but-undeclared terms,\n * declared-but-unused terms, unlabeled terms, properties missing\n * rdfs:domain/range. \"Where is X used?\", \"what's missing?\" — one call.\n * 2. proposeShapes(): SHACL INDUCTION from instance data — observe each\n * class's instances, emit candidate NodeShapes (minCount/maxCount,\n * datatype, nodeKind) that explain the observed data. Per docs/07 the\n * builder owns shapes: these are PROPOSALS — adopt via adoptShapes()\n * (validates the existing closure first) or the next\n * migrateTBox({ shapes }); never a silent self-adoption.\n */\n\nconst RDF_TYPE = new Set([\"rdf:type\", \"a\", \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"]);\n\nexport interface TermStat {\n term: string;\n kind: \"class\" | \"property\";\n /** Explicit ABox uses: instance-of counts for classes, fact counts for properties. */\n uses: number;\n /** TBox axioms mentioning the term (declarations, subClassOf, domain/range, ...). */\n axiomCount: number;\n label?: string;\n}\n\nexport interface OntologyReview {\n classes: TermStat[];\n properties: TermStat[];\n /** Used in data with zero TBox declarations — the \"what to add\" list. */\n undeclared: TermStat[];\n /** Declared but never used in any explicit fact. */\n unused: string[];\n /** Terms without rdfs:label / skos:prefLabel / altLabel. */\n unlabeled: string[];\n /** Properties missing rdfs:domain / rdfs:range axioms. */\n missingDomain: string[];\n missingRange: string[];\n /** Explicit quads vs closure size — how much the ontology explains. */\n explicitQuads: number;\n closureQuads: number;\n}\n\n/** True when the quad is an ontology statement, not a fact. */\nconst isAxiomQuad = (q: Quad, predicatesInUse: Set<string>): boolean =>\n TBOX_PREDICATES.has(q.predicate) ||\n (RDF_TYPE.has(q.predicate) && (predicatesInUse.has(q.subject) || OWL_VOCAB.has(q.object)));\n\nfunction strip(term: string): string {\n const m = term.match(/^\"(.*)\"(\\^\\^<?[\\w:/#.-]+>?|@[\\w-]+)?$/);\n return m ? m[1] : term;\n}\n\n/** Audit the store: inventory + gap list. Pure read — never mutates. */\nexport async function reviewOntology(store: InMemoryGraphStore): Promise<OntologyReview> {\n const closure = await store.match(null, null, null);\n const explicit = closure.filter((q) => q.source !== \"entailment\");\n const predicatesInUse = new Set(explicit.map((q) => q.predicate));\n\n const labels = new Map<string, string>();\n for (const q of closure) {\n if (LABEL_PREDICATES.has(q.predicate)) labels.set(q.subject, strip(q.object));\n }\n\n const classes = new Map<string, TermStat>();\n const properties = new Map<string, TermStat>();\n const class_ = (term: string): TermStat => {\n let s = classes.get(term);\n if (!s) {\n s = { term, kind: \"class\", uses: 0, axiomCount: 0, label: labels.get(term) };\n classes.set(term, s);\n }\n return s;\n };\n const property = (term: string): TermStat => {\n let s = properties.get(term);\n if (!s) {\n s = { term, kind: \"property\", uses: 0, axiomCount: 0, label: labels.get(term) };\n properties.set(term, s);\n }\n return s;\n };\n\n const domains = new Map<string, number>();\n const ranges = new Map<string, number>();\n for (const q of explicit) {\n const axiom = isAxiomQuad(q, predicatesInUse);\n\n // rdf:type: axiom = term declaration (TBox) ; fact = instance typing (ABox).\n if (RDF_TYPE.has(q.predicate)) {\n if (axiom) class_(q.subject).axiomCount += 1;\n else class_(q.object).uses += 1;\n continue;\n }\n\n if (TBOX_PREDICATES.has(q.predicate)) {\n // TBox statements introduce/declare their subject term.\n const subject = q.predicate.includes(\"subClassOf\") ? class_(q.subject) : property(q.subject);\n subject.axiomCount += 1;\n // Their object is a class term (domain/range/subClassOf targets).\n if (!q.predicate.includes(\"inverseOf\")) class_(q.object).axiomCount += 1;\n if (q.predicate.includes(\"domain\")) domains.set(q.subject, (domains.get(q.subject) ?? 0) + 1);\n if (q.predicate.includes(\"range\")) ranges.set(q.subject, (ranges.get(q.subject) ?? 0) + 1);\n continue;\n }\n\n // ABox fact: a property use with actual data behind it.\n property(q.predicate).uses += 1;\n }\n // owl:inverseOf subjects/objects are property terms too (handled below via\n // the property map only when they carry any axiom or use).\n\n const all = [...classes.values(), ...properties.values()];\n const undeclared = all.filter((t) => t.uses > 0 && t.axiomCount === 0);\n const unused = all.filter((t) => t.axiomCount > 0 && t.uses === 0).map((t) => t.term);\n const unlabeled = all.filter((t) => !t.label).map((t) => t.term);\n const missingDomain = [...properties.values()]\n .filter((t) => t.axiomCount > 0 || t.uses > 0) // known terms only; no vocab noise\n .filter((t) => !domains.has(t.term))\n .map((t) => t.term);\n const missingRange = [...properties.values()]\n .filter((t) => t.axiomCount > 0 || t.uses > 0)\n .filter((t) => !ranges.has(t.term))\n .map((t) => t.term);\n\n return {\n classes: [...classes.values()].sort((a, b) => b.uses - a.uses || a.term.localeCompare(b.term)),\n properties: [...properties.values()].sort((a, b) => b.uses - a.uses || a.term.localeCompare(b.term)),\n undeclared: undeclared.sort((a, b) => b.uses - a.uses),\n unused,\n unlabeled,\n missingDomain,\n missingRange,\n explicitQuads: explicit.length,\n closureQuads: closure.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// SHACL induction from instance data\n// ---------------------------------------------------------------------------\n\nexport interface ShapeInductionOptions {\n /** Classes with fewer instances produce no shape. Default 2. */\n minInstances?: number;\n /** Only emit a property shape when >= this fraction of instances have it. Default 0.5. */\n coverage?: number;\n}\n\n/**\n * Propose NodeShapes by observing explicit instance data: for each class,\n * per-property coverage, cardinality, datatypes, node kinds across its\n * instances. PROPOSAL ONLY per docs/07 (shapes are builder-owned).\n */\nexport async function proposeShapes(\n store: InMemoryGraphStore,\n opts: ShapeInductionOptions = {},\n): Promise<NodeShape[]> {\n const minInstances = opts.minInstances ?? 2;\n const coverage = opts.coverage ?? 0.5;\n const explicit = (await store.match(null, null, null)).filter((q) => q.source !== \"entailment\");\n const predicatesInUse = new Set(explicit.map((q) => q.predicate));\n\n // Class -> instance subjects, from EXPLICIT type facts only (closure types\n // would smear subclass properties up into parent shapes).\n const instancesOf = new Map<string, Set<string>>();\n for (const q of explicit) {\n if (!RDF_TYPE.has(q.predicate) || isAxiomQuad(q, predicatesInUse)) continue;\n const set = instancesOf.get(q.object) ?? new Set<string>();\n set.add(q.subject);\n instancesOf.set(q.object, set);\n }\n\n const shapes: NodeShape[] = [];\n for (const [cls, subjects] of instancesOf) {\n if (subjects.size < minInstances) continue;\n // Per-property observation across this class's instances.\n const observed = new Map<\n string,\n { present: number; maxSeen: number; datatypes: Set<string>; nodeKinds: Set<\"iri\" | \"literal\"> }\n >();\n const bySubject = new Map<string, Quad[]>();\n for (const q of explicit) {\n if (!subjects.has(q.subject)) continue;\n bySubject.set(q.subject, [...(bySubject.get(q.subject) ?? []), q]);\n }\n for (const [, quads] of bySubject) {\n const byPath = new Map<string, Quad[]>();\n for (const q of quads) {\n if (RDF_TYPE.has(q.predicate)) continue;\n byPath.set(q.predicate, [...(byPath.get(q.predicate) ?? []), q]);\n }\n for (const [path, pathQuads] of byPath) {\n const o = observed.get(path) ?? { present: 0, maxSeen: 0, datatypes: new Set<string>(), nodeKinds: new Set<\"iri\" | \"literal\">() };\n o.present += 1;\n o.maxSeen = Math.max(o.maxSeen, pathQuads.length);\n for (const q of pathQuads) {\n o.nodeKinds.add(isLiteralTerm(q.object) ? \"literal\" : \"iri\");\n const dt = datatypeOf(q.object);\n if (dt) o.datatypes.add(dt);\n }\n observed.set(path, o);\n }\n }\n const properties: NodeShape[\"properties\"] = [];\n for (const [path, o] of observed) {\n if (o.present / subjects.size < coverage) continue;\n const shape: NodeShape[\"properties\"][number] = { path };\n if (o.present === subjects.size) shape.minCount = 1;\n if (o.maxSeen === 1) shape.maxCount = 1;\n if (o.datatypes.size === 1) shape.datatype = [...o.datatypes][0];\n if (o.nodeKinds.size === 1) shape.nodeKind = [...o.nodeKinds][0];\n properties.push(shape);\n }\n if (properties.length) shapes.push({ targetClass: cls, properties });\n }\n return shapes;\n}\n\nfunction isLiteralTerm(term: string): boolean {\n if (term.startsWith('\"')) return true;\n if (/^(-?\\d+(\\.\\d+)?|true|false)$/.test(term)) return true;\n if (term.startsWith(\"<\") || /^[a-zA-Z][\\w-]*:/.test(term)) return false;\n return true;\n}\n\nfunction datatypeOf(term: string): string | undefined {\n const m = term.match(/\\^\\^<?([\\w:/#.-]+)>?$/);\n if (m) return m[1];\n if (/^\".*\"@[\\w-]+$/.test(term)) return \"rdf:langString\";\n if (/^\".*\"$/.test(term)) return \"xsd:string\";\n if (/^-?\\d+$/.test(term)) return \"xsd:integer\";\n if (/^-?\\d*\\.\\d+$/.test(term)) return \"xsd:decimal\";\n if (/^(true|false)$/.test(term)) return \"xsd:boolean\";\n return undefined;\n}\n\n/**\n * Adopt proposed shapes: each shape is validated against the CURRENT closure\n * in isolation — a shape the existing data already violates is rejected with\n * its violations (1:1 mapping, no guesswork), the clean ones are registered.\n * Versioned adoption: migrateTBox({ shapes }) instead.\n */\nexport async function adoptShapes(\n store: InMemoryGraphStore,\n shapes: NodeShape[],\n): Promise<{ adopted: NodeShape[]; rejected: { shape: NodeShape; violations: string[] }[] }> {\n const closure = await store.match(null, null, null);\n const adopted: NodeShape[] = [];\n const rejected: { shape: NodeShape; violations: string[] }[] = [];\n for (const shape of shapes) {\n // Validate with ONLY this shape: violations map to it unambiguously.\n const violations = new InMemoryGraphStore({ shapes: [shape] }).checkShapes(closure).violations;\n if (violations.length) rejected.push({ shape, violations: violations.map((v) => v.message) });\n else adopted.push(shape);\n }\n if (adopted.length) store.addShapes(...adopted);\n return { adopted, rejected };\n}\n\n/** review_ontology agent tool: inventory + gaps, straight from the store. */\nexport function reviewOntologyTool(store: InMemoryGraphStore) {\n return defineTool({\n name: \"review_ontology\",\n description:\n \"Audit the knowledge graph's ontology: classes/properties with usage counts, used-but-undeclared terms, unlabeled/unused terms, properties missing domain or range. Read-only.\",\n schema: z.object({}),\n execute: async () => reviewOntology(store),\n });\n}\n\n/** propose_shapes agent tool: SHACL candidates induced from instance data. */\nexport function proposeShapesTool(store: InMemoryGraphStore, opts: ShapeInductionOptions = {}) {\n return defineTool({\n name: \"propose_shapes\",\n description:\n \"Induce candidate SHACL shapes from existing instance data (>= 2 instances per class, >= 50% property coverage). PROPOSAL: adoption is the builder's call via adoptShapes(), never automatic.\",\n schema: z.object({}),\n execute: async () => proposeShapes(store, opts),\n });\n}","// Public API — everything consumers need, nothing they don't.\n// Import from \"framework-agents\", never from deep paths.\n\nexport * from \"./types/index.js\";\nexport * from \"./config/index.js\";\nexport * from \"./agent/index.js\";\nexport * from \"./state/index.js\";\nexport * from \"./conversation/index.js\";\nexport * from \"./sessions/index.js\";\nexport * from \"./checkpoint/index.js\";\nexport * from \"./swarm/index.js\";\nexport * from \"./a2a/index.js\";\nexport * from \"./client/index.js\";\nexport * from \"./serve/index.js\";\nexport * from \"./rag/index.js\";\nexport * from \"./sandbox/index.js\";\nexport * from \"./evals/index.js\";\nexport * from \"./tracing/index.js\";\nexport * from \"./streaming/index.js\";\nexport * from \"./structured/index.js\";\nexport * from \"./middleware/index.js\";\nexport * from \"./tools/index.js\";\nexport * from \"./memory/index.js\";\nexport * from \"./memory/compaction.js\";\nexport * from \"./models/index.js\";\nexport * from \"./runtime/index.js\";\nexport * from \"./observability/index.js\";\nexport * from \"./orchestration/index.js\";\nexport * from \"./workflows/index.js\";\nexport * from \"./skills/index.js\";\nexport * from \"./mcp/index.js\";\nexport * from \"./prompts/index.js\";\nexport * from \"./semantic/index.js\";\nexport * from \"./utils/index.js\";\nexport * as z from \"zod\";\n"],"mappings":"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","names":["join","join","z","z","z","z","resolve","readFileSync","dirname","resolve","z","system","join","z","stat","z","resolve","readFileSync","dirname","resolved","z","z","z","readFile","stat","writeFile","join","resolve","z","join","resolve","writeFile","stat","readFile","readFileSync","dirname","dirname","open","z","z","resolve","readFileSync","z","z","z","z","z","existing","closure","predicatesInUse","z","z","RDF_TYPE","z","z"]}
|