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,265 @@
1
+ /**
2
+ * parser-adapter.ts — Unified code-parsing interface for the FixO CLI.
3
+ *
4
+ * Decouples every consumer (indexer, command-parser, repo-map, future
5
+ * callers) from a single concrete parser. Two implementations exist:
6
+ *
7
+ * - `TreeSitterAdapter` — uses the vendored WebAssembly tree-sitter
8
+ * engine. Supports shell command parsing via the bundled bash
9
+ * grammar, and a generic regex fallback for any other language.
10
+ * If `Parser.init()` throws (WASM architecture mismatch, missing
11
+ * file, etc.) the adapter catches the error, logs a console
12
+ * warning, and reports `supported = false`.
13
+ *
14
+ * - `RegexParserAdapter` — a pure-JS, zero-dependency fallback that
15
+ * works on every platform. It uses curated per-language regexes
16
+ * for symbol and import extraction, and a tokeniser-style splitter
17
+ * for shell commands. Slightly less accurate than tree-sitter but
18
+ * always available.
19
+ *
20
+ * A double-checked async singleton (`ParserFactory`) ensures only one
21
+ * adapter is ever instantiated per process and that concurrent callers
22
+ * share the same in-flight `init()` promise.
23
+ */
24
+ import * as ParserModule from 'web-tree-sitter';
25
+ import path from 'node:path';
26
+ import { fileURLToPath } from 'node:url';
27
+ import { extractShellTokens, isCommandSafeShellFallback } from './parsers/shell.js';
28
+ import { extractSymbols as regexExtractSymbols } from './parsers/symbols.js';
29
+ import { extractImports as regexExtractImports } from './parsers/imports.js';
30
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
31
+ const ParserCtor = ParserModule.Parser;
32
+ const LanguageCtor = ParserModule.Language;
33
+ // ──── Helpers ─────────────────────────────────────────────────────
34
+ /** Maps a file extension (including the leading dot) to a `LanguageId`. */
35
+ export function languageIdFromExtension(ext) {
36
+ const lower = ext.toLowerCase();
37
+ if (lower === '.ts' || lower === '.tsx' || lower === '.mts' || lower === '.cts') {
38
+ return 'typescript';
39
+ }
40
+ if (lower === '.js' || lower === '.jsx' || lower === '.mjs' || lower === '.cjs') {
41
+ return 'javascript';
42
+ }
43
+ if (lower === '.py' || lower === '.pyi')
44
+ return 'python';
45
+ if (lower === '.go')
46
+ return 'go';
47
+ if (lower === '.rs')
48
+ return 'rust';
49
+ if (lower === '.sh' || lower === '.bash')
50
+ return 'bash';
51
+ if (lower === '.json')
52
+ return 'json';
53
+ if (lower === '.md' || lower === '.markdown')
54
+ return 'markdown';
55
+ return 'generic';
56
+ }
57
+ // ──── TreeSitterAdapter ──────────────────────────────────────────
58
+ export class TreeSitterAdapter {
59
+ name = 'tree-sitter';
60
+ supported = true;
61
+ parser = null;
62
+ initialised = false;
63
+ async init() {
64
+ if (this.initialised) {
65
+ return { ok: this.supported };
66
+ }
67
+ this.initialised = true;
68
+ try {
69
+ await ParserCtor.init({
70
+ locateFile: (scriptName) => {
71
+ if (scriptName === 'tree-sitter.wasm') {
72
+ return path.resolve(__dirname, '../../vendor/tree-sitter.wasm');
73
+ }
74
+ return path.resolve(__dirname, '../../vendor', scriptName);
75
+ },
76
+ });
77
+ const Bash = await LanguageCtor.load(path.resolve(__dirname, '../../vendor/tree-sitter-bash.wasm'));
78
+ this.parser = new ParserCtor();
79
+ this.parser.setLanguage(Bash);
80
+ this.supported = true;
81
+ return { ok: true };
82
+ }
83
+ catch (err) {
84
+ const reason = err instanceof Error ? err.message : String(err);
85
+ // eslint-disable-next-line no-console
86
+ console.warn(`\u26A0 Tree-Sitter WASM unavailable (${reason}). Falling back to regex parser. ` +
87
+ `Performance reduced; accuracy may vary.`);
88
+ this.parser = null;
89
+ this.supported = false;
90
+ return { ok: false, reason };
91
+ }
92
+ }
93
+ extractSymbols(source, language) {
94
+ return regexExtractSymbols(source, language);
95
+ }
96
+ extractImports(source, language) {
97
+ return regexExtractImports(source, language);
98
+ }
99
+ parseShellCommand(command) {
100
+ if (this.parser) {
101
+ try {
102
+ return this.parseShellWithTreeSitter(command);
103
+ }
104
+ catch {
105
+ // Fall through to the regex splitter on any tree-sitter failure.
106
+ }
107
+ }
108
+ return extractShellTokens(command);
109
+ }
110
+ parseShellWithTreeSitter(command) {
111
+ if (!this.parser)
112
+ return extractShellTokens(command);
113
+ const tree = this.parser.parse(command);
114
+ const commandNodes = findCommandNodes(tree.rootNode);
115
+ const out = [];
116
+ for (const node of commandNodes) {
117
+ let binary = '';
118
+ const args = [];
119
+ for (let i = 0; i < node.childCount; i++) {
120
+ const child = node.child(i);
121
+ const t = child.type;
122
+ if (t === 'command_name') {
123
+ binary = child.text.trim();
124
+ }
125
+ else if (t === 'word' || t === 'string' || t === 'concatenation') {
126
+ if (!binary)
127
+ binary = child.text.trim();
128
+ else
129
+ args.push(child.text.trim());
130
+ }
131
+ }
132
+ if (binary) {
133
+ out.push({ binary, arguments: args, raw: node.text.trim() });
134
+ }
135
+ }
136
+ return out;
137
+ }
138
+ dispose() {
139
+ this.parser = null;
140
+ this.initialised = false;
141
+ this.supported = false;
142
+ }
143
+ }
144
+ function findCommandNodes(node) {
145
+ const list = [];
146
+ if (node.type === 'command')
147
+ list.push(node);
148
+ for (let i = 0; i < node.childCount; i++) {
149
+ list.push(...findCommandNodes(node.child(i)));
150
+ }
151
+ return list;
152
+ }
153
+ // ──── RegexParserAdapter ─────────────────────────────────────────
154
+ export class RegexParserAdapter {
155
+ name = 'regex';
156
+ supported = true;
157
+ async init() {
158
+ return { ok: true };
159
+ }
160
+ extractSymbols(source, language) {
161
+ return regexExtractSymbols(source, language);
162
+ }
163
+ extractImports(source, language) {
164
+ return regexExtractImports(source, language);
165
+ }
166
+ parseShellCommand(command) {
167
+ return extractShellTokens(command);
168
+ }
169
+ /** Convenience: re-uses the safety heuristic so callers can stay pure. */
170
+ isCommandSafeShell(command, workspaceRoot) {
171
+ return isCommandSafeShellFallback(command, workspaceRoot);
172
+ }
173
+ dispose() {
174
+ /* no-op */
175
+ }
176
+ }
177
+ const STATE = {
178
+ parser: null,
179
+ initPromise: null,
180
+ force: 'auto',
181
+ };
182
+ export class ParserFactory {
183
+ /**
184
+ * Returns a fully-initialised parser adapter. The first caller pays
185
+ * the (potential) WASM-init cost; subsequent callers share the same
186
+ * adapter instance.
187
+ *
188
+ * `force = 'tree-sitter'` rejects the call with the underlying
189
+ * error if WASM init fails (use this when WASM is required by the
190
+ * caller). `force = 'regex'` skips tree-sitter entirely.
191
+ */
192
+ static async getParser(force = STATE.force) {
193
+ if (STATE.parser && force === STATE.force) {
194
+ return STATE.parser;
195
+ }
196
+ if (STATE.initPromise && force === STATE.force) {
197
+ return STATE.initPromise;
198
+ }
199
+ // First-time (or force-change) initialisation.
200
+ const promise = (async () => {
201
+ let adapter;
202
+ if (force === 'regex') {
203
+ adapter = new RegexParserAdapter();
204
+ }
205
+ else {
206
+ const ts = new TreeSitterAdapter();
207
+ const result = await ts.init();
208
+ if (result.ok) {
209
+ adapter = ts;
210
+ }
211
+ else if (force === 'tree-sitter') {
212
+ throw new Error(`Tree-Sitter initialisation failed: ${result.reason ?? 'unknown'}`);
213
+ }
214
+ else {
215
+ adapter = new RegexParserAdapter();
216
+ await adapter.init();
217
+ }
218
+ }
219
+ STATE.parser = adapter;
220
+ STATE.force = force;
221
+ STATE.initPromise = null;
222
+ return adapter;
223
+ })();
224
+ STATE.initPromise = promise;
225
+ try {
226
+ return await promise;
227
+ }
228
+ finally {
229
+ STATE.initPromise = null;
230
+ }
231
+ }
232
+ /**
233
+ * Returns the currently cached parser synchronously, or `null` if
234
+ * the factory has not been initialised yet. Use this only when you
235
+ * cannot await — e.g. inside a sync extraction loop on a hot path.
236
+ */
237
+ static getCachedParser() {
238
+ return STATE.parser;
239
+ }
240
+ /** Resets the factory. Intended for tests only. */
241
+ static reset() {
242
+ if (STATE.parser) {
243
+ try {
244
+ STATE.parser.dispose();
245
+ }
246
+ catch {
247
+ /* ignore */
248
+ }
249
+ }
250
+ STATE.parser = null;
251
+ STATE.initPromise = null;
252
+ STATE.force = 'auto';
253
+ }
254
+ /**
255
+ * Configures the factory's force policy. The next `getParser()` call
256
+ * after this method will re-initialise with the new policy.
257
+ */
258
+ static setForce(force) {
259
+ if (STATE.force !== force) {
260
+ STATE.force = force;
261
+ STATE.parser = null;
262
+ }
263
+ }
264
+ }
265
+ //# sourceMappingURL=parser-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-adapter.js","sourceRoot":"","sources":["../../src/agent/parser-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * imports.ts — Per-language import extraction using pure regex.
3
+ *
4
+ * Returns a structured `ImportInfo` for each `import` (JS/TS),
5
+ * `import` / `from ... import` (Python), and `import` block (Go)
6
+ * statement found. The output is capped at `MAX_IMPORTS_PER_FILE`
7
+ * matches.
8
+ */
9
+ import type { ImportInfo, LanguageId } from '../parser-adapter.js';
10
+ export declare function extractImports(source: string, language: LanguageId): ImportInfo[];
11
+ //# sourceMappingURL=imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../../src/agent/parsers/imports.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AA4CnE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,EAAE,CAsBjF"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * imports.ts — Per-language import extraction using pure regex.
3
+ *
4
+ * Returns a structured `ImportInfo` for each `import` (JS/TS),
5
+ * `import` / `from ... import` (Python), and `import` block (Go)
6
+ * statement found. The output is capped at `MAX_IMPORTS_PER_FILE`
7
+ * matches.
8
+ */
9
+ const MAX_IMPORTS_PER_FILE = 100;
10
+ const JS_TS_PATTERNS = [
11
+ // import x from 'y' / import {a,b as c} from 'y' / import * as X from 'y'
12
+ /\bimport\s+(?:type\s+)?(?:[^'"`]+?\s+from\s+)?['"`]([^'"`]+)['"`]/g,
13
+ // export ... from 'y'
14
+ /\bexport\s+(?:[^'"`]+?\s+from\s+)?['"`]([^'"`]+)['"`]/g,
15
+ // const x = require('y') (best-effort)
16
+ /\brequire\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g,
17
+ ];
18
+ const PYTHON_PATTERNS = [
19
+ // from x import a, b
20
+ /^[ \t]*from\s+([\w.]+)\s+import\s+([^\n#]+)/gm,
21
+ // import x, y as z
22
+ /^[ \t]*import\s+([\w.]+(?:\s*,\s*[\w.]+)*)/gm,
23
+ ];
24
+ const GO_PATTERNS = [
25
+ // import "x" (single-line)
26
+ /^[ \t]*import\s+(?:[a-zA-Z_][\w]*\s+)?["']([^"']+)["']/gm,
27
+ // inside a parenthesised block: "x"
28
+ /^[ \t]*["']([^"']+)["']/gm,
29
+ ];
30
+ const RUST_PATTERNS = [
31
+ // use foo::bar::{baz, qux};
32
+ /\buse\s+([\w:]+)(?:\s*::\s*\{([^}]+)\})?\s*;/g,
33
+ ];
34
+ const PATTERNS = {
35
+ typescript: JS_TS_PATTERNS,
36
+ javascript: JS_TS_PATTERNS,
37
+ python: PYTHON_PATTERNS,
38
+ go: GO_PATTERNS,
39
+ rust: RUST_PATTERNS,
40
+ bash: [],
41
+ json: [],
42
+ markdown: [],
43
+ generic: [],
44
+ };
45
+ export function extractImports(source, language) {
46
+ const patterns = PATTERNS[language] ?? [];
47
+ if (patterns.length === 0)
48
+ return [];
49
+ const out = [];
50
+ const seen = new Set();
51
+ for (const re of patterns) {
52
+ re.lastIndex = 0;
53
+ let match;
54
+ while ((match = re.exec(source)) !== null) {
55
+ if (out.length >= MAX_IMPORTS_PER_FILE)
56
+ return out;
57
+ const source_ = match[1];
58
+ if (!source_ || seen.has(source_))
59
+ continue;
60
+ seen.add(source_);
61
+ const line = indexToLine(source, match.index);
62
+ const isTypeOnly = /\bimport\s+type\b/.test(match[0]);
63
+ const symbols = extractImportedSymbols(match[0], language);
64
+ out.push({ source: source_, symbols, line, isTypeOnly });
65
+ }
66
+ }
67
+ return out;
68
+ }
69
+ function indexToLine(source, index) {
70
+ let line = 1;
71
+ for (let i = 0; i < index && i < source.length; i++) {
72
+ if (source.charCodeAt(i) === 10)
73
+ line++;
74
+ }
75
+ return line;
76
+ }
77
+ function extractImportedSymbols(raw, language) {
78
+ if (language === 'python') {
79
+ // match[2] is the symbol list in a `from x import a, b` statement.
80
+ return [];
81
+ }
82
+ if (language === 'go' || language === 'rust') {
83
+ return [];
84
+ }
85
+ // JS/TS: try to pull out `{ a, b as c }`.
86
+ const named = /\{([^}]+)\}\s*from\s*['"`]/.exec(raw);
87
+ if (!named || !named[1])
88
+ return [];
89
+ return named[1]
90
+ .split(',')
91
+ .map((s) => s.trim().split(/\s+as\s+/)[0])
92
+ .filter((s) => s.length > 0);
93
+ }
94
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../../src/agent/parsers/imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * shell.ts — Pure-JS shell command tokenizer and safety-check fallback.
3
+ *
4
+ * The Tree-Sitter adapter's `parseShellCommand` is the high-fidelity path
5
+ * for bash; this module is the universal fallback that runs on any host
6
+ * (no WASM, no native code).
7
+ *
8
+ * The tokenizer is a deliberately simple shlex-style splitter that:
9
+ * 1. Splits on top-level `&&`, `||`, `;`, `|`, and newlines.
10
+ * 2. Honours single-quoted, double-quoted, and backslash-escaped
11
+ * segments.
12
+ * 3. Strips the surrounding quotes from each token.
13
+ *
14
+ * `isCommandSafeShellFallback` is a heuristic mirror of the original
15
+ * `isCommandSafe` policy (modifiers outside the workspace, sensitive
16
+ * file reads). The full-featured safety check still lives in
17
+ * `agent/command-parser.ts`; this fallback is the last line of defence
18
+ * for adapters that do not delegate to that module.
19
+ */
20
+ import type { ParsedCommand } from '../parser-adapter.js';
21
+ export declare function extractShellTokens(command: string): ParsedCommand[];
22
+ export declare function isCommandSafeShellFallback(command: string, workspaceRoot: string): boolean;
23
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/agent/parsers/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAO1D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAYnE;AAwHD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAoC1F"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * shell.ts — Pure-JS shell command tokenizer and safety-check fallback.
3
+ *
4
+ * The Tree-Sitter adapter's `parseShellCommand` is the high-fidelity path
5
+ * for bash; this module is the universal fallback that runs on any host
6
+ * (no WASM, no native code).
7
+ *
8
+ * The tokenizer is a deliberately simple shlex-style splitter that:
9
+ * 1. Splits on top-level `&&`, `||`, `;`, `|`, and newlines.
10
+ * 2. Honours single-quoted, double-quoted, and backslash-escaped
11
+ * segments.
12
+ * 3. Strips the surrounding quotes from each token.
13
+ *
14
+ * `isCommandSafeShellFallback` is a heuristic mirror of the original
15
+ * `isCommandSafe` policy (modifiers outside the workspace, sensitive
16
+ * file reads). The full-featured safety check still lives in
17
+ * `agent/command-parser.ts`; this fallback is the last line of defence
18
+ * for adapters that do not delegate to that module.
19
+ */
20
+ import path from 'node:path';
21
+ import os from 'node:os';
22
+ const DANGEROUS_MODIFIERS = new Set([
23
+ 'rm', 'mv', 'cp', 'mkdir', 'touch', 'chmod', 'chown', 'dd', 'ln', 'rmdir',
24
+ ]);
25
+ const DANGEROUS_READERS = new Set(['cat', 'less', 'more', 'grep', 'head', 'tail']);
26
+ export function extractShellTokens(command) {
27
+ const segments = splitTopLevel(command, ['&&', '||', ';', '|', '\n']);
28
+ const out = [];
29
+ for (const segment of segments) {
30
+ const trimmed = segment.trim();
31
+ if (!trimmed)
32
+ continue;
33
+ const tokens = shlex(trimmed);
34
+ if (tokens.length === 0)
35
+ continue;
36
+ const [binary, ...args] = tokens;
37
+ out.push({ binary, arguments: args, raw: trimmed });
38
+ }
39
+ return out;
40
+ }
41
+ function splitTopLevel(input, separators) {
42
+ // We need to respect quoting while splitting. The implementation is a
43
+ // small state machine that emits the current accumulator every time a
44
+ // separator is encountered at depth 0.
45
+ const result = [];
46
+ let buf = '';
47
+ let single = false;
48
+ let dquote = false;
49
+ let escape = false;
50
+ let i = 0;
51
+ while (i < input.length) {
52
+ const ch = input[i];
53
+ if (escape) {
54
+ buf += ch;
55
+ escape = false;
56
+ i++;
57
+ continue;
58
+ }
59
+ if (!single && ch === '\\') {
60
+ buf += ch;
61
+ escape = true;
62
+ i++;
63
+ continue;
64
+ }
65
+ if (!single && ch === '"') {
66
+ dquote = !dquote;
67
+ buf += ch;
68
+ i++;
69
+ continue;
70
+ }
71
+ if (!dquote && ch === "'") {
72
+ single = !single;
73
+ buf += ch;
74
+ i++;
75
+ continue;
76
+ }
77
+ if (!single && !dquote) {
78
+ let matchedSep = null;
79
+ for (const sep of separators) {
80
+ if (input.startsWith(sep, i)) {
81
+ matchedSep = sep;
82
+ break;
83
+ }
84
+ }
85
+ if (matchedSep) {
86
+ result.push(buf);
87
+ buf = '';
88
+ i += matchedSep.length;
89
+ continue;
90
+ }
91
+ }
92
+ buf += ch;
93
+ i++;
94
+ }
95
+ if (buf.length > 0)
96
+ result.push(buf);
97
+ return result;
98
+ }
99
+ function shlex(input) {
100
+ const tokens = [];
101
+ let buf = '';
102
+ let single = false;
103
+ let dquote = false;
104
+ let escape = false;
105
+ let started = false;
106
+ for (let i = 0; i < input.length; i++) {
107
+ const ch = input[i];
108
+ if (escape) {
109
+ buf += ch;
110
+ escape = false;
111
+ started = true;
112
+ continue;
113
+ }
114
+ if (!single && ch === '\\') {
115
+ escape = true;
116
+ started = true;
117
+ continue;
118
+ }
119
+ if (!dquote && ch === "'") {
120
+ single = !single;
121
+ started = true;
122
+ continue;
123
+ }
124
+ if (!single && ch === '"') {
125
+ dquote = !dquote;
126
+ started = true;
127
+ continue;
128
+ }
129
+ if (!single && !dquote && /\s/.test(ch)) {
130
+ if (started) {
131
+ tokens.push(buf);
132
+ buf = '';
133
+ started = false;
134
+ }
135
+ continue;
136
+ }
137
+ buf += ch;
138
+ started = true;
139
+ }
140
+ if (started)
141
+ tokens.push(buf);
142
+ return tokens;
143
+ }
144
+ function unquote(str) {
145
+ if (str.length < 2)
146
+ return str;
147
+ const first = str[0];
148
+ const last = str[str.length - 1];
149
+ if ((first === '"' || first === "'") && first === last) {
150
+ return str.slice(1, -1);
151
+ }
152
+ return str;
153
+ }
154
+ function isInside(child, parent) {
155
+ const rel = path.relative(parent, child);
156
+ return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
157
+ }
158
+ export function isCommandSafeShellFallback(command, workspaceRoot) {
159
+ const parsed = extractShellTokens(command);
160
+ for (const cmd of parsed) {
161
+ const binaryLower = cmd.binary.toLowerCase();
162
+ if (binaryLower.startsWith('/') || binaryLower.startsWith('.')) {
163
+ const resolvedBin = path.resolve(workspaceRoot, unquote(binaryLower));
164
+ if (!isInside(resolvedBin, workspaceRoot))
165
+ return false;
166
+ }
167
+ for (const arg of cmd.arguments) {
168
+ if (arg.startsWith('-'))
169
+ continue;
170
+ const cleanArg = unquote(arg);
171
+ const looksLikePath = cleanArg.includes('/') || cleanArg.includes('\\') || cleanArg.includes('.') || cleanArg === '~';
172
+ if (!looksLikePath)
173
+ continue;
174
+ let targetPath = cleanArg;
175
+ if (cleanArg === '~')
176
+ targetPath = os.homedir();
177
+ else if (cleanArg.startsWith('~/') || cleanArg.startsWith('~\\')) {
178
+ targetPath = path.join(os.homedir(), cleanArg.slice(2));
179
+ }
180
+ const resolved = path.resolve(workspaceRoot, targetPath);
181
+ if (DANGEROUS_MODIFIERS.has(binaryLower) && !isInside(resolved, workspaceRoot)) {
182
+ return false;
183
+ }
184
+ const filename = path.basename(resolved).toLowerCase();
185
+ const isSensitive = filename === '.env' ||
186
+ filename.includes('.env.') ||
187
+ filename === 'id_rsa' ||
188
+ filename === 'credentials' ||
189
+ (filename === 'config' && resolved.includes('.aws'));
190
+ if (isSensitive) {
191
+ if (DANGEROUS_MODIFIERS.has(binaryLower))
192
+ return false;
193
+ if (DANGEROUS_READERS.has(binaryLower) || binaryLower === 'grep')
194
+ return false;
195
+ }
196
+ }
197
+ }
198
+ return true;
199
+ }
200
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/agent/parsers/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * symbols.ts — Per-language symbol extraction using pure regex.
3
+ *
4
+ * Output is intentionally limited to the first `MAX_SYMBOLS_PER_FILE`
5
+ * matches so we never blow up the LLM's context window on a single
6
+ * oversized file. Coordinates are 1-based, line-inclusive, end-inclusive
7
+ * to match the LSP convention.
8
+ */
9
+ import type { LanguageId, SymbolInfo } from '../parser-adapter.js';
10
+ /**
11
+ * Extracts symbol declarations from `source`. The result is capped at
12
+ * `MAX_SYMBOLS_PER_FILE` entries and deduped by name; the first
13
+ * occurrence wins so an `export class Foo` is preferred over a later
14
+ * `class Foo` reference.
15
+ */
16
+ export declare function extractSymbols(source: string, language: LanguageId): SymbolInfo[];
17
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../../src/agent/parsers/symbols.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAoEnE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,EAAE,CAwBjF"}