@shanepadgett/tau-agent 0.33.1 → 0.35.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 (203) hide show
  1. package/docs/context.md +29 -20
  2. package/docs/extending-tau-agent.md +63 -24
  3. package/extensions/appshot/index.ts +112 -111
  4. package/extensions/aside/README.md +7 -0
  5. package/extensions/aside/index.ts +168 -0
  6. package/extensions/aside/panel.ts +83 -0
  7. package/extensions/bash-approval/README.md +20 -0
  8. package/extensions/bash-approval/index.ts +235 -0
  9. package/extensions/bash-approval/settings.ts +24 -0
  10. package/extensions/branch/index.ts +38 -21
  11. package/extensions/cache-diagnostics/index.ts +70 -58
  12. package/extensions/checkpoint/README.md +9 -0
  13. package/extensions/checkpoint/checkpoint-budget.ts +66 -0
  14. package/extensions/checkpoint/checkpoint.ts +279 -0
  15. package/extensions/checkpoint/index.ts +102 -0
  16. package/extensions/checkpoint/messages.ts +170 -0
  17. package/extensions/checkpoint/prompt.ts +24 -0
  18. package/extensions/checkpoint/settings.ts +27 -0
  19. package/extensions/commit/commit-effort.ts +3 -3
  20. package/extensions/commit/commit-plan.ts +2 -2
  21. package/extensions/context/README.md +12 -8
  22. package/extensions/context/definitions.ts +178 -55
  23. package/extensions/context/index.ts +192 -160
  24. package/extensions/context/panel.ts +57 -37
  25. package/extensions/context/sync.ts +139 -89
  26. package/extensions/context/validation.ts +37 -25
  27. package/extensions/effort/README.md +1 -1
  28. package/extensions/effort/index.ts +3 -3
  29. package/extensions/effort/state.ts +3 -18
  30. package/extensions/explore/guidance.ts +6 -47
  31. package/extensions/explore/index.ts +38 -53
  32. package/extensions/explore/{ast/read → read}/hook.ts +12 -7
  33. package/extensions/explore/{ast/tools → tools}/ast-search.ts +15 -19
  34. package/extensions/explore/{ast/tools → tools}/context.ts +16 -23
  35. package/extensions/explore/{ast/tools → tools}/deps.ts +11 -15
  36. package/extensions/explore/{ast/tools → tools}/discover.ts +15 -17
  37. package/extensions/explore/{ast/tools → tools}/impact.ts +20 -23
  38. package/extensions/explore/{ast/tools → tools}/outline.ts +21 -24
  39. package/extensions/explore/{ast/tools → tools}/relationships.ts +23 -32
  40. package/extensions/explore/{ast/tools → tools}/render.ts +1 -1
  41. package/extensions/explore/{ast/tools → tools}/reverse-deps.ts +11 -15
  42. package/extensions/explore/{ast/tools → tools}/show.ts +16 -19
  43. package/extensions/explore/tools/target-params.ts +9 -0
  44. package/extensions/footer/index.ts +75 -56
  45. package/extensions/handoff/index.ts +8 -30
  46. package/extensions/image-gen/index.ts +46 -40
  47. package/extensions/patch/executor.ts +190 -135
  48. package/extensions/patch/matcher.ts +82 -48
  49. package/extensions/patch/parser.ts +149 -105
  50. package/extensions/patch/render.ts +32 -39
  51. package/extensions/patch/summary.ts +30 -26
  52. package/extensions/ready/README.md +7 -0
  53. package/extensions/ready/index.ts +58 -0
  54. package/extensions/ready/model.ts +128 -0
  55. package/extensions/ready/packs.ts +272 -0
  56. package/extensions/ready/render.ts +445 -0
  57. package/extensions/ready/scan.ts +760 -0
  58. package/extensions/reference/index.ts +2 -0
  59. package/extensions/reference/panel.ts +94 -31
  60. package/extensions/review/README.md +14 -6
  61. package/extensions/review/index.ts +58 -99
  62. package/extensions/review/model.ts +13 -33
  63. package/extensions/review/session.ts +9 -23
  64. package/extensions/runtime-context/context.ts +30 -26
  65. package/extensions/script-runner/README.md +2 -2
  66. package/extensions/script-runner/index.ts +122 -82
  67. package/extensions/silent-command-runner/index.ts +38 -23
  68. package/extensions/soul/README.md +2 -2
  69. package/extensions/soul/index.ts +4 -4
  70. package/extensions/soul/prompt.ts +6 -10
  71. package/extensions/soul/settings.ts +6 -3
  72. package/extensions/subagent/agents/context-sync.md +185 -33
  73. package/extensions/subagent/agents/scout.md +2 -2
  74. package/extensions/subagent/agents/web-research.md +2 -2
  75. package/extensions/subagent/agents.ts +137 -84
  76. package/extensions/subagent/cmux-dashboard.ts +39 -30
  77. package/extensions/subagent/index.ts +79 -59
  78. package/extensions/subagent/resume.ts +1 -1
  79. package/extensions/subagent/run.ts +308 -193
  80. package/extensions/subagent/runtime.ts +781 -343
  81. package/extensions/tau/index.ts +47 -38
  82. package/extensions/tau-help/help.md +20 -8
  83. package/extensions/tool-loader/README.md +4 -2
  84. package/extensions/tool-loader/index.ts +77 -52
  85. package/extensions/web/index.ts +6 -3
  86. package/extensions/web/webfetch.ts +114 -86
  87. package/package.json +3 -3
  88. package/schemas/tau.schema.json +38 -35
  89. package/shared/bounded-text-result.ts +1 -0
  90. package/shared/checkpoint-visibility.ts +9 -0
  91. package/shared/events.ts +28 -10
  92. package/shared/isolated-session.ts +72 -30
  93. package/shared/model-effort.ts +23 -22
  94. package/shared/model-fallback/index.ts +66 -41
  95. package/shared/settings/load.ts +45 -38
  96. package/shared/temporary-output-store.ts +16 -10
  97. package/{extensions/explore → src}/ast/adapter.ts +11 -2
  98. package/{extensions/explore → src}/ast/engine.ts +54 -38
  99. package/{extensions/explore → src}/ast/format/ast-search.ts +15 -6
  100. package/{extensions/explore → src}/ast/format/context.ts +3 -6
  101. package/src/ast/format/deps.ts +94 -0
  102. package/{extensions/explore → src}/ast/format/discover.ts +2 -2
  103. package/{extensions/explore → src}/ast/format/impact.ts +9 -11
  104. package/{extensions/explore → src}/ast/format/outline.ts +2 -2
  105. package/{extensions/explore → src}/ast/format/relationships.ts +11 -7
  106. package/{extensions/explore → src}/ast/format/show.ts +1 -1
  107. package/src/ast/format/targeted-result.ts +20 -0
  108. package/src/ast/grammars/c_sharp.wasm +0 -0
  109. package/{extensions/explore → src}/ast/grammars/manifest.json +9 -12
  110. package/{extensions/explore → src}/ast/grammars/manifest.ts +0 -4
  111. package/{extensions/explore → src}/ast/graph/file-graph.ts +210 -98
  112. package/{extensions/explore → src}/ast/graph/relationships.ts +285 -72
  113. package/{extensions/explore → src}/ast/ir.ts +6 -0
  114. package/src/ast/languages/csharp-file-deps.ts +90 -0
  115. package/{extensions/explore → src}/ast/languages/csharp.ts +9 -40
  116. package/src/ast/languages/dotted-index.ts +131 -0
  117. package/{extensions/explore → src}/ast/languages/file-dep-util.ts +22 -13
  118. package/src/ast/languages/fixtures/sample.cs +53 -0
  119. package/src/ast/languages/fixtures/sample.cs.expected.json +156 -0
  120. package/src/ast/languages/fixtures/sample.go +37 -0
  121. package/src/ast/languages/fixtures/sample.go.expected.json +96 -0
  122. package/src/ast/languages/fixtures/sample.java +40 -0
  123. package/src/ast/languages/fixtures/sample.java.expected.json +126 -0
  124. package/src/ast/languages/fixtures/sample.kt +31 -0
  125. package/src/ast/languages/fixtures/sample.kt.expected.json +134 -0
  126. package/src/ast/languages/fixtures/sample.md +23 -0
  127. package/src/ast/languages/fixtures/sample.md.expected.json +44 -0
  128. package/src/ast/languages/fixtures/sample.rs +54 -0
  129. package/src/ast/languages/fixtures/sample.rs.expected.json +178 -0
  130. package/src/ast/languages/fixtures/sample.swift +45 -0
  131. package/src/ast/languages/fixtures/sample.swift.expected.json +147 -0
  132. package/src/ast/languages/fixtures/sample.ts +45 -0
  133. package/src/ast/languages/fixtures/sample.ts.expected.json +141 -0
  134. package/src/ast/languages/fixtures/sample.tsx +36 -0
  135. package/src/ast/languages/fixtures/sample.tsx.expected.json +59 -0
  136. package/{extensions/explore → src}/ast/languages/go-file-deps.ts +6 -0
  137. package/{extensions/explore → src}/ast/languages/go.ts +21 -3
  138. package/{extensions/explore → src}/ast/languages/java.ts +5 -38
  139. package/src/ast/languages/jvm-file-deps.ts +135 -0
  140. package/{extensions/explore → src}/ast/languages/kotlin.ts +5 -39
  141. package/{extensions/explore → src}/ast/languages/rust-file-deps.ts +3 -3
  142. package/{extensions/explore → src}/ast/languages/rust.ts +21 -13
  143. package/{extensions/explore → src}/ast/languages/swift-file-deps.ts +22 -15
  144. package/{extensions/explore → src}/ast/languages/swift.ts +9 -39
  145. package/{extensions/explore → src}/ast/languages/tree.ts +47 -0
  146. package/{extensions/explore → src}/ast/languages/typescript-file-deps.ts +108 -0
  147. package/{extensions/explore → src}/ast/languages/typescript-package-surface.ts +4 -3
  148. package/{extensions/explore → src}/ast/languages/typescript.ts +3 -5
  149. package/{extensions/explore → src}/ast/markdown.ts +72 -47
  150. package/{extensions/explore → src}/ast/queries/ast-search.ts +164 -146
  151. package/{extensions/explore → src}/ast/queries/composite-target.ts +1 -1
  152. package/{extensions/explore → src}/ast/queries/context.ts +116 -80
  153. package/{extensions/explore → src}/ast/queries/discover.ts +154 -105
  154. package/src/ast/queries/impact.ts +291 -0
  155. package/{extensions/explore → src}/ast/queries/outline.ts +4 -2
  156. package/{extensions/explore → src}/ast/queries/show.ts +46 -42
  157. package/{extensions/explore → src}/ast/query.ts +1 -1
  158. package/{extensions/explore → src}/ast/registry.ts +1 -2
  159. package/{extensions/explore → src}/ast/scan.ts +1 -1
  160. package/src/ast/session.ts +50 -0
  161. package/{extensions/explore → src}/ast/slice.ts +8 -0
  162. package/{extensions/explore → src/ast}/traverse.ts +32 -20
  163. package/src/file-injection/index.ts +547 -0
  164. package/src/image-generation/client.ts +50 -31
  165. package/src/image-generation/index.ts +177 -134
  166. package/src/index.ts +2 -0
  167. package/src/tool-loading/index.ts +58 -0
  168. package/extensions/context/evidence.ts +0 -517
  169. package/extensions/context/projection.ts +0 -141
  170. package/extensions/context/state.ts +0 -30
  171. package/extensions/context/write-scope.ts +0 -109
  172. package/extensions/explore/ast/format/deps.ts +0 -86
  173. package/extensions/explore/ast/grammars/odin.wasm +0 -0
  174. package/extensions/explore/ast/languages/csharp-file-deps.ts +0 -189
  175. package/extensions/explore/ast/languages/fixtures/sample.cs +0 -17
  176. package/extensions/explore/ast/languages/fixtures/sample.java +0 -21
  177. package/extensions/explore/ast/languages/fixtures/sample.kt +0 -15
  178. package/extensions/explore/ast/languages/fixtures/sample.odin +0 -28
  179. package/extensions/explore/ast/languages/fixtures/sample.rs +0 -31
  180. package/extensions/explore/ast/languages/fixtures/sample.swift +0 -25
  181. package/extensions/explore/ast/languages/jvm-file-deps.ts +0 -217
  182. package/extensions/explore/ast/languages/odin-file-deps.ts +0 -175
  183. package/extensions/explore/ast/languages/odin.ts +0 -407
  184. package/extensions/explore/ast/queries/impact.ts +0 -250
  185. package/extensions/explore/outline-injection.ts +0 -151
  186. package/extensions/explore/read/autoread.ts +0 -118
  187. package/extensions/review/panel.ts +0 -128
  188. package/extensions/working-memory/README.md +0 -17
  189. package/extensions/working-memory/checkpoint.ts +0 -242
  190. package/extensions/working-memory/index.ts +0 -341
  191. package/extensions/working-memory/memory.ts +0 -235
  192. package/extensions/working-memory/render.ts +0 -185
  193. package/extensions/working-memory/settings.ts +0 -38
  194. package/extensions/working-memory/state.ts +0 -158
  195. package/shared/autoread.ts +0 -234
  196. package/shared/context-messages.ts +0 -19
  197. package/shared/outline-injection.ts +0 -56
  198. /package/{extensions/explore → src}/ast/format/composite.ts +0 -0
  199. /package/{extensions/explore → src}/ast/grammars/kotlin.wasm +0 -0
  200. /package/{extensions/explore → src}/ast/grammars/swift.wasm +0 -0
  201. /package/{extensions/explore → src}/ast/identity.ts +0 -0
  202. /package/{extensions/explore → src}/ast/package-surface.ts +0 -0
  203. /package/{extensions/explore/ast/read/policy.ts → src/ast/read-policy.ts} +0 -0
@@ -106,10 +106,7 @@ function dashboardState(status: SubagentInvocationSnapshot["status"]): string {
106
106
  }
107
107
  }
108
108
 
109
- export function formatDashboardMarkdown(snapshots: readonly SubagentInvocationSnapshot[]): string {
110
- const ordered = [...snapshots].sort(
111
- (a, b) => a.startedAt - b.startedAt || a.invocationId.localeCompare(b.invocationId),
112
- );
109
+ function dashboardCounts(ordered: readonly SubagentInvocationSnapshot[]): string {
113
110
  const activeCount = ordered.filter((snapshot) =>
114
111
  ["waiting", "starting", "running"].includes(snapshot.status),
115
112
  ).length;
@@ -119,7 +116,39 @@ export function formatDashboardMarkdown(snapshots: readonly SubagentInvocationSn
119
116
  const counts = [`${activeCount} active`, `${doneCount} done`];
120
117
  if (failedCount > 0) counts.push(`${failedCount} failed`);
121
118
  if (stoppedCount > 0) counts.push(`${stoppedCount} stopped`);
122
- const lines = ["# Subagents", "", counts.join(" · "), ""];
119
+ return counts.join(" · ");
120
+ }
121
+
122
+ function dashboardTableRow(details: SubagentInvocationSnapshot): string {
123
+ const latest = details.actions.at(-1);
124
+ const currentTool = details.currentActivity?.match(/^\S+/)?.[0];
125
+ const lastTool = currentTool ?? latest?.tool ?? "";
126
+ const ctx = typeof details.contextPercent === "number" ? `${details.contextPercent.toFixed(1)}%` : "—";
127
+ return `| ${tableCell(`${details.displayName} (${details.agent})`, 48)} | ${dashboardState(details.status)} | ${tableCell(lastTool, 32) || "—"} | ${details.toolCalls} | $${details.usage.cost.toFixed(4)} | ${ctx} | ${elapsed(details.durationMs)} |`;
128
+ }
129
+
130
+ function dashboardInputSection(details: SubagentInvocationSnapshot): string[] {
131
+ const lines = [
132
+ `### ${tableCell(details.displayName, 80)}`,
133
+ "",
134
+ tableCell(details.agent, 80),
135
+ "",
136
+ quote(details.task) || "> _(empty)_",
137
+ ];
138
+ if (details.files.length > 0) {
139
+ lines.push("", "**Files**", "");
140
+ for (const file of details.files) lines.push(`- ${tableCell(file, 300)}`);
141
+ }
142
+ if (details.error) lines.push("", "**Error**", "", quote(details.error));
143
+ lines.push("");
144
+ return lines;
145
+ }
146
+
147
+ function formatDashboardMarkdown(snapshots: readonly SubagentInvocationSnapshot[]): string {
148
+ const ordered = [...snapshots].sort(
149
+ (a, b) => a.startedAt - b.startedAt || a.invocationId.localeCompare(b.invocationId),
150
+ );
151
+ const lines = ["# Subagents", "", dashboardCounts(ordered), ""];
123
152
  if (ordered.length === 0) {
124
153
  lines.push("_No subagents._", "");
125
154
  return lines.join("\n");
@@ -127,32 +156,12 @@ export function formatDashboardMarkdown(snapshots: readonly SubagentInvocationSn
127
156
  lines.push(
128
157
  "| Agent | State | Last tool | Calls | Cost | Ctx | Time |",
129
158
  "| --- | --- | --- | ---: | ---: | ---: | ---: |",
159
+ ...ordered.map(dashboardTableRow),
160
+ "",
161
+ "## Inputs",
162
+ "",
130
163
  );
131
- for (const details of ordered) {
132
- const latest = details.actions.at(-1);
133
- const currentTool = details.currentActivity?.match(/^\S+/)?.[0];
134
- const lastTool = currentTool ?? latest?.tool ?? "";
135
- const ctx = typeof details.contextPercent === "number" ? `${details.contextPercent.toFixed(1)}%` : "—";
136
- lines.push(
137
- `| ${tableCell(`${details.displayName} (${details.agent})`, 48)} | ${dashboardState(details.status)} | ${tableCell(lastTool, 32) || "—"} | ${details.toolCalls} | $${details.usage.cost.toFixed(4)} | ${ctx} | ${elapsed(details.durationMs)} |`,
138
- );
139
- }
140
- lines.push("", "## Inputs", "");
141
- for (const details of ordered) {
142
- lines.push(
143
- `### ${tableCell(details.displayName, 80)}`,
144
- "",
145
- tableCell(details.agent, 80),
146
- "",
147
- quote(details.task) || "> _(empty)_",
148
- );
149
- if (details.files.length > 0) {
150
- lines.push("", "**Files**", "");
151
- for (const file of details.files) lines.push(`- ${tableCell(file, 300)}`);
152
- }
153
- if (details.error) lines.push("", "**Error**", "", quote(details.error));
154
- lines.push("");
155
- }
164
+ for (const details of ordered) lines.push(...dashboardInputSection(details));
156
165
  return lines.join("\n");
157
166
  }
158
167
 
@@ -204,22 +204,86 @@ export default function subagentExtension(pi: ExtensionAPI): void {
204
204
  if (!pi.getActiveTools().includes("subagent")) return undefined;
205
205
  const discovery = await discoverAgents(ctx.cwd, ctx.isProjectTrusted());
206
206
  warn(discovery, ctx);
207
- const lines = (await parentVisibleAgents(ctx, discovery)).map((agent) => `- ${agent.name}: ${agent.description}`);
207
+ const agents = await parentVisibleAgents(ctx, discovery);
208
+ const lines = agents.map((agent) => `- ${agent.name}: ${agent.description}`);
209
+ const scoutGuidance = agents.some((agent) => agent.name === "scout")
210
+ ? "\n\nScout only for substantial multi-hop lookup that would flood parent context. Skip few known-path reads, single declaration lookups, or small digs with most evidence already in hand; use tools directly. When uncertain, dig yourself. Do not send code review, diagnosis, design, or other judgment work to scout."
211
+ : "";
208
212
  const prompt = `## Subagents
209
- Use \`subagent\` when an available agent matches a focused part of the task.
213
+ Use \`subagent\` only when an available agent's listed purpose matches the delegated work. Stay inside that purpose. Off-purpose calls are denied — for example, do not send code review to a lookup-only agent.
210
214
 
211
215
  Available agents for this turn:
212
- ${lines.join("\n")}
216
+ ${lines.join("\n") || "none"}
213
217
 
214
218
  Start a fresh thread with \`agent\` and \`task\`. Continue an existing thread with \`thread\` and \`task\`. Reuse a thread when feedback or follow-up work depends on its prior reads and reasoning. Start fresh for unrelated work or when its context is stale or oversized.
215
219
 
216
220
  Pass \`files\` when exact relevant files are already known. Tau autoreads current line-numbered snapshots into that child turn before it starts.
217
221
 
218
- Delegate one focused task per call. Children do not inherit parent messages. Include exact absolute reference paths when a child must inspect a repository outside the current working directory.
219
-
220
- Scout only for substantial multi-hop lookup that would flood parent context. Skip few known-path reads, single declaration lookups, or small digs with most evidence already in hand; use tools directly. When uncertain, dig yourself.`;
222
+ Delegate one focused task per call. Children do not inherit parent messages. Include exact absolute reference paths when a child must inspect a repository outside the current working directory.${scoutGuidance}`;
221
223
  return { systemPrompt: `${event.systemPrompt}\n\n${prompt}` };
222
224
  });
225
+ const resolveFreshSubagentDefinition = async (ctx: ExtensionContext, agent: string) => {
226
+ const discovery = await discoverAgents(ctx.cwd, ctx.isProjectTrusted());
227
+ warn(discovery, ctx);
228
+ const definition = discovery.agents.get(agent);
229
+ const invalid = discovery.invalid.get(agent);
230
+ if (!definition) {
231
+ const reason = invalid?.map((item) => item.reason).join("; ") ?? "unknown agent";
232
+ const names = (await parentVisibleAgents(ctx, discovery)).map((item) => item.name).join(", ") || "none";
233
+ return {
234
+ ok: false as const,
235
+ phase: "discovery" as const,
236
+ error: `Agent ${agent} discovery failed: ${reason}. Runnable agents: ${names}`,
237
+ };
238
+ }
239
+ const disabled = await disabledAgentNames(ctx);
240
+ if (disabled.effective.has(definition.name)) {
241
+ const source = disabled.configured.has(definition.name) ? "in Tau settings" : "for this session";
242
+ return {
243
+ ok: false as const,
244
+ phase: "discovery" as const,
245
+ error: `Agent ${definition.name} is disabled ${source}.`,
246
+ };
247
+ }
248
+ if (definition.name === "context-sync") {
249
+ const sync = (await loadTauExtensionSettings(ctx, contextSettings)).sync;
250
+ if (!sync.enabled) {
251
+ return { ok: false as const, phase: "discovery" as const, error: "Context sync is disabled in settings." };
252
+ }
253
+ if (!sync.automation) {
254
+ return {
255
+ ok: false as const,
256
+ phase: "discovery" as const,
257
+ error: "Context-sync automation is disabled. Use /context-sync or enable extensions.context.sync.automation.",
258
+ };
259
+ }
260
+ }
261
+ return { ok: true as const, definition };
262
+ };
263
+
264
+ const disabledContinuationResult = async (
265
+ ctx: ExtensionContext,
266
+ threadKey: string | undefined,
267
+ task: string,
268
+ parentModel: string,
269
+ parentThinking: ReturnType<ExtensionAPI["getThinkingLevel"]>,
270
+ ) => {
271
+ const thread = runtime.listThreads(ctx.cwd).find((item) => item.id === threadKey);
272
+ if (!thread) return undefined;
273
+ const disabled = await disabledAgentNames(ctx);
274
+ if (!disabled.effective.has(thread.definition.name)) return undefined;
275
+ const source = disabled.configured.has(thread.definition.name) ? "in Tau settings" : "for this session";
276
+ return failedToolResult(
277
+ thread.definition.name,
278
+ task,
279
+ "discovery",
280
+ parentModel,
281
+ parentThinking,
282
+ `Agent ${thread.definition.name} is disabled ${source}.`,
283
+ threadKey,
284
+ );
285
+ };
286
+
223
287
  pi.registerTool(
224
288
  defineTool<typeof params, SubagentDetails>({
225
289
  name: "subagent",
@@ -251,24 +315,14 @@ Scout only for substantial multi-hop lookup that would flood parent context. Ski
251
315
  }
252
316
 
253
317
  if (continuing) {
254
- const thread = runtime.listThreads(ctx.cwd).find((item) => item.id === threadKey);
255
- if (thread) {
256
- const disabled = await disabledAgentNames(ctx);
257
- if (disabled.effective.has(thread.definition.name)) {
258
- const source = disabled.configured.has(thread.definition.name)
259
- ? "in Tau settings"
260
- : "for this session";
261
- return failedToolResult(
262
- thread.definition.name,
263
- task,
264
- "discovery",
265
- parentModel,
266
- parentThinking,
267
- `Agent ${thread.definition.name} is disabled ${source}.`,
268
- threadKey,
269
- );
270
- }
271
- }
318
+ const disabledContinuation = await disabledContinuationResult(
319
+ ctx,
320
+ threadKey,
321
+ task,
322
+ parentModel,
323
+ parentThinking,
324
+ );
325
+ if (disabledContinuation) return disabledContinuation;
272
326
  }
273
327
 
274
328
  return runtime.execute({
@@ -291,41 +345,7 @@ Scout only for substantial multi-hop lookup that would flood parent context. Ski
291
345
  ],
292
346
  details,
293
347
  }),
294
- resolveFreshDefinition: async () => {
295
- const discovery = await discoverAgents(ctx.cwd, ctx.isProjectTrusted());
296
- warn(discovery, ctx);
297
- const definition = discovery.agents.get(agent);
298
- const invalid = discovery.invalid.get(agent);
299
- if (!definition) {
300
- const reason = invalid?.map((item) => item.reason).join("; ") ?? "unknown agent";
301
- const names =
302
- (await parentVisibleAgents(ctx, discovery)).map((item) => item.name).join(", ") || "none";
303
- return {
304
- ok: false,
305
- phase: "discovery",
306
- error: `Agent ${agent} discovery failed: ${reason}. Runnable agents: ${names}`,
307
- };
308
- }
309
- const disabled = await disabledAgentNames(ctx);
310
- if (disabled.effective.has(definition.name)) {
311
- const source = disabled.configured.has(definition.name) ? "in Tau settings" : "for this session";
312
- return { ok: false, phase: "discovery", error: `Agent ${definition.name} is disabled ${source}.` };
313
- }
314
- if (definition.name === "context-sync") {
315
- const sync = (await loadTauExtensionSettings(ctx, contextSettings)).sync;
316
- if (!sync.enabled) {
317
- return { ok: false, phase: "discovery", error: "Context sync is disabled in settings." };
318
- }
319
- if (!sync.automation) {
320
- return {
321
- ok: false,
322
- phase: "discovery",
323
- error: "Context-sync automation is disabled. Use /context-sync or enable extensions.context.sync.automation.",
324
- };
325
- }
326
- }
327
- return { ok: true, definition };
328
- },
348
+ resolveFreshDefinition: () => resolveFreshSubagentDefinition(ctx, agent),
329
349
  });
330
350
  },
331
351
  renderCall(args, theme, context) {
@@ -29,7 +29,7 @@ export function retainSubagentTurn(state: SubagentResumeState, record: RetainedT
29
29
  };
30
30
  }
31
31
 
32
- export function selectRetainedTurns(
32
+ function selectRetainedTurns(
33
33
  state: SubagentResumeState,
34
34
  optionalTokenBudget = RESUME_OPTIONAL_HISTORY_TOKENS,
35
35
  ): { records: readonly RetainedTurnRecord[]; omitted: number } {