fixo-cli 1.0.3 → 2.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.
Potentially problematic release.
This version of fixo-cli might be problematic. Click here for more details.
- package/CHANGELOG.md +62 -0
- package/README.md +18 -14
- package/dist/agent/agent-client.d.ts +28 -6
- package/dist/agent/agent-client.d.ts.map +1 -1
- package/dist/agent/agent-client.js +118 -39
- package/dist/agent/agent-client.js.map +1 -1
- package/dist/agent/agent-pool.d.ts +55 -6
- package/dist/agent/agent-pool.d.ts.map +1 -1
- package/dist/agent/agent-pool.js +120 -20
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/auto-verifier.d.ts +55 -0
- package/dist/agent/auto-verifier.d.ts.map +1 -0
- package/dist/agent/auto-verifier.js +50 -0
- package/dist/agent/auto-verifier.js.map +1 -0
- package/dist/agent/command-parser.d.ts +37 -0
- package/dist/agent/command-parser.d.ts.map +1 -1
- package/dist/agent/command-parser.js +473 -1
- package/dist/agent/command-parser.js.map +1 -1
- package/dist/agent/context-builder.d.ts +24 -0
- package/dist/agent/context-builder.d.ts.map +1 -0
- package/dist/agent/context-builder.js +197 -0
- package/dist/agent/context-builder.js.map +1 -0
- package/dist/agent/conversation.d.ts +32 -2
- package/dist/agent/conversation.d.ts.map +1 -1
- package/dist/agent/conversation.js +84 -9
- package/dist/agent/conversation.js.map +1 -1
- package/dist/agent/duration.d.ts +24 -0
- package/dist/agent/duration.d.ts.map +1 -0
- package/dist/agent/duration.js +42 -0
- package/dist/agent/duration.js.map +1 -0
- package/dist/agent/file-writing-rules.d.ts +19 -0
- package/dist/agent/file-writing-rules.d.ts.map +1 -0
- package/dist/agent/file-writing-rules.js +31 -0
- package/dist/agent/file-writing-rules.js.map +1 -0
- package/dist/agent/mcp-bridge.js +1 -1
- package/dist/agent/mcp-bridge.js.map +1 -1
- package/dist/agent/orchestrator.d.ts +45 -0
- package/dist/agent/orchestrator.d.ts.map +1 -1
- package/dist/agent/orchestrator.js +140 -3
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/parser-adapter.d.ts +17 -0
- package/dist/agent/parser-adapter.d.ts.map +1 -1
- package/dist/agent/parser-adapter.js +311 -7
- package/dist/agent/parser-adapter.js.map +1 -1
- package/dist/agent/predictive-gate.d.ts.map +1 -1
- package/dist/agent/predictive-gate.js +4 -1
- package/dist/agent/predictive-gate.js.map +1 -1
- package/dist/agent/provider-cooldown.d.ts.map +1 -1
- package/dist/agent/provider-cooldown.js +3 -2
- package/dist/agent/provider-cooldown.js.map +1 -1
- package/dist/agent/providers-manager.d.ts +5 -0
- package/dist/agent/providers-manager.d.ts.map +1 -1
- package/dist/agent/providers-manager.js +119 -8
- package/dist/agent/providers-manager.js.map +1 -1
- package/dist/agent/repo-map.d.ts +18 -1
- package/dist/agent/repo-map.d.ts.map +1 -1
- package/dist/agent/repo-map.js +144 -54
- package/dist/agent/repo-map.js.map +1 -1
- package/dist/agent/retry.js +1 -2
- package/dist/agent/retry.js.map +1 -1
- package/dist/agent/single-agent.d.ts +13 -0
- package/dist/agent/single-agent.d.ts.map +1 -1
- package/dist/agent/single-agent.js +225 -37
- package/dist/agent/single-agent.js.map +1 -1
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +2 -1
- package/dist/agent/skills.js.map +1 -1
- package/dist/agent/subagent.js +2 -2
- package/dist/agent/subagent.js.map +1 -1
- package/dist/agent/task-router.d.ts +46 -0
- package/dist/agent/task-router.d.ts.map +1 -0
- package/dist/agent/task-router.js +352 -0
- package/dist/agent/task-router.js.map +1 -0
- package/dist/agent/telemetry.d.ts +29 -1
- package/dist/agent/telemetry.d.ts.map +1 -1
- package/dist/agent/telemetry.js +29 -11
- package/dist/agent/telemetry.js.map +1 -1
- package/dist/agent/tool-definitions.d.ts +3 -0
- package/dist/agent/tool-definitions.d.ts.map +1 -0
- package/dist/agent/tool-definitions.js +519 -0
- package/dist/agent/tool-definitions.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +6 -1
- package/dist/agent/tool-executor.d.ts.map +1 -1
- package/dist/agent/tool-executor.js +99 -553
- package/dist/agent/tool-executor.js.map +1 -1
- package/dist/agent/tools/command-tools.d.ts +6 -0
- package/dist/agent/tools/command-tools.d.ts.map +1 -0
- package/dist/agent/tools/command-tools.js +104 -0
- package/dist/agent/tools/command-tools.js.map +1 -0
- package/dist/agent/tools/file-tools.d.ts +15 -0
- package/dist/agent/tools/file-tools.d.ts.map +1 -0
- package/dist/agent/tools/file-tools.js +551 -0
- package/dist/agent/tools/file-tools.js.map +1 -0
- package/dist/agent/tools/todo-tools.d.ts +3 -0
- package/dist/agent/tools/todo-tools.d.ts.map +1 -0
- package/dist/agent/tools/todo-tools.js +70 -0
- package/dist/agent/tools/todo-tools.js.map +1 -0
- package/dist/agent/web-impl.d.ts.map +1 -1
- package/dist/agent/web-impl.js +45 -0
- package/dist/agent/web-impl.js.map +1 -1
- package/dist/agent/worker-agent.d.ts +3 -1
- package/dist/agent/worker-agent.d.ts.map +1 -1
- package/dist/agent/worker-agent.js +56 -16
- package/dist/agent/worker-agent.js.map +1 -1
- package/dist/config.d.ts +253 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +81 -1
- package/dist/config.js.map +1 -1
- package/dist/git/git-manager.d.ts +33 -2
- package/dist/git/git-manager.d.ts.map +1 -1
- package/dist/git/git-manager.js +111 -15
- package/dist/git/git-manager.js.map +1 -1
- package/dist/git/git-ops.d.ts.map +1 -1
- package/dist/git/git-ops.js +2 -1
- package/dist/git/git-ops.js.map +1 -1
- package/dist/index.js +89 -8
- package/dist/index.js.map +1 -1
- package/dist/lsp/lsp-manager.js +1 -1
- package/dist/lsp/lsp-manager.js.map +1 -1
- package/dist/model-outcomes.d.ts.map +1 -1
- package/dist/model-outcomes.js +2 -1
- package/dist/model-outcomes.js.map +1 -1
- package/dist/planner.d.ts +0 -9
- package/dist/planner.d.ts.map +1 -1
- package/dist/planner.js +0 -9
- package/dist/planner.js.map +1 -1
- package/dist/project-memory.d.ts +12 -1
- package/dist/project-memory.d.ts.map +1 -1
- package/dist/project-memory.js +8 -6
- package/dist/project-memory.js.map +1 -1
- package/dist/runtime/loop-mitigation.d.ts +119 -0
- package/dist/runtime/loop-mitigation.d.ts.map +1 -0
- package/dist/runtime/loop-mitigation.js +192 -0
- package/dist/runtime/loop-mitigation.js.map +1 -0
- package/dist/runtime/os-sandbox.d.ts +100 -0
- package/dist/runtime/os-sandbox.d.ts.map +1 -0
- package/dist/runtime/os-sandbox.js +246 -0
- package/dist/runtime/os-sandbox.js.map +1 -0
- package/dist/runtime/run-inventory.d.ts +17 -0
- package/dist/runtime/run-inventory.d.ts.map +1 -0
- package/dist/runtime/run-inventory.js +49 -0
- package/dist/runtime/run-inventory.js.map +1 -0
- package/dist/runtime/session-snapshots.d.ts +52 -2
- package/dist/runtime/session-snapshots.d.ts.map +1 -1
- package/dist/runtime/session-snapshots.js +76 -1
- package/dist/runtime/session-snapshots.js.map +1 -1
- package/dist/runtime/staging.d.ts.map +1 -1
- package/dist/runtime/staging.js +4 -1
- package/dist/runtime/staging.js.map +1 -1
- package/dist/runtime/task-session.d.ts +14 -0
- package/dist/runtime/task-session.d.ts.map +1 -1
- package/dist/runtime/task-session.js +26 -0
- package/dist/runtime/task-session.js.map +1 -1
- package/dist/setup-wizard.d.ts +11 -3
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +113 -15
- package/dist/setup-wizard.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/commands/context-commands.d.ts +7 -0
- package/dist/ui/commands/context-commands.d.ts.map +1 -0
- package/dist/ui/commands/context-commands.js +241 -0
- package/dist/ui/commands/context-commands.js.map +1 -0
- package/dist/ui/commands/index.d.ts +3 -0
- package/dist/ui/commands/index.d.ts.map +1 -0
- package/dist/ui/commands/index.js +46 -0
- package/dist/ui/commands/index.js.map +1 -0
- package/dist/ui/commands/info-commands.d.ts +15 -0
- package/dist/ui/commands/info-commands.d.ts.map +1 -0
- package/dist/ui/commands/info-commands.js +122 -0
- package/dist/ui/commands/info-commands.js.map +1 -0
- package/dist/ui/commands/model-commands.d.ts +5 -0
- package/dist/ui/commands/model-commands.d.ts.map +1 -0
- package/dist/ui/commands/model-commands.js +417 -0
- package/dist/ui/commands/model-commands.js.map +1 -0
- package/dist/ui/commands/session-commands.d.ts +5 -0
- package/dist/ui/commands/session-commands.d.ts.map +1 -0
- package/dist/ui/commands/session-commands.js +154 -0
- package/dist/ui/commands/session-commands.js.map +1 -0
- package/dist/ui/commands/task-commands.d.ts +8 -0
- package/dist/ui/commands/task-commands.d.ts.map +1 -0
- package/dist/ui/commands/task-commands.js +152 -0
- package/dist/ui/commands/task-commands.js.map +1 -0
- package/dist/ui/commands/types.d.ts +46 -0
- package/dist/ui/commands/types.d.ts.map +1 -0
- package/dist/ui/commands/types.js +2 -0
- package/dist/ui/commands/types.js.map +1 -0
- package/dist/ui/commands/workspace-commands.d.ts +8 -0
- package/dist/ui/commands/workspace-commands.d.ts.map +1 -0
- package/dist/ui/commands/workspace-commands.js +131 -0
- package/dist/ui/commands/workspace-commands.js.map +1 -0
- package/dist/ui/loading-animation.d.ts +24 -0
- package/dist/ui/loading-animation.d.ts.map +1 -0
- package/dist/ui/loading-animation.js +123 -0
- package/dist/ui/loading-animation.js.map +1 -0
- package/dist/ui/markdown-stream.js +2 -2
- package/dist/ui/markdown-stream.js.map +1 -1
- package/dist/ui/prompt.d.ts +7 -0
- package/dist/ui/prompt.d.ts.map +1 -1
- package/dist/ui/prompt.js +461 -1143
- package/dist/ui/prompt.js.map +1 -1
- package/dist/ui/render-primitives.d.ts +6 -0
- package/dist/ui/render-primitives.d.ts.map +1 -1
- package/dist/ui/render-primitives.js +30 -13
- package/dist/ui/render-primitives.js.map +1 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +2 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/session-header.d.ts +13 -0
- package/dist/ui/session-header.d.ts.map +1 -1
- package/dist/ui/session-header.js +6 -0
- package/dist/ui/session-header.js.map +1 -1
- package/package.json +22 -4
- package/scripts/check-vendor-wasm.js +55 -0
- package/vendor/tree-sitter-bash.wasm +0 -0
- package/vendor/tree-sitter-go.wasm +0 -0
- package/vendor/tree-sitter-javascript.wasm +0 -0
- package/vendor/tree-sitter-python.wasm +0 -0
- package/vendor/tree-sitter-rust.wasm +0 -0
- package/vendor/tree-sitter-tsx.wasm +0 -0
- package/vendor/tree-sitter-typescript.wasm +0 -0
- package/vendor/tree-sitter.wasm +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* file-writing-rules.ts — Shared system-prompt fragment that steers
|
|
3
|
+
* the LLM toward the sanctioned write tools and away from shell-based
|
|
4
|
+
* file mutation.
|
|
5
|
+
*
|
|
6
|
+
* The shell sandbox (see `command-parser.ts` → `extractWriteTargets`)
|
|
7
|
+
* already rejects `cat > file`, `sed -i`, `tee`, `mv` into platform
|
|
8
|
+
* paths, `python3 -c "open(...,'w')"`, and heredoc smuggling. But a
|
|
9
|
+
* rejection still costs a turn and an approval prompt. This block
|
|
10
|
+
* tells the model up-front not to try, so the typical session never
|
|
11
|
+
* floods the user with security warnings the way Test 1 in the log
|
|
12
|
+
* did.
|
|
13
|
+
*
|
|
14
|
+
* Keep this fragment short: every agent persona that gets tool
|
|
15
|
+
* access (single-agent, code worker, test worker) pastes it into
|
|
16
|
+
* its system prompt.
|
|
17
|
+
*/
|
|
18
|
+
export const FILE_WRITING_RULES_BLOCK = [
|
|
19
|
+
``,
|
|
20
|
+
`## File Writing Rules (HARD CONSTRAINT)`,
|
|
21
|
+
`The ONLY sanctioned tools for writing files are \`write_file\`, \`str_replace\`, \`apply_patch\`, \`replace_range\`, \`insert_after\`, and \`rename_file\`. They are atomic, LSP-gated, and respect the platform path lock.`,
|
|
22
|
+
`Writing files via \`run_command\` is **sandbox-blocked**. The following patterns will be rejected with a security error and waste a tool call:`,
|
|
23
|
+
`- \`cat > file\`, \`cat >> file\`, \`echo … > file\`, or any \`>\`/\`>>\` redirect that writes a workspace file`,
|
|
24
|
+
`- heredocs like \`cat > file <<'EOF' … EOF\` or \`python3 << 'PYEOF' … PYEOF\``,
|
|
25
|
+
`- \`tee\`, \`sed -i\`, \`perl -i\`, \`awk … > file\``,
|
|
26
|
+
`- \`mv\`/\`cp\` whose destination is a tracked source file`,
|
|
27
|
+
`- interpreter payloads that write: \`python3 -c "open('x','w')…"\`, \`node -e "fs.writeFileSync('x', …)"\`, \`perl -e "open(FH,'>','x')…"\``,
|
|
28
|
+
`If you find yourself reaching for any of these, stop and use \`write_file\` (or \`str_replace\`/\`apply_patch\` for edits) instead — it is faster, safer, and the only path that actually succeeds.`,
|
|
29
|
+
`\`run_command\` is for running things (tests, builds, git, lint, format), not for producing files.`,
|
|
30
|
+
].join('\n');
|
|
31
|
+
//# sourceMappingURL=file-writing-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-writing-rules.js","sourceRoot":"","sources":["../../src/agent/file-writing-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,EAAE;IACF,yCAAyC;IACzC,6NAA6N;IAC7N,gJAAgJ;IAChJ,iHAAiH;IACjH,gFAAgF;IAChF,sDAAsD;IACtD,4DAA4D;IAC5D,6IAA6I;IAC7I,qMAAqM;IACrM,oGAAoG;CACrG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/agent/mcp-bridge.js
CHANGED
|
@@ -39,7 +39,7 @@ export class McpBridgeManager {
|
|
|
39
39
|
loadProjectMcpConfig(cwd) {
|
|
40
40
|
const ymlPath = path.join(cwd, '.fixo.yml');
|
|
41
41
|
const yamlPath = path.join(cwd, '.fixo.yaml');
|
|
42
|
-
|
|
42
|
+
const configPath = fs.existsSync(ymlPath) ? ymlPath : fs.existsSync(yamlPath) ? yamlPath : null;
|
|
43
43
|
if (configPath) {
|
|
44
44
|
try {
|
|
45
45
|
const content = fs.readFileSync(configPath, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../../src/agent/mcp-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAGlE,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IACvC,QAAQ,GAAG,IAAI,GAAG,EAAuD,CAAC;IAC1E,eAAe,GAAyB,EAAE,CAAC;IAEnD,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QAE1C,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,YAA+B,CAAC,CAAC;YACpE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;oBACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,cAAc,GAAG,aAAa,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBACvE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;4BACxB,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE;gCACR,IAAI,EAAE,cAAc;gCACpB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;gCACnC,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;6BACnE;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,sDAAsD,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,GAAW;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9C,
|
|
1
|
+
{"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../../src/agent/mcp-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,49 @@
|
|
|
1
1
|
import type { AgentContext, Subtask, TaskDAG } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 5.3 — could the two file references possibly resolve to the
|
|
4
|
+
* same on-disk path?
|
|
5
|
+
*
|
|
6
|
+
* Pure-string match is the easy case. When either side is a glob
|
|
7
|
+
* (contains `*` or `?`), we test the glob against the literal. When
|
|
8
|
+
* BOTH sides are globs we punt and return true — pattern-vs-pattern
|
|
9
|
+
* overlap is undecidable cheaply, and conservative serialization is
|
|
10
|
+
* the explicit Phase 5.3 default.
|
|
11
|
+
*/
|
|
12
|
+
export declare function couldOverlapFile(a: string, b: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Phase 5.3 — DAG post-pass that injects dependency edges between
|
|
15
|
+
* subtasks whose write-sets could conflict.
|
|
16
|
+
*
|
|
17
|
+
* Algorithm:
|
|
18
|
+
* 1. Iterate subtasks in deterministic `id`-lexicographic order.
|
|
19
|
+
* 2. For each pair (a, b) where a < b and both are write-shaped:
|
|
20
|
+
* a. If they're already directly ordered (a depends on b OR b
|
|
21
|
+
* depends on a), skip.
|
|
22
|
+
* b. If both declare non-empty `files` AND those sets could
|
|
23
|
+
* overlap → serialize b after a.
|
|
24
|
+
* c. If either declares empty `files` AND `serializeMissingFiles`
|
|
25
|
+
* is true → serialize b after a (conservative: can't prove
|
|
26
|
+
* disjoint write sets).
|
|
27
|
+
* 3. Each insertion is logged to telemetry so we can observe how
|
|
28
|
+
* often the conflict pass kicks in.
|
|
29
|
+
*
|
|
30
|
+
* Mutates the subtasks array in place (consistent with
|
|
31
|
+
* `validateAndSortDAG` style) and returns the inserted edges for
|
|
32
|
+
* observability.
|
|
33
|
+
*/
|
|
34
|
+
export interface WriteConflictPlan {
|
|
35
|
+
/** Same array reference as input, with `dependencies` mutated. */
|
|
36
|
+
subtasks: Subtask[];
|
|
37
|
+
/** Edges injected by this pass; `from` blocks `to`. */
|
|
38
|
+
edgesInserted: Array<{
|
|
39
|
+
from: string;
|
|
40
|
+
to: string;
|
|
41
|
+
reason: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export declare function serializeWriteConflicts(subtasks: Subtask[], options?: {
|
|
45
|
+
serializeMissingFiles?: boolean;
|
|
46
|
+
}): WriteConflictPlan;
|
|
2
47
|
export declare class Orchestrator {
|
|
3
48
|
private client;
|
|
4
49
|
private verbose;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAsBlE;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAWD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,uDAAuD;IACvD,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,iBAAiB,CA4DnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAU;IAClB,UAAU;;;;MAA+D;gBAEpE,OAAO,UAAQ;IAYrB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAkHnD,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE;CAmCnD"}
|
|
@@ -1,13 +1,120 @@
|
|
|
1
1
|
import { AgentClient } from './agent-client.js';
|
|
2
|
-
import { loadConfig } from '../config.js';
|
|
2
|
+
import { loadConfig, getAgentDagConfig } from '../config.js';
|
|
3
3
|
import { C } from '../ui/colors.js';
|
|
4
|
+
import { globToRegExp } from './permissions.js';
|
|
5
|
+
import { telemetry, recordTelemetry } from './telemetry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Phase 5.3 — Subtask personas that may write to the workspace.
|
|
8
|
+
*
|
|
9
|
+
* Reviewer is read-only (it produces a verdict, not a diff). Code,
|
|
10
|
+
* test, and doc personas all have plausible write-shaped tool calls —
|
|
11
|
+
* `test` writes test files, `doc` writes README/JSDoc, and `code` is
|
|
12
|
+
* the obvious case. Only pairs of MUTATING_PERSONAS members are
|
|
13
|
+
* candidates for write-conflict serialization.
|
|
14
|
+
*/
|
|
15
|
+
const MUTATING_PERSONAS = new Set([
|
|
16
|
+
'code',
|
|
17
|
+
'test',
|
|
18
|
+
'doc',
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Phase 5.3 — could the two file references possibly resolve to the
|
|
22
|
+
* same on-disk path?
|
|
23
|
+
*
|
|
24
|
+
* Pure-string match is the easy case. When either side is a glob
|
|
25
|
+
* (contains `*` or `?`), we test the glob against the literal. When
|
|
26
|
+
* BOTH sides are globs we punt and return true — pattern-vs-pattern
|
|
27
|
+
* overlap is undecidable cheaply, and conservative serialization is
|
|
28
|
+
* the explicit Phase 5.3 default.
|
|
29
|
+
*/
|
|
30
|
+
export function couldOverlapFile(a, b) {
|
|
31
|
+
if (a === b)
|
|
32
|
+
return true;
|
|
33
|
+
const aIsGlob = a.includes('*') || a.includes('?');
|
|
34
|
+
const bIsGlob = b.includes('*') || b.includes('?');
|
|
35
|
+
if (aIsGlob && bIsGlob)
|
|
36
|
+
return true; // can't cheaply decide; conservative
|
|
37
|
+
if (aIsGlob)
|
|
38
|
+
return globToRegExp(a).test(b);
|
|
39
|
+
if (bIsGlob)
|
|
40
|
+
return globToRegExp(b).test(a);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
function fileSetsCouldOverlap(filesA, filesB) {
|
|
44
|
+
for (const a of filesA) {
|
|
45
|
+
for (const b of filesB) {
|
|
46
|
+
if (couldOverlapFile(a, b))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
export function serializeWriteConflicts(subtasks, options = {}) {
|
|
53
|
+
const serializeMissingFiles = options.serializeMissingFiles ?? true;
|
|
54
|
+
const edges = [];
|
|
55
|
+
// Deterministic order — lexicographic `id`. Stable across runs so
|
|
56
|
+
// a re-plan produces the same DAG.
|
|
57
|
+
const ordered = [...subtasks].sort((a, b) => a.id.localeCompare(b.id));
|
|
58
|
+
for (let i = 0; i < ordered.length; i++) {
|
|
59
|
+
const a = ordered[i];
|
|
60
|
+
if (!MUTATING_PERSONAS.has(a.persona))
|
|
61
|
+
continue;
|
|
62
|
+
for (let j = i + 1; j < ordered.length; j++) {
|
|
63
|
+
const b = ordered[j];
|
|
64
|
+
if (!MUTATING_PERSONAS.has(b.persona))
|
|
65
|
+
continue;
|
|
66
|
+
// Skip if already directly ordered (in either direction).
|
|
67
|
+
if (b.dependencies.includes(a.id) || a.dependencies.includes(b.id))
|
|
68
|
+
continue;
|
|
69
|
+
const aFiles = a.files ?? [];
|
|
70
|
+
const bFiles = b.files ?? [];
|
|
71
|
+
let reason = null;
|
|
72
|
+
let conflictKey = '';
|
|
73
|
+
if (aFiles.length > 0 && bFiles.length > 0) {
|
|
74
|
+
if (fileSetsCouldOverlap(aFiles, bFiles)) {
|
|
75
|
+
// Find a representative overlapping pair for telemetry.
|
|
76
|
+
outer: for (const x of aFiles) {
|
|
77
|
+
for (const y of bFiles) {
|
|
78
|
+
if (couldOverlapFile(x, y)) {
|
|
79
|
+
conflictKey = x === y ? x : `${x} ↔ ${y}`;
|
|
80
|
+
break outer;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
reason = `shared write target (${conflictKey})`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (serializeMissingFiles) {
|
|
88
|
+
reason = aFiles.length === 0 && bFiles.length === 0
|
|
89
|
+
? `both subtasks declared no files; conservative serialization`
|
|
90
|
+
: `one subtask declared no files; conservative serialization`;
|
|
91
|
+
conflictKey = '<unknown>';
|
|
92
|
+
}
|
|
93
|
+
if (reason) {
|
|
94
|
+
b.dependencies = [...b.dependencies, a.id];
|
|
95
|
+
edges.push({ from: a.id, to: b.id, reason });
|
|
96
|
+
try {
|
|
97
|
+
recordTelemetry(telemetry.dagWriteSetConflictAvoided({
|
|
98
|
+
runId: 'plan-time',
|
|
99
|
+
file: conflictKey,
|
|
100
|
+
serializedSubtasks: [a.id, b.id],
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// telemetry must never break planning
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { subtasks, edgesInserted: edges };
|
|
110
|
+
}
|
|
4
111
|
export class Orchestrator {
|
|
5
112
|
client;
|
|
6
113
|
verbose;
|
|
7
114
|
tokensUsed = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
|
|
8
115
|
constructor(verbose = false) {
|
|
9
116
|
const config = loadConfig();
|
|
10
|
-
this.client = new AgentClient(config.freellmapi_api_key || '', config.apiUrl, verbose);
|
|
117
|
+
this.client = new AgentClient(config.freellmapi_api_key || '', config.apiUrl, verbose, config.provider_mode, config.preferences.modelRouting);
|
|
11
118
|
this.verbose = verbose;
|
|
12
119
|
}
|
|
13
120
|
async plan(context) {
|
|
@@ -56,9 +163,39 @@ JSON Schema:
|
|
|
56
163
|
}
|
|
57
164
|
const content = response.content?.trim() || '';
|
|
58
165
|
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
|
59
|
-
|
|
166
|
+
if (jsonMatch) {
|
|
167
|
+
const rawLength = content.length;
|
|
168
|
+
const matchLength = jsonMatch[0].length;
|
|
169
|
+
if (rawLength - matchLength > 50) {
|
|
170
|
+
throw new Error(`Model output contained too much conversational text (${rawLength - matchLength} chars outside JSON). Please output STRICTLY JSON without any conversational text or markdown formatting.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
throw new Error('No JSON object found in response.');
|
|
175
|
+
}
|
|
176
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
60
177
|
if (parsed && Array.isArray(parsed.subtasks)) {
|
|
61
178
|
this.validateAndSortDAG(parsed.subtasks);
|
|
179
|
+
// Phase 5.3 — inject write-conflict edges. Default is to
|
|
180
|
+
// serialize on both observed overlap AND declared-empty
|
|
181
|
+
// file sets (LLMs frequently omit `files`). The flag lives
|
|
182
|
+
// under `agent.dag.serializeWriteConflicts`.
|
|
183
|
+
const dagCfg = getAgentDagConfig();
|
|
184
|
+
if (dagCfg.serializeWriteConflicts) {
|
|
185
|
+
const { edgesInserted } = serializeWriteConflicts(parsed.subtasks, {
|
|
186
|
+
serializeMissingFiles: dagCfg.serializeMissingFiles,
|
|
187
|
+
});
|
|
188
|
+
if (edgesInserted.length > 0 && this.verbose) {
|
|
189
|
+
console.log(`${C.BLUE}[Orchestrator] Injected ${edgesInserted.length} write-conflict edge(s).${C.RESET}`);
|
|
190
|
+
for (const e of edgesInserted) {
|
|
191
|
+
console.log(` ${C.DIM}${e.from} → ${e.to}: ${e.reason}${C.RESET}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Re-validate to confirm acyclicity (insertion is by sorted
|
|
195
|
+
// id so a cycle is impossible, but we run validation again
|
|
196
|
+
// for defense in depth).
|
|
197
|
+
this.validateAndSortDAG(parsed.subtasks);
|
|
198
|
+
}
|
|
62
199
|
return parsed;
|
|
63
200
|
}
|
|
64
201
|
feedback = 'Missing subtasks array';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,7 +74,24 @@ export declare class TreeSitterAdapter implements ParserAdapter {
|
|
|
74
74
|
supported: boolean;
|
|
75
75
|
private parser;
|
|
76
76
|
private initialised;
|
|
77
|
+
/** Lazily-loaded language grammars, keyed by LanguageId. The `bash`
|
|
78
|
+
* grammar is loaded eagerly in {@link init} because the shell-
|
|
79
|
+
* command parser path runs on virtually every tool call. The other
|
|
80
|
+
* languages are loaded on demand by {@link loadLanguage}. */
|
|
81
|
+
private languages;
|
|
77
82
|
init(): Promise<ParserInitResult>;
|
|
83
|
+
/**
|
|
84
|
+
* Lazily load a language grammar from the vendored WASM. Idempotent.
|
|
85
|
+
* Returns `true` if the language is ready for tree-sitter-based
|
|
86
|
+
* extraction; `false` if the WASM is missing or fails to load
|
|
87
|
+
* (callers will fall back to the regex extractor).
|
|
88
|
+
*
|
|
89
|
+
* Pre-warm a language before calling {@link extractSymbols} in
|
|
90
|
+
* hot paths \u2014 extractSymbols itself is synchronous (see why in
|
|
91
|
+
* the {@link ParserAdapter} interface) and will silently fall
|
|
92
|
+
* through to the regex path if the grammar isn't loaded yet.
|
|
93
|
+
*/
|
|
94
|
+
loadLanguage(lang: LanguageId): Promise<boolean>;
|
|
78
95
|
extractSymbols(source: string, language: LanguageId): SymbolInfo[];
|
|
79
96
|
extractImports(source: string, language: LanguageId): ImportInfo[];
|
|
80
97
|
parseShellCommand(command: string): ParsedCommand[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser-adapter.d.ts","sourceRoot":"","sources":["../../src/agent/parser-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"parser-adapter.d.ts","sourceRoot":"","sources":["../../src/agent/parser-adapter.ts"],"names":[],"mappings":"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"}
|