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,289 @@
1
+ import type { ChatToolDefinition } from '../shared/types.js';
2
+ import type { TaskSession } from '../runtime/task-session.js';
3
+ import { type PolicyProfile } from '../runtime/policy.js';
4
+ import { McpManager } from './mcp-manager.js';
5
+ import type { AgentClient } from './agent-client.js';
6
+ import { type SafetyConfig } from '../config.js';
7
+ import { LspPreSaveGate } from '../lsp/lsp-pre-save.js';
8
+ import { McpBridgeManager } from './mcp-bridge.js';
9
+ import { LspManager } from '../lsp/lsp-manager.js';
10
+ import { type TodoStatus } from '../context/todo.js';
11
+ import { BackgroundJobRegistry, type JobSnapshot } from '../runtime/background-jobs.js';
12
+ export declare const mcpManager: McpManager;
13
+ export declare const mcpBridgeManager: McpBridgeManager;
14
+ export declare function getLspManager(workspaceRoot: string): LspManager;
15
+ export declare function stopLspManager(): Promise<void>;
16
+ export interface LoadedPlugin {
17
+ path: string;
18
+ tools: ChatToolDefinition[];
19
+ execute: (name: string, args: Record<string, any>, context: any) => Promise<string>;
20
+ }
21
+ export declare const loadedPlugins: LoadedPlugin[];
22
+ export declare function initializePlugins(cwd: string, projectConfig?: any): Promise<void>;
23
+ /**
24
+ * Names of all tools that perform a write / mutation. Used by
25
+ * {@link getActiveTools} to enforce role-based tool masking
26
+ * (Pillar 5 / Protection 2 — Strict Runtime Role Isolation).
27
+ * Kept as a Set for O(1) membership checks; never read in
28
+ * production paths.
29
+ */
30
+ export declare const MUTATION_TOOL_NAMES: ReadonlySet<string>;
31
+ /**
32
+ * Build the active tool list for a given execution role. The
33
+ * mode argument is the role the agent is operating in:
34
+ *
35
+ * - `BUILD` — the default; all tools are available.
36
+ * - `EXPLORE` — only read + LSP navigation tools.
37
+ * - `SCOUT` — only web fetch / search.
38
+ * - `PLAN` — read + web + LSP, but no mutations.
39
+ * - `READ_ONLY` (Pillar 5) — no mutation tools at all.
40
+ * This is the role forced on during vulnerability audits,
41
+ * reviews, and explanations, so the LLM has zero
42
+ * visibility of code-writing tools and cannot accidentally
43
+ * mutate the workspace.
44
+ */
45
+ export declare function getActiveTools(mode?: string): ChatToolDefinition[];
46
+ /**
47
+ * Classify a task into an execution role. Read-only tasks
48
+ * (analysis, explanation, review) get the `READ_ONLY` role so
49
+ * mutation tools are not even visible to the model. This is
50
+ * the dynamic-tool-masking layer of Pillar 5.
51
+ */
52
+ export declare function classifyExecutionRole(task: string): 'BUILD' | 'READ_ONLY';
53
+ export declare const TOOL_DEFINITIONS: ChatToolDefinition[];
54
+ export interface ToolCallEvent {
55
+ tool: string;
56
+ args: Record<string, string>;
57
+ result: string;
58
+ isWrite: boolean;
59
+ affectedPath?: string;
60
+ }
61
+ export interface ToolExecutionOptions {
62
+ session?: TaskSession;
63
+ policy?: PolicyProfile;
64
+ allowWithoutPrompt?: boolean;
65
+ client?: AgentClient;
66
+ model?: string;
67
+ /**
68
+ * Safety preferences (Pillar 1/2/3). When
69
+ * `preferences.safety.atomicStaging` is true, file writes are
70
+ * routed through {@link AtomicStagingManager} so the swap is
71
+ * atomic and rollback is possible. When undefined, the legacy
72
+ * direct-write path is used.
73
+ */
74
+ safety?: SafetyConfig;
75
+ /**
76
+ * Execution mode (`'PLAN' | 'BUILD' | 'EXPLORE' | 'SCOUT'`).
77
+ * Surfaced to the executor so mutating tools can refuse to
78
+ * run under read-only modes. Optional — when omitted, mutating
79
+ * tools default to allowing execution.
80
+ */
81
+ mode?: 'PLAN' | 'BUILD' | 'EXPLORE' | 'SCOUT';
82
+ /**
83
+ * Callback returning the current conversation token count.
84
+ * Used by the predictive context-budget gate (Phase 4) to
85
+ * decide whether a `read_file` would push the next request
86
+ * over the model's input window. When omitted, the gate
87
+ * treats conversation pressure as 0 and only considers the
88
+ * file's own projected cost.
89
+ */
90
+ getConversationTokens?: () => number;
91
+ }
92
+ /**
93
+ * Lazily generate a per-process run id. Used to namespace
94
+ * `.fixo/staging/<runId>/` so concurrent runs against the same
95
+ * workspace never collide. The id is a 12-character base36 token.
96
+ */
97
+ export declare function getOrCreateRunId(): string;
98
+ /** Test/utility hook — reset the cached run id. */
99
+ export declare function resetRunId(): void;
100
+ /**
101
+ * Lazily construct a singleton {@link LspPreSaveGate} that wires
102
+ * the tool-executor to the live `LspManager`. Mode is read from
103
+ * the user's safety config (default: `'warn'`). The gate is a
104
+ * no-op when no language server is installed on `PATH`, matching
105
+ * the existing `LspManager` behaviour.
106
+ */
107
+ export declare function getOrCreateLspGate(cwd: string, safety: SafetyConfig): LspPreSaveGate;
108
+ /** Test/utility hook — reset the cached gate. */
109
+ export declare function resetLspGate(): void;
110
+ /**
111
+ * Execute a tool call and return its result string.
112
+ * Also logs the operation to the terminal with colored output.
113
+ */
114
+ export declare function executeTool(name: string, args: Record<string, string>, cwd: string, verbose?: boolean, options?: ToolExecutionOptions): Promise<ToolCallEvent>;
115
+ /**
116
+ * Runtime execution context shared by every {@link ToolSpecification}.
117
+ * Replaces the loose `any`-typed context that previously lived in
118
+ * `LoadedPlugin.execute` so the type system enforces a uniform
119
+ * contract across the registry.
120
+ */
121
+ export interface ToolExecutionContext {
122
+ readonly cwd: string;
123
+ readonly verbose: boolean;
124
+ readonly options: ToolExecutionOptions;
125
+ }
126
+ /**
127
+ * Compile-time type for an individual tool. Each new tool added to
128
+ * {@link TOOL_REGISTRY} must satisfy this contract: a strongly-typed
129
+ * `args` payload (`TArgs`) and a strongly-typed `execute` callback
130
+ * returning `TResult` (default `string` to match the existing
131
+ * `executeTool` surface).
132
+ *
133
+ * The `parameters` field is the JSON-Schema description that is sent
134
+ * to the LLM — it mirrors {@link ChatToolDefinition.function.parameters}
135
+ * so the existing `TOOL_DEFINITIONS` array and the registry stay in
136
+ * lock-step. Two tools must agree on `name` and `parameters` to be
137
+ * safely exposed to the LLM.
138
+ */
139
+ export interface ToolSpecification<TArgs extends Record<string, any> = Record<string, any>, TResult = string> {
140
+ readonly name: string;
141
+ readonly description: string;
142
+ readonly parameters: {
143
+ readonly type: 'object';
144
+ readonly properties: Record<string, any>;
145
+ readonly required: string[];
146
+ };
147
+ execute(args: TArgs, context: ToolExecutionContext): Promise<TResult>;
148
+ }
149
+ export interface StrReplaceArgs {
150
+ /** File path, relative to workspace root or absolute. */
151
+ path: string;
152
+ /** Substring to hunt down inside the file. */
153
+ oldString: string;
154
+ /** Replacement content. */
155
+ newString: string;
156
+ /** When true, substitute every occurrence. Default false. */
157
+ replaceAll?: boolean;
158
+ /** When true (default), abort on non-unique matches. */
159
+ expectUnique?: boolean;
160
+ }
161
+ export interface GlobArgs {
162
+ /** Glob pattern, e.g. `src` followed by `**` then `*.ts`. */
163
+ pattern: string;
164
+ /** Optional scope; must resolve inside the workspace. */
165
+ cwd?: string;
166
+ /** Optional extra ignore pattern (single string or comma-separated). */
167
+ ignore?: string;
168
+ /** Default 1000, hard cap 5000. */
169
+ maxResults?: number;
170
+ /** Default false. */
171
+ includeHidden?: boolean;
172
+ /** Default false. */
173
+ followSymlinks?: boolean;
174
+ }
175
+ /**
176
+ * Thrown by the `str_replace` tool when the replacement cannot be
177
+ * applied. The error is surfaced to the model as a structured tool
178
+ * result so the next turn can react to the precise reason.
179
+ */
180
+ export declare class SurgicalReplaceError extends Error {
181
+ readonly code: 'old_string_not_found' | 'old_string_ambiguous' | 'plan_mode_rejected' | 'platform_path_locked' | 'workspace_escape' | 'binary_file' | 'invalid_args';
182
+ readonly details: Readonly<Record<string, unknown>>;
183
+ constructor(message: string, code: SurgicalReplaceError['code'], details?: Readonly<Record<string, unknown>>);
184
+ }
185
+ /**
186
+ * Thrown by the `glob_files` tool for any non-recoverable traversal
187
+ * failure (workspace escape, invalid pattern, etc.).
188
+ */
189
+ export declare class GlobFilesError extends Error {
190
+ readonly code: 'invalid_pattern' | 'workspace_escape' | 'traversal_failed';
191
+ readonly details: Readonly<Record<string, unknown>>;
192
+ constructor(message: string, code: GlobFilesError['code'], details?: Readonly<Record<string, unknown>>);
193
+ }
194
+ export interface TodoWriteArgs {
195
+ /** Mutation kind. */
196
+ op: 'add' | 'set_status' | 'remove' | 'clear_done';
197
+ /** Required for `add`. */
198
+ content?: string;
199
+ /** Required for `set_status` and `remove`. */
200
+ id?: string;
201
+ /** Required for `set_status`. */
202
+ status?: TodoStatus;
203
+ /** Optional blocker description (add only). */
204
+ blockedBy?: string;
205
+ }
206
+ export declare class TodoWriteError extends Error {
207
+ readonly code: 'plan_mode_rejected' | 'invalid_args' | 'not_found' | 'io_failure';
208
+ readonly details: Readonly<Record<string, unknown>>;
209
+ constructor(message: string, code: TodoWriteError['code'], details?: Readonly<Record<string, unknown>>);
210
+ }
211
+ /**
212
+ * Read the current todo list from `<cwd>/.fixo/todo_list.json`.
213
+ * Always succeeds — a missing or unreadable file returns an
214
+ * empty list (the loader is fault-tolerant by design).
215
+ */
216
+ export declare function executeTodoRead(cwd: string): string;
217
+ /**
218
+ * Apply a todo mutation and persist the result. Rejected in
219
+ * `PLAN` mode (Pillar 1) — todo state is project-level
220
+ * metadata, not conversation state, so even an `add` would
221
+ * leak a write to disk.
222
+ */
223
+ export declare function executeTodoWrite(args: TodoWriteArgs, cwd: string, options?: ToolExecutionOptions): Promise<string>;
224
+ export declare function getBackgroundJobRegistry(cwd: string): BackgroundJobRegistry;
225
+ /** Test-only: inject a custom registry. */
226
+ export declare function setBackgroundJobRegistry(cwd: string, reg: BackgroundJobRegistry | null): void;
227
+ export interface RunCommandAsyncArgs {
228
+ cmd: string;
229
+ args?: string[];
230
+ cwd?: string;
231
+ }
232
+ export interface PollCommandStatusArgs {
233
+ jobId: string;
234
+ tailLines?: number;
235
+ sinceBytes?: number;
236
+ }
237
+ export interface KillCommandArgs {
238
+ jobId: string;
239
+ }
240
+ export declare class BackgroundCommandError extends Error {
241
+ readonly code: 'plan_mode_rejected' | 'invalid_args' | 'spawn_failed' | 'no_such_job';
242
+ constructor(message: string, code: BackgroundCommandError['code']);
243
+ }
244
+ /**
245
+ * Spawn a long-running command and return its jobId without
246
+ * blocking. The tail buffers cap at 64 KiB per stream and the
247
+ * snapshot is fsynced to `<cwd>/.fixo/jobs/<jobId>.json` every
248
+ * 5 s so a crash does not lose the recent output.
249
+ */
250
+ export declare function executeRunCommandAsync(args: RunCommandAsyncArgs, cwd: string, options?: ToolExecutionOptions): Promise<string>;
251
+ export declare function executePollCommandStatus(args: PollCommandStatusArgs, cwd: string): string;
252
+ export declare function executeKillCommand(args: KillCommandArgs, cwd: string): string;
253
+ /** Helper exported for tests + subagent use. */
254
+ export declare function shutdownAllBackgroundRegistries(): void;
255
+ /** Helper exported for `/jobs` slash command. */
256
+ export declare function listAllBackgroundJobs(cwd: string): JobSnapshot[];
257
+ /**
258
+ * Implementation of the `str_replace` tool. Strictly typed and
259
+ * gated by all four safety pillars:
260
+ *
261
+ * - Pillar 1 (Sandbox): `ctx.mode === 'PLAN'` is rejected.
262
+ * - Pillar 5 (Self-Protection): platform-locked paths are
263
+ * refused by `WorkspaceGuard.assertNotPlatformPath`.
264
+ * - Pillar 2 (Atomic Staging): the final commit is funneled
265
+ * through {@link AtomicStagingManager.applySurgicalReplace},
266
+ * not a direct `fs.writeFileSync`.
267
+ * - Pillar 3 (LSP pre-save): the staged content is checked by
268
+ * the gate before commit. In `block` mode a syntax error
269
+ * causes the edit to abort with the diagnostic reported back
270
+ * to the model.
271
+ */
272
+ export declare function executeStrReplace(args: StrReplaceArgs, cwd: string, options?: ToolExecutionOptions): Promise<string>;
273
+ /**
274
+ * Implementation of the `glob_files` tool. Strictly typed,
275
+ * workspace-bounded, and capped.
276
+ *
277
+ * Uses Node 22+ native `fs.promises.glob` for performance. Falls
278
+ * back to a manual recursive walker on Node < 22 (which the
279
+ * project's `package.json` already requires) so the tool is
280
+ * always functional.
281
+ */
282
+ export declare function executeGlobFiles(args: GlobArgs, cwd: string, _options?: ToolExecutionOptions): Promise<string>;
283
+ /** Register a typed tool specification. Throws on duplicate. */
284
+ export declare function registerTool<TArgs extends Record<string, any>, TResult = string>(spec: ToolSpecification<TArgs, TResult>): void;
285
+ /** Look up a registered tool specification. */
286
+ export declare function getToolSpecification(name: string): ToolSpecification<Record<string, any>, string> | undefined;
287
+ /** List the names of all registered typed tools. */
288
+ export declare function listRegisteredToolNames(): string[];
289
+ //# sourceMappingURL=tool-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agent/tool-executor.ts"],"names":[],"mappings":"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"}