@dreb/coding-agent 2.18.0 → 2.19.1
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/README.md +3 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +3 -2
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +6 -5
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/buddy/buddy-controller.d.ts.map +1 -1
- package/dist/core/buddy/buddy-controller.js +3 -2
- package/dist/core/buddy/buddy-controller.js.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +2 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/logger.d.ts +29 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +54 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +3 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +25 -2
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/stderr-guard.d.ts +37 -0
- package/dist/core/stderr-guard.d.ts.map +1 -0
- package/dist/core/stderr-guard.js +90 -0
- package/dist/core/stderr-guard.js.map +1 -0
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +5 -4
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/subagent.d.ts +38 -1
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +192 -17
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/core/tools/terminal-render.d.ts.map +1 -1
- package/dist/core/tools/terminal-render.js +2 -1
- package/dist/core/tools/terminal-render.js.map +1 -1
- package/dist/core/tools/web-search-queue.d.ts.map +1 -1
- package/dist/core/tools/web-search-queue.js +2 -1
- package/dist/core/tools/web-search-queue.js.map +1 -1
- package/dist/core/tools/web.d.ts.map +1 -1
- package/dist/core/tools/web.js +6 -5
- package/dist/core/tools/web.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +25 -24
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +32 -2
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +3 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { AgentTool } from \"@dreb/agent-core\";\nimport { Text } from \"@dreb/tui\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { CONFIG_DIR_NAME, getPackageDir, getSubagentSessionsDir } from \"../../config.js\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.js\";\nimport { attachJsonlLineReader } from \"../../modes/rpc/jsonl.js\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.js\";\nimport type { ModelRegistry } from \"../model-registry.js\";\nimport { resolveCliModel } from \"../model-resolver.js\";\nimport { getTextOutput, invalidArgText, str } from \"./render-utils.js\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.js\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult } from \"./truncate.js\";\n\n// ---------------------------------------------------------------------------\n// Agent type system\n// ---------------------------------------------------------------------------\n\ninterface AgentTypeConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string;\n\t/** Single model ID or ordered fallback list. First resolvable model wins. */\n\tmodel?: string | string[];\n\tsystemPrompt: string;\n}\n\nconst DEFAULT_AGENT = \"Explore\";\n\nexport function parseAgentFrontmatter(\n\tcontent: string,\n): { ok: true; config: AgentTypeConfig } | { ok: false; error: string } {\n\tconst fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n\tif (!fmMatch) return { ok: false, error: \"missing --- frontmatter delimiters\" };\n\n\tconst frontmatter = fmMatch[1];\n\tconst body = fmMatch[2].trim();\n\n\tconst get = (key: string): string | undefined => {\n\t\tconst match = frontmatter.match(new RegExp(`^${key}:\\\\s*(.+)$`, \"m\"));\n\t\treturn match?.[1].trim();\n\t};\n\n\t/** Parse `model` field — supports single string, comma-separated, or YAML list syntax. */\n\tconst getModel = (): string | string[] | undefined => {\n\t\t// First check for YAML list syntax (indented lines starting with \"- \")\n\t\tconst listMatch = frontmatter.match(/^model:\\s*\\n((?:\\s+-\\s+.+\\n?)+)/m);\n\t\tif (listMatch) {\n\t\t\tconst items = listMatch[1]\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.map((line) => line.replace(/^\\s+-\\s+/, \"\").trim())\n\t\t\t\t.filter(Boolean);\n\t\t\treturn items.length > 1 ? items : items[0];\n\t\t}\n\t\t// Inline value — check for comma-separated list\n\t\tconst value = get(\"model\");\n\t\tif (!value) return undefined;\n\t\tif (value.includes(\",\")) {\n\t\t\tconst items = value\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((s) => s.trim())\n\t\t\t\t.filter(Boolean);\n\t\t\treturn items.length > 1 ? items : items[0];\n\t\t}\n\t\treturn value;\n\t};\n\n\tconst name = get(\"name\");\n\tif (!name) return { ok: false, error: \"missing required 'name' field in frontmatter\" };\n\n\treturn {\n\t\tok: true,\n\t\tconfig: {\n\t\t\tname,\n\t\t\tdescription: get(\"description\") || \"\",\n\t\t\ttools: get(\"tools\"),\n\t\t\tmodel: getModel(),\n\t\t\tsystemPrompt: body,\n\t\t},\n\t};\n}\n\nfunction discoverAgentTypes(cwd: string): Map<string, AgentTypeConfig> {\n\tconst agents = new Map<string, AgentTypeConfig>();\n\n\t// Package-bundled agents (shipped with dreb — the canonical source of truth for built-in agents)\n\tconst packageAgentsDir = join(getPackageDir(), \"agents\");\n\tloadAgentsFromDir(packageAgentsDir, agents);\n\n\t// User-level agents (~/.dreb/agents/*.md)\n\tconst userDir = join(homedir(), CONFIG_DIR_NAME, \"agents\");\n\tloadAgentsFromDir(userDir, agents);\n\n\t// Project-level agents (.dreb/agents/*.md)\n\t// TODO: Security gate — prompt user for confirmation before loading agents from untrusted repos\n\tconst projectDir = join(cwd, \".dreb\", \"agents\");\n\tloadAgentsFromDir(projectDir, agents);\n\n\treturn agents;\n}\n\nfunction loadAgentsFromDir(dir: string, agents: Map<string, AgentTypeConfig>): void {\n\tif (!existsSync(dir)) return;\n\ttry {\n\t\tfor (const file of readdirSync(dir)) {\n\t\t\tif (!file.endsWith(\".md\")) continue;\n\t\t\ttry {\n\t\t\t\tconst content = readFileSync(join(dir, file), \"utf-8\");\n\t\t\t\tconst parsed = parseAgentFrontmatter(content);\n\t\t\t\tif (!parsed.ok) {\n\t\t\t\t\tconsole.error(`[subagent] Skipping agent file ${join(dir, file)}: ${parsed.error}`);\n\t\t\t\t} else {\n\t\t\t\t\tagents.set(parsed.config.name, parsed.config);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[subagent] Could not read agent file ${join(dir, file)}: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n\t\t\tconsole.error(\n\t\t\t\t`[subagent] Could not read agents directory ${dir}: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Subagent process spawning\n// ---------------------------------------------------------------------------\n\nexport interface SubagentResult {\n\tagent: string;\n\ttask: string;\n\tmodel?: string;\n\texitCode: number;\n\toutput: string;\n\tstderr: string;\n\terrorMessage: string | null;\n\t/** Path to the persisted session JSONL file, if available */\n\tsessionFile?: string;\n}\n\n// Capture at module load before process.title overwrites argv memory on Linux.\n// After process.title = \"dreb\" (in cli.ts), the original argv area is overwritten\n// and process.argv[1] may return corrupted or truncated data.\nconst DREB_SCRIPT = process.argv[1] || \"dreb\";\nconst NODE_EXEC = process.execPath;\n\n// Tools that must never be available to subagents — wait (subagents should\n// never no-op; they have a task to complete) and subagent (no recursive spawning).\nconst SUBAGENT_EXCLUDED_TOOLS = [\"wait\", \"subagent\"] as const;\n\n// Default standard tools for subagents when no tools are specified in the agent\n// definition. This is the set passed via --tools to the child process.\n//\n// NOTE: Always-active tools (search, skill, tasks_update, suggest_next) are NOT\n// listed here — the child process adds them unconditionally regardless of --tools.\n// Internal tools (tmp_read) are also excluded.\nconst SUBAGENT_DEFAULT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\", \"web_search\", \"web_fetch\"];\n\n/**\n * Filter a comma-separated tools string, removing any tools in SUBAGENT_EXCLUDED_TOOLS.\n * Returns the filtered tools as a comma-separated string (always non-empty — falls\n * back to SUBAGENT_DEFAULT_TOOLS if all specified tools were excluded).\n */\nexport function filterSubagentTools(tools: string | undefined): string {\n\tif (!tools) return SUBAGENT_DEFAULT_TOOLS.join(\",\");\n\tconst filtered = tools\n\t\t.split(\",\")\n\t\t.map((t) => t.trim())\n\t\t.filter((t) => !(SUBAGENT_EXCLUDED_TOOLS as readonly string[]).includes(t))\n\t\t.join(\",\");\n\treturn filtered || SUBAGENT_DEFAULT_TOOLS.join(\",\");\n}\n\n// TODO: Support PATH-based binary discovery.\n// Currently returns the captured argv[1].\nfunction findDrebBinary(): string {\n\treturn DREB_SCRIPT;\n}\n\nasync function spawnSubagent(\n\tagentConfig: AgentTypeConfig,\n\ttask: string,\n\tcwd: string,\n\tsignal?: AbortSignal,\n\tonProgress?: (event: string) => void,\n\tparentProvider?: string,\n\tsessionDir?: string,\n): Promise<SubagentResult> {\n\tconst drebBin = findDrebBinary();\n\tconsole.error(`[subagent] spawn: agent=${agentConfig.name} cwd=${cwd}`);\n\n\t// Validate cwd exists — spawn() throws a misleading ENOENT blaming the\n\t// binary when the cwd is invalid, making the real cause hard to diagnose\n\tif (!existsSync(cwd)) {\n\t\treturn {\n\t\t\tagent: agentConfig.name,\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: `Working directory does not exist: ${cwd}`,\n\t\t};\n\t}\n\n\tconst args: string[] = [\"--mode\", \"json\", \"--ui\", \"agent\"];\n\tif (sessionDir) {\n\t\targs.push(\"--session-dir\", sessionDir);\n\t} else {\n\t\targs.push(\"--no-session\");\n\t}\n\t// By spawn time, model should be a resolved single string (fallback resolution\n\t// happens in executeSingle). Handle string[] defensively by taking the first entry.\n\tconst modelStr = Array.isArray(agentConfig.model) ? agentConfig.model[0] : agentConfig.model;\n\tif (modelStr) {\n\t\targs.push(\"--model\", modelStr);\n\t\t// When the model string doesn't already specify a provider (no \"/\"),\n\t\t// inherit the parent's provider to prevent fuzzy matching from picking\n\t\t// an unauthenticated provider (e.g. Bedrock instead of Anthropic).\n\t\tif (parentProvider && !modelStr.includes(\"/\")) {\n\t\t\targs.push(\"--provider\", parentProvider);\n\t\t}\n\t}\n\t// Always pass --tools to ensure wait/subagent are excluded from child processes.\n\t// filterSubagentTools always returns a non-empty string.\n\targs.push(\"--tools\", filterSubagentTools(agentConfig.tools));\n\tif (agentConfig.systemPrompt) {\n\t\targs.push(\"--append-system-prompt\", agentConfig.systemPrompt);\n\t}\n\t// Pass agent type metadata so the child session can record it in its JSONL header\n\targs.push(\"--agent-type\", agentConfig.name);\n\targs.push(\"-p\", task);\n\n\t// Early abort check — if the signal is already aborted (e.g. queued task whose\n\t// AbortController was aborted while waiting on bgAcquire), bail out before\n\t// spawning a child process that can never be killed. addEventListener(\"abort\")\n\t// on an already-aborted signal does NOT fire the callback in Node.js.\n\tif (signal?.aborted) {\n\t\treturn {\n\t\t\tagent: agentConfig.name,\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: \"Aborted before spawn\",\n\t\t};\n\t}\n\n\treturn new Promise<SubagentResult>((resolvePromise, rejectPromise) => {\n\t\tlet proc: ChildProcess;\n\t\ttry {\n\t\t\tproc = spawn(NODE_EXEC, [drebBin, ...args], {\n\t\t\t\tcwd,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\tenv: { ...process.env },\n\t\t\t});\n\t\t} catch (err) {\n\t\t\trejectPromise(new Error(`Failed to spawn subagent: ${err instanceof Error ? err.message : String(err)}`));\n\t\t\treturn;\n\t\t}\n\n\t\tlet settled = false;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | null = null;\n\t\tconst collectedMessages: Array<{ role: string; content: any[] }> = [];\n\t\tconst stderrChunks: string[] = [];\n\t\tlet stderrSize = 0;\n\t\tconst MAX_STDERR_BYTES = 8192;\n\t\tconst plainStdoutLines: string[] = [];\n\t\tlet lastToolName = \"\";\n\t\tlet resolvedModel: string | undefined;\n\n\t\t// Drain stderr concurrently to avoid pipe deadlock (capped to prevent OOM from verbose subagents)\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (stderrSize < MAX_STDERR_BYTES) {\n\t\t\t\tconst str = chunk.toString();\n\t\t\t\tstderrChunks.push(str);\n\t\t\t\tstderrSize += str.length;\n\t\t\t}\n\t\t});\n\t\tproc.stderr?.on(\"error\", (err) => {\n\t\t\tconsole.error(`[subagent] stderr stream error (agent=${agentConfig.name}): ${err.message}`);\n\t\t});\n\n\t\t// Parse JSONL events from stdout\n\t\tif (proc.stdout) {\n\t\t\tproc.stdout.on(\"error\", (err) => {\n\t\t\t\tconsole.error(`[subagent] stdout stream error (agent=${agentConfig.name}): ${err.message}`);\n\t\t\t});\n\t\t\tattachJsonlLineReader(proc.stdout, (line) => {\n\t\t\t\tif (!line.trim()) return;\n\t\t\t\t// Separate JSON.parse from event handling so only parse failures\n\t\t\t\t// are caught as non-JSON lines — errors in handling propagate normally\n\t\t\t\tlet event: any;\n\t\t\t\ttry {\n\t\t\t\t\tevent = JSON.parse(line);\n\t\t\t\t} catch {\n\t\t\t\t\t// Capture non-JSON lines — on failure these often contain the real error\n\t\t\t\t\t// (e.g. startup errors printed before JSONL mode begins)\n\t\t\t\t\tplainStdoutLines.push(line.trim());\n\t\t\t\t\tif (line.trim().startsWith(\"{\")) {\n\t\t\t\t\t\tconsole.error(`[subagent] Failed to parse JSONL event: ${line.slice(0, 200)}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.type === \"agent_start\" && event.model) {\n\t\t\t\t\tresolvedModel = event.model.id;\n\t\t\t\t}\n\t\t\t\tif (event.type === \"message_end\" && event.message?.role === \"assistant\") {\n\t\t\t\t\tcollectedMessages.push(event.message);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"tool_execution_start\" && onProgress) {\n\t\t\t\t\tlastToolName = event.toolName || \"\";\n\t\t\t\t\tonProgress(`Using ${lastToolName}...`);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"tool_execution_end\" && onProgress) {\n\t\t\t\t\tonProgress(`${lastToolName} done`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Handle abort signal (guard kill() against ESRCH race if process already exited)\n\t\tconst onAbort = () => {\n\t\t\ttry {\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t} catch {\n\t\t\t\t/* process already exited */\n\t\t\t}\n\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tif (!proc.killed) proc.kill(\"SIGKILL\");\n\t\t\t\t} catch {\n\t\t\t\t\t/* process already exited */\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tproc.on(\"error\", (err) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (killTimer) clearTimeout(killTimer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\trejectPromise(new Error(`Subagent process error: ${err.message}`));\n\t\t});\n\n\t\tproc.on(\"close\", (code) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (killTimer) clearTimeout(killTimer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tconst exitCode = code ?? 1;\n\t\t\tconst stderr = stderrChunks.join(\"\");\n\t\t\tconsole.error(\n\t\t\t\t`[subagent] close: agent=${agentConfig.name} exit=${exitCode} messages=${collectedMessages.length}${exitCode !== 0 ? ` stderr=${stderr.slice(0, 200)} stdout=${plainStdoutLines.join(\"|\").slice(0, 200)}` : \"\"}`,\n\t\t\t);\n\n\t\t\t// Extract final text output from collected assistant messages\n\t\t\tconst outputParts: string[] = [];\n\t\t\tfor (const msg of collectedMessages) {\n\t\t\t\tif (Array.isArray(msg.content)) {\n\t\t\t\t\tfor (const part of msg.content) {\n\t\t\t\t\t\tif (part.type === \"text\" && part.text) {\n\t\t\t\t\t\t\toutputParts.push(part.text);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst output = outputParts.join(\"\\n\\n\");\n\n\t\t\t// Build error message from best available source: stderr, plain stdout lines, or generic\n\t\t\tlet errorMessage: string | null = null;\n\t\t\tif (exitCode !== 0) {\n\t\t\t\tconst stderrTrimmed = stderr.trim();\n\t\t\t\tconst plainOutput = plainStdoutLines.join(\"\\n\").trim();\n\t\t\t\terrorMessage =\n\t\t\t\t\tstderrTrimmed.slice(0, 500) || plainOutput.slice(0, 500) || `Subagent exited with code ${exitCode}`;\n\t\t\t}\n\n\t\t\t// Discover the session file written by the child process\n\t\t\tconst sessionFile = sessionDir ? discoverSessionFile(sessionDir, agentConfig.name) : undefined;\n\n\t\t\tresolvePromise({\n\t\t\t\tagent: agentConfig.name,\n\t\t\t\ttask,\n\t\t\t\tmodel:\n\t\t\t\t\tresolvedModel ??\n\t\t\t\t\t(exitCode === 0\n\t\t\t\t\t\t? Array.isArray(agentConfig.model)\n\t\t\t\t\t\t\t? agentConfig.model[0]\n\t\t\t\t\t\t\t: agentConfig.model\n\t\t\t\t\t\t: undefined),\n\t\t\t\texitCode,\n\t\t\t\toutput,\n\t\t\t\tstderr: stderr.slice(0, 2000), // cap stderr\n\t\t\t\terrorMessage,\n\t\t\t\tsessionFile,\n\t\t\t});\n\t\t});\n\t});\n}\n\n// ---------------------------------------------------------------------------\n// Session file discovery and cleanup\n// ---------------------------------------------------------------------------\n\n/**\n * Find the most recently modified .jsonl file in a session directory.\n * Returns the full path, or undefined if no session file was written\n * (e.g., subagent was killed before the first assistant message).\n */\nexport function discoverSessionFile(sessionDir: string, agentName: string): string | undefined {\n\ttry {\n\t\tif (!existsSync(sessionDir)) return undefined;\n\t\tconst files = readdirSync(sessionDir).filter((f) => f.endsWith(\".jsonl\"));\n\t\tif (files.length === 0) return undefined;\n\t\t// Pick the most recently modified file (typically there's only one per subagent dir)\n\t\tlet best: { path: string; mtime: number } | undefined;\n\t\tfor (const f of files) {\n\t\t\ttry {\n\t\t\t\tconst fullPath = join(sessionDir, f);\n\t\t\t\tconst mtime = statSync(fullPath).mtime.getTime();\n\t\t\t\tif (!best || mtime > best.mtime) {\n\t\t\t\t\tbest = { path: fullPath, mtime };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// File disappeared or is a bad symlink — skip it, keep any valid candidate\n\t\t\t}\n\t\t}\n\t\tif (best) {\n\t\t\tconsole.error(`[subagent] session file: ${best.path} (agent=${agentName})`);\n\t\t\treturn best.path;\n\t\t}\n\t} catch (err) {\n\t\tconsole.error(\n\t\t\t`[subagent] failed to discover session file (agent=${agentName}): ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t}\n\treturn undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Execution modes\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a model fallback list against the registry. Tries each model in order,\n * returns the first one that resolves successfully. If all fail, returns the\n * last error. Single strings are treated as a one-element list.\n */\nexport function resolveModelWithFallbacks(\n\tmodels: string | string[],\n\tparentProvider: string | undefined,\n\tregistry: ModelRegistry | undefined,\n\tparentModel?: string,\n): { ok: true; modelId: string; provider?: string; warning?: string } | { ok: false; error: string } {\n\tconst modelList = Array.isArray(models) ? models : [models];\n\tlet lastError = \"\";\n\tfor (const modelStr of modelList) {\n\t\tconst result = resolveModelStringSingle(modelStr, parentProvider, registry);\n\t\tif (result.ok) return result;\n\t\tlastError = result.error;\n\t}\n\t// After all configured fallbacks are exhausted, try the parent model as a last resort\n\tif (parentModel) {\n\t\tconst result = resolveModelStringSingle(parentModel, parentProvider, registry);\n\t\tif (result.ok) {\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\twarning: `Agent preferred models were unavailable. Falling back to parent model \"${result.modelId}\".`,\n\t\t\t};\n\t\t}\n\t\tlastError = result.error;\n\t}\n\tif (modelList.length > 1 || parentModel) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `None of the fallback models resolved: ${[...modelList, ...(parentModel ? [parentModel] : [])].join(\", \")}. Last error: ${lastError}`,\n\t\t};\n\t}\n\treturn { ok: false, error: lastError };\n}\n\nexport function resolveModelStringSingle(\n\tmodelStr: string,\n\tparentProvider: string | undefined,\n\tregistry: ModelRegistry | undefined,\n): { ok: true; modelId: string; provider?: string } | { ok: false; error: string } {\n\tif (!registry) {\n\t\treturn { ok: true, modelId: modelStr };\n\t}\n\n\t// If the model string contains \"/\" the user already specified a provider\n\tconst hasProvider = modelStr.includes(\"/\");\n\tconst resolved = resolveCliModel({\n\t\tcliProvider: hasProvider ? undefined : parentProvider,\n\t\tcliModel: modelStr,\n\t\tmodelRegistry: registry,\n\t});\n\n\tif (resolved.error) {\n\t\treturn { ok: false, error: resolved.error };\n\t}\n\tif (!resolved.model) {\n\t\treturn { ok: false, error: `Model \"${modelStr}\" not found. Use --list-models to see available models.` };\n\t}\n\n\t// resolveCliModel creates a synthetic model for any unknown ID when a\n\t// provider is specified (designed for custom/self-hosted models like Ollama).\n\t// For subagents this causes silent failures — reject synthetic fallbacks\n\t// so the next model in the fallback list is tried instead.\n\tif (resolved.isSyntheticFallback) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `Model \"${modelStr}\" not found for provider \"${resolved.model.provider}\". Use --list-models to see available models.`,\n\t\t};\n\t}\n\n\t// Verify the resolved provider has authentication configured.\n\t// resolveCliModel uses getAll() (all models, not just authenticated ones)\n\t// so a model can resolve successfully to a provider with no API key.\n\t// Reject early so the fallback list can continue to the next model.\n\tif (!registry.authStorage.hasAuth(resolved.model.provider)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `No authentication configured for provider \"${resolved.model.provider}\". Model \"${modelStr}\" cannot be used.`,\n\t\t};\n\t}\n\n\treturn { ok: true, modelId: resolved.model.id, provider: resolved.model.provider };\n}\n\nconst MAX_PARALLEL_TASKS = 8;\nconst MAX_CONCURRENCY = 4;\nconst MAX_TASK_LENGTH = 32_768; // 32 KB — prevent E2BIG from oversized argv\n\n// Semaphore for background task concurrency — shared across all background launches\nlet bgRunning = 0;\nconst bgWaiters: Array<() => void> = [];\n\nasync function bgAcquire(): Promise<void> {\n\tif (bgRunning < MAX_CONCURRENCY) {\n\t\tbgRunning++;\n\t\treturn;\n\t}\n\treturn new Promise<void>((resolve) => {\n\t\tbgWaiters.push(() => {\n\t\t\tbgRunning++;\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nfunction bgRelease(): void {\n\tbgRunning--;\n\tconst next = bgWaiters.shift();\n\tif (next) next();\n}\n\n/**\n * Resolve a per-task cwd relative to the parent cwd.\n * Rejects absolute paths and relative paths that escape the parent directory.\n * Returns a result object with ok=false and an error string on rejection, so callers can surface it to the model.\n */\nfunction clampCwd(defaultCwd: string, itemCwd?: string): { ok: true; cwd: string } | { ok: false; error: string } {\n\tif (!itemCwd) return { ok: true, cwd: defaultCwd };\n\tif (itemCwd.startsWith(\"/\")) {\n\t\treturn { ok: false, error: `Rejected absolute cwd \"${itemCwd}\" — must be relative to parent cwd` };\n\t}\n\tconst resolved = resolve(defaultCwd, itemCwd);\n\tif (resolved !== defaultCwd && !resolved.startsWith(`${defaultCwd}/`)) {\n\t\treturn { ok: false, error: `Rejected cwd \"${itemCwd}\" — resolves outside parent cwd` };\n\t}\n\treturn { ok: true, cwd: resolved };\n}\n\nasync function executeSingle(\n\tagents: Map<string, AgentTypeConfig>,\n\tagentName: string | undefined,\n\ttask: string,\n\tcwd: string,\n\tsignal?: AbortSignal,\n\tonProgress?: (event: string) => void,\n\tmodelOverride?: string,\n\tparentProvider?: string,\n\tregistry?: ModelRegistry,\n\tsessionDir?: string,\n\tparentModel?: string,\n): Promise<SubagentResult> {\n\tconst name = agentName || DEFAULT_AGENT;\n\tconst config = agents.get(name);\n\tif (!config) {\n\t\treturn {\n\t\t\tagent: name,\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: `Unknown agent type \"${name}\". Available: ${[...agents.keys()].join(\", \")}. If you expected \"${name}\" to exist, check the .md file in ~/.dreb/agents/ or .dreb/agents/ for syntax errors.`,\n\t\t};\n\t}\n\t// Validate task length for all modes (single, parallel items, chain steps)\n\tif (task.length > MAX_TASK_LENGTH) {\n\t\treturn {\n\t\t\tagent: name,\n\t\t\ttask: `${task.slice(0, 200)}...`,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: `Task prompt too long (${task.length} chars, max ${MAX_TASK_LENGTH}). Shorten the prompt.`,\n\t\t};\n\t}\n\t// Per-invocation model override takes precedence over agent definition model.\n\t// Override is always a single string; agent config may be a string or fallback list.\n\tconst modelSpec = modelOverride || config.model;\n\tlet effectiveConfig: AgentTypeConfig = modelOverride ? { ...config, model: modelOverride } : config;\n\tlet resolvedProvider = parentProvider;\n\tlet warning: string | undefined;\n\n\t// Resolve and validate the model against the registry before spawning.\n\t// This catches typos and invalid model names immediately instead of failing\n\t// silently in the child process. Also passes the canonical model ID to the\n\t// child, avoiding fuzzy matching entirely.\n\tif (modelSpec) {\n\t\tconst resolved = resolveModelWithFallbacks(modelSpec, parentProvider, registry, parentModel);\n\t\tif (!resolved.ok) {\n\t\t\treturn {\n\t\t\t\tagent: name,\n\t\t\t\ttask,\n\t\t\t\texitCode: 1,\n\t\t\t\toutput: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terrorMessage: resolved.error,\n\t\t\t};\n\t\t}\n\t\teffectiveConfig = { ...effectiveConfig, model: resolved.modelId };\n\t\tif (resolved.provider) {\n\t\t\tresolvedProvider = resolved.provider;\n\t\t}\n\t\twarning = resolved.warning;\n\t}\n\n\tonProgress?.(`Running ${name} agent...`);\n\tconst result = await spawnSubagent(effectiveConfig, task, cwd, signal, onProgress, resolvedProvider, sessionDir);\n\tif (warning) {\n\t\tresult.output = `[WARNING: ${warning}]\\n\\n${result.output}`;\n\t}\n\treturn result;\n}\n\nasync function executeChain(\n\tagents: Map<string, AgentTypeConfig>,\n\tchain: Array<{ agent?: string; task: string; cwd?: string; model?: string }>,\n\tdefaultCwd: string,\n\tsignal?: AbortSignal,\n\tonProgress?: (event: string) => void,\n\tparentProvider?: string,\n\tregistry?: ModelRegistry,\n\tsessionBaseDir?: string,\n\tdefaultAgent?: string,\n\tdefaultModel?: string,\n\tparentModel?: string,\n): Promise<SubagentResult[]> {\n\tconst results: SubagentResult[] = [];\n\tlet previousOutput = \"\";\n\n\tfor (let i = 0; i < chain.length; i++) {\n\t\tif (signal?.aborted) break;\n\t\tconst step = chain[i];\n\t\tconst task = step.task.replace(/\\{previous\\}/g, previousOutput);\n\t\tonProgress?.(`Chain step ${i + 1}/${chain.length}`);\n\n\t\t// Validate task length after {previous} substitution (can compound across steps)\n\t\tif (task.length > MAX_TASK_LENGTH) {\n\t\t\tresults.push({\n\t\t\t\tagent: step.agent || defaultAgent || DEFAULT_AGENT,\n\t\t\t\ttask: `${task.slice(0, 200)}...`,\n\t\t\t\texitCode: 1,\n\t\t\t\toutput: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terrorMessage: `Task prompt too long after {previous} substitution (${task.length} chars, max ${MAX_TASK_LENGTH}). Shorten the prompt or summarize previous output.`,\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\n\t\tconst cwdResult = clampCwd(defaultCwd, step.cwd);\n\t\tif (!cwdResult.ok) {\n\t\t\tresults.push({\n\t\t\t\tagent: step.agent || defaultAgent || DEFAULT_AGENT,\n\t\t\t\ttask,\n\t\t\t\texitCode: 1,\n\t\t\t\toutput: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terrorMessage: cwdResult.error,\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\n\t\t// Each chain step gets its own session subdirectory\n\t\tconst stepSessionDir = sessionBaseDir ? join(sessionBaseDir, `step-${i + 1}`) : undefined;\n\t\tconst result = await executeSingle(\n\t\t\tagents,\n\t\t\tstep.agent || defaultAgent,\n\t\t\ttask,\n\t\t\tcwdResult.cwd,\n\t\t\tsignal,\n\t\t\tonProgress,\n\t\t\tstep.model || defaultModel,\n\t\t\tparentProvider,\n\t\t\tregistry,\n\t\t\tstepSessionDir,\n\t\t\tparentModel,\n\t\t);\n\t\tresults.push(result);\n\n\t\tif (result.exitCode !== 0) {\n\t\t\tbreak; // stop chain on error\n\t\t}\n\t\tpreviousOutput = result.output;\n\t}\n\n\treturn results;\n}\n\n// ---------------------------------------------------------------------------\n// Background execution\n// ---------------------------------------------------------------------------\n\nfunction generateAgentId(): string {\n\treturn randomBytes(6).toString(\"hex\");\n}\n\n// ---------------------------------------------------------------------------\n// Background agent registry — queryable by TUI / Telegram frontends\n// ---------------------------------------------------------------------------\n\nexport interface BackgroundAgentInfo {\n\tagentId: string;\n\tagentType: string;\n\ttaskSummary: string;\n\tstartedAt: number;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n}\n\nconst backgroundAgentRegistry = new Map<string, BackgroundAgentInfo>();\nconst backgroundAbortControllers = new Map<string, AbortController>();\n\n/** Get a snapshot of all tracked background agents (running and recently completed). Returns readonly clones. */\nexport function getBackgroundAgents(): readonly Readonly<BackgroundAgentInfo>[] {\n\treturn [...backgroundAgentRegistry.values()].map((a) => ({ ...a }));\n}\n\n/** Get only currently running background agents. Returns readonly clones. */\nexport function getRunningBackgroundAgents(): readonly Readonly<BackgroundAgentInfo>[] {\n\treturn [...backgroundAgentRegistry.values()].filter((a) => a.status === \"running\").map((a) => ({ ...a }));\n}\n\n/** Abort all running background agents. */\nexport function abortBackgroundAgents(): void {\n\tfor (const [id, controller] of backgroundAbortControllers) {\n\t\tcontroller.abort();\n\t\tconst entry = backgroundAgentRegistry.get(id);\n\t\tif (entry && entry.status === \"running\") {\n\t\t\tentry.status = \"failed\";\n\t\t}\n\t}\n\tbackgroundAbortControllers.clear();\n}\n\n/** Remove completed/failed entries older than the given age (ms). Default: 5 minutes. */\nexport function pruneBackgroundAgents(maxAgeMs = 5 * 60 * 1000): void {\n\tconst now = Date.now();\n\tfor (const [id, info] of backgroundAgentRegistry) {\n\t\tif (info.status !== \"running\" && now - info.startedAt > maxAgeMs) {\n\t\t\tbackgroundAgentRegistry.delete(id);\n\t\t\tbackgroundAbortControllers.delete(id);\n\t\t}\n\t}\n}\n\nexport interface SubagentToolOptions {\n\t/** Called when a background subagent starts. Used by TUI to show status indicators. */\n\tonBackgroundStart?: (agentId: string, agentType: string, taskSummary: string) => void;\n\t/** Called when a background subagent completes with its result. `cancelled` is true if the user aborted it. */\n\tonBackgroundComplete?: (agentId: string, result: SubagentResult, cancelled: boolean) => void;\n\t/** Parent session's current provider (e.g. \"anthropic\"). Called at each invocation to get the live value after mid-session model switches. */\n\tparentProvider?: () => string | undefined;\n\t/** Parent session's current model ID. Used as a final fallback when all subagent-configured models fail to resolve. Called at each invocation for fresh value. */\n\tparentModel?: () => string | undefined;\n\t/** Model registry for validating model names before spawning child processes. */\n\tmodelRegistry?: ModelRegistry;\n}\n\n// ---------------------------------------------------------------------------\n// Tool schema and definition\n// ---------------------------------------------------------------------------\n\nconst taskItemSchema = Type.Object({\n\tagent: Type.Optional(Type.String({ description: \"Agent type name (default: 'Explore')\" })),\n\ttask: Type.String({ description: \"The task prompt for this subagent\" }),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory (defaults to parent's cwd)\" })),\n\tmodel: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Model override for this task. Takes precedence over agent definition model. Note: a single-string override discards the agent's fallback list.\",\n\t\t}),\n\t),\n});\n\nconst subagentSchema = Type.Object({\n\tagent: Type.Optional(Type.String({ description: \"Agent type name (default: 'Explore')\" })),\n\ttask: Type.Optional(Type.String({ description: \"Task prompt (single mode)\", minLength: 1 })),\n\tmodel: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Model override. Takes precedence over agent definition model. Note: a single-string override discards the agent's fallback list. For parallel/chain, set per-task instead.\",\n\t\t}),\n\t),\n\ttasks: Type.Optional(\n\t\tType.Array(taskItemSchema, {\n\t\t\tdescription: \"Array of tasks to run in parallel (max 8)\",\n\t\t\tminItems: 1,\n\t\t\tmaxItems: MAX_PARALLEL_TASKS,\n\t\t}),\n\t),\n\tchain: Type.Optional(\n\t\tType.Array(taskItemSchema, {\n\t\t\tdescription: \"Sequential pipeline — each step can use {previous} for prior output\",\n\t\t\tminItems: 1,\n\t\t}),\n\t),\n\t// background parameter removed — all subagents run in background mode.\n\t// Kept in schema for backward compatibility (silently ignored if passed).\n\tbackground: Type.Optional(\n\t\tType.Boolean({ description: \"Deprecated — all subagents run in background mode. This parameter is ignored.\" }),\n\t),\n});\n\nexport type SubagentToolInput = Static<typeof subagentSchema>;\n\nexport interface SubagentToolDetails {\n\ttruncation?: TruncationResult;\n\tmode: \"single\" | \"parallel\" | \"chain\";\n\tagentCount: number;\n}\n\nfunction formatSubagentCall(\n\targs: SubagentToolInput | undefined,\n\ttheme: typeof import(\"../../modes/interactive/theme/theme.js\").theme,\n\targsComplete = true,\n): string {\n\tconst invalidArg = invalidArgText(theme);\n\n\tif (args?.tasks) {\n\t\t// Show agent type(s) in the parallel label\n\t\tconst agentCounts = new Map<string, number>();\n\t\tfor (const t of args.tasks) {\n\t\t\tconst name = t.agent || args.agent || DEFAULT_AGENT;\n\t\t\tagentCounts.set(name, (agentCounts.get(name) || 0) + 1);\n\t\t}\n\t\tlet typeLabel: string;\n\t\tif (agentCounts.size === 1) {\n\t\t\tconst [name] = [...agentCounts.keys()];\n\t\t\ttypeLabel = `${args.tasks.length} ${name} tasks`;\n\t\t} else {\n\t\t\tconst parts = [...agentCounts.entries()].map(([name, count]) => `${count} ${name}`);\n\t\t\ttypeLabel = `${args.tasks.length} tasks: ${parts.join(\", \")}`;\n\t\t}\n\t\treturn `${theme.fg(\"toolTitle\", theme.bold(\"subagent\"))} ${theme.fg(\"accent\", `parallel (${typeLabel})`)}`;\n\t}\n\tif (args?.chain) {\n\t\tconst agentName = str(args.agent) || args.chain[0]?.agent || DEFAULT_AGENT;\n\t\treturn `${theme.fg(\"toolTitle\", theme.bold(\"subagent\"))} ${theme.fg(\"accent\", `chain (${agentName}, ${args.chain.length} steps)`)}`;\n\t}\n\n\tconst agent = str(args?.agent) || DEFAULT_AGENT;\n\tconst model = str(args?.model);\n\tconst task = str(args?.task);\n\tconst taskPreview = task ? (task.length > 60 ? `${task.slice(0, 57)}...` : task) : null;\n\tconst modelSuffix = model ? ` ${theme.fg(\"muted\", `(${model})`)}` : \"\";\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent\")) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", agent) +\n\t\tmodelSuffix +\n\t\t\" \" +\n\t\t(taskPreview === null\n\t\t\t? argsComplete\n\t\t\t\t? invalidArg\n\t\t\t\t: theme.fg(\"muted\", \"…\")\n\t\t\t: theme.fg(\"toolOutput\", `\"${taskPreview}\"`))\n\t);\n}\n\nfunction formatSubagentResult(\n\tresult: {\n\t\tcontent: Array<{ type: string; text?: string }>;\n\t\tdetails?: SubagentToolDetails;\n\t},\n\toptions: ToolRenderResultOptions,\n\ttheme: typeof import(\"../../modes/interactive/theme/theme.js\").theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = options.expanded ? lines.length : 25;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t}\n\treturn text;\n}\n\nfunction formatSingleResult(result: SubagentResult): string {\n\tlet text = `## Agent: ${result.agent}${result.model ? ` (model: ${result.model})` : \"\"}\\n`;\n\tif (result.exitCode !== 0) {\n\t\ttext += `**Error** (exit ${result.exitCode}): ${result.errorMessage || \"Unknown error\"}\\n`;\n\t\tif (result.stderr) {\n\t\t\ttext += `\\nStderr:\\n${result.stderr}\\n`;\n\t\t}\n\t}\n\tif (result.output) {\n\t\ttext += `\\n${result.output}`;\n\t} else if (result.exitCode === 0) {\n\t\ttext += \"\\n(No output)\";\n\t}\n\tif (result.sessionFile) {\n\t\ttext += `\\n\\nSession log: ${result.sessionFile}`;\n\t}\n\treturn text;\n}\n\nexport function createSubagentToolDefinition(\n\tcwd: string,\n\toptions?: SubagentToolOptions,\n): ToolDefinition<typeof subagentSchema, SubagentToolDetails | undefined> {\n\tconst onBackgroundStart = options?.onBackgroundStart;\n\tconst onBackgroundComplete = options?.onBackgroundComplete;\n\tconst getParentProvider = options?.parentProvider ?? (() => undefined);\n\tconst getParentModel = options?.parentModel ?? (() => undefined);\n\tconst modelRegistry = options?.modelRegistry;\n\n\t// Discover agents at definition time to build the prompt guidelines.\n\t// This is cheap (reads .md files) and the same call happens on every execute().\n\tconst knownAgents = discoverAgentTypes(cwd);\n\tconst agentListParts: string[] = [];\n\tfor (const [name, config] of knownAgents) {\n\t\tconst defaultTag = name === DEFAULT_AGENT ? \" (default)\" : \"\";\n\t\tconst desc = config.description || name;\n\t\tagentListParts.push(`'${name}'${defaultTag} — ${desc}`);\n\t}\n\tconst builtInAgentsLine = `Built-in agents: ${agentListParts.join(\"; \")}`;\n\n\treturn {\n\t\tname: \"subagent\",\n\t\tlabel: \"subagent\",\n\t\tdescription:\n\t\t\t\"Delegate tasks to independent subagents (Explore for codebase research, Sandbox for isolated /tmp-only analysis). \" +\n\t\t\t\"Supports single task, parallel (up to 8, max 4 concurrent), \" +\n\t\t\t\"and chain (sequential pipeline with {previous} substitution) modes. \" +\n\t\t\t\"All subagents run in background — returns immediately, notifies on completion.\",\n\t\tpromptSnippet: \"Delegate tasks to independent subagents\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use `subagent` to delegate focused, independent tasks to child agents\",\n\t\t\t\"Available agent types can be discovered from ~/.dreb/agents/ and .dreb/agents/ markdown files\",\n\t\t\tbuiltInAgentsLine,\n\t\t\t\"Use parallel mode for independent tasks that can run concurrently\",\n\t\t\t\"Use chain mode when each step depends on the previous step's output (reference with {previous})\",\n\t\t\t\"All subagents run in background — the tool returns immediately and you are notified when each agent completes.\",\n\t\t\t\"Subagents have their own context window — provide enough context in the task prompt\",\n\t\t\t\"Each agent notifies independently when done — completion messages include a list of any still-running agents. If you need their results before proceeding, end your current turn with no tool calls (as if you were asking the user a question and waiting for their reply). This emits `agent_end` and lets the framework deliver the completion as a new message that resumes your turn automatically. Do not call `sleep` or any other waiting action, and do not launch filler work.\",\n\t\t\t\"Agent definitions specify a `model` field with a provider fallback list (comma-separated or YAML list). The spawner tries each in order and uses the first one that resolves for the current provider. This makes agents portable across providers.\",\n\t\t\t\"Per-invocation `model` overrides take precedence but **discard the entire fallback list** — if the single override model isn't available on the current provider, the agent fails. Only override when you have a specific reason (e.g. escalating to a stronger tier for a complex task).\",\n\t\t\t\"**Model routing** — agent definitions already specify the right tier for their role. Most subagent tasks (exploration, file discovery, grep, navigation, summarization) are handled well by the defaults. Do not override the model unless the task genuinely requires a different capability tier than what the agent definition provides.\",\n\t\t],\n\t\tparameters: subagentSchema,\n\n\t\tasync execute(_toolCallId, params: SubagentToolInput, _signal, _onUpdate) {\n\t\t\tconst agents = discoverAgentTypes(cwd);\n\n\t\t\t// Determine mode\n\t\t\tconst modeCount = (params.task ? 1 : 0) + (params.tasks ? 1 : 0) + (params.chain ? 1 : 0);\n\t\t\tif (modeCount === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: \"Error: provide one of `task` (single), `tasks` (parallel), or `chain`.\" },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (modeCount > 1) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Error: modes are mutually exclusive — provide only one of `task`, `tasks`, or `chain`.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// All subagents run in background mode — return immediately, notify on completion\n\t\t\t{\n\t\t\t\tif (!onBackgroundComplete) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: \"Subagent execution requires background support, which is not available in this session.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Shared lifecycle for all background launches: generates agent ID,\n\t\t\t\t * sets up registry/abort/notification, gates on the concurrency\n\t\t\t\t * semaphore, and handles errors. The caller provides the actual\n\t\t\t\t * work via `runFn(signal)` which must return a SubagentResult.\n\t\t\t\t */\n\t\t\t\tconst launchBackgroundLifecycle = (\n\t\t\t\t\tagentName: string,\n\t\t\t\t\ttaskSummary: string,\n\t\t\t\t\trunFn: (signal: AbortSignal) => Promise<SubagentResult>,\n\t\t\t\t): string => {\n\t\t\t\t\tconst agentId = generateAgentId();\n\t\t\t\t\tconst bgAbort = new AbortController();\n\t\t\t\t\tbackgroundAgentRegistry.set(agentId, {\n\t\t\t\t\t\tagentId,\n\t\t\t\t\t\tagentType: agentName,\n\t\t\t\t\t\ttaskSummary,\n\t\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t});\n\t\t\t\t\tbackgroundAbortControllers.set(agentId, bgAbort);\n\t\t\t\t\tonBackgroundStart?.(agentId, agentName, taskSummary);\n\n\t\t\t\t\tconst bgSignal = bgAbort.signal;\n\n\t\t\t\t\tconst safeNotify = (result: SubagentResult) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tonBackgroundComplete(agentId, result, bgSignal.aborted);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t`[subagent] onBackgroundComplete threw for agent ${agentId}: ${err instanceof Error ? err.message : String(err)}. Background result lost.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tconst run = async () => {\n\t\t\t\t\t\tawait bgAcquire();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await runFn(bgSignal);\n\t\t\t\t\t\t\tconst entry = backgroundAgentRegistry.get(agentId);\n\t\t\t\t\t\t\tif (entry && !bgSignal.aborted) entry.status = result.exitCode === 0 ? \"completed\" : \"failed\";\n\t\t\t\t\t\t\tbackgroundAbortControllers.delete(agentId);\n\t\t\t\t\t\t\tsafeNotify(result);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconst entry = backgroundAgentRegistry.get(agentId);\n\t\t\t\t\t\t\tif (entry && !bgSignal.aborted) entry.status = \"failed\";\n\t\t\t\t\t\t\tbackgroundAbortControllers.delete(agentId);\n\t\t\t\t\t\t\tsafeNotify({\n\t\t\t\t\t\t\t\tagent: agentName,\n\t\t\t\t\t\t\t\ttask: taskSummary,\n\t\t\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t\t\t\toutput: \"\",\n\t\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\t\terrorMessage: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tbgRelease();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\trun().catch((err) => {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`[subagent] Unhandled background error (${agentId}): ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst entry = backgroundAgentRegistry.get(agentId);\n\t\t\t\t\t\tif (entry && entry.status === \"running\") entry.status = \"failed\";\n\t\t\t\t\t\tbackgroundAbortControllers.delete(agentId);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tonBackgroundComplete(\n\t\t\t\t\t\t\t\tagentId,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tagent: agentName,\n\t\t\t\t\t\t\t\t\ttask: taskSummary,\n\t\t\t\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t\t\t\t\toutput: \"\",\n\t\t\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\t\t\terrorMessage: `Internal error: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tbgSignal.aborted,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch (notifyErr) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t`[subagent] CRITICAL: Last-resort notification failed for ${agentId}: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn agentId;\n\t\t\t\t};\n\n\t\t\t\t// Helper to launch a single background task\n\t\t\t\tconst subagentSessionsBase = getSubagentSessionsDir();\n\t\t\t\tconst launchBackgroundTask = (\n\t\t\t\t\tagentName: string,\n\t\t\t\t\ttask: string,\n\t\t\t\t\ttaskLabel: string,\n\t\t\t\t\ttaskCwd?: string,\n\t\t\t\t\tmodelOverride?: string,\n\t\t\t\t) => {\n\t\t\t\t\tconst resolvedCwd = taskCwd ?? cwd;\n\t\t\t\t\t// Each background agent gets its own session subdirectory\n\t\t\t\t\tconst sessionId = generateAgentId();\n\t\t\t\t\tconst sessionDir = join(subagentSessionsBase, sessionId);\n\t\t\t\t\treturn launchBackgroundLifecycle(agentName, taskLabel, (signal) =>\n\t\t\t\t\t\texecuteSingle(\n\t\t\t\t\t\t\tagents,\n\t\t\t\t\t\t\tagentName === DEFAULT_AGENT ? undefined : agentName,\n\t\t\t\t\t\t\ttask,\n\t\t\t\t\t\t\tresolvedCwd,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tmodelOverride,\n\t\t\t\t\t\t\tgetParentProvider(),\n\t\t\t\t\t\t\tmodelRegistry,\n\t\t\t\t\t\t\tsessionDir,\n\t\t\t\t\t\t\tgetParentModel(),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\tif (params.task) {\n\t\t\t\t\t// Single background task\n\t\t\t\t\tconst agentName = params.agent || DEFAULT_AGENT;\n\t\t\t\t\tconst agentId = launchBackgroundTask(\n\t\t\t\t\t\tagentName,\n\t\t\t\t\t\tparams.task,\n\t\t\t\t\t\t`${agentName} task`,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tparams.model,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Background agent ${agentId} started (${agentName}). You will be notified when it completes.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"single\", agentCount: 1 } as SubagentToolDetails,\n\t\t\t\t\t\tendTurn: true,\n\t\t\t\t\t};\n\t\t\t\t} else if (params.tasks) {\n\t\t\t\t\t// Parallel background tasks — each gets its own agent ID and notifies independently\n\t\t\t\t\tconst launched: Array<{ id: string; agentName: string; taskText: string }> = [];\n\t\t\t\t\tconst skipped: Array<{ taskText: string; error: string }> = [];\n\t\t\t\t\tfor (let i = 0; i < params.tasks.length; i++) {\n\t\t\t\t\t\tconst item = params.tasks[i];\n\t\t\t\t\t\tconst agentName = item.agent || params.agent || DEFAULT_AGENT;\n\t\t\t\t\t\tconst cwdResult = clampCwd(cwd, item.cwd);\n\t\t\t\t\t\tif (!cwdResult.ok) {\n\t\t\t\t\t\t\tskipped.push({ taskText: item.task, error: cwdResult.error });\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst agentId = launchBackgroundTask(\n\t\t\t\t\t\t\tagentName,\n\t\t\t\t\t\t\titem.task,\n\t\t\t\t\t\t\t`${agentName} task ${i + 1}/${params.tasks.length}`,\n\t\t\t\t\t\t\tcwdResult.cwd,\n\t\t\t\t\t\t\titem.model || params.model,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlaunched.push({ id: agentId, agentName, taskText: item.task });\n\t\t\t\t\t}\n\t\t\t\t\tconst listing = launched\n\t\t\t\t\t\t.map(({ id, agentName, taskText }) => ` ${id} (${agentName}): ${taskText.slice(0, 80)}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tconst skippedListing = skipped\n\t\t\t\t\t\t.map(({ taskText, error }) => ` SKIPPED: ${taskText.slice(0, 60)} — ${error}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tconst parts = [`${launched.length} background agents started:\\n${listing}`];\n\t\t\t\t\tif (skipped.length > 0) {\n\t\t\t\t\t\tparts.push(`\\n${skipped.length} task(s) failed to launch:\\n${skippedListing}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (launched.length > 0) {\n\t\t\t\t\t\tparts.push(\"\\nEach will notify independently when complete.\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparts.push(\"\\nNo agents were launched.\");\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: parts.join(\"\\n\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"parallel\", agentCount: launched.length } as SubagentToolDetails,\n\t\t\t\t\t\tendTurn: launched.length > 0,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t// Chain mode — sequential, stays as one agent since steps depend on each other\n\t\t\t\t\tconst agentName = params.agent || params.chain![0].agent || DEFAULT_AGENT;\n\t\t\t\t\tconst taskSummary = `${params.chain!.length}-step chain`;\n\t\t\t\t\tconst chainSteps = params.chain!;\n\n\t\t\t\t\tconst chainSessionDir = join(subagentSessionsBase, `chain-${generateAgentId()}`);\n\t\t\t\t\tconst agentId = launchBackgroundLifecycle(agentName, taskSummary, async (signal) => {\n\t\t\t\t\t\tconst results = await executeChain(\n\t\t\t\t\t\t\tagents,\n\t\t\t\t\t\t\tchainSteps,\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tgetParentProvider(),\n\t\t\t\t\t\t\tmodelRegistry,\n\t\t\t\t\t\t\tchainSessionDir,\n\t\t\t\t\t\t\tparams.agent,\n\t\t\t\t\t\t\tparams.model,\n\t\t\t\t\t\t\tgetParentModel(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst resultText = results\n\t\t\t\t\t\t\t.map((r, i) => `### Step ${i + 1}\\n${formatSingleResult(r)}`)\n\t\t\t\t\t\t\t.join(\"\\n\\n---\\n\\n\");\n\t\t\t\t\t\tconst failed = results.filter((r) => r.exitCode !== 0);\n\t\t\t\t\t\t// Per-step session logs are already embedded in resultText via formatSingleResult\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tagent: agentName,\n\t\t\t\t\t\t\ttask: taskSummary,\n\t\t\t\t\t\t\texitCode: failed.length > 0 ? 1 : 0,\n\t\t\t\t\t\t\toutput: resultText,\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\t\tfailed.length > 0\n\t\t\t\t\t\t\t\t\t? `Chain stopped at step ${results.length} of ${chainSteps.length}: ${results[results.length - 1]?.errorMessage}`\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Background chain ${agentId} started (${taskSummary}). You will be notified when it completes.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"chain\", agentCount: chainSteps.length } as SubagentToolDetails,\n\t\t\t\t\t\tendTurn: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatSubagentCall(args, theme, context.argsComplete));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatSubagentResult(result as any, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createSubagentTool(cwd: string, options?: SubagentToolOptions): AgentTool<typeof subagentSchema> {\n\treturn wrapToolDefinition(createSubagentToolDefinition(cwd, options));\n}\n\nexport const subagentToolDefinition = createSubagentToolDefinition(process.cwd());\nexport const subagentTool = createSubagentTool(process.cwd());\n"]}
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAiD,QAAQ,EAAc,MAAM,UAAU,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAyB,MAAM,eAAe,CAAC;AAerF,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,qBAAqB,CACpC,OAAe,EACwD;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;IAEhF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE/B,MAAM,GAAG,GAAG,CAAC,GAAW,EAAsB,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QACtE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAAA,CACzB,CAAC;IAEF,4FAA0F;IAC1F,MAAM,QAAQ,GAAG,GAAkC,EAAE,CAAC;QACrD,uEAAuE;QACvE,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACxE,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;iBACxB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAClD,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,kDAAgD;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,KAAK;iBACjB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb,CAAC;IAEF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;IAEvF,OAAO;QACN,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACP,IAAI;YACJ,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE;YACrC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC;YACnB,KAAK,EAAE,QAAQ,EAAE;YACjB,YAAY,EAAE,IAAI;SAClB;KACD,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAgC;IACtE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAElD,mGAAiG;IACjG,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzD,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAE5C,0CAA0C;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC3D,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEnC,2CAA2C;IAC3C,kGAAgG;IAChG,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChD,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,MAAoC,EAAQ;IACnF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAC7B,IAAI,CAAC;QACJ,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBAChB,GAAG,CAAC,IAAI,CAAC,kCAAkC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAChF,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/C,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,IAAI,CACP,wCAAwC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9G,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,GAAG,CAAC,IAAI,CACP,8CAA8C,GAAG,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxG,CAAC;QACH,CAAC;IACF,CAAC;AAAA,CACD;AAkBD,+EAA+E;AAC/E,kFAAkF;AAClF,8DAA8D;AAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;AAEnC,6EAA2E;AAC3E,mFAAmF;AACnF,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,UAAU,CAAU,CAAC;AAE9D,gFAAgF;AAChF,uEAAuE;AACvE,EAAE;AACF,gFAAgF;AAChF,qFAAmF;AACnF,+CAA+C;AAC/C,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAElH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAU;IACtE,IAAI,CAAC,KAAK;QAAE,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,uBAA6C,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC1E,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,CACpD;AAED,6CAA6C;AAC7C,0CAA0C;AAC1C,SAAS,cAAc,GAAW;IACjC,OAAO,WAAW,CAAC;AAAA,CACnB;AAED,KAAK,UAAU,aAAa,CAC3B,WAA4B,EAC5B,IAAY,EACZ,GAAW,EACX,MAAoB,EACpB,UAAoC,EACpC,cAAuB,EACvB,UAAmB,EACO;IAC1B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,GAAG,CAAC,KAAK,CAAC,2BAA2B,WAAW,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;IAEpE,yEAAuE;IACvE,yEAAyE;IACzE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACN,KAAK,EAAE,WAAW,CAAC,IAAI;YACvB,IAAI;YACJ,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,qCAAqC,GAAG,EAAE;SACxD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,CAAC;IACD,+EAA+E;IAC/E,oFAAoF;IACpF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;IAC7F,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/B,qEAAqE;QACrE,uEAAuE;QACvE,mEAAmE;QACnE,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IACD,iFAAiF;IACjF,yDAAyD;IACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC;IACD,kFAAkF;IAClF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEtB,iFAA+E;IAC/E,2EAA2E;IAC3E,+EAA+E;IAC/E,sEAAsE;IACtE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO;YACN,KAAK,EAAE,WAAW,CAAC,IAAI;YACvB,IAAI;YACJ,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,sBAAsB;SACpC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,OAAO,CAAiB,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE,CAAC;QACrE,IAAI,IAAkB,CAAC;QACvB,IAAI,CAAC;YACJ,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE;gBAC3C,GAAG;gBACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACvB,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,KAAK,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1G,OAAO;QACR,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAS,GAAyC,IAAI,CAAC;QAC3D,MAAM,iBAAiB,GAA4C,EAAE,CAAC;QACtE,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,gBAAgB,GAAG,IAAI,CAAC;QAC9B,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,aAAiC,CAAC;QAEtC,kGAAkG;QAClG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC;YAC1C,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC7B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvB,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;YAC1B,CAAC;QAAA,CACD,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,yCAAyC,WAAW,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAAA,CACvF,CAAC,CAAC;QAEH,iCAAiC;QACjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;gBAChC,GAAG,CAAC,IAAI,CAAC,yCAAyC,WAAW,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAAA,CACvF,CAAC,CAAC;YACH,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO;gBACzB,iEAAiE;gBACjE,yEAAuE;gBACvE,IAAI,KAAU,CAAC;gBACf,IAAI,CAAC;oBACJ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACR,2EAAyE;oBACzE,yDAAyD;oBACzD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACjC,GAAG,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC3E,CAAC;oBACD,OAAO;gBACR,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjD,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,IAAI,UAAU,EAAE,CAAC;oBACzD,YAAY,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;oBACpC,UAAU,CAAC,SAAS,YAAY,KAAK,CAAC,CAAC;gBACxC,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,UAAU,EAAE,CAAC;oBACvD,UAAU,CAAC,GAAG,YAAY,OAAO,CAAC,CAAC;gBACpC,CAAC;YAAA,CACD,CAAC,CAAC;QACJ,CAAC;QAED,kFAAkF;QAClF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACR,4BAA4B;YAC7B,CAAC;YACD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACJ,IAAI,CAAC,IAAI,CAAC,MAAM;wBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACR,4BAA4B;gBAC7B,CAAC;YAAA,CACD,EAAE,IAAI,CAAC,CAAC;QAAA,CACT,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,aAAa,CAAC,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAAA,CACnE,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,GAAG,CAAC,KAAK,CACR,2BAA2B,WAAW,CAAC,IAAI,SAAS,QAAQ,aAAa,iBAAiB,CAAC,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAChN,CAAC;YAEF,8DAA8D;YAC9D,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;gBACrC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;wBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACvC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7B,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;YACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAExC,yFAAyF;YACzF,IAAI,YAAY,GAAkB,IAAI,CAAC;YACvC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACvD,YAAY;oBACX,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,6BAA6B,QAAQ,EAAE,CAAC;YACtG,CAAC;YAED,yDAAyD;YACzD,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE/F,cAAc,CAAC;gBACd,KAAK,EAAE,WAAW,CAAC,IAAI;gBACvB,IAAI;gBACJ,KAAK,EACJ,aAAa;oBACb,CAAC,QAAQ,KAAK,CAAC;wBACd,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;4BACjC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;4BACtB,CAAC,CAAC,WAAW,CAAC,KAAK;wBACpB,CAAC,CAAC,SAAS,CAAC;gBACd,QAAQ;gBACR,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,aAAa;gBAC5C,YAAY;gBACZ,WAAW;aACX,CAAC,CAAC;QAAA,CACH,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACH;AAED,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,SAAiB,EAAsB;IAC9F,IAAI,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACzC,qFAAqF;QACrF,IAAI,IAAiD,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAClC,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,6EAA2E;YAC5E,CAAC;QACF,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,WAAW,SAAS,GAAG,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,IAAI,CAAC;QAClB,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,CACP,qDAAqD,SAAS,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACxC,MAAyB,EACzB,cAAkC,EAClC,QAAmC,EACnC,WAAoB,EACgF;IACpG,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC5E,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC7B,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,sFAAsF;IACtF,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC/E,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACN,GAAG,MAAM;gBACT,OAAO,EAAE,0EAA0E,MAAM,CAAC,OAAO,IAAI;aACrG,CAAC;QACH,CAAC;QACD,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,OAAO;YACN,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,yCAAyC,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,SAAS,EAAE;SAC5I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAAA,CACvC;AAED,MAAM,UAAU,wBAAwB,CACvC,QAAgB,EAChB,cAAkC,EAClC,QAAmC,EAC+C;IAClF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,yEAAyE;IACzE,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC;QAChC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;QACrD,QAAQ,EAAE,QAAQ;QAClB,aAAa,EAAE,QAAQ;KACvB,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,QAAQ,yDAAyD,EAAE,CAAC;IAC1G,CAAC;IAED,sEAAsE;IACtE,8EAA8E;IAC9E,2EAAyE;IACzE,2DAA2D;IAC3D,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAClC,OAAO;YACN,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,UAAU,QAAQ,6BAA6B,QAAQ,CAAC,KAAK,CAAC,QAAQ,+CAA+C;SAC5H,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,0EAA0E;IAC1E,qEAAqE;IACrE,oEAAoE;IACpE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO;YACN,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,8CAA8C,QAAQ,CAAC,KAAK,CAAC,QAAQ,aAAa,QAAQ,mBAAmB;SACpH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AAAA,CACnF;AAaD,SAAS,kBAAkB,CAAC,MAAc,EAAU;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,OAAO,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,eAAe,CAAC;AAAA,CAClG;AAED,SAAS,sBAAsB,CAAC,KAAc,EAAU;IACvD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,KAA0D,CAAC;QAChF,IAAI,OAAO,YAAY,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,YAAY,CAAC,YAAY,CAAC;QACpF,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,YAAY,CAAC,OAAO,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CACrB;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc,EAAW;IAClE,IAAI,KAAK,YAAY,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,KAAkC,CAAC;QACxD,OAAO,YAAY,CAAC,UAAU,KAAK,OAAO,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,eAAe,CACvB,YAAqC,EACrC,SAAiB,EAC8D;IAC/E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,4CAA4C,SAAS,IAAI,CAAC,CAAC;IAC1F,IAAI,OAAsC,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QACxD,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAC1B,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/B,MAAM,CAAC,YAAY,CAAC,CAAC;QAAA,CACrB,EAAE,SAAS,CAAC,CAAC;IAAA,CACd,CAAC,CAAC;IACH,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACxE,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,IAAI,YAAY,EAAE,OAAO;QAAE,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAEjE,OAAO;QACN,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,cAAc;QACd,OAAO,EAAE,GAAG,EAAE,CAAC;YACd,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,YAAY,EAAE,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAAA,CAC/D;KACD,CAAC;AAAA,CACF;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,KAAiB,EACjB,OAAO,GAAkC,EAAE,EACH;IACxC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACzD,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEzF,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAY;YACxB,YAAY,EAAE,oDAAoD;YAClE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;SAClE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACjC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACjE,WAAW,CAAC,cAAc;SAC1B,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE;gBACxB,MAAM;gBACN,eAAe,EAAE,CAAC;gBAClB,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,WAAW,CAAC,MAAM;aAC1B,CAAC;YACF,WAAW,CAAC,cAAc;SAC1B,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC/E,CAAC;YAAS,CAAC;QACV,WAAW,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AAAA,CACD;AAiBD,MAAM,CAAC,KAAK,UAAU,4BAA4B,CACjD,MAAyB,EACzB,cAAkC,EAClC,QAAmC,EACnC,WAAoB,EACpB,MAAoB,EACe;IACnC,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAE5F,0EAA0E;IAC1E,4EAA4E;IAC5E,mDAAmD;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC1F,OAAO,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAC;QAExF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,qBAAqB,QAAQ,kBAAkB,MAAM,4BAA4B,CAAC,CAAC;YAC5F,SAAS;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpG,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAC;YACpE,CAAC;YACD,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAC;YACxF,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;gBACzB,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9D,GAAG,CAAC,IAAI,CAAC,qBAAqB,QAAQ,mBAAmB,KAAK,CAAC,MAAM,4BAA4B,CAAC,CAAC;gBACnG,SAAS;YACV,CAAC;QACF,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,2BAA2B,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;QACxE,OAAO,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAC;IAExF,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,0EAA0E,cAAc,CAAC,OAAO,IAAI,CAAC;YACrH,GAAG,CAAC,IAAI,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACtD,CAAC;QACD,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC;IAClC,CAAC;IAED,OAAO;QACN,EAAE,EAAE,KAAK;QACT,aAAa;QACb,KAAK,EAAE,2DAA2D;YACjE,GAAG,MAAM;YACT,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,SAAS,IAAI,mBAAmB,EAAE;KAC/D,CAAC;AAAA,CACF;AAED,MAAM,UAAU,0BAA0B,CACzC,aAAqC,EACrC,aAAiC,EACZ;IACrB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,OAAO,4BAA4B,aAAa,CAAC,MAAM,iCAAiC,aAAa,IAAI,SAAS,QAAQ,OAAO,EAAE,CAAC;AAAA,CACpI;AAED,MAAM,UAAU,2BAA2B,CAC1C,MAAc,EACd,aAAqC,EACrC,aAAiC,EACxB;IACT,MAAM,eAAe,GAAG,0BAA0B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACjF,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,CACpE;AAED,SAAS,gCAAgC,CAAC,aAAqC,EAAsB;IACpG,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,oBAAoB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAAA,CAC9F;AAED,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,8CAA4C;AAE5E,sFAAoF;AACpF,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,MAAM,SAAS,GAAsB,EAAE,CAAC;AAExC,KAAK,UAAU,SAAS,GAAkB;IACzC,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;QACjC,SAAS,EAAE,CAAC;QACZ,OAAO;IACR,CAAC;IACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QAAA,CACV,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACH;AAED,SAAS,SAAS,GAAS;IAC1B,SAAS,EAAE,CAAC;IACZ,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,IAAI,IAAI;QAAE,IAAI,EAAE,CAAC;AAAA,CACjB;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,UAAkB,EAAE,OAAgB,EAA4D;IACjH,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IACnD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,OAAO,sCAAoC,EAAE,CAAC;IACpG,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,OAAO,mCAAiC,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAAA,CACnC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAAoC,EACpC,SAA6B,EAC7B,IAAY,EACZ,GAAW,EACX,MAAoB,EACpB,UAAoC,EACpC,aAAsB,EACtB,cAAuB,EACvB,QAAwB,EACxB,UAAmB,EACnB,WAAoB,EACM;IAC1B,MAAM,IAAI,GAAG,SAAS,IAAI,aAAa,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO;YACN,KAAK,EAAE,IAAI;YACX,IAAI;YACJ,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,uBAAuB,IAAI,iBAAiB,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,IAAI,uFAAuF;SACxM,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACnC,OAAO;YACN,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;YAChC,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,yBAAyB,IAAI,CAAC,MAAM,eAAe,eAAe,wBAAwB;SACxG,CAAC;IACH,CAAC;IACD,8EAA8E;IAC9E,qFAAqF;IACrF,MAAM,SAAS,GAAG,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC;IAChD,IAAI,eAAe,GAAoB,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACpG,IAAI,gBAAgB,GAAG,cAAc,CAAC;IACtC,IAAI,OAA2B,CAAC;IAChC,IAAI,aAAa,GAA2B,EAAE,CAAC;IAE/C,uEAAuE;IACvE,4EAA4E;IAC5E,2EAA2E;IAC3E,+EAA+E;IAC/E,8EAA8E;IAC9E,2DAA2D;IAC3D,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9G,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,gCAAgC,CAAC,aAAa,CAAC,CAAC;YACvE,OAAO;gBACN,KAAK,EAAE,IAAI;gBACX,IAAI;gBACJ,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;aACxF,CAAC;QACH,CAAC;QACD,eAAe,GAAG,EAAE,GAAG,eAAe,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QAClE,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,UAAU,EAAE,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACjH,MAAM,CAAC,MAAM,GAAG,2BAA2B,CAC1C,MAAM,CAAC,MAAM,EACb,aAAa,EACb,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,CACjD,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,GAAG,aAAa,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,KAAK,UAAU,YAAY,CAC1B,MAAoC,EACpC,KAA4E,EAC5E,UAAkB,EAClB,MAAoB,EACpB,UAAoC,EACpC,cAAuB,EACvB,QAAwB,EACxB,cAAuB,EACvB,YAAqB,EACrB,YAAqB,EACrB,WAAoB,EACQ;IAC5B,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QAChE,UAAU,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAEpD,iFAAiF;QACjF,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,YAAY,IAAI,aAAa;gBAClD,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;gBAChC,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,uDAAuD,IAAI,CAAC,MAAM,eAAe,eAAe,qDAAqD;aACnK,CAAC,CAAC;YACH,MAAM;QACP,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,YAAY,IAAI,aAAa;gBAClD,IAAI;gBACJ,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,SAAS,CAAC,KAAK;aAC7B,CAAC,CAAC;YACH,MAAM;QACP,CAAC;QAED,oDAAoD;QACpD,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,aAAa,CACjC,MAAM,EACN,IAAI,CAAC,KAAK,IAAI,YAAY,EAC1B,IAAI,EACJ,SAAS,CAAC,GAAG,EACb,MAAM,EACN,UAAU,EACV,IAAI,CAAC,KAAK,IAAI,YAAY,EAC1B,cAAc,EACd,QAAQ,EACR,cAAc,EACd,WAAW,CACX,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,sBAAsB;QAC9B,CAAC;QACD,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AAAA,CACf;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,eAAe,GAAW;IAClC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CACtC;AAcD,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA+B,CAAC;AACvE,MAAM,0BAA0B,GAAG,IAAI,GAAG,EAA2B,CAAC;AAEtE,iHAAiH;AACjH,MAAM,UAAU,mBAAmB,GAA6C;IAC/E,OAAO,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,CACpE;AAED,6EAA6E;AAC7E,MAAM,UAAU,0BAA0B,GAA6C;IACtF,OAAO,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,CAC1G;AAED,2CAA2C;AAC3C,MAAM,UAAU,qBAAqB,GAAS;IAC7C,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,0BAA0B,EAAE,CAAC;QAC3D,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,CAAC;IACF,CAAC;IACD,0BAA0B,CAAC,KAAK,EAAE,CAAC;AAAA,CACnC;AAED,yFAAyF;AACzF,MAAM,UAAU,qBAAqB,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAQ;IACrE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;YAClE,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;AAAA,CACD;AAeD,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC,CAAC;IAC1F,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;IACvE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC,CAAC;IAChG,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,gJAAgJ;KACjJ,CAAC,CACF;CACD,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC,CAAC;IAC1F,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5F,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,4KAA4K;KAC7K,CAAC,CACF;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAC1B,WAAW,EAAE,2CAA2C;QACxD,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,kBAAkB;KAC5B,CAAC,CACF;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAC1B,WAAW,EAAE,uEAAqE;QAClF,QAAQ,EAAE,CAAC;KACX,CAAC,CACF;IACD,yEAAuE;IACvE,0EAA0E;IAC1E,UAAU,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,iFAA+E,EAAE,CAAC,CAC9G;CACD,CAAC,CAAC;AAUH,SAAS,kBAAkB,CAC1B,IAAmC,EACnC,KAAoE,EACpE,YAAY,GAAG,IAAI,EACV;IACT,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,2CAA2C;QAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;YACpD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,SAAiB,CAAC;QACtB,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YACvC,SAAS,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,QAAQ,CAAC;QAClD,CAAC;aAAM,CAAC;YACP,MAAM,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;YACpF,SAAS,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,SAAS,GAAG,CAAC,EAAE,CAAC;IAC5G,CAAC;IACD,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,aAAa,CAAC;QAC3E,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC;IACrI,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO,CACN,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,GAAG;QACH,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;QACzB,WAAW;QACX,GAAG;QACH,CAAC,WAAW,KAAK,IAAI;YACpB,CAAC,CAAC,YAAY;gBACb,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAG,CAAC;YACzB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,WAAW,GAAG,CAAC,CAAC,CAC9C,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAC5B,MAGC,EACD,OAAgC,EAChC,KAAoE,EACpE,UAAmB,EACV;IACT,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC1C,IAAI,IAAI,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnF,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,SAAS,cAAc,CAAC,IAAI,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,CAAC;QAChH,CAAC;IACF,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;IAC9C,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,UAAU,CAAC,UAAU,CAAC,QAAQ,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;IAClH,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,SAAS,kBAAkB,CAAC,MAAsB,EAAU;IAC3D,IAAI,IAAI,GAAG,aAAa,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC3F,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,IAAI,mBAAmB,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,YAAY,IAAI,eAAe,IAAI,CAAC;QAC3F,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,IAAI,cAAc,MAAM,CAAC,MAAM,IAAI,CAAC;QACzC,CAAC;IACF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,IAAI,oBAAoB,MAAM,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,4BAA4B,CAC3C,GAAW,EACX,OAA6B,EAC4C;IACzE,MAAM,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,CAAC;IACrD,MAAM,oBAAoB,GAAG,OAAO,EAAE,oBAAoB,CAAC;IAC3D,MAAM,iBAAiB,GAAG,OAAO,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,CAAC;IAE7C,qEAAqE;IACrE,gFAAgF;IAChF,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC;QACxC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,UAAU,QAAM,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,iBAAiB,GAAG,oBAAoB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAE1E,OAAO;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EACV,oHAAoH;YACpH,8DAA8D;YAC9D,sEAAsE;YACtE,kFAAgF;QACjF,aAAa,EAAE,yCAAyC;QACxD,gBAAgB,EAAE;YACjB,uEAAuE;YACvE,+FAA+F;YAC/F,iBAAiB;YACjB,mEAAmE;YACnE,iGAAiG;YACjG,kHAAgH;YAChH,uFAAqF;YACrF,4dAA0d;YAC1d,qPAAqP;YACrP,6RAA2R;YAC3R,+UAA6U;SAC7U;QACD,UAAU,EAAE,cAAc;QAE1B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAyB,EAAE,OAAO,EAAE,SAAS,EAAE;YACzE,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAEvC,iBAAiB;YACjB,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1F,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO;oBACN,OAAO,EAAE;wBACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wEAAwE,EAAE;qBAChG;oBACD,OAAO,EAAE,SAAS;iBAClB,CAAC;YACH,CAAC;YACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO;oBACN,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,0FAAwF;yBAC9F;qBACD;oBACD,OAAO,EAAE,SAAS;iBAClB,CAAC;YACH,CAAC;YAED,oFAAkF;YAClF,CAAC;gBACA,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC3B,OAAO;wBACN,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,yFAAyF;6BAC/F;yBACD;wBACD,OAAO,EAAE,SAAS;qBAClB,CAAC;gBACH,CAAC;gBAED;;;;;mBAKG;gBACH,MAAM,yBAAyB,GAAG,CACjC,SAAiB,EACjB,WAAmB,EACnB,KAAuD,EAC9C,EAAE,CAAC;oBACZ,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;oBAClC,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;oBACtC,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE;wBACpC,OAAO;wBACP,SAAS,EAAE,SAAS;wBACpB,WAAW;wBACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,MAAM,EAAE,SAAS;qBACjB,CAAC,CAAC;oBACH,0BAA0B,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACjD,iBAAiB,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;oBAErD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;oBAEhC,MAAM,UAAU,GAAG,CAAC,MAAsB,EAAE,EAAE,CAAC;wBAC9C,IAAI,CAAC;4BACJ,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;wBACzD,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,GAAG,CAAC,IAAI,CACP,mDAAmD,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAC1I,CAAC;wBACH,CAAC;oBAAA,CACD,CAAC;oBAEF,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;wBACvB,MAAM,SAAS,EAAE,CAAC;wBAClB,IAAI,CAAC;4BACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACrC,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;4BACnD,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO;gCAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;4BAC9F,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAC3C,UAAU,CAAC,MAAM,CAAC,CAAC;wBACpB,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;4BACnD,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO;gCAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;4BACxD,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAC3C,UAAU,CAAC;gCACV,KAAK,EAAE,SAAS;gCAChB,IAAI,EAAE,WAAW;gCACjB,QAAQ,EAAE,CAAC;gCACX,MAAM,EAAE,EAAE;gCACV,MAAM,EAAE,EAAE;gCACV,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;6BAC9D,CAAC,CAAC;wBACJ,CAAC;gCAAS,CAAC;4BACV,SAAS,EAAE,CAAC;wBACb,CAAC;oBAAA,CACD,CAAC;oBACF,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;wBACpB,GAAG,CAAC,IAAI,CACP,0CAA0C,OAAO,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACzG,CAAC;wBACF,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACnD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;4BAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;wBACjE,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAC3C,IAAI,CAAC;4BACJ,oBAAoB,CACnB,OAAO,EACP;gCACC,KAAK,EAAE,SAAS;gCAChB,IAAI,EAAE,WAAW;gCACjB,QAAQ,EAAE,CAAC;gCACX,MAAM,EAAE,EAAE;gCACV,MAAM,EAAE,EAAE;gCACV,YAAY,EAAE,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;6BACnF,EACD,QAAQ,CAAC,OAAO,CAChB,CAAC;wBACH,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACpB,GAAG,CAAC,KAAK,CACR,4DAA4D,OAAO,KAAK,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAC5I,CAAC;wBACH,CAAC;oBAAA,CACD,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;gBAAA,CACf,CAAC;gBAEF,4CAA4C;gBAC5C,MAAM,oBAAoB,GAAG,sBAAsB,EAAE,CAAC;gBACtD,MAAM,oBAAoB,GAAG,CAC5B,SAAiB,EACjB,IAAY,EACZ,SAAiB,EACjB,OAAgB,EAChB,aAAsB,EACrB,EAAE,CAAC;oBACJ,MAAM,WAAW,GAAG,OAAO,IAAI,GAAG,CAAC;oBACnC,0DAA0D;oBAC1D,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;oBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;oBACzD,OAAO,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACjE,aAAa,CACZ,MAAM,EACN,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACnD,IAAI,EACJ,WAAW,EACX,MAAM,EACN,SAAS,EACT,aAAa,EACb,iBAAiB,EAAE,EACnB,aAAa,EACb,UAAU,EACV,cAAc,EAAE,CAChB,CACD,CAAC;gBAAA,CACF,CAAC;gBAEF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBACjB,yBAAyB;oBACzB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;oBAChD,MAAM,OAAO,GAAG,oBAAoB,CACnC,SAAS,EACT,MAAM,CAAC,IAAI,EACX,GAAG,SAAS,OAAO,EACnB,SAAS,EACT,MAAM,CAAC,KAAK,CACZ,CAAC;oBACF,OAAO;wBACN,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,oBAAoB,OAAO,aAAa,SAAS,4CAA4C;6BACnG;yBACD;wBACD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAyB;wBACjE,OAAO,EAAE,IAAI;qBACb,CAAC;gBACH,CAAC;qBAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACzB,sFAAoF;oBACpF,MAAM,QAAQ,GAA+D,EAAE,CAAC;oBAChF,MAAM,OAAO,GAA+C,EAAE,CAAC;oBAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;wBAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;wBAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;4BACnB,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;4BAC9D,SAAS;wBACV,CAAC;wBACD,MAAM,OAAO,GAAG,oBAAoB,CACnC,SAAS,EACT,IAAI,CAAC,IAAI,EACT,GAAG,SAAS,SAAS,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EACnD,SAAS,CAAC,GAAG,EACb,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAC1B,CAAC;wBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChE,CAAC;oBACD,MAAM,OAAO,GAAG,QAAQ;yBACtB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,SAAS,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;yBACxF,IAAI,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM,cAAc,GAAG,OAAO;yBAC5B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,cAAc,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAM,KAAK,EAAE,CAAC;yBAC9E,IAAI,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,gCAAgC,OAAO,EAAE,CAAC,CAAC;oBAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,+BAA+B,cAAc,EAAE,CAAC,CAAC;oBAChF,CAAC;oBACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzB,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;oBAC/D,CAAC;yBAAM,CAAC;wBACP,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAC1C,CAAC;oBACD,OAAO;wBACN,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;6BACtB;yBACD;wBACD,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAyB;wBACjF,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;qBAC5B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,iFAA+E;oBAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,aAAa,CAAC;oBAC1E,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,KAAM,CAAC,MAAM,aAAa,CAAC;oBACzD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAM,CAAC;oBAEjC,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE,SAAS,eAAe,EAAE,EAAE,CAAC,CAAC;oBACjF,MAAM,OAAO,GAAG,yBAAyB,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;wBACnF,MAAM,OAAO,GAAG,MAAM,YAAY,CACjC,MAAM,EACN,UAAU,EACV,GAAG,EACH,MAAM,EACN,SAAS,EACT,iBAAiB,EAAE,EACnB,aAAa,EACb,eAAe,EACf,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,KAAK,EACZ,cAAc,EAAE,CAChB,CAAC;wBACF,MAAM,UAAU,GAAG,OAAO;6BACxB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;6BAC5D,IAAI,CAAC,aAAa,CAAC,CAAC;wBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;wBACvD,kFAAkF;wBAClF,OAAO;4BACN,KAAK,EAAE,SAAS;4BAChB,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACnC,MAAM,EAAE,UAAU;4BAClB,MAAM,EAAE,EAAE;4BACV,YAAY,EACX,MAAM,CAAC,MAAM,GAAG,CAAC;gCAChB,CAAC,CAAC,yBAAyB,OAAO,CAAC,MAAM,OAAO,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE;gCACjH,CAAC,CAAC,IAAI;yBACR,CAAC;oBAAA,CACF,CAAC,CAAC;oBAEH,OAAO;wBACN,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,oBAAoB,OAAO,aAAa,WAAW,4CAA4C;6BACrG;yBACD;wBACD,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,EAAyB;wBAChF,OAAO,EAAE,IAAI;qBACb,CAAC;gBACH,CAAC;YACF,CAAC;QAAA,CACD;QAED,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;YAChC,MAAM,IAAI,GAAI,OAAO,CAAC,aAAkC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;QAAA,CACZ;QACD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAC7C,MAAM,IAAI,GAAI,OAAO,CAAC,aAAkC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAa,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC;QAAA,CACZ;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,OAA6B,EAAoC;IAChH,OAAO,kBAAkB,CAAC,4BAA4B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAAA,CACtE;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAClF,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { AgentTool } from \"@dreb/agent-core\";\nimport { type Api, type AssistantMessage, type Context, complete, type Model } from \"@dreb/ai\";\nimport { Text } from \"@dreb/tui\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { CONFIG_DIR_NAME, getPackageDir, getSubagentSessionsDir } from \"../../config.js\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.js\";\nimport { attachJsonlLineReader } from \"../../modes/rpc/jsonl.js\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.js\";\nimport { log } from \"../logger.js\";\nimport type { ModelRegistry } from \"../model-registry.js\";\nimport { resolveCliModel } from \"../model-resolver.js\";\nimport { getTextOutput, invalidArgText, str } from \"./render-utils.js\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.js\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult } from \"./truncate.js\";\n\n// ---------------------------------------------------------------------------\n// Agent type system\n// ---------------------------------------------------------------------------\n\nexport interface AgentTypeConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string;\n\t/** Single model ID or ordered fallback list. First resolvable model wins. */\n\tmodel?: string | string[];\n\tsystemPrompt: string;\n}\n\nconst DEFAULT_AGENT = \"Explore\";\n\nexport function parseAgentFrontmatter(\n\tcontent: string,\n): { ok: true; config: AgentTypeConfig } | { ok: false; error: string } {\n\tconst fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n\tif (!fmMatch) return { ok: false, error: \"missing --- frontmatter delimiters\" };\n\n\tconst frontmatter = fmMatch[1];\n\tconst body = fmMatch[2].trim();\n\n\tconst get = (key: string): string | undefined => {\n\t\tconst match = frontmatter.match(new RegExp(`^${key}:\\\\s*(.+)$`, \"m\"));\n\t\treturn match?.[1].trim();\n\t};\n\n\t/** Parse `model` field — supports single string, comma-separated, or YAML list syntax. */\n\tconst getModel = (): string | string[] | undefined => {\n\t\t// First check for YAML list syntax (indented lines starting with \"- \")\n\t\tconst listMatch = frontmatter.match(/^model:\\s*\\n((?:\\s+-\\s+.+\\n?)+)/m);\n\t\tif (listMatch) {\n\t\t\tconst items = listMatch[1]\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.map((line) => line.replace(/^\\s+-\\s+/, \"\").trim())\n\t\t\t\t.filter(Boolean);\n\t\t\treturn items.length > 1 ? items : items[0];\n\t\t}\n\t\t// Inline value — check for comma-separated list\n\t\tconst value = get(\"model\");\n\t\tif (!value) return undefined;\n\t\tif (value.includes(\",\")) {\n\t\t\tconst items = value\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((s) => s.trim())\n\t\t\t\t.filter(Boolean);\n\t\t\treturn items.length > 1 ? items : items[0];\n\t\t}\n\t\treturn value;\n\t};\n\n\tconst name = get(\"name\");\n\tif (!name) return { ok: false, error: \"missing required 'name' field in frontmatter\" };\n\n\treturn {\n\t\tok: true,\n\t\tconfig: {\n\t\t\tname,\n\t\t\tdescription: get(\"description\") || \"\",\n\t\t\ttools: get(\"tools\"),\n\t\t\tmodel: getModel(),\n\t\t\tsystemPrompt: body,\n\t\t},\n\t};\n}\n\nfunction discoverAgentTypes(cwd: string): Map<string, AgentTypeConfig> {\n\tconst agents = new Map<string, AgentTypeConfig>();\n\n\t// Package-bundled agents (shipped with dreb — the canonical source of truth for built-in agents)\n\tconst packageAgentsDir = join(getPackageDir(), \"agents\");\n\tloadAgentsFromDir(packageAgentsDir, agents);\n\n\t// User-level agents (~/.dreb/agents/*.md)\n\tconst userDir = join(homedir(), CONFIG_DIR_NAME, \"agents\");\n\tloadAgentsFromDir(userDir, agents);\n\n\t// Project-level agents (.dreb/agents/*.md)\n\t// TODO: Security gate — prompt user for confirmation before loading agents from untrusted repos\n\tconst projectDir = join(cwd, \".dreb\", \"agents\");\n\tloadAgentsFromDir(projectDir, agents);\n\n\treturn agents;\n}\n\nfunction loadAgentsFromDir(dir: string, agents: Map<string, AgentTypeConfig>): void {\n\tif (!existsSync(dir)) return;\n\ttry {\n\t\tfor (const file of readdirSync(dir)) {\n\t\t\tif (!file.endsWith(\".md\")) continue;\n\t\t\ttry {\n\t\t\t\tconst content = readFileSync(join(dir, file), \"utf-8\");\n\t\t\t\tconst parsed = parseAgentFrontmatter(content);\n\t\t\t\tif (!parsed.ok) {\n\t\t\t\t\tlog.warn(`[subagent] Skipping agent file ${join(dir, file)}: ${parsed.error}`);\n\t\t\t\t} else {\n\t\t\t\t\tagents.set(parsed.config.name, parsed.config);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlog.warn(\n\t\t\t\t\t`[subagent] Could not read agent file ${join(dir, file)}: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n\t\t\tlog.warn(\n\t\t\t\t`[subagent] Could not read agents directory ${dir}: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Subagent process spawning\n// ---------------------------------------------------------------------------\n\nexport interface SubagentResult {\n\tagent: string;\n\ttask: string;\n\tmodel?: string;\n\texitCode: number;\n\toutput: string;\n\tstderr: string;\n\terrorMessage: string | null;\n\t/** Path to the persisted session JSONL file, if available */\n\tsessionFile?: string;\n}\n\n// Capture at module load before process.title overwrites argv memory on Linux.\n// After process.title = \"dreb\" (in cli.ts), the original argv area is overwritten\n// and process.argv[1] may return corrupted or truncated data.\nconst DREB_SCRIPT = process.argv[1] || \"dreb\";\nconst NODE_EXEC = process.execPath;\n\n// Tools that must never be available to subagents — wait (subagents should\n// never no-op; they have a task to complete) and subagent (no recursive spawning).\nconst SUBAGENT_EXCLUDED_TOOLS = [\"wait\", \"subagent\"] as const;\n\n// Default standard tools for subagents when no tools are specified in the agent\n// definition. This is the set passed via --tools to the child process.\n//\n// NOTE: Always-active tools (search, skill, tasks_update, suggest_next) are NOT\n// listed here — the child process adds them unconditionally regardless of --tools.\n// Internal tools (tmp_read) are also excluded.\nconst SUBAGENT_DEFAULT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\", \"web_search\", \"web_fetch\"];\n\n/**\n * Filter a comma-separated tools string, removing any tools in SUBAGENT_EXCLUDED_TOOLS.\n * Returns the filtered tools as a comma-separated string (always non-empty — falls\n * back to SUBAGENT_DEFAULT_TOOLS if all specified tools were excluded).\n */\nexport function filterSubagentTools(tools: string | undefined): string {\n\tif (!tools) return SUBAGENT_DEFAULT_TOOLS.join(\",\");\n\tconst filtered = tools\n\t\t.split(\",\")\n\t\t.map((t) => t.trim())\n\t\t.filter((t) => !(SUBAGENT_EXCLUDED_TOOLS as readonly string[]).includes(t))\n\t\t.join(\",\");\n\treturn filtered || SUBAGENT_DEFAULT_TOOLS.join(\",\");\n}\n\n// TODO: Support PATH-based binary discovery.\n// Currently returns the captured argv[1].\nfunction findDrebBinary(): string {\n\treturn DREB_SCRIPT;\n}\n\nasync function spawnSubagent(\n\tagentConfig: AgentTypeConfig,\n\ttask: string,\n\tcwd: string,\n\tsignal?: AbortSignal,\n\tonProgress?: (event: string) => void,\n\tparentProvider?: string,\n\tsessionDir?: string,\n): Promise<SubagentResult> {\n\tconst drebBin = findDrebBinary();\n\tlog.debug(`[subagent] spawn: agent=${agentConfig.name} cwd=${cwd}`);\n\n\t// Validate cwd exists — spawn() throws a misleading ENOENT blaming the\n\t// binary when the cwd is invalid, making the real cause hard to diagnose\n\tif (!existsSync(cwd)) {\n\t\treturn {\n\t\t\tagent: agentConfig.name,\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: `Working directory does not exist: ${cwd}`,\n\t\t};\n\t}\n\n\tconst args: string[] = [\"--mode\", \"json\", \"--ui\", \"agent\"];\n\tif (sessionDir) {\n\t\targs.push(\"--session-dir\", sessionDir);\n\t} else {\n\t\targs.push(\"--no-session\");\n\t}\n\t// By spawn time, model should be a resolved single string (fallback resolution\n\t// happens in executeSingle). Handle string[] defensively by taking the first entry.\n\tconst modelStr = Array.isArray(agentConfig.model) ? agentConfig.model[0] : agentConfig.model;\n\tif (modelStr) {\n\t\targs.push(\"--model\", modelStr);\n\t\t// When the model string doesn't already specify a provider (no \"/\"),\n\t\t// inherit the parent's provider to prevent fuzzy matching from picking\n\t\t// an unauthenticated provider (e.g. Bedrock instead of Anthropic).\n\t\tif (parentProvider && !modelStr.includes(\"/\")) {\n\t\t\targs.push(\"--provider\", parentProvider);\n\t\t}\n\t}\n\t// Always pass --tools to ensure wait/subagent are excluded from child processes.\n\t// filterSubagentTools always returns a non-empty string.\n\targs.push(\"--tools\", filterSubagentTools(agentConfig.tools));\n\tif (agentConfig.systemPrompt) {\n\t\targs.push(\"--append-system-prompt\", agentConfig.systemPrompt);\n\t}\n\t// Pass agent type metadata so the child session can record it in its JSONL header\n\targs.push(\"--agent-type\", agentConfig.name);\n\targs.push(\"-p\", task);\n\n\t// Early abort check — if the signal is already aborted (e.g. queued task whose\n\t// AbortController was aborted while waiting on bgAcquire), bail out before\n\t// spawning a child process that can never be killed. addEventListener(\"abort\")\n\t// on an already-aborted signal does NOT fire the callback in Node.js.\n\tif (signal?.aborted) {\n\t\treturn {\n\t\t\tagent: agentConfig.name,\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: \"Aborted before spawn\",\n\t\t};\n\t}\n\n\treturn new Promise<SubagentResult>((resolvePromise, rejectPromise) => {\n\t\tlet proc: ChildProcess;\n\t\ttry {\n\t\t\tproc = spawn(NODE_EXEC, [drebBin, ...args], {\n\t\t\t\tcwd,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\tenv: { ...process.env },\n\t\t\t});\n\t\t} catch (err) {\n\t\t\trejectPromise(new Error(`Failed to spawn subagent: ${err instanceof Error ? err.message : String(err)}`));\n\t\t\treturn;\n\t\t}\n\n\t\tlet settled = false;\n\t\tlet killTimer: ReturnType<typeof setTimeout> | null = null;\n\t\tconst collectedMessages: Array<{ role: string; content: any[] }> = [];\n\t\tconst stderrChunks: string[] = [];\n\t\tlet stderrSize = 0;\n\t\tconst MAX_STDERR_BYTES = 8192;\n\t\tconst plainStdoutLines: string[] = [];\n\t\tlet lastToolName = \"\";\n\t\tlet resolvedModel: string | undefined;\n\n\t\t// Drain stderr concurrently to avoid pipe deadlock (capped to prevent OOM from verbose subagents)\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\tif (stderrSize < MAX_STDERR_BYTES) {\n\t\t\t\tconst str = chunk.toString();\n\t\t\t\tstderrChunks.push(str);\n\t\t\t\tstderrSize += str.length;\n\t\t\t}\n\t\t});\n\t\tproc.stderr?.on(\"error\", (err) => {\n\t\t\tlog.warn(`[subagent] stderr stream error (agent=${agentConfig.name}): ${err.message}`);\n\t\t});\n\n\t\t// Parse JSONL events from stdout\n\t\tif (proc.stdout) {\n\t\t\tproc.stdout.on(\"error\", (err) => {\n\t\t\t\tlog.warn(`[subagent] stdout stream error (agent=${agentConfig.name}): ${err.message}`);\n\t\t\t});\n\t\t\tattachJsonlLineReader(proc.stdout, (line) => {\n\t\t\t\tif (!line.trim()) return;\n\t\t\t\t// Separate JSON.parse from event handling so only parse failures\n\t\t\t\t// are caught as non-JSON lines — errors in handling propagate normally\n\t\t\t\tlet event: any;\n\t\t\t\ttry {\n\t\t\t\t\tevent = JSON.parse(line);\n\t\t\t\t} catch {\n\t\t\t\t\t// Capture non-JSON lines — on failure these often contain the real error\n\t\t\t\t\t// (e.g. startup errors printed before JSONL mode begins)\n\t\t\t\t\tplainStdoutLines.push(line.trim());\n\t\t\t\t\tif (line.trim().startsWith(\"{\")) {\n\t\t\t\t\t\tlog.warn(`[subagent] Failed to parse JSONL event: ${line.slice(0, 200)}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.type === \"agent_start\" && event.model) {\n\t\t\t\t\tresolvedModel = event.model.id;\n\t\t\t\t}\n\t\t\t\tif (event.type === \"message_end\" && event.message?.role === \"assistant\") {\n\t\t\t\t\tcollectedMessages.push(event.message);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"tool_execution_start\" && onProgress) {\n\t\t\t\t\tlastToolName = event.toolName || \"\";\n\t\t\t\t\tonProgress(`Using ${lastToolName}...`);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"tool_execution_end\" && onProgress) {\n\t\t\t\t\tonProgress(`${lastToolName} done`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Handle abort signal (guard kill() against ESRCH race if process already exited)\n\t\tconst onAbort = () => {\n\t\t\ttry {\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t} catch {\n\t\t\t\t/* process already exited */\n\t\t\t}\n\t\t\tkillTimer = setTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tif (!proc.killed) proc.kill(\"SIGKILL\");\n\t\t\t\t} catch {\n\t\t\t\t\t/* process already exited */\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tproc.on(\"error\", (err) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (killTimer) clearTimeout(killTimer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\trejectPromise(new Error(`Subagent process error: ${err.message}`));\n\t\t});\n\n\t\tproc.on(\"close\", (code) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (killTimer) clearTimeout(killTimer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tconst exitCode = code ?? 1;\n\t\t\tconst stderr = stderrChunks.join(\"\");\n\t\t\tlog.debug(\n\t\t\t\t`[subagent] close: agent=${agentConfig.name} exit=${exitCode} messages=${collectedMessages.length}${exitCode !== 0 ? ` stderr=${stderr.slice(0, 200)} stdout=${plainStdoutLines.join(\"|\").slice(0, 200)}` : \"\"}`,\n\t\t\t);\n\n\t\t\t// Extract final text output from collected assistant messages\n\t\t\tconst outputParts: string[] = [];\n\t\t\tfor (const msg of collectedMessages) {\n\t\t\t\tif (Array.isArray(msg.content)) {\n\t\t\t\t\tfor (const part of msg.content) {\n\t\t\t\t\t\tif (part.type === \"text\" && part.text) {\n\t\t\t\t\t\t\toutputParts.push(part.text);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst output = outputParts.join(\"\\n\\n\");\n\n\t\t\t// Build error message from best available source: stderr, plain stdout lines, or generic\n\t\t\tlet errorMessage: string | null = null;\n\t\t\tif (exitCode !== 0) {\n\t\t\t\tconst stderrTrimmed = stderr.trim();\n\t\t\t\tconst plainOutput = plainStdoutLines.join(\"\\n\").trim();\n\t\t\t\terrorMessage =\n\t\t\t\t\tstderrTrimmed.slice(0, 500) || plainOutput.slice(0, 500) || `Subagent exited with code ${exitCode}`;\n\t\t\t}\n\n\t\t\t// Discover the session file written by the child process\n\t\t\tconst sessionFile = sessionDir ? discoverSessionFile(sessionDir, agentConfig.name) : undefined;\n\n\t\t\tresolvePromise({\n\t\t\t\tagent: agentConfig.name,\n\t\t\t\ttask,\n\t\t\t\tmodel:\n\t\t\t\t\tresolvedModel ??\n\t\t\t\t\t(exitCode === 0\n\t\t\t\t\t\t? Array.isArray(agentConfig.model)\n\t\t\t\t\t\t\t? agentConfig.model[0]\n\t\t\t\t\t\t\t: agentConfig.model\n\t\t\t\t\t\t: undefined),\n\t\t\t\texitCode,\n\t\t\t\toutput,\n\t\t\t\tstderr: stderr.slice(0, 2000), // cap stderr\n\t\t\t\terrorMessage,\n\t\t\t\tsessionFile,\n\t\t\t});\n\t\t});\n\t});\n}\n\n// ---------------------------------------------------------------------------\n// Session file discovery and cleanup\n// ---------------------------------------------------------------------------\n\n/**\n * Find the most recently modified .jsonl file in a session directory.\n * Returns the full path, or undefined if no session file was written\n * (e.g., subagent was killed before the first assistant message).\n */\nexport function discoverSessionFile(sessionDir: string, agentName: string): string | undefined {\n\ttry {\n\t\tif (!existsSync(sessionDir)) return undefined;\n\t\tconst files = readdirSync(sessionDir).filter((f) => f.endsWith(\".jsonl\"));\n\t\tif (files.length === 0) return undefined;\n\t\t// Pick the most recently modified file (typically there's only one per subagent dir)\n\t\tlet best: { path: string; mtime: number } | undefined;\n\t\tfor (const f of files) {\n\t\t\ttry {\n\t\t\t\tconst fullPath = join(sessionDir, f);\n\t\t\t\tconst mtime = statSync(fullPath).mtime.getTime();\n\t\t\t\tif (!best || mtime > best.mtime) {\n\t\t\t\t\tbest = { path: fullPath, mtime };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// File disappeared or is a bad symlink — skip it, keep any valid candidate\n\t\t\t}\n\t\t}\n\t\tif (best) {\n\t\t\tlog.debug(`[subagent] session file: ${best.path} (agent=${agentName})`);\n\t\t\treturn best.path;\n\t\t}\n\t} catch (err) {\n\t\tlog.warn(\n\t\t\t`[subagent] failed to discover session file (agent=${agentName}): ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t}\n\treturn undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Execution modes\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a model fallback list against the registry. Tries each model in order,\n * returns the first one that resolves successfully. If all fail, returns the\n * last error. Single strings are treated as a one-element list.\n */\nexport function resolveModelWithFallbacks(\n\tmodels: string | string[],\n\tparentProvider: string | undefined,\n\tregistry: ModelRegistry | undefined,\n\tparentModel?: string,\n): { ok: true; modelId: string; provider?: string; warning?: string } | { ok: false; error: string } {\n\tconst modelList = Array.isArray(models) ? models : [models];\n\tlet lastError = \"\";\n\tfor (const modelStr of modelList) {\n\t\tconst result = resolveModelStringSingle(modelStr, parentProvider, registry);\n\t\tif (result.ok) return result;\n\t\tlastError = result.error;\n\t}\n\t// After all configured fallbacks are exhausted, try the parent model as a last resort\n\tif (parentModel) {\n\t\tconst result = resolveModelStringSingle(parentModel, parentProvider, registry);\n\t\tif (result.ok) {\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\twarning: `Agent preferred models were unavailable. Falling back to parent model \"${result.modelId}\".`,\n\t\t\t};\n\t\t}\n\t\tlastError = result.error;\n\t}\n\tif (modelList.length > 1 || parentModel) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `None of the fallback models resolved: ${[...modelList, ...(parentModel ? [parentModel] : [])].join(\", \")}. Last error: ${lastError}`,\n\t\t};\n\t}\n\treturn { ok: false, error: lastError };\n}\n\nexport function resolveModelStringSingle(\n\tmodelStr: string,\n\tparentProvider: string | undefined,\n\tregistry: ModelRegistry | undefined,\n): { ok: true; modelId: string; provider?: string } | { ok: false; error: string } {\n\tif (!registry) {\n\t\treturn { ok: true, modelId: modelStr };\n\t}\n\n\t// If the model string contains \"/\" the user already specified a provider\n\tconst hasProvider = modelStr.includes(\"/\");\n\tconst resolved = resolveCliModel({\n\t\tcliProvider: hasProvider ? undefined : parentProvider,\n\t\tcliModel: modelStr,\n\t\tmodelRegistry: registry,\n\t});\n\n\tif (resolved.error) {\n\t\treturn { ok: false, error: resolved.error };\n\t}\n\tif (!resolved.model) {\n\t\treturn { ok: false, error: `Model \"${modelStr}\" not found. Use --list-models to see available models.` };\n\t}\n\n\t// resolveCliModel creates a synthetic model for any unknown ID when a\n\t// provider is specified (designed for custom/self-hosted models like Ollama).\n\t// For subagents this causes silent failures — reject synthetic fallbacks\n\t// so the next model in the fallback list is tried instead.\n\tif (resolved.isSyntheticFallback) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `Model \"${modelStr}\" not found for provider \"${resolved.model.provider}\". Use --list-models to see available models.`,\n\t\t};\n\t}\n\n\t// Verify the resolved provider has authentication configured.\n\t// resolveCliModel uses getAll() (all models, not just authenticated ones)\n\t// so a model can resolve successfully to a provider with no API key.\n\t// Reject early so the fallback list can continue to the next model.\n\tif (!registry.authStorage.hasAuth(resolved.model.provider)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: `No authentication configured for provider \"${resolved.model.provider}\". Model \"${modelStr}\" cannot be used.`,\n\t\t};\n\t}\n\n\treturn { ok: true, modelId: resolved.model.id, provider: resolved.model.provider };\n}\n\nexport interface ProbeModelAvailabilityOptions {\n\t/** Parent/tool abort signal. A 10s probe timeout is layered on top. */\n\tsignal?: AbortSignal;\n\t/** Model registry used to resolve provider API keys for the probe call. */\n\tregistry?: ModelRegistry;\n\t/** Override the default 10s probe timeout; primarily useful for tests. */\n\ttimeoutMs?: number;\n}\n\nexport type ProbeModelAvailabilityResult = { ok: true } | { ok: false; reason: string; aborted?: boolean };\n\nfunction compactErrorReason(reason: string): string {\n\tconst singleLine = reason.replace(/\\s+/g, \" \").trim();\n\treturn singleLine.length > 180 ? `${singleLine.slice(0, 177)}...` : singleLine || \"unknown error\";\n}\n\nfunction reasonFromRuntimeError(value: unknown): string {\n\tif (value instanceof Error) return value.message;\n\tif (typeof value === \"string\") return value;\n\tif (value && typeof value === \"object\") {\n\t\tconst maybeMessage = value as Partial<AssistantMessage> & { message?: unknown };\n\t\tif (typeof maybeMessage.errorMessage === \"string\") return maybeMessage.errorMessage;\n\t\tif (typeof maybeMessage.message === \"string\") return maybeMessage.message;\n\t}\n\treturn String(value);\n}\n\nexport function isRuntimeUnavailableError(value: unknown): boolean {\n\tif (value instanceof Error || typeof value === \"string\") return true;\n\tif (value && typeof value === \"object\") {\n\t\tconst maybeMessage = value as Partial<AssistantMessage>;\n\t\treturn maybeMessage.stopReason === \"error\" || maybeMessage.stopReason === \"aborted\";\n\t}\n\treturn false;\n}\n\nfunction makeProbeSignal(\n\tparentSignal: AbortSignal | undefined,\n\ttimeoutMs: number,\n): { signal: AbortSignal; timeoutPromise: Promise<never>; cleanup: () => void } {\n\tconst controller = new AbortController();\n\tconst timeoutError = new Error(`Model availability probe timed out after ${timeoutMs}ms`);\n\tlet timeout: ReturnType<typeof setTimeout>;\n\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\ttimeout = setTimeout(() => {\n\t\t\tcontroller.abort(timeoutError);\n\t\t\treject(timeoutError);\n\t\t}, timeoutMs);\n\t});\n\tconst parentAbortHandler = () => controller.abort(parentSignal?.reason);\n\tparentSignal?.addEventListener(\"abort\", parentAbortHandler, { once: true });\n\tif (parentSignal?.aborted) controller.abort(parentSignal.reason);\n\n\treturn {\n\t\tsignal: controller.signal,\n\t\ttimeoutPromise,\n\t\tcleanup: () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tparentSignal?.removeEventListener(\"abort\", parentAbortHandler);\n\t\t},\n\t};\n}\n\nexport async function probeModelAvailability(\n\tmodel: Model<Api>,\n\toptions: ProbeModelAvailabilityOptions = {},\n): Promise<ProbeModelAvailabilityResult> {\n\tconst { signal, registry, timeoutMs = 10_000 } = options;\n\tif (signal?.aborted) return { ok: false, reason: \"Aborted before spawn\", aborted: true };\n\n\tconst probeSignal = makeProbeSignal(signal, timeoutMs);\n\ttry {\n\t\tconst context: Context = {\n\t\t\tsystemPrompt: \"You are a model availability probe. Reply briefly.\",\n\t\t\tmessages: [{ role: \"user\", content: \"hi\", timestamp: Date.now() }],\n\t\t};\n\t\tconst apiKey = await Promise.race([\n\t\t\tregistry ? registry.getApiKey(model) : Promise.resolve(undefined),\n\t\t\tprobeSignal.timeoutPromise,\n\t\t]);\n\t\tif (signal?.aborted) return { ok: false, reason: \"Aborted before spawn\", aborted: true };\n\t\tconst result = await Promise.race([\n\t\t\tcomplete(model, context, {\n\t\t\t\tapiKey,\n\t\t\t\tmaxRetryDelayMs: 0,\n\t\t\t\tmaxTokens: 1,\n\t\t\t\tsignal: probeSignal.signal,\n\t\t\t}),\n\t\t\tprobeSignal.timeoutPromise,\n\t\t]);\n\t\tif (signal?.aborted) return { ok: false, reason: \"Aborted before spawn\", aborted: true };\n\t\tif (isRuntimeUnavailableError(result)) {\n\t\t\treturn { ok: false, reason: compactErrorReason(reasonFromRuntimeError(result)) };\n\t\t}\n\t\treturn { ok: true };\n\t} catch (err) {\n\t\tif (signal?.aborted) return { ok: false, reason: \"Aborted before spawn\", aborted: true };\n\t\treturn { ok: false, reason: compactErrorReason(reasonFromRuntimeError(err)) };\n\t} finally {\n\t\tprobeSignal.cleanup();\n\t}\n}\n\nexport interface SkippedFallbackModel {\n\tmodel: string;\n\treason: string;\n}\n\nexport type SubagentModelResolution =\n\t| {\n\t\t\tok: true;\n\t\t\tmodelId: string;\n\t\t\tprovider?: string;\n\t\t\twarning?: string;\n\t\t\tskippedModels: SkippedFallbackModel[];\n\t }\n\t| { ok: false; error: string; skippedModels: SkippedFallbackModel[] };\n\nexport async function resolveModelForSubagentSpawn(\n\tmodels: string | string[],\n\tparentProvider: string | undefined,\n\tregistry: ModelRegistry | undefined,\n\tparentModel?: string,\n\tsignal?: AbortSignal,\n): Promise<SubagentModelResolution> {\n\tif (signal?.aborted) return { ok: false, error: \"Aborted before spawn\", skippedModels: [] };\n\n\t// Runtime probing only applies to agent definition fallback lists. Single\n\t// models, per-invocation overrides, and registry-less environments keep the\n\t// existing spawn-time resolution behavior exactly.\n\tif (!Array.isArray(models) || !registry) {\n\t\tconst resolved = resolveModelWithFallbacks(models, parentProvider, registry, parentModel);\n\t\treturn { ...resolved, skippedModels: [] };\n\t}\n\n\tconst skippedModels: SkippedFallbackModel[] = [];\n\tlet lastError = \"\";\n\n\tfor (const modelStr of models) {\n\t\tif (signal?.aborted) return { ok: false, error: \"Aborted before spawn\", skippedModels };\n\n\t\tconst resolved = resolveModelStringSingle(modelStr, parentProvider, registry);\n\t\tif (!resolved.ok) {\n\t\t\tlastError = resolved.error;\n\t\t\tconst reason = compactErrorReason(resolved.error);\n\t\t\tskippedModels.push({ model: modelStr, reason });\n\t\t\tlog.warn(`[subagent] Model \"${modelStr}\" unavailable (${reason}). Trying next fallback...`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst modelObj = resolved.provider ? registry.find(resolved.provider, resolved.modelId) : undefined;\n\t\tif (modelObj) {\n\t\t\tconst probe = await probeModelAvailability(modelObj, { signal, registry });\n\t\t\tif (!probe.ok && probe.aborted) {\n\t\t\t\treturn { ok: false, error: \"Aborted before spawn\", skippedModels };\n\t\t\t}\n\t\t\tif (signal?.aborted) return { ok: false, error: \"Aborted before spawn\", skippedModels };\n\t\t\tif (!probe.ok) {\n\t\t\t\tlastError = probe.reason;\n\t\t\t\tskippedModels.push({ model: modelStr, reason: probe.reason });\n\t\t\t\tlog.warn(`[subagent] Model \"${modelStr}\" failed probe (${probe.reason}). Trying next fallback...`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tlog.debug(`[subagent] Using model \"${resolved.modelId}\" for subagent.`);\n\t\treturn { ...resolved, skippedModels };\n\t}\n\n\tif (signal?.aborted) return { ok: false, error: \"Aborted before spawn\", skippedModels };\n\n\tif (parentModel) {\n\t\tconst parentResolved = resolveModelStringSingle(parentModel, parentProvider, registry);\n\t\tif (parentResolved.ok) {\n\t\t\tconst warning = `Agent preferred models were unavailable. Falling back to parent model \"${parentResolved.modelId}\".`;\n\t\t\tlog.warn(`[subagent] ${warning}`);\n\t\t\treturn { ...parentResolved, warning, skippedModels };\n\t\t}\n\t\tlastError = parentResolved.error;\n\t}\n\n\treturn {\n\t\tok: false,\n\t\tskippedModels,\n\t\terror: `None of the fallback models passed availability checks: ${[\n\t\t\t...models,\n\t\t\t...(parentModel ? [parentModel] : []),\n\t\t].join(\", \")}. Last error: ${lastError || \"all probes failed\"}`,\n\t};\n}\n\nexport function formatModelFallbackSummary(\n\tskippedModels: SkippedFallbackModel[],\n\tselectedModel: string | undefined,\n): string | undefined {\n\tif (skippedModels.length === 0) return undefined;\n\tconst skipped = skippedModels.map((s) => `- ${s.model}: ${s.reason}`).join(\"\\n\");\n\treturn `[MODEL FALLBACK: skipped ${skippedModels.length} unavailable model(s); using \"${selectedModel ?? \"unknown\"}\".]\\n${skipped}`;\n}\n\nexport function prependModelFallbackSummary(\n\toutput: string,\n\tskippedModels: SkippedFallbackModel[],\n\tselectedModel: string | undefined,\n): string {\n\tconst fallbackSummary = formatModelFallbackSummary(skippedModels, selectedModel);\n\treturn fallbackSummary ? `${fallbackSummary}\\n\\n${output}` : output;\n}\n\nfunction formatSkippedModelFailureDetails(skippedModels: SkippedFallbackModel[]): string | undefined {\n\tif (skippedModels.length === 0) return undefined;\n\treturn `Skipped models:\\n${skippedModels.map((s) => `- ${s.model}: ${s.reason}`).join(\"\\n\")}`;\n}\n\nconst MAX_PARALLEL_TASKS = 8;\nconst MAX_CONCURRENCY = 4;\nconst MAX_TASK_LENGTH = 32_768; // 32 KB — prevent E2BIG from oversized argv\n\n// Semaphore for background task concurrency — shared across all background launches\nlet bgRunning = 0;\nconst bgWaiters: Array<() => void> = [];\n\nasync function bgAcquire(): Promise<void> {\n\tif (bgRunning < MAX_CONCURRENCY) {\n\t\tbgRunning++;\n\t\treturn;\n\t}\n\treturn new Promise<void>((resolve) => {\n\t\tbgWaiters.push(() => {\n\t\t\tbgRunning++;\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nfunction bgRelease(): void {\n\tbgRunning--;\n\tconst next = bgWaiters.shift();\n\tif (next) next();\n}\n\n/**\n * Resolve a per-task cwd relative to the parent cwd.\n * Rejects absolute paths and relative paths that escape the parent directory.\n * Returns a result object with ok=false and an error string on rejection, so callers can surface it to the model.\n */\nfunction clampCwd(defaultCwd: string, itemCwd?: string): { ok: true; cwd: string } | { ok: false; error: string } {\n\tif (!itemCwd) return { ok: true, cwd: defaultCwd };\n\tif (itemCwd.startsWith(\"/\")) {\n\t\treturn { ok: false, error: `Rejected absolute cwd \"${itemCwd}\" — must be relative to parent cwd` };\n\t}\n\tconst resolved = resolve(defaultCwd, itemCwd);\n\tif (resolved !== defaultCwd && !resolved.startsWith(`${defaultCwd}/`)) {\n\t\treturn { ok: false, error: `Rejected cwd \"${itemCwd}\" — resolves outside parent cwd` };\n\t}\n\treturn { ok: true, cwd: resolved };\n}\n\nexport async function executeSingle(\n\tagents: Map<string, AgentTypeConfig>,\n\tagentName: string | undefined,\n\ttask: string,\n\tcwd: string,\n\tsignal?: AbortSignal,\n\tonProgress?: (event: string) => void,\n\tmodelOverride?: string,\n\tparentProvider?: string,\n\tregistry?: ModelRegistry,\n\tsessionDir?: string,\n\tparentModel?: string,\n): Promise<SubagentResult> {\n\tconst name = agentName || DEFAULT_AGENT;\n\tconst config = agents.get(name);\n\tif (!config) {\n\t\treturn {\n\t\t\tagent: name,\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: `Unknown agent type \"${name}\". Available: ${[...agents.keys()].join(\", \")}. If you expected \"${name}\" to exist, check the .md file in ~/.dreb/agents/ or .dreb/agents/ for syntax errors.`,\n\t\t};\n\t}\n\t// Validate task length for all modes (single, parallel items, chain steps)\n\tif (task.length > MAX_TASK_LENGTH) {\n\t\treturn {\n\t\t\tagent: name,\n\t\t\ttask: `${task.slice(0, 200)}...`,\n\t\t\texitCode: 1,\n\t\t\toutput: \"\",\n\t\t\tstderr: \"\",\n\t\t\terrorMessage: `Task prompt too long (${task.length} chars, max ${MAX_TASK_LENGTH}). Shorten the prompt.`,\n\t\t};\n\t}\n\t// Per-invocation model override takes precedence over agent definition model.\n\t// Override is always a single string; agent config may be a string or fallback list.\n\tconst modelSpec = modelOverride || config.model;\n\tlet effectiveConfig: AgentTypeConfig = modelOverride ? { ...config, model: modelOverride } : config;\n\tlet resolvedProvider = parentProvider;\n\tlet warning: string | undefined;\n\tlet skippedModels: SkippedFallbackModel[] = [];\n\n\t// Resolve and validate the model against the registry before spawning.\n\t// This catches typos and invalid model names immediately instead of failing\n\t// silently in the child process. Also passes the canonical model ID to the\n\t// child, avoiding fuzzy matching entirely. Agent definition fallback lists get\n\t// an additional best-effort 1-token probe before spawn so runtime-unavailable\n\t// models are skipped before committing to a child process.\n\tif (modelSpec) {\n\t\tconst resolved = await resolveModelForSubagentSpawn(modelSpec, parentProvider, registry, parentModel, signal);\n\t\tskippedModels = resolved.skippedModels;\n\t\tif (!resolved.ok) {\n\t\t\tconst skippedDetails = formatSkippedModelFailureDetails(skippedModels);\n\t\t\treturn {\n\t\t\t\tagent: name,\n\t\t\t\ttask,\n\t\t\t\texitCode: 1,\n\t\t\t\toutput: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terrorMessage: skippedDetails ? `${resolved.error}\\n\\n${skippedDetails}` : resolved.error,\n\t\t\t};\n\t\t}\n\t\teffectiveConfig = { ...effectiveConfig, model: resolved.modelId };\n\t\tif (resolved.provider) {\n\t\t\tresolvedProvider = resolved.provider;\n\t\t}\n\t\twarning = resolved.warning;\n\t}\n\n\tonProgress?.(`Running ${name} agent...`);\n\tconst result = await spawnSubagent(effectiveConfig, task, cwd, signal, onProgress, resolvedProvider, sessionDir);\n\tresult.output = prependModelFallbackSummary(\n\t\tresult.output,\n\t\tskippedModels,\n\t\tresult.model ?? effectiveConfig.model?.toString(),\n\t);\n\tif (warning) {\n\t\tresult.output = `[WARNING: ${warning}]\\n\\n${result.output}`;\n\t}\n\treturn result;\n}\n\nasync function executeChain(\n\tagents: Map<string, AgentTypeConfig>,\n\tchain: Array<{ agent?: string; task: string; cwd?: string; model?: string }>,\n\tdefaultCwd: string,\n\tsignal?: AbortSignal,\n\tonProgress?: (event: string) => void,\n\tparentProvider?: string,\n\tregistry?: ModelRegistry,\n\tsessionBaseDir?: string,\n\tdefaultAgent?: string,\n\tdefaultModel?: string,\n\tparentModel?: string,\n): Promise<SubagentResult[]> {\n\tconst results: SubagentResult[] = [];\n\tlet previousOutput = \"\";\n\n\tfor (let i = 0; i < chain.length; i++) {\n\t\tif (signal?.aborted) break;\n\t\tconst step = chain[i];\n\t\tconst task = step.task.replace(/\\{previous\\}/g, previousOutput);\n\t\tonProgress?.(`Chain step ${i + 1}/${chain.length}`);\n\n\t\t// Validate task length after {previous} substitution (can compound across steps)\n\t\tif (task.length > MAX_TASK_LENGTH) {\n\t\t\tresults.push({\n\t\t\t\tagent: step.agent || defaultAgent || DEFAULT_AGENT,\n\t\t\t\ttask: `${task.slice(0, 200)}...`,\n\t\t\t\texitCode: 1,\n\t\t\t\toutput: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terrorMessage: `Task prompt too long after {previous} substitution (${task.length} chars, max ${MAX_TASK_LENGTH}). Shorten the prompt or summarize previous output.`,\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\n\t\tconst cwdResult = clampCwd(defaultCwd, step.cwd);\n\t\tif (!cwdResult.ok) {\n\t\t\tresults.push({\n\t\t\t\tagent: step.agent || defaultAgent || DEFAULT_AGENT,\n\t\t\t\ttask,\n\t\t\t\texitCode: 1,\n\t\t\t\toutput: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terrorMessage: cwdResult.error,\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\n\t\t// Each chain step gets its own session subdirectory\n\t\tconst stepSessionDir = sessionBaseDir ? join(sessionBaseDir, `step-${i + 1}`) : undefined;\n\t\tconst result = await executeSingle(\n\t\t\tagents,\n\t\t\tstep.agent || defaultAgent,\n\t\t\ttask,\n\t\t\tcwdResult.cwd,\n\t\t\tsignal,\n\t\t\tonProgress,\n\t\t\tstep.model || defaultModel,\n\t\t\tparentProvider,\n\t\t\tregistry,\n\t\t\tstepSessionDir,\n\t\t\tparentModel,\n\t\t);\n\t\tresults.push(result);\n\n\t\tif (result.exitCode !== 0) {\n\t\t\tbreak; // stop chain on error\n\t\t}\n\t\tpreviousOutput = result.output;\n\t}\n\n\treturn results;\n}\n\n// ---------------------------------------------------------------------------\n// Background execution\n// ---------------------------------------------------------------------------\n\nfunction generateAgentId(): string {\n\treturn randomBytes(6).toString(\"hex\");\n}\n\n// ---------------------------------------------------------------------------\n// Background agent registry — queryable by TUI / Telegram frontends\n// ---------------------------------------------------------------------------\n\nexport interface BackgroundAgentInfo {\n\tagentId: string;\n\tagentType: string;\n\ttaskSummary: string;\n\tstartedAt: number;\n\tstatus: \"running\" | \"completed\" | \"failed\";\n}\n\nconst backgroundAgentRegistry = new Map<string, BackgroundAgentInfo>();\nconst backgroundAbortControllers = new Map<string, AbortController>();\n\n/** Get a snapshot of all tracked background agents (running and recently completed). Returns readonly clones. */\nexport function getBackgroundAgents(): readonly Readonly<BackgroundAgentInfo>[] {\n\treturn [...backgroundAgentRegistry.values()].map((a) => ({ ...a }));\n}\n\n/** Get only currently running background agents. Returns readonly clones. */\nexport function getRunningBackgroundAgents(): readonly Readonly<BackgroundAgentInfo>[] {\n\treturn [...backgroundAgentRegistry.values()].filter((a) => a.status === \"running\").map((a) => ({ ...a }));\n}\n\n/** Abort all running background agents. */\nexport function abortBackgroundAgents(): void {\n\tfor (const [id, controller] of backgroundAbortControllers) {\n\t\tcontroller.abort();\n\t\tconst entry = backgroundAgentRegistry.get(id);\n\t\tif (entry && entry.status === \"running\") {\n\t\t\tentry.status = \"failed\";\n\t\t}\n\t}\n\tbackgroundAbortControllers.clear();\n}\n\n/** Remove completed/failed entries older than the given age (ms). Default: 5 minutes. */\nexport function pruneBackgroundAgents(maxAgeMs = 5 * 60 * 1000): void {\n\tconst now = Date.now();\n\tfor (const [id, info] of backgroundAgentRegistry) {\n\t\tif (info.status !== \"running\" && now - info.startedAt > maxAgeMs) {\n\t\t\tbackgroundAgentRegistry.delete(id);\n\t\t\tbackgroundAbortControllers.delete(id);\n\t\t}\n\t}\n}\n\nexport interface SubagentToolOptions {\n\t/** Called when a background subagent starts. Used by TUI to show status indicators. */\n\tonBackgroundStart?: (agentId: string, agentType: string, taskSummary: string) => void;\n\t/** Called when a background subagent completes with its result. `cancelled` is true if the user aborted it. */\n\tonBackgroundComplete?: (agentId: string, result: SubagentResult, cancelled: boolean) => void;\n\t/** Parent session's current provider (e.g. \"anthropic\"). Called at each invocation to get the live value after mid-session model switches. */\n\tparentProvider?: () => string | undefined;\n\t/** Parent session's current model ID. Used as a final fallback when all subagent-configured models fail to resolve. Called at each invocation for fresh value. */\n\tparentModel?: () => string | undefined;\n\t/** Model registry for validating model names before spawning child processes. */\n\tmodelRegistry?: ModelRegistry;\n}\n\n// ---------------------------------------------------------------------------\n// Tool schema and definition\n// ---------------------------------------------------------------------------\n\nconst taskItemSchema = Type.Object({\n\tagent: Type.Optional(Type.String({ description: \"Agent type name (default: 'Explore')\" })),\n\ttask: Type.String({ description: \"The task prompt for this subagent\" }),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory (defaults to parent's cwd)\" })),\n\tmodel: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Model override for this task. Takes precedence over agent definition model. Note: a single-string override discards the agent's fallback list.\",\n\t\t}),\n\t),\n});\n\nconst subagentSchema = Type.Object({\n\tagent: Type.Optional(Type.String({ description: \"Agent type name (default: 'Explore')\" })),\n\ttask: Type.Optional(Type.String({ description: \"Task prompt (single mode)\", minLength: 1 })),\n\tmodel: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Model override. Takes precedence over agent definition model. Note: a single-string override discards the agent's fallback list. For parallel/chain, set per-task instead.\",\n\t\t}),\n\t),\n\ttasks: Type.Optional(\n\t\tType.Array(taskItemSchema, {\n\t\t\tdescription: \"Array of tasks to run in parallel (max 8)\",\n\t\t\tminItems: 1,\n\t\t\tmaxItems: MAX_PARALLEL_TASKS,\n\t\t}),\n\t),\n\tchain: Type.Optional(\n\t\tType.Array(taskItemSchema, {\n\t\t\tdescription: \"Sequential pipeline — each step can use {previous} for prior output\",\n\t\t\tminItems: 1,\n\t\t}),\n\t),\n\t// background parameter removed — all subagents run in background mode.\n\t// Kept in schema for backward compatibility (silently ignored if passed).\n\tbackground: Type.Optional(\n\t\tType.Boolean({ description: \"Deprecated — all subagents run in background mode. This parameter is ignored.\" }),\n\t),\n});\n\nexport type SubagentToolInput = Static<typeof subagentSchema>;\n\nexport interface SubagentToolDetails {\n\ttruncation?: TruncationResult;\n\tmode: \"single\" | \"parallel\" | \"chain\";\n\tagentCount: number;\n}\n\nfunction formatSubagentCall(\n\targs: SubagentToolInput | undefined,\n\ttheme: typeof import(\"../../modes/interactive/theme/theme.js\").theme,\n\targsComplete = true,\n): string {\n\tconst invalidArg = invalidArgText(theme);\n\n\tif (args?.tasks) {\n\t\t// Show agent type(s) in the parallel label\n\t\tconst agentCounts = new Map<string, number>();\n\t\tfor (const t of args.tasks) {\n\t\t\tconst name = t.agent || args.agent || DEFAULT_AGENT;\n\t\t\tagentCounts.set(name, (agentCounts.get(name) || 0) + 1);\n\t\t}\n\t\tlet typeLabel: string;\n\t\tif (agentCounts.size === 1) {\n\t\t\tconst [name] = [...agentCounts.keys()];\n\t\t\ttypeLabel = `${args.tasks.length} ${name} tasks`;\n\t\t} else {\n\t\t\tconst parts = [...agentCounts.entries()].map(([name, count]) => `${count} ${name}`);\n\t\t\ttypeLabel = `${args.tasks.length} tasks: ${parts.join(\", \")}`;\n\t\t}\n\t\treturn `${theme.fg(\"toolTitle\", theme.bold(\"subagent\"))} ${theme.fg(\"accent\", `parallel (${typeLabel})`)}`;\n\t}\n\tif (args?.chain) {\n\t\tconst agentName = str(args.agent) || args.chain[0]?.agent || DEFAULT_AGENT;\n\t\treturn `${theme.fg(\"toolTitle\", theme.bold(\"subagent\"))} ${theme.fg(\"accent\", `chain (${agentName}, ${args.chain.length} steps)`)}`;\n\t}\n\n\tconst agent = str(args?.agent) || DEFAULT_AGENT;\n\tconst model = str(args?.model);\n\tconst task = str(args?.task);\n\tconst taskPreview = task ? (task.length > 60 ? `${task.slice(0, 57)}...` : task) : null;\n\tconst modelSuffix = model ? ` ${theme.fg(\"muted\", `(${model})`)}` : \"\";\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent\")) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", agent) +\n\t\tmodelSuffix +\n\t\t\" \" +\n\t\t(taskPreview === null\n\t\t\t? argsComplete\n\t\t\t\t? invalidArg\n\t\t\t\t: theme.fg(\"muted\", \"…\")\n\t\t\t: theme.fg(\"toolOutput\", `\"${taskPreview}\"`))\n\t);\n}\n\nfunction formatSubagentResult(\n\tresult: {\n\t\tcontent: Array<{ type: string; text?: string }>;\n\t\tdetails?: SubagentToolDetails;\n\t},\n\toptions: ToolRenderResultOptions,\n\ttheme: typeof import(\"../../modes/interactive/theme/theme.js\").theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = options.expanded ? lines.length : 25;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t}\n\treturn text;\n}\n\nfunction formatSingleResult(result: SubagentResult): string {\n\tlet text = `## Agent: ${result.agent}${result.model ? ` (model: ${result.model})` : \"\"}\\n`;\n\tif (result.exitCode !== 0) {\n\t\ttext += `**Error** (exit ${result.exitCode}): ${result.errorMessage || \"Unknown error\"}\\n`;\n\t\tif (result.stderr) {\n\t\t\ttext += `\\nStderr:\\n${result.stderr}\\n`;\n\t\t}\n\t}\n\tif (result.output) {\n\t\ttext += `\\n${result.output}`;\n\t} else if (result.exitCode === 0) {\n\t\ttext += \"\\n(No output)\";\n\t}\n\tif (result.sessionFile) {\n\t\ttext += `\\n\\nSession log: ${result.sessionFile}`;\n\t}\n\treturn text;\n}\n\nexport function createSubagentToolDefinition(\n\tcwd: string,\n\toptions?: SubagentToolOptions,\n): ToolDefinition<typeof subagentSchema, SubagentToolDetails | undefined> {\n\tconst onBackgroundStart = options?.onBackgroundStart;\n\tconst onBackgroundComplete = options?.onBackgroundComplete;\n\tconst getParentProvider = options?.parentProvider ?? (() => undefined);\n\tconst getParentModel = options?.parentModel ?? (() => undefined);\n\tconst modelRegistry = options?.modelRegistry;\n\n\t// Discover agents at definition time to build the prompt guidelines.\n\t// This is cheap (reads .md files) and the same call happens on every execute().\n\tconst knownAgents = discoverAgentTypes(cwd);\n\tconst agentListParts: string[] = [];\n\tfor (const [name, config] of knownAgents) {\n\t\tconst defaultTag = name === DEFAULT_AGENT ? \" (default)\" : \"\";\n\t\tconst desc = config.description || name;\n\t\tagentListParts.push(`'${name}'${defaultTag} — ${desc}`);\n\t}\n\tconst builtInAgentsLine = `Built-in agents: ${agentListParts.join(\"; \")}`;\n\n\treturn {\n\t\tname: \"subagent\",\n\t\tlabel: \"subagent\",\n\t\tdescription:\n\t\t\t\"Delegate tasks to independent subagents (Explore for codebase research, Sandbox for isolated /tmp-only analysis). \" +\n\t\t\t\"Supports single task, parallel (up to 8, max 4 concurrent), \" +\n\t\t\t\"and chain (sequential pipeline with {previous} substitution) modes. \" +\n\t\t\t\"All subagents run in background — returns immediately, notifies on completion.\",\n\t\tpromptSnippet: \"Delegate tasks to independent subagents\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use `subagent` to delegate focused, independent tasks to child agents\",\n\t\t\t\"Available agent types can be discovered from ~/.dreb/agents/ and .dreb/agents/ markdown files\",\n\t\t\tbuiltInAgentsLine,\n\t\t\t\"Use parallel mode for independent tasks that can run concurrently\",\n\t\t\t\"Use chain mode when each step depends on the previous step's output (reference with {previous})\",\n\t\t\t\"All subagents run in background — the tool returns immediately and you are notified when each agent completes.\",\n\t\t\t\"Subagents have their own context window — provide enough context in the task prompt\",\n\t\t\t\"Each agent notifies independently when done — completion messages include a list of any still-running agents. If you need their results before proceeding, end your current turn with no tool calls (as if you were asking the user a question and waiting for their reply). This emits `agent_end` and lets the framework deliver the completion as a new message that resumes your turn automatically. Do not call `sleep` or any other waiting action, and do not launch filler work.\",\n\t\t\t\"Agent definitions specify a `model` field with a provider fallback list (comma-separated or YAML list). The spawner tries each in order and uses the first one that resolves for the current provider. This makes agents portable across providers.\",\n\t\t\t\"Per-invocation `model` overrides take precedence but **discard the entire fallback list** — if the single override model isn't available on the current provider, the agent fails. Only override when you have a specific reason (e.g. escalating to a stronger tier for a complex task).\",\n\t\t\t\"**Model routing** — agent definitions already specify the right tier for their role. Most subagent tasks (exploration, file discovery, grep, navigation, summarization) are handled well by the defaults. Do not override the model unless the task genuinely requires a different capability tier than what the agent definition provides.\",\n\t\t],\n\t\tparameters: subagentSchema,\n\n\t\tasync execute(_toolCallId, params: SubagentToolInput, _signal, _onUpdate) {\n\t\t\tconst agents = discoverAgentTypes(cwd);\n\n\t\t\t// Determine mode\n\t\t\tconst modeCount = (params.task ? 1 : 0) + (params.tasks ? 1 : 0) + (params.chain ? 1 : 0);\n\t\t\tif (modeCount === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\", text: \"Error: provide one of `task` (single), `tasks` (parallel), or `chain`.\" },\n\t\t\t\t\t],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (modeCount > 1) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Error: modes are mutually exclusive — provide only one of `task`, `tasks`, or `chain`.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// All subagents run in background mode — return immediately, notify on completion\n\t\t\t{\n\t\t\t\tif (!onBackgroundComplete) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: \"Subagent execution requires background support, which is not available in this session.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Shared lifecycle for all background launches: generates agent ID,\n\t\t\t\t * sets up registry/abort/notification, gates on the concurrency\n\t\t\t\t * semaphore, and handles errors. The caller provides the actual\n\t\t\t\t * work via `runFn(signal)` which must return a SubagentResult.\n\t\t\t\t */\n\t\t\t\tconst launchBackgroundLifecycle = (\n\t\t\t\t\tagentName: string,\n\t\t\t\t\ttaskSummary: string,\n\t\t\t\t\trunFn: (signal: AbortSignal) => Promise<SubagentResult>,\n\t\t\t\t): string => {\n\t\t\t\t\tconst agentId = generateAgentId();\n\t\t\t\t\tconst bgAbort = new AbortController();\n\t\t\t\t\tbackgroundAgentRegistry.set(agentId, {\n\t\t\t\t\t\tagentId,\n\t\t\t\t\t\tagentType: agentName,\n\t\t\t\t\t\ttaskSummary,\n\t\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t});\n\t\t\t\t\tbackgroundAbortControllers.set(agentId, bgAbort);\n\t\t\t\t\tonBackgroundStart?.(agentId, agentName, taskSummary);\n\n\t\t\t\t\tconst bgSignal = bgAbort.signal;\n\n\t\t\t\t\tconst safeNotify = (result: SubagentResult) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tonBackgroundComplete(agentId, result, bgSignal.aborted);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t\t\t`[subagent] onBackgroundComplete threw for agent ${agentId}: ${err instanceof Error ? err.message : String(err)}. Background result lost.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tconst run = async () => {\n\t\t\t\t\t\tawait bgAcquire();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await runFn(bgSignal);\n\t\t\t\t\t\t\tconst entry = backgroundAgentRegistry.get(agentId);\n\t\t\t\t\t\t\tif (entry && !bgSignal.aborted) entry.status = result.exitCode === 0 ? \"completed\" : \"failed\";\n\t\t\t\t\t\t\tbackgroundAbortControllers.delete(agentId);\n\t\t\t\t\t\t\tsafeNotify(result);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconst entry = backgroundAgentRegistry.get(agentId);\n\t\t\t\t\t\t\tif (entry && !bgSignal.aborted) entry.status = \"failed\";\n\t\t\t\t\t\t\tbackgroundAbortControllers.delete(agentId);\n\t\t\t\t\t\t\tsafeNotify({\n\t\t\t\t\t\t\t\tagent: agentName,\n\t\t\t\t\t\t\t\ttask: taskSummary,\n\t\t\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t\t\t\toutput: \"\",\n\t\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\t\terrorMessage: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tbgRelease();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\trun().catch((err) => {\n\t\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t\t`[subagent] Unhandled background error (${agentId}): ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst entry = backgroundAgentRegistry.get(agentId);\n\t\t\t\t\t\tif (entry && entry.status === \"running\") entry.status = \"failed\";\n\t\t\t\t\t\tbackgroundAbortControllers.delete(agentId);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tonBackgroundComplete(\n\t\t\t\t\t\t\t\tagentId,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tagent: agentName,\n\t\t\t\t\t\t\t\t\ttask: taskSummary,\n\t\t\t\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t\t\t\t\toutput: \"\",\n\t\t\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\t\t\terrorMessage: `Internal error: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tbgSignal.aborted,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch (notifyErr) {\n\t\t\t\t\t\t\tlog.error(\n\t\t\t\t\t\t\t\t`[subagent] CRITICAL: Last-resort notification failed for ${agentId}: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn agentId;\n\t\t\t\t};\n\n\t\t\t\t// Helper to launch a single background task\n\t\t\t\tconst subagentSessionsBase = getSubagentSessionsDir();\n\t\t\t\tconst launchBackgroundTask = (\n\t\t\t\t\tagentName: string,\n\t\t\t\t\ttask: string,\n\t\t\t\t\ttaskLabel: string,\n\t\t\t\t\ttaskCwd?: string,\n\t\t\t\t\tmodelOverride?: string,\n\t\t\t\t) => {\n\t\t\t\t\tconst resolvedCwd = taskCwd ?? cwd;\n\t\t\t\t\t// Each background agent gets its own session subdirectory\n\t\t\t\t\tconst sessionId = generateAgentId();\n\t\t\t\t\tconst sessionDir = join(subagentSessionsBase, sessionId);\n\t\t\t\t\treturn launchBackgroundLifecycle(agentName, taskLabel, (signal) =>\n\t\t\t\t\t\texecuteSingle(\n\t\t\t\t\t\t\tagents,\n\t\t\t\t\t\t\tagentName === DEFAULT_AGENT ? undefined : agentName,\n\t\t\t\t\t\t\ttask,\n\t\t\t\t\t\t\tresolvedCwd,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tmodelOverride,\n\t\t\t\t\t\t\tgetParentProvider(),\n\t\t\t\t\t\t\tmodelRegistry,\n\t\t\t\t\t\t\tsessionDir,\n\t\t\t\t\t\t\tgetParentModel(),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t};\n\n\t\t\t\tif (params.task) {\n\t\t\t\t\t// Single background task\n\t\t\t\t\tconst agentName = params.agent || DEFAULT_AGENT;\n\t\t\t\t\tconst agentId = launchBackgroundTask(\n\t\t\t\t\t\tagentName,\n\t\t\t\t\t\tparams.task,\n\t\t\t\t\t\t`${agentName} task`,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tparams.model,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Background agent ${agentId} started (${agentName}). You will be notified when it completes.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"single\", agentCount: 1 } as SubagentToolDetails,\n\t\t\t\t\t\tendTurn: true,\n\t\t\t\t\t};\n\t\t\t\t} else if (params.tasks) {\n\t\t\t\t\t// Parallel background tasks — each gets its own agent ID and notifies independently\n\t\t\t\t\tconst launched: Array<{ id: string; agentName: string; taskText: string }> = [];\n\t\t\t\t\tconst skipped: Array<{ taskText: string; error: string }> = [];\n\t\t\t\t\tfor (let i = 0; i < params.tasks.length; i++) {\n\t\t\t\t\t\tconst item = params.tasks[i];\n\t\t\t\t\t\tconst agentName = item.agent || params.agent || DEFAULT_AGENT;\n\t\t\t\t\t\tconst cwdResult = clampCwd(cwd, item.cwd);\n\t\t\t\t\t\tif (!cwdResult.ok) {\n\t\t\t\t\t\t\tskipped.push({ taskText: item.task, error: cwdResult.error });\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst agentId = launchBackgroundTask(\n\t\t\t\t\t\t\tagentName,\n\t\t\t\t\t\t\titem.task,\n\t\t\t\t\t\t\t`${agentName} task ${i + 1}/${params.tasks.length}`,\n\t\t\t\t\t\t\tcwdResult.cwd,\n\t\t\t\t\t\t\titem.model || params.model,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlaunched.push({ id: agentId, agentName, taskText: item.task });\n\t\t\t\t\t}\n\t\t\t\t\tconst listing = launched\n\t\t\t\t\t\t.map(({ id, agentName, taskText }) => ` ${id} (${agentName}): ${taskText.slice(0, 80)}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tconst skippedListing = skipped\n\t\t\t\t\t\t.map(({ taskText, error }) => ` SKIPPED: ${taskText.slice(0, 60)} — ${error}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tconst parts = [`${launched.length} background agents started:\\n${listing}`];\n\t\t\t\t\tif (skipped.length > 0) {\n\t\t\t\t\t\tparts.push(`\\n${skipped.length} task(s) failed to launch:\\n${skippedListing}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (launched.length > 0) {\n\t\t\t\t\t\tparts.push(\"\\nEach will notify independently when complete.\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparts.push(\"\\nNo agents were launched.\");\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: parts.join(\"\\n\"),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"parallel\", agentCount: launched.length } as SubagentToolDetails,\n\t\t\t\t\t\tendTurn: launched.length > 0,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t// Chain mode — sequential, stays as one agent since steps depend on each other\n\t\t\t\t\tconst agentName = params.agent || params.chain![0].agent || DEFAULT_AGENT;\n\t\t\t\t\tconst taskSummary = `${params.chain!.length}-step chain`;\n\t\t\t\t\tconst chainSteps = params.chain!;\n\n\t\t\t\t\tconst chainSessionDir = join(subagentSessionsBase, `chain-${generateAgentId()}`);\n\t\t\t\t\tconst agentId = launchBackgroundLifecycle(agentName, taskSummary, async (signal) => {\n\t\t\t\t\t\tconst results = await executeChain(\n\t\t\t\t\t\t\tagents,\n\t\t\t\t\t\t\tchainSteps,\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tgetParentProvider(),\n\t\t\t\t\t\t\tmodelRegistry,\n\t\t\t\t\t\t\tchainSessionDir,\n\t\t\t\t\t\t\tparams.agent,\n\t\t\t\t\t\t\tparams.model,\n\t\t\t\t\t\t\tgetParentModel(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst resultText = results\n\t\t\t\t\t\t\t.map((r, i) => `### Step ${i + 1}\\n${formatSingleResult(r)}`)\n\t\t\t\t\t\t\t.join(\"\\n\\n---\\n\\n\");\n\t\t\t\t\t\tconst failed = results.filter((r) => r.exitCode !== 0);\n\t\t\t\t\t\t// Per-step session logs are already embedded in resultText via formatSingleResult\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tagent: agentName,\n\t\t\t\t\t\t\ttask: taskSummary,\n\t\t\t\t\t\t\texitCode: failed.length > 0 ? 1 : 0,\n\t\t\t\t\t\t\toutput: resultText,\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\t\tfailed.length > 0\n\t\t\t\t\t\t\t\t\t? `Chain stopped at step ${results.length} of ${chainSteps.length}: ${results[results.length - 1]?.errorMessage}`\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Background chain ${agentId} started (${taskSummary}). You will be notified when it completes.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"chain\", agentCount: chainSteps.length } as SubagentToolDetails,\n\t\t\t\t\t\tendTurn: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatSubagentCall(args, theme, context.argsComplete));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatSubagentResult(result as any, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createSubagentTool(cwd: string, options?: SubagentToolOptions): AgentTool<typeof subagentSchema> {\n\treturn wrapToolDefinition(createSubagentToolDefinition(cwd, options));\n}\n\nexport const subagentToolDefinition = createSubagentToolDefinition(process.cwd());\nexport const subagentTool = createSubagentTool(process.cwd());\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-render.d.ts","sourceRoot":"","sources":["../../../src/core/tools/terminal-render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terminal-render.d.ts","sourceRoot":"","sources":["../../../src/core/tools/terminal-render.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA+F/D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYxD","sourcesContent":["import { TerminalTextRender } from \"terminal-render\";\nimport { log } from \"../logger.js\";\n\n/**\n * Maximum row or column value allowed in ANSI cursor positioning sequences.\n * Anything larger gets capped to this value to prevent memory exhaustion from\n * malicious sequences like `ESC[9999999;1H`.\n */\nconst MAX_CURSOR_POSITION = 5000;\n\n/**\n * Sanitize ANSI cursor positioning sequences to prevent memory exhaustion.\n *\n * Sequences like `ESC[9999999;1H` can cause TerminalTextRender to allocate\n * millions of empty lines. This function caps row/column values in:\n * - CUP (cursor position): ESC[<row>;<col>H or ESC[<row>;<col>f\n * - CUU/CUD/CUF/CUB (cursor movement): ESC[<n>A/B/C/D\n * - CNL (cursor next line): ESC[<n>E\n * - VPA (vertical position absolute): ESC[<row>d\n * - HPA (horizontal position absolute): ESC[<col>G or ESC[<col>`\n *\n * In addition to per-sequence caps, this tracks cumulative cursor position\n * to prevent accumulation attacks where many sequences each at the per-sequence\n * cap combine to push the cursor to millions of rows/columns, triggering OOM\n * via array allocation in the terminal renderer.\n */\nexport function sanitizeCursorPositioning(input: string): string {\n\t// Track cumulative cursor position across sequences. An attacker can send\n\t// thousands of ESC[5000B sequences, each passing the per-sequence cap but\n\t// accumulating to ~55M rows. By tracking position, we clamp movement that\n\t// would exceed the limit.\n\tlet cursorRow = 0;\n\tlet cursorCol = 0;\n\n\tconst parsePart = (p: string | undefined): number | null => {\n\t\tif (p === undefined) return null;\n\t\tconst n = Number.parseInt(p, 10);\n\t\treturn Number.isNaN(n) ? null : n;\n\t};\n\n\t// Cap all numeric params individually and rebuild the param string\n\tconst capParams = (rawParts: string[]) =>\n\t\trawParts\n\t\t\t.map((p: string) => {\n\t\t\t\tconst n = Number.parseInt(p, 10);\n\t\t\t\tif (Number.isNaN(n)) return p;\n\t\t\t\treturn String(Math.min(n, MAX_CURSOR_POSITION));\n\t\t\t})\n\t\t\t.join(\";\");\n\n\t// Match CSI sequences: ESC[ followed by params and a final byte\n\t// Covers H, f (CUP), A/B/C/D (movement), E (CNL), d (VPA), G/` (HPA), r (scroll region)\n\treturn input.replace(/\\x1b\\[([0-9;]*)([ABCDEGHfdr`])/g, (_match, params: string, cmd: string) => {\n\t\tconst rawParts = params.split(\";\");\n\n\t\tswitch (cmd) {\n\t\t\tcase \"B\": // Cursor down by n (default 1)\n\t\t\tcase \"E\": {\n\t\t\t\t// Cursor next line by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tconst allowed = Math.max(0, MAX_CURSOR_POSITION - cursorRow);\n\t\t\t\tconst clamped = Math.min(capped, allowed);\n\t\t\t\tcursorRow += clamped;\n\t\t\t\tif (cmd === \"E\") cursorCol = 0;\n\t\t\t\treturn `\\x1b[${clamped}${cmd}`;\n\t\t\t}\n\t\t\tcase \"A\": {\n\t\t\t\t// Cursor up by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tcursorRow = Math.max(0, cursorRow - capped);\n\t\t\t\treturn `\\x1b[${capped}A`;\n\t\t\t}\n\t\t\tcase \"C\": {\n\t\t\t\t// Cursor forward by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tconst allowed = Math.max(0, MAX_CURSOR_POSITION - cursorCol);\n\t\t\t\tconst clamped = Math.min(capped, allowed);\n\t\t\t\tcursorCol += clamped;\n\t\t\t\treturn `\\x1b[${clamped}C`;\n\t\t\t}\n\t\t\tcase \"D\": {\n\t\t\t\t// Cursor back by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tcursorCol = Math.max(0, cursorCol - capped);\n\t\t\t\treturn `\\x1b[${capped}D`;\n\t\t\t}\n\t\t\tcase \"H\":\n\t\t\tcase \"f\": {\n\t\t\t\t// Absolute cursor position: ESC[row;colH\n\t\t\t\tconst row = parsePart(rawParts[0]);\n\t\t\t\tconst col = parsePart(rawParts[1]);\n\t\t\t\tcursorRow = row != null ? Math.min(row, MAX_CURSOR_POSITION) : 1;\n\t\t\t\tcursorCol = col != null ? Math.min(col, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t\tcase \"d\": {\n\t\t\t\t// VPA - vertical position absolute\n\t\t\t\tconst row = parsePart(rawParts[0]);\n\t\t\t\tcursorRow = row != null ? Math.min(row, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}d`;\n\t\t\t}\n\t\t\tcase \"G\":\n\t\t\tcase \"`\": {\n\t\t\t\t// HPA - horizontal position absolute\n\t\t\t\tconst col = parsePart(rawParts[0]);\n\t\t\t\tcursorCol = col != null ? Math.min(col, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t\tcase \"r\": {\n\t\t\t\t// Set scroll region - cap params, no position tracking\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}r`;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Process raw terminal output through a terminal renderer, producing the clean\n * text a human would actually see on screen.\n *\n * This handles:\n * - Carriage returns (`\\r`) — progress bars overwrite the current line\n * - ANSI cursor movement — up, down, forward, backward, absolute positioning\n * - Backspace (`\\b`) — moves cursor back one position\n * - Line clearing / screen clearing escape sequences\n * - Tab stops\n *\n * The result is the final rendered state of the terminal — identical to what\n * a human would see in a real terminal after the output completes.\n *\n * Safety:\n * - Cursor positioning values are capped to prevent memory exhaustion\n * - Errors fall back to returning the raw input\n */\nexport function renderTerminalOutput(raw: string): string {\n\tif (!raw) return raw;\n\ttry {\n\t\tconst sanitized = sanitizeCursorPositioning(raw);\n\t\tconst renderer = new TerminalTextRender();\n\t\trenderer.write(sanitized);\n\t\treturn renderer.render();\n\t} catch (err) {\n\t\tconst detail = err instanceof Error ? err.message : String(err);\n\t\tlog.debug(`[dreb] terminal-render fallback: TerminalTextRender failed (${detail}), returning raw output`);\n\t\treturn raw;\n\t}\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TerminalTextRender } from "terminal-render";
|
|
2
|
+
import { log } from "../logger.js";
|
|
2
3
|
/**
|
|
3
4
|
* Maximum row or column value allowed in ANSI cursor positioning sequences.
|
|
4
5
|
* Anything larger gets capped to this value to prevent memory exhaustion from
|
|
@@ -144,7 +145,7 @@ export function renderTerminalOutput(raw) {
|
|
|
144
145
|
}
|
|
145
146
|
catch (err) {
|
|
146
147
|
const detail = err instanceof Error ? err.message : String(err);
|
|
147
|
-
|
|
148
|
+
log.debug(`[dreb] terminal-render fallback: TerminalTextRender failed (${detail}), returning raw output`);
|
|
148
149
|
return raw;
|
|
149
150
|
}
|
|
150
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-render.js","sourceRoot":"","sources":["../../../src/core/tools/terminal-render.ts"],"names":[],"mappings":"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","sourcesContent":["import { TerminalTextRender } from \"terminal-render\";\n\n/**\n * Maximum row or column value allowed in ANSI cursor positioning sequences.\n * Anything larger gets capped to this value to prevent memory exhaustion from\n * malicious sequences like `ESC[9999999;1H`.\n */\nconst MAX_CURSOR_POSITION = 5000;\n\n/**\n * Sanitize ANSI cursor positioning sequences to prevent memory exhaustion.\n *\n * Sequences like `ESC[9999999;1H` can cause TerminalTextRender to allocate\n * millions of empty lines. This function caps row/column values in:\n * - CUP (cursor position): ESC[<row>;<col>H or ESC[<row>;<col>f\n * - CUU/CUD/CUF/CUB (cursor movement): ESC[<n>A/B/C/D\n * - CNL (cursor next line): ESC[<n>E\n * - VPA (vertical position absolute): ESC[<row>d\n * - HPA (horizontal position absolute): ESC[<col>G or ESC[<col>`\n *\n * In addition to per-sequence caps, this tracks cumulative cursor position\n * to prevent accumulation attacks where many sequences each at the per-sequence\n * cap combine to push the cursor to millions of rows/columns, triggering OOM\n * via array allocation in the terminal renderer.\n */\nexport function sanitizeCursorPositioning(input: string): string {\n\t// Track cumulative cursor position across sequences. An attacker can send\n\t// thousands of ESC[5000B sequences, each passing the per-sequence cap but\n\t// accumulating to ~55M rows. By tracking position, we clamp movement that\n\t// would exceed the limit.\n\tlet cursorRow = 0;\n\tlet cursorCol = 0;\n\n\tconst parsePart = (p: string | undefined): number | null => {\n\t\tif (p === undefined) return null;\n\t\tconst n = Number.parseInt(p, 10);\n\t\treturn Number.isNaN(n) ? null : n;\n\t};\n\n\t// Cap all numeric params individually and rebuild the param string\n\tconst capParams = (rawParts: string[]) =>\n\t\trawParts\n\t\t\t.map((p: string) => {\n\t\t\t\tconst n = Number.parseInt(p, 10);\n\t\t\t\tif (Number.isNaN(n)) return p;\n\t\t\t\treturn String(Math.min(n, MAX_CURSOR_POSITION));\n\t\t\t})\n\t\t\t.join(\";\");\n\n\t// Match CSI sequences: ESC[ followed by params and a final byte\n\t// Covers H, f (CUP), A/B/C/D (movement), E (CNL), d (VPA), G/` (HPA), r (scroll region)\n\treturn input.replace(/\\x1b\\[([0-9;]*)([ABCDEGHfdr`])/g, (_match, params: string, cmd: string) => {\n\t\tconst rawParts = params.split(\";\");\n\n\t\tswitch (cmd) {\n\t\t\tcase \"B\": // Cursor down by n (default 1)\n\t\t\tcase \"E\": {\n\t\t\t\t// Cursor next line by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tconst allowed = Math.max(0, MAX_CURSOR_POSITION - cursorRow);\n\t\t\t\tconst clamped = Math.min(capped, allowed);\n\t\t\t\tcursorRow += clamped;\n\t\t\t\tif (cmd === \"E\") cursorCol = 0;\n\t\t\t\treturn `\\x1b[${clamped}${cmd}`;\n\t\t\t}\n\t\t\tcase \"A\": {\n\t\t\t\t// Cursor up by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tcursorRow = Math.max(0, cursorRow - capped);\n\t\t\t\treturn `\\x1b[${capped}A`;\n\t\t\t}\n\t\t\tcase \"C\": {\n\t\t\t\t// Cursor forward by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tconst allowed = Math.max(0, MAX_CURSOR_POSITION - cursorCol);\n\t\t\t\tconst clamped = Math.min(capped, allowed);\n\t\t\t\tcursorCol += clamped;\n\t\t\t\treturn `\\x1b[${clamped}C`;\n\t\t\t}\n\t\t\tcase \"D\": {\n\t\t\t\t// Cursor back by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tcursorCol = Math.max(0, cursorCol - capped);\n\t\t\t\treturn `\\x1b[${capped}D`;\n\t\t\t}\n\t\t\tcase \"H\":\n\t\t\tcase \"f\": {\n\t\t\t\t// Absolute cursor position: ESC[row;colH\n\t\t\t\tconst row = parsePart(rawParts[0]);\n\t\t\t\tconst col = parsePart(rawParts[1]);\n\t\t\t\tcursorRow = row != null ? Math.min(row, MAX_CURSOR_POSITION) : 1;\n\t\t\t\tcursorCol = col != null ? Math.min(col, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t\tcase \"d\": {\n\t\t\t\t// VPA - vertical position absolute\n\t\t\t\tconst row = parsePart(rawParts[0]);\n\t\t\t\tcursorRow = row != null ? Math.min(row, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}d`;\n\t\t\t}\n\t\t\tcase \"G\":\n\t\t\tcase \"`\": {\n\t\t\t\t// HPA - horizontal position absolute\n\t\t\t\tconst col = parsePart(rawParts[0]);\n\t\t\t\tcursorCol = col != null ? Math.min(col, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t\tcase \"r\": {\n\t\t\t\t// Set scroll region - cap params, no position tracking\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}r`;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Process raw terminal output through a terminal renderer, producing the clean\n * text a human would actually see on screen.\n *\n * This handles:\n * - Carriage returns (`\\r`) — progress bars overwrite the current line\n * - ANSI cursor movement — up, down, forward, backward, absolute positioning\n * - Backspace (`\\b`) — moves cursor back one position\n * - Line clearing / screen clearing escape sequences\n * - Tab stops\n *\n * The result is the final rendered state of the terminal — identical to what\n * a human would see in a real terminal after the output completes.\n *\n * Safety:\n * - Cursor positioning values are capped to prevent memory exhaustion\n * - Errors fall back to returning the raw input\n */\nexport function renderTerminalOutput(raw: string): string {\n\tif (!raw) return raw;\n\ttry {\n\t\tconst sanitized = sanitizeCursorPositioning(raw);\n\t\tconst renderer = new TerminalTextRender();\n\t\trenderer.write(sanitized);\n\t\treturn renderer.render();\n\t} catch (err) {\n\t\tconst detail = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`[dreb] terminal-render fallback: TerminalTextRender failed (${detail}), returning raw output`);\n\t\treturn raw;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"terminal-render.js","sourceRoot":"","sources":["../../../src/core/tools/terminal-render.ts"],"names":[],"mappings":"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","sourcesContent":["import { TerminalTextRender } from \"terminal-render\";\nimport { log } from \"../logger.js\";\n\n/**\n * Maximum row or column value allowed in ANSI cursor positioning sequences.\n * Anything larger gets capped to this value to prevent memory exhaustion from\n * malicious sequences like `ESC[9999999;1H`.\n */\nconst MAX_CURSOR_POSITION = 5000;\n\n/**\n * Sanitize ANSI cursor positioning sequences to prevent memory exhaustion.\n *\n * Sequences like `ESC[9999999;1H` can cause TerminalTextRender to allocate\n * millions of empty lines. This function caps row/column values in:\n * - CUP (cursor position): ESC[<row>;<col>H or ESC[<row>;<col>f\n * - CUU/CUD/CUF/CUB (cursor movement): ESC[<n>A/B/C/D\n * - CNL (cursor next line): ESC[<n>E\n * - VPA (vertical position absolute): ESC[<row>d\n * - HPA (horizontal position absolute): ESC[<col>G or ESC[<col>`\n *\n * In addition to per-sequence caps, this tracks cumulative cursor position\n * to prevent accumulation attacks where many sequences each at the per-sequence\n * cap combine to push the cursor to millions of rows/columns, triggering OOM\n * via array allocation in the terminal renderer.\n */\nexport function sanitizeCursorPositioning(input: string): string {\n\t// Track cumulative cursor position across sequences. An attacker can send\n\t// thousands of ESC[5000B sequences, each passing the per-sequence cap but\n\t// accumulating to ~55M rows. By tracking position, we clamp movement that\n\t// would exceed the limit.\n\tlet cursorRow = 0;\n\tlet cursorCol = 0;\n\n\tconst parsePart = (p: string | undefined): number | null => {\n\t\tif (p === undefined) return null;\n\t\tconst n = Number.parseInt(p, 10);\n\t\treturn Number.isNaN(n) ? null : n;\n\t};\n\n\t// Cap all numeric params individually and rebuild the param string\n\tconst capParams = (rawParts: string[]) =>\n\t\trawParts\n\t\t\t.map((p: string) => {\n\t\t\t\tconst n = Number.parseInt(p, 10);\n\t\t\t\tif (Number.isNaN(n)) return p;\n\t\t\t\treturn String(Math.min(n, MAX_CURSOR_POSITION));\n\t\t\t})\n\t\t\t.join(\";\");\n\n\t// Match CSI sequences: ESC[ followed by params and a final byte\n\t// Covers H, f (CUP), A/B/C/D (movement), E (CNL), d (VPA), G/` (HPA), r (scroll region)\n\treturn input.replace(/\\x1b\\[([0-9;]*)([ABCDEGHfdr`])/g, (_match, params: string, cmd: string) => {\n\t\tconst rawParts = params.split(\";\");\n\n\t\tswitch (cmd) {\n\t\t\tcase \"B\": // Cursor down by n (default 1)\n\t\t\tcase \"E\": {\n\t\t\t\t// Cursor next line by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tconst allowed = Math.max(0, MAX_CURSOR_POSITION - cursorRow);\n\t\t\t\tconst clamped = Math.min(capped, allowed);\n\t\t\t\tcursorRow += clamped;\n\t\t\t\tif (cmd === \"E\") cursorCol = 0;\n\t\t\t\treturn `\\x1b[${clamped}${cmd}`;\n\t\t\t}\n\t\t\tcase \"A\": {\n\t\t\t\t// Cursor up by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tcursorRow = Math.max(0, cursorRow - capped);\n\t\t\t\treturn `\\x1b[${capped}A`;\n\t\t\t}\n\t\t\tcase \"C\": {\n\t\t\t\t// Cursor forward by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tconst allowed = Math.max(0, MAX_CURSOR_POSITION - cursorCol);\n\t\t\t\tconst clamped = Math.min(capped, allowed);\n\t\t\t\tcursorCol += clamped;\n\t\t\t\treturn `\\x1b[${clamped}C`;\n\t\t\t}\n\t\t\tcase \"D\": {\n\t\t\t\t// Cursor back by n (default 1)\n\t\t\t\tconst n = parsePart(rawParts[0]) ?? 1;\n\t\t\t\tconst capped = Math.min(n, MAX_CURSOR_POSITION);\n\t\t\t\tcursorCol = Math.max(0, cursorCol - capped);\n\t\t\t\treturn `\\x1b[${capped}D`;\n\t\t\t}\n\t\t\tcase \"H\":\n\t\t\tcase \"f\": {\n\t\t\t\t// Absolute cursor position: ESC[row;colH\n\t\t\t\tconst row = parsePart(rawParts[0]);\n\t\t\t\tconst col = parsePart(rawParts[1]);\n\t\t\t\tcursorRow = row != null ? Math.min(row, MAX_CURSOR_POSITION) : 1;\n\t\t\t\tcursorCol = col != null ? Math.min(col, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t\tcase \"d\": {\n\t\t\t\t// VPA - vertical position absolute\n\t\t\t\tconst row = parsePart(rawParts[0]);\n\t\t\t\tcursorRow = row != null ? Math.min(row, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}d`;\n\t\t\t}\n\t\t\tcase \"G\":\n\t\t\tcase \"`\": {\n\t\t\t\t// HPA - horizontal position absolute\n\t\t\t\tconst col = parsePart(rawParts[0]);\n\t\t\t\tcursorCol = col != null ? Math.min(col, MAX_CURSOR_POSITION) : 1;\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t\tcase \"r\": {\n\t\t\t\t// Set scroll region - cap params, no position tracking\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}r`;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn `\\x1b[${capParams(rawParts)}${cmd}`;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Process raw terminal output through a terminal renderer, producing the clean\n * text a human would actually see on screen.\n *\n * This handles:\n * - Carriage returns (`\\r`) — progress bars overwrite the current line\n * - ANSI cursor movement — up, down, forward, backward, absolute positioning\n * - Backspace (`\\b`) — moves cursor back one position\n * - Line clearing / screen clearing escape sequences\n * - Tab stops\n *\n * The result is the final rendered state of the terminal — identical to what\n * a human would see in a real terminal after the output completes.\n *\n * Safety:\n * - Cursor positioning values are capped to prevent memory exhaustion\n * - Errors fall back to returning the raw input\n */\nexport function renderTerminalOutput(raw: string): string {\n\tif (!raw) return raw;\n\ttry {\n\t\tconst sanitized = sanitizeCursorPositioning(raw);\n\t\tconst renderer = new TerminalTextRender();\n\t\trenderer.write(sanitized);\n\t\treturn renderer.render();\n\t} catch (err) {\n\t\tconst detail = err instanceof Error ? err.message : String(err);\n\t\tlog.debug(`[dreb] terminal-render fallback: TerminalTextRender failed (${detail}), returning raw output`);\n\t\treturn raw;\n\t}\n}\n"]}
|