@shanepadgett/tau-agent 0.33.0 → 0.34.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 (190) 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/branch/index.ts +38 -21
  8. package/extensions/cache-diagnostics/index.ts +70 -58
  9. package/extensions/checkpoint/README.md +9 -0
  10. package/extensions/checkpoint/checkpoint-budget.ts +79 -0
  11. package/extensions/checkpoint/checkpoint.ts +277 -0
  12. package/extensions/checkpoint/index.ts +102 -0
  13. package/extensions/checkpoint/messages.ts +169 -0
  14. package/extensions/checkpoint/prompt.ts +24 -0
  15. package/extensions/checkpoint/settings.ts +27 -0
  16. package/extensions/commit/commit-effort.ts +3 -3
  17. package/extensions/context/README.md +12 -8
  18. package/extensions/context/definitions.ts +178 -55
  19. package/extensions/context/index.ts +192 -160
  20. package/extensions/context/panel.ts +57 -37
  21. package/extensions/context/sync.ts +139 -89
  22. package/extensions/context/validation.ts +37 -25
  23. package/extensions/effort/README.md +1 -1
  24. package/extensions/effort/index.ts +3 -3
  25. package/extensions/effort/state.ts +3 -18
  26. package/extensions/explore/guidance.ts +6 -47
  27. package/extensions/explore/index.ts +38 -53
  28. package/extensions/explore/{ast/read → read}/hook.ts +12 -7
  29. package/extensions/explore/{ast/tools → tools}/ast-search.ts +15 -19
  30. package/extensions/explore/{ast/tools → tools}/context.ts +16 -23
  31. package/extensions/explore/{ast/tools → tools}/deps.ts +11 -15
  32. package/extensions/explore/{ast/tools → tools}/discover.ts +15 -17
  33. package/extensions/explore/{ast/tools → tools}/impact.ts +20 -23
  34. package/extensions/explore/{ast/tools → tools}/outline.ts +21 -24
  35. package/extensions/explore/{ast/tools → tools}/relationships.ts +23 -32
  36. package/extensions/explore/{ast/tools → tools}/render.ts +1 -1
  37. package/extensions/explore/{ast/tools → tools}/reverse-deps.ts +11 -15
  38. package/extensions/explore/{ast/tools → tools}/show.ts +16 -19
  39. package/extensions/explore/tools/target-params.ts +9 -0
  40. package/extensions/footer/index.ts +75 -56
  41. package/extensions/handoff/index.ts +8 -30
  42. package/extensions/image-gen/index.ts +46 -40
  43. package/extensions/patch/executor.ts +190 -135
  44. package/extensions/patch/matcher.ts +82 -48
  45. package/extensions/patch/parser.ts +149 -105
  46. package/extensions/patch/render.ts +32 -39
  47. package/extensions/patch/summary.ts +30 -26
  48. package/extensions/ready/README.md +7 -0
  49. package/extensions/ready/index.ts +58 -0
  50. package/extensions/ready/model.ts +128 -0
  51. package/extensions/ready/packs.ts +272 -0
  52. package/extensions/ready/render.ts +445 -0
  53. package/extensions/ready/scan.ts +760 -0
  54. package/extensions/reference/panel.ts +28 -16
  55. package/extensions/review/index.ts +63 -51
  56. package/extensions/review/panel.ts +5 -34
  57. package/extensions/runtime-context/context.ts +30 -26
  58. package/extensions/script-runner/README.md +2 -2
  59. package/extensions/script-runner/index.ts +130 -93
  60. package/extensions/silent-command-runner/index.ts +38 -23
  61. package/extensions/subagent/agents/context-sync.md +185 -33
  62. package/extensions/subagent/agents/scout.md +2 -2
  63. package/extensions/subagent/agents.ts +137 -84
  64. package/extensions/subagent/cmux-dashboard.ts +39 -30
  65. package/extensions/subagent/index.ts +79 -59
  66. package/extensions/subagent/resume.ts +1 -1
  67. package/extensions/subagent/run.ts +304 -193
  68. package/extensions/subagent/runtime.ts +781 -343
  69. package/extensions/tau/index.ts +47 -38
  70. package/extensions/tau-help/help.md +14 -6
  71. package/extensions/tool-loader/README.md +4 -2
  72. package/extensions/tool-loader/index.ts +77 -52
  73. package/extensions/web/index.ts +6 -3
  74. package/extensions/web/webfetch.ts +114 -86
  75. package/package.json +3 -3
  76. package/schemas/tau.schema.json +20 -33
  77. package/shared/bounded-text-result.ts +1 -0
  78. package/shared/checkpoint-visibility.ts +9 -0
  79. package/shared/events.ts +28 -10
  80. package/shared/isolated-session.ts +71 -29
  81. package/shared/model-effort.ts +9 -19
  82. package/shared/model-fallback/index.ts +66 -41
  83. package/shared/settings/load.ts +45 -38
  84. package/shared/temporary-output-store.ts +16 -10
  85. package/{extensions/explore → src}/ast/adapter.ts +11 -2
  86. package/{extensions/explore → src}/ast/engine.ts +54 -38
  87. package/{extensions/explore → src}/ast/format/ast-search.ts +15 -6
  88. package/{extensions/explore → src}/ast/format/context.ts +3 -6
  89. package/src/ast/format/deps.ts +94 -0
  90. package/{extensions/explore → src}/ast/format/discover.ts +2 -2
  91. package/{extensions/explore → src}/ast/format/impact.ts +9 -11
  92. package/{extensions/explore → src}/ast/format/outline.ts +2 -2
  93. package/{extensions/explore → src}/ast/format/relationships.ts +11 -7
  94. package/{extensions/explore → src}/ast/format/show.ts +1 -1
  95. package/src/ast/format/targeted-result.ts +20 -0
  96. package/src/ast/grammars/c_sharp.wasm +0 -0
  97. package/{extensions/explore → src}/ast/grammars/manifest.json +9 -12
  98. package/{extensions/explore → src}/ast/grammars/manifest.ts +0 -4
  99. package/{extensions/explore → src}/ast/graph/file-graph.ts +210 -98
  100. package/{extensions/explore → src}/ast/graph/relationships.ts +285 -72
  101. package/{extensions/explore → src}/ast/ir.ts +6 -0
  102. package/src/ast/languages/csharp-file-deps.ts +90 -0
  103. package/{extensions/explore → src}/ast/languages/csharp.ts +9 -40
  104. package/src/ast/languages/dotted-index.ts +131 -0
  105. package/{extensions/explore → src}/ast/languages/file-dep-util.ts +22 -13
  106. package/src/ast/languages/fixtures/sample.cs +53 -0
  107. package/src/ast/languages/fixtures/sample.cs.expected.json +156 -0
  108. package/src/ast/languages/fixtures/sample.go +37 -0
  109. package/src/ast/languages/fixtures/sample.go.expected.json +96 -0
  110. package/src/ast/languages/fixtures/sample.java +40 -0
  111. package/src/ast/languages/fixtures/sample.java.expected.json +126 -0
  112. package/src/ast/languages/fixtures/sample.kt +31 -0
  113. package/src/ast/languages/fixtures/sample.kt.expected.json +134 -0
  114. package/src/ast/languages/fixtures/sample.md +23 -0
  115. package/src/ast/languages/fixtures/sample.md.expected.json +44 -0
  116. package/src/ast/languages/fixtures/sample.rs +54 -0
  117. package/src/ast/languages/fixtures/sample.rs.expected.json +178 -0
  118. package/src/ast/languages/fixtures/sample.swift +45 -0
  119. package/src/ast/languages/fixtures/sample.swift.expected.json +147 -0
  120. package/src/ast/languages/fixtures/sample.ts +45 -0
  121. package/src/ast/languages/fixtures/sample.ts.expected.json +141 -0
  122. package/src/ast/languages/fixtures/sample.tsx +36 -0
  123. package/src/ast/languages/fixtures/sample.tsx.expected.json +59 -0
  124. package/{extensions/explore → src}/ast/languages/go-file-deps.ts +6 -0
  125. package/{extensions/explore → src}/ast/languages/go.ts +21 -3
  126. package/{extensions/explore → src}/ast/languages/java.ts +5 -38
  127. package/src/ast/languages/jvm-file-deps.ts +135 -0
  128. package/{extensions/explore → src}/ast/languages/kotlin.ts +5 -39
  129. package/{extensions/explore → src}/ast/languages/rust-file-deps.ts +3 -3
  130. package/{extensions/explore → src}/ast/languages/rust.ts +21 -13
  131. package/{extensions/explore → src}/ast/languages/swift-file-deps.ts +22 -15
  132. package/{extensions/explore → src}/ast/languages/swift.ts +9 -39
  133. package/{extensions/explore → src}/ast/languages/tree.ts +47 -0
  134. package/{extensions/explore → src}/ast/languages/typescript-file-deps.ts +108 -0
  135. package/{extensions/explore → src}/ast/languages/typescript-package-surface.ts +4 -3
  136. package/{extensions/explore → src}/ast/languages/typescript.ts +3 -5
  137. package/{extensions/explore → src}/ast/markdown.ts +72 -47
  138. package/{extensions/explore → src}/ast/queries/ast-search.ts +164 -146
  139. package/{extensions/explore → src}/ast/queries/composite-target.ts +1 -1
  140. package/{extensions/explore → src}/ast/queries/context.ts +116 -80
  141. package/{extensions/explore → src}/ast/queries/discover.ts +154 -105
  142. package/src/ast/queries/impact.ts +291 -0
  143. package/{extensions/explore → src}/ast/queries/outline.ts +4 -2
  144. package/{extensions/explore → src}/ast/queries/show.ts +46 -42
  145. package/{extensions/explore → src}/ast/query.ts +1 -1
  146. package/{extensions/explore → src}/ast/registry.ts +1 -2
  147. package/{extensions/explore → src}/ast/scan.ts +1 -1
  148. package/src/ast/session.ts +50 -0
  149. package/{extensions/explore → src}/ast/slice.ts +8 -0
  150. package/{extensions/explore → src/ast}/traverse.ts +32 -20
  151. package/src/file-injection/index.ts +547 -0
  152. package/src/image-generation/client.ts +50 -31
  153. package/src/image-generation/index.ts +177 -134
  154. package/src/index.ts +2 -0
  155. package/src/tool-loading/index.ts +58 -0
  156. package/extensions/context/evidence.ts +0 -517
  157. package/extensions/context/projection.ts +0 -141
  158. package/extensions/context/state.ts +0 -30
  159. package/extensions/context/write-scope.ts +0 -109
  160. package/extensions/explore/ast/format/deps.ts +0 -86
  161. package/extensions/explore/ast/grammars/odin.wasm +0 -0
  162. package/extensions/explore/ast/languages/csharp-file-deps.ts +0 -189
  163. package/extensions/explore/ast/languages/fixtures/sample.cs +0 -17
  164. package/extensions/explore/ast/languages/fixtures/sample.java +0 -21
  165. package/extensions/explore/ast/languages/fixtures/sample.kt +0 -15
  166. package/extensions/explore/ast/languages/fixtures/sample.odin +0 -28
  167. package/extensions/explore/ast/languages/fixtures/sample.rs +0 -31
  168. package/extensions/explore/ast/languages/fixtures/sample.swift +0 -25
  169. package/extensions/explore/ast/languages/jvm-file-deps.ts +0 -217
  170. package/extensions/explore/ast/languages/odin-file-deps.ts +0 -175
  171. package/extensions/explore/ast/languages/odin.ts +0 -407
  172. package/extensions/explore/ast/queries/impact.ts +0 -250
  173. package/extensions/explore/outline-injection.ts +0 -151
  174. package/extensions/explore/read/autoread.ts +0 -118
  175. package/extensions/working-memory/README.md +0 -17
  176. package/extensions/working-memory/checkpoint.ts +0 -242
  177. package/extensions/working-memory/index.ts +0 -341
  178. package/extensions/working-memory/memory.ts +0 -235
  179. package/extensions/working-memory/render.ts +0 -185
  180. package/extensions/working-memory/settings.ts +0 -38
  181. package/extensions/working-memory/state.ts +0 -158
  182. package/shared/autoread.ts +0 -234
  183. package/shared/context-messages.ts +0 -19
  184. package/shared/outline-injection.ts +0 -56
  185. /package/{extensions/explore → src}/ast/format/composite.ts +0 -0
  186. /package/{extensions/explore → src}/ast/grammars/kotlin.wasm +0 -0
  187. /package/{extensions/explore → src}/ast/grammars/swift.wasm +0 -0
  188. /package/{extensions/explore → src}/ast/identity.ts +0 -0
  189. /package/{extensions/explore → src}/ast/package-surface.ts +0 -0
  190. /package/{extensions/explore/ast/read/policy.ts → src/ast/read-policy.ts} +0 -0
@@ -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 } {