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.
- package/LICENSE +201 -0
- package/README.md +530 -0
- package/dist/agent/agent-client.d.ts +108 -0
- package/dist/agent/agent-client.d.ts.map +1 -0
- package/dist/agent/agent-client.js +1247 -0
- package/dist/agent/agent-client.js.map +1 -0
- package/dist/agent/agent-pool.d.ts +20 -0
- package/dist/agent/agent-pool.d.ts.map +1 -0
- package/dist/agent/agent-pool.js +217 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/background-awareness.d.ts +55 -0
- package/dist/agent/background-awareness.d.ts.map +1 -0
- package/dist/agent/background-awareness.js +104 -0
- package/dist/agent/background-awareness.js.map +1 -0
- package/dist/agent/command-parser.d.ts +33 -0
- package/dist/agent/command-parser.d.ts.map +1 -0
- package/dist/agent/command-parser.js +120 -0
- package/dist/agent/command-parser.js.map +1 -0
- package/dist/agent/context-budget.d.ts +91 -0
- package/dist/agent/context-budget.d.ts.map +1 -0
- package/dist/agent/context-budget.js +219 -0
- package/dist/agent/context-budget.js.map +1 -0
- package/dist/agent/conversation.d.ts +190 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +547 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/hooks.d.ts +72 -0
- package/dist/agent/hooks.d.ts.map +1 -0
- package/dist/agent/hooks.js +214 -0
- package/dist/agent/hooks.js.map +1 -0
- package/dist/agent/mcp-bridge.d.ts +13 -0
- package/dist/agent/mcp-bridge.d.ts.map +1 -0
- package/dist/agent/mcp-bridge.js +86 -0
- package/dist/agent/mcp-bridge.js.map +1 -0
- package/dist/agent/mcp-client.d.ts +24 -0
- package/dist/agent/mcp-client.d.ts.map +1 -0
- package/dist/agent/mcp-client.js +146 -0
- package/dist/agent/mcp-client.js.map +1 -0
- package/dist/agent/mcp-manager.d.ts +13 -0
- package/dist/agent/mcp-manager.d.ts.map +1 -0
- package/dist/agent/mcp-manager.js +84 -0
- package/dist/agent/mcp-manager.js.map +1 -0
- package/dist/agent/mcp-registry.d.ts +45 -0
- package/dist/agent/mcp-registry.d.ts.map +1 -0
- package/dist/agent/mcp-registry.js +98 -0
- package/dist/agent/mcp-registry.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +14 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +118 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parser-adapter.d.ts +120 -0
- package/dist/agent/parser-adapter.d.ts.map +1 -0
- package/dist/agent/parser-adapter.js +265 -0
- package/dist/agent/parser-adapter.js.map +1 -0
- package/dist/agent/parsers/imports.d.ts +11 -0
- package/dist/agent/parsers/imports.d.ts.map +1 -0
- package/dist/agent/parsers/imports.js +94 -0
- package/dist/agent/parsers/imports.js.map +1 -0
- package/dist/agent/parsers/shell.d.ts +23 -0
- package/dist/agent/parsers/shell.d.ts.map +1 -0
- package/dist/agent/parsers/shell.js +200 -0
- package/dist/agent/parsers/shell.js.map +1 -0
- package/dist/agent/parsers/symbols.d.ts +17 -0
- package/dist/agent/parsers/symbols.d.ts.map +1 -0
- package/dist/agent/parsers/symbols.js +103 -0
- package/dist/agent/parsers/symbols.js.map +1 -0
- package/dist/agent/permissions.d.ts +65 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +219 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/predictive-gate.d.ts +69 -0
- package/dist/agent/predictive-gate.d.ts.map +1 -0
- package/dist/agent/predictive-gate.js +128 -0
- package/dist/agent/predictive-gate.js.map +1 -0
- package/dist/agent/provider-cooldown.d.ts +144 -0
- package/dist/agent/provider-cooldown.d.ts.map +1 -0
- package/dist/agent/provider-cooldown.js +300 -0
- package/dist/agent/provider-cooldown.js.map +1 -0
- package/dist/agent/providers-manager.d.ts +109 -0
- package/dist/agent/providers-manager.d.ts.map +1 -0
- package/dist/agent/providers-manager.js +464 -0
- package/dist/agent/providers-manager.js.map +1 -0
- package/dist/agent/repo-map.d.ts +6 -0
- package/dist/agent/repo-map.d.ts.map +1 -0
- package/dist/agent/repo-map.js +221 -0
- package/dist/agent/repo-map.js.map +1 -0
- package/dist/agent/retry.d.ts +103 -0
- package/dist/agent/retry.d.ts.map +1 -0
- package/dist/agent/retry.js +276 -0
- package/dist/agent/retry.js.map +1 -0
- package/dist/agent/search/index.d.ts +61 -0
- package/dist/agent/search/index.d.ts.map +1 -0
- package/dist/agent/search/index.js +314 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/single-agent.d.ts +76 -0
- package/dist/agent/single-agent.d.ts.map +1 -0
- package/dist/agent/single-agent.js +697 -0
- package/dist/agent/single-agent.js.map +1 -0
- package/dist/agent/skills.d.ts +22 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +139 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/stream-glue.d.ts +85 -0
- package/dist/agent/stream-glue.d.ts.map +1 -0
- package/dist/agent/stream-glue.js +120 -0
- package/dist/agent/stream-glue.js.map +1 -0
- package/dist/agent/subagent.d.ts +72 -0
- package/dist/agent/subagent.d.ts.map +1 -0
- package/dist/agent/subagent.js +193 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/telemetry.d.ts +192 -0
- package/dist/agent/telemetry.d.ts.map +1 -0
- package/dist/agent/telemetry.js +400 -0
- package/dist/agent/telemetry.js.map +1 -0
- package/dist/agent/tokenizer.d.ts +42 -0
- package/dist/agent/tokenizer.d.ts.map +1 -0
- package/dist/agent/tokenizer.js +107 -0
- package/dist/agent/tokenizer.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +289 -0
- package/dist/agent/tool-executor.d.ts.map +1 -0
- package/dist/agent/tool-executor.js +2519 -0
- package/dist/agent/tool-executor.js.map +1 -0
- package/dist/agent/web-impl.d.ts +2 -0
- package/dist/agent/web-impl.d.ts.map +1 -0
- package/dist/agent/web-impl.js +34 -0
- package/dist/agent/web-impl.js.map +1 -0
- package/dist/agent/web.d.ts +8 -0
- package/dist/agent/web.d.ts.map +1 -0
- package/dist/agent/web.js +8 -0
- package/dist/agent/web.js.map +1 -0
- package/dist/agent/worker-agent.d.ts +27 -0
- package/dist/agent/worker-agent.d.ts.map +1 -0
- package/dist/agent/worker-agent.js +503 -0
- package/dist/agent/worker-agent.js.map +1 -0
- package/dist/config.d.ts +162 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/context/fixo-md-watcher.d.ts +42 -0
- package/dist/context/fixo-md-watcher.d.ts.map +1 -0
- package/dist/context/fixo-md-watcher.js +126 -0
- package/dist/context/fixo-md-watcher.js.map +1 -0
- package/dist/context/fixo-md.d.ts +50 -0
- package/dist/context/fixo-md.d.ts.map +1 -0
- package/dist/context/fixo-md.js +118 -0
- package/dist/context/fixo-md.js.map +1 -0
- package/dist/context/todo.d.ts +65 -0
- package/dist/context/todo.d.ts.map +1 -0
- package/dist/context/todo.js +194 -0
- package/dist/context/todo.js.map +1 -0
- package/dist/git/git-manager.d.ts +33 -0
- package/dist/git/git-manager.d.ts.map +1 -0
- package/dist/git/git-manager.js +293 -0
- package/dist/git/git-manager.js.map +1 -0
- package/dist/git/git-ops.d.ts +10 -0
- package/dist/git/git-ops.d.ts.map +1 -0
- package/dist/git/git-ops.js +131 -0
- package/dist/git/git-ops.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +30 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +273 -0
- package/dist/indexer.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +24 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +205 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts +17 -0
- package/dist/lsp/lsp-manager.d.ts.map +1 -0
- package/dist/lsp/lsp-manager.js +154 -0
- package/dist/lsp/lsp-manager.js.map +1 -0
- package/dist/lsp/lsp-pre-save.d.ts +137 -0
- package/dist/lsp/lsp-pre-save.d.ts.map +1 -0
- package/dist/lsp/lsp-pre-save.js +245 -0
- package/dist/lsp/lsp-pre-save.js.map +1 -0
- package/dist/lsp/syntax-fallback.d.ts +83 -0
- package/dist/lsp/syntax-fallback.d.ts.map +1 -0
- package/dist/lsp/syntax-fallback.js +275 -0
- package/dist/lsp/syntax-fallback.js.map +1 -0
- package/dist/model-outcomes.d.ts +12 -0
- package/dist/model-outcomes.d.ts.map +1 -0
- package/dist/model-outcomes.js +46 -0
- package/dist/model-outcomes.js.map +1 -0
- package/dist/planner.d.ts +32 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +163 -0
- package/dist/planner.js.map +1 -0
- package/dist/project-memory.d.ts +29 -0
- package/dist/project-memory.d.ts.map +1 -0
- package/dist/project-memory.js +349 -0
- package/dist/project-memory.js.map +1 -0
- package/dist/review.d.ts +2 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +61 -0
- package/dist/review.js.map +1 -0
- package/dist/runtime/background-jobs.d.ts +97 -0
- package/dist/runtime/background-jobs.d.ts.map +1 -0
- package/dist/runtime/background-jobs.js +331 -0
- package/dist/runtime/background-jobs.js.map +1 -0
- package/dist/runtime/credential-vault.d.ts +124 -0
- package/dist/runtime/credential-vault.d.ts.map +1 -0
- package/dist/runtime/credential-vault.js +184 -0
- package/dist/runtime/credential-vault.js.map +1 -0
- package/dist/runtime/loop-trap.d.ts +197 -0
- package/dist/runtime/loop-trap.d.ts.map +1 -0
- package/dist/runtime/loop-trap.js +420 -0
- package/dist/runtime/loop-trap.js.map +1 -0
- package/dist/runtime/policy.d.ts +15 -0
- package/dist/runtime/policy.d.ts.map +1 -0
- package/dist/runtime/policy.js +60 -0
- package/dist/runtime/policy.js.map +1 -0
- package/dist/runtime/redaction.d.ts +66 -0
- package/dist/runtime/redaction.d.ts.map +1 -0
- package/dist/runtime/redaction.js +155 -0
- package/dist/runtime/redaction.js.map +1 -0
- package/dist/runtime/session-snapshots.d.ts +76 -0
- package/dist/runtime/session-snapshots.d.ts.map +1 -0
- package/dist/runtime/session-snapshots.js +166 -0
- package/dist/runtime/session-snapshots.js.map +1 -0
- package/dist/runtime/staging.d.ts +205 -0
- package/dist/runtime/staging.d.ts.map +1 -0
- package/dist/runtime/staging.js +526 -0
- package/dist/runtime/staging.js.map +1 -0
- package/dist/runtime/task-session.d.ts +95 -0
- package/dist/runtime/task-session.d.ts.map +1 -0
- package/dist/runtime/task-session.js +263 -0
- package/dist/runtime/task-session.js.map +1 -0
- package/dist/runtime/worktree.d.ts +55 -0
- package/dist/runtime/worktree.d.ts.map +1 -0
- package/dist/runtime/worktree.js +175 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/setup-wizard.d.ts +8 -0
- package/dist/setup-wizard.d.ts.map +1 -0
- package/dist/setup-wizard.js +73 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/shared/content.d.ts +43 -0
- package/dist/shared/content.d.ts.map +1 -0
- package/dist/shared/content.js +61 -0
- package/dist/shared/content.js.map +1 -0
- package/dist/shared/types.d.ts +217 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/test-runner.d.ts +5 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +42 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/ascii.d.ts +23 -0
- package/dist/ui/ascii.d.ts.map +1 -0
- package/dist/ui/ascii.js +45 -0
- package/dist/ui/ascii.js.map +1 -0
- package/dist/ui/colors.d.ts +111 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +166 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/image-attach.d.ts +27 -0
- package/dist/ui/image-attach.d.ts.map +1 -0
- package/dist/ui/image-attach.js +100 -0
- package/dist/ui/image-attach.js.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +18 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/markdown-stream.d.ts +91 -0
- package/dist/ui/markdown-stream.d.ts.map +1 -0
- package/dist/ui/markdown-stream.js +524 -0
- package/dist/ui/markdown-stream.js.map +1 -0
- package/dist/ui/plan-renderer.d.ts +36 -0
- package/dist/ui/plan-renderer.d.ts.map +1 -0
- package/dist/ui/plan-renderer.js +79 -0
- package/dist/ui/plan-renderer.js.map +1 -0
- package/dist/ui/prompt.d.ts +11 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +1960 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/ui/render-primitives.d.ts +117 -0
- package/dist/ui/render-primitives.d.ts.map +1 -0
- package/dist/ui/render-primitives.js +322 -0
- package/dist/ui/render-primitives.js.map +1 -0
- package/dist/ui/render.d.ts +133 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +547 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/session-header.d.ts +30 -0
- package/dist/ui/session-header.d.ts.map +1 -0
- package/dist/ui/session-header.js +74 -0
- package/dist/ui/session-header.js.map +1 -0
- package/dist/workspace-guard.d.ts +68 -0
- package/dist/workspace-guard.d.ts.map +1 -0
- package/dist/workspace-guard.js +168 -0
- package/dist/workspace-guard.js.map +1 -0
- package/dist/workspace-lock.d.ts +27 -0
- package/dist/workspace-lock.d.ts.map +1 -0
- package/dist/workspace-lock.js +95 -0
- package/dist/workspace-lock.js.map +1 -0
- 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"}
|