@markusylisiurunen/tau 0.3.93 → 0.3.95

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 (150) hide show
  1. package/dist/code_mode/command.js +3 -1
  2. package/dist/code_mode/command.js.map +1 -1
  3. package/dist/code_mode/output.d.ts +3 -0
  4. package/dist/code_mode/output.js +8 -2
  5. package/dist/code_mode/output.js.map +1 -1
  6. package/dist/code_mode/runtime.d.ts +7 -1
  7. package/dist/code_mode/runtime.js +18 -14
  8. package/dist/code_mode/runtime.js.map +1 -1
  9. package/dist/core/code_mode/agents.js +434 -0
  10. package/dist/core/code_mode/agents.js.map +1 -0
  11. package/dist/core/code_mode/bash.js +14 -17
  12. package/dist/core/code_mode/bash.js.map +1 -1
  13. package/dist/core/code_mode/history.js +1 -0
  14. package/dist/core/code_mode/history.js.map +1 -1
  15. package/dist/core/code_mode/models.js +27 -4
  16. package/dist/core/code_mode/models.js.map +1 -1
  17. package/dist/core/code_mode/sdk.js +6 -0
  18. package/dist/core/code_mode/sdk.js.map +1 -1
  19. package/dist/core/config/content_loader.js +3 -13
  20. package/dist/core/config/content_loader.js.map +1 -1
  21. package/dist/core/config/schema.js.map +1 -1
  22. package/dist/core/debug.js +2 -2
  23. package/dist/core/debug.js.map +1 -1
  24. package/dist/core/history/history_manager.js +7 -4
  25. package/dist/core/history/history_manager.js.map +1 -1
  26. package/dist/core/index.js +0 -4
  27. package/dist/core/index.js.map +1 -1
  28. package/dist/core/mcp/manager.js +7 -0
  29. package/dist/core/mcp/manager.js.map +1 -1
  30. package/dist/core/models/openrouter.js +25 -1
  31. package/dist/core/models/openrouter.js.map +1 -1
  32. package/dist/core/personas.js +3 -11
  33. package/dist/core/personas.js.map +1 -1
  34. package/dist/core/runtime/chat_runtime.js +11 -10
  35. package/dist/core/runtime/chat_runtime.js.map +1 -1
  36. package/dist/core/runtime/session_prompt_composer.js +9 -8
  37. package/dist/core/runtime/session_prompt_composer.js.map +1 -1
  38. package/dist/core/static/code_mode/history/documentation.md +2 -1
  39. package/dist/core/static/code_mode/sandbox_runner.mjs +4 -0
  40. package/dist/core/static/index.js +18 -5
  41. package/dist/core/static/index.js.map +1 -1
  42. package/dist/core/static/prompts/subagent-prefix.md +17 -0
  43. package/dist/core/static/tau_docs/client-tools.md +4 -0
  44. package/dist/core/static/tau_docs/code-mode.md +77 -0
  45. package/dist/core/static/tau_docs/config-reference.md +4 -2
  46. package/dist/core/static/tau_docs/history.md +5 -3
  47. package/dist/core/static/tau_docs/index.md +2 -1
  48. package/dist/core/static/tau_docs/manifest.json +1 -0
  49. package/dist/core/static/tau_docs/node-sdk.md +2 -0
  50. package/dist/core/static/tau_docs/openrouter.md +2 -0
  51. package/dist/core/static/tau_docs/pdf-unpacking.md +1 -1
  52. package/dist/core/static/tau_docs/personas.md +4 -5
  53. package/dist/core/static/tau_docs/prompts-and-project-context.md +1 -1
  54. package/dist/core/static/tau_docs/security.md +1 -1
  55. package/dist/core/static/tau_docs/sessions.md +1 -1
  56. package/dist/core/static/tau_docs/subagents.md +106 -27
  57. package/dist/core/static/tau_docs/telegram.md +20 -2
  58. package/dist/core/static/tau_docs/tools.md +32 -62
  59. package/dist/core/static/tau_docs/troubleshooting.md +2 -2
  60. package/dist/core/subagents/agent_supervisor.js +185 -339
  61. package/dist/core/subagents/agent_supervisor.js.map +1 -1
  62. package/dist/core/subagents/claude_code_protocol.js +4 -0
  63. package/dist/core/subagents/claude_code_protocol.js.map +1 -1
  64. package/dist/core/subagents/claude_code_runner.js +134 -11
  65. package/dist/core/subagents/claude_code_runner.js.map +1 -1
  66. package/dist/core/subagents/claude_code_runner.mjs +80 -77
  67. package/dist/core/subagents/claude_code_runtime.js +250 -9
  68. package/dist/core/subagents/claude_code_runtime.js.map +1 -1
  69. package/dist/core/subagents/errors.js +18 -0
  70. package/dist/core/subagents/errors.js.map +1 -0
  71. package/dist/core/subagents/events.js +25 -0
  72. package/dist/core/subagents/events.js.map +1 -0
  73. package/dist/core/subagents/format.js +2 -98
  74. package/dist/core/subagents/format.js.map +1 -1
  75. package/dist/core/subagents/native_subagent_runtime.js +270 -0
  76. package/dist/core/subagents/native_subagent_runtime.js.map +1 -0
  77. package/dist/core/subagents/prompt.js +3 -5
  78. package/dist/core/subagents/prompt.js.map +1 -1
  79. package/dist/core/subagents/registry.js +5 -3
  80. package/dist/core/subagents/registry.js.map +1 -1
  81. package/dist/core/subagents/runtime.js +13 -0
  82. package/dist/core/subagents/runtime.js.map +1 -0
  83. package/dist/core/subagents/trace.js +149 -0
  84. package/dist/core/subagents/trace.js.map +1 -0
  85. package/dist/core/telegram/adapter.js +40 -6
  86. package/dist/core/telegram/adapter.js.map +1 -1
  87. package/dist/core/telegram/config.js +6 -0
  88. package/dist/core/telegram/config.js.map +1 -1
  89. package/dist/core/telegram/runtime.js +1 -0
  90. package/dist/core/telegram/runtime.js.map +1 -1
  91. package/dist/core/tools/agent_jobs.js +51 -0
  92. package/dist/core/tools/agent_jobs.js.map +1 -0
  93. package/dist/core/tools/background_jobs.js +205 -0
  94. package/dist/core/tools/background_jobs.js.map +1 -0
  95. package/dist/core/tools/bash.js +11 -45
  96. package/dist/core/tools/bash.js.map +1 -1
  97. package/dist/core/tools/bash_jobs.js +44 -238
  98. package/dist/core/tools/bash_jobs.js.map +1 -1
  99. package/dist/core/tools/catalog.js +37 -72
  100. package/dist/core/tools/catalog.js.map +1 -1
  101. package/dist/core/tools/code.js +177 -54
  102. package/dist/core/tools/code.js.map +1 -1
  103. package/dist/core/tools/code_jobs.js +128 -0
  104. package/dist/core/tools/code_jobs.js.map +1 -0
  105. package/dist/core/tools/code_mode.js +88 -101
  106. package/dist/core/tools/code_mode.js.map +1 -1
  107. package/dist/core/tools/code_mode_worker.js +13 -7
  108. package/dist/core/tools/code_mode_worker.js.map +1 -1
  109. package/dist/core/tools/job_output.js +53 -0
  110. package/dist/core/tools/job_output.js.map +1 -0
  111. package/dist/core/tools/output_file.js +38 -0
  112. package/dist/core/tools/output_file.js.map +1 -0
  113. package/dist/core/tools/presentation.js +19 -9
  114. package/dist/core/tools/presentation.js.map +1 -1
  115. package/dist/core/tools/tool_names.js +8 -6
  116. package/dist/core/tools/tool_names.js.map +1 -1
  117. package/dist/core/tools/wait_for_agents.js +41 -33
  118. package/dist/core/tools/wait_for_agents.js.map +1 -1
  119. package/dist/core/version.js +1 -1
  120. package/dist/diff_tool/app/dist/assets/{core-DaUcjNBm.js → core-NkxL1yZC.js} +1 -1
  121. package/dist/diff_tool/app/dist/assets/{github-dark-default-adAWTKmX.js → github-dark-default-CM8LCIj6.js} +1 -1
  122. package/dist/diff_tool/app/dist/assets/highlights-Coi8xHW0.js +3 -0
  123. package/dist/diff_tool/app/dist/assets/index-Jt-l2Q96.js +205 -0
  124. package/dist/diff_tool/app/dist/assets/langs-qJAo26KT.js +1 -0
  125. package/dist/diff_tool/app/dist/assets/{loader-DrMMfKhl.js → loader-DYYMIDWx.js} +1 -1
  126. package/dist/diff_tool/app/dist/assets/{shiki-BDtWTy6K.js → shiki-B8l9Ufae.js} +2 -2
  127. package/dist/diff_tool/app/dist/assets/{stream-tokenizer-Dpnp6Te1.js → stream-tokenizer-h1lwRQEk.js} +1 -1
  128. package/dist/diff_tool/app/dist/assets/{themes-snQUZ0v5.js → themes-D3P9yN9_.js} +2 -2
  129. package/dist/diff_tool/app/dist/index.html +1 -1
  130. package/dist/host/hosted_ephemeral_agent_session.js +13 -3
  131. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -1
  132. package/dist/host/local_session_host.js +5 -5
  133. package/dist/host/local_session_host.js.map +1 -1
  134. package/dist/sdk/code_mode.js +2 -2
  135. package/dist/sdk/code_mode.js.map +1 -1
  136. package/dist/store/session_snapshot_migrations.js +27 -1
  137. package/dist/store/session_snapshot_migrations.js.map +1 -1
  138. package/package.json +6 -6
  139. package/dist/core/static/prompts/subagent-wrapper.md +0 -20
  140. package/dist/core/tools/interrupt_agent.js +0 -142
  141. package/dist/core/tools/interrupt_agent.js.map +0 -1
  142. package/dist/core/tools/list_agents.js +0 -85
  143. package/dist/core/tools/list_agents.js.map +0 -1
  144. package/dist/core/tools/send_input_to_agent.js +0 -177
  145. package/dist/core/tools/send_input_to_agent.js.map +0 -1
  146. package/dist/core/tools/spawn_agent.js +0 -275
  147. package/dist/core/tools/spawn_agent.js.map +0 -1
  148. package/dist/diff_tool/app/dist/assets/highlights-ey_YWY7Q.js +0 -3
  149. package/dist/diff_tool/app/dist/assets/index-B7CqEx6P.js +0 -202
  150. package/dist/diff_tool/app/dist/assets/langs-BAlu0Oiy.js +0 -1
@@ -0,0 +1,270 @@
1
+ import { AgentRuntime, createAgentSpec } from "../agent/agent_runtime.js";
2
+ import { resolveAgentModel } from "../runtime/agent_model.js";
3
+ import { createAutoCompactionArchiver } from "../session/auto_compaction_archive.js";
4
+ import { ToolCatalog } from "../tools/catalog.js";
5
+ import { getUsageCostTotal, getUsageTotals } from "../usage/logs.js";
6
+ import { extractAssistantText } from "../utils/messages.js";
7
+ import { runtimeFailure } from "./errors.js";
8
+ function nativeContent(content) {
9
+ return content.map((block) => block.type === "text"
10
+ ? { type: "text", text: block.text }
11
+ : { type: "image", data: block.data, mimeType: block.mimeType });
12
+ }
13
+ export class NativeSubagentRuntime {
14
+ config;
15
+ options;
16
+ agent;
17
+ jobs;
18
+ toolPresentations = new Map();
19
+ toolOutcomes = new Map();
20
+ blockedToolCalls = new Map();
21
+ steering = [];
22
+ deliveries = new Set();
23
+ interrupted = false;
24
+ constructor(config, options) {
25
+ this.config = config;
26
+ this.options = options;
27
+ this.jobs = options.jobs.create();
28
+ this.agent = new AgentRuntime({
29
+ agentId: options.id,
30
+ spec: createAgentSpec({
31
+ autoCompactThresholdTokens: null,
32
+ ...resolveAgentModel({
33
+ id: `${options.personaId ?? "agent"}-subagent`,
34
+ label: "subagent",
35
+ description: "Background agent",
36
+ source: "project",
37
+ systemPrompt: config.systemPrompt,
38
+ model: config.model,
39
+ settings: config.settings,
40
+ tools: config.tools,
41
+ subagentLaunchModels: [],
42
+ }, options.config, {
43
+ includeModelNotice: true,
44
+ deps: options.deps,
45
+ }),
46
+ systemPrompt: config.systemPrompt,
47
+ tools: ToolCatalog.createSubagentRegistry(config.tools, options.backend, config.workingDirectory, options.config, this.jobs.bashJobs, this.jobs.codeJobs, options.history, options.mcp),
48
+ }),
49
+ eventSink: async (event) => await this.recordEvent(event),
50
+ clock: options.deps.clock,
51
+ archiveAutoCompaction: createAutoCompactionArchiver(options.backend),
52
+ });
53
+ }
54
+ get model() {
55
+ const { model } = this.config;
56
+ return {
57
+ provider: model.provider,
58
+ id: model.id,
59
+ reasoning: this.agent.spec.attribution.reasoningEffort,
60
+ };
61
+ }
62
+ get contextWindow() {
63
+ return this.config.model.contextWindow;
64
+ }
65
+ get pendingSteering() {
66
+ return this.steering.length;
67
+ }
68
+ steer(prompt) {
69
+ this.steering.push({ prompt, submitted: false });
70
+ this.deliverSteering();
71
+ }
72
+ deliverSteering() {
73
+ if (this.interrupted || this.agent.status !== "running")
74
+ return;
75
+ for (const input of this.steering) {
76
+ if (input.submitted)
77
+ continue;
78
+ const submission = this.agent.steer(input.prompt);
79
+ input.submitted = true;
80
+ const delivery = submission.applied
81
+ .then(() => {
82
+ const index = this.steering.indexOf(input);
83
+ if (index >= 0)
84
+ this.steering.splice(index, 1);
85
+ }, () => { })
86
+ .finally(() => this.deliveries.delete(delivery));
87
+ this.deliveries.add(delivery);
88
+ void submission.result.catch(() => { });
89
+ }
90
+ }
91
+ async submit(prompt) {
92
+ this.interrupted = false;
93
+ this.toolPresentations.clear();
94
+ this.toolOutcomes.clear();
95
+ this.blockedToolCalls.clear();
96
+ let outcome;
97
+ try {
98
+ const result = await this.agent.submit(prompt);
99
+ outcome = this.turnOutcome(result.terminalResult);
100
+ }
101
+ catch (error) {
102
+ outcome = runtimeFailure(error);
103
+ }
104
+ finally {
105
+ await Promise.all(this.deliveries);
106
+ }
107
+ const unconsumed = this.interrupted ? [] : this.steering.map((input) => input.prompt);
108
+ this.steering = [];
109
+ return { outcome: this.interrupted ? { status: "interrupted" } : outcome, unconsumed };
110
+ }
111
+ interrupt() {
112
+ this.interrupted = true;
113
+ this.steering = [];
114
+ this.agent.interrupt();
115
+ }
116
+ dispose() {
117
+ this.interrupt();
118
+ this.agent.dispose();
119
+ this.jobs.release();
120
+ }
121
+ turnOutcome(result) {
122
+ if (result.aborted || result.finalMessage?.stopReason === "aborted")
123
+ return { status: "interrupted" };
124
+ if (result.blocked)
125
+ return {
126
+ status: "failed",
127
+ failure: { kind: result.blocked.reason, message: result.blocked.message },
128
+ };
129
+ if (result.limitReached)
130
+ return {
131
+ status: "failed",
132
+ failure: { kind: result.limitReached.reason, message: result.limitReached.message },
133
+ };
134
+ if (!result.finalMessage)
135
+ return runtimeFailure(new Error("Subagent run completed without a final assistant message."));
136
+ if (result.finalMessage.stopReason === "error")
137
+ return {
138
+ status: "failed",
139
+ failure: {
140
+ kind: "provider-error",
141
+ message: result.finalMessage.errorMessage ?? "model returned an unspecified error.",
142
+ stopReason: result.finalMessage.stopReason,
143
+ },
144
+ };
145
+ return { status: "succeeded", response: extractAssistantText(result.finalMessage).trim() };
146
+ }
147
+ async trace(event) {
148
+ await this.options.onEvent({ type: "trace", event });
149
+ }
150
+ async recordEvent(event) {
151
+ this.deliverSteering();
152
+ if (event.type === "tool_call_admitted")
153
+ await this.trace({
154
+ kind: "tool_call",
155
+ callId: event.toolCall.id,
156
+ toolName: event.toolCall.name,
157
+ arguments: [{ type: "json", value: JSON.parse(JSON.stringify(event.toolCall.arguments)) }],
158
+ });
159
+ if (event.type === "tool_run_finished" || event.type === "tool_run_blocked")
160
+ this.toolOutcomes.set(event.toolCallId, event.type === "tool_run_blocked" ? "blocked" : event.outcome);
161
+ const results = event.type === "tool_result"
162
+ ? [event.message]
163
+ : event.type === "tool_recovery"
164
+ ? event.toolResults
165
+ : [];
166
+ for (const message of results) {
167
+ const outcome = this.toolOutcomes.get(message.toolCallId);
168
+ if (!outcome)
169
+ throw new Error(`Missing outcome for tool result ${message.toolCallId}`);
170
+ await this.trace({
171
+ kind: "tool_result",
172
+ callId: message.toolCallId,
173
+ toolName: message.toolName,
174
+ outcome,
175
+ content: nativeContent(message.content),
176
+ });
177
+ this.toolOutcomes.delete(message.toolCallId);
178
+ }
179
+ if (event.type === "compaction_end")
180
+ await this.trace({ kind: "notice", code: `compaction.${event.outcome}`, content: [] });
181
+ if (event.type === "assistant_final") {
182
+ const content = event.message.content.filter((block) => block.type === "text");
183
+ if (content.length)
184
+ await this.trace({ kind: "assistant", content: nativeContent(content) });
185
+ const usage = getUsageTotals(event.message.usage);
186
+ const cost = getUsageCostTotal(event.message.usage);
187
+ await this.options.onEvent({
188
+ type: "usage",
189
+ entry: {
190
+ timestamp: event.message.timestamp,
191
+ personaId: event.personaId,
192
+ provider: event.message.provider,
193
+ model: event.message.model,
194
+ api: event.message.api,
195
+ reasoningEffort: event.reasoningEffort,
196
+ usage,
197
+ cost: { total: cost },
198
+ },
199
+ contextTokens: usage.input + usage.output + usage.cacheRead + usage.cacheWrite,
200
+ contextWindow: this.contextWindow,
201
+ });
202
+ const text = extractAssistantText(event.message).trim();
203
+ if (text) {
204
+ await this.options.onEvent({
205
+ type: "activity",
206
+ activity: { type: "assistant", text },
207
+ });
208
+ }
209
+ return;
210
+ }
211
+ if (event.type === "tool_activity") {
212
+ this.toolPresentations.set(event.activity.toolCallId, event.activity.presentation);
213
+ const blockedToolName = this.blockedToolCalls.get(event.activity.toolCallId);
214
+ if (blockedToolName) {
215
+ this.blockedToolCalls.delete(event.activity.toolCallId);
216
+ await this.emitSettledToolActivity(blockedToolName, "blocked", event.activity.presentation);
217
+ this.toolPresentations.delete(event.activity.toolCallId);
218
+ }
219
+ return;
220
+ }
221
+ if (event.type === "tool_run_blocked") {
222
+ const presentation = this.toolPresentations.get(event.toolCallId);
223
+ if (!presentation) {
224
+ this.blockedToolCalls.set(event.toolCallId, event.toolName);
225
+ return;
226
+ }
227
+ this.toolPresentations.delete(event.toolCallId);
228
+ await this.emitSettledToolActivity(event.toolName, "blocked", presentation);
229
+ return;
230
+ }
231
+ if (event.type === "tool_run_finished") {
232
+ const presentation = this.toolPresentations.get(event.toolCallId);
233
+ if (!presentation) {
234
+ throw new Error(`missing presentation for settled tool call '${event.toolCallId}'`);
235
+ }
236
+ this.toolPresentations.delete(event.toolCallId);
237
+ await this.emitSettledToolActivity(event.toolName, event.outcome, presentation);
238
+ return;
239
+ }
240
+ if (event.type === "feedback") {
241
+ await this.options.onEvent({
242
+ type: "activity",
243
+ activity: {
244
+ type: "notice",
245
+ severity: event.tone === "error" ? "error" : "info",
246
+ title: event.title,
247
+ ...(event.presentation === "transcript" && event.content
248
+ ? { content: event.content }
249
+ : {}),
250
+ },
251
+ });
252
+ }
253
+ }
254
+ async emitSettledToolActivity(toolName, outcome, presentation) {
255
+ const { actionByStatus, ...terminalPresentation } = presentation;
256
+ await this.options.onEvent({
257
+ type: "activity",
258
+ activity: {
259
+ type: "tool",
260
+ toolName,
261
+ outcome,
262
+ presentation: {
263
+ action: actionByStatus[outcome],
264
+ ...structuredClone(terminalPresentation),
265
+ },
266
+ },
267
+ });
268
+ }
269
+ }
270
+ //# sourceMappingURL=native_subagent_runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_subagent_runtime.js","sourceRoot":"","sources":["../../../src/core/subagents/native_subagent_runtime.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,5 @@
1
- import { renderSubagentWrapperPrompt } from "../static/index.js";
2
- export function buildSubagentSystemPrompt(mainPersonaSystemPrompt) {
3
- return renderSubagentWrapperPrompt({
4
- inheritedInstructions: mainPersonaSystemPrompt,
5
- });
1
+ import { renderSubagentPrefixPrompt } from "../static/index.js";
2
+ export function buildSubagentSystemPrompt(systemPrompt, context) {
3
+ return `${renderSubagentPrefixPrompt(context)}\n\n${systemPrompt}`;
6
4
  }
7
5
  //# sourceMappingURL=prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/core/subagents/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,yBAAyB,CAAC,uBAA+B;IACvE,OAAO,2BAA2B,CAAC;QACjC,qBAAqB,EAAE,uBAAuB;KAC/C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/core/subagents/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,UAAU,yBAAyB,CACvC,YAAoB,EACpB,OAA8D;IAE9D,OAAO,GAAG,0BAA0B,CAAC,OAAO,CAAC,OAAO,YAAY,EAAE,CAAC;AACrE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_HISTORY, TOOL_NAME_MCP, TOOL_NAME_MODELS, TOOL_NAME_SPAWN_AGENT, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WEB, TOOL_NAME_WRITE, } from "../tools/tool_names.js";
1
+ import { TOOL_NAME_AGENTS, TOOL_NAME_BASH, TOOL_NAME_EDIT, TOOL_NAME_HISTORY, TOOL_NAME_MCP, TOOL_NAME_MODELS, TOOL_NAME_VIEW_IMAGE, TOOL_NAME_WEB, TOOL_NAME_WRITE, } from "../tools/tool_names.js";
2
2
  const INHERITABLE_TOOL_NAMES = new Set([
3
3
  TOOL_NAME_BASH,
4
4
  TOOL_NAME_WRITE,
@@ -52,7 +52,7 @@ export function resolveSubagentEffectiveSettings(args) {
52
52
  };
53
53
  }
54
54
  export function formatSubagentsForPrompt(persona) {
55
- if (!persona.tools.includes(TOOL_NAME_SPAWN_AGENT)) {
55
+ if (!persona.tools.includes(TOOL_NAME_AGENTS)) {
56
56
  return undefined;
57
57
  }
58
58
  const effective = resolveSubagentEffectiveSettings({ persona });
@@ -64,7 +64,9 @@ export function formatSubagentsForPrompt(persona) {
64
64
  "",
65
65
  "### Subagents",
66
66
  "",
67
- "You can spawn general-purpose background subagents to work on independent tasks. Spawn them only when the user or active instructions explicitly request delegation; do not infer authorization from generic task overlap.",
67
+ "You can start general-purpose background subagents to work on independent tasks. Start them only when the user or active instructions explicitly request delegation; do not infer authorization from generic task overlap.",
68
+ "",
69
+ 'Start and manage subagents with `tau.agents` in the `code` tool, and read its reference with `tau.docs("agents")` first. It can send a subagent queued or steering input, interrupt it, and read selected parts of its conversation. Use the `wait_for_agents` tool when you want to wait for subagents yourself instead of from a program.',
68
70
  "",
69
71
  `Inherited model: \`${effective.model.provider}/${effective.model.id}:${reasoning}\``,
70
72
  `Allowed model overrides: ${launchModelsText}`,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/subagents/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/subagents/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ClaudeCodeRuntime } from "./claude_code_runtime.js";
2
+ import { NativeSubagentRuntime } from "./native_subagent_runtime.js";
3
+ export function createSubagentRuntime(config, options) {
4
+ return config.kind === "native"
5
+ ? new NativeSubagentRuntime(config, options)
6
+ : new ClaudeCodeRuntime({
7
+ config,
8
+ backend: options.backend,
9
+ onEvent: options.onEvent,
10
+ now: () => options.deps.clock.now(),
11
+ });
12
+ }
13
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/subagents/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAoCrE,MAAM,UAAU,qBAAqB,CACnC,MAA6B,EAC7B,OAA+B;IAE/B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC7B,CAAC,CAAC,IAAI,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;QAC5C,CAAC,CAAC,IAAI,iBAAiB,CAAC;YACpB,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SACpC,CAAC,CAAC;AACT,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AgentRequestError } from "./errors.js";
3
+ const INLINE_BYTES = 4096;
4
+ const PAGE_CHARS = 16384;
5
+ const RETENTION_BYTES = 64 * 1024 * 1024;
6
+ export class AgentTrace {
7
+ entries = [];
8
+ contents = new Map();
9
+ bytes = 0;
10
+ sequence = 0;
11
+ evicted = false;
12
+ key = randomUUID();
13
+ append(event, timestamp = Date.now()) {
14
+ const seq = ++this.sequence;
15
+ let ref;
16
+ let retainedBytes = 0;
17
+ const store = (blocks) => {
18
+ blocks = boundedTraceBlocks(blocks);
19
+ const bytes = Buffer.byteLength(JSON.stringify(blocks));
20
+ if (bytes <= INLINE_BYTES && !blocks.some((block) => block.type === "image")) {
21
+ return { kind: "inline", blocks: structuredClone(blocks) };
22
+ }
23
+ ref = `${this.key}:${seq}`;
24
+ this.contents.set(ref, structuredClone(blocks));
25
+ retainedBytes = bytes;
26
+ return { kind: "reference", ref, bytes };
27
+ };
28
+ const entry = {
29
+ ...event,
30
+ seq,
31
+ timestamp,
32
+ ...("content" in event ? { content: store(event.content) } : {}),
33
+ ...("arguments" in event ? { arguments: store(event.arguments) } : {}),
34
+ };
35
+ const bytes = Buffer.byteLength(JSON.stringify(entry)) + retainedBytes;
36
+ this.entries.push({ entry, bytes, ref });
37
+ this.bytes += bytes;
38
+ while (this.bytes > RETENTION_BYTES || this.entries.length > 4096) {
39
+ const old = this.entries.shift();
40
+ this.bytes -= old.bytes;
41
+ if (old.ref)
42
+ this.contents.delete(old.ref);
43
+ this.evicted = true;
44
+ }
45
+ return seq;
46
+ }
47
+ trace(options) {
48
+ const query = JSON.stringify([options.kinds ?? null, options.toolName ?? null]);
49
+ let before = this.sequence + 1;
50
+ if (options.cursor) {
51
+ const cursor = this.decode(options.cursor);
52
+ if (cursor.query !== query || !Number.isInteger(cursor.before))
53
+ throw new AgentRequestError("invalid_cursor", "Invalid trace cursor");
54
+ before = cursor.before;
55
+ }
56
+ const matching = this.entries.filter(({ entry }) => entry.seq < before &&
57
+ (!options.kinds || options.kinds.includes(entry.kind)) &&
58
+ (!options.toolName || ("toolName" in entry && entry.toolName === options.toolName)));
59
+ const selected = matching.slice(-(options.limit ?? 20));
60
+ return {
61
+ entries: structuredClone(selected.map(({ entry }) => entry)),
62
+ nextCursor: matching.length > selected.length
63
+ ? this.encode({ query, before: selected[0].entry.seq })
64
+ : null,
65
+ historyEvicted: this.evicted,
66
+ };
67
+ }
68
+ readContent(options) {
69
+ const blocks = this.contents.get(options.ref);
70
+ if (!blocks)
71
+ throw new AgentRequestError("expired_content", "Unknown or expired content reference");
72
+ let index = 0;
73
+ let offset = 0;
74
+ if (options.cursor) {
75
+ const cursor = this.decode(options.cursor);
76
+ if (cursor.ref !== options.ref ||
77
+ !Number.isInteger(cursor.index) ||
78
+ !Number.isInteger(cursor.offset))
79
+ throw new AgentRequestError("invalid_cursor", "Invalid content cursor");
80
+ index = cursor.index;
81
+ offset = cursor.offset;
82
+ }
83
+ const block = blocks[index];
84
+ if (!block || offset < 0 || (block.type === "text" ? offset > block.text.length : offset !== 0))
85
+ throw new AgentRequestError("invalid_cursor", "Invalid content cursor");
86
+ let result;
87
+ if (block.type === "text") {
88
+ let end = Math.min(offset + PAGE_CHARS, block.text.length);
89
+ if (end < block.text.length && /[\uD800-\uDBFF]/.test(block.text[end - 1]))
90
+ end--;
91
+ result = { type: "text", text: block.text.slice(offset, end) };
92
+ offset = end;
93
+ if (end === block.text.length) {
94
+ index++;
95
+ offset = 0;
96
+ }
97
+ }
98
+ else {
99
+ result = structuredClone(block);
100
+ index++;
101
+ offset = 0;
102
+ }
103
+ return {
104
+ blocks: [result],
105
+ nextCursor: index < blocks.length ? this.encode({ ref: options.ref, index, offset }) : null,
106
+ };
107
+ }
108
+ readText(seq, maxChars = 30000) {
109
+ const entry = this.entries.find((item) => item.entry.seq === seq)?.entry;
110
+ if (!entry)
111
+ throw new AgentRequestError("expired_content", "Unknown or expired trace entry");
112
+ if (entry.kind !== "assistant" && entry.kind !== "tool_result")
113
+ throw new AgentRequestError("content_type", "Entry is not an assistant message or tool result");
114
+ const blocks = entry.content.kind === "inline" ? entry.content.blocks : this.contents.get(entry.content.ref);
115
+ if (!blocks)
116
+ throw new AgentRequestError("expired_content", "Expired content reference");
117
+ if (blocks.some((block) => block.type !== "text" && block.type !== "unavailable"))
118
+ throw new AgentRequestError("content_type", "Mixed content requires readContent");
119
+ const text = blocks.flatMap((block) => (block.type === "text" ? [block.text] : [])).join("");
120
+ let end = Math.min(maxChars, text.length);
121
+ if (end < text.length && /[\uD800-\uDBFF]/.test(text[end - 1]))
122
+ end--;
123
+ return {
124
+ text: text.slice(0, end),
125
+ complete: end === text.length && !blocks.some((block) => block.type === "unavailable"),
126
+ };
127
+ }
128
+ encode(value) {
129
+ return Buffer.from(JSON.stringify({ ...value, key: this.key })).toString("base64url");
130
+ }
131
+ decode(value) {
132
+ let cursor;
133
+ try {
134
+ cursor = JSON.parse(Buffer.from(value, "base64url").toString("utf8"));
135
+ }
136
+ catch {
137
+ throw new AgentRequestError("invalid_cursor", "Invalid cursor");
138
+ }
139
+ if (!cursor || typeof cursor !== "object" || !("key" in cursor) || cursor.key !== this.key)
140
+ throw new AgentRequestError("invalid_cursor", "Invalid cursor");
141
+ return cursor;
142
+ }
143
+ }
144
+ export function boundedTraceBlocks(blocks) {
145
+ return Buffer.byteLength(JSON.stringify(blocks)) <= 6 * 1024 * 1024
146
+ ? blocks
147
+ : [{ type: "unavailable", reason: "Content exceeds the 6 MiB retention limit." }];
148
+ }
149
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/core/subagents/trace.ts"],"names":[],"mappings":"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"}
@@ -771,6 +771,7 @@ class TelegramAdapterImpl {
771
771
  projects;
772
772
  defaultProjectId;
773
773
  systemMessage;
774
+ personaMenu;
774
775
  allowedUserIds;
775
776
  allowedChatIds;
776
777
  botUsername;
@@ -821,6 +822,7 @@ class TelegramAdapterImpl {
821
822
  this.projects = options.projects;
822
823
  this.defaultProjectId = options.defaultProjectId;
823
824
  this.systemMessage = options.systemMessage?.trim() || undefined;
825
+ this.personaMenu = options.personaMenu;
824
826
  this.allowedUserIds =
825
827
  options.allowedUserIds && options.allowedUserIds.length > 0
826
828
  ? new Set(options.allowedUserIds)
@@ -1559,16 +1561,48 @@ class TelegramAdapterImpl {
1559
1561
  await this.reply(chatId, "the session is still preparing.");
1560
1562
  return;
1561
1563
  }
1562
- const personas = snapshot.catalog.personas;
1564
+ const catalog = snapshot.catalog.personas;
1565
+ const currentPersonaId = snapshot.settings.personaId;
1566
+ const menu = this.personaMenu ?? catalog.map((persona) => ({ id: persona.id }));
1567
+ const personas = [];
1568
+ const missingIds = [];
1569
+ for (const entry of menu) {
1570
+ const persona = catalog.find((candidate) => candidate.id === entry.id);
1571
+ if (persona)
1572
+ personas.push({ id: persona.id, label: entry.label ?? persona.label ?? persona.id });
1573
+ else
1574
+ missingIds.push(entry.id);
1575
+ }
1576
+ const currentLabel = catalog.find((persona) => persona.id === currentPersonaId)?.label ?? currentPersonaId;
1577
+ const missingText = missingIds.length > 0
1578
+ ? `these personas from this bot's menu aren't available in this session: ${missingIds.join(", ")}.`
1579
+ : undefined;
1563
1580
  if (personas.length === 0) {
1564
- await this.reply(chatId, "this session has no personas.");
1581
+ if (!this.personaMenu) {
1582
+ await this.reply(chatId, "this session has no personas.");
1583
+ return;
1584
+ }
1585
+ const emptyText = this.personaMenu.length === 0
1586
+ ? "this bot's persona menu is empty, so there are no personas to switch to."
1587
+ : "none of the personas in this bot's menu are available in this session, so there are no personas to switch to.";
1588
+ const lines = [emptyText, missingText, `this session is using ${currentLabel}.`];
1589
+ await this.reply(chatId, lines.filter(Boolean).join("\n\n"));
1565
1590
  return;
1566
1591
  }
1592
+ const currentOutsideText = this.personaMenu && !personas.some((persona) => persona.id === currentPersonaId)
1593
+ ? `this session is using ${currentLabel}, which isn't in this menu.`
1594
+ : undefined;
1595
+ const lines = [
1596
+ "choose a persona for this session. switching is available only while Tau is idle.",
1597
+ currentOutsideText,
1598
+ missingText,
1599
+ ];
1567
1600
  this.personaPickers.set(chatId, {
1568
1601
  token: randomUUID(),
1569
1602
  sessionId: session.id,
1570
1603
  personas,
1571
- currentPersonaId: snapshot.settings.personaId,
1604
+ currentPersonaId,
1605
+ text: lines.filter(Boolean).join("\n\n"),
1572
1606
  });
1573
1607
  await this.showPersonaPage(chatId, 0);
1574
1608
  }
@@ -1583,7 +1617,7 @@ class TelegramAdapterImpl {
1583
1617
  const start = page * 20;
1584
1618
  const keyboard = picker.personas.slice(start, start + 20).map((persona, index) => [
1585
1619
  {
1586
- text: `${persona.label ?? persona.id}${persona.id === picker.currentPersonaId ? " (current)" : ""}`,
1620
+ text: `${persona.label}${persona.id === picker.currentPersonaId ? " (current)" : ""}`,
1587
1621
  callback_data: `persona:${picker.token}:select:${start + index}`,
1588
1622
  },
1589
1623
  ]);
@@ -1597,7 +1631,7 @@ class TelegramAdapterImpl {
1597
1631
  navigation.push({ text: "next", callback_data: `persona:${picker.token}:page:${page + 1}` });
1598
1632
  if (navigation.length > 0)
1599
1633
  keyboard.push(navigation);
1600
- const text = "choose a persona for this session. switching is available only while Tau is idle.";
1634
+ const text = picker.text;
1601
1635
  const replyMarkup = { inline_keyboard: keyboard };
1602
1636
  if (messageId !== undefined) {
1603
1637
  await this.sendWithRetry((signal) => this.api.editMessage(chatId, messageId, text, { replyMarkup, signal }));
@@ -1635,7 +1669,7 @@ class TelegramAdapterImpl {
1635
1669
  return;
1636
1670
  }
1637
1671
  this.personaPickers.delete(chatId);
1638
- const text = `switched to ${persona.label ?? persona.id}. this session is using ${snapshot.bootstrap.model.name || snapshot.bootstrap.model.id} with ${snapshot.settings.reasoning ?? "none"} reasoning.`;
1672
+ const text = `switched to ${persona.label}. this session is using ${snapshot.bootstrap.model.name || snapshot.bootstrap.model.id} with ${snapshot.settings.reasoning ?? "none"} reasoning.`;
1639
1673
  await this.sendWithRetry((signal) => this.api.editMessage(chatId, messageId, text, { signal }));
1640
1674
  }
1641
1675
  async handlePrompt(chatId, args) {