@prestyj/cli 5.3.0 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/app-sidecar.js +696 -59
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/agent-session-compaction.test.js +138 -0
  6. package/dist/core/agent-session-compaction.test.js.map +1 -1
  7. package/dist/core/agent-session.d.ts +71 -3
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +280 -47
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/autopilot-cycle.d.ts +69 -17
  12. package/dist/core/autopilot-cycle.d.ts.map +1 -1
  13. package/dist/core/autopilot-cycle.js +82 -13
  14. package/dist/core/autopilot-cycle.js.map +1 -1
  15. package/dist/core/autopilot-cycle.test.js +206 -10
  16. package/dist/core/autopilot-cycle.test.js.map +1 -1
  17. package/dist/core/autopilot-gate.d.ts +48 -22
  18. package/dist/core/autopilot-gate.d.ts.map +1 -1
  19. package/dist/core/autopilot-gate.js +110 -1
  20. package/dist/core/autopilot-gate.js.map +1 -1
  21. package/dist/core/autopilot-gate.test.js +139 -3
  22. package/dist/core/autopilot-gate.test.js.map +1 -1
  23. package/dist/core/autopilot-verdict.d.ts +6 -0
  24. package/dist/core/autopilot-verdict.d.ts.map +1 -1
  25. package/dist/core/autopilot-verdict.js +75 -1
  26. package/dist/core/autopilot-verdict.js.map +1 -1
  27. package/dist/core/autopilot-verdict.test.js +63 -0
  28. package/dist/core/autopilot-verdict.test.js.map +1 -1
  29. package/dist/core/bash-spawn-benchmark.d.ts +2 -0
  30. package/dist/core/bash-spawn-benchmark.d.ts.map +1 -0
  31. package/dist/core/bash-spawn-benchmark.js +139 -0
  32. package/dist/core/bash-spawn-benchmark.js.map +1 -0
  33. package/dist/core/compaction/compactor.test.js +1 -1
  34. package/dist/core/compaction/compactor.test.js.map +1 -1
  35. package/dist/core/fast-apply-benchmark.d.ts +1 -1
  36. package/dist/core/fast-apply-benchmark.js +2 -2
  37. package/dist/core/fast-apply-benchmark.js.map +1 -1
  38. package/dist/core/hashline-edit-benchmark.d.ts +33 -1
  39. package/dist/core/hashline-edit-benchmark.d.ts.map +1 -1
  40. package/dist/core/hashline-edit-benchmark.js +193 -21
  41. package/dist/core/hashline-edit-benchmark.js.map +1 -1
  42. package/dist/core/hashline-edit-benchmark.test.js +51 -2
  43. package/dist/core/hashline-edit-benchmark.test.js.map +1 -1
  44. package/dist/core/mcp/deferred-catalog.d.ts +28 -0
  45. package/dist/core/mcp/deferred-catalog.d.ts.map +1 -0
  46. package/dist/core/mcp/deferred-catalog.js +72 -0
  47. package/dist/core/mcp/deferred-catalog.js.map +1 -0
  48. package/dist/core/mcp/resolve-stdio.d.ts +19 -3
  49. package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
  50. package/dist/core/mcp/resolve-stdio.js +136 -5
  51. package/dist/core/mcp/resolve-stdio.js.map +1 -1
  52. package/dist/core/mcp/resolve-stdio.test.js +82 -1
  53. package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
  54. package/dist/core/nolan-context.d.ts +26 -2
  55. package/dist/core/nolan-context.d.ts.map +1 -1
  56. package/dist/core/nolan-context.js +46 -4
  57. package/dist/core/nolan-context.js.map +1 -1
  58. package/dist/core/nolan-context.test.js +53 -12
  59. package/dist/core/nolan-context.test.js.map +1 -1
  60. package/dist/core/nolan-prompt.d.ts +2 -15
  61. package/dist/core/nolan-prompt.d.ts.map +1 -1
  62. package/dist/core/nolan-prompt.js +96 -15
  63. package/dist/core/nolan-prompt.js.map +1 -1
  64. package/dist/core/nolan-prompt.test.js +102 -7
  65. package/dist/core/nolan-prompt.test.js.map +1 -1
  66. package/dist/core/persistent-shell.d.ts +27 -0
  67. package/dist/core/persistent-shell.d.ts.map +1 -0
  68. package/dist/core/persistent-shell.js +150 -0
  69. package/dist/core/persistent-shell.js.map +1 -0
  70. package/dist/core/persistent-shell.test.d.ts +2 -0
  71. package/dist/core/persistent-shell.test.d.ts.map +1 -0
  72. package/dist/core/persistent-shell.test.js +84 -0
  73. package/dist/core/persistent-shell.test.js.map +1 -0
  74. package/dist/core/process-manager-dev-server-repro.test.js +34 -6
  75. package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
  76. package/dist/core/progress/engine.d.ts +23 -0
  77. package/dist/core/progress/engine.d.ts.map +1 -0
  78. package/dist/core/progress/engine.js +131 -0
  79. package/dist/core/progress/engine.js.map +1 -0
  80. package/dist/core/progress/engine.test.d.ts +2 -0
  81. package/dist/core/progress/engine.test.d.ts.map +1 -0
  82. package/dist/core/progress/engine.test.js +136 -0
  83. package/dist/core/progress/engine.test.js.map +1 -0
  84. package/dist/core/progress/git-xp.d.ts +16 -0
  85. package/dist/core/progress/git-xp.d.ts.map +1 -0
  86. package/dist/core/progress/git-xp.js +106 -0
  87. package/dist/core/progress/git-xp.js.map +1 -0
  88. package/dist/core/progress/git-xp.test.d.ts +2 -0
  89. package/dist/core/progress/git-xp.test.d.ts.map +1 -0
  90. package/dist/core/progress/git-xp.test.js +88 -0
  91. package/dist/core/progress/git-xp.test.js.map +1 -0
  92. package/dist/core/progress/ranks.d.ts +21 -0
  93. package/dist/core/progress/ranks.d.ts.map +1 -0
  94. package/dist/core/progress/ranks.js +141 -0
  95. package/dist/core/progress/ranks.js.map +1 -0
  96. package/dist/core/progress/ranks.test.d.ts +2 -0
  97. package/dist/core/progress/ranks.test.d.ts.map +1 -0
  98. package/dist/core/progress/ranks.test.js +59 -0
  99. package/dist/core/progress/ranks.test.js.map +1 -0
  100. package/dist/core/progress/rebuild.d.ts +9 -0
  101. package/dist/core/progress/rebuild.d.ts.map +1 -0
  102. package/dist/core/progress/rebuild.js +119 -0
  103. package/dist/core/progress/rebuild.js.map +1 -0
  104. package/dist/core/progress/rebuild.test.d.ts +2 -0
  105. package/dist/core/progress/rebuild.test.d.ts.map +1 -0
  106. package/dist/core/progress/rebuild.test.js +88 -0
  107. package/dist/core/progress/rebuild.test.js.map +1 -0
  108. package/dist/core/progress/store.d.ts +35 -0
  109. package/dist/core/progress/store.d.ts.map +1 -0
  110. package/dist/core/progress/store.js +200 -0
  111. package/dist/core/progress/store.js.map +1 -0
  112. package/dist/core/progress/store.test.d.ts +2 -0
  113. package/dist/core/progress/store.test.d.ts.map +1 -0
  114. package/dist/core/progress/store.test.js +108 -0
  115. package/dist/core/progress/store.test.js.map +1 -0
  116. package/dist/core/progress/types.d.ts +108 -0
  117. package/dist/core/progress/types.d.ts.map +1 -0
  118. package/dist/core/progress/types.js +3 -0
  119. package/dist/core/progress/types.js.map +1 -0
  120. package/dist/core/project-discovery.d.ts.map +1 -1
  121. package/dist/core/project-discovery.js +40 -9
  122. package/dist/core/project-discovery.js.map +1 -1
  123. package/dist/core/project-discovery.test.d.ts +2 -0
  124. package/dist/core/project-discovery.test.d.ts.map +1 -0
  125. package/dist/core/project-discovery.test.js +104 -0
  126. package/dist/core/project-discovery.test.js.map +1 -0
  127. package/dist/core/session-history.d.ts +51 -0
  128. package/dist/core/session-history.d.ts.map +1 -0
  129. package/dist/core/session-history.js +156 -0
  130. package/dist/core/session-history.js.map +1 -0
  131. package/dist/core/session-history.test.d.ts +2 -0
  132. package/dist/core/session-history.test.d.ts.map +1 -0
  133. package/dist/core/session-history.test.js +101 -0
  134. package/dist/core/session-history.test.js.map +1 -0
  135. package/dist/core/session-manager.d.ts +34 -0
  136. package/dist/core/session-manager.d.ts.map +1 -1
  137. package/dist/core/session-manager.js +67 -0
  138. package/dist/core/session-manager.js.map +1 -1
  139. package/dist/core/session-manager.test.js +140 -1
  140. package/dist/core/session-manager.test.js.map +1 -1
  141. package/dist/core/settings-manager.d.ts +1 -0
  142. package/dist/core/settings-manager.d.ts.map +1 -1
  143. package/dist/core/settings-manager.js +4 -0
  144. package/dist/core/settings-manager.js.map +1 -1
  145. package/dist/system-prompt.d.ts.map +1 -1
  146. package/dist/system-prompt.js +12 -8
  147. package/dist/system-prompt.js.map +1 -1
  148. package/dist/system-prompt.test.js +15 -20
  149. package/dist/system-prompt.test.js.map +1 -1
  150. package/dist/tools/bash.d.ts +1 -0
  151. package/dist/tools/bash.d.ts.map +1 -1
  152. package/dist/tools/bash.js +27 -2
  153. package/dist/tools/bash.js.map +1 -1
  154. package/dist/tools/edit.d.ts +9 -2
  155. package/dist/tools/edit.d.ts.map +1 -1
  156. package/dist/tools/edit.js +91 -10
  157. package/dist/tools/edit.js.map +1 -1
  158. package/dist/tools/edit.test.js +97 -0
  159. package/dist/tools/edit.test.js.map +1 -1
  160. package/dist/tools/plan-mode.test.js +25 -0
  161. package/dist/tools/plan-mode.test.js.map +1 -1
  162. package/dist/tools/prompt-hints.d.ts.map +1 -1
  163. package/dist/tools/prompt-hints.js +3 -0
  164. package/dist/tools/prompt-hints.js.map +1 -1
  165. package/dist/tools/subagent.d.ts +2 -0
  166. package/dist/tools/subagent.d.ts.map +1 -1
  167. package/dist/tools/subagent.js +213 -194
  168. package/dist/tools/subagent.js.map +1 -1
  169. package/dist/tools/subagent.test.d.ts +2 -0
  170. package/dist/tools/subagent.test.d.ts.map +1 -0
  171. package/dist/tools/subagent.test.js +73 -0
  172. package/dist/tools/subagent.test.js.map +1 -0
  173. package/dist/tools/tool-search.d.ts +15 -0
  174. package/dist/tools/tool-search.d.ts.map +1 -0
  175. package/dist/tools/tool-search.js +35 -0
  176. package/dist/tools/tool-search.js.map +1 -0
  177. package/dist/ui/components/Footer.js +3 -3
  178. package/dist/ui/components/Footer.js.map +1 -1
  179. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  180. package/dist/ui/hooks/useAgentLoop.js +22 -9
  181. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  182. package/package.json +4 -4
@@ -3,9 +3,29 @@ import { createInterface } from "node:readline";
3
3
  import { existsSync } from "node:fs";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { z } from "zod";
6
+ import { getFastModel } from "../core/model-registry.js";
6
7
  import { log } from "../core/logger.js";
7
8
  import { truncateTail } from "./truncate.js";
8
9
  import { getActiveGoalMode, goalModeSubagentRestriction, isPlanModeActive, planModeRestriction, } from "../core/runtime-mode.js";
10
+ // Tools that can mutate the workspace. A named agent whose allow-list contains
11
+ // none of these is a read-only scout (recon/research) — safe to route to the
12
+ // provider's fast/cheap model. An agent that can write/edit keeps the parent
13
+ // model so code changes never regress in quality.
14
+ const MUTATING_TOOLS = new Set(["write", "edit"]);
15
+ /**
16
+ * True when the sub-agent is a read-only scout: an explicit named agent with a
17
+ * non-empty tool allow-list that grants no mutating tool. A subagent call with
18
+ * no `agent` (full toolset) is NOT read-only — it keeps the parent model.
19
+ */
20
+ function isReadOnlyAgent(agentDef) {
21
+ if (!agentDef || agentDef.tools.length === 0)
22
+ return false;
23
+ return !agentDef.tools.some((tool) => MUTATING_TOOLS.has(tool.toLowerCase()));
24
+ }
25
+ /** Only retry errors that specifically mean the selected model cannot be used. */
26
+ export function isModelUnavailableError(stderr) {
27
+ return /does not recognize the requested model|requested model[^\n]*(?:not available|no access)|model[^\n]*(?:does not exist|not found|not available)/i.test(stderr);
28
+ }
9
29
  const SUB_AGENT_MAX_TURNS = 50;
10
30
  const SUB_AGENT_MAX_OUTPUT_CHARS = 100_000; // ~25k tokens, matches other tool limits
11
31
  const SUB_AGENT_MAX_OUTPUT_LINES = 500;
@@ -64,225 +84,224 @@ export function createSubAgentTool(cwd, agents, getParentProvider, getParentMode
64
84
  }
65
85
  }
66
86
  const useProvider = getParentProvider();
67
- const useModel = getParentModel();
68
- // Build CLI args limit turns to prevent runaway context growth
69
- const cliArgs = [
70
- "--json",
71
- "--provider",
72
- useProvider,
73
- "--model",
74
- useModel,
75
- "--max-turns",
76
- String(SUB_AGENT_MAX_TURNS),
77
- ];
78
- // Inherit parent's cache-routing key so all sub-agents in one parent run
79
- // share the same prompt_cache_key prefix instead of each spawning with a
80
- // fresh sessionId-derived key (cold cache every time). Suffix the key so
81
- // the parent and its sub-agents route to distinct shards but each share
82
- // among themselves.
87
+ // Read-only scouts (recon/research) run on the provider's fast/cheap model
88
+ // lower TTFT + spend, no quality risk since they never edit code.
89
+ // Agents that can write, and default (unnamed) sub-agents, keep the
90
+ // parent model.
91
+ const parentModel = getParentModel();
92
+ const useModel = isReadOnlyAgent(agentDef)
93
+ ? getFastModel(useProvider, parentModel).id
94
+ : parentModel;
83
95
  const parentCacheKey = getParentCacheKey?.();
84
- if (parentCacheKey) {
85
- cliArgs.push("--prompt-cache-key", `${parentCacheKey}:subagent`);
86
- }
87
- if (agentDef?.systemPrompt) {
88
- cliArgs.push("--system-prompt", agentDef.systemPrompt);
89
- }
90
- // Forward the agent's declared tool allow-list to the child so its tool
91
- // set is filtered to exactly these names (see AgentSession.allowedTools).
92
- // Empty/unset → the child keeps the full toolset (backward compatible),
93
- // so agents with no `tools:` frontmatter behave exactly as before.
94
- if (agentDef?.tools && agentDef.tools.length > 0) {
95
- cliArgs.push("--tools", agentDef.tools.join(","));
96
- }
97
- cliArgs.push(args.task);
98
- // Spawn the ezcoder CLI as a child process. We must run the CLI entry
99
- // (dist/cli.js, the JSON-mode agent runner), NOT process.argv[1]: in the
100
- // desktop app the host process is app-sidecar.js, which ignores CLI args
101
- // and just boots another HTTP server — the sub-agent would then emit no
102
- // NDJSON and hang until the hard timeout. cli.js sits one level up from
103
- // this module (dist/tools/subagent.js → dist/cli.js); fall back to
104
- // argv[1] only if that resolution somehow misses.
105
- const child = spawn(process.execPath, [resolveCliEntry(), ...cliArgs], {
106
- cwd,
107
- stdio: ["ignore", "pipe", "pipe"],
108
- env: { ...process.env },
109
- });
110
- // Track progress
96
+ const subCacheKey = parentCacheKey ? `${parentCacheKey}:subagent` : "(unset)";
97
+ const buildCliArgs = (model) => {
98
+ const cliArgs = [
99
+ "--json",
100
+ "--provider",
101
+ useProvider,
102
+ "--model",
103
+ model,
104
+ "--max-turns",
105
+ String(SUB_AGENT_MAX_TURNS),
106
+ ];
107
+ // Inherit parent's cache-routing key so all sub-agents in one parent run
108
+ // share the same prompt_cache_key prefix instead of each spawning with a
109
+ // fresh sessionId-derived key (cold cache every time).
110
+ if (parentCacheKey) {
111
+ cliArgs.push("--prompt-cache-key", `${parentCacheKey}:subagent`);
112
+ }
113
+ if (agentDef?.systemPrompt) {
114
+ cliArgs.push("--system-prompt", agentDef.systemPrompt);
115
+ }
116
+ if (agentDef?.tools.length) {
117
+ cliArgs.push("--tools", agentDef.tools.join(","));
118
+ }
119
+ cliArgs.push(args.task);
120
+ return cliArgs;
121
+ };
122
+ // Track progress across both attempts. The cheap-model attempt can only
123
+ // fall back before producing output or using a tool, so these totals remain
124
+ // an accurate picture of the actual agent run.
111
125
  let toolUseCount = 0;
112
126
  const tokenUsage = { input: 0, output: 0 };
113
127
  const cacheTotals = { read: 0, write: 0 };
114
128
  let turnCount = 0;
115
129
  let currentActivity;
116
130
  let textOutput = "";
117
- // Set when the child emits the terminal `max_turns` signal — the sub-agent
118
- // hit its turn budget mid-task, so its final answer may be incomplete. We
119
- // prepend a notice to the returned content so the parent doesn't treat a
120
- // cut-off run as a finished one.
121
131
  let hitMaxTurns = false;
122
132
  let maxTurnsLimit = 0;
123
- // Mirror the child sub-agent's cache key into the parent log so
124
- // `grep cacheRead ~/.ezcoder/debug.log` shows whether sub-agents are
125
- // hitting the cache. JSON mode in the child has no logger of its
126
- // own (concurrent writes would corrupt the shared file), so the
127
- // parent is the only place this can be observed.
128
- const subCacheKey = parentCacheKey ? `${parentCacheKey}:subagent` : "(unset)";
129
- log("INFO", "subagent", "Sub-agent spawn", {
130
- cacheKey: subCacheKey,
131
- provider: useProvider,
132
- model: useModel,
133
- agent: agentDef?.name ?? "(default)",
134
- });
135
- // Track whether the child has actually exited
136
- let childExited = false;
137
- const killChild = () => {
138
- if (childExited)
133
+ let activeChild;
134
+ let activeChildExited = true;
135
+ const killActiveChild = () => {
136
+ const child = activeChild;
137
+ if (!child || activeChildExited)
139
138
  return;
140
139
  child.kill("SIGTERM");
141
140
  setTimeout(() => {
142
- if (!childExited)
141
+ if (activeChild === child && !activeChildExited)
143
142
  child.kill("SIGKILL");
144
143
  }, 3000);
145
144
  };
146
- // Handle abort signal
147
- const abortHandler = () => killChild();
145
+ const abortHandler = () => killActiveChild();
148
146
  context.signal.addEventListener("abort", abortHandler, { once: true });
149
- // If already aborted (e.g. reset happened before we got here), kill immediately
150
- if (context.signal.aborted)
151
- killChild();
152
147
  return new Promise((resolve) => {
153
- // Hard timeout to prevent subagents from hanging indefinitely
154
- const timeout = setTimeout(() => {
155
- killChild();
156
- }, SUB_AGENT_TIMEOUT_MS);
157
- // Read NDJSON from stdout
158
- const rl = createInterface({ input: child.stdout });
159
- rl.on("line", (line) => {
160
- try {
161
- const event = JSON.parse(line);
162
- const type = event.type;
163
- switch (type) {
164
- case "text_delta":
165
- // Cap accumulation to ~2x the truncation limit (keeps tail for truncateTail)
166
- if (textOutput.length < SUB_AGENT_MAX_OUTPUT_CHARS * 2) {
167
- textOutput += event.text;
168
- }
169
- else if (!textOutput.endsWith("[output capped]")) {
170
- textOutput += "\n[output capped]";
171
- }
172
- break;
173
- case "tool_call_start":
174
- toolUseCount++;
175
- currentActivity = formatToolActivity(event.name, event.args);
176
- context.onUpdate?.({
177
- toolUseCount,
178
- tokenUsage: { ...tokenUsage },
179
- currentActivity,
180
- });
181
- break;
182
- case "tool_call_end":
183
- break;
184
- case "max_turns":
185
- hitMaxTurns = true;
186
- maxTurnsLimit = Number(event.maxTurns) || SUB_AGENT_MAX_TURNS;
187
- break;
188
- case "turn_end": {
189
- const usage = event.usage;
190
- if (usage) {
191
- tokenUsage.input += usage.inputTokens;
192
- tokenUsage.output += usage.outputTokens;
193
- if (usage.cacheRead)
194
- cacheTotals.read += usage.cacheRead;
195
- if (usage.cacheWrite)
196
- cacheTotals.write += usage.cacheWrite;
197
- turnCount++;
198
- // Per-turn line lets you eyeball cache health turn-by-turn
199
- // when debugging a runaway sub-agent. The aggregate sum on
200
- // close is also useful but hides the curve.
201
- log("INFO", "subagent", "Sub-agent turn", {
202
- turn: turnCount,
203
- inputTokens: String(usage.inputTokens),
204
- outputTokens: String(usage.outputTokens),
205
- ...(usage.cacheRead != null && { cacheRead: String(usage.cacheRead) }),
206
- ...(usage.cacheWrite != null && { cacheWrite: String(usage.cacheWrite) }),
148
+ const finish = (result) => {
149
+ context.signal.removeEventListener("abort", abortHandler);
150
+ resolve(result);
151
+ };
152
+ const startAttempt = (model, fallbackFrom) => {
153
+ // Spawn the CLI entry, not process.argv[1]: the desktop host is the
154
+ // app sidecar and does not understand JSON-mode agent arguments.
155
+ const child = spawn(process.execPath, [resolveCliEntry(), ...buildCliArgs(model)], {
156
+ cwd,
157
+ stdio: ["ignore", "pipe", "pipe"],
158
+ env: { ...process.env },
159
+ });
160
+ activeChild = child;
161
+ activeChildExited = false;
162
+ log("INFO", "subagent", "Sub-agent spawn", {
163
+ cacheKey: subCacheKey,
164
+ provider: useProvider,
165
+ model,
166
+ agent: agentDef?.name ?? "(default)",
167
+ ...(fallbackFrom && { fallbackFrom }),
168
+ });
169
+ // Both attempts share the original hard timeout; a retry never doubles
170
+ // the maximum runtime of one sub-agent call.
171
+ const remainingMs = Math.max(1, SUB_AGENT_TIMEOUT_MS - (Date.now() - startTime));
172
+ const timeout = setTimeout(killActiveChild, remainingMs);
173
+ const rl = createInterface({ input: child.stdout });
174
+ rl.on("line", (line) => {
175
+ try {
176
+ const event = JSON.parse(line);
177
+ const type = event.type;
178
+ switch (type) {
179
+ case "text_delta":
180
+ if (textOutput.length < SUB_AGENT_MAX_OUTPUT_CHARS * 2) {
181
+ textOutput += event.text;
182
+ }
183
+ else if (!textOutput.endsWith("[output capped]")) {
184
+ textOutput += "\n[output capped]";
185
+ }
186
+ break;
187
+ case "tool_call_start":
188
+ toolUseCount++;
189
+ currentActivity = formatToolActivity(event.name, event.args);
190
+ context.onUpdate?.({
191
+ toolUseCount,
192
+ tokenUsage: { ...tokenUsage },
193
+ currentActivity,
194
+ });
195
+ break;
196
+ case "tool_call_end":
197
+ break;
198
+ case "max_turns":
199
+ hitMaxTurns = true;
200
+ maxTurnsLimit = Number(event.maxTurns) || SUB_AGENT_MAX_TURNS;
201
+ break;
202
+ case "turn_end": {
203
+ const usage = event.usage;
204
+ if (usage) {
205
+ tokenUsage.input += usage.inputTokens;
206
+ tokenUsage.output += usage.outputTokens;
207
+ if (usage.cacheRead)
208
+ cacheTotals.read += usage.cacheRead;
209
+ if (usage.cacheWrite)
210
+ cacheTotals.write += usage.cacheWrite;
211
+ turnCount++;
212
+ log("INFO", "subagent", "Sub-agent turn", {
213
+ turn: turnCount,
214
+ inputTokens: String(usage.inputTokens),
215
+ outputTokens: String(usage.outputTokens),
216
+ ...(usage.cacheRead != null && { cacheRead: String(usage.cacheRead) }),
217
+ ...(usage.cacheWrite != null && { cacheWrite: String(usage.cacheWrite) }),
218
+ });
219
+ }
220
+ context.onUpdate?.({
221
+ toolUseCount,
222
+ tokenUsage: { ...tokenUsage },
223
+ currentActivity,
207
224
  });
225
+ break;
208
226
  }
209
- context.onUpdate?.({
210
- toolUseCount,
211
- tokenUsage: { ...tokenUsage },
212
- currentActivity,
213
- });
214
- break;
215
227
  }
216
228
  }
217
- }
218
- catch {
219
- // Skip malformed lines
220
- }
221
- });
222
- // Collect stderr (capped to prevent unbounded memory growth)
223
- let stderr = "";
224
- child.stderr?.on("data", (chunk) => {
225
- if (stderr.length < SUB_AGENT_MAX_STDERR_CHARS) {
226
- stderr += chunk.toString();
227
- if (stderr.length > SUB_AGENT_MAX_STDERR_CHARS) {
228
- stderr = stderr.slice(0, SUB_AGENT_MAX_STDERR_CHARS);
229
+ catch {
230
+ // Skip malformed lines.
229
231
  }
230
- }
231
- });
232
- child.on("close", (code) => {
233
- childExited = true;
234
- clearTimeout(timeout);
235
- rl.close();
236
- context.signal.removeEventListener("abort", abortHandler);
237
- const durationMs = Date.now() - startTime;
238
- const details = {
239
- toolUseCount,
240
- tokenUsage: { ...tokenUsage },
241
- durationMs,
242
- };
243
- // Roll-up. Total cacheRead vs cumulative input shows whether the
244
- // cache key propagation actually saved tokens — read this number,
245
- // not the raw input sum, to judge regressions.
246
- log("INFO", "subagent", "Sub-agent done", {
247
- durationMs: String(durationMs),
248
- turns: String(turnCount),
249
- toolUseCount: String(toolUseCount),
250
- inputTokens: String(tokenUsage.input),
251
- outputTokens: String(tokenUsage.output),
252
- cacheRead: String(cacheTotals.read),
253
- cacheWrite: String(cacheTotals.write),
254
- exitCode: String(code),
255
232
  });
256
- if (code !== 0 && !textOutput) {
257
- resolve({
258
- content: `Sub-agent failed (exit ${code}): ${stderr.trim() || "unknown error"}`,
259
- details,
233
+ let stderr = "";
234
+ child.stderr?.on("data", (chunk) => {
235
+ if (stderr.length >= SUB_AGENT_MAX_STDERR_CHARS)
236
+ return;
237
+ stderr = (stderr + chunk.toString()).slice(0, SUB_AGENT_MAX_STDERR_CHARS);
238
+ });
239
+ child.on("close", (code) => {
240
+ if (activeChild === child)
241
+ activeChildExited = true;
242
+ clearTimeout(timeout);
243
+ rl.close();
244
+ const canFallback = model !== parentModel &&
245
+ code !== 0 &&
246
+ !textOutput &&
247
+ turnCount === 0 &&
248
+ toolUseCount === 0 &&
249
+ !context.signal.aborted &&
250
+ isModelUnavailableError(stderr);
251
+ if (canFallback) {
252
+ log("WARN", "subagent", "Cheap sub-agent model unavailable; retrying parent", {
253
+ provider: useProvider,
254
+ model,
255
+ fallbackModel: parentModel,
256
+ });
257
+ startAttempt(parentModel, model);
258
+ return;
259
+ }
260
+ const durationMs = Date.now() - startTime;
261
+ const details = {
262
+ toolUseCount,
263
+ tokenUsage: { ...tokenUsage },
264
+ durationMs,
265
+ };
266
+ log("INFO", "subagent", "Sub-agent done", {
267
+ durationMs: String(durationMs),
268
+ turns: String(turnCount),
269
+ toolUseCount: String(toolUseCount),
270
+ inputTokens: String(tokenUsage.input),
271
+ outputTokens: String(tokenUsage.output),
272
+ cacheRead: String(cacheTotals.read),
273
+ cacheWrite: String(cacheTotals.write),
274
+ exitCode: String(code),
275
+ model,
260
276
  });
261
- return;
262
- }
263
- // Truncate output to prevent blowing up parent's context
264
- const raw = textOutput || "(no output)";
265
- const result = truncateTail(raw, SUB_AGENT_MAX_OUTPUT_LINES, SUB_AGENT_MAX_OUTPUT_CHARS);
266
- const body = result.truncated
267
- ? `[Sub-agent output truncated: ${result.totalLines} total lines, showing last ${result.keptLines}]\n\n` +
268
- result.content
269
- : result.content;
270
- // Prepend the cut-off notice so the parent knows this run stopped
271
- // mid-task and shouldn't be trusted as a completed result.
272
- const content = hitMaxTurns
273
- ? `[Sub-agent reached its ${maxTurnsLimit}-turn limit — it stopped mid-task and this output may be incomplete.]\n\n${body}`
274
- : body;
275
- resolve({ content, details });
276
- });
277
- child.on("error", (err) => {
278
- childExited = true;
279
- clearTimeout(timeout);
280
- rl.close();
281
- context.signal.removeEventListener("abort", abortHandler);
282
- resolve({
283
- content: `Failed to spawn sub-agent: ${err.message}`,
277
+ if (code !== 0 && !textOutput) {
278
+ finish({
279
+ content: `Sub-agent failed (exit ${code}): ${stderr.trim() || "unknown error"}`,
280
+ details,
281
+ });
282
+ return;
283
+ }
284
+ const raw = textOutput || "(no output)";
285
+ const result = truncateTail(raw, SUB_AGENT_MAX_OUTPUT_LINES, SUB_AGENT_MAX_OUTPUT_CHARS);
286
+ const body = result.truncated
287
+ ? `[Sub-agent output truncated: ${result.totalLines} total lines, showing last ${result.keptLines}]\n\n${result.content}`
288
+ : result.content;
289
+ const content = hitMaxTurns
290
+ ? `[Sub-agent reached its ${maxTurnsLimit}-turn limit — it stopped mid-task and this output may be incomplete.]\n\n${body}`
291
+ : body;
292
+ finish({ content, details });
293
+ });
294
+ child.on("error", (err) => {
295
+ if (activeChild === child)
296
+ activeChildExited = true;
297
+ clearTimeout(timeout);
298
+ rl.close();
299
+ finish({ content: `Failed to spawn sub-agent: ${err.message}` });
284
300
  });
285
- });
301
+ if (context.signal.aborted)
302
+ killActiveChild();
303
+ };
304
+ startAttempt(useModel);
286
305
  });
287
306
  },
288
307
  };
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AAEjC,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,kDAAkD;AAClD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAElD;;;;GAIG;AACH,SAAS,eAAe,CAAC,QAAqC;IAC5D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,OAAO,gJAAgJ,CAAC,IAAI,CAC1J,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,0BAA0B,GAAG,OAAO,CAAC,CAAC,yCAAyC;AACrF,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,0BAA0B,GAAG,MAAM,CAAC,CAAC,yCAAyC;AACpF,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,yBAAyB;AAEtE;;;;;GAKG;AACH,SAAS,eAAe;IACtB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IAClE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6EAA6E,CAAC;CAC3F,CAAC,CAAC;AAcH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,MAAyB,EACzB,iBAA+B,EAC/B,cAA4B,EAC5B,iBAA4C,EAC5C,WAAkC,EAClC,WAAmC;IAEnC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,SAAS;QACzB,CAAC,CAAC,gCAAgC,SAAS,EAAE;QAC7C,CAAC,CAAC,iCAAiC,CAAC;IAEtC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,sSAAsS;YACtS,SAAS;QACX,UAAU,EAAE,cAAc;QAC1B,0EAA0E;QAC1E,0EAA0E;QAC1E,2EAA2E;QAC3E,iEAAiE;QACjE,6EAA6E;QAC7E,aAAa,EAAE,UAAU;QACzB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;YACzB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAChD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,OAAO,2BAA2B,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,OAAO,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,wCAAwC;YACxC,IAAI,QAAqC,CAAC;YAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,KAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBAClF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO;wBACL,OAAO,EAAE,mBAAmB,IAAI,CAAC,KAAK,wBAAwB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;qBAC/G,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;YACxC,2EAA2E;YAC3E,oEAAoE;YACpE,oEAAoE;YACpE,gBAAgB;YAChB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;gBACxC,CAAC,CAAC,YAAY,CAAC,WAAuB,EAAE,WAAW,CAAC,CAAC,EAAE;gBACvD,CAAC,CAAC,WAAW,CAAC;YAEhB,MAAM,cAAc,GAAG,iBAAiB,EAAE,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YAE9E,MAAM,YAAY,GAAG,CAAC,KAAa,EAAY,EAAE;gBAC/C,MAAM,OAAO,GAAa;oBACxB,QAAQ;oBACR,YAAY;oBACZ,WAAW;oBACX,SAAS;oBACT,KAAK;oBACL,aAAa;oBACb,MAAM,CAAC,mBAAmB,CAAC;iBAC5B,CAAC;gBAEF,yEAAyE;gBACzE,yEAAyE;gBACzE,uDAAuD;gBACvD,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,cAAc,WAAW,CAAC,CAAC;gBACnE,CAAC;gBACD,IAAI,QAAQ,EAAE,YAAY,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;YAEF,wEAAwE;YACxE,4EAA4E;YAC5E,+CAA+C;YAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,eAAmC,CAAC;YACxC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,WAAiD,CAAC;YACtD,IAAI,iBAAiB,GAAG,IAAI,CAAC;YAE7B,MAAM,eAAe,GAAG,GAAG,EAAE;gBAC3B,MAAM,KAAK,GAAG,WAAW,CAAC;gBAC1B,IAAI,CAAC,KAAK,IAAI,iBAAiB;oBAAE,OAAO;gBACxC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,iBAAiB;wBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzE,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC,CAAC;YAEF,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,CAAC,MAAsD,EAAE,EAAE;oBACxE,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBAC1D,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC,CAAC;gBAEF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,YAAqB,EAAE,EAAE;oBAC5D,oEAAoE;oBACpE,iEAAiE;oBACjE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;wBACjF,GAAG;wBACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;wBACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;qBACxB,CAAC,CAAC;oBACH,WAAW,GAAG,KAAK,CAAC;oBACpB,iBAAiB,GAAG,KAAK,CAAC;oBAE1B,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE;wBACzC,QAAQ,EAAE,WAAW;wBACrB,QAAQ,EAAE,WAAW;wBACrB,KAAK;wBACL,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,WAAW;wBACpC,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;qBACtC,CAAC,CAAC;oBAEH,uEAAuE;oBACvE,6CAA6C;oBAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;oBACjF,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;oBACzD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAO,EAAE,CAAC,CAAC;oBACrD,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACrB,IAAI,CAAC;4BACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAc,CAAC;4BAClC,QAAQ,IAAI,EAAE,CAAC;gCACb,KAAK,YAAY;oCACf,IAAI,UAAU,CAAC,MAAM,GAAG,0BAA0B,GAAG,CAAC,EAAE,CAAC;wCACvD,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC;oCAC3B,CAAC;yCAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;wCACnD,UAAU,IAAI,mBAAmB,CAAC;oCACpC,CAAC;oCACD,MAAM;gCACR,KAAK,iBAAiB;oCACpB,YAAY,EAAE,CAAC;oCACf,eAAe,GAAG,kBAAkB,CAClC,KAAK,CAAC,IAAc,EACpB,KAAK,CAAC,IAA+B,CACtC,CAAC;oCACF,OAAO,CAAC,QAAQ,EAAE,CAAC;wCACjB,YAAY;wCACZ,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE;wCAC7B,eAAe;qCAChB,CAAC,CAAC;oCACH,MAAM;gCACR,KAAK,eAAe;oCAClB,MAAM;gCACR,KAAK,WAAW;oCACd,WAAW,GAAG,IAAI,CAAC;oCACnB,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC;oCAC9D,MAAM;gCACR,KAAK,UAAU,CAAC,CAAC,CAAC;oCAChB,MAAM,KAAK,GAAG,KAAK,CAAC,KAOP,CAAC;oCACd,IAAI,KAAK,EAAE,CAAC;wCACV,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC;wCACtC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC;wCACxC,IAAI,KAAK,CAAC,SAAS;4CAAE,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC;wCACzD,IAAI,KAAK,CAAC,UAAU;4CAAE,WAAW,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;wCAC5D,SAAS,EAAE,CAAC;wCACZ,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE;4CACxC,IAAI,EAAE,SAAS;4CACf,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;4CACtC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;4CACxC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;4CACtE,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;yCAC1E,CAAC,CAAC;oCACL,CAAC;oCACD,OAAO,CAAC,QAAQ,EAAE,CAAC;wCACjB,YAAY;wCACZ,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE;wCAC7B,eAAe;qCAChB,CAAC,CAAC;oCACH,MAAM;gCACR,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,wBAAwB;wBAC1B,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,IAAI,MAAM,GAAG,EAAE,CAAC;oBAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;wBACzC,IAAI,MAAM,CAAC,MAAM,IAAI,0BAA0B;4BAAE,OAAO;wBACxD,MAAM,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;oBAC5E,CAAC,CAAC,CAAC;oBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;wBACzB,IAAI,WAAW,KAAK,KAAK;4BAAE,iBAAiB,GAAG,IAAI,CAAC;wBACpD,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;wBAEX,MAAM,WAAW,GACf,KAAK,KAAK,WAAW;4BACrB,IAAI,KAAK,CAAC;4BACV,CAAC,UAAU;4BACX,SAAS,KAAK,CAAC;4BACf,YAAY,KAAK,CAAC;4BAClB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;4BACvB,uBAAuB,CAAC,MAAM,CAAC,CAAC;wBAClC,IAAI,WAAW,EAAE,CAAC;4BAChB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,oDAAoD,EAAE;gCAC5E,QAAQ,EAAE,WAAW;gCACrB,KAAK;gCACL,aAAa,EAAE,WAAW;6BAC3B,CAAC,CAAC;4BACH,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;4BACjC,OAAO;wBACT,CAAC;wBAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBAC1C,MAAM,OAAO,GAAoB;4BAC/B,YAAY;4BACZ,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE;4BAC7B,UAAU;yBACX,CAAC;wBACF,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE;4BACxC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;4BAC9B,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;4BACxB,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;4BAClC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;4BACrC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;4BACvC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;4BACnC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;4BACrC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;4BACtB,KAAK;yBACN,CAAC,CAAC;wBAEH,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;4BAC9B,MAAM,CAAC;gCACL,OAAO,EAAE,0BAA0B,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE;gCAC/E,OAAO;6BACR,CAAC,CAAC;4BACH,OAAO;wBACT,CAAC;wBAED,MAAM,GAAG,GAAG,UAAU,IAAI,aAAa,CAAC;wBACxC,MAAM,MAAM,GAAG,YAAY,CACzB,GAAG,EACH,0BAA0B,EAC1B,0BAA0B,CAC3B,CAAC;wBACF,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS;4BAC3B,CAAC,CAAC,gCAAgC,MAAM,CAAC,UAAU,8BAA8B,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,OAAO,EAAE;4BACzH,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;wBACnB,MAAM,OAAO,GAAG,WAAW;4BACzB,CAAC,CAAC,0BAA0B,aAAa,4EAA4E,IAAI,EAAE;4BAC3H,CAAC,CAAC,IAAI,CAAC;wBACT,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC/B,CAAC,CAAC,CAAC;oBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;wBACxB,IAAI,WAAW,KAAK,KAAK;4BAAE,iBAAiB,GAAG,IAAI,CAAC;wBACpD,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,CAAC,EAAE,OAAO,EAAE,8BAA8B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACnE,CAAC,CAAC,CAAC;oBAEH,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;wBAAE,eAAe,EAAE,CAAC;gBAChD,CAAC,CAAC;gBAEF,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,SAAS,kBAAkB,CAAC,IAAY,EAAE,IAA6B;IACrE,2DAA2D;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,WAAW,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,KAAK,OAAO;YACV,OAAO,WAAW,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM;YACT,OAAO,WAAW,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACvC,OAAO,kBAAkB,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC;QACnD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACvC,OAAO,YAAY,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC;QAC7C,CAAC;QACD,KAAK,IAAI;YACP,OAAO,WAAW,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,WAAW,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3C,CAAC;QACD,KAAK,WAAW;YACd,OAAO,YAAY,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/D,KAAK,aAAa;YAChB,OAAO,wBAAwB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/E,KAAK,aAAa;YAChB,OAAO,uBAAuB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACzE,KAAK,WAAW;YACd,OAAO,iBAAiB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACnE,KAAK,YAAY;YACf,OAAO,qBAAqB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC1E,KAAK,OAAO;YACV,OAAO,iBAAiB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,CAAC,CAAC;YACR,2DAA2D;YAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,GAAW;IACzC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subagent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.test.d.ts","sourceRoot":"","sources":["../../src/tools/subagent.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { PassThrough } from "node:stream";
3
+ import { beforeEach, describe, expect, it, vi } from "vitest";
4
+ const { spawnMock } = vi.hoisted(() => ({ spawnMock: vi.fn() }));
5
+ vi.mock("node:child_process", () => ({ spawn: spawnMock }));
6
+ import { createSubAgentTool, isModelUnavailableError } from "./subagent.js";
7
+ class MockChildProcess extends EventEmitter {
8
+ stdout = new PassThrough();
9
+ stderr = new PassThrough();
10
+ kill = vi.fn(() => true);
11
+ }
12
+ const owl = {
13
+ name: "owl",
14
+ description: "Read-only scout",
15
+ tools: ["read"],
16
+ systemPrompt: "Inspect code and report findings.",
17
+ source: "bundled",
18
+ };
19
+ function spawnedModels() {
20
+ return spawnMock.mock.calls.map(([, rawArgs]) => {
21
+ const args = rawArgs;
22
+ return args[args.indexOf("--model") + 1];
23
+ });
24
+ }
25
+ function mockExit(stderr, code, stdout = "") {
26
+ const child = new MockChildProcess();
27
+ setImmediate(() => {
28
+ if (stdout)
29
+ child.stdout.write(`${JSON.stringify({ type: "text_delta", text: stdout })}\n`);
30
+ if (stderr)
31
+ child.stderr.write(stderr);
32
+ child.stdout.end();
33
+ child.stderr.end();
34
+ child.emit("close", code);
35
+ });
36
+ return child;
37
+ }
38
+ async function runOwl() {
39
+ const tool = createSubAgentTool(process.cwd(), [owl], () => "openai", () => "gpt-5.6-sol");
40
+ return tool.execute({ agent: "owl", task: "Inspect the registry." }, { signal: new AbortController().signal, toolCallId: "test-call" });
41
+ }
42
+ beforeEach(() => {
43
+ spawnMock.mockReset();
44
+ });
45
+ describe("createSubAgentTool fast-model fallback", () => {
46
+ it("respawns with the parent model when the fast model is unavailable", async () => {
47
+ spawnMock
48
+ .mockImplementationOnce(() => mockExit("OpenAI does not recognize the requested model (not).", 1))
49
+ .mockImplementationOnce(() => mockExit("", 0, "fallback succeeded"));
50
+ await expect(runOwl()).resolves.toMatchObject({ content: "fallback succeeded" });
51
+ expect(spawnedModels()).toEqual(["gpt-5.6-luna", "gpt-5.6-sol"]);
52
+ });
53
+ it("does not retry unrelated child failures", async () => {
54
+ spawnMock.mockImplementationOnce(() => mockExit("usage limit reached", 1));
55
+ await expect(runOwl()).resolves.toMatchObject({
56
+ content: "Sub-agent failed (exit 1): usage limit reached",
57
+ });
58
+ expect(spawnedModels()).toEqual(["gpt-5.6-luna"]);
59
+ });
60
+ });
61
+ describe("isModelUnavailableError", () => {
62
+ it("recognizes unavailable-model failures", () => {
63
+ expect(isModelUnavailableError("OpenAI does not recognize the requested model (not). It may not exist or your account may not have access.")).toBe(true);
64
+ expect(isModelUnavailableError("The requested model is not available for this account.")).toBe(true);
65
+ expect(isModelUnavailableError("Model gpt-example does not exist.")).toBe(true);
66
+ });
67
+ it("does not retry unrelated provider or process failures", () => {
68
+ expect(isModelUnavailableError("usage limit reached")).toBe(false);
69
+ expect(isModelUnavailableError("401 invalid authentication credentials")).toBe(false);
70
+ expect(isModelUnavailableError("spawn node ENOENT")).toBe(false);
71
+ });
72
+ });
73
+ //# sourceMappingURL=subagent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.test.js","sourceRoot":"","sources":["../../src/tools/subagent.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import type { AgentTool } from "@prestyj/agent";
3
+ import type { DeferredToolCatalog } from "../core/mcp/deferred-catalog.js";
4
+ declare const ToolSearchParams: z.ZodObject<{
5
+ query: z.ZodString;
6
+ }, z.core.$strip>;
7
+ /**
8
+ * Discovery tool for the deferred MCP catalog. Matching tools are promoted
9
+ * into the live toolset immediately — callable from the very next turn.
10
+ * `onPromote` pushes onto the session's live tools array (the agent loop
11
+ * re-reads it every turn).
12
+ */
13
+ export declare function createToolSearchTool(catalog: DeferredToolCatalog, onPromote: (tools: AgentTool[]) => void): AgentTool<typeof ToolSearchParams>;
14
+ export {};
15
+ //# sourceMappingURL=tool-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../../src/tools/tool-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,QAAA,MAAM,gBAAgB;;iBAMpB,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,GACtC,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAwBpC"}