muonroi-cli 1.4.0 → 1.4.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/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/package.json +3 -2
- package/dist/muonroi-cli-standalone.exe +0 -0
- package/dist/packages/agent-harness-core/src/driver.js.map +0 -1
- package/dist/packages/agent-harness-core/src/event-filter.js.map +0 -1
- package/dist/packages/agent-harness-core/src/event-redact.js.map +0 -1
- package/dist/packages/agent-harness-core/src/idle.js.map +0 -1
- package/dist/packages/agent-harness-core/src/index.js.map +0 -1
- package/dist/packages/agent-harness-core/src/mcp-server.js.map +0 -1
- package/dist/packages/agent-harness-core/src/mock-llm.js.map +0 -1
- package/dist/packages/agent-harness-core/src/predicate.js.map +0 -1
- package/dist/packages/agent-harness-core/src/protocol.js.map +0 -1
- package/dist/packages/agent-harness-core/src/registry.js.map +0 -1
- package/dist/packages/agent-harness-core/src/selector.js.map +0 -1
- package/dist/packages/agent-harness-core/src/spec-helpers.js.map +0 -1
- package/dist/packages/agent-harness-core/src/transports/sidechannel.js.map +0 -1
- package/dist/packages/agent-harness-core/src/transports/ws.js.map +0 -1
- package/dist/packages/agent-harness-opentui/src/agent-mode.js.map +0 -1
- package/dist/packages/agent-harness-opentui/src/index.js.map +0 -1
- package/dist/packages/agent-harness-opentui/src/input-bridge.js.map +0 -1
- package/dist/packages/agent-harness-opentui/src/install.js.map +0 -1
- package/dist/packages/agent-harness-opentui/src/reconciler-hook.js.map +0 -1
- package/dist/packages/agent-harness-opentui/src/semantic.js.map +0 -1
- package/dist/src/__test-helpers__/catalog-fixtures.js.map +0 -1
- package/dist/src/__test-stubs__/ee-server.js.map +0 -1
- package/dist/src/__test-stubs__/vitest-setup.js.map +0 -1
- package/dist/src/__tests__/council/bubble-layout.test.js.map +0 -1
- package/dist/src/__tests__/council/code-block-truncate.test.js.map +0 -1
- package/dist/src/__tests__/council/role-palette.test.js.map +0 -1
- package/dist/src/__tests__/first-run-wizard.test.js.map +0 -1
- package/dist/src/agent-harness/__tests__/cli-flags.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/driver.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/idle.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/mock-llm.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/mock-model.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/predicate.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/protocol.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/schema.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/selector.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/sidechannel.spec.js.map +0 -1
- package/dist/src/agent-harness/__tests__/spec-helpers.spec.js.map +0 -1
- package/dist/src/agent-harness/index.js.map +0 -1
- package/dist/src/agent-harness/mock-model.js.map +0 -1
- package/dist/src/agent-harness/test-spawn.js.map +0 -1
- package/dist/src/billing/index.js.map +0 -1
- package/dist/src/chat/__tests__/broadcast-bus.test.js.map +0 -1
- package/dist/src/chat/__tests__/channel-manager.test.js.map +0 -1
- package/dist/src/chat/__tests__/client.test.js.map +0 -1
- package/dist/src/chat/__tests__/discord-integration.test.js.map +0 -1
- package/dist/src/chat/__tests__/intent-prompt.test.js.map +0 -1
- package/dist/src/chat/__tests__/verdict-resolver.test.js.map +0 -1
- package/dist/src/chat/broadcast-bus.js.map +0 -1
- package/dist/src/chat/channel-manager.js.map +0 -1
- package/dist/src/chat/chat-keychain.js.map +0 -1
- package/dist/src/chat/factory.js.map +0 -1
- package/dist/src/chat/intent-prompt.js.map +0 -1
- package/dist/src/chat/providers/discord/client.js.map +0 -1
- package/dist/src/chat/types.js.map +0 -1
- package/dist/src/chat/verdict-constants.js.map +0 -1
- package/dist/src/chat/verdict-resolver.js.map +0 -1
- package/dist/src/cli/__tests__/bw-vault.test.js.map +0 -1
- package/dist/src/cli/__tests__/keys-bundle.test.js.map +0 -1
- package/dist/src/cli/__tests__/share-cmd.test.js.map +0 -1
- package/dist/src/cli/bw-vault.js.map +0 -1
- package/dist/src/cli/config/__tests__/model-picker.test.js.map +0 -1
- package/dist/src/cli/config/__tests__/provider-fetch.test.js.map +0 -1
- package/dist/src/cli/config/index.js.map +0 -1
- package/dist/src/cli/config/model-picker.js.map +0 -1
- package/dist/src/cli/config/provider-fetch.js.map +0 -1
- package/dist/src/cli/config/screen-council.js.map +0 -1
- package/dist/src/cli/config/screen-models.js.map +0 -1
- package/dist/src/cli/config/screen-providers.js.map +0 -1
- package/dist/src/cli/config/tui.js.map +0 -1
- package/dist/src/cli/cost-forensics.js.map +0 -1
- package/dist/src/cli/cost-forensics.test.js.map +0 -1
- package/dist/src/cli/keys-bundle.js.map +0 -1
- package/dist/src/cli/keys.js.map +0 -1
- package/dist/src/cli/keys.test.js.map +0 -1
- package/dist/src/cli/pil-report.js.map +0 -1
- package/dist/src/cli/reporter-cmd.js.map +0 -1
- package/dist/src/cli/share-cmd.js.map +0 -1
- package/dist/src/cli/usage-report.js.map +0 -1
- package/dist/src/cloud/index.js.map +0 -1
- package/dist/src/council/__tests__/accounting.test.js.map +0 -1
- package/dist/src/council/__tests__/audit-replay.test.js.map +0 -1
- package/dist/src/council/__tests__/clarifier-max-rounds.test.js.map +0 -1
- package/dist/src/council/__tests__/clarifier-options.test.js.map +0 -1
- package/dist/src/council/__tests__/clarifier-ready-gate.test.js.map +0 -1
- package/dist/src/council/__tests__/cost-aware.test.js.map +0 -1
- package/dist/src/council/__tests__/debate-planner-structured.test.js.map +0 -1
- package/dist/src/council/__tests__/decisions-lock.test.js.map +0 -1
- package/dist/src/council/__tests__/evaluator-metrics.test.js.map +0 -1
- package/dist/src/council/__tests__/parse-outcome-fallback.test.js.map +0 -1
- package/dist/src/council/__tests__/research-tools.test.js.map +0 -1
- package/dist/src/council/__tests__/round-tools.test.js.map +0 -1
- package/dist/src/council/__tests__/tool-trace.test.js.map +0 -1
- package/dist/src/council/__tests__/types-contract.test.js.map +0 -1
- package/dist/src/council/clarifier.js.map +0 -1
- package/dist/src/council/context.js.map +0 -1
- package/dist/src/council/debate-planner.js.map +0 -1
- package/dist/src/council/debate.js.map +0 -1
- package/dist/src/council/decisions-lock.js.map +0 -1
- package/dist/src/council/executor.js.map +0 -1
- package/dist/src/council/index.js.map +0 -1
- package/dist/src/council/leader.js.map +0 -1
- package/dist/src/council/llm.js.map +0 -1
- package/dist/src/council/phase-events.js.map +0 -1
- package/dist/src/council/planner.js.map +0 -1
- package/dist/src/council/preflight.js.map +0 -1
- package/dist/src/council/prompts.js.map +0 -1
- package/dist/src/council/types.js.map +0 -1
- package/dist/src/daemon/scheduler.js.map +0 -1
- package/dist/src/daemon/scheduler.test.js.map +0 -1
- package/dist/src/ee/__tests__/bb-design.test.js.map +0 -1
- package/dist/src/ee/__tests__/export-transcripts.test.js.map +0 -1
- package/dist/src/ee/__tests__/pil-context-bridge.test.js.map +0 -1
- package/dist/src/ee/__tests__/pipeline.integration.test.js.map +0 -1
- package/dist/src/ee/__tests__/recall-format.test.js.map +0 -1
- package/dist/src/ee/__tests__/recall-ledger.test.js.map +0 -1
- package/dist/src/ee/__tests__/render-sink-wiring.test.js.map +0 -1
- package/dist/src/ee/auth.js.map +0 -1
- package/dist/src/ee/auth.test.js.map +0 -1
- package/dist/src/ee/bb-design.js.map +0 -1
- package/dist/src/ee/bb-retrieval.js.map +0 -1
- package/dist/src/ee/bridge.js.map +0 -1
- package/dist/src/ee/bridge.test.js.map +0 -1
- package/dist/src/ee/client-mode.js.map +0 -1
- package/dist/src/ee/client.js.map +0 -1
- package/dist/src/ee/client.test.js.map +0 -1
- package/dist/src/ee/council-bridge.js.map +0 -1
- package/dist/src/ee/embedding-cache.js.map +0 -1
- package/dist/src/ee/export-transcripts.js.map +0 -1
- package/dist/src/ee/extract-session.js.map +0 -1
- package/dist/src/ee/extract-session.test.js.map +0 -1
- package/dist/src/ee/health.js.map +0 -1
- package/dist/src/ee/index.js.map +0 -1
- package/dist/src/ee/intercept.js.map +0 -1
- package/dist/src/ee/intercept.test.js.map +0 -1
- package/dist/src/ee/judge.js.map +0 -1
- package/dist/src/ee/judge.test.js.map +0 -1
- package/dist/src/ee/mistake-detector.js.map +0 -1
- package/dist/src/ee/mistake-detector.test.js.map +0 -1
- package/dist/src/ee/offline-queue.js.map +0 -1
- package/dist/src/ee/offline-queue.test.js.map +0 -1
- package/dist/src/ee/phase-outcome.js.map +0 -1
- package/dist/src/ee/phase-outcome.test.js.map +0 -1
- package/dist/src/ee/phase-tracker.js.map +0 -1
- package/dist/src/ee/phase-tracker.test.js.map +0 -1
- package/dist/src/ee/posttool.js.map +0 -1
- package/dist/src/ee/posttool.test.js.map +0 -1
- package/dist/src/ee/prompt-stale.js.map +0 -1
- package/dist/src/ee/prompt-stale.test.js.map +0 -1
- package/dist/src/ee/recall-ledger.js.map +0 -1
- package/dist/src/ee/recall-mirror.test.js.map +0 -1
- package/dist/src/ee/render.js.map +0 -1
- package/dist/src/ee/render.test.js.map +0 -1
- package/dist/src/ee/scope.js.map +0 -1
- package/dist/src/ee/scope.test.js.map +0 -1
- package/dist/src/ee/search.js.map +0 -1
- package/dist/src/ee/session-trajectory.js.map +0 -1
- package/dist/src/ee/session-trajectory.test.js.map +0 -1
- package/dist/src/ee/tenant.js.map +0 -1
- package/dist/src/ee/touch.test.js.map +0 -1
- package/dist/src/ee/transcript-emit.js.map +0 -1
- package/dist/src/ee/types.js.map +0 -1
- package/dist/src/flow/__tests__/migration.test.js.map +0 -1
- package/dist/src/flow/__tests__/parser.test.js.map +0 -1
- package/dist/src/flow/__tests__/run-manager-product.test.js.map +0 -1
- package/dist/src/flow/__tests__/run-manager.test.js.map +0 -1
- package/dist/src/flow/__tests__/scaffold-checkpoint.test.js.map +0 -1
- package/dist/src/flow/__tests__/scaffold.test.js.map +0 -1
- package/dist/src/flow/__tests__/warning-persist.test.js.map +0 -1
- package/dist/src/flow/artifact-io.js.map +0 -1
- package/dist/src/flow/compaction/__tests__/compress.test.js.map +0 -1
- package/dist/src/flow/compaction/__tests__/extract.test.js.map +0 -1
- package/dist/src/flow/compaction/__tests__/preserve.test.js.map +0 -1
- package/dist/src/flow/compaction/compress.js.map +0 -1
- package/dist/src/flow/compaction/extract.js.map +0 -1
- package/dist/src/flow/compaction/index.js.map +0 -1
- package/dist/src/flow/compaction/preserve.js.map +0 -1
- package/dist/src/flow/index.js.map +0 -1
- package/dist/src/flow/migration.js.map +0 -1
- package/dist/src/flow/parser.js.map +0 -1
- package/dist/src/flow/run-manager.js.map +0 -1
- package/dist/src/flow/scaffold-checkpoint.js.map +0 -1
- package/dist/src/flow/scaffold.js.map +0 -1
- package/dist/src/flow/warning-persist.js.map +0 -1
- package/dist/src/generated/version.js.map +0 -1
- package/dist/src/gsd/__tests__/complexity.test.js.map +0 -1
- package/dist/src/gsd/__tests__/directives.test.js.map +0 -1
- package/dist/src/gsd/__tests__/gray-areas.test.js.map +0 -1
- package/dist/src/gsd/__tests__/types.test.js.map +0 -1
- package/dist/src/gsd/complexity.js.map +0 -1
- package/dist/src/gsd/directives.js.map +0 -1
- package/dist/src/gsd/gray-areas.js.map +0 -1
- package/dist/src/gsd/index.js.map +0 -1
- package/dist/src/gsd/types.js.map +0 -1
- package/dist/src/headless/__tests__/council-answers.test.js.map +0 -1
- package/dist/src/headless/council-answers.js.map +0 -1
- package/dist/src/headless/output.js.map +0 -1
- package/dist/src/headless/output.test.js.map +0 -1
- package/dist/src/hooks/config.js.map +0 -1
- package/dist/src/hooks/index.js.map +0 -1
- package/dist/src/hooks/types.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/lsp/builtins.js.map +0 -1
- package/dist/src/lsp/builtins.test.js.map +0 -1
- package/dist/src/lsp/client.js.map +0 -1
- package/dist/src/lsp/manager.js.map +0 -1
- package/dist/src/lsp/manager.test.js.map +0 -1
- package/dist/src/lsp/npm-cache.js.map +0 -1
- package/dist/src/lsp/npm-cache.test.js.map +0 -1
- package/dist/src/lsp/runtime.js.map +0 -1
- package/dist/src/lsp/smoke.test.js.map +0 -1
- package/dist/src/lsp/types.js.map +0 -1
- package/dist/src/maintain/__tests__/codebase-intel.test.js.map +0 -1
- package/dist/src/maintain/__tests__/gh-create-pr.test.js.map +0 -1
- package/dist/src/maintain/__tests__/pr-builder.test.js.map +0 -1
- package/dist/src/maintain/__tests__/repo-map.test.js.map +0 -1
- package/dist/src/maintain/__tests__/task-runner.test.js.map +0 -1
- package/dist/src/maintain/codebase-intel.js.map +0 -1
- package/dist/src/maintain/gh-create-pr.js.map +0 -1
- package/dist/src/maintain/index.js.map +0 -1
- package/dist/src/maintain/pr-builder.js.map +0 -1
- package/dist/src/maintain/repo-map.js.map +0 -1
- package/dist/src/maintain/task-runner.js.map +0 -1
- package/dist/src/maintain/types.js.map +0 -1
- package/dist/src/mcp/__tests__/auto-setup.test.js.map +0 -1
- package/dist/src/mcp/__tests__/cap-tool-result.test.js.map +0 -1
- package/dist/src/mcp/__tests__/ee-tools.test.js.map +0 -1
- package/dist/src/mcp/__tests__/forensics-tools.test.js.map +0 -1
- package/dist/src/mcp/__tests__/harness-driver-action-tools.spec.js.map +0 -1
- package/dist/src/mcp/__tests__/harness-driver-async-tools.spec.js.map +0 -1
- package/dist/src/mcp/__tests__/harness-driver-read-tools.spec.js.map +0 -1
- package/dist/src/mcp/__tests__/harness-driver-security.spec.js.map +0 -1
- package/dist/src/mcp/__tests__/harness-driver.spec.js.map +0 -1
- package/dist/src/mcp/__tests__/lazy-schema.spec.js.map +0 -1
- package/dist/src/mcp/__tests__/lsp-tools.test.js.map +0 -1
- package/dist/src/mcp/__tests__/mcp-keychain.test.js.map +0 -1
- package/dist/src/mcp/__tests__/research-onboarding.test.js.map +0 -1
- package/dist/src/mcp/__tests__/runtime-hydration.test.js.map +0 -1
- package/dist/src/mcp/__tests__/runtime-output-cap.test.js.map +0 -1
- package/dist/src/mcp/__tests__/runtime-sanitize.test.js.map +0 -1
- package/dist/src/mcp/__tests__/self-verify-jobs.test.js.map +0 -1
- package/dist/src/mcp/__tests__/smart-filter.test.js.map +0 -1
- package/dist/src/mcp/__tests__/tools-server.smoke.test.js.map +0 -1
- package/dist/src/mcp/auto-setup.js.map +0 -1
- package/dist/src/mcp/cap-tool-result.js.map +0 -1
- package/dist/src/mcp/catalog.js.map +0 -1
- package/dist/src/mcp/ee-tools.js.map +0 -1
- package/dist/src/mcp/forensics-tools.js.map +0 -1
- package/dist/src/mcp/lsp-tools.js.map +0 -1
- package/dist/src/mcp/mcp-keychain.js.map +0 -1
- package/dist/src/mcp/oauth-callback.js.map +0 -1
- package/dist/src/mcp/oauth-provider.js.map +0 -1
- package/dist/src/mcp/opentui-spawn.js.map +0 -1
- package/dist/src/mcp/parse-headers.js.map +0 -1
- package/dist/src/mcp/parse-headers.test.js.map +0 -1
- package/dist/src/mcp/research-onboarding.js.map +0 -1
- package/dist/src/mcp/runtime.js.map +0 -1
- package/dist/src/mcp/self-verify-jobs.js.map +0 -1
- package/dist/src/mcp/smart-filter.js.map +0 -1
- package/dist/src/mcp/smoke.test.js.map +0 -1
- package/dist/src/mcp/tools-server.js.map +0 -1
- package/dist/src/mcp/validate.js.map +0 -1
- package/dist/src/models/__tests__/registry.test.js.map +0 -1
- package/dist/src/models/catalog-client.js.map +0 -1
- package/dist/src/models/catalog-gemini.test.js.map +0 -1
- package/dist/src/models/catalog-url.test.js.map +0 -1
- package/dist/src/models/catalog-validation.test.js.map +0 -1
- package/dist/src/models/classify-tier.js.map +0 -1
- package/dist/src/models/index.js.map +0 -1
- package/dist/src/models/registry.js.map +0 -1
- package/dist/src/ops/__tests__/doctor-council-mcp.test.js.map +0 -1
- package/dist/src/ops/__tests__/doctor-ee-health.test.js.map +0 -1
- package/dist/src/ops/bug-report.js.map +0 -1
- package/dist/src/ops/bug-report.test.js.map +0 -1
- package/dist/src/ops/doctor.js.map +0 -1
- package/dist/src/ops/doctor.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/agent-base-url-switch.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/batch-turn-runner.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/council-manager.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/cross-turn-dedup.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/current-call-id.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/error-forensics.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/flow-resume.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/humanize-api-error.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/message-processor.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/message-write-ahead.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/read-path-budget.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/retry-classifier.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/retry-stream.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/route-feedback.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/stream-runner.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/sub-agent-model-tier.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/usage-events-shape.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/usage-normalizer-c1.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/usage-shape-threading.test.js.map +0 -1
- package/dist/src/orchestrator/__tests__/write-ahead.test.js.map +0 -1
- package/dist/src/orchestrator/abort.js.map +0 -1
- package/dist/src/orchestrator/abort.test.js.map +0 -1
- package/dist/src/orchestrator/agent-options.js.map +0 -1
- package/dist/src/orchestrator/agent.test.js.map +0 -1
- package/dist/src/orchestrator/batch-turn-runner.js.map +0 -1
- package/dist/src/orchestrator/batch-utils.js.map +0 -1
- package/dist/src/orchestrator/cleanup.test.js.map +0 -1
- package/dist/src/orchestrator/compaction.js.map +0 -1
- package/dist/src/orchestrator/compaction.test.js.map +0 -1
- package/dist/src/orchestrator/council-manager.js.map +0 -1
- package/dist/src/orchestrator/cross-turn-dedup.js.map +0 -1
- package/dist/src/orchestrator/delegations.js.map +0 -1
- package/dist/src/orchestrator/delegations.test.js.map +0 -1
- package/dist/src/orchestrator/error-utils.js.map +0 -1
- package/dist/src/orchestrator/flow-resume.js.map +0 -1
- package/dist/src/orchestrator/grounding-check.js.map +0 -1
- package/dist/src/orchestrator/grounding-check.test.js.map +0 -1
- package/dist/src/orchestrator/interrupted-turn.js.map +0 -1
- package/dist/src/orchestrator/interrupted-turn.test.js.map +0 -1
- package/dist/src/orchestrator/message-processor.js.map +0 -1
- package/dist/src/orchestrator/message-seq.js.map +0 -1
- package/dist/src/orchestrator/message-seq.test.js.map +0 -1
- package/dist/src/orchestrator/orchestrator.js.map +0 -1
- package/dist/src/orchestrator/pending-calls.js.map +0 -1
- package/dist/src/orchestrator/pending-calls.test.js.map +0 -1
- package/dist/src/orchestrator/prompts.js.map +0 -1
- package/dist/src/orchestrator/provider-options-shape.js.map +0 -1
- package/dist/src/orchestrator/provider-options-shape.spec.js.map +0 -1
- package/dist/src/orchestrator/read-path-budget.js.map +0 -1
- package/dist/src/orchestrator/reasoning.js.map +0 -1
- package/dist/src/orchestrator/reasoning.test.js.map +0 -1
- package/dist/src/orchestrator/repair-tool-call.js.map +0 -1
- package/dist/src/orchestrator/repetition-detector.js.map +0 -1
- package/dist/src/orchestrator/repetition-detector.test.js.map +0 -1
- package/dist/src/orchestrator/retry-classifier.js.map +0 -1
- package/dist/src/orchestrator/retry-stream.js.map +0 -1
- package/dist/src/orchestrator/sandbox.test.js.map +0 -1
- package/dist/src/orchestrator/scope-ceiling.js.map +0 -1
- package/dist/src/orchestrator/scope-ceiling.test.js.map +0 -1
- package/dist/src/orchestrator/scope-reminder.js.map +0 -1
- package/dist/src/orchestrator/scope-reminder.test.js.map +0 -1
- package/dist/src/orchestrator/stall-rescue.js.map +0 -1
- package/dist/src/orchestrator/stall-rescue.test.js.map +0 -1
- package/dist/src/orchestrator/stall-watchdog.js.map +0 -1
- package/dist/src/orchestrator/stall-watchdog.test.js.map +0 -1
- package/dist/src/orchestrator/stream-runner.js.map +0 -1
- package/dist/src/orchestrator/sub-agent-cap.js.map +0 -1
- package/dist/src/orchestrator/sub-agent-cap.test.js.map +0 -1
- package/dist/src/orchestrator/sub-agent-model-tier.js.map +0 -1
- package/dist/src/orchestrator/subagent-compactor.js.map +0 -1
- package/dist/src/orchestrator/subagent-compactor.spec.js.map +0 -1
- package/dist/src/orchestrator/text-tool-call-detector.js.map +0 -1
- package/dist/src/orchestrator/text-tool-call-detector.test.js.map +0 -1
- package/dist/src/orchestrator/token-counter.js.map +0 -1
- package/dist/src/orchestrator/token-counter.test.js.map +0 -1
- package/dist/src/orchestrator/tool-args-hash.js.map +0 -1
- package/dist/src/orchestrator/tool-args-hash.test.js.map +0 -1
- package/dist/src/orchestrator/tool-args-repair.js.map +0 -1
- package/dist/src/orchestrator/tool-args-repair.test.js.map +0 -1
- package/dist/src/orchestrator/tool-loop-cap.js.map +0 -1
- package/dist/src/orchestrator/tool-loop-cap.test.js.map +0 -1
- package/dist/src/orchestrator/tool-repetition-detector.js.map +0 -1
- package/dist/src/orchestrator/tool-repetition-detector.test.js.map +0 -1
- package/dist/src/orchestrator/tool-utils.js.map +0 -1
- package/dist/src/orchestrator/turn-runner-deps.js.map +0 -1
- package/dist/src/pil/__tests__/budget.test.js.map +0 -1
- package/dist/src/pil/__tests__/clarity-gate.test.js.map +0 -1
- package/dist/src/pil/__tests__/config.test.js.map +0 -1
- package/dist/src/pil/__tests__/discovery-cache.test.js.map +0 -1
- package/dist/src/pil/__tests__/discovery-types.test.js.map +0 -1
- package/dist/src/pil/__tests__/discovery.test.js.map +0 -1
- package/dist/src/pil/__tests__/dual-run.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer1-intent-trace.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer1-intent.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer15-context-scan.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer16-clarity.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer17-feasibility.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer18-acceptance.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer2-personality.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer3-ee-injection.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer3-injected-chunk.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer4-gsd.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer5-context.test.js.map +0 -1
- package/dist/src/pil/__tests__/layer6-output.test.js.map +0 -1
- package/dist/src/pil/__tests__/llm-classify.test.js.map +0 -1
- package/dist/src/pil/__tests__/native-capabilities-workbook.test.js.map +0 -1
- package/dist/src/pil/__tests__/ollama-classify.test.js.map +0 -1
- package/dist/src/pil/__tests__/orchestrator-integration.test.js.map +0 -1
- package/dist/src/pil/__tests__/pipeline.test.js.map +0 -1
- package/dist/src/pil/__tests__/renderer-coverage.test.js.map +0 -1
- package/dist/src/pil/__tests__/response-tools.test.js.map +0 -1
- package/dist/src/pil/__tests__/schema.test.js.map +0 -1
- package/dist/src/pil/__tests__/scoreComplexity.test.js.map +0 -1
- package/dist/src/pil/__tests__/scoreSufficiency.test.js.map +0 -1
- package/dist/src/pil/__tests__/store.test.js.map +0 -1
- package/dist/src/pil/__tests__/task-tier-map.test.js.map +0 -1
- package/dist/src/pil/agent-operating-contract.js.map +0 -1
- package/dist/src/pil/agent-operating-contract.test.js.map +0 -1
- package/dist/src/pil/budget-log.js.map +0 -1
- package/dist/src/pil/budget.js.map +0 -1
- package/dist/src/pil/cheap-model-playbook.js.map +0 -1
- package/dist/src/pil/cheap-model-playbook.test.js.map +0 -1
- package/dist/src/pil/cheap-model-workbooks.js.map +0 -1
- package/dist/src/pil/cheap-model-workbooks.test.js.map +0 -1
- package/dist/src/pil/clarity-gate.js.map +0 -1
- package/dist/src/pil/config.js.map +0 -1
- package/dist/src/pil/discovery-cache.js.map +0 -1
- package/dist/src/pil/discovery-types.js.map +0 -1
- package/dist/src/pil/discovery.js.map +0 -1
- package/dist/src/pil/index.js.map +0 -1
- package/dist/src/pil/layer1-intent.js.map +0 -1
- package/dist/src/pil/layer1-intent.test.js.map +0 -1
- package/dist/src/pil/layer15-context-scan.js.map +0 -1
- package/dist/src/pil/layer16-clarity.js.map +0 -1
- package/dist/src/pil/layer16-clarity.test.js.map +0 -1
- package/dist/src/pil/layer17-feasibility.js.map +0 -1
- package/dist/src/pil/layer18-acceptance.js.map +0 -1
- package/dist/src/pil/layer1_5-complexity-size.js.map +0 -1
- package/dist/src/pil/layer1_5-complexity-size.test.js.map +0 -1
- package/dist/src/pil/layer2-personality.js.map +0 -1
- package/dist/src/pil/layer3-ee-injection.js.map +0 -1
- package/dist/src/pil/layer4-gsd.js.map +0 -1
- package/dist/src/pil/layer5-context.js.map +0 -1
- package/dist/src/pil/layer6-output.js.map +0 -1
- package/dist/src/pil/llm-classify.js.map +0 -1
- package/dist/src/pil/native-capabilities-workbook.js.map +0 -1
- package/dist/src/pil/ollama-classify.js.map +0 -1
- package/dist/src/pil/pipeline.js.map +0 -1
- package/dist/src/pil/response-tools.js.map +0 -1
- package/dist/src/pil/schema.js.map +0 -1
- package/dist/src/pil/session-state.js.map +0 -1
- package/dist/src/pil/session-state.test.js.map +0 -1
- package/dist/src/pil/store.js.map +0 -1
- package/dist/src/pil/task-tier-map.js.map +0 -1
- package/dist/src/pil/timeout.js.map +0 -1
- package/dist/src/pil/types.js.map +0 -1
- package/dist/src/product-loop/__tests__/artifact-io.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/assumption-ledger.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/backlog-builder.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/backlog-store.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/cb2-retry-bonus.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/circuit-breakers-coverage.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/circuit-breakers.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/complexity-routing.spec.js.map +0 -1
- package/dist/src/product-loop/__tests__/context-policy.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/cost-preview.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/cost-scoper.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/cross-run-memory.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/design-output.spec.js.map +0 -1
- package/dist/src/product-loop/__tests__/discover.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-context-format.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-council-runner.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-detection.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-ecosystem.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-integration.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-interview.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-migrations.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-persistence.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-prompt-parser.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-prompt-specificity.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-recommender-ecosystem.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-recommender.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/discovery-schema.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/done-gate-coverage.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/done-gate.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/ee-extract-wiring.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/extract-to-ee.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/feedback-routing.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/gather-selectable-alts.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/hot-path.spec.js.map +0 -1
- package/dist/src/product-loop/__tests__/integration.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/loop-driver-audit.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/loop-driver.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/maintenance-task-synthesis.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-a1-a3-sprint-runner.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-a2-backlog-build.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-budget.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-orchestrator-integration.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-plan.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-rituals.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-runner.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/phase-tracker-bridge.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/pick-backend-stack.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/product-identity.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/progress-snapshot.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/reality-anchor.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/repo-audit.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/repo-brief.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/role-memory.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/role-registry.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/role-routing-ee.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/route-decision-emit.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/seed-questions.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/ship-polish.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-planner.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-runner-backlog.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-runner-emit.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-runner-phase-chunks.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-runner.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-self-verify.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sprint-store.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/stakeholder-acl.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/state-md-ee-injections.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/sufficiency-routing.spec.js.map +0 -1
- package/dist/src/product-loop/__tests__/typed-artifacts.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/types.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/verify-failure-threshold.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/verify-failure-tracking.test.js.map +0 -1
- package/dist/src/product-loop/__tests__/verify-result.test.js.map +0 -1
- package/dist/src/product-loop/artifact-io.js.map +0 -1
- package/dist/src/product-loop/assumption-ledger.js.map +0 -1
- package/dist/src/product-loop/backlog-builder.js.map +0 -1
- package/dist/src/product-loop/backlog-store.js.map +0 -1
- package/dist/src/product-loop/circuit-breakers.js.map +0 -1
- package/dist/src/product-loop/context-policy.js.map +0 -1
- package/dist/src/product-loop/cost-preview.js.map +0 -1
- package/dist/src/product-loop/cost-scoper.js.map +0 -1
- package/dist/src/product-loop/cross-run-memory.js.map +0 -1
- package/dist/src/product-loop/design-output.js.map +0 -1
- package/dist/src/product-loop/discover.js.map +0 -1
- package/dist/src/product-loop/discovery-context-format.js.map +0 -1
- package/dist/src/product-loop/discovery-council-runner.js.map +0 -1
- package/dist/src/product-loop/discovery-detection.js.map +0 -1
- package/dist/src/product-loop/discovery-ecosystem.js.map +0 -1
- package/dist/src/product-loop/discovery-interview.js.map +0 -1
- package/dist/src/product-loop/discovery-migrations.js.map +0 -1
- package/dist/src/product-loop/discovery-persistence.js.map +0 -1
- package/dist/src/product-loop/discovery-prompt-parser.js.map +0 -1
- package/dist/src/product-loop/discovery-recommender.js.map +0 -1
- package/dist/src/product-loop/discovery-schema.js.map +0 -1
- package/dist/src/product-loop/done-gate.js.map +0 -1
- package/dist/src/product-loop/feedback-routing.js.map +0 -1
- package/dist/src/product-loop/gather.js.map +0 -1
- package/dist/src/product-loop/index.js.map +0 -1
- package/dist/src/product-loop/loop-driver.js.map +0 -1
- package/dist/src/product-loop/phase-budget.js.map +0 -1
- package/dist/src/product-loop/phase-plan.js.map +0 -1
- package/dist/src/product-loop/phase-rituals.js.map +0 -1
- package/dist/src/product-loop/phase-runner.js.map +0 -1
- package/dist/src/product-loop/phase-tracker-bridge.js.map +0 -1
- package/dist/src/product-loop/product-identity.js.map +0 -1
- package/dist/src/product-loop/progress-snapshot.js.map +0 -1
- package/dist/src/product-loop/reality-anchor.js.map +0 -1
- package/dist/src/product-loop/repo-audit.js.map +0 -1
- package/dist/src/product-loop/repo-brief.js.map +0 -1
- package/dist/src/product-loop/role-memory.js.map +0 -1
- package/dist/src/product-loop/role-registry.js.map +0 -1
- package/dist/src/product-loop/seed-questions.js.map +0 -1
- package/dist/src/product-loop/ship-polish.js.map +0 -1
- package/dist/src/product-loop/sprint-planner.js.map +0 -1
- package/dist/src/product-loop/sprint-runner.js.map +0 -1
- package/dist/src/product-loop/sprint-self-verify.js.map +0 -1
- package/dist/src/product-loop/sprint-store.js.map +0 -1
- package/dist/src/product-loop/stakeholder-acl.js.map +0 -1
- package/dist/src/product-loop/typed-artifacts.js.map +0 -1
- package/dist/src/product-loop/types.js.map +0 -1
- package/dist/src/product-loop/verify-failure-tracking.js.map +0 -1
- package/dist/src/product-loop/verify-result.js.map +0 -1
- package/dist/src/providers/__test-utils__/load-fixture.js.map +0 -1
- package/dist/src/providers/__tests__/adapter-oauth-wiring.test.js.map +0 -1
- package/dist/src/providers/__tests__/capabilities-cosmetic.test.js.map +0 -1
- package/dist/src/providers/__tests__/capabilities-flags.test.js.map +0 -1
- package/dist/src/providers/__tests__/capabilities-provider-options.test.js.map +0 -1
- package/dist/src/providers/__tests__/capabilities-sanitize.test.js.map +0 -1
- package/dist/src/providers/__tests__/capabilities.test.js.map +0 -1
- package/dist/src/providers/__tests__/provider-coverage.test.js.map +0 -1
- package/dist/src/providers/__tests__/reasoning-roundtrip.test.js.map +0 -1
- package/dist/src/providers/__tests__/runtime-integration.test.js.map +0 -1
- package/dist/src/providers/__tests__/runtime.test.js.map +0 -1
- package/dist/src/providers/__tests__/siliconflow-sse-repair.test.js.map +0 -1
- package/dist/src/providers/__tests__/strategies-registry.test.js.map +0 -1
- package/dist/src/providers/__tests__/strategies-resolve.test.js.map +0 -1
- package/dist/src/providers/__tests__/wire-debug.test.js.map +0 -1
- package/dist/src/providers/adapter.js.map +0 -1
- package/dist/src/providers/adapter.test.js.map +0 -1
- package/dist/src/providers/anthropic.js.map +0 -1
- package/dist/src/providers/auth/__tests__/browser-flow.test.js.map +0 -1
- package/dist/src/providers/auth/__tests__/device-flow.test.js.map +0 -1
- package/dist/src/providers/auth/__tests__/gemini-oauth.test.js.map +0 -1
- package/dist/src/providers/auth/__tests__/grok-oauth.test.js.map +0 -1
- package/dist/src/providers/auth/__tests__/openai-oauth.test.js.map +0 -1
- package/dist/src/providers/auth/__tests__/token-store.test.js.map +0 -1
- package/dist/src/providers/auth/browser-flow.js.map +0 -1
- package/dist/src/providers/auth/device-flow.js.map +0 -1
- package/dist/src/providers/auth/gemini-oauth.js.map +0 -1
- package/dist/src/providers/auth/grok-oauth.js.map +0 -1
- package/dist/src/providers/auth/openai-oauth.js.map +0 -1
- package/dist/src/providers/auth/registry.js.map +0 -1
- package/dist/src/providers/auth/token-store.js.map +0 -1
- package/dist/src/providers/auth/types.js.map +0 -1
- package/dist/src/providers/capabilities.js.map +0 -1
- package/dist/src/providers/endpoints.js.map +0 -1
- package/dist/src/providers/errors.js.map +0 -1
- package/dist/src/providers/errors.test.js.map +0 -1
- package/dist/src/providers/gemini.js.map +0 -1
- package/dist/src/providers/gemini.test.js.map +0 -1
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/providers/keychain.js.map +0 -1
- package/dist/src/providers/keychain.test.js.map +0 -1
- package/dist/src/providers/mcp-vision-bridge.js.map +0 -1
- package/dist/src/providers/mcp-vision-bridge.test.js.map +0 -1
- package/dist/src/providers/ollama.js.map +0 -1
- package/dist/src/providers/ollama.test.js.map +0 -1
- package/dist/src/providers/openai-compatible.js.map +0 -1
- package/dist/src/providers/openai-compatible.test.js.map +0 -1
- package/dist/src/providers/openai.js.map +0 -1
- package/dist/src/providers/openai.test.js.map +0 -1
- package/dist/src/providers/patch-zod-schema.js.map +0 -1
- package/dist/src/providers/pricing.js.map +0 -1
- package/dist/src/providers/pricing.test.js.map +0 -1
- package/dist/src/providers/prompt-cache-key.spec.js.map +0 -1
- package/dist/src/providers/runtime-mock.spec.js.map +0 -1
- package/dist/src/providers/runtime.js.map +0 -1
- package/dist/src/providers/siliconflow-sse-repair.js.map +0 -1
- package/dist/src/providers/strategies/anthropic.strategy.js.map +0 -1
- package/dist/src/providers/strategies/base.strategy.js.map +0 -1
- package/dist/src/providers/strategies/deepseek.strategy.js.map +0 -1
- package/dist/src/providers/strategies/google.strategy.js.map +0 -1
- package/dist/src/providers/strategies/ollama.strategy.js.map +0 -1
- package/dist/src/providers/strategies/openai.strategy.js.map +0 -1
- package/dist/src/providers/strategies/registry.js.map +0 -1
- package/dist/src/providers/strategies/siliconflow.strategy.js.map +0 -1
- package/dist/src/providers/strategies/xai.strategy.js.map +0 -1
- package/dist/src/providers/stream-loop.js.map +0 -1
- package/dist/src/providers/types.js.map +0 -1
- package/dist/src/providers/vision-proxy.js.map +0 -1
- package/dist/src/providers/vision-proxy.test.js.map +0 -1
- package/dist/src/providers/wire-debug.js.map +0 -1
- package/dist/src/reporter/__tests__/acl-check.test.js.map +0 -1
- package/dist/src/reporter/__tests__/auto-fire.test.js.map +0 -1
- package/dist/src/reporter/__tests__/budget.test.js.map +0 -1
- package/dist/src/reporter/__tests__/handlers.test.js.map +0 -1
- package/dist/src/reporter/__tests__/query-router.test.js.map +0 -1
- package/dist/src/reporter/acl-check.js.map +0 -1
- package/dist/src/reporter/auto-fire.js.map +0 -1
- package/dist/src/reporter/budget.js.map +0 -1
- package/dist/src/reporter/handlers.js.map +0 -1
- package/dist/src/reporter/index.js.map +0 -1
- package/dist/src/reporter/query-router.js.map +0 -1
- package/dist/src/router/__tests__/step-router.test.js.map +0 -1
- package/dist/src/router/classifier/grammars.js.map +0 -1
- package/dist/src/router/classifier/index.js.map +0 -1
- package/dist/src/router/classifier/index.test.js.map +0 -1
- package/dist/src/router/classifier/regex.js.map +0 -1
- package/dist/src/router/classifier/regex.test.js.map +0 -1
- package/dist/src/router/classifier/tree-sitter.js.map +0 -1
- package/dist/src/router/classifier/tree-sitter.test.js.map +0 -1
- package/dist/src/router/cold.js.map +0 -1
- package/dist/src/router/cold.test.js.map +0 -1
- package/dist/src/router/decide.js.map +0 -1
- package/dist/src/router/decide.test.js.map +0 -1
- package/dist/src/router/health.js.map +0 -1
- package/dist/src/router/health.test.js.map +0 -1
- package/dist/src/router/provider-sentinel.js.map +0 -1
- package/dist/src/router/provider-sentinel.test.js.map +0 -1
- package/dist/src/router/role-override.test.js.map +0 -1
- package/dist/src/router/step-router.js.map +0 -1
- package/dist/src/router/store.js.map +0 -1
- package/dist/src/router/types.js.map +0 -1
- package/dist/src/router/warm.js.map +0 -1
- package/dist/src/router/warm.test.js.map +0 -1
- package/dist/src/scaffold/__tests__/continuation-prompt.test.js.map +0 -1
- package/dist/src/scaffold/__tests__/continue-as-council.spec.js.map +0 -1
- package/dist/src/scaffold/__tests__/dotnet-assembly-name.test.js.map +0 -1
- package/dist/src/scaffold/__tests__/fe-scaffold-contents.test.js.map +0 -1
- package/dist/src/scaffold/__tests__/init-new.smoke.spec.js.map +0 -1
- package/dist/src/scaffold/__tests__/init-new.spec.js.map +0 -1
- package/dist/src/scaffold/__tests__/install-bb-templates.spec.js.map +0 -1
- package/dist/src/scaffold/__tests__/point-to-existing.spec.js.map +0 -1
- package/dist/src/scaffold/bb-ecosystem-apply.js.map +0 -1
- package/dist/src/scaffold/bb-quality-gate.js.map +0 -1
- package/dist/src/scaffold/continuation-prompt.js.map +0 -1
- package/dist/src/scaffold/continue-as-council.js.map +0 -1
- package/dist/src/scaffold/init-new.js.map +0 -1
- package/dist/src/scaffold/point-to-existing.js.map +0 -1
- package/dist/src/scaffold/resume-from-gate-failures.js.map +0 -1
- package/dist/src/self-qa/__tests__/agentic-context.test.js.map +0 -1
- package/dist/src/self-qa/__tests__/agentic-loop.test.js.map +0 -1
- package/dist/src/self-qa/__tests__/delta-encoder.test.js.map +0 -1
- package/dist/src/self-qa/__tests__/judge.test.js.map +0 -1
- package/dist/src/self-qa/__tests__/scenario-planner.test.js.map +0 -1
- package/dist/src/self-qa/__tests__/spec-emitter.test.js.map +0 -1
- package/dist/src/self-qa/agentic-context.js.map +0 -1
- package/dist/src/self-qa/agentic-loop.js.map +0 -1
- package/dist/src/self-qa/delta-encoder.js.map +0 -1
- package/dist/src/self-qa/index.js.map +0 -1
- package/dist/src/self-qa/judge.js.map +0 -1
- package/dist/src/self-qa/orchestrator.js.map +0 -1
- package/dist/src/self-qa/scenario-planner.js.map +0 -1
- package/dist/src/self-qa/spec-emitter.js.map +0 -1
- package/dist/src/self-qa/types.js.map +0 -1
- package/dist/src/storage/__tests__/migrations.test.js.map +0 -1
- package/dist/src/storage/__tests__/sweep-stale-pending.test.js.map +0 -1
- package/dist/src/storage/__tests__/ui-interaction-log.test.js.map +0 -1
- package/dist/src/storage/atomic-io.js.map +0 -1
- package/dist/src/storage/atomic-io.test.js.map +0 -1
- package/dist/src/storage/config.js.map +0 -1
- package/dist/src/storage/config.test.js.map +0 -1
- package/dist/src/storage/db.js.map +0 -1
- package/dist/src/storage/index.js.map +0 -1
- package/dist/src/storage/interaction-log.js.map +0 -1
- package/dist/src/storage/migrations.js.map +0 -1
- package/dist/src/storage/session-dir.js.map +0 -1
- package/dist/src/storage/sessions.js.map +0 -1
- package/dist/src/storage/tool-results.js.map +0 -1
- package/dist/src/storage/transcript-response-entry.test.js.map +0 -1
- package/dist/src/storage/transcript-view.js.map +0 -1
- package/dist/src/storage/transcript.js.map +0 -1
- package/dist/src/storage/transcript.test.js.map +0 -1
- package/dist/src/storage/ui-interaction-log.js.map +0 -1
- package/dist/src/storage/usage-cap.js.map +0 -1
- package/dist/src/storage/usage-cap.test.js.map +0 -1
- package/dist/src/storage/usage.js.map +0 -1
- package/dist/src/storage/workspaces.js.map +0 -1
- package/dist/src/tools/__tests__/vision-gate.test.js.map +0 -1
- package/dist/src/tools/bash-output-cache.js.map +0 -1
- package/dist/src/tools/bash-output-cache.test.js.map +0 -1
- package/dist/src/tools/bash-output-integration.test.js.map +0 -1
- package/dist/src/tools/bash.js.map +0 -1
- package/dist/src/tools/bash.test.js.map +0 -1
- package/dist/src/tools/computer.js.map +0 -1
- package/dist/src/tools/computer.test.js.map +0 -1
- package/dist/src/tools/file-tracker.js.map +0 -1
- package/dist/src/tools/file-tracker.test.js.map +0 -1
- package/dist/src/tools/file.js.map +0 -1
- package/dist/src/tools/file.test.js.map +0 -1
- package/dist/src/tools/grep.js.map +0 -1
- package/dist/src/tools/registry-bash-empty-command.test.js.map +0 -1
- package/dist/src/tools/registry-bash-footer.test.js.map +0 -1
- package/dist/src/tools/registry-ee-query.test.js.map +0 -1
- package/dist/src/tools/registry-session-repeat.test.js.map +0 -1
- package/dist/src/tools/registry.js.map +0 -1
- package/dist/src/tools/registry.test.js.map +0 -1
- package/dist/src/tools/schedule.js.map +0 -1
- package/dist/src/tools/schedule.test.js.map +0 -1
- package/dist/src/tools/todo-write-snapshot.js.map +0 -1
- package/dist/src/tools/todo-write-snapshot.test.js.map +0 -1
- package/dist/src/tools/vision-gate.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/ui/__tests__/picker-providers.test.js.map +0 -1
- package/dist/src/ui/agents-modal.js.map +0 -1
- package/dist/src/ui/app.js.map +0 -1
- package/dist/src/ui/cards/__tests__/product-status-card.test.js.map +0 -1
- package/dist/src/ui/cards/product-status-card.js.map +0 -1
- package/dist/src/ui/components/SuggestionOverlay.js.map +0 -1
- package/dist/src/ui/components/Toast.js.map +0 -1
- package/dist/src/ui/components/__tests__/council-leader-bubble.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/council-message-bubble.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/council-phase-timeline.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/council-placeholder-bubble.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/council-question-card.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/council-synthesis-banner.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/task-list-panel.test.js.map +0 -1
- package/dist/src/ui/components/__tests__/use-pair-quote-buffer.test.js.map +0 -1
- package/dist/src/ui/components/btw-overlay.js.map +0 -1
- package/dist/src/ui/components/bubble-layout.js.map +0 -1
- package/dist/src/ui/components/code-block-truncate.js.map +0 -1
- package/dist/src/ui/components/copy-flash-banner.js.map +0 -1
- package/dist/src/ui/components/council-info-card.js.map +0 -1
- package/dist/src/ui/components/council-leader-bubble.js.map +0 -1
- package/dist/src/ui/components/council-message-bubble.js.map +0 -1
- package/dist/src/ui/components/council-phase-timeline.js.map +0 -1
- package/dist/src/ui/components/council-placeholder-bubble.js.map +0 -1
- package/dist/src/ui/components/council-question-card.js.map +0 -1
- package/dist/src/ui/components/council-status-list.js.map +0 -1
- package/dist/src/ui/components/council-synthesis-banner.js.map +0 -1
- package/dist/src/ui/components/diff-view.js.map +0 -1
- package/dist/src/ui/components/halt-recovery-card.js.map +0 -1
- package/dist/src/ui/components/hero-logo.js.map +0 -1
- package/dist/src/ui/components/init-new-form-card.js.map +0 -1
- package/dist/src/ui/components/lsp-views.js.map +0 -1
- package/dist/src/ui/components/media-views.js.map +0 -1
- package/dist/src/ui/components/message-view.js.map +0 -1
- package/dist/src/ui/components/point-to-existing-form-card.js.map +0 -1
- package/dist/src/ui/components/prompt-box.js.map +0 -1
- package/dist/src/ui/components/role-palette.js.map +0 -1
- package/dist/src/ui/components/session-header.js.map +0 -1
- package/dist/src/ui/components/slash-inline-menu.js.map +0 -1
- package/dist/src/ui/components/structured-response-view.js.map +0 -1
- package/dist/src/ui/components/task-list-panel.js.map +0 -1
- package/dist/src/ui/components/tool-group.js.map +0 -1
- package/dist/src/ui/components/tool-result-views.js.map +0 -1
- package/dist/src/ui/components/use-pair-quote-buffer.js.map +0 -1
- package/dist/src/ui/constants.js.map +0 -1
- package/dist/src/ui/hooks/use-agent-editor.js.map +0 -1
- package/dist/src/ui/hooks/use-mcp-editor.js.map +0 -1
- package/dist/src/ui/hooks/use-model-picker.js.map +0 -1
- package/dist/src/ui/hooks/useTypeahead.js.map +0 -1
- package/dist/src/ui/markdown.js.map +0 -1
- package/dist/src/ui/mcp-modal-types.js.map +0 -1
- package/dist/src/ui/mcp-modal.js.map +0 -1
- package/dist/src/ui/modals/api-key-modal.js.map +0 -1
- package/dist/src/ui/modals/connect-modal.js.map +0 -1
- package/dist/src/ui/modals/model-picker-modal.js.map +0 -1
- package/dist/src/ui/modals/sandbox-picker-modal.js.map +0 -1
- package/dist/src/ui/modals/update-modal.js.map +0 -1
- package/dist/src/ui/modals/wallet-picker-modal.js.map +0 -1
- package/dist/src/ui/picker-providers.js.map +0 -1
- package/dist/src/ui/plan.js.map +0 -1
- package/dist/src/ui/schedule-modal.js.map +0 -1
- package/dist/src/ui/slash/__tests__/clear.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/compact.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/cost.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/discuss.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/execute.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/expand.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/ideal.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/menu-parity.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/optimize.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/pin.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/plan.test.js.map +0 -1
- package/dist/src/ui/slash/__tests__/status-render.test.js.map +0 -1
- package/dist/src/ui/slash/clear.js.map +0 -1
- package/dist/src/ui/slash/compact.js.map +0 -1
- package/dist/src/ui/slash/cost.js.map +0 -1
- package/dist/src/ui/slash/council-inspect.js.map +0 -1
- package/dist/src/ui/slash/council.js.map +0 -1
- package/dist/src/ui/slash/debug.js.map +0 -1
- package/dist/src/ui/slash/discuss.js.map +0 -1
- package/dist/src/ui/slash/ee.js.map +0 -1
- package/dist/src/ui/slash/execute.js.map +0 -1
- package/dist/src/ui/slash/expand.js.map +0 -1
- package/dist/src/ui/slash/export.js.map +0 -1
- package/dist/src/ui/slash/ideal.js.map +0 -1
- package/dist/src/ui/slash/menu-items.js.map +0 -1
- package/dist/src/ui/slash/optimize.js.map +0 -1
- package/dist/src/ui/slash/pin.js.map +0 -1
- package/dist/src/ui/slash/plan.js.map +0 -1
- package/dist/src/ui/slash/registry.js.map +0 -1
- package/dist/src/ui/slash/route.js.map +0 -1
- package/dist/src/ui/slash/route.test.js.map +0 -1
- package/dist/src/ui/slash/status.js.map +0 -1
- package/dist/src/ui/state/active-run.js.map +0 -1
- package/dist/src/ui/status-bar/index.js.map +0 -1
- package/dist/src/ui/status-bar/index.test.js.map +0 -1
- package/dist/src/ui/status-bar/store.js.map +0 -1
- package/dist/src/ui/status-bar/store.test.js.map +0 -1
- package/dist/src/ui/status-bar/tier-badge.js.map +0 -1
- package/dist/src/ui/status-bar/tier-badge.test.js.map +0 -1
- package/dist/src/ui/status-bar/usd-meter.js.map +0 -1
- package/dist/src/ui/status-bar/usd-meter.test.js.map +0 -1
- package/dist/src/ui/syntax-highlight.js.map +0 -1
- package/dist/src/ui/terminal-selection-text.js.map +0 -1
- package/dist/src/ui/theme.js.map +0 -1
- package/dist/src/ui/types.js.map +0 -1
- package/dist/src/ui/utils/__tests__/format.test.js.map +0 -1
- package/dist/src/ui/utils/__tests__/tools.test.js.map +0 -1
- package/dist/src/ui/utils/color.js.map +0 -1
- package/dist/src/ui/utils/format.js.map +0 -1
- package/dist/src/ui/utils/modal.js.map +0 -1
- package/dist/src/ui/utils/text.js.map +0 -1
- package/dist/src/ui/utils/tools.js.map +0 -1
- package/dist/src/usage/__tests__/product-ledger.test.js.map +0 -1
- package/dist/src/usage/cost-log.js.map +0 -1
- package/dist/src/usage/decision-log.js.map +0 -1
- package/dist/src/usage/downgrade.js.map +0 -1
- package/dist/src/usage/downgrade.test.js.map +0 -1
- package/dist/src/usage/estimator.js.map +0 -1
- package/dist/src/usage/estimator.test.js.map +0 -1
- package/dist/src/usage/ledger.js.map +0 -1
- package/dist/src/usage/ledger.test.js.map +0 -1
- package/dist/src/usage/midstream.js.map +0 -1
- package/dist/src/usage/midstream.test.js.map +0 -1
- package/dist/src/usage/product-ledger.js.map +0 -1
- package/dist/src/usage/thresholds.js.map +0 -1
- package/dist/src/usage/thresholds.test.js.map +0 -1
- package/dist/src/usage/types.js.map +0 -1
- package/dist/src/utils/__tests__/auto-council-settings.test.js.map +0 -1
- package/dist/src/utils/__tests__/ee-logger.test.js.map +0 -1
- package/dist/src/utils/__tests__/file-lock.test.js.map +0 -1
- package/dist/src/utils/__tests__/llm-deadline.test.js.map +0 -1
- package/dist/src/utils/__tests__/rate-limit.test.js.map +0 -1
- package/dist/src/utils/__tests__/settings-disabled-models.test.js.map +0 -1
- package/dist/src/utils/__tests__/settings-web-research.test.js.map +0 -1
- package/dist/src/utils/__tests__/slugify.test.js.map +0 -1
- package/dist/src/utils/__tests__/visible-retry.test.js.map +0 -1
- package/dist/src/utils/at-mentions.js.map +0 -1
- package/dist/src/utils/clipboard-image.js.map +0 -1
- package/dist/src/utils/ee-logger.js.map +0 -1
- package/dist/src/utils/file-index.js.map +0 -1
- package/dist/src/utils/file-lock.js.map +0 -1
- package/dist/src/utils/git-root.js.map +0 -1
- package/dist/src/utils/host-clipboard.js.map +0 -1
- package/dist/src/utils/install-manager.js.map +0 -1
- package/dist/src/utils/install-manager.test.js.map +0 -1
- package/dist/src/utils/instructions.js.map +0 -1
- package/dist/src/utils/instructions.test.js.map +0 -1
- package/dist/src/utils/llm-deadline.js.map +0 -1
- package/dist/src/utils/permission-mode.js.map +0 -1
- package/dist/src/utils/permission-mode.test.js.map +0 -1
- package/dist/src/utils/rate-limit.js.map +0 -1
- package/dist/src/utils/redactor.js.map +0 -1
- package/dist/src/utils/redactor.test.js.map +0 -1
- package/dist/src/utils/settings.js.map +0 -1
- package/dist/src/utils/settings.test.js.map +0 -1
- package/dist/src/utils/shell.js.map +0 -1
- package/dist/src/utils/shell.test.js.map +0 -1
- package/dist/src/utils/side-question.js.map +0 -1
- package/dist/src/utils/skills.js.map +0 -1
- package/dist/src/utils/skills.test.js.map +0 -1
- package/dist/src/utils/slugify.js.map +0 -1
- package/dist/src/utils/subagent-display.js.map +0 -1
- package/dist/src/utils/subagent-display.test.js.map +0 -1
- package/dist/src/utils/subagents-settings.test.js.map +0 -1
- package/dist/src/utils/telegram-audio-settings.test.js.map +0 -1
- package/dist/src/utils/update-checker.js.map +0 -1
- package/dist/src/utils/update-checker.test.js.map +0 -1
- package/dist/src/utils/visible-retry.js.map +0 -1
- package/dist/src/verify/__tests__/coverage-parsers.test.js.map +0 -1
- package/dist/src/verify/__tests__/dotnet-recipe.test.js.map +0 -1
- package/dist/src/verify/checkpoint.js.map +0 -1
- package/dist/src/verify/checkpoint.test.js.map +0 -1
- package/dist/src/verify/coverage-parsers.js.map +0 -1
- package/dist/src/verify/entrypoint.js.map +0 -1
- package/dist/src/verify/entrypoint.test.js.map +0 -1
- package/dist/src/verify/environment.js.map +0 -1
- package/dist/src/verify/environment.test.js.map +0 -1
- package/dist/src/verify/evidence.js.map +0 -1
- package/dist/src/verify/orchestrator.js.map +0 -1
- package/dist/src/verify/orchestrator.test.js.map +0 -1
- package/dist/src/verify/recipes.js.map +0 -1
- package/dist/src/verify/retry.js.map +0 -1
- package/dist/src/verify/runtime-prep.test.js.map +0 -1
- package/src/__test-helpers__/catalog-fixtures.ts +0 -57
- package/src/__test-stubs__/ee-server.ts +0 -173
- package/src/__test-stubs__/vitest-setup.ts +0 -36
- package/src/__tests__/council/bubble-layout.test.ts +0 -45
- package/src/__tests__/council/code-block-truncate.test.ts +0 -50
- package/src/__tests__/council/role-palette.test.ts +0 -66
- package/src/__tests__/first-run-wizard.test.ts +0 -9
- package/src/agent-harness/__tests__/cli-flags.spec.ts +0 -35
- package/src/agent-harness/__tests__/driver.spec.ts +0 -154
- package/src/agent-harness/__tests__/idle.spec.ts +0 -90
- package/src/agent-harness/__tests__/mock-llm.spec.ts +0 -126
- package/src/agent-harness/__tests__/mock-model.spec.ts +0 -195
- package/src/agent-harness/__tests__/predicate.spec.ts +0 -33
- package/src/agent-harness/__tests__/protocol.spec.ts +0 -62
- package/src/agent-harness/__tests__/schema.spec.ts +0 -81
- package/src/agent-harness/__tests__/selector.spec.ts +0 -82
- package/src/agent-harness/__tests__/sidechannel.spec.ts +0 -40
- package/src/agent-harness/__tests__/spec-helpers.spec.ts +0 -76
- package/src/agent-harness/index.ts +0 -24
- package/src/agent-harness/mock-model.ts +0 -445
- package/src/agent-harness/test-spawn.ts +0 -221
- package/src/billing/index.ts +0 -5
- package/src/bun-sqlite.d.ts +0 -15
- package/src/chat/__tests__/broadcast-bus.test.ts +0 -90
- package/src/chat/__tests__/channel-manager.test.ts +0 -149
- package/src/chat/__tests__/client.test.ts +0 -118
- package/src/chat/__tests__/discord-integration.test.ts +0 -162
- package/src/chat/__tests__/intent-prompt.test.ts +0 -92
- package/src/chat/__tests__/verdict-resolver.test.ts +0 -336
- package/src/chat/broadcast-bus.ts +0 -53
- package/src/chat/channel-manager.ts +0 -146
- package/src/chat/chat-keychain.ts +0 -137
- package/src/chat/factory.ts +0 -37
- package/src/chat/intent-prompt.ts +0 -72
- package/src/chat/providers/discord/client.ts +0 -91
- package/src/chat/types.ts +0 -42
- package/src/chat/verdict-constants.ts +0 -26
- package/src/chat/verdict-resolver.ts +0 -231
- package/src/cli/__tests__/bw-vault.test.ts +0 -97
- package/src/cli/__tests__/keys-bundle.test.ts +0 -46
- package/src/cli/__tests__/share-cmd.test.ts +0 -197
- package/src/cli/bw-vault.ts +0 -184
- package/src/cli/config/__tests__/model-picker.test.ts +0 -59
- package/src/cli/config/__tests__/provider-fetch.test.ts +0 -38
- package/src/cli/config/index.ts +0 -112
- package/src/cli/config/model-picker.ts +0 -193
- package/src/cli/config/provider-fetch.ts +0 -75
- package/src/cli/config/screen-council.ts +0 -245
- package/src/cli/config/screen-models.ts +0 -104
- package/src/cli/config/screen-providers.ts +0 -197
- package/src/cli/config/tui.ts +0 -153
- package/src/cli/cost-forensics.test.ts +0 -273
- package/src/cli/cost-forensics.ts +0 -337
- package/src/cli/keys-bundle.ts +0 -91
- package/src/cli/keys.test.ts +0 -104
- package/src/cli/keys.ts +0 -816
- package/src/cli/pil-report.ts +0 -202
- package/src/cli/reporter-cmd.ts +0 -154
- package/src/cli/share-cmd.ts +0 -132
- package/src/cli/usage-report.ts +0 -398
- package/src/cloud/index.ts +0 -5
- package/src/council/__tests__/accounting.test.ts +0 -72
- package/src/council/__tests__/audit-replay.test.ts +0 -344
- package/src/council/__tests__/clarifier-max-rounds.test.ts +0 -90
- package/src/council/__tests__/clarifier-options.test.ts +0 -63
- package/src/council/__tests__/clarifier-ready-gate.test.ts +0 -268
- package/src/council/__tests__/cost-aware.test.ts +0 -60
- package/src/council/__tests__/debate-planner-structured.test.ts +0 -236
- package/src/council/__tests__/decisions-lock.test.ts +0 -404
- package/src/council/__tests__/evaluator-metrics.test.ts +0 -513
- package/src/council/__tests__/parse-outcome-fallback.test.ts +0 -125
- package/src/council/__tests__/research-tools.test.ts +0 -239
- package/src/council/__tests__/round-tools.test.ts +0 -334
- package/src/council/__tests__/tool-trace.test.ts +0 -152
- package/src/council/__tests__/types-contract.test.ts +0 -88
- package/src/council/clarifier.ts +0 -507
- package/src/council/context.ts +0 -249
- package/src/council/debate-planner.ts +0 -303
- package/src/council/debate.ts +0 -1179
- package/src/council/decisions-lock.ts +0 -312
- package/src/council/executor.ts +0 -27
- package/src/council/index.ts +0 -956
- package/src/council/leader.ts +0 -281
- package/src/council/llm.ts +0 -939
- package/src/council/phase-events.ts +0 -64
- package/src/council/planner.ts +0 -303
- package/src/council/preflight.ts +0 -86
- package/src/council/prompts.ts +0 -698
- package/src/council/types.ts +0 -304
- package/src/daemon/scheduler.test.ts +0 -128
- package/src/daemon/scheduler.ts +0 -152
- package/src/ee/.gitkeep +0 -0
- package/src/ee/__tests__/bb-design.test.ts +0 -223
- package/src/ee/__tests__/export-transcripts.test.ts +0 -222
- package/src/ee/__tests__/pil-context-bridge.test.ts +0 -59
- package/src/ee/__tests__/pipeline.integration.test.ts +0 -193
- package/src/ee/__tests__/recall-format.test.ts +0 -66
- package/src/ee/__tests__/recall-ledger.test.ts +0 -55
- package/src/ee/__tests__/render-sink-wiring.test.ts +0 -89
- package/src/ee/auth.test.ts +0 -76
- package/src/ee/auth.ts +0 -80
- package/src/ee/bb-design.ts +0 -284
- package/src/ee/bb-retrieval.ts +0 -467
- package/src/ee/bridge.test.ts +0 -283
- package/src/ee/bridge.ts +0 -443
- package/src/ee/client-mode.ts +0 -161
- package/src/ee/client.test.ts +0 -201
- package/src/ee/client.ts +0 -683
- package/src/ee/council-bridge.ts +0 -89
- package/src/ee/embedding-cache.ts +0 -42
- package/src/ee/export-transcripts.ts +0 -160
- package/src/ee/extract-session.test.ts +0 -231
- package/src/ee/extract-session.ts +0 -71
- package/src/ee/health.ts +0 -83
- package/src/ee/index.ts +0 -33
- package/src/ee/intercept.test.ts +0 -197
- package/src/ee/intercept.ts +0 -168
- package/src/ee/judge.test.ts +0 -213
- package/src/ee/judge.ts +0 -126
- package/src/ee/mistake-detector.test.ts +0 -252
- package/src/ee/mistake-detector.ts +0 -297
- package/src/ee/offline-queue.test.ts +0 -302
- package/src/ee/offline-queue.ts +0 -205
- package/src/ee/phase-outcome.test.ts +0 -107
- package/src/ee/phase-outcome.ts +0 -165
- package/src/ee/phase-tracker.test.ts +0 -175
- package/src/ee/phase-tracker.ts +0 -180
- package/src/ee/posttool.test.ts +0 -81
- package/src/ee/posttool.ts +0 -16
- package/src/ee/prompt-stale.test.ts +0 -92
- package/src/ee/prompt-stale.ts +0 -39
- package/src/ee/recall-ledger.ts +0 -71
- package/src/ee/recall-mirror.test.ts +0 -74
- package/src/ee/render.test.ts +0 -74
- package/src/ee/render.ts +0 -68
- package/src/ee/scope.test.ts +0 -112
- package/src/ee/scope.ts +0 -93
- package/src/ee/search.ts +0 -259
- package/src/ee/session-trajectory.test.ts +0 -139
- package/src/ee/session-trajectory.ts +0 -226
- package/src/ee/tenant.ts +0 -14
- package/src/ee/touch.test.ts +0 -73
- package/src/ee/transcript-emit.ts +0 -174
- package/src/ee/types.ts +0 -432
- package/src/flow/.gitkeep +0 -0
- package/src/flow/__tests__/migration.test.ts +0 -133
- package/src/flow/__tests__/parser.test.ts +0 -77
- package/src/flow/__tests__/run-manager-product.test.ts +0 -59
- package/src/flow/__tests__/run-manager.test.ts +0 -95
- package/src/flow/__tests__/scaffold-checkpoint.test.ts +0 -113
- package/src/flow/__tests__/scaffold.test.ts +0 -57
- package/src/flow/__tests__/warning-persist.test.ts +0 -112
- package/src/flow/artifact-io.ts +0 -41
- package/src/flow/compaction/__tests__/compress.test.ts +0 -69
- package/src/flow/compaction/__tests__/extract.test.ts +0 -74
- package/src/flow/compaction/__tests__/preserve.test.ts +0 -69
- package/src/flow/compaction/compress.ts +0 -67
- package/src/flow/compaction/extract.ts +0 -60
- package/src/flow/compaction/index.ts +0 -86
- package/src/flow/compaction/preserve.ts +0 -48
- package/src/flow/index.ts +0 -18
- package/src/flow/migration.ts +0 -139
- package/src/flow/parser.ts +0 -78
- package/src/flow/run-manager.ts +0 -162
- package/src/flow/scaffold-checkpoint.ts +0 -132
- package/src/flow/scaffold.ts +0 -52
- package/src/flow/warning-persist.ts +0 -84
- package/src/generated/version.ts +0 -5
- package/src/gsd/.gitkeep +0 -0
- package/src/gsd/__tests__/complexity.test.ts +0 -0
- package/src/gsd/__tests__/directives.test.ts +0 -88
- package/src/gsd/__tests__/gray-areas.test.ts +0 -33
- package/src/gsd/__tests__/types.test.ts +0 -91
- package/src/gsd/complexity.ts +0 -124
- package/src/gsd/directives.ts +0 -141
- package/src/gsd/gray-areas.ts +0 -144
- package/src/gsd/index.ts +0 -1
- package/src/gsd/types.ts +0 -63
- package/src/headless/__tests__/council-answers.test.ts +0 -300
- package/src/headless/council-answers.ts +0 -152
- package/src/headless/output.test.ts +0 -201
- package/src/headless/output.ts +0 -312
- package/src/hooks/config.ts +0 -41
- package/src/hooks/index.ts +0 -569
- package/src/hooks/types.ts +0 -263
- package/src/index.ts +0 -1762
- package/src/lsp/builtins.test.ts +0 -129
- package/src/lsp/builtins.ts +0 -453
- package/src/lsp/client.ts +0 -342
- package/src/lsp/manager.test.ts +0 -198
- package/src/lsp/manager.ts +0 -343
- package/src/lsp/npm-cache.test.ts +0 -70
- package/src/lsp/npm-cache.ts +0 -111
- package/src/lsp/runtime.ts +0 -70
- package/src/lsp/smoke.test.ts +0 -74
- package/src/lsp/types.ts +0 -119
- package/src/maintain/__tests__/codebase-intel.test.ts +0 -320
- package/src/maintain/__tests__/gh-create-pr.test.ts +0 -195
- package/src/maintain/__tests__/pr-builder.test.ts +0 -282
- package/src/maintain/__tests__/repo-map.test.ts +0 -128
- package/src/maintain/__tests__/task-runner.test.ts +0 -347
- package/src/maintain/codebase-intel.ts +0 -595
- package/src/maintain/gh-create-pr.ts +0 -148
- package/src/maintain/index.ts +0 -14
- package/src/maintain/pr-builder.ts +0 -373
- package/src/maintain/repo-map.ts +0 -205
- package/src/maintain/task-runner.ts +0 -481
- package/src/maintain/types.ts +0 -49
- package/src/mcp/__tests__/auto-setup.test.ts +0 -88
- package/src/mcp/__tests__/cap-tool-result.test.ts +0 -65
- package/src/mcp/__tests__/ee-tools.test.ts +0 -248
- package/src/mcp/__tests__/forensics-tools.test.ts +0 -66
- package/src/mcp/__tests__/harness-driver-action-tools.spec.ts +0 -116
- package/src/mcp/__tests__/harness-driver-async-tools.spec.ts +0 -129
- package/src/mcp/__tests__/harness-driver-read-tools.spec.ts +0 -140
- package/src/mcp/__tests__/harness-driver-security.spec.ts +0 -69
- package/src/mcp/__tests__/harness-driver.spec.ts +0 -21
- package/src/mcp/__tests__/lazy-schema.spec.ts +0 -173
- package/src/mcp/__tests__/lsp-tools.test.ts +0 -72
- package/src/mcp/__tests__/mcp-keychain.test.ts +0 -46
- package/src/mcp/__tests__/research-onboarding.test.ts +0 -163
- package/src/mcp/__tests__/runtime-hydration.test.ts +0 -86
- package/src/mcp/__tests__/runtime-output-cap.test.ts +0 -49
- package/src/mcp/__tests__/runtime-sanitize.test.ts +0 -44
- package/src/mcp/__tests__/self-verify-jobs.test.ts +0 -102
- package/src/mcp/__tests__/smart-filter.test.ts +0 -139
- package/src/mcp/__tests__/tools-server.smoke.test.ts +0 -41
- package/src/mcp/auto-setup.ts +0 -99
- package/src/mcp/cap-tool-result.ts +0 -68
- package/src/mcp/catalog.ts +0 -155
- package/src/mcp/ee-tools.ts +0 -204
- package/src/mcp/forensics-tools.ts +0 -65
- package/src/mcp/lsp-tools.ts +0 -78
- package/src/mcp/mcp-keychain.ts +0 -85
- package/src/mcp/oauth-callback.ts +0 -75
- package/src/mcp/oauth-provider.ts +0 -128
- package/src/mcp/opentui-spawn.ts +0 -64
- package/src/mcp/parse-headers.test.ts +0 -54
- package/src/mcp/parse-headers.ts +0 -35
- package/src/mcp/research-onboarding.ts +0 -143
- package/src/mcp/runtime.ts +0 -182
- package/src/mcp/self-verify-jobs.ts +0 -137
- package/src/mcp/smart-filter.ts +0 -138
- package/src/mcp/smoke.test.ts +0 -170
- package/src/mcp/tools-server.ts +0 -174
- package/src/mcp/validate.ts +0 -48
- package/src/models/__tests__/registry.test.ts +0 -95
- package/src/models/catalog-client.ts +0 -234
- package/src/models/catalog-gemini.test.ts +0 -52
- package/src/models/catalog-url.test.ts +0 -27
- package/src/models/catalog-validation.test.ts +0 -74
- package/src/models/catalog.README.md +0 -136
- package/src/models/catalog.json +0 -349
- package/src/models/classify-tier.ts +0 -48
- package/src/models/index.ts +0 -9
- package/src/models/registry.ts +0 -87
- package/src/ops/__tests__/doctor-council-mcp.test.ts +0 -161
- package/src/ops/__tests__/doctor-ee-health.test.ts +0 -129
- package/src/ops/bug-report.test.ts +0 -172
- package/src/ops/bug-report.ts +0 -80
- package/src/ops/doctor.test.ts +0 -108
- package/src/ops/doctor.ts +0 -366
- package/src/orchestrator/__tests__/agent-base-url-switch.test.ts +0 -87
- package/src/orchestrator/__tests__/batch-turn-runner.test.ts +0 -186
- package/src/orchestrator/__tests__/council-manager.test.ts +0 -171
- package/src/orchestrator/__tests__/cross-turn-dedup.test.ts +0 -201
- package/src/orchestrator/__tests__/current-call-id.test.ts +0 -160
- package/src/orchestrator/__tests__/error-forensics.test.ts +0 -99
- package/src/orchestrator/__tests__/flow-resume.test.ts +0 -71
- package/src/orchestrator/__tests__/humanize-api-error.test.ts +0 -74
- package/src/orchestrator/__tests__/message-processor.test.ts +0 -201
- package/src/orchestrator/__tests__/message-write-ahead.test.ts +0 -170
- package/src/orchestrator/__tests__/read-path-budget.test.ts +0 -170
- package/src/orchestrator/__tests__/retry-classifier.test.ts +0 -131
- package/src/orchestrator/__tests__/retry-stream.test.ts +0 -186
- package/src/orchestrator/__tests__/route-feedback.test.ts +0 -55
- package/src/orchestrator/__tests__/stream-runner.test.ts +0 -201
- package/src/orchestrator/__tests__/sub-agent-model-tier.test.ts +0 -53
- package/src/orchestrator/__tests__/usage-events-shape.test.ts +0 -80
- package/src/orchestrator/__tests__/usage-normalizer-c1.test.ts +0 -172
- package/src/orchestrator/__tests__/usage-shape-threading.test.ts +0 -111
- package/src/orchestrator/__tests__/write-ahead.test.ts +0 -162
- package/src/orchestrator/abort.test.ts +0 -37
- package/src/orchestrator/abort.ts +0 -51
- package/src/orchestrator/agent-options.ts +0 -167
- package/src/orchestrator/agent.test.ts +0 -191
- package/src/orchestrator/batch-turn-runner.ts +0 -425
- package/src/orchestrator/batch-utils.ts +0 -340
- package/src/orchestrator/cleanup.test.ts +0 -86
- package/src/orchestrator/compaction.test.ts +0 -200
- package/src/orchestrator/compaction.ts +0 -626
- package/src/orchestrator/council-manager.ts +0 -572
- package/src/orchestrator/cross-turn-dedup.ts +0 -208
- package/src/orchestrator/delegations.test.ts +0 -145
- package/src/orchestrator/delegations.ts +0 -370
- package/src/orchestrator/error-utils.ts +0 -165
- package/src/orchestrator/flow-resume.ts +0 -54
- package/src/orchestrator/grounding-check.test.ts +0 -111
- package/src/orchestrator/grounding-check.ts +0 -138
- package/src/orchestrator/interrupted-turn.test.ts +0 -39
- package/src/orchestrator/interrupted-turn.ts +0 -27
- package/src/orchestrator/message-processor.ts +0 -3364
- package/src/orchestrator/message-seq.test.ts +0 -29
- package/src/orchestrator/message-seq.ts +0 -19
- package/src/orchestrator/orchestrator.ts +0 -2752
- package/src/orchestrator/pending-calls.test.ts +0 -226
- package/src/orchestrator/pending-calls.ts +0 -240
- package/src/orchestrator/prompts.ts +0 -579
- package/src/orchestrator/provider-options-shape.spec.ts +0 -67
- package/src/orchestrator/provider-options-shape.ts +0 -70
- package/src/orchestrator/read-path-budget.ts +0 -205
- package/src/orchestrator/reasoning.test.ts +0 -114
- package/src/orchestrator/reasoning.ts +0 -116
- package/src/orchestrator/repair-tool-call.ts +0 -54
- package/src/orchestrator/repetition-detector.test.ts +0 -127
- package/src/orchestrator/repetition-detector.ts +0 -140
- package/src/orchestrator/retry-classifier.ts +0 -140
- package/src/orchestrator/retry-stream.ts +0 -159
- package/src/orchestrator/sandbox.test.ts +0 -117
- package/src/orchestrator/scope-ceiling.test.ts +0 -215
- package/src/orchestrator/scope-ceiling.ts +0 -234
- package/src/orchestrator/scope-reminder.test.ts +0 -232
- package/src/orchestrator/scope-reminder.ts +0 -230
- package/src/orchestrator/stall-rescue.test.ts +0 -100
- package/src/orchestrator/stall-rescue.ts +0 -95
- package/src/orchestrator/stall-watchdog.test.ts +0 -83
- package/src/orchestrator/stall-watchdog.ts +0 -87
- package/src/orchestrator/stream-runner.ts +0 -939
- package/src/orchestrator/sub-agent-cap.test.ts +0 -227
- package/src/orchestrator/sub-agent-cap.ts +0 -240
- package/src/orchestrator/sub-agent-model-tier.ts +0 -58
- package/src/orchestrator/subagent-compactor.spec.ts +0 -332
- package/src/orchestrator/subagent-compactor.ts +0 -456
- package/src/orchestrator/text-tool-call-detector.test.ts +0 -99
- package/src/orchestrator/text-tool-call-detector.ts +0 -200
- package/src/orchestrator/token-counter.test.ts +0 -69
- package/src/orchestrator/token-counter.ts +0 -81
- package/src/orchestrator/tool-args-hash.test.ts +0 -121
- package/src/orchestrator/tool-args-hash.ts +0 -221
- package/src/orchestrator/tool-args-repair.test.ts +0 -156
- package/src/orchestrator/tool-args-repair.ts +0 -227
- package/src/orchestrator/tool-loop-cap.test.ts +0 -193
- package/src/orchestrator/tool-loop-cap.ts +0 -174
- package/src/orchestrator/tool-repetition-detector.test.ts +0 -119
- package/src/orchestrator/tool-repetition-detector.ts +0 -0
- package/src/orchestrator/tool-utils.ts +0 -214
- package/src/orchestrator/turn-runner-deps.ts +0 -85
- package/src/pil/__tests__/budget.test.ts +0 -39
- package/src/pil/__tests__/clarity-gate.test.ts +0 -299
- package/src/pil/__tests__/config.test.ts +0 -78
- package/src/pil/__tests__/discovery-cache.test.ts +0 -45
- package/src/pil/__tests__/discovery-types.test.ts +0 -68
- package/src/pil/__tests__/discovery.test.ts +0 -141
- package/src/pil/__tests__/dual-run.test.ts +0 -53
- package/src/pil/__tests__/layer1-intent-trace.test.ts +0 -142
- package/src/pil/__tests__/layer1-intent.test.ts +0 -365
- package/src/pil/__tests__/layer15-context-scan.test.ts +0 -76
- package/src/pil/__tests__/layer16-clarity.test.ts +0 -184
- package/src/pil/__tests__/layer17-feasibility.test.ts +0 -42
- package/src/pil/__tests__/layer18-acceptance.test.ts +0 -116
- package/src/pil/__tests__/layer2-personality.test.ts +0 -63
- package/src/pil/__tests__/layer3-ee-injection.test.ts +0 -189
- package/src/pil/__tests__/layer3-injected-chunk.test.ts +0 -122
- package/src/pil/__tests__/layer4-gsd.test.ts +0 -109
- package/src/pil/__tests__/layer5-context.test.ts +0 -157
- package/src/pil/__tests__/layer6-output.test.ts +0 -362
- package/src/pil/__tests__/llm-classify.test.ts +0 -140
- package/src/pil/__tests__/native-capabilities-workbook.test.ts +0 -45
- package/src/pil/__tests__/ollama-classify.test.ts +0 -81
- package/src/pil/__tests__/orchestrator-integration.test.ts +0 -107
- package/src/pil/__tests__/pipeline.test.ts +0 -191
- package/src/pil/__tests__/renderer-coverage.test.ts +0 -46
- package/src/pil/__tests__/response-tools.test.ts +0 -239
- package/src/pil/__tests__/schema.test.ts +0 -233
- package/src/pil/__tests__/scoreComplexity.test.ts +0 -134
- package/src/pil/__tests__/scoreSufficiency.test.ts +0 -104
- package/src/pil/__tests__/store.test.ts +0 -49
- package/src/pil/__tests__/task-tier-map.test.ts +0 -41
- package/src/pil/agent-operating-contract.test.ts +0 -84
- package/src/pil/agent-operating-contract.ts +0 -70
- package/src/pil/budget-log.ts +0 -86
- package/src/pil/budget.ts +0 -18
- package/src/pil/cheap-model-playbook.test.ts +0 -191
- package/src/pil/cheap-model-playbook.ts +0 -153
- package/src/pil/cheap-model-workbooks.test.ts +0 -154
- package/src/pil/cheap-model-workbooks.ts +0 -109
- package/src/pil/clarity-gate.ts +0 -188
- package/src/pil/config.ts +0 -25
- package/src/pil/discovery-cache.ts +0 -20
- package/src/pil/discovery-types.ts +0 -97
- package/src/pil/discovery.ts +0 -397
- package/src/pil/index.ts +0 -24
- package/src/pil/layer1-intent.test.ts +0 -520
- package/src/pil/layer1-intent.ts +0 -1236
- package/src/pil/layer15-context-scan.ts +0 -159
- package/src/pil/layer16-clarity.test.ts +0 -35
- package/src/pil/layer16-clarity.ts +0 -417
- package/src/pil/layer17-feasibility.ts +0 -40
- package/src/pil/layer18-acceptance.ts +0 -98
- package/src/pil/layer1_5-complexity-size.test.ts +0 -279
- package/src/pil/layer1_5-complexity-size.ts +0 -175
- package/src/pil/layer2-personality.ts +0 -46
- package/src/pil/layer3-ee-injection.ts +0 -406
- package/src/pil/layer4-gsd.ts +0 -124
- package/src/pil/layer5-context.ts +0 -171
- package/src/pil/layer6-output.ts +0 -364
- package/src/pil/llm-classify.ts +0 -199
- package/src/pil/native-capabilities-workbook.ts +0 -124
- package/src/pil/ollama-classify.ts +0 -49
- package/src/pil/pipeline.ts +0 -313
- package/src/pil/response-tools.ts +0 -187
- package/src/pil/schema.ts +0 -111
- package/src/pil/session-state.test.ts +0 -88
- package/src/pil/session-state.ts +0 -157
- package/src/pil/store.ts +0 -29
- package/src/pil/task-tier-map.ts +0 -97
- package/src/pil/timeout.ts +0 -10
- package/src/pil/types.ts +0 -168
- package/src/product-loop/__tests__/artifact-io.test.ts +0 -97
- package/src/product-loop/__tests__/assumption-ledger.test.ts +0 -292
- package/src/product-loop/__tests__/backlog-builder.test.ts +0 -200
- package/src/product-loop/__tests__/backlog-store.test.ts +0 -119
- package/src/product-loop/__tests__/cb2-retry-bonus.test.ts +0 -182
- package/src/product-loop/__tests__/circuit-breakers-coverage.test.ts +0 -82
- package/src/product-loop/__tests__/circuit-breakers.test.ts +0 -90
- package/src/product-loop/__tests__/complexity-routing.spec.ts +0 -315
- package/src/product-loop/__tests__/context-policy.test.ts +0 -280
- package/src/product-loop/__tests__/cost-preview.test.ts +0 -118
- package/src/product-loop/__tests__/cost-scoper.test.ts +0 -76
- package/src/product-loop/__tests__/cross-run-memory.test.ts +0 -195
- package/src/product-loop/__tests__/design-output.spec.ts +0 -39
- package/src/product-loop/__tests__/discover.test.ts +0 -98
- package/src/product-loop/__tests__/discovery-context-format.test.ts +0 -111
- package/src/product-loop/__tests__/discovery-council-runner.test.ts +0 -13
- package/src/product-loop/__tests__/discovery-detection.test.ts +0 -180
- package/src/product-loop/__tests__/discovery-ecosystem.test.ts +0 -246
- package/src/product-loop/__tests__/discovery-integration.test.ts +0 -133
- package/src/product-loop/__tests__/discovery-interview.test.ts +0 -305
- package/src/product-loop/__tests__/discovery-migrations.test.ts +0 -75
- package/src/product-loop/__tests__/discovery-persistence.test.ts +0 -171
- package/src/product-loop/__tests__/discovery-prompt-parser.test.ts +0 -77
- package/src/product-loop/__tests__/discovery-prompt-specificity.test.ts +0 -65
- package/src/product-loop/__tests__/discovery-recommender-ecosystem.test.ts +0 -192
- package/src/product-loop/__tests__/discovery-recommender.test.ts +0 -382
- package/src/product-loop/__tests__/discovery-schema.test.ts +0 -102
- package/src/product-loop/__tests__/done-gate-coverage.test.ts +0 -151
- package/src/product-loop/__tests__/done-gate.test.ts +0 -140
- package/src/product-loop/__tests__/ee-extract-wiring.test.ts +0 -222
- package/src/product-loop/__tests__/extract-to-ee.test.ts +0 -205
- package/src/product-loop/__tests__/feedback-routing.test.ts +0 -93
- package/src/product-loop/__tests__/gather-selectable-alts.test.ts +0 -119
- package/src/product-loop/__tests__/hot-path.spec.ts +0 -177
- package/src/product-loop/__tests__/integration.test.ts +0 -350
- package/src/product-loop/__tests__/loop-driver-audit.test.ts +0 -327
- package/src/product-loop/__tests__/loop-driver.test.ts +0 -253
- package/src/product-loop/__tests__/maintenance-task-synthesis.test.ts +0 -78
- package/src/product-loop/__tests__/phase-a1-a3-sprint-runner.test.ts +0 -315
- package/src/product-loop/__tests__/phase-a2-backlog-build.test.ts +0 -189
- package/src/product-loop/__tests__/phase-budget.test.ts +0 -172
- package/src/product-loop/__tests__/phase-orchestrator-integration.test.ts +0 -143
- package/src/product-loop/__tests__/phase-plan.test.ts +0 -241
- package/src/product-loop/__tests__/phase-rituals.test.ts +0 -205
- package/src/product-loop/__tests__/phase-runner.test.ts +0 -454
- package/src/product-loop/__tests__/phase-tracker-bridge.test.ts +0 -85
- package/src/product-loop/__tests__/pick-backend-stack.test.ts +0 -117
- package/src/product-loop/__tests__/product-identity.test.ts +0 -47
- package/src/product-loop/__tests__/progress-snapshot.test.ts +0 -180
- package/src/product-loop/__tests__/reality-anchor.test.ts +0 -58
- package/src/product-loop/__tests__/repo-audit.test.ts +0 -103
- package/src/product-loop/__tests__/repo-brief.test.ts +0 -155
- package/src/product-loop/__tests__/role-memory.test.ts +0 -70
- package/src/product-loop/__tests__/role-registry.test.ts +0 -235
- package/src/product-loop/__tests__/role-routing-ee.test.ts +0 -90
- package/src/product-loop/__tests__/route-decision-emit.test.ts +0 -258
- package/src/product-loop/__tests__/seed-questions.test.ts +0 -33
- package/src/product-loop/__tests__/ship-polish.test.ts +0 -109
- package/src/product-loop/__tests__/sprint-planner.test.ts +0 -166
- package/src/product-loop/__tests__/sprint-runner-backlog.test.ts +0 -248
- package/src/product-loop/__tests__/sprint-runner-emit.test.ts +0 -324
- package/src/product-loop/__tests__/sprint-runner-phase-chunks.test.ts +0 -220
- package/src/product-loop/__tests__/sprint-runner.test.ts +0 -501
- package/src/product-loop/__tests__/sprint-self-verify.test.ts +0 -77
- package/src/product-loop/__tests__/sprint-store.test.ts +0 -98
- package/src/product-loop/__tests__/stakeholder-acl.test.ts +0 -94
- package/src/product-loop/__tests__/state-md-ee-injections.test.ts +0 -229
- package/src/product-loop/__tests__/sufficiency-routing.spec.ts +0 -183
- package/src/product-loop/__tests__/typed-artifacts.test.ts +0 -259
- package/src/product-loop/__tests__/types.test.ts +0 -103
- package/src/product-loop/__tests__/verify-failure-threshold.test.ts +0 -178
- package/src/product-loop/__tests__/verify-failure-tracking.test.ts +0 -154
- package/src/product-loop/__tests__/verify-result.test.ts +0 -60
- package/src/product-loop/artifact-io.ts +0 -239
- package/src/product-loop/assumption-ledger.ts +0 -270
- package/src/product-loop/backlog-builder.ts +0 -253
- package/src/product-loop/backlog-store.ts +0 -62
- package/src/product-loop/circuit-breakers.ts +0 -76
- package/src/product-loop/context-policy.ts +0 -180
- package/src/product-loop/cost-preview.ts +0 -139
- package/src/product-loop/cost-scoper.ts +0 -49
- package/src/product-loop/cross-run-memory.ts +0 -450
- package/src/product-loop/design-output.ts +0 -24
- package/src/product-loop/discover.ts +0 -159
- package/src/product-loop/discovery-context-format.ts +0 -56
- package/src/product-loop/discovery-council-runner.ts +0 -78
- package/src/product-loop/discovery-detection.ts +0 -161
- package/src/product-loop/discovery-ecosystem.ts +0 -239
- package/src/product-loop/discovery-interview.ts +0 -288
- package/src/product-loop/discovery-migrations.ts +0 -40
- package/src/product-loop/discovery-persistence.ts +0 -219
- package/src/product-loop/discovery-prompt-parser.ts +0 -80
- package/src/product-loop/discovery-recommender.ts +0 -514
- package/src/product-loop/discovery-schema.ts +0 -143
- package/src/product-loop/done-gate.ts +0 -224
- package/src/product-loop/feedback-routing.ts +0 -82
- package/src/product-loop/gather.ts +0 -386
- package/src/product-loop/index.ts +0 -1855
- package/src/product-loop/loop-driver.ts +0 -900
- package/src/product-loop/phase-budget.ts +0 -182
- package/src/product-loop/phase-plan.ts +0 -158
- package/src/product-loop/phase-rituals.ts +0 -158
- package/src/product-loop/phase-runner.ts +0 -455
- package/src/product-loop/phase-tracker-bridge.ts +0 -60
- package/src/product-loop/product-identity.ts +0 -11
- package/src/product-loop/progress-snapshot.ts +0 -216
- package/src/product-loop/reality-anchor.ts +0 -45
- package/src/product-loop/repo-audit.ts +0 -314
- package/src/product-loop/repo-brief.ts +0 -235
- package/src/product-loop/role-memory.ts +0 -72
- package/src/product-loop/role-registry.ts +0 -175
- package/src/product-loop/seed-questions.ts +0 -51
- package/src/product-loop/ship-polish.ts +0 -164
- package/src/product-loop/sprint-planner.ts +0 -241
- package/src/product-loop/sprint-runner.ts +0 -801
- package/src/product-loop/sprint-self-verify.ts +0 -189
- package/src/product-loop/sprint-store.ts +0 -96
- package/src/product-loop/stakeholder-acl.ts +0 -82
- package/src/product-loop/typed-artifacts.ts +0 -332
- package/src/product-loop/types.ts +0 -570
- package/src/product-loop/verify-failure-tracking.ts +0 -225
- package/src/product-loop/verify-result.ts +0 -39
- package/src/providers/.gitkeep +0 -0
- package/src/providers/__test-utils__/load-fixture.ts +0 -36
- package/src/providers/__tests__/adapter-oauth-wiring.test.ts +0 -147
- package/src/providers/__tests__/capabilities-cosmetic.test.ts +0 -119
- package/src/providers/__tests__/capabilities-flags.test.ts +0 -166
- package/src/providers/__tests__/capabilities-provider-options.test.ts +0 -232
- package/src/providers/__tests__/capabilities-sanitize.test.ts +0 -66
- package/src/providers/__tests__/capabilities.test.ts +0 -44
- package/src/providers/__tests__/provider-coverage.test.ts +0 -48
- package/src/providers/__tests__/reasoning-roundtrip.test.ts +0 -150
- package/src/providers/__tests__/runtime-integration.test.ts +0 -106
- package/src/providers/__tests__/runtime.test.ts +0 -94
- package/src/providers/__tests__/siliconflow-sse-repair.test.ts +0 -300
- package/src/providers/__tests__/strategies-registry.test.ts +0 -55
- package/src/providers/__tests__/strategies-resolve.test.ts +0 -137
- package/src/providers/__tests__/wire-debug.test.ts +0 -42
- package/src/providers/adapter.test.ts +0 -21
- package/src/providers/adapter.ts +0 -156
- package/src/providers/anthropic.ts +0 -174
- package/src/providers/auth/__tests__/browser-flow.test.ts +0 -230
- package/src/providers/auth/__tests__/device-flow.test.ts +0 -263
- package/src/providers/auth/__tests__/gemini-oauth.test.ts +0 -387
- package/src/providers/auth/__tests__/grok-oauth.test.ts +0 -283
- package/src/providers/auth/__tests__/openai-oauth.test.ts +0 -378
- package/src/providers/auth/__tests__/token-store.test.ts +0 -152
- package/src/providers/auth/browser-flow.ts +0 -140
- package/src/providers/auth/device-flow.ts +0 -221
- package/src/providers/auth/gemini-oauth.ts +0 -351
- package/src/providers/auth/grok-oauth.ts +0 -406
- package/src/providers/auth/openai-oauth.ts +0 -455
- package/src/providers/auth/registry.ts +0 -138
- package/src/providers/auth/token-store.ts +0 -154
- package/src/providers/auth/types.ts +0 -111
- package/src/providers/capabilities.ts +0 -355
- package/src/providers/endpoints.ts +0 -68
- package/src/providers/errors.test.ts +0 -76
- package/src/providers/errors.ts +0 -46
- package/src/providers/gemini.test.ts +0 -46
- package/src/providers/gemini.ts +0 -42
- package/src/providers/index.ts +0 -28
- package/src/providers/keychain.test.ts +0 -100
- package/src/providers/keychain.ts +0 -278
- package/src/providers/mcp-vision-bridge.test.ts +0 -513
- package/src/providers/mcp-vision-bridge.ts +0 -1020
- package/src/providers/ollama.test.ts +0 -46
- package/src/providers/ollama.ts +0 -36
- package/src/providers/openai-compatible.test.ts +0 -63
- package/src/providers/openai-compatible.ts +0 -62
- package/src/providers/openai.test.ts +0 -65
- package/src/providers/openai.ts +0 -56
- package/src/providers/patch-zod-schema.ts +0 -126
- package/src/providers/pricing.test.ts +0 -97
- package/src/providers/pricing.ts +0 -128
- package/src/providers/prompt-cache-key.spec.ts +0 -28
- package/src/providers/runtime-mock.spec.ts +0 -86
- package/src/providers/runtime.ts +0 -311
- package/src/providers/siliconflow-sse-repair.ts +0 -201
- package/src/providers/strategies/anthropic.strategy.ts +0 -25
- package/src/providers/strategies/base.strategy.ts +0 -76
- package/src/providers/strategies/deepseek.strategy.ts +0 -55
- package/src/providers/strategies/google.strategy.ts +0 -28
- package/src/providers/strategies/ollama.strategy.ts +0 -22
- package/src/providers/strategies/openai.strategy.ts +0 -55
- package/src/providers/strategies/registry.ts +0 -43
- package/src/providers/strategies/siliconflow.strategy.ts +0 -28
- package/src/providers/strategies/xai.strategy.ts +0 -33
- package/src/providers/stream-loop.ts +0 -83
- package/src/providers/types.ts +0 -145
- package/src/providers/vision-proxy.test.ts +0 -252
- package/src/providers/vision-proxy.ts +0 -317
- package/src/providers/wire-debug.ts +0 -163
- package/src/reporter/__tests__/acl-check.test.ts +0 -71
- package/src/reporter/__tests__/auto-fire.test.ts +0 -161
- package/src/reporter/__tests__/budget.test.ts +0 -74
- package/src/reporter/__tests__/handlers.test.ts +0 -192
- package/src/reporter/__tests__/query-router.test.ts +0 -115
- package/src/reporter/acl-check.ts +0 -54
- package/src/reporter/auto-fire.ts +0 -168
- package/src/reporter/budget.ts +0 -59
- package/src/reporter/handlers.ts +0 -212
- package/src/reporter/index.ts +0 -210
- package/src/reporter/query-router.ts +0 -51
- package/src/router/.gitkeep +0 -0
- package/src/router/__tests__/step-router.test.ts +0 -150
- package/src/router/classifier/grammars.ts +0 -17
- package/src/router/classifier/index.test.ts +0 -33
- package/src/router/classifier/index.ts +0 -21
- package/src/router/classifier/regex.test.ts +0 -51
- package/src/router/classifier/regex.ts +0 -160
- package/src/router/classifier/tree-sitter.test.ts +0 -26
- package/src/router/classifier/tree-sitter.ts +0 -87
- package/src/router/cold.test.ts +0 -62
- package/src/router/cold.ts +0 -27
- package/src/router/decide.test.ts +0 -209
- package/src/router/decide.ts +0 -509
- package/src/router/health.test.ts +0 -59
- package/src/router/health.ts +0 -49
- package/src/router/provider-sentinel.test.ts +0 -22
- package/src/router/provider-sentinel.ts +0 -20
- package/src/router/role-override.test.ts +0 -37
- package/src/router/step-router.ts +0 -194
- package/src/router/store.ts +0 -47
- package/src/router/types.ts +0 -20
- package/src/router/warm.test.ts +0 -234
- package/src/router/warm.ts +0 -93
- package/src/scaffold/__tests__/continuation-prompt.test.ts +0 -93
- package/src/scaffold/__tests__/continue-as-council.spec.ts +0 -122
- package/src/scaffold/__tests__/dotnet-assembly-name.test.ts +0 -28
- package/src/scaffold/__tests__/fe-scaffold-contents.test.ts +0 -127
- package/src/scaffold/__tests__/init-new.smoke.spec.ts +0 -99
- package/src/scaffold/__tests__/init-new.spec.ts +0 -450
- package/src/scaffold/__tests__/install-bb-templates.spec.ts +0 -86
- package/src/scaffold/__tests__/point-to-existing.spec.ts +0 -114
- package/src/scaffold/bb-ecosystem-apply.ts +0 -457
- package/src/scaffold/bb-quality-gate.ts +0 -287
- package/src/scaffold/continuation-prompt.ts +0 -80
- package/src/scaffold/continue-as-council.ts +0 -99
- package/src/scaffold/init-new.ts +0 -1691
- package/src/scaffold/point-to-existing.ts +0 -83
- package/src/scaffold/resume-from-gate-failures.ts +0 -167
- package/src/self-qa/__tests__/agentic-context.test.ts +0 -104
- package/src/self-qa/__tests__/agentic-loop.test.ts +0 -70
- package/src/self-qa/__tests__/delta-encoder.test.ts +0 -113
- package/src/self-qa/__tests__/judge.test.ts +0 -152
- package/src/self-qa/__tests__/scenario-planner.test.ts +0 -87
- package/src/self-qa/__tests__/spec-emitter.test.ts +0 -67
- package/src/self-qa/agentic-context.ts +0 -211
- package/src/self-qa/agentic-loop.ts +0 -590
- package/src/self-qa/delta-encoder.ts +0 -149
- package/src/self-qa/index.ts +0 -117
- package/src/self-qa/judge.ts +0 -248
- package/src/self-qa/orchestrator.ts +0 -269
- package/src/self-qa/scenario-planner.ts +0 -289
- package/src/self-qa/spec-emitter.ts +0 -152
- package/src/self-qa/types.ts +0 -98
- package/src/storage/__tests__/migrations.test.ts +0 -395
- package/src/storage/__tests__/sweep-stale-pending.test.ts +0 -112
- package/src/storage/__tests__/ui-interaction-log.test.ts +0 -136
- package/src/storage/atomic-io.test.ts +0 -92
- package/src/storage/atomic-io.ts +0 -160
- package/src/storage/config.test.ts +0 -33
- package/src/storage/config.ts +0 -53
- package/src/storage/db.ts +0 -184
- package/src/storage/index.ts +0 -26
- package/src/storage/interaction-log.ts +0 -126
- package/src/storage/migrations.ts +0 -205
- package/src/storage/session-dir.ts +0 -37
- package/src/storage/sessions.ts +0 -225
- package/src/storage/tool-results.ts +0 -56
- package/src/storage/transcript-response-entry.test.ts +0 -115
- package/src/storage/transcript-view.ts +0 -45
- package/src/storage/transcript.test.ts +0 -24
- package/src/storage/transcript.ts +0 -637
- package/src/storage/ui-interaction-log.ts +0 -170
- package/src/storage/usage-cap.test.ts +0 -59
- package/src/storage/usage-cap.ts +0 -81
- package/src/storage/usage.ts +0 -117
- package/src/storage/workspaces.ts +0 -84
- package/src/tools/__tests__/vision-gate.test.ts +0 -66
- package/src/tools/bash-output-cache.test.ts +0 -113
- package/src/tools/bash-output-cache.ts +0 -156
- package/src/tools/bash-output-integration.test.ts +0 -33
- package/src/tools/bash.test.ts +0 -447
- package/src/tools/bash.ts +0 -769
- package/src/tools/computer.test.ts +0 -187
- package/src/tools/computer.ts +0 -632
- package/src/tools/file-tracker.test.ts +0 -101
- package/src/tools/file-tracker.ts +0 -70
- package/src/tools/file.test.ts +0 -151
- package/src/tools/file.ts +0 -203
- package/src/tools/grep.ts +0 -187
- package/src/tools/registry-bash-empty-command.test.ts +0 -64
- package/src/tools/registry-bash-footer.test.ts +0 -95
- package/src/tools/registry-ee-query.test.ts +0 -57
- package/src/tools/registry-session-repeat.test.ts +0 -105
- package/src/tools/registry.test.ts +0 -38
- package/src/tools/registry.ts +0 -704
- package/src/tools/schedule.test.ts +0 -143
- package/src/tools/schedule.ts +0 -610
- package/src/tools/todo-write-snapshot.test.ts +0 -53
- package/src/tools/todo-write-snapshot.ts +0 -63
- package/src/tools/vision-gate.ts +0 -74
- package/src/types/index.ts +0 -550
- package/src/ui/__tests__/picker-providers.test.ts +0 -37
- package/src/ui/agents-modal.tsx +0 -293
- package/src/ui/app.tsx +0 -7084
- package/src/ui/cards/__tests__/product-status-card.test.ts +0 -30
- package/src/ui/cards/product-status-card.tsx +0 -117
- package/src/ui/components/SuggestionOverlay.tsx +0 -38
- package/src/ui/components/Toast.tsx +0 -100
- package/src/ui/components/__tests__/council-leader-bubble.test.ts +0 -16
- package/src/ui/components/__tests__/council-message-bubble.test.ts +0 -85
- package/src/ui/components/__tests__/council-phase-timeline.test.ts +0 -57
- package/src/ui/components/__tests__/council-placeholder-bubble.test.ts +0 -16
- package/src/ui/components/__tests__/council-question-card.test.ts +0 -133
- package/src/ui/components/__tests__/council-synthesis-banner.test.ts +0 -12
- package/src/ui/components/__tests__/task-list-panel.test.ts +0 -37
- package/src/ui/components/__tests__/use-pair-quote-buffer.test.ts +0 -41
- package/src/ui/components/btw-overlay.tsx +0 -66
- package/src/ui/components/bubble-layout.ts +0 -66
- package/src/ui/components/code-block-truncate.ts +0 -24
- package/src/ui/components/copy-flash-banner.tsx +0 -31
- package/src/ui/components/council-info-card.tsx +0 -44
- package/src/ui/components/council-leader-bubble.tsx +0 -40
- package/src/ui/components/council-message-bubble.tsx +0 -110
- package/src/ui/components/council-phase-timeline.tsx +0 -112
- package/src/ui/components/council-placeholder-bubble.tsx +0 -64
- package/src/ui/components/council-question-card.tsx +0 -256
- package/src/ui/components/council-status-list.tsx +0 -111
- package/src/ui/components/council-synthesis-banner.tsx +0 -36
- package/src/ui/components/diff-view.tsx +0 -225
- package/src/ui/components/halt-recovery-card.tsx +0 -84
- package/src/ui/components/hero-logo.tsx +0 -62
- package/src/ui/components/init-new-form-card.tsx +0 -470
- package/src/ui/components/lsp-views.tsx +0 -104
- package/src/ui/components/media-views.tsx +0 -66
- package/src/ui/components/message-view.tsx +0 -442
- package/src/ui/components/point-to-existing-form-card.tsx +0 -136
- package/src/ui/components/prompt-box.tsx +0 -306
- package/src/ui/components/role-palette.ts +0 -62
- package/src/ui/components/session-header.tsx +0 -68
- package/src/ui/components/slash-inline-menu.tsx +0 -63
- package/src/ui/components/structured-response-view.tsx +0 -191
- package/src/ui/components/task-list-panel.tsx +0 -127
- package/src/ui/components/tool-group.tsx +0 -129
- package/src/ui/components/tool-result-views.tsx +0 -258
- package/src/ui/components/use-pair-quote-buffer.ts +0 -23
- package/src/ui/constants.ts +0 -242
- package/src/ui/hooks/use-agent-editor.ts +0 -61
- package/src/ui/hooks/use-mcp-editor.ts +0 -39
- package/src/ui/hooks/use-model-picker.ts +0 -50
- package/src/ui/hooks/useTypeahead.ts +0 -160
- package/src/ui/markdown.tsx +0 -49
- package/src/ui/mcp-modal-types.ts +0 -33
- package/src/ui/mcp-modal.tsx +0 -484
- package/src/ui/modals/api-key-modal.tsx +0 -99
- package/src/ui/modals/connect-modal.tsx +0 -259
- package/src/ui/modals/model-picker-modal.tsx +0 -347
- package/src/ui/modals/sandbox-picker-modal.tsx +0 -99
- package/src/ui/modals/update-modal.tsx +0 -67
- package/src/ui/modals/wallet-picker-modal.tsx +0 -186
- package/src/ui/picker-providers.ts +0 -41
- package/src/ui/plan.tsx +0 -346
- package/src/ui/schedule-modal.tsx +0 -138
- package/src/ui/slash/__tests__/clear.test.ts +0 -86
- package/src/ui/slash/__tests__/compact.test.ts +0 -56
- package/src/ui/slash/__tests__/cost.test.ts +0 -62
- package/src/ui/slash/__tests__/discuss.test.ts +0 -101
- package/src/ui/slash/__tests__/execute.test.ts +0 -86
- package/src/ui/slash/__tests__/expand.test.ts +0 -86
- package/src/ui/slash/__tests__/ideal.test.ts +0 -182
- package/src/ui/slash/__tests__/menu-parity.test.ts +0 -44
- package/src/ui/slash/__tests__/optimize.test.ts +0 -155
- package/src/ui/slash/__tests__/pin.test.ts +0 -47
- package/src/ui/slash/__tests__/plan.test.ts +0 -98
- package/src/ui/slash/__tests__/status-render.test.ts +0 -82
- package/src/ui/slash/clear.ts +0 -89
- package/src/ui/slash/compact.ts +0 -46
- package/src/ui/slash/cost.ts +0 -63
- package/src/ui/slash/council-inspect.ts +0 -188
- package/src/ui/slash/council.ts +0 -30
- package/src/ui/slash/debug.ts +0 -153
- package/src/ui/slash/discuss.ts +0 -71
- package/src/ui/slash/ee.ts +0 -304
- package/src/ui/slash/execute.ts +0 -44
- package/src/ui/slash/expand.ts +0 -51
- package/src/ui/slash/export.ts +0 -309
- package/src/ui/slash/ideal.ts +0 -292
- package/src/ui/slash/menu-items.ts +0 -107
- package/src/ui/slash/optimize.ts +0 -47
- package/src/ui/slash/pin.ts +0 -41
- package/src/ui/slash/plan.ts +0 -62
- package/src/ui/slash/registry.ts +0 -47
- package/src/ui/slash/route.test.ts +0 -82
- package/src/ui/slash/route.ts +0 -43
- package/src/ui/slash/status.ts +0 -36
- package/src/ui/state/active-run.ts +0 -56
- package/src/ui/status-bar/index.test.tsx +0 -154
- package/src/ui/status-bar/index.tsx +0 -126
- package/src/ui/status-bar/store.test.ts +0 -131
- package/src/ui/status-bar/store.ts +0 -332
- package/src/ui/status-bar/tier-badge.test.tsx +0 -38
- package/src/ui/status-bar/tier-badge.tsx +0 -29
- package/src/ui/status-bar/usd-meter.test.tsx +0 -37
- package/src/ui/status-bar/usd-meter.tsx +0 -22
- package/src/ui/syntax-highlight.ts +0 -627
- package/src/ui/terminal-selection-text.ts +0 -72
- package/src/ui/theme.ts +0 -95
- package/src/ui/types.ts +0 -83
- package/src/ui/utils/__tests__/format.test.ts +0 -71
- package/src/ui/utils/__tests__/tools.test.ts +0 -57
- package/src/ui/utils/color.ts +0 -19
- package/src/ui/utils/format.ts +0 -133
- package/src/ui/utils/modal.ts +0 -9
- package/src/ui/utils/text.ts +0 -32
- package/src/ui/utils/tools.ts +0 -137
- package/src/usage/.gitkeep +0 -0
- package/src/usage/__tests__/product-ledger.test.ts +0 -86
- package/src/usage/cost-log.ts +0 -158
- package/src/usage/decision-log.ts +0 -86
- package/src/usage/downgrade.test.ts +0 -86
- package/src/usage/downgrade.ts +0 -88
- package/src/usage/estimator.test.ts +0 -43
- package/src/usage/estimator.ts +0 -58
- package/src/usage/ledger.test.ts +0 -200
- package/src/usage/ledger.ts +0 -253
- package/src/usage/midstream.test.ts +0 -55
- package/src/usage/midstream.ts +0 -51
- package/src/usage/product-ledger.ts +0 -119
- package/src/usage/thresholds.test.ts +0 -83
- package/src/usage/thresholds.ts +0 -74
- package/src/usage/types.ts +0 -41
- package/src/utils/__tests__/auto-council-settings.test.ts +0 -46
- package/src/utils/__tests__/ee-logger.test.ts +0 -197
- package/src/utils/__tests__/file-lock.test.ts +0 -74
- package/src/utils/__tests__/llm-deadline.test.ts +0 -64
- package/src/utils/__tests__/rate-limit.test.ts +0 -42
- package/src/utils/__tests__/settings-disabled-models.test.ts +0 -113
- package/src/utils/__tests__/settings-web-research.test.ts +0 -45
- package/src/utils/__tests__/slugify.test.ts +0 -45
- package/src/utils/__tests__/visible-retry.test.ts +0 -195
- package/src/utils/at-mentions.ts +0 -120
- package/src/utils/clipboard-image.ts +0 -139
- package/src/utils/ee-logger.ts +0 -163
- package/src/utils/file-index.ts +0 -152
- package/src/utils/file-lock.ts +0 -66
- package/src/utils/git-root.ts +0 -17
- package/src/utils/host-clipboard.ts +0 -68
- package/src/utils/install-manager.test.ts +0 -167
- package/src/utils/install-manager.ts +0 -429
- package/src/utils/instructions.test.ts +0 -112
- package/src/utils/instructions.ts +0 -149
- package/src/utils/llm-deadline.ts +0 -80
- package/src/utils/permission-mode.test.ts +0 -121
- package/src/utils/permission-mode.ts +0 -94
- package/src/utils/rate-limit.ts +0 -21
- package/src/utils/redactor.test.ts +0 -100
- package/src/utils/redactor.ts +0 -223
- package/src/utils/settings.test.ts +0 -181
- package/src/utils/settings.ts +0 -1163
- package/src/utils/shell.test.ts +0 -102
- package/src/utils/shell.ts +0 -204
- package/src/utils/side-question.ts +0 -39
- package/src/utils/skills.test.ts +0 -58
- package/src/utils/skills.ts +0 -207
- package/src/utils/slugify.ts +0 -9
- package/src/utils/subagent-display.test.ts +0 -23
- package/src/utils/subagent-display.ts +0 -11
- package/src/utils/subagents-settings.test.ts +0 -84
- package/src/utils/telegram-audio-settings.test.ts +0 -44
- package/src/utils/update-checker.test.ts +0 -182
- package/src/utils/update-checker.ts +0 -33
- package/src/utils/visible-retry.ts +0 -56
- package/src/verify/__tests__/coverage-parsers.test.ts +0 -86
- package/src/verify/__tests__/dotnet-recipe.test.ts +0 -88
- package/src/verify/checkpoint.test.ts +0 -186
- package/src/verify/checkpoint.ts +0 -239
- package/src/verify/coverage-parsers.ts +0 -76
- package/src/verify/entrypoint.test.ts +0 -293
- package/src/verify/entrypoint.ts +0 -495
- package/src/verify/environment.test.ts +0 -119
- package/src/verify/environment.ts +0 -115
- package/src/verify/evidence.ts +0 -104
- package/src/verify/orchestrator.test.ts +0 -159
- package/src/verify/orchestrator.ts +0 -129
- package/src/verify/recipes.ts +0 -592
- package/src/verify/retry.ts +0 -62
- package/src/verify/runtime-prep.test.ts +0 -47
|
@@ -1,1855 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { resolveLeaderModel } from "../council/leader.js";
|
|
4
|
-
import type { CouncilLLM, PreflightResponder, QuestionResponder } from "../council/types.js";
|
|
5
|
-
import type { EERouteResult } from "../ee/bridge.js";
|
|
6
|
-
import { routeModel as eeRouteModel } from "../ee/bridge.js";
|
|
7
|
-
import { fireAndForgetPhaseOutcome } from "../ee/phase-outcome.js";
|
|
8
|
-
import { readArtifact } from "../flow/artifact-io.js";
|
|
9
|
-
import { createRun, loadRun } from "../flow/run-manager.js";
|
|
10
|
-
import { getModelsForProvider } from "../models/registry.js";
|
|
11
|
-
import { loadKeyForProvider } from "../providers/keychain.js";
|
|
12
|
-
import type { ProviderId } from "../providers/types.js";
|
|
13
|
-
import { ALL_PROVIDER_IDS } from "../providers/types.js";
|
|
14
|
-
import { defaultResolveChannelId, maybeAutoFire } from "../reporter/auto-fire.js";
|
|
15
|
-
import { logInteraction, logUIInteraction } from "../storage/index.js";
|
|
16
|
-
import type { ModelInfo, StreamChunk, VerifyRecipe } from "../types/index.js";
|
|
17
|
-
import { activeRunStore } from "../ui/state/active-run.js";
|
|
18
|
-
import { markIterationCrashed, readIterations, readManifest, writeManifest } from "./artifact-io.js";
|
|
19
|
-
import { buildBacklog } from "./backlog-builder.js";
|
|
20
|
-
import { readBacklog, writeBacklog } from "./backlog-store.js";
|
|
21
|
-
import { formatCostPreview, previewRunCost } from "./cost-preview.js";
|
|
22
|
-
import { extractRunToEE } from "./cross-run-memory.js";
|
|
23
|
-
import { buildContinueFeedback, type ContinueFeedback } from "./feedback-routing.js";
|
|
24
|
-
import { type DriverContext, type DriverResult, runLoopDriver } from "./loop-driver.js";
|
|
25
|
-
import { resolveRoles } from "./role-registry.js";
|
|
26
|
-
import { polishDelivery } from "./ship-polish.js";
|
|
27
|
-
import { applySprintAssignments, planSprints } from "./sprint-planner.js";
|
|
28
|
-
import { runSprint } from "./sprint-runner.js";
|
|
29
|
-
import { readSprintPlan, setActiveSprint, writeSprintPlan } from "./sprint-store.js";
|
|
30
|
-
import type { ImplementationPlanArtifact, IterationState, ProductSpec, RoleSlot } from "./types.js";
|
|
31
|
-
|
|
32
|
-
export interface ProductLoopFlags {
|
|
33
|
-
maxCost: number;
|
|
34
|
-
maxSprints: number;
|
|
35
|
-
doneThreshold: number;
|
|
36
|
-
stack?: string;
|
|
37
|
-
/** P2.7: when true, always run full council debate even for low-complexity ideas. */
|
|
38
|
-
forceCouncil?: boolean;
|
|
39
|
-
/** If set, halt when total tokens exceed this limit. */
|
|
40
|
-
budgetTokens?: number;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface ProductLoopOptions {
|
|
44
|
-
/** Required for `start` — the user's idea. Ignored for other subcommands. */
|
|
45
|
-
idea?: string;
|
|
46
|
-
/** Required for resume/abort/ship/status<runId>. */
|
|
47
|
-
runId?: string;
|
|
48
|
-
/** Subcommand selector. Default = start. */
|
|
49
|
-
subcommand?: "start" | "status" | "resume" | "abort" | "ship";
|
|
50
|
-
|
|
51
|
-
flowDir: string;
|
|
52
|
-
/** Session model id from the orchestrator (this.modelId). Used to resolve real council models. */
|
|
53
|
-
sessionModelId: string;
|
|
54
|
-
llm: CouncilLLM;
|
|
55
|
-
flags: ProductLoopFlags;
|
|
56
|
-
respondToQuestion: QuestionResponder;
|
|
57
|
-
respondToPreflight: PreflightResponder;
|
|
58
|
-
|
|
59
|
-
/** Optional bridges; sprint-runner uses them when present. */
|
|
60
|
-
cwd?: string;
|
|
61
|
-
processMessageFn?: (message: string) => AsyncGenerator<StreamChunk, void, unknown>;
|
|
62
|
-
detectVerifyRecipe?: () => Promise<VerifyRecipe | null>;
|
|
63
|
-
/** Test hook: pre-resolved role assignments so the harness can pin model ids. */
|
|
64
|
-
roleAssignments?: Map<RoleSlot, { modelId: string; provider: string; tier?: string }>;
|
|
65
|
-
/** P5: when true, skip cross-run workspace memory injection. */
|
|
66
|
-
skipPriorContext?: boolean;
|
|
67
|
-
/**
|
|
68
|
-
* Mode C — explicit override. When "maintain", runProductLoop dispatches to
|
|
69
|
-
* runMaintain (single-task PR flow). When "new", forces Mode A (greenfield)
|
|
70
|
-
* even if cwd has a verify recipe. When undefined, auto-detect (verify
|
|
71
|
-
* recipe present + cwd looks like an existing project → Mode C).
|
|
72
|
-
* See .planning/MAINTAIN-MODE.md.
|
|
73
|
-
*/
|
|
74
|
-
mode?: "maintain" | "new";
|
|
75
|
-
/** Mode C — opt-in: run `gh pr create` after PR is built. Default false (print to stdout + write to .planning/runs/<runId>/pr.md). */
|
|
76
|
-
ghPr?: boolean;
|
|
77
|
-
/**
|
|
78
|
-
* P2.6: Complexity decision from PIL Layer 1. When "low" and forceCouncil is
|
|
79
|
-
* not set, the dispatcher routes to runHotPath (single sprint, no council debate).
|
|
80
|
-
*/
|
|
81
|
-
complexity?: "low" | "medium" | "high";
|
|
82
|
-
/**
|
|
83
|
-
* Sufficiency gaps from PIL Layer 1. When non-empty, the dispatcher forces
|
|
84
|
-
* the Council path regardless of complexity — vague prompts MUST go through
|
|
85
|
-
* AskCard discovery before any scaffolding. Each entry seeds a discovery
|
|
86
|
-
* question category (scope/target/intent).
|
|
87
|
-
*/
|
|
88
|
-
sufficiencyMissing?: readonly import("../pil/layer1-intent.js").SufficiencyMissing[];
|
|
89
|
-
/**
|
|
90
|
-
* Chat session id (sessions.id) — required for interaction_logs telemetry
|
|
91
|
-
* inserts to satisfy the FK constraint. The /ideal runId is NOT a valid
|
|
92
|
-
* sessions.id; passing runId there silently fails FK on STRICT bun:sqlite.
|
|
93
|
-
*/
|
|
94
|
-
sessionId?: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export interface ProductLoopResult extends DriverResult {
|
|
98
|
-
/** Number of sprints actually executed (≥ 0). */
|
|
99
|
-
sprintsRun?: number;
|
|
100
|
-
/** Whether the run reached the shipped state (Cond #5 passed). */
|
|
101
|
-
shipped?: boolean;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Entry point for the Product Ideal Loop.
|
|
106
|
-
*
|
|
107
|
-
* Subcommands:
|
|
108
|
-
* - start (default): create run → drive FSM → run sprints → done | halted
|
|
109
|
-
* - status: list runs (or detail one when runId provided)
|
|
110
|
-
* - resume: re-enter the FSM from state.md, marking any in-flight sprint as crashed
|
|
111
|
-
* - abort: write manifest aborted=true and post EE phase-outcome=aborted
|
|
112
|
-
* - ship: skip Cond #1-#4 if already passing; force final user gate (Cond #5)
|
|
113
|
-
*/
|
|
114
|
-
export async function* runProductLoop(
|
|
115
|
-
opts: ProductLoopOptions,
|
|
116
|
-
): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
117
|
-
const sub = opts.subcommand ?? "start";
|
|
118
|
-
|
|
119
|
-
switch (sub) {
|
|
120
|
-
case "status":
|
|
121
|
-
return yield* runStatus(opts);
|
|
122
|
-
case "resume":
|
|
123
|
-
return yield* runResume(opts);
|
|
124
|
-
case "abort":
|
|
125
|
-
return yield* runAbort(opts);
|
|
126
|
-
case "ship":
|
|
127
|
-
return yield* runShip(opts);
|
|
128
|
-
default: {
|
|
129
|
-
// Mode C dispatch — see .planning/MAINTAIN-MODE.md "Trigger mechanism".
|
|
130
|
-
// 1. Explicit --maintain → Mode C
|
|
131
|
-
// 2. Explicit --new → Mode A (current behavior, skip detection)
|
|
132
|
-
// 3. Auto-detect: verify recipe present in cwd → Mode C
|
|
133
|
-
// 4. Otherwise → Mode A
|
|
134
|
-
if (opts.mode === "maintain") {
|
|
135
|
-
return yield* runMaintain(opts);
|
|
136
|
-
}
|
|
137
|
-
if (opts.mode !== "new" && opts.detectVerifyRecipe) {
|
|
138
|
-
try {
|
|
139
|
-
const recipe = await opts.detectVerifyRecipe();
|
|
140
|
-
if (recipe) {
|
|
141
|
-
return yield* runMaintain(opts);
|
|
142
|
-
}
|
|
143
|
-
} catch {
|
|
144
|
-
// Detection failure is non-fatal — fall through to Mode A.
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// C1 — Existing-repo bypass. The sufficiency gate below was tuned for
|
|
149
|
-
// greenfield: a vague "todo app" prompt with no folder MUST go to
|
|
150
|
-
// Council so AskCard can pin productType / audience / stack before
|
|
151
|
-
// any scaffolding. But when /ideal runs inside a non-empty folder,
|
|
152
|
-
// those answers are derivable from the source (manifests, dirs, deps)
|
|
153
|
-
// — forcing the user through 6 AskCards is the regression session
|
|
154
|
-
// e2660a052918 demonstrated. Skip the sufficiency gate (and prefer
|
|
155
|
-
// hot-path over full Council for medium complexity) when the cwd is
|
|
156
|
-
// an existing project AND the caller hasn't explicitly forced council.
|
|
157
|
-
//
|
|
158
|
-
// forceCouncil=true still wins — user can opt back into the full
|
|
159
|
-
// Council pipeline when they actually want it (e.g. architectural
|
|
160
|
-
// change to an existing repo).
|
|
161
|
-
const existingRepoBypass = await detectExistingRepoBypass(opts);
|
|
162
|
-
const hasGaps = !!(opts.sufficiencyMissing && opts.sufficiencyMissing.length > 0);
|
|
163
|
-
if (hasGaps && !existingRepoBypass) {
|
|
164
|
-
const forcedOpts: ProductLoopOptions = {
|
|
165
|
-
...opts,
|
|
166
|
-
flags: { ...opts.flags, forceCouncil: true },
|
|
167
|
-
};
|
|
168
|
-
return yield* runStart(forcedOpts);
|
|
169
|
-
}
|
|
170
|
-
// Existing repo + complexity≠high → hot-path. The leader can grep
|
|
171
|
-
// the source instead of interviewing the user. Only architectural
|
|
172
|
-
// changes (complexity=high) still warrant the full Council debate.
|
|
173
|
-
if (existingRepoBypass && opts.complexity !== "high" && !opts.flags.forceCouncil) {
|
|
174
|
-
return yield* runHotPath(opts);
|
|
175
|
-
}
|
|
176
|
-
if (opts.complexity === "low" && !opts.flags.forceCouncil) {
|
|
177
|
-
return yield* runHotPath(opts);
|
|
178
|
-
}
|
|
179
|
-
return yield* runStart(opts);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* C1 — Decide whether the existing-repo bypass should fire for THIS run.
|
|
186
|
-
*
|
|
187
|
-
* Returns true when `cwd` contains source code or a manifest (any of:
|
|
188
|
-
* package.json, Cargo.toml, go.mod, pyproject.toml, *.csproj, *.sln,
|
|
189
|
-
* Directory.Build.props, or a top-level source file). False when the
|
|
190
|
-
* folder is empty / probe fails — in which case the original gating
|
|
191
|
-
* (Council for vague greenfield prompts) takes over.
|
|
192
|
-
*
|
|
193
|
-
* Sync probe, no I/O retry. `forceCouncil` overrides this gate at the
|
|
194
|
-
* call site — when the user explicitly asks for Council we honor it
|
|
195
|
-
* even on an existing repo (e.g. "rearchitect this codebase").
|
|
196
|
-
*/
|
|
197
|
-
async function detectExistingRepoBypass(opts: ProductLoopOptions): Promise<boolean> {
|
|
198
|
-
if (opts.flags?.forceCouncil) return false;
|
|
199
|
-
const cwd = opts.cwd ?? process.cwd();
|
|
200
|
-
try {
|
|
201
|
-
const { detectExistingProject } = await import("./discovery-detection.js");
|
|
202
|
-
const det = await detectExistingProject(cwd);
|
|
203
|
-
return det.classification !== "greenfield";
|
|
204
|
-
} catch {
|
|
205
|
-
// Detection failure is non-fatal — fall back to the original gating.
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* P2.5 — Hot-path for complexity=low ideas.
|
|
212
|
-
*
|
|
213
|
-
* Skips Council debate + scoping. Goes straight from idea → single sprint → ship.
|
|
214
|
-
* extractRunToEE still fires so cross-run memory continues to build.
|
|
215
|
-
*/
|
|
216
|
-
async function* runHotPath(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
217
|
-
const { idea, flowDir, flags } = opts;
|
|
218
|
-
if (!idea?.trim()) {
|
|
219
|
-
yield { type: "content", content: "error: /ideal start requires an idea" } as StreamChunk;
|
|
220
|
-
return { runId: "", stage: "error", success: false, reason: "missing_idea" };
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
const runState = await createRun(flowDir);
|
|
224
|
-
const runId = runState.id;
|
|
225
|
-
|
|
226
|
-
await writeManifest(flowDir, runId, {
|
|
227
|
-
idea,
|
|
228
|
-
capUsd: flags.maxCost,
|
|
229
|
-
maxSprints: 1, // hot-path always caps at 1 sprint
|
|
230
|
-
doneThreshold: flags.doneThreshold,
|
|
231
|
-
stack: flags.stack,
|
|
232
|
-
createdAt: new Date(),
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
yield {
|
|
236
|
-
type: "content",
|
|
237
|
-
content: "\n> hot-path: complexity=low → single sprint, no council debate\n",
|
|
238
|
-
} as StreamChunk;
|
|
239
|
-
|
|
240
|
-
// Emit route-decision harness event (agent-mode only; no-op otherwise).
|
|
241
|
-
try {
|
|
242
|
-
const _ar = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
|
|
243
|
-
| { emitEvent: (e: unknown) => void }
|
|
244
|
-
| undefined;
|
|
245
|
-
_ar?.emitEvent({
|
|
246
|
-
t: "event",
|
|
247
|
-
kind: "route-decision",
|
|
248
|
-
path: "hot-path",
|
|
249
|
-
complexity: opts.complexity ?? "low",
|
|
250
|
-
forceCouncil: false,
|
|
251
|
-
runId,
|
|
252
|
-
});
|
|
253
|
-
} catch {
|
|
254
|
-
/* best-effort */
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// Telemetry: log routing decision.
|
|
258
|
-
try {
|
|
259
|
-
logInteraction(opts.sessionId ?? runId, "routing", {
|
|
260
|
-
eventSubtype: "ideal_hot_path",
|
|
261
|
-
data: { complexity: "low", forceCouncil: false },
|
|
262
|
-
});
|
|
263
|
-
} catch {
|
|
264
|
-
// DB errors must not break /ideal
|
|
265
|
-
}
|
|
266
|
-
logUIInteraction(opts.sessionId, {
|
|
267
|
-
subtype: "route_decision",
|
|
268
|
-
data: { path: "hot-path", complexity: opts.complexity ?? "low", forceCouncil: false, runId },
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
try {
|
|
272
|
-
const _ar = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
|
|
273
|
-
| { emitEvent: (e: unknown) => void }
|
|
274
|
-
| undefined;
|
|
275
|
-
_ar?.emitEvent({
|
|
276
|
-
t: "event",
|
|
277
|
-
kind: "sprint-plan-committed",
|
|
278
|
-
runId,
|
|
279
|
-
projectDir: opts.cwd ?? null,
|
|
280
|
-
sprintCount: 1,
|
|
281
|
-
sprintIds: ["sprint-1"],
|
|
282
|
-
source: "auto",
|
|
283
|
-
ts: Date.now(),
|
|
284
|
-
});
|
|
285
|
-
} catch {
|
|
286
|
-
/* best-effort */
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// B1: update active-run store; B2: auto-fire plan committed.
|
|
290
|
-
try {
|
|
291
|
-
const { productSlug: deriveSlug } = await import("./product-identity.js");
|
|
292
|
-
const slug = deriveSlug(idea);
|
|
293
|
-
activeRunStore.setActiveRun(runId, flowDir, slug);
|
|
294
|
-
fireAutoReport("sprint-plan-committed", { runId, flowDir, productSlug: slug, sprintCount: 1 });
|
|
295
|
-
} catch {
|
|
296
|
-
/* best-effort */
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Build a minimal ProductSpec inline (no LLM calls needed for the hot-path).
|
|
300
|
-
const productSpec: ProductSpec = {
|
|
301
|
-
idea,
|
|
302
|
-
persona: "users",
|
|
303
|
-
mvp: [],
|
|
304
|
-
phase2: [],
|
|
305
|
-
architecture: "",
|
|
306
|
-
ioContract: "",
|
|
307
|
-
folderStructure: "",
|
|
308
|
-
sprintEstimate: 1,
|
|
309
|
-
costEstimate: 1,
|
|
310
|
-
stack: flags.stack,
|
|
311
|
-
createdAt: new Date(),
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
const ctx: DriverContext = {
|
|
315
|
-
runId,
|
|
316
|
-
flowDir,
|
|
317
|
-
idea,
|
|
318
|
-
sessionModelId: opts.sessionModelId,
|
|
319
|
-
llm: opts.llm,
|
|
320
|
-
flags,
|
|
321
|
-
respondToQuestion: opts.respondToQuestion,
|
|
322
|
-
respondToPreflight: opts.respondToPreflight,
|
|
323
|
-
cwd: opts.cwd,
|
|
324
|
-
sessionId: opts.sessionId,
|
|
325
|
-
processMessageFn: opts.processMessageFn,
|
|
326
|
-
detectVerifyRecipe: opts.detectVerifyRecipe,
|
|
327
|
-
skipPriorContext: opts.skipPriorContext,
|
|
328
|
-
sufficiencyMissing: opts.sufficiencyMissing,
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
const roleAssignments = opts.roleAssignments ?? (await resolveRoleAssignments(opts.sessionModelId));
|
|
332
|
-
|
|
333
|
-
// Run a single sprint (maxSprints=1 enforced regardless of opts.flags.maxSprints).
|
|
334
|
-
let iter: import("./types.js").IterationState;
|
|
335
|
-
try {
|
|
336
|
-
const sprintGen = runSprint({
|
|
337
|
-
sprintN: 1,
|
|
338
|
-
ctx,
|
|
339
|
-
productSpec,
|
|
340
|
-
roleAssignments,
|
|
341
|
-
history: [],
|
|
342
|
-
});
|
|
343
|
-
let result: import("./types.js").IterationState | undefined;
|
|
344
|
-
while (true) {
|
|
345
|
-
const step = await sprintGen.next();
|
|
346
|
-
if (step.done) {
|
|
347
|
-
result = step.value as import("./types.js").IterationState;
|
|
348
|
-
break;
|
|
349
|
-
}
|
|
350
|
-
// Site 1 — forward halt chunk to UI, mark stage halted, stop iteration.
|
|
351
|
-
if (step.value && (step.value as StreamChunk).type === "halt") {
|
|
352
|
-
yield step.value as StreamChunk;
|
|
353
|
-
const manifest = await readManifest(flowDir, runId);
|
|
354
|
-
const haltReason = (step.value as StreamChunk).haltChunk?.reason ?? "no_recipe";
|
|
355
|
-
if (manifest) {
|
|
356
|
-
await writeManifest(flowDir, runId, {
|
|
357
|
-
...manifest,
|
|
358
|
-
verdict: { pass: false, score: 0, reason: haltReason, failedCondition: undefined as any },
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
return { runId, stage: "halted", success: false, reason: haltReason, sprintsRun: 0 };
|
|
362
|
-
}
|
|
363
|
-
yield step.value as StreamChunk;
|
|
364
|
-
}
|
|
365
|
-
iter = result!;
|
|
366
|
-
} catch (err) {
|
|
367
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
368
|
-
yield { type: "content", content: `\n> Sprint 1 halted: ${msg}\n` } as StreamChunk;
|
|
369
|
-
const manifest = await readManifest(flowDir, runId);
|
|
370
|
-
if (manifest) {
|
|
371
|
-
await writeManifest(flowDir, runId, {
|
|
372
|
-
...manifest,
|
|
373
|
-
verdict: { pass: false, score: 0, reason: msg, failedCondition: undefined as any },
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
return { runId, stage: "halted", success: false, reason: msg, sprintsRun: 0 };
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
if (iter.stage !== "shipped") {
|
|
380
|
-
return {
|
|
381
|
-
runId,
|
|
382
|
-
stage: "halted",
|
|
383
|
-
success: false,
|
|
384
|
-
reason: iter.lastVerifyResult ?? "sprint_not_shipped",
|
|
385
|
-
sprintsRun: 1,
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// Sprint shipped — write final manifest.
|
|
390
|
-
const manifest = await readManifest(flowDir, runId);
|
|
391
|
-
if (manifest) {
|
|
392
|
-
await writeManifest(flowDir, runId, {
|
|
393
|
-
...manifest,
|
|
394
|
-
doneAt: new Date(),
|
|
395
|
-
verdict: {
|
|
396
|
-
pass: true,
|
|
397
|
-
score: iter.scoreAfter,
|
|
398
|
-
failedCondition: undefined as any,
|
|
399
|
-
reason: "all_conditions_met",
|
|
400
|
-
},
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// Delivery polish.
|
|
405
|
-
if (opts.cwd) {
|
|
406
|
-
try {
|
|
407
|
-
const polish = await polishDelivery({
|
|
408
|
-
cwd: opts.cwd,
|
|
409
|
-
runDir: path.join(flowDir, "runs", runId),
|
|
410
|
-
productSpec,
|
|
411
|
-
runId,
|
|
412
|
-
});
|
|
413
|
-
if (polish.notes.length > 0) {
|
|
414
|
-
yield {
|
|
415
|
-
type: "content",
|
|
416
|
-
content: `\n**Delivery polish:**\n${polish.notes.map((n) => `- ${n}`).join("\n")}\n`,
|
|
417
|
-
} as StreamChunk;
|
|
418
|
-
}
|
|
419
|
-
} catch (err) {
|
|
420
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
421
|
-
yield { type: "content", content: `\n_Delivery polish skipped: ${msg}_\n` } as StreamChunk;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// P1.3: extract run artifacts to EE for cross-run memory.
|
|
426
|
-
if (opts.cwd) {
|
|
427
|
-
const eeResult = await extractRunToEE(flowDir, runId, opts.cwd);
|
|
428
|
-
try {
|
|
429
|
-
logInteraction(opts.sessionId ?? runId, "ee_injection", {
|
|
430
|
-
eventSubtype: "extract",
|
|
431
|
-
durationMs: Math.round(eeResult.durationMs),
|
|
432
|
-
data: {
|
|
433
|
-
ok: eeResult.ok,
|
|
434
|
-
mistakes: eeResult.mistakes ?? null,
|
|
435
|
-
stored: eeResult.stored ?? null,
|
|
436
|
-
},
|
|
437
|
-
});
|
|
438
|
-
} catch {
|
|
439
|
-
// DB errors must not break /ideal
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
return { runId, stage: "approved", success: true, reason: "shipped", sprintsRun: 1, shipped: true };
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
/**
|
|
447
|
-
* Heuristic kind detection from the user's idea text. Avoids hardcoding "bug"
|
|
448
|
-
* for everything — keyword-anchored, falls back to "feature" because most
|
|
449
|
-
* "/ideal foo" prompts are additive, not bug fixes.
|
|
450
|
-
*/
|
|
451
|
-
export function detectMaintenanceKind(idea: string): "bug" | "feature" | "refactor" | "chore" | "docs" {
|
|
452
|
-
const lower = idea.toLowerCase();
|
|
453
|
-
if (/\b(fix|bug|broken|crash|error|fail|regression|hotfix|patch)\b/.test(lower)) return "bug";
|
|
454
|
-
if (/\b(refactor|cleanup|reorganize|rename|split|extract|consolidat)/.test(lower)) return "refactor";
|
|
455
|
-
if (/\b(docs?|documentation|readme|comment|jsdoc|tsdoc)\b/.test(lower)) return "docs";
|
|
456
|
-
if (/\b(chore|cleanup|upgrade|bump|deps?|dependency|dependencies|lint|format)\b/.test(lower)) return "chore";
|
|
457
|
-
return "feature";
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* Build default acceptance criteria for Mode C tasks. Lifts heuristics from the
|
|
462
|
-
* idea so the judge has something to evaluate against beyond "verify passes".
|
|
463
|
-
*/
|
|
464
|
-
export function buildDefaultAcceptanceCriteria(idea: string): string[] {
|
|
465
|
-
const criteria: string[] = ["Existing verify recipe passes after edits"];
|
|
466
|
-
const lower = idea.toLowerCase();
|
|
467
|
-
if (/\b(test|spec|coverage)\b/.test(lower)) {
|
|
468
|
-
criteria.push("New behavior is covered by at least one test");
|
|
469
|
-
}
|
|
470
|
-
if (/\b(no regression|don'?t break|without break|breaking|preserve|backward)/.test(lower)) {
|
|
471
|
-
criteria.push("No regression in existing test suite");
|
|
472
|
-
}
|
|
473
|
-
if (/\b(error|exception|null|undefined|crash)\b/.test(lower)) {
|
|
474
|
-
criteria.push("Error path is handled explicitly (no silent swallowing)");
|
|
475
|
-
}
|
|
476
|
-
return criteria;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* Mode C — single-task maintenance flow.
|
|
481
|
-
*
|
|
482
|
-
* Skeleton wiring per .planning/MAINTAIN-MODE.md. Builds a basic
|
|
483
|
-
* MaintenanceTask from the user's idea (no clarify questions yet — P17
|
|
484
|
-
* follow-up), gathers codebase intel, runs the 5-stage task cycle,
|
|
485
|
-
* builds a PR, optionally invokes `gh pr create`.
|
|
486
|
-
*/
|
|
487
|
-
async function* runMaintain(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
488
|
-
const { idea, flowDir, llm, flags, cwd, processMessageFn, detectVerifyRecipe, respondToPreflight, sessionModelId } =
|
|
489
|
-
opts;
|
|
490
|
-
if (!idea?.trim()) {
|
|
491
|
-
yield { type: "content", content: "error: /ideal maintain requires a task description" } as StreamChunk;
|
|
492
|
-
return { runId: "", stage: "error", success: false, reason: "missing_idea" };
|
|
493
|
-
}
|
|
494
|
-
if (!cwd || !processMessageFn || !detectVerifyRecipe) {
|
|
495
|
-
yield {
|
|
496
|
-
type: "content",
|
|
497
|
-
content: "error: Mode C requires cwd, processMessageFn, and detectVerifyRecipe bridges",
|
|
498
|
-
} as StreamChunk;
|
|
499
|
-
return { runId: "", stage: "error", success: false, reason: "missing_bridges" };
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
const { gatherCodebaseIntel, runMaintenanceTask, buildPr, ghCreatePr } = await import("../maintain/index.js");
|
|
503
|
-
const { randomUUID } = await import("node:crypto");
|
|
504
|
-
const { promises: fsp } = await import("node:fs");
|
|
505
|
-
const pathMod = await import("node:path");
|
|
506
|
-
|
|
507
|
-
const runState = await createRun(flowDir);
|
|
508
|
-
const runId = runState.id;
|
|
509
|
-
|
|
510
|
-
await writeManifest(flowDir, runId, {
|
|
511
|
-
idea,
|
|
512
|
-
capUsd: flags.maxCost,
|
|
513
|
-
maxSprints: 1,
|
|
514
|
-
doneThreshold: flags.doneThreshold,
|
|
515
|
-
stack: flags.stack,
|
|
516
|
-
createdAt: new Date(),
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
yield { type: "content", content: "\n> Mode C: single-task maintenance flow\n" } as StreamChunk;
|
|
520
|
-
|
|
521
|
-
try {
|
|
522
|
-
const _ar = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
|
|
523
|
-
| { emitEvent: (e: unknown) => void }
|
|
524
|
-
| undefined;
|
|
525
|
-
_ar?.emitEvent({
|
|
526
|
-
t: "event",
|
|
527
|
-
kind: "route-decision",
|
|
528
|
-
path: "maintain",
|
|
529
|
-
complexity: opts.complexity ?? "unknown",
|
|
530
|
-
forceCouncil: false,
|
|
531
|
-
runId,
|
|
532
|
-
});
|
|
533
|
-
} catch {
|
|
534
|
-
/* best-effort */
|
|
535
|
-
}
|
|
536
|
-
try {
|
|
537
|
-
logInteraction(opts.sessionId ?? runId, "routing", {
|
|
538
|
-
eventSubtype: "ideal_maintain",
|
|
539
|
-
data: { mode: "maintain", explicit: opts.mode === "maintain" },
|
|
540
|
-
});
|
|
541
|
-
} catch {
|
|
542
|
-
/* DB errors must not break /ideal */
|
|
543
|
-
}
|
|
544
|
-
logUIInteraction(opts.sessionId, {
|
|
545
|
-
subtype: "route_decision",
|
|
546
|
-
data: { path: "maintain", complexity: opts.complexity ?? "unknown", forceCouncil: false, runId },
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
const taskId = randomUUID();
|
|
550
|
-
const nowIso = new Date().toISOString();
|
|
551
|
-
const task = {
|
|
552
|
-
id: taskId,
|
|
553
|
-
kind: detectMaintenanceKind(idea),
|
|
554
|
-
title: idea.split("\n")[0]!.slice(0, 120),
|
|
555
|
-
description: idea,
|
|
556
|
-
acceptance_criteria: buildDefaultAcceptanceCriteria(idea),
|
|
557
|
-
candidateFiles: [] as string[],
|
|
558
|
-
impactRadius: [] as string[],
|
|
559
|
-
regressionTestFiles: [] as string[],
|
|
560
|
-
status: "queued" as const,
|
|
561
|
-
createdAtUtc: nowIso,
|
|
562
|
-
updatedAtUtc: nowIso,
|
|
563
|
-
};
|
|
564
|
-
|
|
565
|
-
yield { type: "content", content: "\n> Gathering codebase intel...\n" } as StreamChunk;
|
|
566
|
-
const intel = await gatherCodebaseIntel({ cwd, task });
|
|
567
|
-
|
|
568
|
-
// Populate task with intel-derived fields so the runner + PR body have them.
|
|
569
|
-
task.candidateFiles = intel.candidateFiles.map((c) => c.path);
|
|
570
|
-
task.impactRadius = intel.impactRadius;
|
|
571
|
-
task.regressionTestFiles = intel.regressionTests;
|
|
572
|
-
|
|
573
|
-
const ctx = {
|
|
574
|
-
runId,
|
|
575
|
-
sessionId: opts.sessionId,
|
|
576
|
-
cwd,
|
|
577
|
-
llm: {
|
|
578
|
-
generate: (modelId: string, system: string, prompt: string, maxTokens?: number) =>
|
|
579
|
-
llm.generate(modelId, system, prompt, maxTokens),
|
|
580
|
-
},
|
|
581
|
-
processMessageFn,
|
|
582
|
-
detectVerifyRecipe,
|
|
583
|
-
respondToPreflight,
|
|
584
|
-
};
|
|
585
|
-
|
|
586
|
-
const taskResult = yield* runMaintenanceTask({
|
|
587
|
-
task,
|
|
588
|
-
codebaseIntel: intel,
|
|
589
|
-
ctx,
|
|
590
|
-
leaderModelId: sessionModelId,
|
|
591
|
-
costAware: true,
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
if (taskResult.status !== "done") {
|
|
595
|
-
yield {
|
|
596
|
-
type: "content",
|
|
597
|
-
content: `\n> Mode C halted at status=${taskResult.status}: ${taskResult.failureReason ?? "unknown"}\n`,
|
|
598
|
-
} as StreamChunk;
|
|
599
|
-
return { runId, stage: "halted", success: false, reason: taskResult.failureReason ?? taskResult.status };
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
yield { type: "content", content: "\n> Building PR artifact...\n" } as StreamChunk;
|
|
603
|
-
let pr: Awaited<ReturnType<typeof buildPr>>;
|
|
604
|
-
try {
|
|
605
|
-
pr = await buildPr({
|
|
606
|
-
task,
|
|
607
|
-
codebaseIntel: intel,
|
|
608
|
-
result: taskResult,
|
|
609
|
-
cwd,
|
|
610
|
-
leaderModelId: sessionModelId,
|
|
611
|
-
costAware: true,
|
|
612
|
-
llm: { generate: ctx.llm.generate },
|
|
613
|
-
});
|
|
614
|
-
} catch (err) {
|
|
615
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
616
|
-
yield { type: "content", content: `\n> PR build failed: ${msg}\n` } as StreamChunk;
|
|
617
|
-
return { runId, stage: "halted", success: false, reason: `pr_build_failed: ${msg}` };
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
// Always persist PR artifact for the user to review.
|
|
621
|
-
const prMdPath = pathMod.join(flowDir, "runs", runId, "pr.md");
|
|
622
|
-
try {
|
|
623
|
-
await fsp.mkdir(pathMod.dirname(prMdPath), { recursive: true });
|
|
624
|
-
const persistBody = `# ${pr.title}\n\nBranch: \`${pr.branch}\`\n\n${pr.body}\n\n---\n\n\`\`\`diff\n${pr.diff}\n\`\`\`\n`;
|
|
625
|
-
await fsp.writeFile(prMdPath, persistBody, "utf8");
|
|
626
|
-
} catch {
|
|
627
|
-
/* non-fatal */
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
yield {
|
|
631
|
-
type: "content",
|
|
632
|
-
content: `\n## PR ready: ${pr.title}\nBranch: \`${pr.branch}\`\nFiles changed: ${pr.changedFiles.length}${
|
|
633
|
-
pr.filesOutsideRadius.length > 0 ? ` (${pr.filesOutsideRadius.length} outside declared radius)` : ""
|
|
634
|
-
}\nArtifact: \`${prMdPath}\`\n\n${pr.body}\n`,
|
|
635
|
-
} as StreamChunk;
|
|
636
|
-
|
|
637
|
-
if (opts.ghPr) {
|
|
638
|
-
yield { type: "content", content: "\n> Creating PR via gh CLI...\n" } as StreamChunk;
|
|
639
|
-
const ghResult = await ghCreatePr({ branch: pr.branch, title: pr.title, body: pr.body, cwd });
|
|
640
|
-
if (ghResult.ok && ghResult.url) {
|
|
641
|
-
yield { type: "content", content: `\n> PR created: ${ghResult.url}\n` } as StreamChunk;
|
|
642
|
-
} else {
|
|
643
|
-
yield {
|
|
644
|
-
type: "content",
|
|
645
|
-
content: `\n> gh pr create skipped/failed: ${ghResult.reason ?? "unknown"}\n`,
|
|
646
|
-
} as StreamChunk;
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
return { runId, stage: "approved", success: true, reason: "pr_ready", sprintsRun: 1, shipped: true };
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
/** start: createRun → loop-driver (gather/research/scoping) → sprint loop → done|halted. */
|
|
654
|
-
async function* runStart(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
655
|
-
const { idea, flowDir, llm, flags, respondToQuestion, respondToPreflight } = opts;
|
|
656
|
-
if (!idea?.trim()) {
|
|
657
|
-
yield { type: "content", content: "error: /ideal start requires an idea" } as StreamChunk;
|
|
658
|
-
return { runId: "", stage: "error", success: false, reason: "missing_idea" };
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
const runState = await createRun(flowDir);
|
|
662
|
-
const runId = runState.id;
|
|
663
|
-
|
|
664
|
-
await writeManifest(flowDir, runId, {
|
|
665
|
-
idea,
|
|
666
|
-
capUsd: flags.maxCost,
|
|
667
|
-
maxSprints: flags.maxSprints,
|
|
668
|
-
doneThreshold: flags.doneThreshold,
|
|
669
|
-
stack: flags.stack,
|
|
670
|
-
createdAt: new Date(),
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
// Surface a cost-vs-cap preview before the loop kicks off so $50 isn't
|
|
674
|
-
// an arbitrary number — show predicted spend per sprint × max-sprints
|
|
675
|
-
// against the configured cap, with a recommended max-sprints if it
|
|
676
|
-
// would exceed. Falls back gracefully for unknown-pricing models.
|
|
677
|
-
const preview = previewRunCost({
|
|
678
|
-
sessionModelId: opts.sessionModelId,
|
|
679
|
-
maxSprints: flags.maxSprints,
|
|
680
|
-
capUsd: flags.maxCost,
|
|
681
|
-
});
|
|
682
|
-
yield { type: "content", content: `\n${formatCostPreview(preview)}\n` } as StreamChunk;
|
|
683
|
-
|
|
684
|
-
// Emit route-decision harness event (agent-mode only; no-op otherwise).
|
|
685
|
-
try {
|
|
686
|
-
const _ar = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
|
|
687
|
-
| { emitEvent: (e: unknown) => void }
|
|
688
|
-
| undefined;
|
|
689
|
-
_ar?.emitEvent({
|
|
690
|
-
t: "event",
|
|
691
|
-
kind: "route-decision",
|
|
692
|
-
path: "council",
|
|
693
|
-
complexity: opts.complexity ?? "unknown",
|
|
694
|
-
forceCouncil: !!opts.flags.forceCouncil,
|
|
695
|
-
sufficiencyMissing: opts.sufficiencyMissing ?? [],
|
|
696
|
-
runId,
|
|
697
|
-
});
|
|
698
|
-
} catch {
|
|
699
|
-
/* best-effort */
|
|
700
|
-
}
|
|
701
|
-
logUIInteraction(opts.sessionId, {
|
|
702
|
-
subtype: "route_decision",
|
|
703
|
-
data: {
|
|
704
|
-
path: "council",
|
|
705
|
-
complexity: opts.complexity ?? "unknown",
|
|
706
|
-
forceCouncil: !!opts.flags.forceCouncil,
|
|
707
|
-
sufficiencyMissing: opts.sufficiencyMissing ?? [],
|
|
708
|
-
runId,
|
|
709
|
-
},
|
|
710
|
-
});
|
|
711
|
-
|
|
712
|
-
const ctx: DriverContext = {
|
|
713
|
-
runId,
|
|
714
|
-
flowDir,
|
|
715
|
-
idea,
|
|
716
|
-
sessionModelId: opts.sessionModelId,
|
|
717
|
-
llm,
|
|
718
|
-
flags,
|
|
719
|
-
respondToQuestion,
|
|
720
|
-
respondToPreflight,
|
|
721
|
-
cwd: opts.cwd,
|
|
722
|
-
sessionId: opts.sessionId,
|
|
723
|
-
processMessageFn: opts.processMessageFn,
|
|
724
|
-
detectVerifyRecipe: opts.detectVerifyRecipe,
|
|
725
|
-
skipPriorContext: opts.skipPriorContext,
|
|
726
|
-
sufficiencyMissing: opts.sufficiencyMissing,
|
|
727
|
-
};
|
|
728
|
-
|
|
729
|
-
// Phase 1: outer FSM (gather → research → scoping → approved | halted).
|
|
730
|
-
const driverGen = runLoopDriver(ctx);
|
|
731
|
-
let driverResult: DriverResult | undefined;
|
|
732
|
-
try {
|
|
733
|
-
while (true) {
|
|
734
|
-
const { value, done } = await driverGen.next();
|
|
735
|
-
if (done) {
|
|
736
|
-
driverResult = value as DriverResult;
|
|
737
|
-
break;
|
|
738
|
-
}
|
|
739
|
-
yield value as StreamChunk;
|
|
740
|
-
}
|
|
741
|
-
} catch (err) {
|
|
742
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
743
|
-
// Persist the halt/crash so forensics can surface it via `usage forensics`.
|
|
744
|
-
// Circuit-breaker rejections (CB-1 cost-projection in sprint-runner) are
|
|
745
|
-
// the common case — they previously vanished into the TUI scrollback only.
|
|
746
|
-
try {
|
|
747
|
-
const sid = opts.sessionId ?? runId;
|
|
748
|
-
const isCB = msg.startsWith("Halted by circuit breaker");
|
|
749
|
-
logInteraction(sid, "council", {
|
|
750
|
-
eventSubtype: isCB ? "sprint_halt" : "loop_error",
|
|
751
|
-
data: {
|
|
752
|
-
runId,
|
|
753
|
-
stage: "driver",
|
|
754
|
-
reason: msg.slice(0, 2000),
|
|
755
|
-
isCircuitBreaker: isCB,
|
|
756
|
-
},
|
|
757
|
-
});
|
|
758
|
-
} catch {
|
|
759
|
-
/* best-effort */
|
|
760
|
-
}
|
|
761
|
-
yield { type: "error", error: true, content: msg } as any;
|
|
762
|
-
return { runId, stage: "error", success: false, reason: msg };
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
if (!driverResult?.success || driverResult.stage !== "approved") {
|
|
766
|
-
return { ...driverResult!, runId };
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
// Phase 2: sprint loop until done or halted.
|
|
770
|
-
const productSpec = await loadProductSpec(flowDir, runId, idea, opts.flags.stack);
|
|
771
|
-
const roleAssignments = opts.roleAssignments ?? (await resolveRoleAssignments(opts.sessionModelId));
|
|
772
|
-
|
|
773
|
-
// A2: Build Backlog + Sprint Plan before entering the sprint loop.
|
|
774
|
-
// Idempotent — skips if backlog.json / sprint-plan.json already exist (resume safety).
|
|
775
|
-
const { sprintCount, sprintIds } = await buildBacklogAndSprintPlan({
|
|
776
|
-
flowDir,
|
|
777
|
-
runId,
|
|
778
|
-
productSpec,
|
|
779
|
-
ctx,
|
|
780
|
-
sessionModelId: opts.sessionModelId,
|
|
781
|
-
maxSprints: flags.maxSprints,
|
|
782
|
-
onChunk: (chunk) => void chunk, // chunks yielded below via the emit event
|
|
783
|
-
});
|
|
784
|
-
|
|
785
|
-
// Yield a brief confirmation chunk so the user sees the committed plan.
|
|
786
|
-
yield {
|
|
787
|
-
type: "content",
|
|
788
|
-
content: `\n> Committed: ${sprintCount} sprint${sprintCount === 1 ? "" : "s"} planned. Sprint 1 active.\n`,
|
|
789
|
-
} as StreamChunk;
|
|
790
|
-
|
|
791
|
-
try {
|
|
792
|
-
const _ar = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
|
|
793
|
-
| { emitEvent: (e: unknown) => void }
|
|
794
|
-
| undefined;
|
|
795
|
-
_ar?.emitEvent({
|
|
796
|
-
t: "event",
|
|
797
|
-
kind: "sprint-plan-committed",
|
|
798
|
-
runId,
|
|
799
|
-
projectDir: opts.cwd ?? null,
|
|
800
|
-
sprintCount,
|
|
801
|
-
sprintIds,
|
|
802
|
-
source: "council",
|
|
803
|
-
ts: Date.now(),
|
|
804
|
-
});
|
|
805
|
-
} catch {
|
|
806
|
-
/* best-effort */
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
// B1: update active-run store so StatusBar shows sprint progress.
|
|
810
|
-
// B2: auto-fire "run started" to Discord when configured.
|
|
811
|
-
try {
|
|
812
|
-
const { productSlug: deriveSlug } = await import("./product-identity.js");
|
|
813
|
-
const slug = deriveSlug(idea);
|
|
814
|
-
activeRunStore.setActiveRun(runId, flowDir, slug);
|
|
815
|
-
fireAutoReport("sprint-plan-committed", { runId, flowDir, productSlug: slug, sprintCount });
|
|
816
|
-
} catch {
|
|
817
|
-
/* best-effort — never break /ideal over status bar or reporter */
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
// Subsystem E: phase-orchestrated path (default ON; set MUONROI_PHASE_MODE=0 for legacy).
|
|
821
|
-
if (process.env.MUONROI_PHASE_MODE !== "0") {
|
|
822
|
-
const phaseResult = yield* runPhasesPath({ ctx, productSpec, roleAssignments });
|
|
823
|
-
if (phaseResult !== null) return phaseResult;
|
|
824
|
-
// phaseResult === null means runPhases prerequisites were unavailable; fall through to legacy.
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
return yield* drainSprints({
|
|
828
|
-
ctx,
|
|
829
|
-
productSpec,
|
|
830
|
-
roleAssignments,
|
|
831
|
-
history: [],
|
|
832
|
-
flags,
|
|
833
|
-
});
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
/**
|
|
837
|
-
* A2 — Build Backlog + Sprint Plan after the council debate has produced a ProductSpec.
|
|
838
|
-
*
|
|
839
|
-
* Idempotent: skips if backlog.json / sprint-plan.json already exist on disk
|
|
840
|
-
* (safe for resume flows that re-enter runStart after a crash).
|
|
841
|
-
*
|
|
842
|
-
* Returns the sprintCount + sprintIds that were committed (new or pre-existing),
|
|
843
|
-
* for use in the sprint-plan-committed harness event.
|
|
844
|
-
*
|
|
845
|
-
* Model selection: delegates to backlog-builder.ts + sprint-planner.ts which both
|
|
846
|
-
* use pickCouncilTaskModel — NO hardcoded model ids here.
|
|
847
|
-
*/
|
|
848
|
-
async function buildBacklogAndSprintPlan(args: {
|
|
849
|
-
flowDir: string;
|
|
850
|
-
runId: string;
|
|
851
|
-
productSpec: ProductSpec;
|
|
852
|
-
ctx: DriverContext;
|
|
853
|
-
sessionModelId: string;
|
|
854
|
-
maxSprints: number;
|
|
855
|
-
onChunk: (chunk: StreamChunk) => void;
|
|
856
|
-
}): Promise<{ sprintCount: number; sprintIds: string[] }> {
|
|
857
|
-
const { flowDir, runId, productSpec, ctx, sessionModelId, maxSprints } = args;
|
|
858
|
-
|
|
859
|
-
// ── Check idempotency ──────────────────────────────────────────────────────
|
|
860
|
-
const existingBacklog = await readBacklog(flowDir, runId).catch(() => null);
|
|
861
|
-
const existingPlan = await readSprintPlan(flowDir, runId).catch(() => null);
|
|
862
|
-
|
|
863
|
-
if (existingBacklog && existingPlan) {
|
|
864
|
-
// Already built — return existing sprint ids for the harness event.
|
|
865
|
-
const ids = existingPlan.sprints.map((s) => s.id);
|
|
866
|
-
return { sprintCount: ids.length, sprintIds: ids };
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
// ── Derive ImplementationPlanArtifact from ProductSpec ────────────────────
|
|
870
|
-
// ProductSpec.mvp is a string[] of feature titles. Map each to a mvp_definition
|
|
871
|
-
// entry. This avoids an extra LLM call — the council debate has already produced
|
|
872
|
-
// the plan text; we just need to structure it for the backlog builder.
|
|
873
|
-
const implementationPlan: ImplementationPlanArtifact = {
|
|
874
|
-
mvp_definition: productSpec.mvp.map((feature) => ({
|
|
875
|
-
feature,
|
|
876
|
-
included_in_v1: "yes" as const,
|
|
877
|
-
})),
|
|
878
|
-
acceptance_criteria: [], // council debate artifacts are in delegations.md; keep empty here
|
|
879
|
-
entities: [],
|
|
880
|
-
endpoints: [],
|
|
881
|
-
};
|
|
882
|
-
|
|
883
|
-
const leaderModelId = resolveLeaderModel(sessionModelId);
|
|
884
|
-
|
|
885
|
-
// ── Build Backlog ──────────────────────────────────────────────────────────
|
|
886
|
-
let backlog = existingBacklog;
|
|
887
|
-
if (!backlog) {
|
|
888
|
-
try {
|
|
889
|
-
// Build ClarifiedSpec from persisted project context (written by loop-driver).
|
|
890
|
-
const { readProjectContext } = await import("./discovery-persistence.js");
|
|
891
|
-
const { clarifiedSpecFromContext } = await import("./gather.js");
|
|
892
|
-
const projectContext = await readProjectContext(flowDir, runId);
|
|
893
|
-
const clarifiedSpec = projectContext
|
|
894
|
-
? clarifiedSpecFromContext(projectContext)
|
|
895
|
-
: {
|
|
896
|
-
problemStatement: productSpec.idea,
|
|
897
|
-
constraints: [],
|
|
898
|
-
successCriteria: productSpec.mvp,
|
|
899
|
-
scope: productSpec.idea,
|
|
900
|
-
rawQA: [],
|
|
901
|
-
resolved: {} as Record<string, "answered" | "unspecified" | "skipped">,
|
|
902
|
-
};
|
|
903
|
-
|
|
904
|
-
backlog = await buildBacklog({
|
|
905
|
-
runId,
|
|
906
|
-
productSlug: productSpec.idea.slice(0, 40).replace(/\s+/g, "-").toLowerCase(),
|
|
907
|
-
spec: clarifiedSpec,
|
|
908
|
-
implementationPlan,
|
|
909
|
-
llm: ctx.llm,
|
|
910
|
-
leaderModelId,
|
|
911
|
-
costAware: true,
|
|
912
|
-
});
|
|
913
|
-
await writeBacklog(flowDir, runId, backlog);
|
|
914
|
-
} catch (err) {
|
|
915
|
-
// Non-fatal: sprint-runner has a backlog fallback (backlogAnchor="" when null).
|
|
916
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
917
|
-
args.onChunk({ type: "content", content: `\n> [backlog] Build skipped: ${msg}\n` } as StreamChunk);
|
|
918
|
-
// Return a synthetic single-sprint plan so the harness event fires correctly.
|
|
919
|
-
const sprintIds = Array.from({ length: maxSprints }, (_, i) => `sprint-${i + 1}`);
|
|
920
|
-
return { sprintCount: maxSprints, sprintIds };
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
// ── Plan Sprints ───────────────────────────────────────────────────────────
|
|
925
|
-
let plan = existingPlan;
|
|
926
|
-
if (!plan) {
|
|
927
|
-
try {
|
|
928
|
-
plan = await planSprints({
|
|
929
|
-
runId,
|
|
930
|
-
backlog,
|
|
931
|
-
llm: ctx.llm,
|
|
932
|
-
leaderModelId,
|
|
933
|
-
costAware: true,
|
|
934
|
-
targetEffortPerSprint: 8,
|
|
935
|
-
});
|
|
936
|
-
await writeSprintPlan(flowDir, runId, plan);
|
|
937
|
-
// Update each BacklogItem with status="in_sprint" + assigned_sprint.
|
|
938
|
-
await applySprintAssignments(flowDir, runId, plan);
|
|
939
|
-
} catch (err) {
|
|
940
|
-
// Non-fatal: build a synthetic plan from maxSprints.
|
|
941
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
942
|
-
args.onChunk({ type: "content", content: `\n> [sprint-plan] Build skipped: ${msg}\n` } as StreamChunk);
|
|
943
|
-
const sprintIds = Array.from({ length: maxSprints }, (_, i) => `sprint-${i + 1}`);
|
|
944
|
-
return { sprintCount: maxSprints, sprintIds };
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
// ── Set Sprint 1 Active ────────────────────────────────────────────────────
|
|
949
|
-
if (plan.sprints.length > 0 && !plan.activeSprintId) {
|
|
950
|
-
try {
|
|
951
|
-
const firstSprintId = plan.sprints[0]!.id;
|
|
952
|
-
await setActiveSprint(flowDir, runId, firstSprintId);
|
|
953
|
-
} catch {
|
|
954
|
-
/* non-fatal */
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
|
|
958
|
-
const ids = plan.sprints.map((s) => s.id);
|
|
959
|
-
return {
|
|
960
|
-
sprintCount: ids.length || maxSprints,
|
|
961
|
-
sprintIds: ids.length > 0 ? ids : Array.from({ length: maxSprints }, (_, i) => `sprint-${i + 1}`),
|
|
962
|
-
};
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
/** Drive sprint-runner repeatedly, honoring max-sprints and continue-feedback routing. */
|
|
966
|
-
async function* drainSprints(args: {
|
|
967
|
-
ctx: DriverContext;
|
|
968
|
-
productSpec: ProductSpec;
|
|
969
|
-
roleAssignments: Map<RoleSlot, { modelId: string; provider: string; tier?: string }>;
|
|
970
|
-
history: IterationState[];
|
|
971
|
-
flags: ProductLoopFlags;
|
|
972
|
-
}): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
973
|
-
const { ctx, productSpec, roleAssignments, flags } = args;
|
|
974
|
-
const history = args.history.slice();
|
|
975
|
-
let carryOver: ContinueFeedback | undefined;
|
|
976
|
-
let sprintsRun = 0;
|
|
977
|
-
|
|
978
|
-
for (let sprintN = history.length + 1; sprintN <= flags.maxSprints; sprintN++) {
|
|
979
|
-
let iter: IterationState;
|
|
980
|
-
// Check token budget
|
|
981
|
-
if (flags.budgetTokens) {
|
|
982
|
-
const { getProductTotalTokens } = await import("../usage/product-ledger.js");
|
|
983
|
-
const totalTokens = await getProductTotalTokens(ctx.runId);
|
|
984
|
-
if (totalTokens > flags.budgetTokens) {
|
|
985
|
-
yield {
|
|
986
|
-
type: "halt",
|
|
987
|
-
haltChunk: {
|
|
988
|
-
type: "halt",
|
|
989
|
-
reason: "budget_exhausted",
|
|
990
|
-
detail: `Token budget exceeded: used ${totalTokens} > limit ${flags.budgetTokens}`,
|
|
991
|
-
recovery_options: [],
|
|
992
|
-
},
|
|
993
|
-
} as StreamChunk;
|
|
994
|
-
return { runId: ctx.runId, stage: "halted", success: false, reason: "budget exhausted" };
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
try {
|
|
998
|
-
const sprintGen = runSprint({
|
|
999
|
-
sprintN,
|
|
1000
|
-
ctx,
|
|
1001
|
-
productSpec,
|
|
1002
|
-
roleAssignments,
|
|
1003
|
-
history,
|
|
1004
|
-
carryOver,
|
|
1005
|
-
});
|
|
1006
|
-
let result: IterationState | undefined;
|
|
1007
|
-
while (true) {
|
|
1008
|
-
const step = await sprintGen.next();
|
|
1009
|
-
if (step.done) {
|
|
1010
|
-
result = step.value as IterationState;
|
|
1011
|
-
break;
|
|
1012
|
-
}
|
|
1013
|
-
// Site 2 — forward halt chunk to UI, mark stage halted, stop iteration.
|
|
1014
|
-
if (step.value && (step.value as StreamChunk).type === "halt") {
|
|
1015
|
-
yield step.value as StreamChunk;
|
|
1016
|
-
const haltReason = (step.value as StreamChunk).haltChunk?.reason ?? "no_recipe";
|
|
1017
|
-
const manifest = await readManifest(ctx.flowDir, ctx.runId);
|
|
1018
|
-
if (manifest) {
|
|
1019
|
-
await writeManifest(ctx.flowDir, ctx.runId, {
|
|
1020
|
-
...manifest,
|
|
1021
|
-
verdict: { pass: false, score: 0, reason: haltReason, failedCondition: undefined as any },
|
|
1022
|
-
});
|
|
1023
|
-
}
|
|
1024
|
-
// B2: auto-fire halt notification; B1: clear active-run.
|
|
1025
|
-
try {
|
|
1026
|
-
const { productSlug: deriveSlug } = await import("./product-identity.js");
|
|
1027
|
-
const slug = deriveSlug(productSpec.idea);
|
|
1028
|
-
fireAutoReport("sprint-halt", { runId: ctx.runId, flowDir: ctx.flowDir, productSlug: slug, haltReason });
|
|
1029
|
-
activeRunStore.clearActiveRun();
|
|
1030
|
-
} catch {
|
|
1031
|
-
/* best-effort */
|
|
1032
|
-
}
|
|
1033
|
-
return {
|
|
1034
|
-
runId: ctx.runId,
|
|
1035
|
-
stage: "halted",
|
|
1036
|
-
success: false,
|
|
1037
|
-
reason: haltReason,
|
|
1038
|
-
sprintsRun,
|
|
1039
|
-
};
|
|
1040
|
-
}
|
|
1041
|
-
yield step.value as StreamChunk;
|
|
1042
|
-
}
|
|
1043
|
-
iter = result!;
|
|
1044
|
-
} catch (err) {
|
|
1045
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1046
|
-
yield { type: "content", content: `\n> Sprint ${sprintN} halted: ${msg}\n` } as StreamChunk;
|
|
1047
|
-
// Persist the sprint halt so forensics replay surfaces it. CB-1 cost
|
|
1048
|
-
// projection breaches (`Halted by circuit breaker: …`) are by far the
|
|
1049
|
-
// common case and they previously vanished into TUI scrollback only.
|
|
1050
|
-
try {
|
|
1051
|
-
const sid = ctx.sessionId ?? ctx.runId;
|
|
1052
|
-
const isCB = msg.startsWith("Halted by circuit breaker");
|
|
1053
|
-
logInteraction(sid, "council", {
|
|
1054
|
-
eventSubtype: "sprint_halt",
|
|
1055
|
-
data: {
|
|
1056
|
-
runId: ctx.runId,
|
|
1057
|
-
sprintN,
|
|
1058
|
-
stage: "sprint",
|
|
1059
|
-
reason: msg.slice(0, 2000),
|
|
1060
|
-
isCircuitBreaker: isCB,
|
|
1061
|
-
sprintsRun,
|
|
1062
|
-
},
|
|
1063
|
-
});
|
|
1064
|
-
} catch {
|
|
1065
|
-
/* best-effort */
|
|
1066
|
-
}
|
|
1067
|
-
// Mark manifest as halted (not aborted) so resume can pick up.
|
|
1068
|
-
const manifest = await readManifest(ctx.flowDir, ctx.runId);
|
|
1069
|
-
if (manifest) {
|
|
1070
|
-
await writeManifest(ctx.flowDir, ctx.runId, {
|
|
1071
|
-
...manifest,
|
|
1072
|
-
verdict: { pass: false, score: 0, reason: msg, failedCondition: undefined as any },
|
|
1073
|
-
});
|
|
1074
|
-
}
|
|
1075
|
-
// B2: auto-fire halt notification; B1: clear active-run.
|
|
1076
|
-
try {
|
|
1077
|
-
const { productSlug: deriveSlug } = await import("./product-identity.js");
|
|
1078
|
-
const slug = deriveSlug(productSpec.idea);
|
|
1079
|
-
fireAutoReport("sprint-halt", { runId: ctx.runId, flowDir: ctx.flowDir, productSlug: slug, haltReason: msg });
|
|
1080
|
-
activeRunStore.clearActiveRun();
|
|
1081
|
-
} catch {
|
|
1082
|
-
/* best-effort */
|
|
1083
|
-
}
|
|
1084
|
-
return {
|
|
1085
|
-
runId: ctx.runId,
|
|
1086
|
-
stage: "halted",
|
|
1087
|
-
success: false,
|
|
1088
|
-
reason: msg,
|
|
1089
|
-
sprintsRun,
|
|
1090
|
-
};
|
|
1091
|
-
}
|
|
1092
|
-
|
|
1093
|
-
history.push(iter);
|
|
1094
|
-
sprintsRun++;
|
|
1095
|
-
|
|
1096
|
-
// B2: auto-fire sprint-done when judgment stage completes.
|
|
1097
|
-
// Compute overall pct from current iteration state.
|
|
1098
|
-
try {
|
|
1099
|
-
const { productSlug: deriveSlug } = await import("./product-identity.js");
|
|
1100
|
-
const slug = deriveSlug(productSpec.idea);
|
|
1101
|
-
// Compute overall completion pct across all sprints (rough estimate from criteria).
|
|
1102
|
-
const totalCriteria = (iter.criteriaMet ?? 0) + (iter.criteriaPartial ?? 0) + (iter.criteriaUnmet ?? 0);
|
|
1103
|
-
const overallPct = totalCriteria > 0 ? Math.round(((iter.criteriaMet ?? 0) / totalCriteria) * 1000) / 10 : 0;
|
|
1104
|
-
const verdict = iter.lastVerifyResult === "PASS" ? "pass" : "fail";
|
|
1105
|
-
fireAutoReport("sprint-done", {
|
|
1106
|
-
runId: ctx.runId,
|
|
1107
|
-
flowDir: ctx.flowDir,
|
|
1108
|
-
productSlug: slug,
|
|
1109
|
-
sprintN,
|
|
1110
|
-
pct: overallPct,
|
|
1111
|
-
verdict,
|
|
1112
|
-
});
|
|
1113
|
-
} catch {
|
|
1114
|
-
/* best-effort */
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
if (iter.stage === "shipped") {
|
|
1118
|
-
// Final manifest update + EE pass outcome
|
|
1119
|
-
const manifest = await readManifest(ctx.flowDir, ctx.runId);
|
|
1120
|
-
if (manifest) {
|
|
1121
|
-
await writeManifest(ctx.flowDir, ctx.runId, {
|
|
1122
|
-
...manifest,
|
|
1123
|
-
doneAt: new Date(),
|
|
1124
|
-
verdict: {
|
|
1125
|
-
pass: true,
|
|
1126
|
-
score: iter.scoreAfter,
|
|
1127
|
-
failedCondition: undefined as any,
|
|
1128
|
-
reason: "all_conditions_met",
|
|
1129
|
-
},
|
|
1130
|
-
});
|
|
1131
|
-
}
|
|
1132
|
-
// Ship-time delivery polish: scaffold README, fill package.json
|
|
1133
|
-
// metadata, write delivery-notes. Idempotent + non-destructive.
|
|
1134
|
-
if (ctx.cwd) {
|
|
1135
|
-
try {
|
|
1136
|
-
const polish = await polishDelivery({
|
|
1137
|
-
cwd: ctx.cwd,
|
|
1138
|
-
runDir: path.join(ctx.flowDir, "runs", ctx.runId),
|
|
1139
|
-
productSpec,
|
|
1140
|
-
runId: ctx.runId,
|
|
1141
|
-
});
|
|
1142
|
-
if (polish.notes.length > 0) {
|
|
1143
|
-
yield {
|
|
1144
|
-
type: "content",
|
|
1145
|
-
content: `\n**Delivery polish:**\n${polish.notes.map((n) => `- ${n}`).join("\n")}\n`,
|
|
1146
|
-
} as StreamChunk;
|
|
1147
|
-
}
|
|
1148
|
-
} catch (err) {
|
|
1149
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1150
|
-
yield { type: "content", content: `\n_Delivery polish skipped: ${msg}_\n` } as StreamChunk;
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
// P1.3: extract run artifacts to EE for cross-run memory. Non-fatal —
|
|
1154
|
-
// EE client absorbs failures into the offline queue.
|
|
1155
|
-
// P1.6: log telemetry for the extract outcome.
|
|
1156
|
-
if (ctx.cwd) {
|
|
1157
|
-
const eeResult = await extractRunToEE(ctx.flowDir, ctx.runId, ctx.cwd);
|
|
1158
|
-
try {
|
|
1159
|
-
logInteraction(ctx.sessionId ?? ctx.runId, "ee_injection", {
|
|
1160
|
-
eventSubtype: "extract",
|
|
1161
|
-
durationMs: Math.round(eeResult.durationMs),
|
|
1162
|
-
data: {
|
|
1163
|
-
ok: eeResult.ok,
|
|
1164
|
-
mistakes: eeResult.mistakes ?? null,
|
|
1165
|
-
stored: eeResult.stored ?? null,
|
|
1166
|
-
},
|
|
1167
|
-
});
|
|
1168
|
-
} catch {
|
|
1169
|
-
// DB errors must not break /ideal
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
// B1: clear active-run on successful ship.
|
|
1173
|
-
activeRunStore.clearActiveRun();
|
|
1174
|
-
return {
|
|
1175
|
-
runId: ctx.runId,
|
|
1176
|
-
stage: "approved",
|
|
1177
|
-
success: true,
|
|
1178
|
-
reason: "shipped",
|
|
1179
|
-
sprintsRun,
|
|
1180
|
-
shipped: true,
|
|
1181
|
-
};
|
|
1182
|
-
}
|
|
1183
|
-
|
|
1184
|
-
// Build continue-feedback for next iteration. The DoneVerdict is not
|
|
1185
|
-
// surfaced from sprint-runner directly, but the iteration state encodes
|
|
1186
|
-
// enough — derive a synthetic verdict from criteria counts.
|
|
1187
|
-
carryOver = {
|
|
1188
|
-
focus:
|
|
1189
|
-
iter.lastVerifyResult === "PASS"
|
|
1190
|
-
? `improve criteria coverage: met=${iter.criteriaMet}, partial=${iter.criteriaPartial}, unmet=${iter.criteriaUnmet}`
|
|
1191
|
-
: `fix verify failures (last result: ${iter.lastVerifyResult})`,
|
|
1192
|
-
};
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
yield {
|
|
1196
|
-
type: "content",
|
|
1197
|
-
content: `\n> Reached max-sprints (${flags.maxSprints}) without satisfying Definition-of-Done.\n`,
|
|
1198
|
-
} as StreamChunk;
|
|
1199
|
-
// B1: clear active-run when max-sprints reached.
|
|
1200
|
-
activeRunStore.clearActiveRun();
|
|
1201
|
-
return {
|
|
1202
|
-
runId: ctx.runId,
|
|
1203
|
-
stage: "halted",
|
|
1204
|
-
success: false,
|
|
1205
|
-
reason: "max_sprints_reached",
|
|
1206
|
-
sprintsRun,
|
|
1207
|
-
};
|
|
1208
|
-
}
|
|
1209
|
-
|
|
1210
|
-
function chatEnvConfig(): { client: import("../chat/types.js").ChatClient } | null {
|
|
1211
|
-
// Lazy load to avoid circular imports
|
|
1212
|
-
const { readChatProvider } = require("../chat/factory.js") as typeof import("../chat/factory.js");
|
|
1213
|
-
const client = readChatProvider();
|
|
1214
|
-
return client ? { client } : null;
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1217
|
-
/**
|
|
1218
|
-
* Best-effort auto-fire helper (B2).
|
|
1219
|
-
* Fires-and-forgets a reporter event; never throws.
|
|
1220
|
-
* Only does I/O when a Discord client is configured AND reporter.autoFire=true.
|
|
1221
|
-
*/
|
|
1222
|
-
function fireAutoReport(
|
|
1223
|
-
kind: import("../reporter/auto-fire.js").AutoFireEvent["kind"],
|
|
1224
|
-
opts: {
|
|
1225
|
-
runId: string;
|
|
1226
|
-
flowDir: string;
|
|
1227
|
-
productSlug: string;
|
|
1228
|
-
sprintN?: number;
|
|
1229
|
-
pct?: number;
|
|
1230
|
-
verdict?: "pass" | "fail";
|
|
1231
|
-
haltReason?: string;
|
|
1232
|
-
sprintCount?: number;
|
|
1233
|
-
},
|
|
1234
|
-
): void {
|
|
1235
|
-
const chatCfg = chatEnvConfig();
|
|
1236
|
-
if (!chatCfg) return;
|
|
1237
|
-
void maybeAutoFire(
|
|
1238
|
-
{
|
|
1239
|
-
kind,
|
|
1240
|
-
runId: opts.runId,
|
|
1241
|
-
flowDir: opts.flowDir,
|
|
1242
|
-
productSlug: opts.productSlug,
|
|
1243
|
-
sprintN: opts.sprintN,
|
|
1244
|
-
pct: opts.pct,
|
|
1245
|
-
verdict: opts.verdict,
|
|
1246
|
-
haltReason: opts.haltReason,
|
|
1247
|
-
sprintCount: opts.sprintCount,
|
|
1248
|
-
},
|
|
1249
|
-
{
|
|
1250
|
-
chat: chatCfg.client,
|
|
1251
|
-
resolveChannelId: defaultResolveChannelId,
|
|
1252
|
-
},
|
|
1253
|
-
);
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
|
-
/**
|
|
1257
|
-
* Phase-orchestrated sprint path (Subsystem E).
|
|
1258
|
-
*
|
|
1259
|
-
* Returns a ProductLoopResult when it ran to completion (pass or abort),
|
|
1260
|
-
* or null when prerequisites were unavailable (no projectContext) so the
|
|
1261
|
-
* caller can fall through to the legacy drainSprints path.
|
|
1262
|
-
*
|
|
1263
|
-
* Gated behind MUONROI_PHASE_MODE !== "0" by both callers (runStart / runResume).
|
|
1264
|
-
*/
|
|
1265
|
-
async function* runPhasesPath(args: {
|
|
1266
|
-
ctx: DriverContext;
|
|
1267
|
-
productSpec: ProductSpec;
|
|
1268
|
-
roleAssignments: Map<RoleSlot, { modelId: string; provider: string; tier?: string }>;
|
|
1269
|
-
}): AsyncGenerator<StreamChunk, ProductLoopResult | null, unknown> {
|
|
1270
|
-
const { ctx, productSpec, roleAssignments } = args;
|
|
1271
|
-
|
|
1272
|
-
// Load prerequisites: projectContext and manifest.
|
|
1273
|
-
const { readProjectContext } = await import("./discovery-persistence.js");
|
|
1274
|
-
const { getProductSpentUsd } = await import("../usage/product-ledger.js");
|
|
1275
|
-
const { runPhases } = await import("./phase-runner.js");
|
|
1276
|
-
|
|
1277
|
-
const projectContext = await readProjectContext(ctx.flowDir, ctx.runId);
|
|
1278
|
-
const manifest = await readManifest(ctx.flowDir, ctx.runId);
|
|
1279
|
-
|
|
1280
|
-
if (!projectContext || !manifest) {
|
|
1281
|
-
// Prerequisites unavailable — signal fall-through to legacy path.
|
|
1282
|
-
yield {
|
|
1283
|
-
type: "content",
|
|
1284
|
-
content: "\n> [phase-mode] projectContext or manifest unavailable — falling back to legacy sprint loop.\n",
|
|
1285
|
-
} as StreamChunk;
|
|
1286
|
-
return null;
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
// Build a ClarifiedSpec from the stored projectContext.
|
|
1290
|
-
const { clarifiedSpecFromContext } = await import("./gather.js");
|
|
1291
|
-
const clarifiedSpec = clarifiedSpecFromContext(projectContext);
|
|
1292
|
-
|
|
1293
|
-
// Resolve leader model id and build a LeaderLike adapter over ctx.llm.
|
|
1294
|
-
const leaderModelId = resolveLeaderModel(ctx.sessionModelId);
|
|
1295
|
-
const leader = {
|
|
1296
|
-
generate: (leaderArgs: { system: string; prompt: string; maxTokens: number }) =>
|
|
1297
|
-
ctx.llm.generate(leaderModelId, leaderArgs.system, leaderArgs.prompt).then((text) => ({
|
|
1298
|
-
content: text,
|
|
1299
|
-
costUsd: 0,
|
|
1300
|
-
})),
|
|
1301
|
-
};
|
|
1302
|
-
|
|
1303
|
-
// Build the sprintRunner adapter: runPhases passes { sprintN, phaseId, conversationContext, phaseScope }
|
|
1304
|
-
// while runSprint expects the full RunSprintArgs shape.
|
|
1305
|
-
// History is accumulated per-phase so circuit-breaker CB-2 (oscillation detection)
|
|
1306
|
-
// and carry-over between sprints within a phase work correctly.
|
|
1307
|
-
let currentPhaseId: string | null = null;
|
|
1308
|
-
let sprintHistory: IterationState[] = [];
|
|
1309
|
-
|
|
1310
|
-
const sprintRunner = async function* (sprintCtx: unknown) {
|
|
1311
|
-
const sc = sprintCtx as {
|
|
1312
|
-
sprintN: number;
|
|
1313
|
-
phaseId?: string;
|
|
1314
|
-
conversationContext?: string;
|
|
1315
|
-
phaseScope?: { criteria: string[]; scope: string };
|
|
1316
|
-
};
|
|
1317
|
-
|
|
1318
|
-
// Reset history when a new phase begins.
|
|
1319
|
-
if ((sc.phaseId ?? null) !== currentPhaseId) {
|
|
1320
|
-
currentPhaseId = sc.phaseId ?? null;
|
|
1321
|
-
sprintHistory = [];
|
|
1322
|
-
}
|
|
1323
|
-
|
|
1324
|
-
const inner = runSprint({
|
|
1325
|
-
sprintN: sc.sprintN,
|
|
1326
|
-
ctx,
|
|
1327
|
-
productSpec,
|
|
1328
|
-
roleAssignments,
|
|
1329
|
-
history: [...sprintHistory],
|
|
1330
|
-
phaseScope: sc.phaseScope,
|
|
1331
|
-
});
|
|
1332
|
-
|
|
1333
|
-
let result: IterationState | undefined;
|
|
1334
|
-
while (true) {
|
|
1335
|
-
const n = await inner.next();
|
|
1336
|
-
if (n.done) {
|
|
1337
|
-
result = n.value;
|
|
1338
|
-
break;
|
|
1339
|
-
}
|
|
1340
|
-
// Site 3 — no try/catch here; without explicit halt handling the generator
|
|
1341
|
-
// returns normally and the phase orchestrator treats it as a completed sprint.
|
|
1342
|
-
// Forward the halt chunk upstream so runPhases can surface it to the user.
|
|
1343
|
-
if (n.value && (n.value as StreamChunk).type === "halt") {
|
|
1344
|
-
yield n.value;
|
|
1345
|
-
// Return a sentinel IterationState so the phase runner records a halted stage.
|
|
1346
|
-
return {
|
|
1347
|
-
sprintN: sc.sprintN,
|
|
1348
|
-
stage: "halted",
|
|
1349
|
-
scoreBefore: 0,
|
|
1350
|
-
scoreAfter: 0,
|
|
1351
|
-
criteriaMet: 0,
|
|
1352
|
-
criteriaPartial: 0,
|
|
1353
|
-
criteriaUnmet: 0,
|
|
1354
|
-
costUsd: 0,
|
|
1355
|
-
lastVerifyResult: (n.value as any).reason ?? "no_recipe",
|
|
1356
|
-
} as IterationState;
|
|
1357
|
-
}
|
|
1358
|
-
yield n.value;
|
|
1359
|
-
}
|
|
1360
|
-
|
|
1361
|
-
// Accumulate completed sprint into history for subsequent sprints in this phase.
|
|
1362
|
-
if (result && typeof result === "object" && "criteriaMet" in result) {
|
|
1363
|
-
sprintHistory.push(result);
|
|
1364
|
-
}
|
|
1365
|
-
return result!;
|
|
1366
|
-
};
|
|
1367
|
-
|
|
1368
|
-
// Chat setup (opt-in via env vars; no-op when unset).
|
|
1369
|
-
const chatCfg = chatEnvConfig();
|
|
1370
|
-
let chatClient: import("../chat/types.js").ChatClient | null = null;
|
|
1371
|
-
let slug: string | null = null;
|
|
1372
|
-
if (chatCfg) {
|
|
1373
|
-
chatClient = chatCfg.client;
|
|
1374
|
-
const { productSlug } = await import("./product-identity.js");
|
|
1375
|
-
slug = productSlug(manifest.idea);
|
|
1376
|
-
}
|
|
1377
|
-
|
|
1378
|
-
// Terminal fallback: use respondToQuestion (the existing user-prompt API).
|
|
1379
|
-
// QuestionResponder takes a questionId string; the UI layer resolves the prompt text.
|
|
1380
|
-
const terminalFallback = async (): Promise<{ verdict: "accept" | "reject" | "abort"; feedback?: string }> => {
|
|
1381
|
-
const ans = await ctx.respondToQuestion("customer-review-verdict");
|
|
1382
|
-
const lower = (ans ?? "").trim().toLowerCase();
|
|
1383
|
-
if (lower.startsWith("x")) return { verdict: "abort" as const };
|
|
1384
|
-
if (lower.startsWith("r")) {
|
|
1385
|
-
const fb = await ctx.respondToQuestion("customer-review-feedback");
|
|
1386
|
-
return { verdict: "reject" as const, feedback: fb ?? "" };
|
|
1387
|
-
}
|
|
1388
|
-
return { verdict: "accept" as const };
|
|
1389
|
-
};
|
|
1390
|
-
|
|
1391
|
-
const awaitCustomerVerdict = async (verdictArgs: {
|
|
1392
|
-
flowDir: string;
|
|
1393
|
-
runId: string;
|
|
1394
|
-
phaseId: string;
|
|
1395
|
-
sprintN: number;
|
|
1396
|
-
reviewSummary: string;
|
|
1397
|
-
}): Promise<{ verdict: "accept" | "reject" | "abort"; feedback?: string }> => {
|
|
1398
|
-
if (!chatClient || !slug) return terminalFallback();
|
|
1399
|
-
const { ensureChannel } = await import("../chat/channel-manager.js");
|
|
1400
|
-
const { discordAwaitVerdict } = await import("../chat/verdict-resolver.js");
|
|
1401
|
-
const ch = await ensureChannel({
|
|
1402
|
-
client: chatClient,
|
|
1403
|
-
guildId: process.env.MUONROI_DISCORD_GUILD_ID ?? "unknown",
|
|
1404
|
-
slug,
|
|
1405
|
-
displayName: manifest.idea,
|
|
1406
|
-
});
|
|
1407
|
-
if (!ch) return terminalFallback();
|
|
1408
|
-
return discordAwaitVerdict({
|
|
1409
|
-
flowDir: verdictArgs.flowDir,
|
|
1410
|
-
runId: verdictArgs.runId,
|
|
1411
|
-
phaseId: verdictArgs.phaseId,
|
|
1412
|
-
sprintN: verdictArgs.sprintN,
|
|
1413
|
-
productSlug: slug,
|
|
1414
|
-
channelId: ch.channelId,
|
|
1415
|
-
client: chatClient,
|
|
1416
|
-
leader,
|
|
1417
|
-
capUsd: manifest.capUsd,
|
|
1418
|
-
remainingUsd: async () => {
|
|
1419
|
-
const { getProductSpentUsd } = await import("../usage/product-ledger.js");
|
|
1420
|
-
const spent = await getProductSpentUsd(verdictArgs.runId);
|
|
1421
|
-
return Math.max(0, manifest.capUsd - spent);
|
|
1422
|
-
},
|
|
1423
|
-
reviewSummary: verdictArgs.reviewSummary,
|
|
1424
|
-
fallback: terminalFallback,
|
|
1425
|
-
});
|
|
1426
|
-
};
|
|
1427
|
-
|
|
1428
|
-
const phaseGen = runPhases({
|
|
1429
|
-
flowDir: ctx.flowDir,
|
|
1430
|
-
runId: ctx.runId,
|
|
1431
|
-
manifest,
|
|
1432
|
-
clarifiedSpec,
|
|
1433
|
-
projectContext,
|
|
1434
|
-
leader: leader as any,
|
|
1435
|
-
leaderModelId,
|
|
1436
|
-
capUsd: manifest.capUsd,
|
|
1437
|
-
remainingUsd: async () => Math.max(0, manifest.capUsd - (await getProductSpentUsd(ctx.runId))),
|
|
1438
|
-
awaitCustomerVerdict,
|
|
1439
|
-
sprintRunner,
|
|
1440
|
-
} as any);
|
|
1441
|
-
|
|
1442
|
-
let phaseOutcome: { pass: boolean; reason?: string } = { pass: false };
|
|
1443
|
-
while (true) {
|
|
1444
|
-
const step = await phaseGen.next();
|
|
1445
|
-
if (step.done) {
|
|
1446
|
-
phaseOutcome = step.value as { pass: boolean; reason?: string };
|
|
1447
|
-
break;
|
|
1448
|
-
}
|
|
1449
|
-
const chunk = step.value as StreamChunk;
|
|
1450
|
-
if (chunk.type === "push_notification" && chatClient && slug) {
|
|
1451
|
-
try {
|
|
1452
|
-
const { ensureChannel } = await import("../chat/channel-manager.js");
|
|
1453
|
-
const { publish } = await import("../chat/broadcast-bus.js");
|
|
1454
|
-
const ch = await ensureChannel({
|
|
1455
|
-
client: chatClient,
|
|
1456
|
-
guildId: process.env.MUONROI_DISCORD_GUILD_ID ?? "unknown",
|
|
1457
|
-
slug,
|
|
1458
|
-
displayName: manifest.idea,
|
|
1459
|
-
});
|
|
1460
|
-
if (ch) {
|
|
1461
|
-
await publish({
|
|
1462
|
-
client: chatClient,
|
|
1463
|
-
channelId: ch.channelId,
|
|
1464
|
-
type: "phase-event",
|
|
1465
|
-
content: chunk.content ?? "",
|
|
1466
|
-
});
|
|
1467
|
-
}
|
|
1468
|
-
} catch (e) {
|
|
1469
|
-
console.warn("muonroi: chat broadcast failed", e);
|
|
1470
|
-
}
|
|
1471
|
-
}
|
|
1472
|
-
yield chunk;
|
|
1473
|
-
}
|
|
1474
|
-
|
|
1475
|
-
if (!phaseOutcome.pass) {
|
|
1476
|
-
return {
|
|
1477
|
-
runId: ctx.runId,
|
|
1478
|
-
stage: "halted",
|
|
1479
|
-
success: false,
|
|
1480
|
-
reason: phaseOutcome.reason ?? "phase-orchestrator-halt",
|
|
1481
|
-
};
|
|
1482
|
-
}
|
|
1483
|
-
|
|
1484
|
-
// All phases done — write final manifest.
|
|
1485
|
-
const finalManifest = await readManifest(ctx.flowDir, ctx.runId);
|
|
1486
|
-
if (finalManifest) {
|
|
1487
|
-
await writeManifest(ctx.flowDir, ctx.runId, {
|
|
1488
|
-
...finalManifest,
|
|
1489
|
-
doneAt: new Date(),
|
|
1490
|
-
verdict: { pass: true, score: 1, failedCondition: undefined as any, reason: "phases_complete" },
|
|
1491
|
-
});
|
|
1492
|
-
}
|
|
1493
|
-
// P1.3: extract run artifacts to EE for cross-run memory. Non-fatal —
|
|
1494
|
-
// EE client absorbs failures into the offline queue.
|
|
1495
|
-
// P1.6: log telemetry for the extract outcome.
|
|
1496
|
-
if (ctx.cwd) {
|
|
1497
|
-
const eeResult = await extractRunToEE(ctx.flowDir, ctx.runId, ctx.cwd);
|
|
1498
|
-
try {
|
|
1499
|
-
logInteraction(ctx.sessionId ?? ctx.runId, "ee_injection", {
|
|
1500
|
-
eventSubtype: "extract",
|
|
1501
|
-
durationMs: Math.round(eeResult.durationMs),
|
|
1502
|
-
data: {
|
|
1503
|
-
ok: eeResult.ok,
|
|
1504
|
-
mistakes: eeResult.mistakes ?? null,
|
|
1505
|
-
stored: eeResult.stored ?? null,
|
|
1506
|
-
},
|
|
1507
|
-
});
|
|
1508
|
-
} catch {
|
|
1509
|
-
// DB errors must not break /ideal
|
|
1510
|
-
}
|
|
1511
|
-
}
|
|
1512
|
-
return {
|
|
1513
|
-
runId: ctx.runId,
|
|
1514
|
-
stage: "approved",
|
|
1515
|
-
success: true,
|
|
1516
|
-
reason: "phases_complete",
|
|
1517
|
-
shipped: true,
|
|
1518
|
-
};
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
async function loadProductSpec(flowDir: string, runId: string, idea: string, stack?: string): Promise<ProductSpec> {
|
|
1522
|
-
const runDir = path.join(flowDir, "runs", runId);
|
|
1523
|
-
const roadmap = await readArtifact(runDir, "roadmap.md");
|
|
1524
|
-
const raw = roadmap?.sections.get("Product Specification") ?? "";
|
|
1525
|
-
const match = raw.match(/\{[\s\S]*\}/);
|
|
1526
|
-
if (match) {
|
|
1527
|
-
try {
|
|
1528
|
-
const parsed = JSON.parse(match[0]) as Partial<ProductSpec>;
|
|
1529
|
-
return {
|
|
1530
|
-
idea: parsed.idea ?? idea,
|
|
1531
|
-
persona: parsed.persona ?? "users",
|
|
1532
|
-
mvp: parsed.mvp ?? [],
|
|
1533
|
-
phase2: parsed.phase2 ?? [],
|
|
1534
|
-
architecture: parsed.architecture ?? "",
|
|
1535
|
-
ioContract: parsed.ioContract ?? "",
|
|
1536
|
-
folderStructure: parsed.folderStructure ?? "",
|
|
1537
|
-
sprintEstimate: parsed.sprintEstimate ?? 1,
|
|
1538
|
-
costEstimate: parsed.costEstimate ?? 1,
|
|
1539
|
-
stack: parsed.stack ?? stack,
|
|
1540
|
-
createdAt: parsed.createdAt ? new Date(parsed.createdAt) : new Date(),
|
|
1541
|
-
};
|
|
1542
|
-
} catch {
|
|
1543
|
-
/* fall through */
|
|
1544
|
-
}
|
|
1545
|
-
}
|
|
1546
|
-
return {
|
|
1547
|
-
idea,
|
|
1548
|
-
persona: "users",
|
|
1549
|
-
mvp: [],
|
|
1550
|
-
phase2: [],
|
|
1551
|
-
architecture: "",
|
|
1552
|
-
ioContract: "",
|
|
1553
|
-
folderStructure: "",
|
|
1554
|
-
sprintEstimate: 1,
|
|
1555
|
-
costEstimate: 1,
|
|
1556
|
-
stack,
|
|
1557
|
-
createdAt: new Date(),
|
|
1558
|
-
};
|
|
1559
|
-
}
|
|
1560
|
-
|
|
1561
|
-
// ── Subcommands: status / resume / abort / ship ─────────────────────────────
|
|
1562
|
-
|
|
1563
|
-
async function* runStatus(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
1564
|
-
const runsRoot = path.join(opts.flowDir, "runs");
|
|
1565
|
-
let entries: string[] = [];
|
|
1566
|
-
try {
|
|
1567
|
-
entries = await fs.readdir(runsRoot);
|
|
1568
|
-
} catch {
|
|
1569
|
-
yield { type: "content", content: "No runs found.\n" } as StreamChunk;
|
|
1570
|
-
return { runId: "", stage: "approved", success: true };
|
|
1571
|
-
}
|
|
1572
|
-
|
|
1573
|
-
if (opts.runId) {
|
|
1574
|
-
const m = await readManifest(opts.flowDir, opts.runId);
|
|
1575
|
-
if (!m) {
|
|
1576
|
-
yield { type: "content", content: `Run not found: ${opts.runId}\n` } as StreamChunk;
|
|
1577
|
-
return { runId: opts.runId, stage: "error", success: false, reason: "not_found" };
|
|
1578
|
-
}
|
|
1579
|
-
const iters = await readIterations(opts.flowDir, opts.runId);
|
|
1580
|
-
yield {
|
|
1581
|
-
type: "content",
|
|
1582
|
-
content:
|
|
1583
|
-
`Run ${opts.runId}: ${m.idea}\n` +
|
|
1584
|
-
`Cap: $${m.capUsd} MaxSprints: ${m.maxSprints} DoneThreshold: ${m.doneThreshold}\n` +
|
|
1585
|
-
`Iterations: ${iters.length} Aborted: ${m.aborted ?? false} DoneAt: ${m.doneAt?.toISOString() ?? "—"}\n`,
|
|
1586
|
-
} as StreamChunk;
|
|
1587
|
-
return { runId: opts.runId, stage: "approved", success: true };
|
|
1588
|
-
}
|
|
1589
|
-
|
|
1590
|
-
const lines: string[] = [`Active runs (${entries.length}):`];
|
|
1591
|
-
for (const id of entries) {
|
|
1592
|
-
const m = await readManifest(opts.flowDir, id).catch(() => null);
|
|
1593
|
-
const iters = await readIterations(opts.flowDir, id).catch(() => []);
|
|
1594
|
-
if (!m) continue;
|
|
1595
|
-
lines.push(` ${id} ${m.idea.slice(0, 60)} sprints=${iters.length} aborted=${m.aborted ?? false}`);
|
|
1596
|
-
}
|
|
1597
|
-
yield { type: "content", content: `${lines.join("\n")}\n` } as StreamChunk;
|
|
1598
|
-
return { runId: "", stage: "approved", success: true };
|
|
1599
|
-
}
|
|
1600
|
-
|
|
1601
|
-
async function* runAbort(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
1602
|
-
if (!opts.runId) {
|
|
1603
|
-
yield { type: "content", content: "error: abort requires a runId\n" } as StreamChunk;
|
|
1604
|
-
return { runId: "", stage: "error", success: false, reason: "missing_runId" };
|
|
1605
|
-
}
|
|
1606
|
-
const m = await readManifest(opts.flowDir, opts.runId);
|
|
1607
|
-
if (!m) {
|
|
1608
|
-
yield { type: "content", content: `Run not found: ${opts.runId}\n` } as StreamChunk;
|
|
1609
|
-
return { runId: opts.runId, stage: "error", success: false, reason: "not_found" };
|
|
1610
|
-
}
|
|
1611
|
-
await writeManifest(opts.flowDir, opts.runId, { ...m, aborted: true, doneAt: new Date() });
|
|
1612
|
-
// Fire-and-forget EE phase-outcome=aborted (extension landed in 13-05).
|
|
1613
|
-
try {
|
|
1614
|
-
fireAndForgetPhaseOutcome({
|
|
1615
|
-
sessionId: opts.runId,
|
|
1616
|
-
phaseName: "product-loop",
|
|
1617
|
-
outcome: "aborted" as any,
|
|
1618
|
-
});
|
|
1619
|
-
} catch {
|
|
1620
|
-
/* non-fatal */
|
|
1621
|
-
}
|
|
1622
|
-
// P1.3: extract run artifacts to EE even on abort — we still want to learn
|
|
1623
|
-
// from partial runs. runAbort does not have a full DriverContext so cwd is
|
|
1624
|
-
// not available here; fall back to process.cwd() as the project path.
|
|
1625
|
-
// EE client is non-fatal (offline queue absorbs transport failures).
|
|
1626
|
-
// P1.6: log telemetry for the extract outcome.
|
|
1627
|
-
{
|
|
1628
|
-
const eeResult = await extractRunToEE(opts.flowDir, opts.runId, opts.cwd ?? process.cwd());
|
|
1629
|
-
try {
|
|
1630
|
-
logInteraction(opts.sessionId ?? opts.runId ?? "abort", "ee_injection", {
|
|
1631
|
-
eventSubtype: "extract",
|
|
1632
|
-
durationMs: Math.round(eeResult.durationMs),
|
|
1633
|
-
data: {
|
|
1634
|
-
ok: eeResult.ok,
|
|
1635
|
-
mistakes: eeResult.mistakes ?? null,
|
|
1636
|
-
stored: eeResult.stored ?? null,
|
|
1637
|
-
},
|
|
1638
|
-
});
|
|
1639
|
-
} catch {
|
|
1640
|
-
// DB errors must not break /ideal
|
|
1641
|
-
}
|
|
1642
|
-
}
|
|
1643
|
-
yield { type: "content", content: `Aborted run ${opts.runId}.\n` } as StreamChunk;
|
|
1644
|
-
return { runId: opts.runId, stage: "halted", success: false, reason: "aborted" };
|
|
1645
|
-
}
|
|
1646
|
-
|
|
1647
|
-
async function* runResume(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
1648
|
-
if (!opts.runId) {
|
|
1649
|
-
yield { type: "content", content: "error: resume requires a runId\n" } as StreamChunk;
|
|
1650
|
-
return { runId: "", stage: "error", success: false, reason: "missing_runId" };
|
|
1651
|
-
}
|
|
1652
|
-
const run = await loadRun(opts.flowDir, opts.runId);
|
|
1653
|
-
if (!run) {
|
|
1654
|
-
yield { type: "content", content: `Run not found: ${opts.runId}\n` } as StreamChunk;
|
|
1655
|
-
return { runId: opts.runId, stage: "error", success: false, reason: "not_found" };
|
|
1656
|
-
}
|
|
1657
|
-
const manifest = await readManifest(opts.flowDir, opts.runId);
|
|
1658
|
-
if (!manifest) {
|
|
1659
|
-
yield { type: "content", content: `Manifest missing for ${opts.runId}\n` } as StreamChunk;
|
|
1660
|
-
return { runId: opts.runId, stage: "error", success: false, reason: "manifest_missing" };
|
|
1661
|
-
}
|
|
1662
|
-
if (manifest.aborted) {
|
|
1663
|
-
yield { type: "content", content: `Run ${opts.runId} was aborted; cannot resume.\n` } as StreamChunk;
|
|
1664
|
-
return { runId: opts.runId, stage: "halted", success: false, reason: "aborted" };
|
|
1665
|
-
}
|
|
1666
|
-
|
|
1667
|
-
// Detect crashed in-flight sprint: an iterations.md entry without a closing
|
|
1668
|
-
// Verify line is treated as crashed. Our schema always writes the Verify line
|
|
1669
|
-
// before returning, so an iteration is "in-flight" iff the file has a Sprint
|
|
1670
|
-
// heading but no matching Verify field. readIterations skips malformed
|
|
1671
|
-
// entries — so we mark the highest sprint number as crashed regardless.
|
|
1672
|
-
const iters = await readIterations(opts.flowDir, opts.runId);
|
|
1673
|
-
let nextSprint = iters.length + 1;
|
|
1674
|
-
if (iters.length > 0) {
|
|
1675
|
-
const last = iters[iters.length - 1]!;
|
|
1676
|
-
if (!last.lastVerifyResult || last.lastVerifyResult === "UNKNOWN") {
|
|
1677
|
-
await markIterationCrashed(opts.flowDir, opts.runId, last.sprintN);
|
|
1678
|
-
nextSprint = last.sprintN; // retry with retryOf metadata
|
|
1679
|
-
yield {
|
|
1680
|
-
type: "content",
|
|
1681
|
-
content: `Detected crashed sprint ${last.sprintN}; restarting fresh.\n`,
|
|
1682
|
-
} as StreamChunk;
|
|
1683
|
-
}
|
|
1684
|
-
}
|
|
1685
|
-
|
|
1686
|
-
// Fire EE phase-outcome=resumed (extension landed in 13-05).
|
|
1687
|
-
try {
|
|
1688
|
-
fireAndForgetPhaseOutcome({
|
|
1689
|
-
sessionId: opts.runId,
|
|
1690
|
-
phaseName: `sprint-${Math.max(1, nextSprint - 1)}`,
|
|
1691
|
-
outcome: "resumed" as any,
|
|
1692
|
-
});
|
|
1693
|
-
} catch {
|
|
1694
|
-
/* non-fatal */
|
|
1695
|
-
}
|
|
1696
|
-
|
|
1697
|
-
// Resume into sprint loop with reconstructed history + manifest flags.
|
|
1698
|
-
const productSpec = await loadProductSpec(opts.flowDir, opts.runId, manifest.idea, manifest.stack);
|
|
1699
|
-
const ctx: DriverContext = {
|
|
1700
|
-
runId: opts.runId,
|
|
1701
|
-
flowDir: opts.flowDir,
|
|
1702
|
-
idea: manifest.idea,
|
|
1703
|
-
sessionModelId: opts.sessionModelId,
|
|
1704
|
-
llm: opts.llm,
|
|
1705
|
-
flags: opts.flags,
|
|
1706
|
-
respondToQuestion: opts.respondToQuestion,
|
|
1707
|
-
respondToPreflight: opts.respondToPreflight,
|
|
1708
|
-
cwd: opts.cwd,
|
|
1709
|
-
sessionId: opts.sessionId,
|
|
1710
|
-
processMessageFn: opts.processMessageFn,
|
|
1711
|
-
detectVerifyRecipe: opts.detectVerifyRecipe,
|
|
1712
|
-
};
|
|
1713
|
-
const roleAssignments = opts.roleAssignments ?? (await resolveRoleAssignments(opts.sessionModelId));
|
|
1714
|
-
|
|
1715
|
-
// Subsystem E: phase-orchestrated path (default ON; set MUONROI_PHASE_MODE=0 for legacy).
|
|
1716
|
-
if (process.env.MUONROI_PHASE_MODE !== "0") {
|
|
1717
|
-
const phaseResult = yield* runPhasesPath({ ctx, productSpec, roleAssignments });
|
|
1718
|
-
if (phaseResult !== null) return phaseResult;
|
|
1719
|
-
// phaseResult === null means runPhases prerequisites were unavailable; fall through to legacy.
|
|
1720
|
-
}
|
|
1721
|
-
|
|
1722
|
-
return yield* drainSprints({
|
|
1723
|
-
ctx,
|
|
1724
|
-
productSpec,
|
|
1725
|
-
roleAssignments,
|
|
1726
|
-
history: iters.filter((i) => !i.crashed),
|
|
1727
|
-
flags: opts.flags,
|
|
1728
|
-
});
|
|
1729
|
-
}
|
|
1730
|
-
|
|
1731
|
-
/**
|
|
1732
|
-
* Build the inventory of models reachable in this session (= every provider
|
|
1733
|
-
* that has a key on the keychain) and let role-registry assign one model per
|
|
1734
|
-
* RoleSlot. The resulting Map is consumed by sprint-runner → done-gate Cond #4
|
|
1735
|
-
* (PO ↔ Customer cross-model debate). Without this, the Map is empty and the
|
|
1736
|
-
* gate immediately returns "missing_roles".
|
|
1737
|
-
*
|
|
1738
|
-
* On refusal (no keys, single-provider with too few models, or PO/Customer
|
|
1739
|
-
* collision) we return an empty Map; done-gate's R5 short-circuit (skip Cond
|
|
1740
|
-
* #4 when score < 0.85) keeps early sprints unblocked, and the user-approval
|
|
1741
|
-
* gate (Cond #5) still runs so the loop can ship via /ship.
|
|
1742
|
-
*/
|
|
1743
|
-
async function resolveRoleAssignments(
|
|
1744
|
-
sessionModelId: string,
|
|
1745
|
-
): Promise<Map<RoleSlot, { modelId: string; provider: string; tier?: string }>> {
|
|
1746
|
-
const out = new Map<RoleSlot, { modelId: string; provider: string; tier?: string }>();
|
|
1747
|
-
// Role-assignment inventory scan: intentionally excludes xai for legacy
|
|
1748
|
-
// resolveRoles ranking. Derived from ALL_PROVIDER_IDS so future additions
|
|
1749
|
-
// are picked up automatically.
|
|
1750
|
-
const order: readonly ProviderId[] = ALL_PROVIDER_IDS.filter((p) => p !== "xai");
|
|
1751
|
-
const inventory: ModelInfo[] = [];
|
|
1752
|
-
for (const p of order) {
|
|
1753
|
-
try {
|
|
1754
|
-
await loadKeyForProvider(p);
|
|
1755
|
-
} catch {
|
|
1756
|
-
continue;
|
|
1757
|
-
}
|
|
1758
|
-
inventory.push(...getModelsForProvider(p));
|
|
1759
|
-
}
|
|
1760
|
-
if (inventory.length === 0) return out;
|
|
1761
|
-
|
|
1762
|
-
// EE-driven override: ask the experience brain for the best (model,tier)
|
|
1763
|
-
// per role, given accumulated past-performance signals. routeModel returns
|
|
1764
|
-
// null when no EE core is installed, in which case role-registry falls
|
|
1765
|
-
// back to its tier-preference cold-start logic.
|
|
1766
|
-
const eeRouteOverride = async (slot: RoleSlot): Promise<EERouteResult | null> => {
|
|
1767
|
-
const task = describeRoleTask(slot);
|
|
1768
|
-
try {
|
|
1769
|
-
return await eeRouteModel(
|
|
1770
|
-
task,
|
|
1771
|
-
{ role: slot, sessionModel: sessionModelId, source: "product-loop" },
|
|
1772
|
-
"muonroi-cli",
|
|
1773
|
-
);
|
|
1774
|
-
} catch {
|
|
1775
|
-
return null;
|
|
1776
|
-
}
|
|
1777
|
-
};
|
|
1778
|
-
|
|
1779
|
-
const result = await resolveRoles({ inventory, eeRouteOverride });
|
|
1780
|
-
if (result.kind !== "ok") return out;
|
|
1781
|
-
for (const [slot, a] of Object.entries(result.roles)) {
|
|
1782
|
-
out.set(slot as RoleSlot, { modelId: a.model, provider: a.provider, tier: a.tier });
|
|
1783
|
-
}
|
|
1784
|
-
return out;
|
|
1785
|
-
}
|
|
1786
|
-
|
|
1787
|
-
/**
|
|
1788
|
-
* Slot → human-readable task description fed to EE's routeModel. The brain
|
|
1789
|
-
* uses this string as the primary classification key, so phrasing matters:
|
|
1790
|
-
* keep it specific to the role's actual deliverable.
|
|
1791
|
-
*/
|
|
1792
|
-
function describeRoleTask(slot: RoleSlot): string {
|
|
1793
|
-
switch (slot) {
|
|
1794
|
-
case "PO":
|
|
1795
|
-
return "product owner: clarify product spec and acceptance criteria";
|
|
1796
|
-
case "Architect":
|
|
1797
|
-
return "software architect: design module boundaries and data flow";
|
|
1798
|
-
case "Implementer":
|
|
1799
|
-
return "implementer: write production code from a spec";
|
|
1800
|
-
case "Tester":
|
|
1801
|
-
return "tester: design and write unit/integration tests";
|
|
1802
|
-
case "Reviewer":
|
|
1803
|
-
return "code reviewer: critique code for bugs, perf, and clarity";
|
|
1804
|
-
case "Customer":
|
|
1805
|
-
return "customer proxy: validate that built feature meets user need";
|
|
1806
|
-
default:
|
|
1807
|
-
return `role ${String(slot)}`;
|
|
1808
|
-
}
|
|
1809
|
-
}
|
|
1810
|
-
|
|
1811
|
-
async function* runShip(opts: ProductLoopOptions): AsyncGenerator<StreamChunk, ProductLoopResult, unknown> {
|
|
1812
|
-
if (!opts.runId) {
|
|
1813
|
-
yield { type: "content", content: "error: ship requires a runId\n" } as StreamChunk;
|
|
1814
|
-
return { runId: "", stage: "error", success: false, reason: "missing_runId" };
|
|
1815
|
-
}
|
|
1816
|
-
const m = await readManifest(opts.flowDir, opts.runId);
|
|
1817
|
-
if (!m) {
|
|
1818
|
-
yield { type: "content", content: `Run not found: ${opts.runId}\n` } as StreamChunk;
|
|
1819
|
-
return { runId: opts.runId, stage: "error", success: false, reason: "not_found" };
|
|
1820
|
-
}
|
|
1821
|
-
const iters = await readIterations(opts.flowDir, opts.runId);
|
|
1822
|
-
if (iters.length === 0) {
|
|
1823
|
-
yield { type: "content", content: `not ready to ship: no iterations recorded\n` } as StreamChunk;
|
|
1824
|
-
return { runId: opts.runId, stage: "halted", success: false, reason: "not_ready" };
|
|
1825
|
-
}
|
|
1826
|
-
const last = iters[iters.length - 1]!;
|
|
1827
|
-
if (last.lastVerifyResult !== "PASS") {
|
|
1828
|
-
yield {
|
|
1829
|
-
type: "content",
|
|
1830
|
-
content: `not ready to ship: last verify=${last.lastVerifyResult}\n`,
|
|
1831
|
-
} as StreamChunk;
|
|
1832
|
-
return { runId: opts.runId, stage: "halted", success: false, reason: "not_ready" };
|
|
1833
|
-
}
|
|
1834
|
-
|
|
1835
|
-
// Force final user-approval gate (Cond #5). Reuse runPreflight via the
|
|
1836
|
-
// respondToPreflight responder: caller handles approve/reject prompt.
|
|
1837
|
-
const approved = await opts.respondToPreflight("ship-final");
|
|
1838
|
-
if (!approved) {
|
|
1839
|
-
yield { type: "content", content: `Ship rejected by user.\n` } as StreamChunk;
|
|
1840
|
-
// Build feedback so caller can pipe back into a continue cycle.
|
|
1841
|
-
buildContinueFeedback(
|
|
1842
|
-
{ pass: false, failedCondition: "user_approval", score: last.scoreAfter, reason: "user_rejected" },
|
|
1843
|
-
null,
|
|
1844
|
-
[],
|
|
1845
|
-
);
|
|
1846
|
-
return { runId: opts.runId, stage: "halted", success: false, reason: "user_rejected" };
|
|
1847
|
-
}
|
|
1848
|
-
await writeManifest(opts.flowDir, opts.runId, {
|
|
1849
|
-
...m,
|
|
1850
|
-
doneAt: new Date(),
|
|
1851
|
-
verdict: { pass: true, score: last.scoreAfter, failedCondition: undefined as any, reason: "force_shipped" },
|
|
1852
|
-
});
|
|
1853
|
-
yield { type: "content", content: `Shipped run ${opts.runId}.\n` } as StreamChunk;
|
|
1854
|
-
return { runId: opts.runId, stage: "approved", success: true, reason: "shipped", shipped: true };
|
|
1855
|
-
}
|