agent-bober 0.12.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +2 -2
- package/CHANGELOG.md +243 -0
- package/README.md +238 -5
- package/agents/bober-architect.md +72 -0
- package/agents/bober-code-reviewer.md +238 -0
- package/agents/bober-curator.md +49 -0
- package/agents/bober-deployer.md +267 -0
- package/agents/bober-diagnoser.md +289 -0
- package/agents/bober-documenter.md +129 -0
- package/agents/bober-evaluator.md +135 -1
- package/agents/bober-generator.md +80 -3
- package/agents/bober-planner.md +47 -1
- package/agents/bober-postmortemer.md +185 -0
- package/agents/bober-researcher.md +38 -0
- package/dist/cli/commands/approve.d.ts +17 -0
- package/dist/cli/commands/approve.d.ts.map +1 -0
- package/dist/cli/commands/approve.js +64 -0
- package/dist/cli/commands/approve.js.map +1 -0
- package/dist/cli/commands/audit-show.d.ts +14 -0
- package/dist/cli/commands/audit-show.d.ts.map +1 -0
- package/dist/cli/commands/audit-show.js +85 -0
- package/dist/cli/commands/audit-show.js.map +1 -0
- package/dist/cli/commands/config.d.ts +10 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +73 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +8 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +219 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +19 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +191 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/incident.d.ts +19 -0
- package/dist/cli/commands/incident.d.ts.map +1 -0
- package/dist/cli/commands/incident.js +324 -0
- package/dist/cli/commands/incident.js.map +1 -0
- package/dist/cli/commands/init.js +40 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list-approvals.d.ts +16 -0
- package/dist/cli/commands/list-approvals.d.ts.map +1 -0
- package/dist/cli/commands/list-approvals.js +57 -0
- package/dist/cli/commands/list-approvals.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +14 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +132 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +3 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +190 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +17 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +123 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/postmortem.d.ts +12 -0
- package/dist/cli/commands/postmortem.d.ts.map +1 -0
- package/dist/cli/commands/postmortem.js +67 -0
- package/dist/cli/commands/postmortem.js.map +1 -0
- package/dist/cli/commands/reject.d.ts +17 -0
- package/dist/cli/commands/reject.d.ts.map +1 -0
- package/dist/cli/commands/reject.js +52 -0
- package/dist/cli/commands/reject.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +21 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +90 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +29 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +16 -0
- package/dist/cli/commands/telemetry.d.ts.map +1 -0
- package/dist/cli/commands/telemetry.js +152 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/commands/worktree.d.ts +12 -0
- package/dist/cli/commands/worktree.d.ts.map +1 -0
- package/dist/cli/commands/worktree.js +57 -0
- package/dist/cli/commands/worktree.js.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +41 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +25 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/role-providers.d.ts +29 -0
- package/dist/config/role-providers.d.ts.map +1 -0
- package/dist/config/role-providers.js +115 -0
- package/dist/config/role-providers.js.map +1 -0
- package/dist/config/schema.d.ts +1350 -61
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +189 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +112 -56
- package/dist/contracts/eval-result.d.ts.map +1 -1
- package/dist/contracts/eval-result.js +3 -0
- package/dist/contracts/eval-result.js.map +1 -1
- package/dist/contracts/sprint-contract.d.ts +30 -30
- package/dist/fleet/aggregator.d.ts +5 -0
- package/dist/fleet/aggregator.d.ts.map +1 -0
- package/dist/fleet/aggregator.js +39 -0
- package/dist/fleet/aggregator.js.map +1 -0
- package/dist/fleet/child-config.d.ts +12 -0
- package/dist/fleet/child-config.d.ts.map +1 -0
- package/dist/fleet/child-config.js +38 -0
- package/dist/fleet/child-config.js.map +1 -0
- package/dist/fleet/coordinator.d.ts +25 -0
- package/dist/fleet/coordinator.d.ts.map +1 -0
- package/dist/fleet/coordinator.js +40 -0
- package/dist/fleet/coordinator.js.map +1 -0
- package/dist/fleet/index.d.ts +40 -0
- package/dist/fleet/index.d.ts.map +1 -0
- package/dist/fleet/index.js +117 -0
- package/dist/fleet/index.js.map +1 -0
- package/dist/fleet/manifest.d.ts +51 -0
- package/dist/fleet/manifest.d.ts.map +1 -0
- package/dist/fleet/manifest.js +32 -0
- package/dist/fleet/manifest.js.map +1 -0
- package/dist/fleet/reporter.d.ts +32 -0
- package/dist/fleet/reporter.d.ts.map +1 -0
- package/dist/fleet/reporter.js +71 -0
- package/dist/fleet/reporter.js.map +1 -0
- package/dist/fleet/runner.d.ts +48 -0
- package/dist/fleet/runner.d.ts.map +1 -0
- package/dist/fleet/runner.js +104 -0
- package/dist/fleet/runner.js.map +1 -0
- package/dist/fleet/scaffolder.d.ts +12 -0
- package/dist/fleet/scaffolder.d.ts.map +1 -0
- package/dist/fleet/scaffolder.js +82 -0
- package/dist/fleet/scaffolder.js.map +1 -0
- package/dist/fleet/types.d.ts +21 -0
- package/dist/fleet/types.d.ts.map +1 -0
- package/dist/fleet/types.js +2 -0
- package/dist/fleet/types.js.map +1 -0
- package/dist/graph/artifact-store.d.ts +14 -0
- package/dist/graph/artifact-store.d.ts.map +1 -0
- package/dist/graph/artifact-store.js +100 -0
- package/dist/graph/artifact-store.js.map +1 -0
- package/dist/graph/cli.d.ts +53 -0
- package/dist/graph/cli.d.ts.map +1 -0
- package/dist/graph/cli.js +181 -0
- package/dist/graph/cli.js.map +1 -0
- package/dist/graph/client.d.ts +64 -0
- package/dist/graph/client.d.ts.map +1 -0
- package/dist/graph/client.js +216 -0
- package/dist/graph/client.js.map +1 -0
- package/dist/graph/fallback.d.ts +13 -0
- package/dist/graph/fallback.d.ts.map +1 -0
- package/dist/graph/fallback.js +57 -0
- package/dist/graph/fallback.js.map +1 -0
- package/dist/graph/hook-handler.d.ts +50 -0
- package/dist/graph/hook-handler.d.ts.map +1 -0
- package/dist/graph/hook-handler.js +217 -0
- package/dist/graph/hook-handler.js.map +1 -0
- package/dist/graph/incidents.d.ts +59 -0
- package/dist/graph/incidents.d.ts.map +1 -0
- package/dist/graph/incidents.js +22 -0
- package/dist/graph/incidents.js.map +1 -0
- package/dist/graph/mcp-client.d.ts +51 -0
- package/dist/graph/mcp-client.d.ts.map +1 -0
- package/dist/graph/mcp-client.js +285 -0
- package/dist/graph/mcp-client.js.map +1 -0
- package/dist/graph/onboarding-composer.d.ts +30 -0
- package/dist/graph/onboarding-composer.d.ts.map +1 -0
- package/dist/graph/onboarding-composer.js +275 -0
- package/dist/graph/onboarding-composer.js.map +1 -0
- package/dist/graph/pipeline-lifecycle.d.ts +95 -0
- package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
- package/dist/graph/pipeline-lifecycle.js +341 -0
- package/dist/graph/pipeline-lifecycle.js.map +1 -0
- package/dist/graph/preflight-budgets.d.ts +52 -0
- package/dist/graph/preflight-budgets.d.ts.map +1 -0
- package/dist/graph/preflight-budgets.js +78 -0
- package/dist/graph/preflight-budgets.js.map +1 -0
- package/dist/graph/preflight-injector.d.ts +130 -0
- package/dist/graph/preflight-injector.d.ts.map +1 -0
- package/dist/graph/preflight-injector.js +618 -0
- package/dist/graph/preflight-injector.js.map +1 -0
- package/dist/graph/prereq.d.ts +12 -0
- package/dist/graph/prereq.d.ts.map +1 -0
- package/dist/graph/prereq.js +61 -0
- package/dist/graph/prereq.js.map +1 -0
- package/dist/graph/prompts.d.ts +42 -0
- package/dist/graph/prompts.d.ts.map +1 -0
- package/dist/graph/prompts.js +80 -0
- package/dist/graph/prompts.js.map +1 -0
- package/dist/graph/sandbox.d.ts +19 -0
- package/dist/graph/sandbox.d.ts.map +1 -0
- package/dist/graph/sandbox.js +25 -0
- package/dist/graph/sandbox.js.map +1 -0
- package/dist/graph/token-usage.d.ts +21 -0
- package/dist/graph/token-usage.d.ts.map +1 -0
- package/dist/graph/token-usage.js +22 -0
- package/dist/graph/token-usage.js.map +1 -0
- package/dist/graph/types.d.ts +129 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +12 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/incident/orchestrator.d.ts +168 -0
- package/dist/incident/orchestrator.d.ts.map +1 -0
- package/dist/incident/orchestrator.js +279 -0
- package/dist/incident/orchestrator.js.map +1 -0
- package/dist/incident/playbook-search.d.ts +67 -0
- package/dist/incident/playbook-search.d.ts.map +1 -0
- package/dist/incident/playbook-search.js +288 -0
- package/dist/incident/playbook-search.js.map +1 -0
- package/dist/incident/postmortem.d.ts +44 -0
- package/dist/incident/postmortem.d.ts.map +1 -0
- package/dist/incident/postmortem.js +486 -0
- package/dist/incident/postmortem.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +186 -0
- package/dist/incident/resolution-verify.d.ts.map +1 -0
- package/dist/incident/resolution-verify.js +210 -0
- package/dist/incident/resolution-verify.js.map +1 -0
- package/dist/incident/rollback.d.ts +137 -0
- package/dist/incident/rollback.d.ts.map +1 -0
- package/dist/incident/rollback.js +328 -0
- package/dist/incident/rollback.js.map +1 -0
- package/dist/incident/timeline.d.ts +147 -0
- package/dist/incident/timeline.d.ts.map +1 -0
- package/dist/incident/timeline.js +452 -0
- package/dist/incident/timeline.js.map +1 -0
- package/dist/incident/types.d.ts +335 -0
- package/dist/incident/types.d.ts.map +1 -0
- package/dist/incident/types.js +158 -0
- package/dist/incident/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/event-stream.d.ts +46 -0
- package/dist/mcp/event-stream.d.ts.map +1 -0
- package/dist/mcp/event-stream.js +421 -0
- package/dist/mcp/event-stream.js.map +1 -0
- package/dist/mcp/external-client.d.ts +38 -0
- package/dist/mcp/external-client.d.ts.map +1 -0
- package/dist/mcp/external-client.js +121 -0
- package/dist/mcp/external-client.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +74 -9
- package/dist/mcp/run-manager.d.ts.map +1 -1
- package/dist/mcp/run-manager.js +127 -31
- package/dist/mcp/run-manager.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +56 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/abort-run.d.ts +2 -0
- package/dist/mcp/tools/abort-run.d.ts.map +1 -0
- package/dist/mcp/tools/abort-run.js +62 -0
- package/dist/mcp/tools/abort-run.js.map +1 -0
- package/dist/mcp/tools/anchor.js +1 -1
- package/dist/mcp/tools/anchor.js.map +1 -1
- package/dist/mcp/tools/approve-checkpoint.d.ts +2 -0
- package/dist/mcp/tools/approve-checkpoint.d.ts.map +1 -0
- package/dist/mcp/tools/approve-checkpoint.js +70 -0
- package/dist/mcp/tools/approve-checkpoint.js.map +1 -0
- package/dist/mcp/tools/brownfield.js +1 -1
- package/dist/mcp/tools/brownfield.js.map +1 -1
- package/dist/mcp/tools/get-project-state.d.ts +2 -0
- package/dist/mcp/tools/get-project-state.d.ts.map +1 -0
- package/dist/mcp/tools/get-project-state.js +107 -0
- package/dist/mcp/tools/get-project-state.js.map +1 -0
- package/dist/mcp/tools/get-run-status.d.ts +2 -0
- package/dist/mcp/tools/get-run-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-run-status.js +40 -0
- package/dist/mcp/tools/get-run-status.js.map +1 -0
- package/dist/mcp/tools/graph-schemas.d.ts +100 -0
- package/dist/mcp/tools/graph-schemas.d.ts.map +1 -0
- package/dist/mcp/tools/graph-schemas.js +39 -0
- package/dist/mcp/tools/graph-schemas.js.map +1 -0
- package/dist/mcp/tools/graph.d.ts +19 -0
- package/dist/mcp/tools/graph.d.ts.map +1 -0
- package/dist/mcp/tools/graph.js +263 -0
- package/dist/mcp/tools/graph.js.map +1 -0
- package/dist/mcp/tools/incident.d.ts +2 -0
- package/dist/mcp/tools/incident.d.ts.map +1 -0
- package/dist/mcp/tools/incident.js +246 -0
- package/dist/mcp/tools/incident.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +38 -18
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +74 -18
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init.d.ts.map +1 -1
- package/dist/mcp/tools/init.js +2 -0
- package/dist/mcp/tools/init.js.map +1 -1
- package/dist/mcp/tools/list-active-runs.d.ts +2 -0
- package/dist/mcp/tools/list-active-runs.d.ts.map +1 -0
- package/dist/mcp/tools/list-active-runs.js +35 -0
- package/dist/mcp/tools/list-active-runs.js.map +1 -0
- package/dist/mcp/tools/list-pending-approvals.d.ts +2 -0
- package/dist/mcp/tools/list-pending-approvals.d.ts.map +1 -0
- package/dist/mcp/tools/list-pending-approvals.js +40 -0
- package/dist/mcp/tools/list-pending-approvals.js.map +1 -0
- package/dist/mcp/tools/list-projects.d.ts +2 -0
- package/dist/mcp/tools/list-projects.d.ts.map +1 -0
- package/dist/mcp/tools/list-projects.js +101 -0
- package/dist/mcp/tools/list-projects.js.map +1 -0
- package/dist/mcp/tools/list-specs.d.ts +2 -0
- package/dist/mcp/tools/list-specs.d.ts.map +1 -0
- package/dist/mcp/tools/list-specs.js +48 -0
- package/dist/mcp/tools/list-specs.js.map +1 -0
- package/dist/mcp/tools/playbook.d.ts +2 -0
- package/dist/mcp/tools/playbook.d.ts.map +1 -0
- package/dist/mcp/tools/playbook.js +104 -0
- package/dist/mcp/tools/playbook.js.map +1 -0
- package/dist/mcp/tools/postmortem.d.ts +2 -0
- package/dist/mcp/tools/postmortem.d.ts.map +1 -0
- package/dist/mcp/tools/postmortem.js +75 -0
- package/dist/mcp/tools/postmortem.js.map +1 -0
- package/dist/mcp/tools/react.js +1 -1
- package/dist/mcp/tools/react.js.map +1 -1
- package/dist/mcp/tools/reject-checkpoint.d.ts +2 -0
- package/dist/mcp/tools/reject-checkpoint.d.ts.map +1 -0
- package/dist/mcp/tools/reject-checkpoint.js +79 -0
- package/dist/mcp/tools/reject-checkpoint.js.map +1 -0
- package/dist/mcp/tools/rollback.d.ts +2 -0
- package/dist/mcp/tools/rollback.d.ts.map +1 -0
- package/dist/mcp/tools/rollback.js +78 -0
- package/dist/mcp/tools/rollback.js.map +1 -0
- package/dist/mcp/tools/run-in-worktree.d.ts +2 -0
- package/dist/mcp/tools/run-in-worktree.d.ts.map +1 -0
- package/dist/mcp/tools/run-in-worktree.js +90 -0
- package/dist/mcp/tools/run-in-worktree.js.map +1 -0
- package/dist/mcp/tools/run.js +1 -1
- package/dist/mcp/tools/run.js.map +1 -1
- package/dist/mcp/tools/solidity.js +1 -1
- package/dist/mcp/tools/solidity.js.map +1 -1
- package/dist/mcp/tools/status.d.ts.map +1 -1
- package/dist/mcp/tools/status.js +11 -0
- package/dist/mcp/tools/status.js.map +1 -1
- package/dist/mcp/tools/subscribe-events.d.ts +2 -0
- package/dist/mcp/tools/subscribe-events.d.ts.map +1 -0
- package/dist/mcp/tools/subscribe-events.js +48 -0
- package/dist/mcp/tools/subscribe-events.js.map +1 -0
- package/dist/mcp/tools/unsubscribe-events.d.ts +2 -0
- package/dist/mcp/tools/unsubscribe-events.d.ts.map +1 -0
- package/dist/mcp/tools/unsubscribe-events.js +45 -0
- package/dist/mcp/tools/unsubscribe-events.js.map +1 -0
- package/dist/orchestrator/agent-loader.d.ts +16 -0
- package/dist/orchestrator/agent-loader.d.ts.map +1 -1
- package/dist/orchestrator/agent-loader.js +30 -0
- package/dist/orchestrator/agent-loader.js.map +1 -1
- package/dist/orchestrator/agentic-loop.d.ts +51 -0
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +123 -4
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/arch-lenses.d.ts +7 -0
- package/dist/orchestrator/arch-lenses.d.ts.map +1 -0
- package/dist/orchestrator/arch-lenses.js +22 -0
- package/dist/orchestrator/arch-lenses.js.map +1 -0
- package/dist/orchestrator/architect-agent.d.ts +16 -0
- package/dist/orchestrator/architect-agent.d.ts.map +1 -1
- package/dist/orchestrator/architect-agent.js +546 -9
- package/dist/orchestrator/architect-agent.js.map +1 -1
- package/dist/orchestrator/checkpoints/audit.d.ts +128 -0
- package/dist/orchestrator/checkpoints/audit.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/audit.js +272 -0
- package/dist/orchestrator/checkpoints/audit.js.map +1 -0
- package/dist/orchestrator/checkpoints/feedback-router.d.ts +213 -0
- package/dist/orchestrator/checkpoints/feedback-router.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/feedback-router.js +438 -0
- package/dist/orchestrator/checkpoints/feedback-router.js.map +1 -0
- package/dist/orchestrator/checkpoints/index.d.ts +11 -0
- package/dist/orchestrator/checkpoints/index.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/index.js +12 -0
- package/dist/orchestrator/checkpoints/index.js.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts +35 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.js +153 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.js.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts +34 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.js +139 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.js.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts +141 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.js +445 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.js.map +1 -0
- package/dist/orchestrator/checkpoints/noop.d.ts +12 -0
- package/dist/orchestrator/checkpoints/noop.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/noop.js +13 -0
- package/dist/orchestrator/checkpoints/noop.js.map +1 -0
- package/dist/orchestrator/checkpoints/registry.d.ts +48 -0
- package/dist/orchestrator/checkpoints/registry.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/registry.js +89 -0
- package/dist/orchestrator/checkpoints/registry.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/_util.d.ts +50 -0
- package/dist/orchestrator/checkpoints/renderers/_util.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/_util.js +137 -0
- package/dist/orchestrator/checkpoints/renderers/_util.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.js +66 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.js +40 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.js +54 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts +49 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.js +154 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js +59 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/plan.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/plan.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/plan.js +34 -0
- package/dist/orchestrator/checkpoints/renderers/plan.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/registry.d.ts +43 -0
- package/dist/orchestrator/checkpoints/renderers/registry.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/registry.js +83 -0
- package/dist/orchestrator/checkpoints/renderers/registry.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/research.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/research.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/research.js +39 -0
- package/dist/orchestrator/checkpoints/renderers/research.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts +20 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.js +57 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.js +38 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.js.map +1 -0
- package/dist/orchestrator/checkpoints/sites.d.ts +22 -0
- package/dist/orchestrator/checkpoints/sites.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/sites.js +57 -0
- package/dist/orchestrator/checkpoints/sites.js.map +1 -0
- package/dist/orchestrator/checkpoints/types.d.ts +51 -0
- package/dist/orchestrator/checkpoints/types.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/types.js +9 -0
- package/dist/orchestrator/checkpoints/types.js.map +1 -0
- package/dist/orchestrator/code-reviewer-agent.d.ts +50 -0
- package/dist/orchestrator/code-reviewer-agent.d.ts.map +1 -0
- package/dist/orchestrator/code-reviewer-agent.js +283 -0
- package/dist/orchestrator/code-reviewer-agent.js.map +1 -0
- package/dist/orchestrator/curator-agent.d.ts.map +1 -1
- package/dist/orchestrator/curator-agent.js +60 -9
- package/dist/orchestrator/curator-agent.js.map +1 -1
- package/dist/orchestrator/deploy/classify.d.ts +31 -0
- package/dist/orchestrator/deploy/classify.d.ts.map +1 -0
- package/dist/orchestrator/deploy/classify.js +109 -0
- package/dist/orchestrator/deploy/classify.js.map +1 -0
- package/dist/orchestrator/deploy/execute.d.ts +45 -0
- package/dist/orchestrator/deploy/execute.d.ts.map +1 -0
- package/dist/orchestrator/deploy/execute.js +146 -0
- package/dist/orchestrator/deploy/execute.js.map +1 -0
- package/dist/orchestrator/deploy/executor.d.ts +22 -0
- package/dist/orchestrator/deploy/executor.d.ts.map +1 -0
- package/dist/orchestrator/deploy/executor.js +31 -0
- package/dist/orchestrator/deploy/executor.js.map +1 -0
- package/dist/orchestrator/deploy/index.d.ts +21 -0
- package/dist/orchestrator/deploy/index.d.ts.map +1 -0
- package/dist/orchestrator/deploy/index.js +21 -0
- package/dist/orchestrator/deploy/index.js.map +1 -0
- package/dist/orchestrator/deploy/resolve.d.ts +51 -0
- package/dist/orchestrator/deploy/resolve.d.ts.map +1 -0
- package/dist/orchestrator/deploy/resolve.js +53 -0
- package/dist/orchestrator/deploy/resolve.js.map +1 -0
- package/dist/orchestrator/deploy/spawn.d.ts +60 -0
- package/dist/orchestrator/deploy/spawn.d.ts.map +1 -0
- package/dist/orchestrator/deploy/spawn.js +62 -0
- package/dist/orchestrator/deploy/spawn.js.map +1 -0
- package/dist/orchestrator/deploy/types.d.ts +98 -0
- package/dist/orchestrator/deploy/types.d.ts.map +1 -0
- package/dist/orchestrator/deploy/types.js +39 -0
- package/dist/orchestrator/deploy/types.js.map +1 -0
- package/dist/orchestrator/documenter-agent.d.ts +57 -0
- package/dist/orchestrator/documenter-agent.d.ts.map +1 -0
- package/dist/orchestrator/documenter-agent.js +195 -0
- package/dist/orchestrator/documenter-agent.js.map +1 -0
- package/dist/orchestrator/environment.d.ts +45 -0
- package/dist/orchestrator/environment.d.ts.map +1 -0
- package/dist/orchestrator/environment.js +151 -0
- package/dist/orchestrator/environment.js.map +1 -0
- package/dist/orchestrator/eval-lenses.d.ts +7 -0
- package/dist/orchestrator/eval-lenses.d.ts.map +1 -0
- package/dist/orchestrator/eval-lenses.js +19 -0
- package/dist/orchestrator/eval-lenses.js.map +1 -0
- package/dist/orchestrator/eval-persist.d.ts +25 -0
- package/dist/orchestrator/eval-persist.d.ts.map +1 -0
- package/dist/orchestrator/eval-persist.js +74 -0
- package/dist/orchestrator/eval-persist.js.map +1 -0
- package/dist/orchestrator/evaluator-agent.d.ts +23 -0
- package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
- package/dist/orchestrator/evaluator-agent.js +80 -10
- package/dist/orchestrator/evaluator-agent.js.map +1 -1
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +53 -8
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/memory/distill.d.ts +60 -0
- package/dist/orchestrator/memory/distill.d.ts.map +1 -0
- package/dist/orchestrator/memory/distill.js +177 -0
- package/dist/orchestrator/memory/distill.js.map +1 -0
- package/dist/orchestrator/memory/eval-source.d.ts +20 -0
- package/dist/orchestrator/memory/eval-source.d.ts.map +1 -0
- package/dist/orchestrator/memory/eval-source.js +88 -0
- package/dist/orchestrator/memory/eval-source.js.map +1 -0
- package/dist/orchestrator/memory/retrieve.d.ts +45 -0
- package/dist/orchestrator/memory/retrieve.d.ts.map +1 -0
- package/dist/orchestrator/memory/retrieve.js +102 -0
- package/dist/orchestrator/memory/retrieve.js.map +1 -0
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +15 -1
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/observability/index.d.ts +12 -0
- package/dist/orchestrator/observability/index.d.ts.map +1 -0
- package/dist/orchestrator/observability/index.js +12 -0
- package/dist/orchestrator/observability/index.js.map +1 -0
- package/dist/orchestrator/observability/merge.d.ts +73 -0
- package/dist/orchestrator/observability/merge.d.ts.map +1 -0
- package/dist/orchestrator/observability/merge.js +110 -0
- package/dist/orchestrator/observability/merge.js.map +1 -0
- package/dist/orchestrator/pipeline.d.ts +31 -0
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +267 -5
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts +22 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +165 -8
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/orchestrator/research-agent.d.ts.map +1 -1
- package/dist/orchestrator/research-agent.js +48 -11
- package/dist/orchestrator/research-agent.js.map +1 -1
- package/dist/orchestrator/tools/handlers.d.ts +16 -0
- package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
- package/dist/orchestrator/tools/handlers.js +30 -5
- package/dist/orchestrator/tools/handlers.js.map +1 -1
- package/dist/orchestrator/tools/index.d.ts +84 -1
- package/dist/orchestrator/tools/index.d.ts.map +1 -1
- package/dist/orchestrator/tools/index.js +164 -1
- package/dist/orchestrator/tools/index.js.map +1 -1
- package/dist/orchestrator/tools/schemas.js +5 -5
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/args-builder.d.ts +35 -0
- package/dist/orchestrator/workflow/args-builder.d.ts.map +1 -0
- package/dist/orchestrator/workflow/args-builder.js +142 -0
- package/dist/orchestrator/workflow/args-builder.js.map +1 -0
- package/dist/orchestrator/workflow/budget.d.ts +57 -0
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -0
- package/dist/orchestrator/workflow/budget.js +80 -0
- package/dist/orchestrator/workflow/budget.js.map +1 -0
- package/dist/orchestrator/workflow/conformance.d.ts +27 -0
- package/dist/orchestrator/workflow/conformance.d.ts.map +1 -0
- package/dist/orchestrator/workflow/conformance.js +111 -0
- package/dist/orchestrator/workflow/conformance.js.map +1 -0
- package/dist/orchestrator/workflow/eligibility.d.ts +8 -0
- package/dist/orchestrator/workflow/eligibility.d.ts.map +1 -0
- package/dist/orchestrator/workflow/eligibility.js +10 -0
- package/dist/orchestrator/workflow/eligibility.js.map +1 -0
- package/dist/orchestrator/workflow/engine.d.ts +10 -0
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -0
- package/dist/orchestrator/workflow/engine.js +2 -0
- package/dist/orchestrator/workflow/engine.js.map +1 -0
- package/dist/orchestrator/workflow/errors.d.ts +13 -0
- package/dist/orchestrator/workflow/errors.d.ts.map +1 -0
- package/dist/orchestrator/workflow/errors.js +26 -0
- package/dist/orchestrator/workflow/errors.js.map +1 -0
- package/dist/orchestrator/workflow/flusher.d.ts +19 -0
- package/dist/orchestrator/workflow/flusher.d.ts.map +1 -0
- package/dist/orchestrator/workflow/flusher.js +81 -0
- package/dist/orchestrator/workflow/flusher.js.map +1 -0
- package/dist/orchestrator/workflow/interpreter.d.ts +48 -0
- package/dist/orchestrator/workflow/interpreter.d.ts.map +1 -0
- package/dist/orchestrator/workflow/interpreter.js +92 -0
- package/dist/orchestrator/workflow/interpreter.js.map +1 -0
- package/dist/orchestrator/workflow/pure-sprint.d.ts +65 -0
- package/dist/orchestrator/workflow/pure-sprint.d.ts.map +1 -0
- package/dist/orchestrator/workflow/pure-sprint.js +82 -0
- package/dist/orchestrator/workflow/pure-sprint.js.map +1 -0
- package/dist/orchestrator/workflow/reconciler.d.ts +15 -0
- package/dist/orchestrator/workflow/reconciler.d.ts.map +1 -0
- package/dist/orchestrator/workflow/reconciler.js +65 -0
- package/dist/orchestrator/workflow/reconciler.js.map +1 -0
- package/dist/orchestrator/workflow/resume-cursor.d.ts +10 -0
- package/dist/orchestrator/workflow/resume-cursor.d.ts.map +1 -0
- package/dist/orchestrator/workflow/resume-cursor.js +25 -0
- package/dist/orchestrator/workflow/resume-cursor.js.map +1 -0
- package/dist/orchestrator/workflow/retry.d.ts +50 -0
- package/dist/orchestrator/workflow/retry.d.ts.map +1 -0
- package/dist/orchestrator/workflow/retry.js +100 -0
- package/dist/orchestrator/workflow/retry.js.map +1 -0
- package/dist/orchestrator/workflow/scheduler.d.ts +87 -0
- package/dist/orchestrator/workflow/scheduler.d.ts.map +1 -0
- package/dist/orchestrator/workflow/scheduler.js +158 -0
- package/dist/orchestrator/workflow/scheduler.js.map +1 -0
- package/dist/orchestrator/workflow/selector.d.ts +26 -0
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -0
- package/dist/orchestrator/workflow/selector.js +54 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -0
- package/dist/orchestrator/workflow/synthesizer.d.ts +52 -0
- package/dist/orchestrator/workflow/synthesizer.d.ts.map +1 -0
- package/dist/orchestrator/workflow/synthesizer.js +75 -0
- package/dist/orchestrator/workflow/synthesizer.js.map +1 -0
- package/dist/orchestrator/workflow/ts-engine.d.ts +13 -0
- package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -0
- package/dist/orchestrator/workflow/ts-engine.js +14 -0
- package/dist/orchestrator/workflow/ts-engine.js.map +1 -0
- package/dist/orchestrator/workflow/types.d.ts +55 -0
- package/dist/orchestrator/workflow/types.d.ts.map +1 -0
- package/dist/orchestrator/workflow/types.js +3 -0
- package/dist/orchestrator/workflow/types.js.map +1 -0
- package/dist/orchestrator/workflow/workflow-engine.d.ts +31 -0
- package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -0
- package/dist/orchestrator/workflow/workflow-engine.js +70 -0
- package/dist/orchestrator/workflow/workflow-engine.js.map +1 -0
- package/dist/orchestrator/worktree.d.ts +18 -0
- package/dist/orchestrator/worktree.d.ts.map +1 -0
- package/dist/orchestrator/worktree.js +129 -0
- package/dist/orchestrator/worktree.js.map +1 -0
- package/dist/providers/anthropic.d.ts +8 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +135 -11
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts +44 -0
- package/dist/providers/claude-code.d.ts.map +1 -0
- package/dist/providers/claude-code.js +143 -0
- package/dist/providers/claude-code.js.map +1 -0
- package/dist/providers/factory.d.ts +16 -2
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +101 -14
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +32 -3
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.d.ts +4 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +28 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/preflight.d.ts +22 -0
- package/dist/providers/preflight.d.ts.map +1 -0
- package/dist/providers/preflight.js +54 -0
- package/dist/providers/preflight.js.map +1 -0
- package/dist/providers/structured.d.ts +130 -0
- package/dist/providers/structured.d.ts.map +1 -0
- package/dist/providers/structured.js +205 -0
- package/dist/providers/structured.js.map +1 -0
- package/dist/providers/types.d.ts +53 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/state/approval-state.d.ts +74 -0
- package/dist/state/approval-state.d.ts.map +1 -0
- package/dist/state/approval-state.js +127 -0
- package/dist/state/approval-state.js.map +1 -0
- package/dist/state/history-rotation.d.ts +17 -0
- package/dist/state/history-rotation.d.ts.map +1 -0
- package/dist/state/history-rotation.js +84 -0
- package/dist/state/history-rotation.js.map +1 -0
- package/dist/state/history.d.ts +16 -4
- package/dist/state/history.d.ts.map +1 -1
- package/dist/state/history.js +62 -20
- package/dist/state/history.js.map +1 -1
- package/dist/state/index.d.ts +4 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +5 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/memory.d.ts +60 -0
- package/dist/state/memory.d.ts.map +1 -0
- package/dist/state/memory.js +242 -0
- package/dist/state/memory.js.map +1 -0
- package/dist/state/review-state.d.ts +15 -0
- package/dist/state/review-state.d.ts.map +1 -0
- package/dist/state/review-state.js +51 -0
- package/dist/state/review-state.js.map +1 -0
- package/dist/state/run-state.d.ts +39 -0
- package/dist/state/run-state.d.ts.map +1 -0
- package/dist/state/run-state.js +101 -0
- package/dist/state/run-state.js.map +1 -0
- package/dist/telemetry/emit.d.ts +41 -0
- package/dist/telemetry/emit.d.ts.map +1 -0
- package/dist/telemetry/emit.js +65 -0
- package/dist/telemetry/emit.js.map +1 -0
- package/dist/utils/git.d.ts +27 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +50 -0
- package/dist/utils/git.js.map +1 -1
- package/hooks/hooks.json +27 -1
- package/hooks/session-start +42 -0
- package/package.json +13 -6
- package/scripts/check-prereqs.sh +12 -0
- package/scripts/e2e-graph-smoke.sh +167 -0
- package/scripts/graph-hook.mjs +151 -0
- package/scripts/run-kpi-gate.mjs +245 -0
- package/scripts/spike-claude-code-provider.mjs +66 -0
- package/scripts/spike-deepseek.mjs +63 -0
- package/scripts/sync-skills.mjs +4 -1
- package/scripts/sync-targets.json +12 -0
- package/scripts/update-all.mjs +255 -0
- package/skills/bober.architect/SKILL.md +13 -0
- package/skills/bober.architect/references/arch-lens-panel.md +126 -0
- package/skills/bober.code-review/SKILL.md +186 -0
- package/skills/bober.debug/SKILL.md +300 -0
- package/skills/bober.deploy/SKILL.md +262 -0
- package/skills/bober.diagnose/SKILL.md +254 -0
- package/skills/bober.eval/SKILL.md +9 -0
- package/skills/bober.eval/references/lens-panel.md +115 -0
- package/skills/bober.graph/SKILL.md +85 -0
- package/skills/bober.impact/SKILL.md +101 -0
- package/skills/bober.incident/SKILL.md +245 -0
- package/skills/bober.onboard/SKILL.md +84 -0
- package/skills/bober.plan/SKILL.md +16 -0
- package/skills/bober.postmortem/SKILL.md +231 -0
- package/skills/bober.run/SKILL.md +23 -4
- package/skills/bober.run/references/lens-panel.md +115 -0
- package/skills/bober.runbook/SKILL.md +335 -0
- package/skills/bober.sprint/SKILL.md +44 -2
- package/skills/bober.sprint/references/lens-panel.md +115 -0
- package/skills/bober.using-bober/SKILL.md +133 -0
- package/skills/bober.verify/SKILL.md +143 -0
- package/skills/shared/arch-lens-panel.md +126 -0
- package/skills/shared/lens-panel.md +115 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphPipelineLifecycle — singleton that owns the tokensave serve subprocess
|
|
3
|
+
* for the duration of a single `agent-bober run` pipeline invocation.
|
|
4
|
+
*
|
|
5
|
+
* Module-level export guarantees one instance per Node process (ESM singleton).
|
|
6
|
+
* Importers receive the same object regardless of how many times they import.
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities:
|
|
9
|
+
* - Read bober.config.json graph section.
|
|
10
|
+
* - Run prereq check before spawning.
|
|
11
|
+
* - Orphan cleanup via PID file (`.bober/graph/.serve.pid`).
|
|
12
|
+
* - SIGTERM/SIGINT handlers for graceful shutdown.
|
|
13
|
+
* - Idempotent start() and stop().
|
|
14
|
+
*/
|
|
15
|
+
import { rm } from "node:fs/promises";
|
|
16
|
+
import { resolve } from "node:path";
|
|
17
|
+
import { fileExists, readJson, writeJson } from "../utils/fs.js";
|
|
18
|
+
import { logger } from "../utils/logger.js";
|
|
19
|
+
import { TokensavePrereqCheck } from "./prereq.js";
|
|
20
|
+
import { GraphArtifactStore } from "./artifact-store.js";
|
|
21
|
+
import { TokensaveMcpClient } from "./mcp-client.js";
|
|
22
|
+
import { IncidentLog } from "./incidents.js";
|
|
23
|
+
import { GraphClient } from "./client.js";
|
|
24
|
+
import { GraphFallback } from "./fallback.js";
|
|
25
|
+
import { GraphHookHandler } from "./hook-handler.js";
|
|
26
|
+
import { TokensaveCli } from "./cli.js";
|
|
27
|
+
// ── Implementation ─────────────────────────────────────────────────
|
|
28
|
+
class GraphPipelineLifecycleImpl {
|
|
29
|
+
started = false;
|
|
30
|
+
stopping = false;
|
|
31
|
+
healthOverride = null;
|
|
32
|
+
mcpClient = null;
|
|
33
|
+
store = null;
|
|
34
|
+
incidents = null;
|
|
35
|
+
hookHandler = null;
|
|
36
|
+
projectRoot = null;
|
|
37
|
+
pidPath = null;
|
|
38
|
+
sigHandler = null;
|
|
39
|
+
// ── start ────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Start the lifecycle.
|
|
42
|
+
*
|
|
43
|
+
* - When graph.enabled is false (or graph section is absent): no-op; health = 'disabled'.
|
|
44
|
+
* - Otherwise: prereq check → orphan cleanup → spawn serve → write PID file → register signals.
|
|
45
|
+
* - Idempotent: calling start() twice is safe (second call is a no-op).
|
|
46
|
+
*/
|
|
47
|
+
async start(projectRoot, config) {
|
|
48
|
+
if (this.started)
|
|
49
|
+
return;
|
|
50
|
+
this.started = true;
|
|
51
|
+
const cfg = config.graph;
|
|
52
|
+
if (!cfg || cfg.enabled === false) {
|
|
53
|
+
this.healthOverride = "disabled";
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.projectRoot = projectRoot;
|
|
57
|
+
this.pidPath = resolve(projectRoot, ".bober/graph/.serve.pid");
|
|
58
|
+
this.incidents = new IncidentLog(projectRoot);
|
|
59
|
+
// Prereq check — fail fast on missing/incompatible binary
|
|
60
|
+
const prereq = await new TokensavePrereqCheck(cfg.tokensavePath ?? "tokensave").check();
|
|
61
|
+
if (!prereq.ok) {
|
|
62
|
+
throw new Error(`Graph prereq failed: ${prereq.reason} — ${prereq.hint}`);
|
|
63
|
+
}
|
|
64
|
+
// Create .bober/graph/ directory
|
|
65
|
+
this.store = new GraphArtifactStore(projectRoot);
|
|
66
|
+
await this.store.ensureLayout();
|
|
67
|
+
// Orphan cleanup
|
|
68
|
+
await this.handleOrphan();
|
|
69
|
+
// Spawn
|
|
70
|
+
this.mcpClient = new TokensaveMcpClient(projectRoot, cfg, this.incidents, cfg.tokensavePath ?? "tokensave");
|
|
71
|
+
await this.mcpClient.start();
|
|
72
|
+
// Instantiate and start hook handler (debounce + queue + IPC poll).
|
|
73
|
+
const cli = new TokensaveCli(projectRoot, this.store, cfg.tokensavePath ?? "tokensave");
|
|
74
|
+
this.hookHandler = new GraphHookHandler(cli, this.store, this.incidents, cfg, projectRoot);
|
|
75
|
+
this.hookHandler.start();
|
|
76
|
+
// Write PID file
|
|
77
|
+
await this.writePidFile();
|
|
78
|
+
// Register SIGTERM / SIGINT handlers
|
|
79
|
+
this.registerSignalHandlers();
|
|
80
|
+
const pid = this.mcpClient.childPid;
|
|
81
|
+
if (pid !== null) {
|
|
82
|
+
try {
|
|
83
|
+
await this.incidents.append({
|
|
84
|
+
ts: new Date().toISOString(),
|
|
85
|
+
event: "start",
|
|
86
|
+
pid,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Incident write failure must not break startup
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
logger.info(`[graph] Pipeline lifecycle started (pid=${String(pid)})`);
|
|
94
|
+
}
|
|
95
|
+
// ── stop ─────────────────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* Gracefully stop the lifecycle.
|
|
98
|
+
* SIGTERM → wait 2000ms (inside mcpClient.stop()) → SIGKILL fallback.
|
|
99
|
+
* Idempotent.
|
|
100
|
+
*/
|
|
101
|
+
async stop() {
|
|
102
|
+
if (this.stopping)
|
|
103
|
+
return;
|
|
104
|
+
this.stopping = true;
|
|
105
|
+
// Drain hook queue BEFORE killing the engine; otherwise cli.sync() will fail.
|
|
106
|
+
if (this.hookHandler) {
|
|
107
|
+
try {
|
|
108
|
+
await this.hookHandler.flush();
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// flush() errors must not propagate from signal handlers
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (this.mcpClient) {
|
|
115
|
+
const pid = this.mcpClient.childPid;
|
|
116
|
+
try {
|
|
117
|
+
await this.mcpClient.stop();
|
|
118
|
+
if (pid !== null && this.incidents) {
|
|
119
|
+
await this.incidents.append({
|
|
120
|
+
ts: new Date().toISOString(),
|
|
121
|
+
event: "stop",
|
|
122
|
+
pid,
|
|
123
|
+
reason: "normal",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// stop() errors must not propagate from signal handlers
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await this.removePidFile();
|
|
132
|
+
this.unregisterSignalHandlers();
|
|
133
|
+
logger.info("[graph] Pipeline lifecycle stopped");
|
|
134
|
+
}
|
|
135
|
+
// ── engineHealth ──────────────────────────────────────────────────
|
|
136
|
+
engineHealth() {
|
|
137
|
+
if (this.healthOverride === "disabled")
|
|
138
|
+
return "disabled";
|
|
139
|
+
if (!this.mcpClient)
|
|
140
|
+
return "starting";
|
|
141
|
+
return this.mcpClient.health();
|
|
142
|
+
}
|
|
143
|
+
// ── projectRootOrNull ─────────────────────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* Project root of the active pipeline, or null when not started.
|
|
146
|
+
*
|
|
147
|
+
* Used by PreflightContextInjector to resolve a telemetry sink when the
|
|
148
|
+
* injector was constructed without an explicit projectRoot (the common case
|
|
149
|
+
* at most agent call sites). Lets graph-preflight telemetry fire for every
|
|
150
|
+
* role with zero changes to the call sites.
|
|
151
|
+
*/
|
|
152
|
+
projectRootOrNull() {
|
|
153
|
+
return this.projectRoot;
|
|
154
|
+
}
|
|
155
|
+
// ── getGraphClient ────────────────────────────────────────────────
|
|
156
|
+
/**
|
|
157
|
+
* Lazy accessor for the GraphClient instance.
|
|
158
|
+
* Returns null if the engine is not 'ready'.
|
|
159
|
+
* Caches the constructed client on first call.
|
|
160
|
+
*/
|
|
161
|
+
_graphClient = null;
|
|
162
|
+
getGraphClient() {
|
|
163
|
+
if (this.engineHealth() !== "ready")
|
|
164
|
+
return null;
|
|
165
|
+
if (!this.mcpClient || !this.store || !this.incidents || !this.projectRoot) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
if (!this._graphClient) {
|
|
169
|
+
const fallback = new GraphFallback("dual");
|
|
170
|
+
this._graphClient = new GraphClient(this.projectRoot, this.mcpClient, this.store, fallback, this.incidents,
|
|
171
|
+
// GraphClient constructor takes config as GraphSection — use minimal stub
|
|
172
|
+
// that satisfies the type (lifecycle already validated config at start())
|
|
173
|
+
{
|
|
174
|
+
enabled: true,
|
|
175
|
+
autoSync: true,
|
|
176
|
+
languageTier: "core",
|
|
177
|
+
manifestPath: ".bober/graph/manifest.json",
|
|
178
|
+
syncTimeoutMs: 2000,
|
|
179
|
+
queryTimeoutMs: 5000,
|
|
180
|
+
debounceMs: 750,
|
|
181
|
+
hookQueueMax: 50,
|
|
182
|
+
maxEngineRssMb: 512,
|
|
183
|
+
exposeOnExternalMcp: true,
|
|
184
|
+
preflightBudgets: {
|
|
185
|
+
architect: 4000,
|
|
186
|
+
curator: 2000,
|
|
187
|
+
generator: 1000,
|
|
188
|
+
evaluator: 1500,
|
|
189
|
+
researcherPhase2: 3000,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return this._graphClient;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Returns {client, fallback} when engine is 'ready', null otherwise.
|
|
197
|
+
* Used by resolveRoleTools to construct gated tool sets.
|
|
198
|
+
*/
|
|
199
|
+
getGraphDeps() {
|
|
200
|
+
const client = this.getGraphClient();
|
|
201
|
+
if (!client)
|
|
202
|
+
return null;
|
|
203
|
+
// Construct a matching fallback (dual mode — same as used in getGraphClient)
|
|
204
|
+
const fallback = new GraphFallback("dual");
|
|
205
|
+
return { client, fallback };
|
|
206
|
+
}
|
|
207
|
+
// ── For testing only ──────────────────────────────────────────────
|
|
208
|
+
/**
|
|
209
|
+
* Reset internal state so tests can call start() again on the same instance.
|
|
210
|
+
* NOT intended for production use.
|
|
211
|
+
*/
|
|
212
|
+
_reset() {
|
|
213
|
+
this.started = false;
|
|
214
|
+
this.stopping = false;
|
|
215
|
+
this.healthOverride = null;
|
|
216
|
+
this.mcpClient = null;
|
|
217
|
+
this.store = null;
|
|
218
|
+
this.incidents = null;
|
|
219
|
+
this.hookHandler = null;
|
|
220
|
+
this.projectRoot = null;
|
|
221
|
+
this.pidPath = null;
|
|
222
|
+
this._graphClient = null;
|
|
223
|
+
this.unregisterSignalHandlers();
|
|
224
|
+
this.sigHandler = null;
|
|
225
|
+
}
|
|
226
|
+
// ── Private helpers ───────────────────────────────────────────────
|
|
227
|
+
async handleOrphan() {
|
|
228
|
+
if (!this.pidPath)
|
|
229
|
+
return;
|
|
230
|
+
if (!(await fileExists(this.pidPath)))
|
|
231
|
+
return;
|
|
232
|
+
let existing;
|
|
233
|
+
try {
|
|
234
|
+
existing = await readJson(this.pidPath);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Malformed PID file — remove and continue
|
|
238
|
+
await rm(this.pidPath, { force: true });
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (!existing || typeof existing.pid !== "number") {
|
|
242
|
+
await rm(this.pidPath, { force: true });
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const orphanPid = existing.pid;
|
|
246
|
+
try {
|
|
247
|
+
// probe: throws ESRCH if dead, throws EPERM if dead-but-not-owned
|
|
248
|
+
process.kill(orphanPid, 0);
|
|
249
|
+
// Still alive → kill it
|
|
250
|
+
logger.warn(`[graph] Killing orphan tokensave serve (pid=${orphanPid})`);
|
|
251
|
+
try {
|
|
252
|
+
process.kill(orphanPid, "SIGTERM");
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Already gone
|
|
256
|
+
}
|
|
257
|
+
await delay(500);
|
|
258
|
+
try {
|
|
259
|
+
process.kill(orphanPid, "SIGKILL");
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Already gone
|
|
263
|
+
}
|
|
264
|
+
if (this.incidents) {
|
|
265
|
+
try {
|
|
266
|
+
await this.incidents.append({
|
|
267
|
+
ts: new Date().toISOString(),
|
|
268
|
+
event: "orphan-killed",
|
|
269
|
+
pid: orphanPid,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Best-effort
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Dead or not accessible — safe to overwrite
|
|
279
|
+
}
|
|
280
|
+
await rm(this.pidPath, { force: true });
|
|
281
|
+
}
|
|
282
|
+
async writePidFile() {
|
|
283
|
+
if (!this.pidPath || !this.mcpClient)
|
|
284
|
+
return;
|
|
285
|
+
const pid = this.mcpClient.childPid;
|
|
286
|
+
if (pid === null)
|
|
287
|
+
return;
|
|
288
|
+
const data = {
|
|
289
|
+
pid,
|
|
290
|
+
startedAt: new Date().toISOString(),
|
|
291
|
+
projectRoot: this.projectRoot ?? "",
|
|
292
|
+
};
|
|
293
|
+
await writeJson(this.pidPath, data);
|
|
294
|
+
}
|
|
295
|
+
async removePidFile() {
|
|
296
|
+
if (!this.pidPath)
|
|
297
|
+
return;
|
|
298
|
+
try {
|
|
299
|
+
await rm(this.pidPath, { force: true });
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// Best-effort
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
registerSignalHandlers() {
|
|
306
|
+
this.sigHandler = () => {
|
|
307
|
+
this.stop().catch(() => {
|
|
308
|
+
// Signal handlers must not throw
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
process.on("SIGTERM", this.sigHandler);
|
|
312
|
+
process.on("SIGINT", this.sigHandler);
|
|
313
|
+
}
|
|
314
|
+
unregisterSignalHandlers() {
|
|
315
|
+
if (this.sigHandler) {
|
|
316
|
+
process.removeListener("SIGTERM", this.sigHandler);
|
|
317
|
+
process.removeListener("SIGINT", this.sigHandler);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// ── Module-level singleton ─────────────────────────────────────────
|
|
322
|
+
/**
|
|
323
|
+
* The one and only GraphPipelineLifecycle instance per Node process.
|
|
324
|
+
*
|
|
325
|
+
* ESM module caching guarantees this is the same object for all importers
|
|
326
|
+
* in the same realm — even if imported from multiple modules simultaneously.
|
|
327
|
+
*
|
|
328
|
+
* Usage:
|
|
329
|
+
* import { graphPipelineLifecycle } from './pipeline-lifecycle.js';
|
|
330
|
+
* await graphPipelineLifecycle.start(projectRoot, config);
|
|
331
|
+
* // ... pipeline runs ...
|
|
332
|
+
* await graphPipelineLifecycle.stop();
|
|
333
|
+
*/
|
|
334
|
+
export const graphPipelineLifecycle = new GraphPipelineLifecycleImpl();
|
|
335
|
+
// Re-export the class for testing purposes (tests can call _reset())
|
|
336
|
+
export { GraphPipelineLifecycleImpl };
|
|
337
|
+
// ── Utilities ──────────────────────────────────────────────────────
|
|
338
|
+
function delay(ms) {
|
|
339
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=pipeline-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-lifecycle.js","sourceRoot":"","sources":["../../src/graph/pipeline-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-flight graph context injection — token budget constants and enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Token counting uses Math.ceil(text.length / 4) as a conservative estimate.
|
|
5
|
+
* Anthropic models average ~3.5–4.0 chars/token for English markdown.
|
|
6
|
+
* Over-estimation is intentional — the cap is firm.
|
|
7
|
+
*
|
|
8
|
+
* TODO(phase-2): swap estimateTokens() to tiktoken when the dep is approved.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Default token budgets for pre-flight graph context injection (ADR-9).
|
|
12
|
+
* These match the defaults in GraphPreflightBudgetsSchema in schema.ts.
|
|
13
|
+
* Runtime code reads budgets from config.graph.preflightBudgets; these
|
|
14
|
+
* constants exist for reference and testing.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_PREFLIGHT_BUDGETS: {
|
|
17
|
+
readonly architect: 4000;
|
|
18
|
+
readonly curator: 2000;
|
|
19
|
+
readonly generator: 1000;
|
|
20
|
+
readonly evaluator: 1500;
|
|
21
|
+
readonly "researcher-phase2": 3000;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Estimate token count for a string.
|
|
25
|
+
*
|
|
26
|
+
* Uses a conservative chars/4 heuristic. Anthropic models average ~3.5–4.0
|
|
27
|
+
* chars per token for English markdown. Over-estimation is intentional: the
|
|
28
|
+
* pre-flight budget cap is hard, so rounding up prevents silent overruns.
|
|
29
|
+
*
|
|
30
|
+
* TODO(phase-2): replace chars/4 with tiktoken when available.
|
|
31
|
+
*/
|
|
32
|
+
export declare function estimateTokens(text: string): number;
|
|
33
|
+
/**
|
|
34
|
+
* Enforce a token budget on a markdown string composed of `### Section` blocks.
|
|
35
|
+
*
|
|
36
|
+
* Algorithm:
|
|
37
|
+
* 1. If under budget, return unchanged.
|
|
38
|
+
* 2. Split on `\n### ` boundaries (whole-section granularity).
|
|
39
|
+
* 3. Drop sections from the END until under budget.
|
|
40
|
+
* 4. Append `[truncated due to budget — N more results omitted]` marker.
|
|
41
|
+
* 5. Hard-cap fallback: if even header + first section exceeds budget,
|
|
42
|
+
* truncate by character count.
|
|
43
|
+
*
|
|
44
|
+
* @param markdown Full formatted markdown string.
|
|
45
|
+
* @param budget Token budget (positive integer).
|
|
46
|
+
* @returns Object with the capped output string and the number of sections dropped.
|
|
47
|
+
*/
|
|
48
|
+
export declare function enforceBudget(markdown: string, budget: number): {
|
|
49
|
+
out: string;
|
|
50
|
+
dropped: number;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=preflight-budgets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-budgets.d.ts","sourceRoot":"","sources":["../../src/graph/preflight-budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;CAMK,CAAC;AAI5C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8BlC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-flight graph context injection — token budget constants and enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Token counting uses Math.ceil(text.length / 4) as a conservative estimate.
|
|
5
|
+
* Anthropic models average ~3.5–4.0 chars/token for English markdown.
|
|
6
|
+
* Over-estimation is intentional — the cap is firm.
|
|
7
|
+
*
|
|
8
|
+
* TODO(phase-2): swap estimateTokens() to tiktoken when the dep is approved.
|
|
9
|
+
*/
|
|
10
|
+
// ── Per-role budget constants ──────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Default token budgets for pre-flight graph context injection (ADR-9).
|
|
13
|
+
* These match the defaults in GraphPreflightBudgetsSchema in schema.ts.
|
|
14
|
+
* Runtime code reads budgets from config.graph.preflightBudgets; these
|
|
15
|
+
* constants exist for reference and testing.
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_PREFLIGHT_BUDGETS = {
|
|
18
|
+
architect: 4000,
|
|
19
|
+
curator: 2000,
|
|
20
|
+
generator: 1000,
|
|
21
|
+
evaluator: 1500,
|
|
22
|
+
"researcher-phase2": 3000,
|
|
23
|
+
};
|
|
24
|
+
// ── Token estimator ────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Estimate token count for a string.
|
|
27
|
+
*
|
|
28
|
+
* Uses a conservative chars/4 heuristic. Anthropic models average ~3.5–4.0
|
|
29
|
+
* chars per token for English markdown. Over-estimation is intentional: the
|
|
30
|
+
* pre-flight budget cap is hard, so rounding up prevents silent overruns.
|
|
31
|
+
*
|
|
32
|
+
* TODO(phase-2): replace chars/4 with tiktoken when available.
|
|
33
|
+
*/
|
|
34
|
+
export function estimateTokens(text) {
|
|
35
|
+
return Math.ceil(text.length / 4);
|
|
36
|
+
}
|
|
37
|
+
// ── Budget enforcement ─────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Enforce a token budget on a markdown string composed of `### Section` blocks.
|
|
40
|
+
*
|
|
41
|
+
* Algorithm:
|
|
42
|
+
* 1. If under budget, return unchanged.
|
|
43
|
+
* 2. Split on `\n### ` boundaries (whole-section granularity).
|
|
44
|
+
* 3. Drop sections from the END until under budget.
|
|
45
|
+
* 4. Append `[truncated due to budget — N more results omitted]` marker.
|
|
46
|
+
* 5. Hard-cap fallback: if even header + first section exceeds budget,
|
|
47
|
+
* truncate by character count.
|
|
48
|
+
*
|
|
49
|
+
* @param markdown Full formatted markdown string.
|
|
50
|
+
* @param budget Token budget (positive integer).
|
|
51
|
+
* @returns Object with the capped output string and the number of sections dropped.
|
|
52
|
+
*/
|
|
53
|
+
export function enforceBudget(markdown, budget) {
|
|
54
|
+
if (budget <= 0) {
|
|
55
|
+
return { out: "[truncated due to budget — budget=0]", dropped: 0 };
|
|
56
|
+
}
|
|
57
|
+
if (estimateTokens(markdown) <= budget) {
|
|
58
|
+
return { out: markdown, dropped: 0 };
|
|
59
|
+
}
|
|
60
|
+
// Split preserving the delimiter so each part starts with "### " except the first.
|
|
61
|
+
const parts = markdown.split(/(?=^### )/m);
|
|
62
|
+
let dropped = 0;
|
|
63
|
+
while (parts.length > 1 && estimateTokens(parts.join("")) > budget) {
|
|
64
|
+
parts.pop();
|
|
65
|
+
dropped++;
|
|
66
|
+
}
|
|
67
|
+
let out = parts.join("");
|
|
68
|
+
if (dropped > 0) {
|
|
69
|
+
out += `\n\n[truncated due to budget — ${dropped} more result${dropped === 1 ? "" : "s"} omitted]\n`;
|
|
70
|
+
}
|
|
71
|
+
// Hard cap fallback: if even header + first section exceeds budget, truncate by chars.
|
|
72
|
+
if (estimateTokens(out) > budget) {
|
|
73
|
+
const maxChars = budget * 4;
|
|
74
|
+
out = out.slice(0, maxChars) + "\n\n[truncated due to budget — hard cap]\n";
|
|
75
|
+
}
|
|
76
|
+
return { out, dropped };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=preflight-budgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-budgets.js","sourceRoot":"","sources":["../../src/graph/preflight-budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sEAAsE;AAEtE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,mBAAmB,EAAE,IAAI;CACgB,CAAC;AAE5C,sEAAsE;AAEtE;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,sEAAsE;AAEtE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,MAAc;IAEd,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG,EAAE,sCAAsC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;QACvC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACvC,CAAC;IAED,mFAAmF;IACnF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;QACnE,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEzB,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,GAAG,IAAI,kCAAkC,OAAO,eAAe,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;IACvG,CAAC;IAED,uFAAuF;IACvF,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;QAC5B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,4CAA4C,CAAC;IAC9E,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PreflightContextInjector — ADR-9 Primary KPI Lever.
|
|
3
|
+
*
|
|
4
|
+
* Runs deterministic per-role graph queries before each agent spawn.
|
|
5
|
+
* Formats results as markdown and prepends to the agent's first message.
|
|
6
|
+
*
|
|
7
|
+
* Key invariants:
|
|
8
|
+
* - DETERMINISTIC: same contract + role → same output. No LLM in this path.
|
|
9
|
+
* - NEVER BLOCKS SPAWN: 5s timeout + try/catch; returns firstMessage unchanged on failure.
|
|
10
|
+
* - RESEARCHER-PHASE2 ISOLATION: NEVER uses contract.title/description/feature text.
|
|
11
|
+
* Uses ONLY overrides.questionKeywords.
|
|
12
|
+
* - graph.enabled=false or engineHealth!='ready' → returns firstMessage unchanged.
|
|
13
|
+
*/
|
|
14
|
+
import type { GraphClient } from "./client.js";
|
|
15
|
+
import type { GraphSection } from "./types.js";
|
|
16
|
+
import type { SprintContract } from "../contracts/sprint-contract.js";
|
|
17
|
+
import type { IncidentLog } from "./incidents.js";
|
|
18
|
+
import type { PrefetchSpec } from "./types.js";
|
|
19
|
+
import type { GraphArtifactStore } from "./artifact-store.js";
|
|
20
|
+
export type BoberAgentRole = "planner" | "researcher-phase1" | "researcher-phase2" | "architect" | "curator" | "generator" | "evaluator";
|
|
21
|
+
/** Derived input for QUERY_BATCHES — computed from contract defensively. */
|
|
22
|
+
interface PreflightInput {
|
|
23
|
+
symbols: string[];
|
|
24
|
+
keywords: string[];
|
|
25
|
+
questionKeywords: string[];
|
|
26
|
+
baselineSha: string;
|
|
27
|
+
}
|
|
28
|
+
/** Optional overrides for inject() callers (e.g. pipeline.ts Phase 2 call site). */
|
|
29
|
+
export interface InjectOverrides {
|
|
30
|
+
questionKeywords?: string[];
|
|
31
|
+
baselineSha?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Per-role deterministic query batch factory functions.
|
|
35
|
+
*
|
|
36
|
+
* Each function receives a PreflightInput and returns a PrefetchSpec[].
|
|
37
|
+
* The batch is deterministic: same input → same specs → same output.
|
|
38
|
+
*
|
|
39
|
+
* CRITICAL: 'researcher-phase2' uses ONLY input.questionKeywords.
|
|
40
|
+
* It MUST NOT access contract.title, contract.description, or contract.feature.
|
|
41
|
+
* The PreflightInput for this role is built exclusively from overrides.questionKeywords.
|
|
42
|
+
*/
|
|
43
|
+
export declare const QUERY_BATCHES: Record<BoberAgentRole, (c: PreflightInput) => PrefetchSpec[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Derive PreflightInput fields from a SprintContract.
|
|
46
|
+
*
|
|
47
|
+
* SprintContract does NOT have symbols/keywords/questionKeywords/baselineSha fields.
|
|
48
|
+
* This function derives them defensively:
|
|
49
|
+
*
|
|
50
|
+
* - symbols: file basenames from estimatedFiles, stripped of extensions.
|
|
51
|
+
* These are the files the sprint will touch — a good proxy for affected symbols.
|
|
52
|
+
* - keywords: unique tokens (length >= 4) from title + description, top 8.
|
|
53
|
+
* Used by Curator search to find relevant code.
|
|
54
|
+
* - questionKeywords: ALWAYS empty here. Populated only via overrides.questionKeywords
|
|
55
|
+
* (for researcher-phase2 call sites that pass Phase 1 question tokens).
|
|
56
|
+
* - baselineSha: defaults to "HEAD~1"; can be overridden via overrides.baselineSha.
|
|
57
|
+
*/
|
|
58
|
+
export declare function deriveFromContract(contract: SprintContract | null): PreflightInput;
|
|
59
|
+
/**
|
|
60
|
+
* Builds and injects deterministic graph context into agent first messages.
|
|
61
|
+
*
|
|
62
|
+
* Constructor takes a GraphClient (may be null if engine not ready) and a
|
|
63
|
+
* GraphSection config. inject() is the only public method.
|
|
64
|
+
*
|
|
65
|
+
* Usage in agent files:
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const injector = new PreflightContextInjector(graphPipelineLifecycle.getGraphClient(), config.graph);
|
|
68
|
+
* const msg = await injector.inject("curator", contract, userMessage);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare class PreflightContextInjector {
|
|
72
|
+
private readonly client;
|
|
73
|
+
private readonly config;
|
|
74
|
+
private readonly incidents?;
|
|
75
|
+
private readonly projectRoot?;
|
|
76
|
+
private readonly artifactStore?;
|
|
77
|
+
constructor(client: GraphClient | null, config: GraphSection | undefined, incidents?: IncidentLog | undefined, projectRoot?: string | undefined, artifactStore?: GraphArtifactStore | undefined);
|
|
78
|
+
/**
|
|
79
|
+
* Inject pre-flight graph context into a first message.
|
|
80
|
+
*
|
|
81
|
+
* Fast-path: returns firstMessage UNCHANGED when:
|
|
82
|
+
* - graph.enabled !== true
|
|
83
|
+
* - client is null
|
|
84
|
+
* - engineHealth !== 'ready'
|
|
85
|
+
*
|
|
86
|
+
* Timeout: 5000ms. On timeout or any error, logs an incident and returns
|
|
87
|
+
* firstMessage unchanged. Agent spawn is NEVER blocked.
|
|
88
|
+
*
|
|
89
|
+
* Researcher-Phase2 isolation: NEVER uses contract.title/description/feature.
|
|
90
|
+
* Uses ONLY overrides.questionKeywords. Passing a non-null contract for
|
|
91
|
+
* researcher-phase2 is defensively handled — feature text is still NOT used.
|
|
92
|
+
*
|
|
93
|
+
* @param role Agent role string.
|
|
94
|
+
* @param contract Sprint contract (or null for research phase / architect).
|
|
95
|
+
* @param firstMessage The agent's first user message.
|
|
96
|
+
* @param overrides Optional overrides: questionKeywords, baselineSha.
|
|
97
|
+
*/
|
|
98
|
+
inject(role: BoberAgentRole, contract: SprintContract | null, firstMessage: string, overrides?: InjectOverrides): Promise<string>;
|
|
99
|
+
/**
|
|
100
|
+
* Record one `graph-preflight` telemetry event to .bober/history.jsonl.
|
|
101
|
+
*
|
|
102
|
+
* Resolves a project root by preferring the constructor-injected projectRoot,
|
|
103
|
+
* then the active pipeline lifecycle singleton — so telemetry fires for every
|
|
104
|
+
* role even though most call sites construct the injector with only
|
|
105
|
+
* (client, config). Best-effort: any failure is swallowed so telemetry can
|
|
106
|
+
* NEVER break an agent spawn.
|
|
107
|
+
*
|
|
108
|
+
* Each row answers the runtime question directly: did graph context get added
|
|
109
|
+
* (`injected`), roughly how many tokens (`approxTokensAdded`), under what
|
|
110
|
+
* `outcome`, and how long the preflight took (`elapsedMs`).
|
|
111
|
+
*/
|
|
112
|
+
private recordTelemetry;
|
|
113
|
+
/** Core injection logic — called by inject() within the timeout race. */
|
|
114
|
+
private runInject;
|
|
115
|
+
/** Look up the token budget for a given role from config, with fallback to defaults. */
|
|
116
|
+
private getBudgetForRole;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Extract meaningful search keywords from a block of text (e.g. Phase 1 questions).
|
|
120
|
+
*
|
|
121
|
+
* Used by pipeline.ts to derive overrides.questionKeywords for researcher-phase2
|
|
122
|
+
* from the Phase 1 questions array.
|
|
123
|
+
*
|
|
124
|
+
* Returns up to 10 unique tokens of length >= 5, lowercased.
|
|
125
|
+
* Does NOT preserve the original text — the output is transformed tokens only,
|
|
126
|
+
* which is safe to pass to researcher-phase2 (no feature text leak).
|
|
127
|
+
*/
|
|
128
|
+
export declare function extractKeywords(text: string): string[];
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=preflight-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-injector.d.ts","sourceRoot":"","sources":["../../src/graph/preflight-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAiD,MAAM,YAAY,CAAC;AAG9F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,mBAAmB,GACnB,mBAAmB,GACnB,WAAW,GACX,SAAS,GACT,WAAW,GACX,WAAW,CAAC;AAEhB,4EAA4E;AAC5E,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkBD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,YAAY,EAAE,CAkFvF,CAAC;AAIF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,cAAc,CAwBlF;AA6LD;;;;;;;;;;;GAWG;AACH,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAJd,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,SAAS,CAAC,EAAE,WAAW,YAAA,EACvB,WAAW,CAAC,EAAE,MAAM,YAAA,EACpB,aAAa,CAAC,EAAE,kBAAkB,YAAA;IAGrD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,MAAM,CACV,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,MAAM,CAAC;IAuElB;;;;;;;;;;;;OAYG;YACW,eAAe;IAuC7B,yEAAyE;YAC3D,SAAS;IAwGvB,wFAAwF;IACxF,OAAO,CAAC,gBAAgB;CA4CzB;AAID;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtD"}
|