muonroi-cli 1.8.4 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +17 -5
- package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
- package/dist/packages/agent-harness-core/src/driver.js +46 -0
- package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
- package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
- package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
- package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
- package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
- package/dist/packages/agent-harness-core/src/protocol.js +15 -0
- package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
- package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
- package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
- package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
- package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
- package/dist/packages/agent-harness-opentui/src/install.js +10 -0
- package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
- package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
- package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
- package/dist/src/agent-harness/mock-model.d.ts +38 -0
- package/dist/src/agent-harness/mock-model.js +69 -3
- package/dist/src/agent-harness/test-spawn.js +31 -0
- package/dist/src/chat/chat-keychain.d.ts +7 -12
- package/dist/src/chat/chat-keychain.js +19 -86
- package/dist/src/cli/config/screen-providers.js +1 -1
- package/dist/src/cli/cost-forensics.d.ts +10 -0
- package/dist/src/cli/cost-forensics.js +18 -3
- package/dist/src/cli/keys-bundle.d.ts +1 -1
- package/dist/src/cli/keys-bundle.js +1 -1
- package/dist/src/cli/keys.d.ts +10 -47
- package/dist/src/cli/keys.js +31 -399
- package/dist/src/council/clarifier.d.ts +31 -3
- package/dist/src/council/clarifier.js +220 -32
- package/dist/src/council/context.js +49 -15
- package/dist/src/council/debate-checkpoint.d.ts +129 -0
- package/dist/src/council/debate-checkpoint.js +176 -0
- package/dist/src/council/debate-planner.js +54 -5
- package/dist/src/council/debate-summary.d.ts +25 -0
- package/dist/src/council/debate-summary.js +85 -0
- package/dist/src/council/debate.d.ts +169 -2
- package/dist/src/council/debate.js +1265 -135
- package/dist/src/council/index.d.ts +108 -1
- package/dist/src/council/index.js +670 -197
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +94 -0
- package/dist/src/council/llm.js +348 -55
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +82 -0
- package/dist/src/council/planner.js +40 -0
- package/dist/src/council/preflight.d.ts +17 -0
- package/dist/src/council/preflight.js +50 -2
- package/dist/src/council/prompts.d.ts +39 -4
- package/dist/src/council/prompts.js +256 -69
- package/dist/src/council/stance-recall.d.ts +42 -0
- package/dist/src/council/stance-recall.js +57 -0
- package/dist/src/council/strip-think.d.ts +17 -0
- package/dist/src/council/strip-think.js +33 -0
- package/dist/src/council/types.d.ts +138 -0
- package/dist/src/ee/artifact-cache.d.ts +16 -0
- package/dist/src/ee/artifact-cache.js +32 -0
- package/dist/src/ee/auth.d.ts +20 -0
- package/dist/src/ee/auth.js +54 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +109 -21
- package/dist/src/ee/ee-onboarding.js +6 -26
- package/dist/src/ee/export-transcripts.d.ts +1 -0
- package/dist/src/ee/export-transcripts.js +8 -10
- package/dist/src/ee/extract-session.js +29 -0
- package/dist/src/ee/extract-style.d.ts +58 -0
- package/dist/src/ee/extract-style.js +270 -0
- package/dist/src/ee/recall-ledger.d.ts +9 -0
- package/dist/src/ee/recall-ledger.js +3 -0
- package/dist/src/ee/scope.d.ts +1 -0
- package/dist/src/ee/scope.js +26 -1
- package/dist/src/ee/search.d.ts +7 -0
- package/dist/src/ee/search.js +24 -0
- package/dist/src/ee/transcript-emit.js +2 -0
- package/dist/src/ee/types.d.ts +22 -0
- package/dist/src/ee/who-am-i-brain.d.ts +35 -0
- package/dist/src/ee/who-am-i-brain.js +220 -0
- package/dist/src/ee/who-am-i.d.ts +10 -3
- package/dist/src/ee/who-am-i.js +12 -0
- package/dist/src/ee/workflow-event.d.ts +48 -0
- package/dist/src/ee/workflow-event.js +81 -0
- package/dist/src/flow/compaction/compress.d.ts +3 -3
- package/dist/src/flow/compaction/compress.js +58 -8
- package/dist/src/flow/compaction/extract.d.ts +4 -7
- package/dist/src/flow/compaction/extract.js +50 -10
- package/dist/src/flow/compaction/index.d.ts +14 -1
- package/dist/src/flow/compaction/index.js +96 -3
- package/dist/src/flow/compaction/input-guard.d.ts +24 -0
- package/dist/src/flow/compaction/input-guard.js +43 -0
- package/dist/src/flow/compaction/progress.d.ts +35 -0
- package/dist/src/flow/compaction/progress.js +35 -0
- package/dist/src/flow/fold-planning.d.ts +36 -0
- package/dist/src/flow/fold-planning.js +83 -0
- package/dist/src/flow/hierarchy.d.ts +146 -0
- package/dist/src/flow/hierarchy.js +427 -0
- package/dist/src/flow/index.d.ts +1 -0
- package/dist/src/flow/index.js +2 -0
- package/dist/src/flow/run-artifacts.d.ts +102 -0
- package/dist/src/flow/run-artifacts.js +208 -0
- package/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/dist/src/gsd/assessment-schema.d.ts +44 -0
- package/dist/src/gsd/assessment-schema.js +134 -0
- package/dist/src/gsd/capability-registry.d.ts +45 -0
- package/dist/src/gsd/capability-registry.js +337 -0
- package/dist/src/gsd/complexity-assessor.d.ts +39 -0
- package/dist/src/gsd/complexity-assessor.js +152 -0
- package/dist/src/gsd/config-bridge.d.ts +7 -0
- package/dist/src/gsd/config-bridge.js +114 -0
- package/dist/src/gsd/config-loader.d.ts +27 -0
- package/dist/src/gsd/config-loader.js +50 -0
- package/dist/src/gsd/council-context.d.ts +44 -0
- package/dist/src/gsd/council-context.js +114 -0
- package/dist/src/gsd/ee-closure.d.ts +28 -0
- package/dist/src/gsd/ee-closure.js +49 -0
- package/dist/src/gsd/flags.d.ts +66 -0
- package/dist/src/gsd/flags.js +102 -0
- package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
- package/dist/src/gsd/gsd-dispatch.js +131 -0
- package/dist/src/gsd/gsd-runtime.d.ts +22 -0
- package/dist/src/gsd/gsd-runtime.js +37 -0
- package/dist/src/gsd/host-adapter.d.ts +11 -0
- package/dist/src/gsd/host-adapter.js +29 -0
- package/dist/src/gsd/index.d.ts +24 -1
- package/dist/src/gsd/index.js +27 -0
- package/dist/src/gsd/loop-host-contract.d.ts +21 -0
- package/dist/src/gsd/loop-host-contract.js +39 -0
- package/dist/src/gsd/loop-host.d.ts +69 -0
- package/dist/src/gsd/loop-host.js +245 -0
- package/dist/src/gsd/loop-resolver.d.ts +36 -0
- package/dist/src/gsd/loop-resolver.js +79 -0
- package/dist/src/gsd/model-tier.d.ts +13 -0
- package/dist/src/gsd/model-tier.js +45 -0
- package/dist/src/gsd/mutation-gate.d.ts +16 -0
- package/dist/src/gsd/mutation-gate.js +41 -0
- package/dist/src/gsd/native-roadmap.d.ts +89 -0
- package/dist/src/gsd/native-roadmap.js +343 -0
- package/dist/src/gsd/native-state.d.ts +47 -0
- package/dist/src/gsd/native-state.js +220 -0
- package/dist/src/gsd/paths.d.ts +23 -0
- package/dist/src/gsd/paths.js +66 -0
- package/dist/src/gsd/phase-dag.d.ts +12 -0
- package/dist/src/gsd/phase-dag.js +94 -0
- package/dist/src/gsd/phase-sync.d.ts +42 -0
- package/dist/src/gsd/phase-sync.js +321 -0
- package/dist/src/gsd/pil-gate-context.d.ts +13 -0
- package/dist/src/gsd/pil-gate-context.js +64 -0
- package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
- package/dist/src/gsd/pil-gate-critic.js +74 -0
- package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
- package/dist/src/gsd/plan-council-prompts.js +79 -0
- package/dist/src/gsd/plan-council.d.ts +44 -0
- package/dist/src/gsd/plan-council.js +283 -0
- package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
- package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
- package/dist/src/gsd/product-workspace.d.ts +13 -0
- package/dist/src/gsd/product-workspace.js +124 -0
- package/dist/src/gsd/ship-bridge.d.ts +25 -0
- package/dist/src/gsd/ship-bridge.js +65 -0
- package/dist/src/gsd/state-document.d.ts +40 -0
- package/dist/src/gsd/state-document.js +163 -0
- package/dist/src/gsd/verdict-schema.d.ts +39 -0
- package/dist/src/gsd/verdict-schema.js +144 -0
- package/dist/src/gsd/verify-context.d.ts +22 -0
- package/dist/src/gsd/verify-context.js +27 -0
- package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
- package/dist/src/gsd/verify-council-prompts.js +85 -0
- package/dist/src/gsd/verify-council.d.ts +25 -0
- package/dist/src/gsd/verify-council.js +119 -0
- package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
- package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
- package/dist/src/gsd/workflow-engine.d.ts +60 -0
- package/dist/src/gsd/workflow-engine.js +207 -0
- package/dist/src/gsd/workflow-tools.d.ts +13 -0
- package/dist/src/gsd/workflow-tools.js +277 -0
- package/dist/src/headless/council-answers.js +4 -0
- package/dist/src/hooks/index.js +1 -1
- package/dist/src/index.js +172 -270
- package/dist/src/lsp/builtins.js +3 -1
- package/dist/src/lsp/manager.d.ts +5 -1
- package/dist/src/lsp/manager.js +249 -3
- package/dist/src/lsp/npm-cache.d.ts +11 -1
- package/dist/src/lsp/npm-cache.js +17 -1
- package/dist/src/lsp/runtime.d.ts +6 -1
- package/dist/src/lsp/runtime.js +17 -1
- package/dist/src/lsp/types.d.ts +83 -1
- package/dist/src/lsp/types.js +10 -0
- package/dist/src/maintain/pr-builder.js +23 -13
- package/dist/src/mcp/auto-setup.js +57 -32
- package/dist/src/mcp/client-pool.js +44 -16
- package/dist/src/mcp/lsp-tools.d.ts +5 -1
- package/dist/src/mcp/lsp-tools.js +93 -2
- package/dist/src/mcp/mcp-keychain.d.ts +3 -5
- package/dist/src/mcp/mcp-keychain.js +9 -49
- package/dist/src/mcp/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -2
- package/dist/src/mcp/setup-guide-text.d.ts +1 -1
- package/dist/src/mcp/setup-guide-text.js +22 -2
- package/dist/src/mcp/tools-server.d.ts +10 -0
- package/dist/src/mcp/tools-server.js +10 -2
- package/dist/src/models/catalog-client.d.ts +87 -0
- package/dist/src/models/catalog-client.js +105 -38
- package/dist/src/models/catalog.json +528 -265
- package/dist/src/models/registry.d.ts +22 -7
- package/dist/src/models/registry.js +73 -10
- package/dist/src/ops/doctor.js +1 -1
- package/dist/src/orchestrator/ask-user.d.ts +61 -0
- package/dist/src/orchestrator/ask-user.js +65 -0
- package/dist/src/orchestrator/auto-commit.js +1 -1
- package/dist/src/orchestrator/batch-turn-runner.js +2 -2
- package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
- package/dist/src/orchestrator/cache-prefix.js +83 -0
- package/dist/src/orchestrator/compact-request.d.ts +32 -0
- package/dist/src/orchestrator/compact-request.js +41 -0
- package/dist/src/orchestrator/compaction.d.ts +12 -3
- package/dist/src/orchestrator/compaction.js +35 -15
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +74 -32
- package/dist/src/orchestrator/council-request.d.ts +49 -0
- package/dist/src/orchestrator/council-request.js +62 -0
- package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
- package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
- package/dist/src/orchestrator/error-utils.d.ts +29 -0
- package/dist/src/orchestrator/error-utils.js +132 -24
- package/dist/src/orchestrator/grounding-check.js +39 -1
- package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
- package/dist/src/orchestrator/interactive-pause.js +36 -0
- package/dist/src/orchestrator/message-processor.d.ts +4 -0
- package/dist/src/orchestrator/message-processor.js +268 -41
- package/dist/src/orchestrator/orchestrator.d.ts +64 -3
- package/dist/src/orchestrator/orchestrator.js +823 -120
- package/dist/src/orchestrator/preprocessor.js +3 -3
- package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
- package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
- package/dist/src/orchestrator/prompts.js +17 -17
- package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
- package/dist/src/orchestrator/reactive-delegation.js +59 -0
- package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
- package/dist/src/orchestrator/retry-classifier.js +46 -2
- package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
- package/dist/src/orchestrator/safety-askcard.js +5 -2
- package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
- package/dist/src/orchestrator/safety-intercept.js +62 -0
- package/dist/src/orchestrator/scope-reminder.js +1 -1
- package/dist/src/orchestrator/session-experience.d.ts +2 -1
- package/dist/src/orchestrator/session-experience.js +2 -1
- package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
- package/dist/src/orchestrator/should-run-gate.js +18 -0
- package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
- package/dist/src/orchestrator/stall-watchdog.js +65 -10
- package/dist/src/orchestrator/stream-runner.d.ts +13 -3
- package/dist/src/orchestrator/stream-runner.js +115 -49
- package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-cap.js +16 -1
- package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
- package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
- package/dist/src/orchestrator/subagent-compactor.js +126 -15
- package/dist/src/orchestrator/tool-engine.d.ts +41 -0
- package/dist/src/orchestrator/tool-engine.js +846 -66
- package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
- package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
- package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
- package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
- package/dist/src/orchestrator/turn-watchdog.js +84 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +6 -4
- package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
- package/dist/src/pil/cheap-model-playbook.js +5 -1
- package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
- package/dist/src/pil/cheap-model-workbooks.js +1 -1
- package/dist/src/pil/discovery-types.d.ts +1 -0
- package/dist/src/pil/discovery.d.ts +1 -1
- package/dist/src/pil/discovery.js +18 -13
- package/dist/src/pil/layer1-intent.d.ts +18 -6
- package/dist/src/pil/layer1-intent.js +66 -757
- package/dist/src/pil/layer15-context-scan.js +15 -1
- package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
- package/dist/src/pil/layer1_5-complexity-size.js +31 -5
- package/dist/src/pil/layer3-ee-injection.js +23 -8
- package/dist/src/pil/layer4-gsd.js +69 -16
- package/dist/src/pil/layer5-context.js +7 -3
- package/dist/src/pil/layer6-output.d.ts +23 -0
- package/dist/src/pil/layer6-output.js +5 -1
- package/dist/src/pil/llm-classify.d.ts +111 -5
- package/dist/src/pil/llm-classify.js +421 -189
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +8 -0
- package/dist/src/pil/pipeline.js +36 -2
- package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
- package/dist/src/pil/repo-grounding-probe.js +136 -0
- package/dist/src/pil/repo-structure-hints.d.ts +7 -0
- package/dist/src/pil/repo-structure-hints.js +45 -0
- package/dist/src/pil/response-tools.js +5 -3
- package/dist/src/pil/schema.d.ts +1 -0
- package/dist/src/pil/schema.js +2 -0
- package/dist/src/pil/types.d.ts +18 -0
- package/dist/src/playbook/directives.d.ts +4 -0
- package/dist/src/playbook/directives.js +17 -5
- package/dist/src/product-loop/artifact-io.js +4 -0
- package/dist/src/product-loop/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- package/dist/src/product-loop/criteria-seed.d.ts +51 -0
- package/dist/src/product-loop/criteria-seed.js +200 -0
- package/dist/src/product-loop/discovery-context-format.js +3 -1
- package/dist/src/product-loop/discovery-ecosystem.js +4 -1
- package/dist/src/product-loop/discovery-interview.d.ts +9 -0
- package/dist/src/product-loop/discovery-interview.js +60 -12
- package/dist/src/product-loop/discovery-recommender.js +2 -1
- package/dist/src/product-loop/discovery-schema.js +19 -2
- package/dist/src/product-loop/discovery-triage.d.ts +23 -0
- package/dist/src/product-loop/discovery-triage.js +109 -0
- package/dist/src/product-loop/gather.js +150 -2
- package/dist/src/product-loop/ideal-trace.d.ts +7 -0
- package/dist/src/product-loop/ideal-trace.js +64 -0
- package/dist/src/product-loop/index.d.ts +13 -1
- package/dist/src/product-loop/index.js +340 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +330 -106
- package/dist/src/product-loop/phase-plan.d.ts +21 -0
- package/dist/src/product-loop/phase-plan.js +81 -6
- package/dist/src/product-loop/phase-rituals.d.ts +3 -0
- package/dist/src/product-loop/phase-rituals.js +8 -3
- package/dist/src/product-loop/phase-runner.js +39 -12
- package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
- package/dist/src/product-loop/plan-adherence-review.js +144 -0
- package/dist/src/product-loop/sprint-runner.d.ts +173 -0
- package/dist/src/product-loop/sprint-runner.js +863 -19
- package/dist/src/product-loop/types.d.ts +61 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- package/dist/src/providers/anthropic.d.ts +9 -8
- package/dist/src/providers/anthropic.js +13 -47
- package/dist/src/providers/auth/browser-flow.d.ts +1 -1
- package/dist/src/providers/auth/browser-flow.js +1 -1
- package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
- package/dist/src/providers/auth/grok-oauth.js +30 -5
- package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
- package/dist/src/providers/auth/openai-oauth.js +15 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.d.ts +9 -9
- package/dist/src/providers/auth/token-store.js +8 -67
- package/dist/src/providers/auth/types.d.ts +9 -1
- package/dist/src/providers/auth/types.js +1 -1
- package/dist/src/providers/capabilities.d.ts +24 -5
- package/dist/src/providers/capabilities.js +42 -24
- package/dist/src/providers/endpoints.d.ts +2 -2
- package/dist/src/providers/endpoints.js +11 -10
- package/dist/src/providers/env-store.d.ts +17 -0
- package/dist/src/providers/env-store.js +228 -0
- package/dist/src/providers/keychain.d.ts +22 -18
- package/dist/src/providers/keychain.js +127 -140
- package/dist/src/providers/mcp-vision-bridge.js +56 -146
- package/dist/src/providers/openai-compatible.js +8 -1
- package/dist/src/providers/pricing.d.ts +2 -2
- package/dist/src/providers/pricing.js +3 -13
- package/dist/src/providers/runtime.d.ts +43 -3
- package/dist/src/providers/runtime.js +88 -14
- package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
- package/dist/src/providers/strategies/base.strategy.js +24 -1
- package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
- package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
- package/dist/src/providers/strategies/registry.js +4 -4
- package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
- package/dist/src/providers/strategies/thinking-mode.js +288 -1
- package/dist/src/providers/strategies/xai.strategy.js +27 -0
- package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
- package/dist/src/providers/strategies/zai.strategy.js +44 -0
- package/dist/src/providers/types.d.ts +5 -6
- package/dist/src/providers/types.js +2 -2
- package/dist/src/providers/vision-backend.d.ts +47 -0
- package/dist/src/providers/vision-backend.js +258 -0
- package/dist/src/providers/vision-proxy.d.ts +22 -9
- package/dist/src/providers/vision-proxy.js +63 -132
- package/dist/src/providers/warm.d.ts +65 -0
- package/dist/src/providers/warm.js +145 -0
- package/dist/src/providers/wire-debug.js +95 -0
- package/dist/src/router/decide.d.ts +13 -0
- package/dist/src/router/decide.js +138 -36
- package/dist/src/router/peak-hour.d.ts +38 -0
- package/dist/src/router/peak-hour.js +107 -0
- package/dist/src/router/step-router.js +3 -2
- package/dist/src/router/warm.js +4 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +26 -0
- package/dist/src/scaffold/point-to-existing.d.ts +21 -0
- package/dist/src/scaffold/point-to-existing.js +25 -0
- package/dist/src/self-qa/agentic-loop.js +6 -5
- package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
- package/dist/src/{ui/state → state}/active-run.js +21 -0
- package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
- package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
- package/dist/src/state/turn-trace.d.ts +43 -0
- package/dist/src/state/turn-trace.js +32 -0
- package/dist/src/storage/db.js +2 -1
- package/dist/src/storage/index.d.ts +1 -1
- package/dist/src/storage/index.js +1 -1
- package/dist/src/storage/interaction-log.d.ts +1 -1
- package/dist/src/storage/migrations.js +71 -1
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +78 -21
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +340 -15
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/git-safety.d.ts +19 -0
- package/dist/src/tools/git-safety.js +168 -0
- package/dist/src/tools/native-tools.d.ts +1 -1
- package/dist/src/tools/native-tools.js +81 -1
- package/dist/src/tools/registry.d.ts +20 -0
- package/dist/src/tools/registry.js +576 -23
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +147 -4
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
- package/dist/src/ui/components/agent-rail-activities.js +47 -0
- package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
- package/dist/src/ui/components/bubble-body-guard.js +50 -0
- package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
- package/dist/src/ui/components/compact-progress-card.js +42 -0
- package/dist/src/ui/components/context-rail.d.ts +26 -0
- package/dist/src/ui/components/context-rail.js +33 -0
- package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
- package/dist/src/ui/components/council-conclusion-card.js +420 -0
- package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
- package/dist/src/ui/components/council-debate-pill.js +34 -0
- package/dist/src/ui/components/council-info-card.js +2 -2
- package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
- package/dist/src/ui/components/council-leader-bubble.js +21 -11
- package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
- package/dist/src/ui/components/council-message-bubble.js +16 -15
- package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
- package/dist/src/ui/components/council-phase-timeline.js +66 -17
- package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
- package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
- package/dist/src/ui/components/council-question-card.js +13 -12
- package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
- package/dist/src/ui/components/council-rail-rounds.js +57 -0
- package/dist/src/ui/components/council-round-group.d.ts +38 -0
- package/dist/src/ui/components/council-round-group.js +88 -0
- package/dist/src/ui/components/council-status-list.d.ts +3 -1
- package/dist/src/ui/components/council-status-list.js +36 -24
- package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
- package/dist/src/ui/components/council-synthesis-banner.js +20 -5
- package/dist/src/ui/components/halt-recovery-card.js +9 -5
- package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
- package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
- package/dist/src/ui/components/message-view.d.ts +15 -0
- package/dist/src/ui/components/message-view.js +50 -1
- package/dist/src/ui/components/prompt-box.js +18 -16
- package/dist/src/ui/components/session-tree-card.d.ts +14 -0
- package/dist/src/ui/components/session-tree-card.js +46 -0
- package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
- package/dist/src/ui/components/slash-inline-menu.js +26 -5
- package/dist/src/ui/components/task-list-panel.d.ts +14 -1
- package/dist/src/ui/components/task-list-panel.js +22 -2
- package/dist/src/ui/components/tool-group.d.ts +15 -3
- package/dist/src/ui/components/tool-group.js +69 -11
- package/dist/src/ui/containers/modals-layer.d.ts +4 -2
- package/dist/src/ui/containers/modals-layer.js +2 -2
- package/dist/src/ui/council-harness-event.d.ts +57 -0
- package/dist/src/ui/council-harness-event.js +46 -0
- package/dist/src/ui/heartbeat-debug.d.ts +29 -0
- package/dist/src/ui/heartbeat-debug.js +45 -0
- package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
- package/dist/src/ui/mcp-modal.js +2 -4
- package/dist/src/ui/modals/api-key-modal.js +1 -1
- package/dist/src/ui/modals/connect-modal.js +4 -3
- package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
- package/dist/src/ui/modals/model-picker-modal.js +8 -10
- package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
- package/dist/src/ui/modals/session-picker-modal.js +3 -5
- package/dist/src/ui/picker-providers.d.ts +1 -1
- package/dist/src/ui/picker-providers.js +1 -1
- package/dist/src/ui/primitives/index.d.ts +1 -0
- package/dist/src/ui/primitives/index.js +2 -0
- package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
- package/dist/src/ui/primitives/semantic-primitives.js +81 -0
- package/dist/src/ui/slash/compact.js +5 -7
- package/dist/src/ui/slash/cost.js +1 -1
- package/dist/src/ui/slash/council.js +19 -1
- package/dist/src/ui/slash/debug.d.ts +3 -31
- package/dist/src/ui/slash/debug.js +9 -20
- package/dist/src/ui/slash/ee.js +81 -0
- package/dist/src/ui/slash/ideal.d.ts +6 -2
- package/dist/src/ui/slash/ideal.js +97 -7
- package/dist/src/ui/slash/menu-items.d.ts +7 -0
- package/dist/src/ui/slash/menu-items.js +23 -20
- package/dist/src/ui/slash/registry.d.ts +2 -0
- package/dist/src/ui/slash/registry.js +4 -0
- package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
- package/dist/src/ui/status-bar/cache-hit.js +9 -0
- package/dist/src/ui/status-bar/index.d.ts +1 -1
- package/dist/src/ui/status-bar/index.js +7 -3
- package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
- package/dist/src/ui/status-bar/usd-meter.js +6 -4
- package/dist/src/ui/theme.d.ts +1 -0
- package/dist/src/ui/theme.js +2 -0
- package/dist/src/ui/types.d.ts +7 -0
- package/dist/src/ui/use-app-logic.js +0 -0
- package/dist/src/ui/utils/agent-activities.d.ts +39 -0
- package/dist/src/ui/utils/agent-activities.js +96 -0
- package/dist/src/ui/utils/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
- package/dist/src/ui/utils/group-tool-entries.js +111 -0
- package/dist/src/ui/utils/tool-summary.d.ts +21 -0
- package/dist/src/ui/utils/tool-summary.js +91 -0
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/event-loop-monitor.d.ts +85 -0
- package/dist/src/utils/event-loop-monitor.js +107 -0
- package/dist/src/utils/install-manager.js +2 -1
- package/dist/src/utils/llm-deadline.d.ts +14 -0
- package/dist/src/utils/llm-deadline.js +19 -0
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/loop-profiler.d.ts +102 -0
- package/dist/src/utils/loop-profiler.js +202 -0
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +180 -5
- package/dist/src/utils/settings.js +271 -31
- package/dist/src/utils/side-question.d.ts +1 -2
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/visible-retry.d.ts +11 -0
- package/dist/src/utils/visible-retry.js +10 -1
- package/dist/src/verify/entrypoint.d.ts +1 -1
- package/dist/src/verify/entrypoint.js +52 -17
- package/dist/src/verify/orchestrator.d.ts +1 -1
- package/dist/src/verify/orchestrator.js +20 -3
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +134 -132
- package/dist/src/cli/bw-vault.d.ts +0 -55
- package/dist/src/cli/bw-vault.js +0 -133
- package/dist/src/mcp/ee-tools.d.ts +0 -46
- package/dist/src/mcp/ee-tools.js +0 -193
- package/dist/src/providers/auth/gcloud.d.ts +0 -28
- package/dist/src/providers/auth/gcloud.js +0 -102
- package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
- package/dist/src/providers/auth/gemini-oauth.js +0 -472
- package/dist/src/providers/gemini.d.ts +0 -11
- package/dist/src/providers/gemini.js +0 -45
- package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
- package/dist/src/providers/siliconflow-sse-repair.js +0 -177
- package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
- package/dist/src/providers/strategies/google.strategy.js +0 -174
- package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
- package/dist/src/ui/containers/chat-feed.d.ts +0 -40
- package/dist/src/ui/containers/chat-feed.js +0 -66
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
// Dispatcher that wires the discover phase into the adaptive interview flow.
|
|
3
3
|
// buildDiscoveryDebateRunner ← Task 16
|
|
4
4
|
// buildGatherUserPrompt ← Task 17
|
|
5
|
-
import {
|
|
5
|
+
import { runClarification } from "../council/clarifier.js";
|
|
6
|
+
import { resolveLeaderModelDetailed, resolveParticipants } from "../council/leader.js";
|
|
7
|
+
import { isCouncilMultiProviderPreferred } from "../utils/settings.js";
|
|
6
8
|
import { detectExistingProject } from "./discovery-detection.js";
|
|
7
9
|
import { iterateInterview, } from "./discovery-interview.js";
|
|
8
|
-
import { acquireRunLock, initDiscoveryState, readDiscoveryState, readProjectContext, releaseRunLock, resumeArtifactWriteIfNeeded, } from "./discovery-persistence.js";
|
|
10
|
+
import { acquireRunLock, initDiscoveryState, markDone, readDiscoveryState, readProjectContext, releaseRunLock, resumeArtifactWriteIfNeeded, writeProjectContext, } from "./discovery-persistence.js";
|
|
9
11
|
import { parsePromptForContext } from "./discovery-prompt-parser.js";
|
|
10
12
|
import { councilRecommend, leaderRecommend, shouldFallbackToLeader } from "./discovery-recommender.js";
|
|
13
|
+
import { DISCOVERY_QUESTIONS } from "./discovery-schema.js";
|
|
14
|
+
import { triageInterview } from "./discovery-triage.js";
|
|
15
|
+
import { buildRepoBrief } from "./repo-brief.js";
|
|
16
|
+
import { SEED_DIMENSIONS } from "./seed-questions.js";
|
|
11
17
|
/**
|
|
12
18
|
* Decide whether detection signals are STRONG enough to synthesize a
|
|
13
19
|
* backendStack answer (skipping the interview question). Returns null when
|
|
@@ -251,6 +257,30 @@ llm, sessionModelId, io) {
|
|
|
251
257
|
},
|
|
252
258
|
prefillAnswers: { ...prefillFromDetection, ...prompted },
|
|
253
259
|
});
|
|
260
|
+
// Unified agent-driven interview (default). The LLM leader generates every
|
|
261
|
+
// clarification question itself from the idea + injected context and emits
|
|
262
|
+
// its own askcards — the same engine `/council` uses (runClarification) —
|
|
263
|
+
// instead of walking the fixed DISCOVERY_QUESTIONS list. The CLI only
|
|
264
|
+
// injects context (repo brief / prompt-extracted hints); it hardcodes no
|
|
265
|
+
// questions. Requires a wired driver (emit + respondToQuestion); pure-unit
|
|
266
|
+
// callers without io fall through to the legacy fixed-question path below.
|
|
267
|
+
// Opt out with MUONROI_IDEAL_AGENT_INTERVIEW=0.
|
|
268
|
+
if (process.env.MUONROI_IDEAL_AGENT_INTERVIEW !== "0" && io?.emit && io?.respondToQuestion) {
|
|
269
|
+
return await runAgentDrivenGather({
|
|
270
|
+
flowDir,
|
|
271
|
+
runId,
|
|
272
|
+
idea,
|
|
273
|
+
cwd,
|
|
274
|
+
detection,
|
|
275
|
+
leaderModelId,
|
|
276
|
+
sessionModelId,
|
|
277
|
+
llm: llm,
|
|
278
|
+
prompted,
|
|
279
|
+
prefillFromDetection,
|
|
280
|
+
emit: io.emit,
|
|
281
|
+
respondToQuestion: io.respondToQuestion,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
254
284
|
// Recommender: always leader-only. The council debate runner (Task 16) is
|
|
255
285
|
// a stub that throws; until it is wired we delegate council asks to the
|
|
256
286
|
// leader so the gather phase doesn't crash on greenfield projects with
|
|
@@ -270,6 +300,22 @@ llm, sessionModelId, io) {
|
|
|
270
300
|
// (only hit by tests that don't supply io).
|
|
271
301
|
const tuiAsk = io?.emit && io?.respondToQuestion ? buildLiveTuiAsk(io.emit, io.respondToQuestion) : async () => "";
|
|
272
302
|
const userPrompt = buildGatherUserPrompt(tuiAsk);
|
|
303
|
+
// Model-decided interview triage — the PRIMARY signal for how deep to
|
|
304
|
+
// interview (replaces the keyword `computePromptSpecificity` heuristic as the
|
|
305
|
+
// lead). A trivial idea (e.g. a hello-world script) collapses to ONE confirm
|
|
306
|
+
// card instead of 6 generic productType/audience/architecture/db cards; a
|
|
307
|
+
// complex idea keeps only the questions the model flags as decision-shaping.
|
|
308
|
+
// Only the required questions are triaged (optional ones are gated separately).
|
|
309
|
+
// Never throws — degrades to the specificity fallback (see discovery-triage.ts).
|
|
310
|
+
const requiredQuestions = DISCOVERY_QUESTIONS.filter((q) => q.required);
|
|
311
|
+
const triage = await triageInterview(idea, leader, requiredQuestions);
|
|
312
|
+
if (process.env.MUONROI_DEBUG_LEADER === "1") {
|
|
313
|
+
process.stderr.write(`[interview-triage] ${JSON.stringify({
|
|
314
|
+
complexity: triage.complexity,
|
|
315
|
+
relevant: triage.relevant,
|
|
316
|
+
source: triage.source,
|
|
317
|
+
})}\n`);
|
|
318
|
+
}
|
|
273
319
|
return await iterateInterview({
|
|
274
320
|
flowDir,
|
|
275
321
|
runId,
|
|
@@ -278,6 +324,7 @@ llm, sessionModelId, io) {
|
|
|
278
324
|
detection,
|
|
279
325
|
userPrompt,
|
|
280
326
|
recommender,
|
|
327
|
+
triage,
|
|
281
328
|
});
|
|
282
329
|
}
|
|
283
330
|
finally {
|
|
@@ -285,6 +332,90 @@ llm, sessionModelId, io) {
|
|
|
285
332
|
}
|
|
286
333
|
}
|
|
287
334
|
// ---------------------------------------------------------------------------
|
|
335
|
+
// Agent-driven interview (unified clarifier engine)
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
/**
|
|
338
|
+
* Run the gather interview by delegating to the SAME agent-driven clarifier the
|
|
339
|
+
* council uses (`runClarification`): the LLM leader generates its own
|
|
340
|
+
* clarification questions from the idea + injected context, emits its own
|
|
341
|
+
* `council_question` askcards, self-judges readiness, and synthesizes a
|
|
342
|
+
* `ClarifiedSpec`. The CLI contributes only context (repo brief for existing
|
|
343
|
+
* repos, prompt-extracted hints) and the askcard plumbing — it hardcodes no
|
|
344
|
+
* questions and no answer enums.
|
|
345
|
+
*
|
|
346
|
+
* Output is a `ProjectContext` that carries the clarifier's `ClarifiedSpec`
|
|
347
|
+
* verbatim (`clarified`), so `clarifiedSpecFromContext` returns the real
|
|
348
|
+
* LLM-synthesized successCriteria/constraints/scope instead of re-deriving a
|
|
349
|
+
* thin persona+scale spec. `context` is populated best-effort from detection +
|
|
350
|
+
* prompt hints purely as a supplement for the (fully-guarded) downstream
|
|
351
|
+
* `formatProjectContextForPrompt`.
|
|
352
|
+
*/
|
|
353
|
+
async function runAgentDrivenGather(args) {
|
|
354
|
+
// Context the CLI injects for the agent to interview AGAINST — never questions.
|
|
355
|
+
let conversationContext = "";
|
|
356
|
+
if (args.detection.classification !== "greenfield") {
|
|
357
|
+
try {
|
|
358
|
+
const brief = await buildRepoBrief(args.cwd, args.detection);
|
|
359
|
+
// The "## Current Project" header switches the clarifier into existing-repo
|
|
360
|
+
// mode (drops generic greenfield questions, grounds rationales in real files).
|
|
361
|
+
conversationContext += `## Current Project\n${brief.markdown}\n\n`;
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
// Brief failure must NEVER block the interview — fall through context-light.
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (Object.keys(args.prompted).length > 0) {
|
|
368
|
+
conversationContext += `## Extracted from the request\n${JSON.stringify(args.prompted, null, 2)}\n`;
|
|
369
|
+
}
|
|
370
|
+
// Reachable panel models — passed as the clarifier's fallbackModels so its
|
|
371
|
+
// research-first step can prefer a native-web-research model on any reachable
|
|
372
|
+
// provider (and spec-synth can fall back off a flaky leader proxy). Never
|
|
373
|
+
// blocks gather: resolution failure degrades to leader-only.
|
|
374
|
+
let panelModels = [];
|
|
375
|
+
try {
|
|
376
|
+
const participants = await resolveParticipants(args.sessionModelId, isCouncilMultiProviderPreferred());
|
|
377
|
+
panelModels = participants.map((p) => p.model).filter(Boolean);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// leader-only reachability is fine — research-first still runs on the leader.
|
|
381
|
+
}
|
|
382
|
+
// Drive the clarifier generator; forward each emitted chunk to the driver so
|
|
383
|
+
// the TUI renders each dynamically-generated askcard, then capture the spec.
|
|
384
|
+
// seedQuestions is intentionally empty — the clarifier's own research-first
|
|
385
|
+
// step (runClarification) now grounds the questions; no CLI-owned seed list.
|
|
386
|
+
const gen = runClarification(args.idea, args.leaderModelId, conversationContext, args.respondToQuestion, args.llm, undefined, // signal — no abort wired through gather today
|
|
387
|
+
undefined, // seedQuestions
|
|
388
|
+
undefined, // maxRounds → clarifier default
|
|
389
|
+
undefined, // prefillAnswers
|
|
390
|
+
false, // costAware
|
|
391
|
+
panelModels);
|
|
392
|
+
let result;
|
|
393
|
+
do {
|
|
394
|
+
result = await gen.next();
|
|
395
|
+
if (!result.done && result.value)
|
|
396
|
+
args.emit(result.value);
|
|
397
|
+
} while (!result.done);
|
|
398
|
+
const clarified = result.value;
|
|
399
|
+
const context = { ...args.prefillFromDetection, ...args.prompted };
|
|
400
|
+
const projectContext = {
|
|
401
|
+
version: 1,
|
|
402
|
+
schemaName: "project-context",
|
|
403
|
+
generatedAt: new Date().toISOString(),
|
|
404
|
+
idea: args.idea,
|
|
405
|
+
detection: args.detection,
|
|
406
|
+
context,
|
|
407
|
+
clarified,
|
|
408
|
+
recommendations: {
|
|
409
|
+
byField: {},
|
|
410
|
+
constraints: { fePolicy: "headless-ui-only", feEnforced: true },
|
|
411
|
+
},
|
|
412
|
+
userOverrides: [],
|
|
413
|
+
};
|
|
414
|
+
await writeProjectContext(args.flowDir, args.runId, projectContext);
|
|
415
|
+
await markDone(args.flowDir, args.runId);
|
|
416
|
+
return projectContext;
|
|
417
|
+
}
|
|
418
|
+
// ---------------------------------------------------------------------------
|
|
288
419
|
// ClarifiedSpec bridge
|
|
289
420
|
// ---------------------------------------------------------------------------
|
|
290
421
|
/**
|
|
@@ -294,6 +425,23 @@ llm, sessionModelId, io) {
|
|
|
294
425
|
* has passed (or all required questions are answered).
|
|
295
426
|
*/
|
|
296
427
|
export function clarifiedSpecFromContext(pc) {
|
|
428
|
+
// Agent-driven path: the clarifier already synthesized a full ClarifiedSpec
|
|
429
|
+
// (real LLM-derived successCriteria/constraints/scope + rawQA). Return it
|
|
430
|
+
// verbatim, deriving the loop-driver resolution gate from the agent's OWN
|
|
431
|
+
// readiness judgment rather than the hardcoded 6-dimension answered-check:
|
|
432
|
+
// when the clarifier declared the spec ready (or didn't flag it not-ready),
|
|
433
|
+
// mark every SEED_DIMENSION resolved so the gate passes; otherwise leave them
|
|
434
|
+
// unspecified so the existing insufficient_resolution safety net still fires.
|
|
435
|
+
if (pc.clarified) {
|
|
436
|
+
const ready = pc.clarified.ready !== false;
|
|
437
|
+
const status = ready ? "answered" : "unspecified";
|
|
438
|
+
const resolved = {
|
|
439
|
+
...(pc.clarified.resolved ?? {}),
|
|
440
|
+
};
|
|
441
|
+
for (const d of SEED_DIMENSIONS)
|
|
442
|
+
resolved[d.id] = status;
|
|
443
|
+
return { ...pc.clarified, resolved };
|
|
444
|
+
}
|
|
297
445
|
const ctx = pc.context;
|
|
298
446
|
const problemStatement = pc.idea;
|
|
299
447
|
const constraints = [];
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isIdealTraceEnabled(): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* Emit one diagnostic breadcrumb. `marker` is a stable dotted label
|
|
4
|
+
* (e.g. "council.persist.writeDecisionsLock.before"); `extra` carries small
|
|
5
|
+
* scalar context (sessionId, answer, lengths) — keep it tiny, this runs inline.
|
|
6
|
+
*/
|
|
7
|
+
export declare function idealTrace(marker: string, extra?: Record<string, unknown>): void;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// src/product-loop/ideal-trace.ts
|
|
2
|
+
//
|
|
3
|
+
// Env-gated diagnostic tracer for the /ideal → council → sprint path.
|
|
4
|
+
//
|
|
5
|
+
// WHY THIS EXISTS
|
|
6
|
+
// ---------------
|
|
7
|
+
// "blocker 5" — the observed but non-deterministic "Plan locked → idle" stall
|
|
8
|
+
// after the sprint-planning debate synthesis — could not be root-caused from a
|
|
9
|
+
// harness run because greenfield almost always halts at CB3 first, and the tail
|
|
10
|
+
// path (post-debate menu → persist → writeDecisionsLock → stats → return, then
|
|
11
|
+
// sprint-runner's Implementation stage) has no durable breadcrumb. When the flow
|
|
12
|
+
// goes idle mid-tail, there is nothing to say WHICH line was last reached.
|
|
13
|
+
//
|
|
14
|
+
// This tracer writes one synchronous JSONL line per choke point when
|
|
15
|
+
// `MUONROI_IDEAL_TRACE` is set. Synchronous (`appendFileSync`) is deliberate: if
|
|
16
|
+
// the process hangs or is killed at the stall, the LAST line in the file is the
|
|
17
|
+
// last point the flow reached — an async write could be lost to an unflushed
|
|
18
|
+
// buffer. Unset → zero behaviour change (no file, no stderr, single env read).
|
|
19
|
+
//
|
|
20
|
+
// USAGE
|
|
21
|
+
// MUONROI_IDEAL_TRACE=1 → <tmpdir>/muonroi-ideal-trace.jsonl
|
|
22
|
+
// MUONROI_IDEAL_TRACE=/path/to/ideal-trace.log → explicit path
|
|
23
|
+
// Then reproduce the stall and read the file; the trailing marker is the hang.
|
|
24
|
+
import { appendFileSync } from "node:fs";
|
|
25
|
+
import * as os from "node:os";
|
|
26
|
+
import * as path from "node:path";
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the trace sink for the CURRENT env value, or null when disabled.
|
|
29
|
+
* Not cached — the flag is fixed for a CLI session, and re-reading env per call
|
|
30
|
+
* is trivial on this (slow, non-hot) council path; caching would wrongly pin an
|
|
31
|
+
* early "disabled" read for the whole process.
|
|
32
|
+
*/
|
|
33
|
+
function tracePath() {
|
|
34
|
+
const raw = process.env.MUONROI_IDEAL_TRACE;
|
|
35
|
+
if (!raw || raw === "0" || raw === "false")
|
|
36
|
+
return null;
|
|
37
|
+
return raw === "1" || raw === "true" ? path.join(os.tmpdir(), "muonroi-ideal-trace.jsonl") : raw;
|
|
38
|
+
}
|
|
39
|
+
export function isIdealTraceEnabled() {
|
|
40
|
+
return tracePath() !== null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Emit one diagnostic breadcrumb. `marker` is a stable dotted label
|
|
44
|
+
* (e.g. "council.persist.writeDecisionsLock.before"); `extra` carries small
|
|
45
|
+
* scalar context (sessionId, answer, lengths) — keep it tiny, this runs inline.
|
|
46
|
+
*/
|
|
47
|
+
export function idealTrace(marker, extra) {
|
|
48
|
+
const file = tracePath();
|
|
49
|
+
if (!file)
|
|
50
|
+
return;
|
|
51
|
+
const record = { ts: new Date().toISOString(), marker, ...extra };
|
|
52
|
+
const line = JSON.stringify(record);
|
|
53
|
+
try {
|
|
54
|
+
appendFileSync(file, `${line}\n`, "utf8");
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// Best-effort diagnostics: a bad path must never break the council/sprint
|
|
58
|
+
// flow. Surface once on stderr so a misconfigured path is noticed.
|
|
59
|
+
process.stderr.write(`[ideal-trace] append failed (${file}): ${err?.message}\n`);
|
|
60
|
+
}
|
|
61
|
+
// Mirror to stderr so it also lands in MUONROI_DEBUG_LLM_WIRE-style captures.
|
|
62
|
+
process.stderr.write(`[ideal-trace] ${line}\n`);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=ideal-trace.js.map
|
|
@@ -18,7 +18,7 @@ export interface ProductLoopOptions {
|
|
|
18
18
|
/** Required for resume/abort/ship/status<runId>. */
|
|
19
19
|
runId?: string;
|
|
20
20
|
/** Subcommand selector. Default = start. */
|
|
21
|
-
subcommand?: "start" | "status" | "resume" | "abort" | "ship";
|
|
21
|
+
subcommand?: "start" | "status" | "resume" | "abort" | "ship" | "review";
|
|
22
22
|
flowDir: string;
|
|
23
23
|
/** Session model id from the orchestrator (this.modelId). Used to resolve real council models. */
|
|
24
24
|
sessionModelId: string;
|
|
@@ -29,6 +29,8 @@ export interface ProductLoopOptions {
|
|
|
29
29
|
/** Optional bridges; sprint-runner uses them when present. */
|
|
30
30
|
cwd?: string;
|
|
31
31
|
processMessageFn?: (message: string) => AsyncGenerator<StreamChunk, void, unknown>;
|
|
32
|
+
/** Isolated bounded task-runner bridge — see DriverContext.runIsolatedTask. */
|
|
33
|
+
runIsolatedTask?: (request: import("../types/index.js").TaskRequest) => Promise<import("../types/index.js").ToolResult>;
|
|
32
34
|
detectVerifyRecipe?: () => Promise<VerifyRecipe | null>;
|
|
33
35
|
/** Test hook: pre-resolved role assignments so the harness can pin model ids. */
|
|
34
36
|
roleAssignments?: Map<RoleSlot, {
|
|
@@ -53,6 +55,16 @@ export interface ProductLoopOptions {
|
|
|
53
55
|
* not set, the dispatcher routes to runHotPath (single sprint, no council debate).
|
|
54
56
|
*/
|
|
55
57
|
complexity?: "low" | "medium" | "high";
|
|
58
|
+
/**
|
|
59
|
+
* LLM-decided clarity signal (PIL Layer 1 `needsClarification`). When true the
|
|
60
|
+
* request is UNDERSPECIFIED — the model judged it lacks information it would
|
|
61
|
+
* need to proceed without guessing. It earns the interview/Council path even
|
|
62
|
+
* on an existing repo where a well-specified `standard` task would hot-path.
|
|
63
|
+
* Agent-first replacement for the regex sufficiency scorer: only `quick`
|
|
64
|
+
* (complexity=low) tasks still hot-path when underspecified — a trivial ask is
|
|
65
|
+
* not worth an interview no matter how terse.
|
|
66
|
+
*/
|
|
67
|
+
needsClarification?: boolean;
|
|
56
68
|
/**
|
|
57
69
|
* Sufficiency gaps from PIL Layer 1. When non-empty, the dispatcher forces
|
|
58
70
|
* the Council path regardless of complexity — vague prompts MUST go through
|