fixo-cli 1.0.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 (303) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +530 -0
  3. package/dist/agent/agent-client.d.ts +108 -0
  4. package/dist/agent/agent-client.d.ts.map +1 -0
  5. package/dist/agent/agent-client.js +1247 -0
  6. package/dist/agent/agent-client.js.map +1 -0
  7. package/dist/agent/agent-pool.d.ts +20 -0
  8. package/dist/agent/agent-pool.d.ts.map +1 -0
  9. package/dist/agent/agent-pool.js +217 -0
  10. package/dist/agent/agent-pool.js.map +1 -0
  11. package/dist/agent/background-awareness.d.ts +55 -0
  12. package/dist/agent/background-awareness.d.ts.map +1 -0
  13. package/dist/agent/background-awareness.js +104 -0
  14. package/dist/agent/background-awareness.js.map +1 -0
  15. package/dist/agent/command-parser.d.ts +33 -0
  16. package/dist/agent/command-parser.d.ts.map +1 -0
  17. package/dist/agent/command-parser.js +120 -0
  18. package/dist/agent/command-parser.js.map +1 -0
  19. package/dist/agent/context-budget.d.ts +91 -0
  20. package/dist/agent/context-budget.d.ts.map +1 -0
  21. package/dist/agent/context-budget.js +219 -0
  22. package/dist/agent/context-budget.js.map +1 -0
  23. package/dist/agent/conversation.d.ts +190 -0
  24. package/dist/agent/conversation.d.ts.map +1 -0
  25. package/dist/agent/conversation.js +547 -0
  26. package/dist/agent/conversation.js.map +1 -0
  27. package/dist/agent/hooks.d.ts +72 -0
  28. package/dist/agent/hooks.d.ts.map +1 -0
  29. package/dist/agent/hooks.js +214 -0
  30. package/dist/agent/hooks.js.map +1 -0
  31. package/dist/agent/mcp-bridge.d.ts +13 -0
  32. package/dist/agent/mcp-bridge.d.ts.map +1 -0
  33. package/dist/agent/mcp-bridge.js +86 -0
  34. package/dist/agent/mcp-bridge.js.map +1 -0
  35. package/dist/agent/mcp-client.d.ts +24 -0
  36. package/dist/agent/mcp-client.d.ts.map +1 -0
  37. package/dist/agent/mcp-client.js +146 -0
  38. package/dist/agent/mcp-client.js.map +1 -0
  39. package/dist/agent/mcp-manager.d.ts +13 -0
  40. package/dist/agent/mcp-manager.d.ts.map +1 -0
  41. package/dist/agent/mcp-manager.js +84 -0
  42. package/dist/agent/mcp-manager.js.map +1 -0
  43. package/dist/agent/mcp-registry.d.ts +45 -0
  44. package/dist/agent/mcp-registry.d.ts.map +1 -0
  45. package/dist/agent/mcp-registry.js +98 -0
  46. package/dist/agent/mcp-registry.js.map +1 -0
  47. package/dist/agent/orchestrator.d.ts +14 -0
  48. package/dist/agent/orchestrator.d.ts.map +1 -0
  49. package/dist/agent/orchestrator.js +118 -0
  50. package/dist/agent/orchestrator.js.map +1 -0
  51. package/dist/agent/parser-adapter.d.ts +120 -0
  52. package/dist/agent/parser-adapter.d.ts.map +1 -0
  53. package/dist/agent/parser-adapter.js +265 -0
  54. package/dist/agent/parser-adapter.js.map +1 -0
  55. package/dist/agent/parsers/imports.d.ts +11 -0
  56. package/dist/agent/parsers/imports.d.ts.map +1 -0
  57. package/dist/agent/parsers/imports.js +94 -0
  58. package/dist/agent/parsers/imports.js.map +1 -0
  59. package/dist/agent/parsers/shell.d.ts +23 -0
  60. package/dist/agent/parsers/shell.d.ts.map +1 -0
  61. package/dist/agent/parsers/shell.js +200 -0
  62. package/dist/agent/parsers/shell.js.map +1 -0
  63. package/dist/agent/parsers/symbols.d.ts +17 -0
  64. package/dist/agent/parsers/symbols.d.ts.map +1 -0
  65. package/dist/agent/parsers/symbols.js +103 -0
  66. package/dist/agent/parsers/symbols.js.map +1 -0
  67. package/dist/agent/permissions.d.ts +65 -0
  68. package/dist/agent/permissions.d.ts.map +1 -0
  69. package/dist/agent/permissions.js +219 -0
  70. package/dist/agent/permissions.js.map +1 -0
  71. package/dist/agent/predictive-gate.d.ts +69 -0
  72. package/dist/agent/predictive-gate.d.ts.map +1 -0
  73. package/dist/agent/predictive-gate.js +128 -0
  74. package/dist/agent/predictive-gate.js.map +1 -0
  75. package/dist/agent/provider-cooldown.d.ts +144 -0
  76. package/dist/agent/provider-cooldown.d.ts.map +1 -0
  77. package/dist/agent/provider-cooldown.js +300 -0
  78. package/dist/agent/provider-cooldown.js.map +1 -0
  79. package/dist/agent/providers-manager.d.ts +109 -0
  80. package/dist/agent/providers-manager.d.ts.map +1 -0
  81. package/dist/agent/providers-manager.js +464 -0
  82. package/dist/agent/providers-manager.js.map +1 -0
  83. package/dist/agent/repo-map.d.ts +6 -0
  84. package/dist/agent/repo-map.d.ts.map +1 -0
  85. package/dist/agent/repo-map.js +221 -0
  86. package/dist/agent/repo-map.js.map +1 -0
  87. package/dist/agent/retry.d.ts +103 -0
  88. package/dist/agent/retry.d.ts.map +1 -0
  89. package/dist/agent/retry.js +276 -0
  90. package/dist/agent/retry.js.map +1 -0
  91. package/dist/agent/search/index.d.ts +61 -0
  92. package/dist/agent/search/index.d.ts.map +1 -0
  93. package/dist/agent/search/index.js +314 -0
  94. package/dist/agent/search/index.js.map +1 -0
  95. package/dist/agent/single-agent.d.ts +76 -0
  96. package/dist/agent/single-agent.d.ts.map +1 -0
  97. package/dist/agent/single-agent.js +697 -0
  98. package/dist/agent/single-agent.js.map +1 -0
  99. package/dist/agent/skills.d.ts +22 -0
  100. package/dist/agent/skills.d.ts.map +1 -0
  101. package/dist/agent/skills.js +139 -0
  102. package/dist/agent/skills.js.map +1 -0
  103. package/dist/agent/stream-glue.d.ts +85 -0
  104. package/dist/agent/stream-glue.d.ts.map +1 -0
  105. package/dist/agent/stream-glue.js +120 -0
  106. package/dist/agent/stream-glue.js.map +1 -0
  107. package/dist/agent/subagent.d.ts +72 -0
  108. package/dist/agent/subagent.d.ts.map +1 -0
  109. package/dist/agent/subagent.js +193 -0
  110. package/dist/agent/subagent.js.map +1 -0
  111. package/dist/agent/telemetry.d.ts +192 -0
  112. package/dist/agent/telemetry.d.ts.map +1 -0
  113. package/dist/agent/telemetry.js +400 -0
  114. package/dist/agent/telemetry.js.map +1 -0
  115. package/dist/agent/tokenizer.d.ts +42 -0
  116. package/dist/agent/tokenizer.d.ts.map +1 -0
  117. package/dist/agent/tokenizer.js +107 -0
  118. package/dist/agent/tokenizer.js.map +1 -0
  119. package/dist/agent/tool-executor.d.ts +289 -0
  120. package/dist/agent/tool-executor.d.ts.map +1 -0
  121. package/dist/agent/tool-executor.js +2519 -0
  122. package/dist/agent/tool-executor.js.map +1 -0
  123. package/dist/agent/web-impl.d.ts +2 -0
  124. package/dist/agent/web-impl.d.ts.map +1 -0
  125. package/dist/agent/web-impl.js +34 -0
  126. package/dist/agent/web-impl.js.map +1 -0
  127. package/dist/agent/web.d.ts +8 -0
  128. package/dist/agent/web.d.ts.map +1 -0
  129. package/dist/agent/web.js +8 -0
  130. package/dist/agent/web.js.map +1 -0
  131. package/dist/agent/worker-agent.d.ts +27 -0
  132. package/dist/agent/worker-agent.d.ts.map +1 -0
  133. package/dist/agent/worker-agent.js +503 -0
  134. package/dist/agent/worker-agent.js.map +1 -0
  135. package/dist/config.d.ts +162 -0
  136. package/dist/config.d.ts.map +1 -0
  137. package/dist/config.js +138 -0
  138. package/dist/config.js.map +1 -0
  139. package/dist/context/fixo-md-watcher.d.ts +42 -0
  140. package/dist/context/fixo-md-watcher.d.ts.map +1 -0
  141. package/dist/context/fixo-md-watcher.js +126 -0
  142. package/dist/context/fixo-md-watcher.js.map +1 -0
  143. package/dist/context/fixo-md.d.ts +50 -0
  144. package/dist/context/fixo-md.d.ts.map +1 -0
  145. package/dist/context/fixo-md.js +118 -0
  146. package/dist/context/fixo-md.js.map +1 -0
  147. package/dist/context/todo.d.ts +65 -0
  148. package/dist/context/todo.d.ts.map +1 -0
  149. package/dist/context/todo.js +194 -0
  150. package/dist/context/todo.js.map +1 -0
  151. package/dist/git/git-manager.d.ts +33 -0
  152. package/dist/git/git-manager.d.ts.map +1 -0
  153. package/dist/git/git-manager.js +293 -0
  154. package/dist/git/git-manager.js.map +1 -0
  155. package/dist/git/git-ops.d.ts +10 -0
  156. package/dist/git/git-ops.d.ts.map +1 -0
  157. package/dist/git/git-ops.js +131 -0
  158. package/dist/git/git-ops.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +352 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/indexer.d.ts +30 -0
  164. package/dist/indexer.d.ts.map +1 -0
  165. package/dist/indexer.js +273 -0
  166. package/dist/indexer.js.map +1 -0
  167. package/dist/lsp/lsp-client.d.ts +24 -0
  168. package/dist/lsp/lsp-client.d.ts.map +1 -0
  169. package/dist/lsp/lsp-client.js +205 -0
  170. package/dist/lsp/lsp-client.js.map +1 -0
  171. package/dist/lsp/lsp-manager.d.ts +17 -0
  172. package/dist/lsp/lsp-manager.d.ts.map +1 -0
  173. package/dist/lsp/lsp-manager.js +154 -0
  174. package/dist/lsp/lsp-manager.js.map +1 -0
  175. package/dist/lsp/lsp-pre-save.d.ts +137 -0
  176. package/dist/lsp/lsp-pre-save.d.ts.map +1 -0
  177. package/dist/lsp/lsp-pre-save.js +245 -0
  178. package/dist/lsp/lsp-pre-save.js.map +1 -0
  179. package/dist/lsp/syntax-fallback.d.ts +83 -0
  180. package/dist/lsp/syntax-fallback.d.ts.map +1 -0
  181. package/dist/lsp/syntax-fallback.js +275 -0
  182. package/dist/lsp/syntax-fallback.js.map +1 -0
  183. package/dist/model-outcomes.d.ts +12 -0
  184. package/dist/model-outcomes.d.ts.map +1 -0
  185. package/dist/model-outcomes.js +46 -0
  186. package/dist/model-outcomes.js.map +1 -0
  187. package/dist/planner.d.ts +32 -0
  188. package/dist/planner.d.ts.map +1 -0
  189. package/dist/planner.js +163 -0
  190. package/dist/planner.js.map +1 -0
  191. package/dist/project-memory.d.ts +29 -0
  192. package/dist/project-memory.d.ts.map +1 -0
  193. package/dist/project-memory.js +349 -0
  194. package/dist/project-memory.js.map +1 -0
  195. package/dist/review.d.ts +2 -0
  196. package/dist/review.d.ts.map +1 -0
  197. package/dist/review.js +61 -0
  198. package/dist/review.js.map +1 -0
  199. package/dist/runtime/background-jobs.d.ts +97 -0
  200. package/dist/runtime/background-jobs.d.ts.map +1 -0
  201. package/dist/runtime/background-jobs.js +331 -0
  202. package/dist/runtime/background-jobs.js.map +1 -0
  203. package/dist/runtime/credential-vault.d.ts +124 -0
  204. package/dist/runtime/credential-vault.d.ts.map +1 -0
  205. package/dist/runtime/credential-vault.js +184 -0
  206. package/dist/runtime/credential-vault.js.map +1 -0
  207. package/dist/runtime/loop-trap.d.ts +197 -0
  208. package/dist/runtime/loop-trap.d.ts.map +1 -0
  209. package/dist/runtime/loop-trap.js +420 -0
  210. package/dist/runtime/loop-trap.js.map +1 -0
  211. package/dist/runtime/policy.d.ts +15 -0
  212. package/dist/runtime/policy.d.ts.map +1 -0
  213. package/dist/runtime/policy.js +60 -0
  214. package/dist/runtime/policy.js.map +1 -0
  215. package/dist/runtime/redaction.d.ts +66 -0
  216. package/dist/runtime/redaction.d.ts.map +1 -0
  217. package/dist/runtime/redaction.js +155 -0
  218. package/dist/runtime/redaction.js.map +1 -0
  219. package/dist/runtime/session-snapshots.d.ts +76 -0
  220. package/dist/runtime/session-snapshots.d.ts.map +1 -0
  221. package/dist/runtime/session-snapshots.js +166 -0
  222. package/dist/runtime/session-snapshots.js.map +1 -0
  223. package/dist/runtime/staging.d.ts +205 -0
  224. package/dist/runtime/staging.d.ts.map +1 -0
  225. package/dist/runtime/staging.js +526 -0
  226. package/dist/runtime/staging.js.map +1 -0
  227. package/dist/runtime/task-session.d.ts +95 -0
  228. package/dist/runtime/task-session.d.ts.map +1 -0
  229. package/dist/runtime/task-session.js +263 -0
  230. package/dist/runtime/task-session.js.map +1 -0
  231. package/dist/runtime/worktree.d.ts +55 -0
  232. package/dist/runtime/worktree.d.ts.map +1 -0
  233. package/dist/runtime/worktree.js +175 -0
  234. package/dist/runtime/worktree.js.map +1 -0
  235. package/dist/setup-wizard.d.ts +8 -0
  236. package/dist/setup-wizard.d.ts.map +1 -0
  237. package/dist/setup-wizard.js +73 -0
  238. package/dist/setup-wizard.js.map +1 -0
  239. package/dist/shared/content.d.ts +43 -0
  240. package/dist/shared/content.d.ts.map +1 -0
  241. package/dist/shared/content.js +61 -0
  242. package/dist/shared/content.js.map +1 -0
  243. package/dist/shared/types.d.ts +217 -0
  244. package/dist/shared/types.d.ts.map +1 -0
  245. package/dist/shared/types.js +3 -0
  246. package/dist/shared/types.js.map +1 -0
  247. package/dist/test-runner.d.ts +5 -0
  248. package/dist/test-runner.d.ts.map +1 -0
  249. package/dist/test-runner.js +42 -0
  250. package/dist/test-runner.js.map +1 -0
  251. package/dist/types.d.ts +85 -0
  252. package/dist/types.d.ts.map +1 -0
  253. package/dist/types.js +2 -0
  254. package/dist/types.js.map +1 -0
  255. package/dist/ui/ascii.d.ts +23 -0
  256. package/dist/ui/ascii.d.ts.map +1 -0
  257. package/dist/ui/ascii.js +45 -0
  258. package/dist/ui/ascii.js.map +1 -0
  259. package/dist/ui/colors.d.ts +111 -0
  260. package/dist/ui/colors.d.ts.map +1 -0
  261. package/dist/ui/colors.js +166 -0
  262. package/dist/ui/colors.js.map +1 -0
  263. package/dist/ui/image-attach.d.ts +27 -0
  264. package/dist/ui/image-attach.d.ts.map +1 -0
  265. package/dist/ui/image-attach.js +100 -0
  266. package/dist/ui/image-attach.js.map +1 -0
  267. package/dist/ui/index.d.ts +18 -0
  268. package/dist/ui/index.d.ts.map +1 -0
  269. package/dist/ui/index.js +18 -0
  270. package/dist/ui/index.js.map +1 -0
  271. package/dist/ui/markdown-stream.d.ts +91 -0
  272. package/dist/ui/markdown-stream.d.ts.map +1 -0
  273. package/dist/ui/markdown-stream.js +524 -0
  274. package/dist/ui/markdown-stream.js.map +1 -0
  275. package/dist/ui/plan-renderer.d.ts +36 -0
  276. package/dist/ui/plan-renderer.d.ts.map +1 -0
  277. package/dist/ui/plan-renderer.js +79 -0
  278. package/dist/ui/plan-renderer.js.map +1 -0
  279. package/dist/ui/prompt.d.ts +11 -0
  280. package/dist/ui/prompt.d.ts.map +1 -0
  281. package/dist/ui/prompt.js +1960 -0
  282. package/dist/ui/prompt.js.map +1 -0
  283. package/dist/ui/render-primitives.d.ts +117 -0
  284. package/dist/ui/render-primitives.d.ts.map +1 -0
  285. package/dist/ui/render-primitives.js +322 -0
  286. package/dist/ui/render-primitives.js.map +1 -0
  287. package/dist/ui/render.d.ts +133 -0
  288. package/dist/ui/render.d.ts.map +1 -0
  289. package/dist/ui/render.js +547 -0
  290. package/dist/ui/render.js.map +1 -0
  291. package/dist/ui/session-header.d.ts +30 -0
  292. package/dist/ui/session-header.d.ts.map +1 -0
  293. package/dist/ui/session-header.js +74 -0
  294. package/dist/ui/session-header.js.map +1 -0
  295. package/dist/workspace-guard.d.ts +68 -0
  296. package/dist/workspace-guard.d.ts.map +1 -0
  297. package/dist/workspace-guard.js +168 -0
  298. package/dist/workspace-guard.js.map +1 -0
  299. package/dist/workspace-lock.d.ts +27 -0
  300. package/dist/workspace-lock.d.ts.map +1 -0
  301. package/dist/workspace-lock.js +95 -0
  302. package/dist/workspace-lock.js.map +1 -0
  303. package/package.json +63 -0
@@ -0,0 +1,193 @@
1
+ /**
2
+ * subagent.ts — Isolated WorkerAgent driver.
3
+ *
4
+ * Phase 3.2: lets the parent agent delegate a sub-task to a
5
+ * fresh WorkerAgent whose conversation history is *not* shared
6
+ * with the parent. The subagent runs in BUILD mode (mutating
7
+ * allowed) regardless of the parent's mode, and returns a
8
+ * structured {@link SubagentResult} whose `transcript` field
9
+ * carries only the final summary — never the raw tool log —
10
+ * so the parent's context never bloats.
11
+ *
12
+ * Safety:
13
+ * - `selectedFiles` is replaced with the caller-supplied
14
+ * `contextFiles` (default: empty). The parent cannot leak
15
+ * its own pin-set into the subagent.
16
+ * - The subagent always runs in BUILD mode and inherits the
17
+ * parent's `cwd` and `policy`.
18
+ * - The subagent's own policy/permission engine still gates
19
+ * every tool call — there is no escape hatch.
20
+ * - If `runInBackground` is true, the spawn is fire-and-forget
21
+ * and a `jobId` is returned. The caller can poll via the
22
+ * shared BackgroundJobRegistry (Phase 3.1).
23
+ */
24
+ import { randomUUID } from 'node:crypto';
25
+ import { WorkerAgent } from './worker-agent.js';
26
+ import { recordTelemetry, telemetry } from './telemetry.js';
27
+ const DEFAULT_INTERNAL_OPTIONS = {
28
+ summaryOnly: true,
29
+ cleanHistory: true,
30
+ };
31
+ const MAX_LOCAL_TOOL_CALLS_DEFAULT = 15;
32
+ /**
33
+ * Spawn a subagent. Returns immediately when `runInBackground`
34
+ * is true; otherwise awaits the subagent's completion and
35
+ * returns its final summary.
36
+ */
37
+ export async function spawnSubagent(req, parentCtx, internalOpts = {}) {
38
+ const opts = { ...DEFAULT_INTERNAL_OPTIONS, ...internalOpts };
39
+ const start = Date.now();
40
+ const id = `subagent_${randomUUID().slice(0, 8)}`;
41
+ // The subagent inherits the parent's cwd and policy but
42
+ // gets a *fresh* AgentContext. selectedFiles is replaced
43
+ // with the caller's contextFiles (default empty) so the
44
+ // parent cannot leak its pin-set.
45
+ const subagentCtx = {
46
+ task: req.task,
47
+ model: parentCtx.model,
48
+ cwd: parentCtx.cwd,
49
+ verbose: parentCtx.verbose,
50
+ selectedFiles: req.contextFiles ? [...req.contextFiles] : [],
51
+ systemPromptOverride: undefined, // never inherit the parent's override
52
+ checkCommand: undefined,
53
+ policy: parentCtx.policy,
54
+ yes: parentCtx.yes,
55
+ // Phase 3.2 hard rule: subagents are always mutating.
56
+ mode: 'BUILD',
57
+ };
58
+ if (req.runInBackground) {
59
+ // Fire-and-forget. The caller polls by jobId.
60
+ void runSubagentInBackground(id, req, subagentCtx, opts, start);
61
+ return {
62
+ success: true,
63
+ summary: '(subagent running in background)',
64
+ tokensUsed: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
65
+ toolCallCount: 0,
66
+ durationMs: 0,
67
+ type: req.type,
68
+ transcript: '',
69
+ jobId: id,
70
+ };
71
+ }
72
+ return await runSubagentInline(id, req, subagentCtx, opts, start);
73
+ }
74
+ async function runSubagentInline(id, req, subagentCtx, _opts, start) {
75
+ const subtask = {
76
+ id,
77
+ title: req.task.slice(0, 80),
78
+ description: req.task,
79
+ persona: 'code',
80
+ dependencies: [],
81
+ files: req.contextFiles ?? [],
82
+ status: 'running',
83
+ };
84
+ const worker = new WorkerAgent(subagentCtx.verbose);
85
+ const noopBudget = () => undefined;
86
+ try {
87
+ const inner = await worker.run(subagentCtx, subtask, noopBudget);
88
+ const durationMs = Date.now() - start;
89
+ const tokensUsed = inner.tokensUsed;
90
+ const summary = extractSummary(inner.output);
91
+ recordTelemetry(telemetry.subagentSummary({
92
+ taskType: req.type,
93
+ inputTokens: tokensUsed.prompt_tokens,
94
+ outputTokens: tokensUsed.completion_tokens,
95
+ durationMs,
96
+ }));
97
+ return {
98
+ success: inner.success,
99
+ summary,
100
+ tokensUsed,
101
+ toolCallCount: inner.toolCallCount,
102
+ durationMs,
103
+ type: req.type,
104
+ transcript: opts_transcript(inner.output, summary),
105
+ };
106
+ }
107
+ catch (err) {
108
+ const msg = err.message ?? String(err);
109
+ recordTelemetry(telemetry.subagentSummary({
110
+ taskType: req.type,
111
+ inputTokens: 0,
112
+ outputTokens: 0,
113
+ durationMs: Date.now() - start,
114
+ }));
115
+ return {
116
+ success: false,
117
+ summary: `Subagent failed: ${msg}`,
118
+ tokensUsed: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
119
+ toolCallCount: 0,
120
+ durationMs: Date.now() - start,
121
+ type: req.type,
122
+ transcript: '',
123
+ };
124
+ }
125
+ }
126
+ async function runSubagentInBackground(id, req, subagentCtx, opts, start) {
127
+ try {
128
+ const result = await runSubagentInline(id, req, subagentCtx, opts, start);
129
+ // Stash the result in a small global in-memory cache so
130
+ // `/jobs` or a future `poll_subagent` can read it back.
131
+ backgroundSubagentResults.set(id, result);
132
+ }
133
+ catch (err) {
134
+ backgroundSubagentResults.set(id, {
135
+ success: false,
136
+ summary: `Subagent crashed: ${err.message}`,
137
+ tokensUsed: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
138
+ toolCallCount: 0,
139
+ durationMs: Date.now() - start,
140
+ type: req.type,
141
+ transcript: '',
142
+ });
143
+ }
144
+ }
145
+ const backgroundSubagentResults = new Map();
146
+ /** Read the latest result for a background subagent. */
147
+ export function getBackgroundSubagentResult(jobId) {
148
+ return backgroundSubagentResults.get(jobId) ?? null;
149
+ }
150
+ /** Clear the background subagent cache (test-only). */
151
+ export function _resetBackgroundSubagents() {
152
+ backgroundSubagentResults.clear();
153
+ }
154
+ /**
155
+ * Build the subagent's `AgentContext` from the parent context
156
+ * and a request. Exposed for testability — the actual subagent
157
+ * is constructed inside `spawnSubagent`.
158
+ *
159
+ * Invariants locked by Phase 3.2:
160
+ * - `mode` is forced to 'BUILD'
161
+ * - `selectedFiles` is replaced by `req.contextFiles` (or [])
162
+ * - `systemPromptOverride` is dropped
163
+ * - `cwd`, `policy`, `yes`, `model`, `verbose` are inherited
164
+ */
165
+ export function buildSubagentContext(req, parentCtx) {
166
+ return {
167
+ task: req.task,
168
+ model: parentCtx.model,
169
+ cwd: parentCtx.cwd,
170
+ verbose: parentCtx.verbose,
171
+ selectedFiles: req.contextFiles ? [...req.contextFiles] : [],
172
+ systemPromptOverride: undefined,
173
+ checkCommand: undefined,
174
+ policy: parentCtx.policy,
175
+ yes: parentCtx.yes,
176
+ mode: 'BUILD',
177
+ };
178
+ }
179
+ /* ──────────────────────── helpers ──────────────────────── */
180
+ function extractSummary(rawOutput) {
181
+ // The WorkerAgent returns the assistant's final `content`
182
+ // field. When `summaryOnly` is on, this is the only piece
183
+ // of output the parent gets to see. We do *not* parse the
184
+ // raw output further — that would risk leaking tool log.
185
+ return rawOutput.trim();
186
+ }
187
+ function opts_transcript(rawOutput, summary) {
188
+ // When `summaryOnly` is true, transcript === summary. We
189
+ // still pass the raw output as a fallback so the parent
190
+ // can recover more context if it asks for it explicitly.
191
+ return summary.length > 0 ? summary : rawOutput;
192
+ }
193
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/agent/subagent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Telemetry — local NDJSON sink + on-demand failure diagnosis.
3
+ *
4
+ * The original `logTelemetry` shipped a remote-only HTTP poster to
5
+ * the FreeLLMAPI server. Pillar 5 (Telemetry) replaces it with a
6
+ * first-class, *local-first* event store:
7
+ *
8
+ * - All events are appended to `~/.fixocli/telemetry.jsonl` in
9
+ * newline-delimited JSON. One event per line, easy to tail,
10
+ * grep, and post-process.
11
+ * - The legacy remote poster is preserved as an opt-in
12
+ * secondary sink (controlled by `preferences.telemetryRemote`).
13
+ * - The on-disk log is rotated at 1 MiB with a single `.1`
14
+ * backup, so disk usage is bounded.
15
+ * - `diagnoseFailures(windowMs)` reads the last N events and
16
+ * produces human-readable remediation hints — useful for
17
+ * `/diagnose` slash commands and for the post-mortem shown
18
+ * when a tool call exhausts its budget.
19
+ *
20
+ * The module is *side-effect free at import time*; the file is
21
+ * opened lazily on first write so the CLI cold-start is unaffected.
22
+ *
23
+ * The previous public surface — `logTelemetry(payload)` and the
24
+ * `TelemetryPayload` interface — is preserved so the 7 existing
25
+ * callsites in `worker-agent.ts` and `agent-pool.ts` keep working
26
+ * without modification. New code should prefer `TelemetrySink`
27
+ * directly.
28
+ */
29
+ /** Discriminated union of every event the system can emit. */
30
+ export type TelemetryEventType = 'tool_call' | 'session_start' | 'session_end' | 'retry' | 'cooldown' | 'stream_resume' | 'stream_resume_exhausted' | 'context_budget' | 'provider_error' | 'tool_surgical_edit' | 'tool_glob' | 'tool_async_spawn' | 'subagent_summary' | 'fixo_md_loaded' | 'todo_mutation' | 'session_snapshot' | 'hook_fired' | 'permission_decision';
31
+ export interface TelemetryEvent {
32
+ /** ISO timestamp the event was recorded. */
33
+ readonly ts: string;
34
+ /** Discriminator — see {@link TelemetryEventType}. */
35
+ readonly type: TelemetryEventType;
36
+ /** Stable, anonymised machine id (not the user's hostname). */
37
+ readonly sid: string;
38
+ /** Free-form fields. The shape depends on `type`; see the
39
+ * per-type helpers below for ergonomic constructors. */
40
+ readonly fields: Readonly<Record<string, unknown>>;
41
+ }
42
+ /** Legacy payload shape preserved for `logTelemetry` compatibility. */
43
+ export interface TelemetryPayload {
44
+ id: string;
45
+ tool: string;
46
+ arguments: unknown;
47
+ status: 'started' | 'completed' | 'failed';
48
+ error?: string;
49
+ originalContent?: string;
50
+ newContent?: string;
51
+ }
52
+ export declare const telemetry: {
53
+ toolCall(fields: {
54
+ tool: string;
55
+ status: "started" | "completed" | "failed";
56
+ error?: string;
57
+ durationMs?: number;
58
+ }): TelemetryEvent;
59
+ retry(fields: {
60
+ fn: string;
61
+ attempt: number;
62
+ delayMs: number;
63
+ error: string;
64
+ }): TelemetryEvent;
65
+ cooldown(fields: {
66
+ providerId: string;
67
+ status: number | string;
68
+ cooldownMs: number;
69
+ reason: string;
70
+ }): TelemetryEvent;
71
+ streamResume(fields: {
72
+ resumeAttempt: number;
73
+ partialTokens: number;
74
+ ok: boolean;
75
+ reason?: string;
76
+ }): TelemetryEvent;
77
+ contextBudget(fields: {
78
+ tokensBefore: number;
79
+ tokensAfter: number;
80
+ actions: string[];
81
+ markedForCompaction: boolean;
82
+ }): TelemetryEvent;
83
+ providerError(fields: {
84
+ providerId: string;
85
+ status: number;
86
+ message: string;
87
+ }): TelemetryEvent;
88
+ sessionStart(fields: {
89
+ model: string;
90
+ cwd: string;
91
+ }): TelemetryEvent;
92
+ sessionEnd(fields: {
93
+ durationMs: number;
94
+ toolCalls: number;
95
+ totalTokens: number;
96
+ }): TelemetryEvent;
97
+ surgicalEdit(fields: {
98
+ path: string;
99
+ occurrences: number;
100
+ mode: string;
101
+ bytes: number;
102
+ }): TelemetryEvent;
103
+ glob(fields: {
104
+ pattern: string;
105
+ returned: number;
106
+ truncated: boolean;
107
+ }): TelemetryEvent;
108
+ fixoMdLoaded(fields: {
109
+ source: string;
110
+ bytes: number;
111
+ }): TelemetryEvent;
112
+ todoMutation(fields: {
113
+ op: string;
114
+ items: number;
115
+ id?: string;
116
+ }): TelemetryEvent;
117
+ sessionSnapshot(fields: {
118
+ id: string;
119
+ op: "save" | "load";
120
+ tokens: number;
121
+ items: number;
122
+ }): TelemetryEvent;
123
+ asyncSpawn(fields: {
124
+ jobId: string;
125
+ cmd: string;
126
+ pid?: number;
127
+ }): TelemetryEvent;
128
+ subagentSummary(fields: {
129
+ taskType: string;
130
+ inputTokens: number;
131
+ outputTokens: number;
132
+ durationMs: number;
133
+ }): TelemetryEvent;
134
+ hookFired(fields: {
135
+ hook: string;
136
+ phase: "pre" | "post";
137
+ matched: boolean;
138
+ durationMs: number;
139
+ }): TelemetryEvent;
140
+ permissionDecision(fields: {
141
+ tool: string;
142
+ pattern: string;
143
+ decision: string;
144
+ }): TelemetryEvent;
145
+ };
146
+ /** Path to the local NDJSON sink. Exposed for tests and the
147
+ * `/diagnose` slash command. */
148
+ export declare function getTelemetryPath(): string;
149
+ /**
150
+ * Append an event to the local NDJSON sink. The file is opened in
151
+ * append mode for every write — the cost of an open/close cycle
152
+ * is negligible compared to the JSON.stringify call.
153
+ *
154
+ * Returns true on success, false on any error. Errors are swallowed
155
+ * because telemetry must never break the calling code.
156
+ */
157
+ export declare function recordTelemetry(event: TelemetryEvent): boolean;
158
+ /** Read the last N events (most recent last). Safe to call when the
159
+ * file is missing or empty — returns []. */
160
+ export declare function readRecentEvents(limit?: number): TelemetryEvent[];
161
+ /** Clear the local sink. Test-only; not exposed in the UI. */
162
+ export declare function clearTelemetry(): void;
163
+ export interface DiagnosisHint {
164
+ /** Short, human-readable summary. */
165
+ readonly summary: string;
166
+ /** Severity: info | warn | error. */
167
+ readonly severity: 'info' | 'warn' | 'error';
168
+ /** Number of matching events in the window. */
169
+ readonly count: number;
170
+ /** Suggested action for the user. */
171
+ readonly suggestion: string;
172
+ }
173
+ /**
174
+ * Scan the recent event window and return a prioritised list of
175
+ * remediation hints. Pure function — does not modify state.
176
+ *
177
+ * Rules implemented:
178
+ * - 3+ retries in the window → "Flaky network or rate-limit" (warn)
179
+ * - 1+ cooldown event → "Provider X is rate-limited" (warn)
180
+ * - 1+ stream_resume_exhausted → "Stream cuts not recovering" (error)
181
+ * - 1+ context_budget with compact → "Context is filling up" (info)
182
+ * - 3+ tool_call failures of same tool → "Tool X keeps failing" (warn)
183
+ * - 5+ provider_error in window → "Provider outage" (error)
184
+ */
185
+ export declare function diagnoseFailures(windowMs?: number): DiagnosisHint[];
186
+ /**
187
+ * @deprecated Prefer the typed helpers on the `telemetry` object and
188
+ * `recordTelemetry()` directly. This wrapper maps a `TelemetryPayload`
189
+ * to a `tool_call` event.
190
+ */
191
+ export declare function logTelemetry(payload: TelemetryPayload): Promise<void>;
192
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/agent/telemetry.ts"],"names":[],"mappings":"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"}