@oxagen/cli 0.5.0 → 0.6.1
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/README.md +66 -3
- package/dist/agent/__tests__/code-graph.test.d.ts +2 -0
- package/dist/agent/__tests__/code-graph.test.d.ts.map +1 -0
- package/dist/agent/__tests__/code-graph.test.js +83 -0
- package/dist/agent/__tests__/code-graph.test.js.map +1 -0
- package/dist/agent/__tests__/evaluator.test.d.ts +2 -0
- package/dist/agent/__tests__/evaluator.test.d.ts.map +1 -0
- package/dist/agent/__tests__/evaluator.test.js +96 -0
- package/dist/agent/__tests__/evaluator.test.js.map +1 -0
- package/dist/agent/__tests__/fleet-memory.test.d.ts +2 -0
- package/dist/agent/__tests__/fleet-memory.test.d.ts.map +1 -0
- package/dist/agent/__tests__/fleet-memory.test.js +107 -0
- package/dist/agent/__tests__/fleet-memory.test.js.map +1 -0
- package/dist/agent/__tests__/fleet-store.test.d.ts +2 -0
- package/dist/agent/__tests__/fleet-store.test.d.ts.map +1 -0
- package/dist/agent/__tests__/fleet-store.test.js +93 -0
- package/dist/agent/__tests__/fleet-store.test.js.map +1 -0
- package/dist/agent/__tests__/git-isolation.test.d.ts +2 -0
- package/dist/agent/__tests__/git-isolation.test.d.ts.map +1 -0
- package/dist/agent/__tests__/git-isolation.test.js +119 -0
- package/dist/agent/__tests__/git-isolation.test.js.map +1 -0
- package/dist/agent/__tests__/judge.test.d.ts +2 -0
- package/dist/agent/__tests__/judge.test.d.ts.map +1 -0
- package/dist/agent/__tests__/judge.test.js +140 -0
- package/dist/agent/__tests__/judge.test.js.map +1 -0
- package/dist/agent/__tests__/loop-errors.test.d.ts +2 -0
- package/dist/agent/__tests__/loop-errors.test.d.ts.map +1 -0
- package/dist/agent/__tests__/loop-errors.test.js +75 -0
- package/dist/agent/__tests__/loop-errors.test.js.map +1 -0
- package/dist/agent/__tests__/loop-gating.test.d.ts +2 -0
- package/dist/agent/__tests__/loop-gating.test.d.ts.map +1 -0
- package/dist/agent/__tests__/loop-gating.test.js +94 -0
- package/dist/agent/__tests__/loop-gating.test.js.map +1 -0
- package/dist/agent/__tests__/model-router.test.d.ts +2 -0
- package/dist/agent/__tests__/model-router.test.d.ts.map +1 -0
- package/dist/agent/__tests__/model-router.test.js +138 -0
- package/dist/agent/__tests__/model-router.test.js.map +1 -0
- package/dist/agent/__tests__/orchestrator-isolation.test.d.ts +2 -0
- package/dist/agent/__tests__/orchestrator-isolation.test.d.ts.map +1 -0
- package/dist/agent/__tests__/orchestrator-isolation.test.js +134 -0
- package/dist/agent/__tests__/orchestrator-isolation.test.js.map +1 -0
- package/dist/agent/__tests__/orchestrator.test.d.ts +2 -0
- package/dist/agent/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/agent/__tests__/orchestrator.test.js +201 -0
- package/dist/agent/__tests__/orchestrator.test.js.map +1 -0
- package/dist/agent/__tests__/permissions.test.d.ts +2 -0
- package/dist/agent/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/agent/__tests__/permissions.test.js +206 -0
- package/dist/agent/__tests__/permissions.test.js.map +1 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.d.ts +2 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.d.ts.map +1 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.js +158 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.js.map +1 -0
- package/dist/agent/__tests__/pipeline.test.d.ts +2 -0
- package/dist/agent/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/agent/__tests__/pipeline.test.js +235 -0
- package/dist/agent/__tests__/pipeline.test.js.map +1 -0
- package/dist/agent/__tests__/planner.test.d.ts +2 -0
- package/dist/agent/__tests__/planner.test.d.ts.map +1 -0
- package/dist/agent/__tests__/planner.test.js +98 -0
- package/dist/agent/__tests__/planner.test.js.map +1 -0
- package/dist/agent/__tests__/prompt-enhancer.test.d.ts +2 -0
- package/dist/agent/__tests__/prompt-enhancer.test.d.ts.map +1 -0
- package/dist/agent/__tests__/prompt-enhancer.test.js +107 -0
- package/dist/agent/__tests__/prompt-enhancer.test.js.map +1 -0
- package/dist/agent/__tests__/rate-card.test.d.ts +2 -0
- package/dist/agent/__tests__/rate-card.test.d.ts.map +1 -0
- package/dist/agent/__tests__/rate-card.test.js +69 -0
- package/dist/agent/__tests__/rate-card.test.js.map +1 -0
- package/dist/agent/__tests__/system-prompt.test.d.ts +2 -0
- package/dist/agent/__tests__/system-prompt.test.d.ts.map +1 -0
- package/dist/agent/__tests__/system-prompt.test.js +29 -0
- package/dist/agent/__tests__/system-prompt.test.js.map +1 -0
- package/dist/agent/__tests__/trace-format-verbose.test.d.ts +2 -0
- package/dist/agent/__tests__/trace-format-verbose.test.d.ts.map +1 -0
- package/dist/agent/__tests__/trace-format-verbose.test.js +93 -0
- package/dist/agent/__tests__/trace-format-verbose.test.js.map +1 -0
- package/dist/agent/__tests__/trace-format.test.d.ts +2 -0
- package/dist/agent/__tests__/trace-format.test.d.ts.map +1 -0
- package/dist/agent/__tests__/trace-format.test.js +104 -0
- package/dist/agent/__tests__/trace-format.test.js.map +1 -0
- package/dist/agent/__tests__/trace-store.test.d.ts +2 -0
- package/dist/agent/__tests__/trace-store.test.d.ts.map +1 -0
- package/dist/agent/__tests__/trace-store.test.js +113 -0
- package/dist/agent/__tests__/trace-store.test.js.map +1 -0
- package/dist/agent/__tests__/verbose-log.test.d.ts +2 -0
- package/dist/agent/__tests__/verbose-log.test.d.ts.map +1 -0
- package/dist/agent/__tests__/verbose-log.test.js +69 -0
- package/dist/agent/__tests__/verbose-log.test.js.map +1 -0
- package/dist/agent/code-graph.d.ts +18 -0
- package/dist/agent/code-graph.d.ts.map +1 -0
- package/dist/agent/code-graph.js +119 -0
- package/dist/agent/code-graph.js.map +1 -0
- package/dist/agent/env.d.ts +11 -0
- package/dist/agent/env.d.ts.map +1 -0
- package/dist/agent/env.js +82 -0
- package/dist/agent/env.js.map +1 -0
- package/dist/agent/evaluator.d.ts +13 -0
- package/dist/agent/evaluator.d.ts.map +1 -0
- package/dist/agent/evaluator.js +150 -0
- package/dist/agent/evaluator.js.map +1 -0
- package/dist/agent/fleet/git-isolation.d.ts +142 -0
- package/dist/agent/fleet/git-isolation.d.ts.map +1 -0
- package/dist/agent/fleet/git-isolation.js +290 -0
- package/dist/agent/fleet/git-isolation.js.map +1 -0
- package/dist/agent/fleet/memory.d.ts +21 -0
- package/dist/agent/fleet/memory.d.ts.map +1 -0
- package/dist/agent/fleet/memory.js +129 -0
- package/dist/agent/fleet/memory.js.map +1 -0
- package/dist/agent/fleet/orchestrator.d.ts +108 -0
- package/dist/agent/fleet/orchestrator.d.ts.map +1 -0
- package/dist/agent/fleet/orchestrator.js +358 -0
- package/dist/agent/fleet/orchestrator.js.map +1 -0
- package/dist/agent/fleet/store.d.ts +13 -0
- package/dist/agent/fleet/store.d.ts.map +1 -0
- package/dist/agent/fleet/store.js +79 -0
- package/dist/agent/fleet/store.js.map +1 -0
- package/dist/agent/fleet/types.d.ts +107 -0
- package/dist/agent/fleet/types.d.ts.map +1 -0
- package/dist/agent/fleet/types.js +17 -0
- package/dist/agent/fleet/types.js.map +1 -0
- package/dist/agent/judge.d.ts +46 -0
- package/dist/agent/judge.d.ts.map +1 -0
- package/dist/agent/judge.js +182 -0
- package/dist/agent/judge.js.map +1 -0
- package/dist/agent/loop.d.ts +96 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +233 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/memory.d.ts +14 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +118 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/model-router.d.ts +65 -0
- package/dist/agent/model-router.d.ts.map +1 -0
- package/dist/agent/model-router.js +118 -0
- package/dist/agent/model-router.js.map +1 -0
- package/dist/agent/model.d.ts +9 -0
- package/dist/agent/model.d.ts.map +1 -0
- package/dist/agent/model.js +24 -0
- package/dist/agent/model.js.map +1 -0
- package/dist/agent/permissions.d.ts +103 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +245 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/pipeline.d.ts +92 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +371 -0
- package/dist/agent/pipeline.js.map +1 -0
- package/dist/agent/planner.d.ts +19 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +139 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/project-context.d.ts +13 -0
- package/dist/agent/project-context.d.ts.map +1 -0
- package/dist/agent/project-context.js +66 -0
- package/dist/agent/project-context.js.map +1 -0
- package/dist/agent/prompt-enhancer.d.ts +46 -0
- package/dist/agent/prompt-enhancer.d.ts.map +1 -0
- package/dist/agent/prompt-enhancer.js +137 -0
- package/dist/agent/prompt-enhancer.js.map +1 -0
- package/dist/agent/rate-card.d.ts +77 -0
- package/dist/agent/rate-card.d.ts.map +1 -0
- package/dist/agent/rate-card.js +99 -0
- package/dist/agent/rate-card.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +14 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +47 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools.d.ts +23 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +354 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/agent/trace-format.d.ts +13 -0
- package/dist/agent/trace-format.d.ts.map +1 -0
- package/dist/agent/trace-format.js +188 -0
- package/dist/agent/trace-format.js.map +1 -0
- package/dist/agent/trace-store.d.ts +19 -0
- package/dist/agent/trace-store.d.ts.map +1 -0
- package/dist/agent/trace-store.js +82 -0
- package/dist/agent/trace-store.js.map +1 -0
- package/dist/agent/trace.d.ts +180 -0
- package/dist/agent/trace.d.ts.map +1 -0
- package/dist/agent/trace.js +2 -0
- package/dist/agent/trace.js.map +1 -0
- package/dist/agent/verbose-log.d.ts +8 -0
- package/dist/agent/verbose-log.d.ts.map +1 -0
- package/dist/agent/verbose-log.js +53 -0
- package/dist/agent/verbose-log.js.map +1 -0
- package/dist/agents/__tests__/loader.test.d.ts +2 -0
- package/dist/agents/__tests__/loader.test.d.ts.map +1 -0
- package/dist/agents/__tests__/loader.test.js +88 -0
- package/dist/agents/__tests__/loader.test.js.map +1 -0
- package/dist/agents/__tests__/tools.test.d.ts +2 -0
- package/dist/agents/__tests__/tools.test.d.ts.map +1 -0
- package/dist/agents/__tests__/tools.test.js +40 -0
- package/dist/agents/__tests__/tools.test.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/loader.d.ts +25 -0
- package/dist/agents/loader.d.ts.map +1 -0
- package/dist/agents/loader.js +133 -0
- package/dist/agents/loader.js.map +1 -0
- package/dist/agents/tools.d.ts +14 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +21 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/types.d.ts +27 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +11 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/write.d.ts +10 -0
- package/dist/agents/write.d.ts.map +1 -0
- package/dist/agents/write.js +28 -0
- package/dist/agents/write.js.map +1 -0
- package/dist/commands/__tests__/agent.test.d.ts +2 -0
- package/dist/commands/__tests__/agent.test.d.ts.map +1 -0
- package/dist/commands/__tests__/agent.test.js +82 -0
- package/dist/commands/__tests__/agent.test.js.map +1 -0
- package/dist/commands/__tests__/command.test.d.ts +2 -0
- package/dist/commands/__tests__/command.test.d.ts.map +1 -0
- package/dist/commands/__tests__/command.test.js +73 -0
- package/dist/commands/__tests__/command.test.js.map +1 -0
- package/dist/commands/__tests__/cost.test.d.ts +2 -0
- package/dist/commands/__tests__/cost.test.d.ts.map +1 -0
- package/dist/commands/__tests__/cost.test.js +139 -0
- package/dist/commands/__tests__/cost.test.js.map +1 -0
- package/dist/commands/__tests__/graph.pull.test.d.ts +2 -0
- package/dist/commands/__tests__/graph.pull.test.d.ts.map +1 -0
- package/dist/commands/__tests__/graph.pull.test.js +259 -0
- package/dist/commands/__tests__/graph.pull.test.js.map +1 -0
- package/dist/commands/__tests__/mcp.test.d.ts +2 -0
- package/dist/commands/__tests__/mcp.test.d.ts.map +1 -0
- package/dist/commands/__tests__/mcp.test.js +88 -0
- package/dist/commands/__tests__/mcp.test.js.map +1 -0
- package/dist/commands/__tests__/replay.test.d.ts +2 -0
- package/dist/commands/__tests__/replay.test.d.ts.map +1 -0
- package/dist/commands/__tests__/replay.test.js +76 -0
- package/dist/commands/__tests__/replay.test.js.map +1 -0
- package/dist/commands/__tests__/rules.test.d.ts +2 -0
- package/dist/commands/__tests__/rules.test.d.ts.map +1 -0
- package/dist/commands/__tests__/rules.test.js +95 -0
- package/dist/commands/__tests__/rules.test.js.map +1 -0
- package/dist/commands/__tests__/settings.test.d.ts +2 -0
- package/dist/commands/__tests__/settings.test.d.ts.map +1 -0
- package/dist/commands/__tests__/settings.test.js +83 -0
- package/dist/commands/__tests__/settings.test.js.map +1 -0
- package/dist/commands/agent.d.ts +15 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +58 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/agent.skill.load.d.ts +3 -0
- package/dist/commands/agent.skill.load.d.ts.map +1 -0
- package/dist/commands/agent.skill.load.js +57 -0
- package/dist/commands/agent.skill.load.js.map +1 -0
- package/dist/commands/code.d.ts +14 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +100 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/command.d.ts +17 -0
- package/dist/commands/command.d.ts.map +1 -0
- package/dist/commands/command.js +74 -0
- package/dist/commands/command.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +66 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/cost.d.ts +10 -0
- package/dist/commands/cost.d.ts.map +1 -0
- package/dist/commands/cost.js +140 -0
- package/dist/commands/cost.js.map +1 -0
- package/dist/commands/env.d.ts +19 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +64 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/graph.pull.d.ts +15 -0
- package/dist/commands/graph.pull.d.ts.map +1 -0
- package/dist/commands/graph.pull.js +137 -0
- package/dist/commands/graph.pull.js.map +1 -0
- package/dist/commands/graph.search.d.ts +10 -0
- package/dist/commands/graph.search.d.ts.map +1 -0
- package/dist/commands/graph.search.js +25 -0
- package/dist/commands/graph.search.js.map +1 -0
- package/dist/commands/graph.status.d.ts +10 -0
- package/dist/commands/graph.status.d.ts.map +1 -0
- package/dist/commands/graph.status.js +75 -0
- package/dist/commands/graph.status.js.map +1 -0
- package/dist/commands/mcp.add.d.ts +13 -0
- package/dist/commands/mcp.add.d.ts.map +1 -0
- package/dist/commands/mcp.add.js +110 -0
- package/dist/commands/mcp.add.js.map +1 -0
- package/dist/commands/mcp.auth.d.ts +10 -0
- package/dist/commands/mcp.auth.d.ts.map +1 -0
- package/dist/commands/mcp.auth.js +132 -0
- package/dist/commands/mcp.auth.js.map +1 -0
- package/dist/commands/mcp.check.d.ts +10 -0
- package/dist/commands/mcp.check.d.ts.map +1 -0
- package/dist/commands/mcp.check.js +114 -0
- package/dist/commands/mcp.check.js.map +1 -0
- package/dist/commands/mcp.d.ts +18 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +183 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mcp.list.d.ts +9 -0
- package/dist/commands/mcp.list.d.ts.map +1 -0
- package/dist/commands/mcp.list.js +93 -0
- package/dist/commands/mcp.list.js.map +1 -0
- package/dist/commands/mcp.permit.d.ts +12 -0
- package/dist/commands/mcp.permit.d.ts.map +1 -0
- package/dist/commands/mcp.permit.js +117 -0
- package/dist/commands/mcp.permit.js.map +1 -0
- package/dist/commands/mcp.remove.d.ts +9 -0
- package/dist/commands/mcp.remove.d.ts.map +1 -0
- package/dist/commands/mcp.remove.js +65 -0
- package/dist/commands/mcp.remove.js.map +1 -0
- package/dist/commands/plugin.org.install_bulk.js +1 -1
- package/dist/commands/plugin.org.install_bulk.js.map +1 -1
- package/dist/commands/privacy.erase.test.js +7 -0
- package/dist/commands/privacy.erase.test.js.map +1 -1
- package/dist/commands/replay.d.ts +5 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +28 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/rules.d.ts +19 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +96 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/schema/schema.config.d.ts +3 -0
- package/dist/commands/schema/schema.config.d.ts.map +1 -0
- package/dist/commands/schema/schema.config.js +34 -0
- package/dist/commands/schema/schema.config.js.map +1 -0
- package/dist/commands/schema/schema.disable.d.ts +3 -0
- package/dist/commands/schema/schema.disable.d.ts.map +1 -0
- package/dist/commands/schema/schema.disable.js +22 -0
- package/dist/commands/schema/schema.disable.js.map +1 -0
- package/dist/commands/schema/schema.enable.d.ts +3 -0
- package/dist/commands/schema/schema.enable.d.ts.map +1 -0
- package/dist/commands/schema/schema.enable.js +22 -0
- package/dist/commands/schema/schema.enable.js.map +1 -0
- package/dist/commands/schema/schema.export.d.ts +3 -0
- package/dist/commands/schema/schema.export.d.ts.map +1 -0
- package/dist/commands/schema/schema.export.js +31 -0
- package/dist/commands/schema/schema.export.js.map +1 -0
- package/dist/commands/schema/schema.get.d.ts +3 -0
- package/dist/commands/schema/schema.get.d.ts.map +1 -0
- package/dist/commands/schema/schema.get.js +23 -0
- package/dist/commands/schema/schema.get.js.map +1 -0
- package/dist/commands/schema/schema.label.d.ts +5 -0
- package/dist/commands/schema/schema.label.d.ts.map +1 -0
- package/dist/commands/schema/schema.label.js +60 -0
- package/dist/commands/schema/schema.label.js.map +1 -0
- package/dist/commands/schema/schema.list.d.ts +3 -0
- package/dist/commands/schema/schema.list.d.ts.map +1 -0
- package/dist/commands/schema/schema.list.js +30 -0
- package/dist/commands/schema/schema.list.js.map +1 -0
- package/dist/commands/schema/schema.prop.d.ts +5 -0
- package/dist/commands/schema/schema.prop.d.ts.map +1 -0
- package/dist/commands/schema/schema.prop.js +72 -0
- package/dist/commands/schema/schema.prop.js.map +1 -0
- package/dist/commands/schema/schema.reconcile.d.ts +10 -0
- package/dist/commands/schema/schema.reconcile.d.ts.map +1 -0
- package/dist/commands/schema/schema.reconcile.js +65 -0
- package/dist/commands/schema/schema.reconcile.js.map +1 -0
- package/dist/commands/schema/schema.rel.d.ts +5 -0
- package/dist/commands/schema/schema.rel.d.ts.map +1 -0
- package/dist/commands/schema/schema.rel.js +65 -0
- package/dist/commands/schema/schema.rel.js.map +1 -0
- package/dist/commands/schema/schema.version.d.ts +7 -0
- package/dist/commands/schema/schema.version.d.ts.map +1 -0
- package/dist/commands/schema/schema.version.js +96 -0
- package/dist/commands/schema/schema.version.js.map +1 -0
- package/dist/commands/secret.d.ts +23 -0
- package/dist/commands/secret.d.ts.map +1 -0
- package/dist/commands/secret.js +90 -0
- package/dist/commands/secret.js.map +1 -0
- package/dist/commands/settings.d.ts +10 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +117 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/skill.create.d.ts +3 -0
- package/dist/commands/skill.create.d.ts.map +1 -0
- package/dist/commands/skill.create.js +52 -0
- package/dist/commands/skill.create.js.map +1 -0
- package/dist/commands/skill.enable.d.ts +3 -0
- package/dist/commands/skill.enable.d.ts.map +1 -0
- package/dist/commands/skill.enable.js +31 -0
- package/dist/commands/skill.enable.js.map +1 -0
- package/dist/commands.test.js +1291 -281
- package/dist/commands.test.js.map +1 -1
- package/dist/components/DevStatus.d.ts.map +1 -1
- package/dist/components/DevStatus.js +3 -2
- package/dist/components/DevStatus.js.map +1 -1
- package/dist/daemon/client.d.ts +30 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +97 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/code-graph/builder.d.ts +6 -0
- package/dist/daemon/code-graph/builder.d.ts.map +1 -0
- package/dist/daemon/code-graph/builder.js +215 -0
- package/dist/daemon/code-graph/builder.js.map +1 -0
- package/dist/daemon/code-graph/query.d.ts +29 -0
- package/dist/daemon/code-graph/query.d.ts.map +1 -0
- package/dist/daemon/code-graph/query.js +98 -0
- package/dist/daemon/code-graph/query.js.map +1 -0
- package/dist/daemon/code-graph/types.d.ts +37 -0
- package/dist/daemon/code-graph/types.d.ts.map +1 -0
- package/dist/daemon/code-graph/types.js +5 -0
- package/dist/daemon/code-graph/types.js.map +1 -0
- package/dist/daemon/code-graph/watcher.d.ts +37 -0
- package/dist/daemon/code-graph/watcher.d.ts.map +1 -0
- package/dist/daemon/code-graph/watcher.js +79 -0
- package/dist/daemon/code-graph/watcher.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +6 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +132 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/protocol.d.ts +113 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +16 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.d.ts +26 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +168 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +559 -357
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +5 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +52 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +5 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +8 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/differential-context.d.ts +46 -0
- package/dist/lib/differential-context.d.ts.map +1 -0
- package/dist/lib/differential-context.js +89 -0
- package/dist/lib/differential-context.js.map +1 -0
- package/dist/lib/resolve.d.ts +3 -0
- package/dist/lib/resolve.d.ts.map +1 -0
- package/dist/lib/resolve.js +29 -0
- package/dist/lib/resolve.js.map +1 -0
- package/dist/lib/structured-tool-io.d.ts +31 -0
- package/dist/lib/structured-tool-io.d.ts.map +1 -0
- package/dist/lib/structured-tool-io.js +56 -0
- package/dist/lib/structured-tool-io.js.map +1 -0
- package/dist/mcp/__tests__/client.test.d.ts +2 -0
- package/dist/mcp/__tests__/client.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/client.test.js +101 -0
- package/dist/mcp/__tests__/client.test.js.map +1 -0
- package/dist/mcp/client.d.ts +89 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +201 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/repl/__tests__/_queue_demo.test.d.ts +2 -0
- package/dist/repl/__tests__/_queue_demo.test.d.ts.map +1 -0
- package/dist/repl/__tests__/_queue_demo.test.js +40 -0
- package/dist/repl/__tests__/_queue_demo.test.js.map +1 -0
- package/dist/repl/__tests__/components.test.d.ts +2 -0
- package/dist/repl/__tests__/components.test.d.ts.map +1 -0
- package/dist/repl/__tests__/components.test.js +87 -0
- package/dist/repl/__tests__/components.test.js.map +1 -0
- package/dist/repl/__tests__/interactive.queue.test.d.ts +2 -0
- package/dist/repl/__tests__/interactive.queue.test.d.ts.map +1 -0
- package/dist/repl/__tests__/interactive.queue.test.js +124 -0
- package/dist/repl/__tests__/interactive.queue.test.js.map +1 -0
- package/dist/repl/components.d.ts +76 -0
- package/dist/repl/components.d.ts.map +1 -0
- package/dist/repl/components.js +182 -0
- package/dist/repl/components.js.map +1 -0
- package/dist/repl/interactive.d.ts +17 -0
- package/dist/repl/interactive.d.ts.map +1 -0
- package/dist/repl/interactive.js +439 -0
- package/dist/repl/interactive.js.map +1 -0
- package/dist/repl/one-shot.d.ts +25 -0
- package/dist/repl/one-shot.d.ts.map +1 -0
- package/dist/repl/one-shot.js +153 -0
- package/dist/repl/one-shot.js.map +1 -0
- package/dist/rules/__tests__/enforce.test.d.ts +2 -0
- package/dist/rules/__tests__/enforce.test.d.ts.map +1 -0
- package/dist/rules/__tests__/enforce.test.js +58 -0
- package/dist/rules/__tests__/enforce.test.js.map +1 -0
- package/dist/rules/__tests__/loader.test.d.ts +2 -0
- package/dist/rules/__tests__/loader.test.d.ts.map +1 -0
- package/dist/rules/__tests__/loader.test.js +54 -0
- package/dist/rules/__tests__/loader.test.js.map +1 -0
- package/dist/rules/enforce.d.ts +23 -0
- package/dist/rules/enforce.d.ts.map +1 -0
- package/dist/rules/enforce.js +36 -0
- package/dist/rules/enforce.js.map +1 -0
- package/dist/rules/index.d.ts +10 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +4 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/loader.d.ts +10 -0
- package/dist/rules/loader.d.ts.map +1 -0
- package/dist/rules/loader.js +77 -0
- package/dist/rules/loader.js.map +1 -0
- package/dist/rules/types.d.ts +39 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +16 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/write.d.ts +10 -0
- package/dist/rules/write.d.ts.map +1 -0
- package/dist/rules/write.js +28 -0
- package/dist/rules/write.js.map +1 -0
- package/dist/settings/__tests__/gate.test.d.ts +2 -0
- package/dist/settings/__tests__/gate.test.d.ts.map +1 -0
- package/dist/settings/__tests__/gate.test.js +137 -0
- package/dist/settings/__tests__/gate.test.js.map +1 -0
- package/dist/settings/__tests__/hooks.test.d.ts +2 -0
- package/dist/settings/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/settings/__tests__/hooks.test.js +103 -0
- package/dist/settings/__tests__/hooks.test.js.map +1 -0
- package/dist/settings/__tests__/mcp-write.test.d.ts +2 -0
- package/dist/settings/__tests__/mcp-write.test.d.ts.map +1 -0
- package/dist/settings/__tests__/mcp-write.test.js +77 -0
- package/dist/settings/__tests__/mcp-write.test.js.map +1 -0
- package/dist/settings/__tests__/permissions-gate.test.d.ts +2 -0
- package/dist/settings/__tests__/permissions-gate.test.d.ts.map +1 -0
- package/dist/settings/__tests__/permissions-gate.test.js +75 -0
- package/dist/settings/__tests__/permissions-gate.test.js.map +1 -0
- package/dist/settings/__tests__/resolve.test.d.ts +2 -0
- package/dist/settings/__tests__/resolve.test.d.ts.map +1 -0
- package/dist/settings/__tests__/resolve.test.js +109 -0
- package/dist/settings/__tests__/resolve.test.js.map +1 -0
- package/dist/settings/__tests__/runtime.test.d.ts +2 -0
- package/dist/settings/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/settings/__tests__/runtime.test.js +72 -0
- package/dist/settings/__tests__/runtime.test.js.map +1 -0
- package/dist/settings/__tests__/schema.test.d.ts +2 -0
- package/dist/settings/__tests__/schema.test.d.ts.map +1 -0
- package/dist/settings/__tests__/schema.test.js +55 -0
- package/dist/settings/__tests__/schema.test.js.map +1 -0
- package/dist/settings/__tests__/write.test.d.ts +2 -0
- package/dist/settings/__tests__/write.test.d.ts.map +1 -0
- package/dist/settings/__tests__/write.test.js +61 -0
- package/dist/settings/__tests__/write.test.js.map +1 -0
- package/dist/settings/gate.d.ts +34 -0
- package/dist/settings/gate.d.ts.map +1 -0
- package/dist/settings/gate.js +50 -0
- package/dist/settings/gate.js.map +1 -0
- package/dist/settings/hooks.d.ts +26 -0
- package/dist/settings/hooks.d.ts.map +1 -0
- package/dist/settings/hooks.js +115 -0
- package/dist/settings/hooks.js.map +1 -0
- package/dist/settings/index.d.ts +23 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +23 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/mcp-write.d.ts +41 -0
- package/dist/settings/mcp-write.d.ts.map +1 -0
- package/dist/settings/mcp-write.js +61 -0
- package/dist/settings/mcp-write.js.map +1 -0
- package/dist/settings/permissions-gate.d.ts +19 -0
- package/dist/settings/permissions-gate.d.ts.map +1 -0
- package/dist/settings/permissions-gate.js +103 -0
- package/dist/settings/permissions-gate.js.map +1 -0
- package/dist/settings/resolve.d.ts +37 -0
- package/dist/settings/resolve.d.ts.map +1 -0
- package/dist/settings/resolve.js +169 -0
- package/dist/settings/resolve.js.map +1 -0
- package/dist/settings/runtime.d.ts +28 -0
- package/dist/settings/runtime.d.ts.map +1 -0
- package/dist/settings/runtime.js +45 -0
- package/dist/settings/runtime.js.map +1 -0
- package/dist/settings/schema.d.ts +1387 -0
- package/dist/settings/schema.d.ts.map +1 -0
- package/dist/settings/schema.js +146 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/settings/write.d.ts +37 -0
- package/dist/settings/write.d.ts.map +1 -0
- package/dist/settings/write.js +85 -0
- package/dist/settings/write.js.map +1 -0
- package/dist/slash/__tests__/expand.test.d.ts +2 -0
- package/dist/slash/__tests__/expand.test.d.ts.map +1 -0
- package/dist/slash/__tests__/expand.test.js +44 -0
- package/dist/slash/__tests__/expand.test.js.map +1 -0
- package/dist/slash/__tests__/loader.test.d.ts +2 -0
- package/dist/slash/__tests__/loader.test.d.ts.map +1 -0
- package/dist/slash/__tests__/loader.test.js +48 -0
- package/dist/slash/__tests__/loader.test.js.map +1 -0
- package/dist/slash/expand.d.ts +32 -0
- package/dist/slash/expand.d.ts.map +1 -0
- package/dist/slash/expand.js +48 -0
- package/dist/slash/expand.js.map +1 -0
- package/dist/slash/index.d.ts +11 -0
- package/dist/slash/index.d.ts.map +1 -0
- package/dist/slash/index.js +4 -0
- package/dist/slash/index.js.map +1 -0
- package/dist/slash/loader.d.ts +10 -0
- package/dist/slash/loader.d.ts.map +1 -0
- package/dist/slash/loader.js +64 -0
- package/dist/slash/loader.js.map +1 -0
- package/dist/slash/types.d.ts +24 -0
- package/dist/slash/types.d.ts.map +1 -0
- package/dist/slash/types.js +11 -0
- package/dist/slash/types.js.map +1 -0
- package/dist/slash/write.d.ts +10 -0
- package/dist/slash/write.d.ts.map +1 -0
- package/dist/slash/write.js +26 -0
- package/dist/slash/write.js.map +1 -0
- package/dist/tui/__tests__/app.test.d.ts +2 -0
- package/dist/tui/__tests__/app.test.d.ts.map +1 -0
- package/dist/tui/__tests__/app.test.js +136 -0
- package/dist/tui/__tests__/app.test.js.map +1 -0
- package/dist/tui/__tests__/banner.test.d.ts +2 -0
- package/dist/tui/__tests__/banner.test.d.ts.map +1 -0
- package/dist/tui/__tests__/banner.test.js +15 -0
- package/dist/tui/__tests__/banner.test.js.map +1 -0
- package/dist/tui/__tests__/command-form.test.d.ts +2 -0
- package/dist/tui/__tests__/command-form.test.d.ts.map +1 -0
- package/dist/tui/__tests__/command-form.test.js +96 -0
- package/dist/tui/__tests__/command-form.test.js.map +1 -0
- package/dist/tui/__tests__/command-tree.test.d.ts +2 -0
- package/dist/tui/__tests__/command-tree.test.d.ts.map +1 -0
- package/dist/tui/__tests__/command-tree.test.js +55 -0
- package/dist/tui/__tests__/command-tree.test.js.map +1 -0
- package/dist/tui/__tests__/runner.test.d.ts +2 -0
- package/dist/tui/__tests__/runner.test.d.ts.map +1 -0
- package/dist/tui/__tests__/runner.test.js +38 -0
- package/dist/tui/__tests__/runner.test.js.map +1 -0
- package/dist/tui/__tests__/theme.test.d.ts +2 -0
- package/dist/tui/__tests__/theme.test.d.ts.map +1 -0
- package/dist/tui/__tests__/theme.test.js +11 -0
- package/dist/tui/__tests__/theme.test.js.map +1 -0
- package/dist/tui/agent-view/activity-feed.d.ts +3 -0
- package/dist/tui/agent-view/activity-feed.d.ts.map +1 -0
- package/dist/tui/agent-view/activity-feed.js +34 -0
- package/dist/tui/agent-view/activity-feed.js.map +1 -0
- package/dist/tui/agent-view/budget-bar.d.ts +3 -0
- package/dist/tui/agent-view/budget-bar.d.ts.map +1 -0
- package/dist/tui/agent-view/budget-bar.js +53 -0
- package/dist/tui/agent-view/budget-bar.js.map +1 -0
- package/dist/tui/agent-view/compile-panel.d.ts +3 -0
- package/dist/tui/agent-view/compile-panel.d.ts.map +1 -0
- package/dist/tui/agent-view/compile-panel.js +34 -0
- package/dist/tui/agent-view/compile-panel.js.map +1 -0
- package/dist/tui/agent-view/index.d.ts +4 -0
- package/dist/tui/agent-view/index.d.ts.map +1 -0
- package/dist/tui/agent-view/index.js +31 -0
- package/dist/tui/agent-view/index.js.map +1 -0
- package/dist/tui/agent-view/memory-panel.d.ts +3 -0
- package/dist/tui/agent-view/memory-panel.d.ts.map +1 -0
- package/dist/tui/agent-view/memory-panel.js +80 -0
- package/dist/tui/agent-view/memory-panel.js.map +1 -0
- package/dist/tui/agent-view/session-panel.d.ts +3 -0
- package/dist/tui/agent-view/session-panel.d.ts.map +1 -0
- package/dist/tui/agent-view/session-panel.js +44 -0
- package/dist/tui/agent-view/session-panel.js.map +1 -0
- package/dist/tui/agent-view/status-bar.d.ts +7 -0
- package/dist/tui/agent-view/status-bar.d.ts.map +1 -0
- package/dist/tui/agent-view/status-bar.js +22 -0
- package/dist/tui/agent-view/status-bar.js.map +1 -0
- package/dist/tui/app.d.ts +9 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +115 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/banner.d.ts +5 -0
- package/dist/tui/banner.d.ts.map +1 -0
- package/dist/tui/banner.js +17 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/command-form.d.ts +9 -0
- package/dist/tui/command-form.d.ts.map +1 -0
- package/dist/tui/command-form.js +76 -0
- package/dist/tui/command-form.js.map +1 -0
- package/dist/tui/command-tree.d.ts +30 -0
- package/dist/tui/command-tree.d.ts.map +1 -0
- package/dist/tui/command-tree.js +43 -0
- package/dist/tui/command-tree.js.map +1 -0
- package/dist/tui/fleet-view/agent-row.d.ts +10 -0
- package/dist/tui/fleet-view/agent-row.d.ts.map +1 -0
- package/dist/tui/fleet-view/agent-row.js +80 -0
- package/dist/tui/fleet-view/agent-row.js.map +1 -0
- package/dist/tui/fleet-view/dispatch-input.d.ts +5 -0
- package/dist/tui/fleet-view/dispatch-input.d.ts.map +1 -0
- package/dist/tui/fleet-view/dispatch-input.js +36 -0
- package/dist/tui/fleet-view/dispatch-input.js.map +1 -0
- package/dist/tui/fleet-view/fleet-app.d.ts +11 -0
- package/dist/tui/fleet-view/fleet-app.d.ts.map +1 -0
- package/dist/tui/fleet-view/fleet-app.js +95 -0
- package/dist/tui/fleet-view/fleet-app.js.map +1 -0
- package/dist/tui/fleet-view/fleet-summary.d.ts +6 -0
- package/dist/tui/fleet-view/fleet-summary.d.ts.map +1 -0
- package/dist/tui/fleet-view/fleet-summary.js +19 -0
- package/dist/tui/fleet-view/fleet-summary.js.map +1 -0
- package/dist/tui/fleet-view/index.d.ts +16 -0
- package/dist/tui/fleet-view/index.d.ts.map +1 -0
- package/dist/tui/fleet-view/index.js +65 -0
- package/dist/tui/fleet-view/index.js.map +1 -0
- package/dist/tui/runner.d.ts +7 -0
- package/dist/tui/runner.d.ts.map +1 -0
- package/dist/tui/runner.js +36 -0
- package/dist/tui/runner.js.map +1 -0
- package/dist/tui/theme.d.ts +8 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +10 -0
- package/dist/tui/theme.js.map +1 -0
- package/package.json +16 -7
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git isolation protocol for the fleet — the safety layer that makes it
|
|
3
|
+
* *physically impossible* for two parallel subagents to clobber each other's
|
|
4
|
+
* files, and that makes it *impossible to lose* any work an agent committed.
|
|
5
|
+
*
|
|
6
|
+
* The original fleet ran every subagent against one shared working tree and
|
|
7
|
+
* tried to avoid collisions with a guess: tasks whose *predicted* `files[]`
|
|
8
|
+
* overlapped were serialized. That guess fails the moment an agent edits a file
|
|
9
|
+
* it didn't predict — two writes interleave and you get a half-written file,
|
|
10
|
+
* before any commit exists to recover from. The fix is not "commit more
|
|
11
|
+
* cleverly", it's isolation: give each agent its own checkout.
|
|
12
|
+
*
|
|
13
|
+
* The model (a correct, minimal version of "branch-per-change, replay-on-merge"):
|
|
14
|
+
*
|
|
15
|
+
* 1. SPAWN — each task gets its own `git worktree` on its own branch, cut
|
|
16
|
+
* from a single frozen base ref. Separate index, separate HEAD,
|
|
17
|
+
* separate files: file-level clobbering is now structurally
|
|
18
|
+
* impossible, not merely discouraged.
|
|
19
|
+
* 2. CHECKPOINT — the agent's changes are committed atomically, and every
|
|
20
|
+
* commit hash is pinned under `refs/oxagen/agents/<task>/<n>`.
|
|
21
|
+
* A pinned commit is content-addressed and immune to branch
|
|
22
|
+
* deletion and `git gc`: work can be orphaned but never lost.
|
|
23
|
+
* 3. INTEGRATE — task branches are merged back into one integration branch
|
|
24
|
+
* *one at a time* (a mutex), with `rerere` enabled. A merge that
|
|
25
|
+
* conflicts is **aborted**, leaving the integration tree clean,
|
|
26
|
+
* and the conflict is *surfaced* (the files are returned) instead
|
|
27
|
+
* of silently corrupting anything. Conflicts are relocated to an
|
|
28
|
+
* explicit, owned step — they are not made to disappear, because
|
|
29
|
+
* for *code* that is impossible in general (two semantically
|
|
30
|
+
* contradictory edits can't both be right).
|
|
31
|
+
* 4. DISPOSE — worktrees and branches are torn down, but the
|
|
32
|
+
* `refs/oxagen/agents/*` pins are kept. `git for-each-ref
|
|
33
|
+
* refs/oxagen/agents` is then a durable log of every atomic
|
|
34
|
+
* change the fleet ever made, recoverable by hash.
|
|
35
|
+
*
|
|
36
|
+
* Git is shelled via {@link GitRunner} (injectable) so the orchestrator's unit
|
|
37
|
+
* tests stay filesystem-free; the real runner uses `node:child_process`,
|
|
38
|
+
* matching the rest of the CLI (no git library dependency).
|
|
39
|
+
*/
|
|
40
|
+
import { execFile } from "node:child_process";
|
|
41
|
+
import { mkdirSync, existsSync, readFileSync, appendFileSync } from "node:fs";
|
|
42
|
+
import { join } from "node:path";
|
|
43
|
+
import { promisify } from "node:util";
|
|
44
|
+
const pexec = promisify(execFile);
|
|
45
|
+
/** The real runner: `git <args>` via child_process, rooted at the repo. */
|
|
46
|
+
export function defaultGitRunner(repoRoot) {
|
|
47
|
+
return async (args, cwd) => {
|
|
48
|
+
try {
|
|
49
|
+
const { stdout, stderr } = await pexec("git", args, {
|
|
50
|
+
cwd: cwd ?? repoRoot,
|
|
51
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
52
|
+
});
|
|
53
|
+
return { stdout, stderr, code: 0 };
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
const err = e;
|
|
57
|
+
return {
|
|
58
|
+
stdout: err.stdout ?? "",
|
|
59
|
+
stderr: err.stderr ?? err.message ?? "",
|
|
60
|
+
code: typeof err.code === "number" ? err.code : 1,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Allowed characters in a branch/path segment derived from a task id. */
|
|
66
|
+
function safeSegment(id) {
|
|
67
|
+
return id.replace(/[^A-Za-z0-9._-]/g, "-").replace(/^-+|-+$/g, "") || "task";
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Owns the worktrees, branches, and durability pins for one fleet run.
|
|
71
|
+
*
|
|
72
|
+
* One instance per {@link Fleet}. Methods are safe to call from many concurrent
|
|
73
|
+
* agents: `spawn`/`checkpoint`/`dispose` operate on disjoint worktrees, and
|
|
74
|
+
* `integrate` is serialized internally so two merges never race on the
|
|
75
|
+
* integration branch.
|
|
76
|
+
*/
|
|
77
|
+
export class WorktreeManager {
|
|
78
|
+
opts;
|
|
79
|
+
git;
|
|
80
|
+
ns;
|
|
81
|
+
repoRoot;
|
|
82
|
+
root;
|
|
83
|
+
/** The frozen commit every task branch is cut from. */
|
|
84
|
+
baseRef = "";
|
|
85
|
+
/** Lazily-created integration worktree path + branch. */
|
|
86
|
+
integration = null;
|
|
87
|
+
initialized = false;
|
|
88
|
+
/** Per-task pin sequence + recorded checkpoints (the durability log). */
|
|
89
|
+
seq = new Map();
|
|
90
|
+
commits = new Map();
|
|
91
|
+
/** Worktrees handed out, by task id. */
|
|
92
|
+
worktrees = new Map();
|
|
93
|
+
/** Serializes `integrate` so concurrent finishers can't race the merge. */
|
|
94
|
+
integrateLock = Promise.resolve();
|
|
95
|
+
constructor(opts) {
|
|
96
|
+
this.opts = opts;
|
|
97
|
+
this.git = opts.git ?? defaultGitRunner(opts.repoRoot);
|
|
98
|
+
this.ns = safeSegment(opts.namespace ?? "fleet");
|
|
99
|
+
this.repoRoot = opts.repoRoot;
|
|
100
|
+
this.root = opts.root ?? join(opts.repoRoot, ".oxagen", "worktrees");
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Resolve the repo toplevel, freeze the base ref, enable `rerere`, and keep
|
|
104
|
+
* the worktree root out of git's sight. Idempotent.
|
|
105
|
+
*/
|
|
106
|
+
async init() {
|
|
107
|
+
if (this.initialized)
|
|
108
|
+
return;
|
|
109
|
+
const top = await this.git(["rev-parse", "--show-toplevel"]);
|
|
110
|
+
if (top.code !== 0) {
|
|
111
|
+
throw new Error(`git isolation: not a git repository (${top.stderr.trim()})`);
|
|
112
|
+
}
|
|
113
|
+
this.repoRoot = top.stdout.trim();
|
|
114
|
+
if (!this.opts.root)
|
|
115
|
+
this.root = join(this.repoRoot, ".oxagen", "worktrees");
|
|
116
|
+
const head = await this.git(["rev-parse", "HEAD"]);
|
|
117
|
+
if (head.code !== 0)
|
|
118
|
+
throw new Error(`git isolation: cannot resolve HEAD (${head.stderr.trim()})`);
|
|
119
|
+
this.baseRef = head.stdout.trim();
|
|
120
|
+
// rerere makes repeated conflict resolutions idempotent — a resolver agent
|
|
121
|
+
// (or human) resolves a given conflict once and git replays it thereafter.
|
|
122
|
+
await this.git(["config", "rerere.enabled", "true"]);
|
|
123
|
+
this.excludeWorktreeRoot();
|
|
124
|
+
mkdirSync(this.root, { recursive: true });
|
|
125
|
+
this.initialized = true;
|
|
126
|
+
}
|
|
127
|
+
/** The frozen base every task fans out from. */
|
|
128
|
+
get base() {
|
|
129
|
+
return this.baseRef;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create an isolated worktree for `taskId` and return its path. The agent runs
|
|
133
|
+
* with this as its `cwd`; nothing it does can touch another agent's tree.
|
|
134
|
+
*/
|
|
135
|
+
async spawn(taskId) {
|
|
136
|
+
await this.init();
|
|
137
|
+
const seg = safeSegment(taskId);
|
|
138
|
+
const branch = `fleet/${this.ns}/t/${seg}`;
|
|
139
|
+
const path = join(this.root, this.ns, `t-${seg}`);
|
|
140
|
+
// A re-run may leave a stale worktree/branch behind; clear it first.
|
|
141
|
+
await this.removeWorktree(path);
|
|
142
|
+
await this.git(["branch", "-D", branch]); // ignore "not found"
|
|
143
|
+
const add = await this.git(["worktree", "add", "-b", branch, path, this.baseRef]);
|
|
144
|
+
if (add.code !== 0) {
|
|
145
|
+
throw new Error(`git isolation: worktree add failed for ${taskId}: ${add.stderr.trim()}`);
|
|
146
|
+
}
|
|
147
|
+
this.worktrees.set(taskId, { path, branch });
|
|
148
|
+
return path;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Atomically commit whatever the agent changed in its worktree and pin the
|
|
152
|
+
* commit under `refs/oxagen/agents/<task>/<n>`. Returns the checkpoint, or
|
|
153
|
+
* `null` when the agent changed nothing.
|
|
154
|
+
*/
|
|
155
|
+
async checkpoint(taskId, message) {
|
|
156
|
+
const wt = this.worktrees.get(taskId);
|
|
157
|
+
if (!wt)
|
|
158
|
+
throw new Error(`git isolation: no worktree for ${taskId} (call spawn first)`);
|
|
159
|
+
await this.git(["add", "-A"], wt.path);
|
|
160
|
+
const status = await this.git(["status", "--porcelain"], wt.path);
|
|
161
|
+
if (status.code === 0 && status.stdout.trim() === "")
|
|
162
|
+
return null; // nothing changed
|
|
163
|
+
// --no-verify: these are fine-grained per-step commits; the gate runs at
|
|
164
|
+
// integration / CI, not on every micro-commit.
|
|
165
|
+
const commit = await this.git(["commit", "--no-verify", "-m", message], wt.path);
|
|
166
|
+
if (commit.code !== 0) {
|
|
167
|
+
throw new Error(`git isolation: commit failed for ${taskId}: ${commit.stderr.trim()}`);
|
|
168
|
+
}
|
|
169
|
+
const rev = await this.git(["rev-parse", "HEAD"], wt.path);
|
|
170
|
+
const hash = rev.stdout.trim();
|
|
171
|
+
const n = (this.seq.get(taskId) ?? 0) + 1;
|
|
172
|
+
this.seq.set(taskId, n);
|
|
173
|
+
const ref = `refs/oxagen/agents/${safeSegment(taskId)}/${n}`;
|
|
174
|
+
await this.git(["update-ref", ref, hash]); // pin: survives branch deletion + gc
|
|
175
|
+
const cp = { taskId, hash, ref, message };
|
|
176
|
+
const list = this.commits.get(taskId) ?? [];
|
|
177
|
+
list.push(cp);
|
|
178
|
+
this.commits.set(taskId, list);
|
|
179
|
+
return cp;
|
|
180
|
+
}
|
|
181
|
+
/** Every pinned checkpoint recorded for a task — the durability log. */
|
|
182
|
+
recordedCommits(taskId) {
|
|
183
|
+
return this.commits.get(taskId) ?? [];
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Merge a task's branch into the integration branch. Serialized so two merges
|
|
187
|
+
* never race. A conflicting merge is aborted (integration tree left clean) and
|
|
188
|
+
* the conflicting files are returned — never a corrupt half-merge.
|
|
189
|
+
*/
|
|
190
|
+
integrate(taskId, message) {
|
|
191
|
+
return this.withIntegrateLock(() => this.doIntegrate(taskId, message));
|
|
192
|
+
}
|
|
193
|
+
async doIntegrate(taskId, message) {
|
|
194
|
+
const wt = this.worktrees.get(taskId);
|
|
195
|
+
if (!wt)
|
|
196
|
+
throw new Error(`git isolation: no worktree for ${taskId}`);
|
|
197
|
+
const int = await this.ensureIntegration();
|
|
198
|
+
const msg = message ?? `fleet(${taskId}): integrate`;
|
|
199
|
+
const merge = await this.git(["merge", "--no-ff", "-m", msg, wt.branch], int.path);
|
|
200
|
+
if (merge.code === 0) {
|
|
201
|
+
const tip = await this.git(["rev-parse", "HEAD"], int.path);
|
|
202
|
+
return { ok: true, commit: tip.stdout.trim(), taskBranch: wt.branch };
|
|
203
|
+
}
|
|
204
|
+
// Conflict. rerere may already have replayed a recorded resolution — if no
|
|
205
|
+
// files remain unmerged, commit it and report success.
|
|
206
|
+
const unmerged = await this.git(["diff", "--name-only", "--diff-filter=U"], int.path);
|
|
207
|
+
const conflicts = unmerged.stdout.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
208
|
+
if (conflicts.length === 0) {
|
|
209
|
+
const done = await this.git(["commit", "--no-verify", "--no-edit"], int.path);
|
|
210
|
+
if (done.code === 0) {
|
|
211
|
+
const tip = await this.git(["rev-parse", "HEAD"], int.path);
|
|
212
|
+
return { ok: true, commit: tip.stdout.trim(), taskBranch: wt.branch, autoResolved: true };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Real conflict: abort so the integration tree stays clean, and surface it.
|
|
216
|
+
await this.git(["merge", "--abort"], int.path);
|
|
217
|
+
const tip = await this.git(["rev-parse", wt.branch]);
|
|
218
|
+
return { ok: false, conflicts, taskBranch: wt.branch, taskTip: tip.stdout.trim() };
|
|
219
|
+
}
|
|
220
|
+
/** The integration branch + its worktree path, once at least one integrate ran. */
|
|
221
|
+
integrationRef() {
|
|
222
|
+
return this.integration;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Remove a task's worktree. Keeps the branch and the `refs/oxagen/agents` pins
|
|
226
|
+
* (so nothing is lost). Pass `keep` to leave the worktree on disk — e.g. after
|
|
227
|
+
* a conflict, so a resolver agent or human can work in it.
|
|
228
|
+
*/
|
|
229
|
+
async dispose(taskId, opts = {}) {
|
|
230
|
+
const wt = this.worktrees.get(taskId);
|
|
231
|
+
if (!wt || opts.keep)
|
|
232
|
+
return;
|
|
233
|
+
await this.removeWorktree(wt.path);
|
|
234
|
+
this.worktrees.delete(taskId);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Tear down every worktree and prune. Keeps the integration branch (the
|
|
238
|
+
* result) and all `refs/oxagen/agents` pins (the durability log).
|
|
239
|
+
*/
|
|
240
|
+
async cleanupAll() {
|
|
241
|
+
for (const [id, wt] of this.worktrees) {
|
|
242
|
+
await this.removeWorktree(wt.path);
|
|
243
|
+
this.worktrees.delete(id);
|
|
244
|
+
}
|
|
245
|
+
if (this.integration)
|
|
246
|
+
await this.removeWorktree(this.integration.path);
|
|
247
|
+
await this.git(["worktree", "prune"]);
|
|
248
|
+
}
|
|
249
|
+
// ── internals ────────────────────────────────────────────────────────────
|
|
250
|
+
async ensureIntegration() {
|
|
251
|
+
if (this.integration)
|
|
252
|
+
return this.integration;
|
|
253
|
+
const branch = `fleet/${this.ns}/integration`;
|
|
254
|
+
const path = join(this.root, this.ns, "integration");
|
|
255
|
+
await this.removeWorktree(path);
|
|
256
|
+
await this.git(["branch", "-D", branch]);
|
|
257
|
+
const add = await this.git(["worktree", "add", "-b", branch, path, this.baseRef]);
|
|
258
|
+
if (add.code !== 0) {
|
|
259
|
+
throw new Error(`git isolation: integration worktree failed: ${add.stderr.trim()}`);
|
|
260
|
+
}
|
|
261
|
+
this.integration = { path, branch };
|
|
262
|
+
return this.integration;
|
|
263
|
+
}
|
|
264
|
+
async removeWorktree(path) {
|
|
265
|
+
if (!existsSync(path))
|
|
266
|
+
return;
|
|
267
|
+
await this.git(["worktree", "remove", "--force", path]);
|
|
268
|
+
}
|
|
269
|
+
async withIntegrateLock(fn) {
|
|
270
|
+
const run = this.integrateLock.then(fn, fn);
|
|
271
|
+
this.integrateLock = run.then(() => undefined, () => undefined);
|
|
272
|
+
return run;
|
|
273
|
+
}
|
|
274
|
+
/** Keep `.oxagen/` out of git's untracked list without touching tracked .gitignore. */
|
|
275
|
+
excludeWorktreeRoot() {
|
|
276
|
+
try {
|
|
277
|
+
const exclude = join(this.repoRoot, ".git", "info", "exclude");
|
|
278
|
+
if (!existsSync(exclude))
|
|
279
|
+
return;
|
|
280
|
+
const body = readFileSync(exclude, "utf8");
|
|
281
|
+
if (!body.split("\n").some((l) => l.trim() === ".oxagen/")) {
|
|
282
|
+
appendFileSync(exclude, `${body.endsWith("\n") ? "" : "\n"}.oxagen/\n`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
/* best-effort; isolation still works if we can't write the exclude */
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=git-isolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-isolation.js","sourceRoot":"","sources":["../../../src/agent/fleet/git-isolation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MemoryRecord } from "./types.js";
|
|
2
|
+
export interface FleetMemory {
|
|
3
|
+
/** Append a weighted lesson. Never throws — recording must not break a run. */
|
|
4
|
+
record(rec: Omit<MemoryRecord, "id" | "createdAt">): void;
|
|
5
|
+
/** Return the most relevant lessons for a query, best first. */
|
|
6
|
+
recall(query: string, opts?: {
|
|
7
|
+
limit?: number;
|
|
8
|
+
files?: string[];
|
|
9
|
+
}): MemoryRecord[];
|
|
10
|
+
/** All records, newest first (for the agents screen memory panel). */
|
|
11
|
+
all(): MemoryRecord[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Open (or create) the project's fleet memory. Reads are cached in-process and
|
|
15
|
+
* invalidated on every write, so a long-lived REPL/agents screen sees its own
|
|
16
|
+
* appends without re-reading the file each recall.
|
|
17
|
+
*/
|
|
18
|
+
export declare function openFleetMemory(cwd: string): FleetMemory;
|
|
19
|
+
/** Render recalled lessons as a compact context block for prompt injection. */
|
|
20
|
+
export declare function formatLessons(records: MemoryRecord[]): string;
|
|
21
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/agent/fleet/memory.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB/C,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;IAC1D,gEAAgE;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,YAAY,EAAE,CAAC;IACnF,sEAAsE;IACtE,GAAG,IAAI,YAAY,EAAE,CAAC;CACvB;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAkExD;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAS7D"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet memory — a local, dependency-free record of what the agent army builds
|
|
3
|
+
* and fixes, with lexical recall.
|
|
4
|
+
*
|
|
5
|
+
* This complements the engram/DuckDB episodic store ({@link openSessionMemory}).
|
|
6
|
+
* That store is best-effort and silently disables itself when its optional native
|
|
7
|
+
* dependency is missing; this one is plain JSON Lines on disk, so memory
|
|
8
|
+
* recording is *guaranteed* — which is what the user asked for ("record the
|
|
9
|
+
* memories as it fixes/builds things"). It mirrors the platform's weighted
|
|
10
|
+
* `agent.memory.write` shape (kind + weight + lesson) so the same lessons can be
|
|
11
|
+
* promoted to the knowledge graph later.
|
|
12
|
+
*
|
|
13
|
+
* Recall is a transparent lexical scorer (term overlap + file overlap + weight),
|
|
14
|
+
* not embeddings: it needs no model call, works offline, and is good enough to
|
|
15
|
+
* surface the handful of relevant lessons that should steer the next task.
|
|
16
|
+
*/
|
|
17
|
+
import { mkdirSync, appendFileSync, readFileSync, existsSync } from "node:fs";
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
|
+
import { basename, dirname, join } from "node:path";
|
|
20
|
+
/** Stable per-project key from the working directory name. */
|
|
21
|
+
function projectKey(cwd) {
|
|
22
|
+
return basename(cwd) || "default";
|
|
23
|
+
}
|
|
24
|
+
function memoryPath(cwd) {
|
|
25
|
+
return join(homedir(), ".config", "oxagen", "memories", `${projectKey(cwd)}.jsonl`);
|
|
26
|
+
}
|
|
27
|
+
const STOPWORDS = new Set([
|
|
28
|
+
"the", "a", "an", "and", "or", "to", "of", "in", "on", "for", "with", "is",
|
|
29
|
+
"are", "be", "this", "that", "it", "as", "at", "by", "from", "into", "we",
|
|
30
|
+
"you", "i", "fix", "add", "the", "use", "code", "file", "files",
|
|
31
|
+
]);
|
|
32
|
+
/** Split text into lowercased, de-stopped terms for lexical scoring. */
|
|
33
|
+
function terms(text) {
|
|
34
|
+
return (text.toLowerCase().match(/[a-z0-9_]+/g) ?? []).filter((t) => t.length > 2 && !STOPWORDS.has(t));
|
|
35
|
+
}
|
|
36
|
+
let counter = 0;
|
|
37
|
+
function newId() {
|
|
38
|
+
counter = (counter + 1) % 1_000_000;
|
|
39
|
+
return `mem_${Date.now().toString(36)}_${counter.toString(36)}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Open (or create) the project's fleet memory. Reads are cached in-process and
|
|
43
|
+
* invalidated on every write, so a long-lived REPL/agents screen sees its own
|
|
44
|
+
* appends without re-reading the file each recall.
|
|
45
|
+
*/
|
|
46
|
+
export function openFleetMemory(cwd) {
|
|
47
|
+
const path = memoryPath(cwd);
|
|
48
|
+
let cache = null;
|
|
49
|
+
function load() {
|
|
50
|
+
if (cache)
|
|
51
|
+
return cache;
|
|
52
|
+
if (!existsSync(path)) {
|
|
53
|
+
cache = [];
|
|
54
|
+
return cache;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const lines = readFileSync(path, "utf8").split("\n").filter(Boolean);
|
|
58
|
+
cache = lines
|
|
59
|
+
.map((l) => {
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(l);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.filter((r) => r !== null);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
cache = [];
|
|
71
|
+
}
|
|
72
|
+
return cache;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
record(rec) {
|
|
76
|
+
const full = { ...rec, id: newId(), createdAt: Date.now() };
|
|
77
|
+
try {
|
|
78
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
79
|
+
appendFileSync(path, JSON.stringify(full) + "\n", "utf8");
|
|
80
|
+
if (cache)
|
|
81
|
+
cache.push(full);
|
|
82
|
+
else
|
|
83
|
+
cache = [full];
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
/* memory is best-effort — never break the run over a failed append */
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
recall(query, opts = {}) {
|
|
90
|
+
const limit = opts.limit ?? 5;
|
|
91
|
+
const qTerms = new Set(terms(query));
|
|
92
|
+
const qFiles = new Set((opts.files ?? []).map((f) => f));
|
|
93
|
+
const weightBoost = { low: 0, high: 1, critical: 2 };
|
|
94
|
+
const scored = load()
|
|
95
|
+
.map((r) => {
|
|
96
|
+
const rTerms = terms(r.lesson + " " + r.files.join(" "));
|
|
97
|
+
let overlap = 0;
|
|
98
|
+
for (const t of rTerms)
|
|
99
|
+
if (qTerms.has(t))
|
|
100
|
+
overlap++;
|
|
101
|
+
let fileOverlap = 0;
|
|
102
|
+
for (const f of r.files)
|
|
103
|
+
if (qFiles.has(f))
|
|
104
|
+
fileOverlap++;
|
|
105
|
+
const score = overlap + fileOverlap * 3 + weightBoost[r.weight];
|
|
106
|
+
return { r, score };
|
|
107
|
+
})
|
|
108
|
+
.filter((s) => s.score > 0)
|
|
109
|
+
.sort((a, b) => b.score - a.score || b.r.createdAt - a.r.createdAt);
|
|
110
|
+
return scored.slice(0, limit).map((s) => s.r);
|
|
111
|
+
},
|
|
112
|
+
all() {
|
|
113
|
+
return [...load()].sort((a, b) => b.createdAt - a.createdAt);
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Render recalled lessons as a compact context block for prompt injection. */
|
|
118
|
+
export function formatLessons(records) {
|
|
119
|
+
if (records.length === 0)
|
|
120
|
+
return "";
|
|
121
|
+
return records
|
|
122
|
+
.map((r) => {
|
|
123
|
+
const mark = r.weight === "critical" ? "‼" : r.weight === "high" ? "!" : "·";
|
|
124
|
+
const files = r.files.length ? ` [${r.files.slice(0, 3).join(", ")}]` : "";
|
|
125
|
+
return `${mark} (${r.kind}) ${r.lesson}${files}`;
|
|
126
|
+
})
|
|
127
|
+
.join("\n");
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/agent/fleet/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fleet orchestrator — an army of coding subagents working one tree at once.
|
|
3
|
+
*
|
|
4
|
+
* Each task is run by a subagent: the local coding loop ({@link runAgent}) on the
|
|
5
|
+
* cheapest sufficient model, against the same working directory. The orchestrator
|
|
6
|
+
* keeps as many running as the concurrency cap allows while respecting two safety
|
|
7
|
+
* rules so parallel agents never corrupt the tree or each other:
|
|
8
|
+
*
|
|
9
|
+
* 1. Dependencies — a task waits until every task it `dependsOn` is `done`; if a
|
|
10
|
+
* dependency fails, the task (and its dependents) are marked `blocked`.
|
|
11
|
+
* 2. File ownership — two tasks whose predicted `files` overlap are serialized,
|
|
12
|
+
* so two agents never edit the same file at the same time.
|
|
13
|
+
*
|
|
14
|
+
* It records a weighted memory for every task it finishes (success or failure),
|
|
15
|
+
* accumulates token/cost totals, and emits a snapshot on every change for the
|
|
16
|
+
* agents screen to render. `runAgent` is injected so the engine is unit-testable
|
|
17
|
+
* without touching the gateway.
|
|
18
|
+
*/
|
|
19
|
+
import { EventEmitter } from "node:events";
|
|
20
|
+
import type { ProjectContext } from "../project-context.js";
|
|
21
|
+
import type { AgentDefinition } from "../../agents/types.js";
|
|
22
|
+
import type { FleetMemory } from "./memory.js";
|
|
23
|
+
import type { PlanStore } from "./store.js";
|
|
24
|
+
import type { Isolation } from "./git-isolation.js";
|
|
25
|
+
import { type FleetSnapshot, type Plan } from "./types.js";
|
|
26
|
+
/** The subset of {@link runAgent} the fleet depends on (injectable for tests). */
|
|
27
|
+
export type AgentRunner = (opts: {
|
|
28
|
+
prompt: string;
|
|
29
|
+
cwd: string;
|
|
30
|
+
model?: string;
|
|
31
|
+
projectContext?: ProjectContext;
|
|
32
|
+
agent?: AgentDefinition;
|
|
33
|
+
readOnly?: boolean;
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
onText?: (delta: string) => void;
|
|
36
|
+
onToolCall?: (name: string, input: unknown) => void;
|
|
37
|
+
}) => Promise<{
|
|
38
|
+
text: string;
|
|
39
|
+
steps: number;
|
|
40
|
+
usage: {
|
|
41
|
+
inputTokens?: number;
|
|
42
|
+
outputTokens?: number;
|
|
43
|
+
};
|
|
44
|
+
}>;
|
|
45
|
+
export interface FleetOptions {
|
|
46
|
+
cwd: string;
|
|
47
|
+
/** Max subagents running at once (default 4). */
|
|
48
|
+
concurrency?: number;
|
|
49
|
+
memory?: FleetMemory | null;
|
|
50
|
+
store?: PlanStore | null;
|
|
51
|
+
projectContext?: ProjectContext;
|
|
52
|
+
/** Named agent registry; a task's `agent` is looked up here at dispatch. */
|
|
53
|
+
agents?: Map<string, AgentDefinition>;
|
|
54
|
+
/** Inject a fake runner in tests; defaults to the real {@link runAgent}. */
|
|
55
|
+
runner?: AgentRunner;
|
|
56
|
+
/** Read-only subagents (explain, don't edit). */
|
|
57
|
+
readOnly?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Per-task git isolation. When set, each agent runs in its own worktree and
|
|
60
|
+
* its work is checkpointed + integrated via explicit merges, so parallel
|
|
61
|
+
* agents physically cannot clobber the tree. When omitted (default), all
|
|
62
|
+
* agents share `cwd` and overlapping-file tasks are serialized instead.
|
|
63
|
+
*/
|
|
64
|
+
isolation?: Isolation | null;
|
|
65
|
+
}
|
|
66
|
+
export declare class Fleet extends EventEmitter {
|
|
67
|
+
private readonly cwd;
|
|
68
|
+
private readonly concurrency;
|
|
69
|
+
private readonly memory;
|
|
70
|
+
private readonly store;
|
|
71
|
+
private readonly projectContext;
|
|
72
|
+
private readonly agents;
|
|
73
|
+
private readonly runner;
|
|
74
|
+
private readonly readOnly;
|
|
75
|
+
private readonly isolation;
|
|
76
|
+
private readonly tasks;
|
|
77
|
+
private readonly snapshots;
|
|
78
|
+
private readonly controllers;
|
|
79
|
+
private readonly running;
|
|
80
|
+
private planId;
|
|
81
|
+
private settle;
|
|
82
|
+
private donePromise;
|
|
83
|
+
private adhocCounter;
|
|
84
|
+
constructor(opts: FleetOptions);
|
|
85
|
+
/** Register every task in a plan (does not start it). */
|
|
86
|
+
loadPlan(plan: Plan): void;
|
|
87
|
+
/** Add one ad-hoc task (e.g. typed into the agents screen). Returns its id. */
|
|
88
|
+
dispatchPrompt(prompt: string): string;
|
|
89
|
+
/** Begin scheduling. Resolves when every task has reached a terminal state. */
|
|
90
|
+
start(): Promise<void>;
|
|
91
|
+
/** Cancel one running/queued task. */
|
|
92
|
+
cancelTask(id: string): void;
|
|
93
|
+
/** Cancel everything in flight. */
|
|
94
|
+
cancelAll(): void;
|
|
95
|
+
snapshot(): FleetSnapshot;
|
|
96
|
+
/** Fill open slots with ready tasks, honouring deps and file-ownership locks. */
|
|
97
|
+
private pump;
|
|
98
|
+
/** The next queued task whose deps are all done and whose files are free. */
|
|
99
|
+
private pickReady;
|
|
100
|
+
private run;
|
|
101
|
+
private recordSuccess;
|
|
102
|
+
private recordFailure;
|
|
103
|
+
private toSnapshot;
|
|
104
|
+
private update;
|
|
105
|
+
private emitUpdate;
|
|
106
|
+
private checkDone;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/agent/fleet/orchestrator.ts"],"names":[],"mappings":"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"}
|