muonroi-cli 1.8.3 → 1.8.5
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 +21 -21
- package/README.md +133 -122
- 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-tee.d.ts +48 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
- package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
- 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 +28 -0
- package/dist/src/agent-harness/mock-model.js +63 -1
- package/dist/src/agent-harness/test-spawn.js +31 -0
- 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 +30 -15
- 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 +2 -2
- package/dist/src/cli/keys.js +19 -81
- package/dist/src/council/clarifier.d.ts +28 -2
- package/dist/src/council/clarifier.js +81 -15
- 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 +51 -3
- 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 +1210 -134
- package/dist/src/council/index.d.ts +85 -1
- package/dist/src/council/index.js +634 -196
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +32 -0
- package/dist/src/council/llm.js +231 -38
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +72 -0
- package/dist/src/council/planner.js +23 -0
- package/dist/src/council/preflight.d.ts +7 -0
- package/dist/src/council/preflight.js +14 -2
- package/dist/src/council/prompts.d.ts +30 -3
- package/dist/src/council/prompts.js +254 -84
- 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 +128 -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 +1 -0
- package/dist/src/ee/auth.js +15 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +81 -18
- 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 +45 -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 +13 -1
- package/dist/src/flow/compaction/index.js +70 -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/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 +55 -0
- package/dist/src/gsd/flags.js +83 -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 +251 -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/hooks/index.js +1 -1
- package/dist/src/index.js +44 -11
- 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 +1 -1
- package/dist/src/mcp/ee-tools.js +1 -0
- package/dist/src/mcp/oauth-callback.js +2 -2
- 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 +77 -76
- 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 +8 -8
- 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 +10 -0
- package/dist/src/orchestrator/compaction.js +27 -7
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +65 -24
- 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/message-processor.js +242 -33
- package/dist/src/orchestrator/orchestrator.d.ts +39 -3
- package/dist/src/orchestrator/orchestrator.js +651 -102
- package/dist/src/orchestrator/preprocessor.js +1 -1
- 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 +159 -159
- 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-intercept.d.ts +45 -0
- package/dist/src/orchestrator/safety-intercept.js +55 -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 +24 -3
- package/dist/src/orchestrator/stall-watchdog.js +47 -13
- package/dist/src/orchestrator/stream-runner.js +62 -29
- 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 +26 -0
- package/dist/src/orchestrator/tool-engine.js +669 -56
- 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 +37 -0
- package/dist/src/orchestrator/turn-watchdog.js +55 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +1 -1
- 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.js +16 -11
- 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/layer2_5-ponytail.js +8 -8
- 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 +33 -2
- package/dist/src/pil/llm-classify.js +123 -131
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +1 -0
- package/dist/src/pil/pipeline.js +34 -2
- 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/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- 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.js +32 -3
- package/dist/src/product-loop/discovery-schema.js +5 -1
- package/dist/src/product-loop/done-gate.js +3 -3
- 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 +333 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +327 -116
- package/dist/src/product-loop/phase-plan.d.ts +5 -0
- package/dist/src/product-loop/phase-plan.js +39 -2
- package/dist/src/product-loop/phase-runner.js +9 -1
- package/dist/src/product-loop/progress-snapshot.js +4 -4
- package/dist/src/product-loop/sprint-runner.d.ts +111 -0
- package/dist/src/product-loop/sprint-runner.js +559 -16
- package/dist/src/product-loop/types.d.ts +36 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- 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/openai-oauth.js +1 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.js +4 -1
- package/dist/src/providers/auth/types.d.ts +1 -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/keychain.d.ts +1 -1
- package/dist/src/providers/keychain.js +7 -9
- package/dist/src/providers/mcp-vision-bridge.js +82 -172
- 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 +27 -2
- package/dist/src/providers/runtime.js +78 -15
- 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 +280 -1
- 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/wire-debug.js +95 -0
- package/dist/src/reporter/index.js +1 -1
- 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/bb-ecosystem-apply.js +47 -47
- package/dist/src/scaffold/bb-quality-gate.js +5 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +86 -60
- package/dist/src/scaffold/init-new.js +453 -453
- 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 +22 -22
- 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/interaction-log.js +5 -5
- package/dist/src/storage/migrations.js +196 -126
- package/dist/src/storage/session-experience-store.js +4 -4
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +112 -55
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +383 -112
- package/dist/src/storage/usage.js +14 -14
- package/dist/src/storage/workspaces.js +12 -12
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/native-tools.js +5 -0
- package/dist/src/tools/registry.d.ts +3 -0
- package/dist/src/tools/registry.js +460 -22
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +118 -3
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- 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/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 +49 -15
- 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 +12 -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/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/containers/modals-layer.d.ts +2 -1
- 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/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-inspect.js +4 -4
- 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/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 +12 -18
- 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/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/clipboard-image.js +23 -23
- package/dist/src/utils/install-manager.js +14 -11
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +153 -5
- package/dist/src/utils/settings.js +233 -29
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/skills.js +3 -3
- 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 +1 -1
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +135 -132
- 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
package/dist/src/index.js
CHANGED
|
@@ -163,7 +163,7 @@ async function hasOAuthForModel(modelId) {
|
|
|
163
163
|
* Supported splash providers — mirrors SPLASH_PROVIDERS in ui/app.tsx.
|
|
164
164
|
* The wizard only surfaces these; other providers still work programmatically.
|
|
165
165
|
*/
|
|
166
|
-
const WIZARD_PROVIDERS = ["deepseek", "
|
|
166
|
+
const WIZARD_PROVIDERS = ["deepseek", "zai", "opencode-go", "xai"];
|
|
167
167
|
async function firstRunWizard(currentModel) {
|
|
168
168
|
let rl;
|
|
169
169
|
try {
|
|
@@ -335,7 +335,7 @@ async function firstRunWizard(currentModel) {
|
|
|
335
335
|
return null;
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
|
-
async function startInteractive(apiKey, baseURL, model, maxToolRounds, batchApi, session, initialMessage, permissionMode = "safe", injectHalt = false) {
|
|
338
|
+
async function startInteractive(apiKey, baseURL, model, maxToolRounds, batchApi, session, initialMessage, permissionMode = "safe", injectHalt = false, injectHaltSprint = false) {
|
|
339
339
|
// ── Plan 00-07 boot order ──────────────────────────────────────────────────
|
|
340
340
|
// 1. redactor.installGlobalPatches() — already at top of file (line 6).
|
|
341
341
|
// 2. loadConfig + loadUsage (validates storage paths, logs usage cap state).
|
|
@@ -416,6 +416,14 @@ async function startInteractive(apiKey, baseURL, model, maxToolRounds, batchApi,
|
|
|
416
416
|
const { relaunchWithSession } = await import("./ui/utils/relaunch.js");
|
|
417
417
|
const renderer = await createCliRenderer({
|
|
418
418
|
exitOnCtrlC: false,
|
|
419
|
+
// OpenTUI defaults openConsoleOnError:true — its process-level
|
|
420
|
+
// unhandledRejection/uncaughtException handler then calls console.show(),
|
|
421
|
+
// which focuses the debug console overlay and captures ALL keypresses.
|
|
422
|
+
// The overlay's keybindings have no hide/close action, so a stray rejection
|
|
423
|
+
// (e.g. a provider dropping a streaming socket) traps the user in a console
|
|
424
|
+
// they cannot dismiss. We surface errors in-band instead — keep it off.
|
|
425
|
+
// Toggle it deliberately with F12 (wired below).
|
|
426
|
+
openConsoleOnError: false,
|
|
419
427
|
// We manage SIGINT ourselves (orchestrator abort → agent cleanup → renderer destroy).
|
|
420
428
|
// Prevent OpenTUI from registering its own SIGINT/SIGTERM handler which would
|
|
421
429
|
// call renderer.destroy() prematurely and race with our orderly shutdown.
|
|
@@ -426,10 +434,29 @@ async function startInteractive(apiKey, baseURL, model, maxToolRounds, batchApi,
|
|
|
426
434
|
alternateKeys: true,
|
|
427
435
|
},
|
|
428
436
|
});
|
|
437
|
+
// Agent-mode: hand the renderer to the harness so it can snapshot the ACTUAL
|
|
438
|
+
// rendered cell grid (colors + attributes) via VisualFrame, not just the
|
|
439
|
+
// semantic tree. No-op outside agent-mode (runtime undefined).
|
|
440
|
+
{
|
|
441
|
+
const agentRt = globalThis.__muonroiAgentRuntime;
|
|
442
|
+
agentRt?.attachRenderer?.(renderer);
|
|
443
|
+
}
|
|
429
444
|
// The TUI now owns the terminal — route fatal-handler behaviour away from
|
|
430
445
|
// process.exit(1) (see the unhandledRejection handler above). Cleared in
|
|
431
446
|
// restoreTerminalSync() the moment we begin tearing the terminal back down.
|
|
432
447
|
setTuiActive(true);
|
|
448
|
+
// Deliberate debug-console toggle. With openConsoleOnError:false the overlay
|
|
449
|
+
// never auto-pops, so F12 is the ONLY way in — and, crucially, back out:
|
|
450
|
+
// console.toggle() hides it when it is visible+focused, so it can never trap.
|
|
451
|
+
try {
|
|
452
|
+
renderer.keyInput?.on("keypress", (key) => {
|
|
453
|
+
if (key?.name === "f12")
|
|
454
|
+
renderer.console.toggle();
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
/* keyInput/console are best-effort dev affordances — never block boot */
|
|
459
|
+
}
|
|
433
460
|
/**
|
|
434
461
|
* Restore terminal to main-screen mode before the process exits.
|
|
435
462
|
*
|
|
@@ -616,6 +643,7 @@ async function startInteractive(apiKey, baseURL, model, maxToolRounds, batchApi,
|
|
|
616
643
|
maxToolRounds,
|
|
617
644
|
version: packageJson.version,
|
|
618
645
|
injectHalt,
|
|
646
|
+
injectHaltSprint,
|
|
619
647
|
},
|
|
620
648
|
initialMessage,
|
|
621
649
|
onExit,
|
|
@@ -852,6 +880,7 @@ program
|
|
|
852
880
|
.option("--agent-fake-clock", "Use deterministic frame-counter clock")
|
|
853
881
|
.option("--mock-llm <dir>", "Use fixture-based mock LLM from <dir> instead of real provider (E2E testing)")
|
|
854
882
|
.option("--inject-halt", "TEST SEAM: render a synthetic halt recovery card after boot (harness E2E only)")
|
|
883
|
+
.option("--inject-halt-sprint", "TEST SEAM: render a synthetic sprint-failed recovery card after boot (harness E2E only)")
|
|
855
884
|
.action(async (message, options) => {
|
|
856
885
|
// Agent-mode: start the sidechannel runtime BEFORE any TUI or model work.
|
|
857
886
|
// The runtime is exposed on globalThis so the renderer wiring (Task 1.6c)
|
|
@@ -978,11 +1007,10 @@ program
|
|
|
978
1007
|
}
|
|
979
1008
|
changeDirectoryOrExit(options.directory);
|
|
980
1009
|
// Boot model registry BEFORE any key resolution path runs —
|
|
981
|
-
// detectProviderForModel consults the catalog's alias map to route
|
|
982
|
-
//
|
|
983
|
-
//
|
|
984
|
-
//
|
|
985
|
-
// main interactive/headless path below.
|
|
1010
|
+
// detectProviderForModel consults the catalog's alias map to route model
|
|
1011
|
+
// ids to the correct provider. With an empty registry it falls back to a
|
|
1012
|
+
// prefix match and the CLI may load the wrong provider's key. Affects both
|
|
1013
|
+
// runBackgroundDelegation and the main interactive/headless path below.
|
|
986
1014
|
let catalogLoadFailed = false;
|
|
987
1015
|
await loadCatalog().catch(() => {
|
|
988
1016
|
catalogLoadFailed = true;
|
|
@@ -1049,10 +1077,15 @@ program
|
|
|
1049
1077
|
// so each request doesn't re-probe.
|
|
1050
1078
|
const { detectEEClientMode, describeMode } = await import("./ee/client-mode.js");
|
|
1051
1079
|
detectEEClientMode()
|
|
1052
|
-
.then((info) => {
|
|
1080
|
+
.then(async (info) => {
|
|
1053
1081
|
if (process.env.MUONROI_EE_DEBUG === "1") {
|
|
1054
1082
|
console.error(`[muonroi-cli] ${describeMode(info)}`);
|
|
1055
1083
|
}
|
|
1084
|
+
// WhoAmI thin-client fallback: once the mode is cached, derive the working-style
|
|
1085
|
+
// profile from the behavioral brain and prime the sync cache so the PIL picks it
|
|
1086
|
+
// up from the next turn. Fire-and-forget, fail-open — never blocks boot.
|
|
1087
|
+
const { warmWhoAmIFromBrain } = await import("./ee/bridge.js");
|
|
1088
|
+
await warmWhoAmIFromBrain();
|
|
1056
1089
|
})
|
|
1057
1090
|
.catch(() => { });
|
|
1058
1091
|
// Patch zod-to-json-schema for Zod v4 compat (fixes tool calls for DeepSeek etc.)
|
|
@@ -1130,7 +1163,7 @@ program
|
|
|
1130
1163
|
return;
|
|
1131
1164
|
}
|
|
1132
1165
|
const initialMessage = message.length > 0 ? message.join(" ") : undefined;
|
|
1133
|
-
await startInteractive(config.apiKey, config.baseURL, config.model, config.maxToolRounds, options.batchApi === true, options.session, initialMessage, options.permission, options.injectHalt === true);
|
|
1166
|
+
await startInteractive(config.apiKey, config.baseURL, config.model, config.maxToolRounds, options.batchApi === true, options.session, initialMessage, options.permission, options.injectHalt === true, options.injectHaltSprint === true);
|
|
1134
1167
|
});
|
|
1135
1168
|
program
|
|
1136
1169
|
.command("models")
|
|
@@ -1254,7 +1287,7 @@ keys
|
|
|
1254
1287
|
});
|
|
1255
1288
|
keys
|
|
1256
1289
|
.command("login <provider>")
|
|
1257
|
-
.description("Log in to a provider via OAuth subscription (supported: openai,
|
|
1290
|
+
.description("Log in to a provider via OAuth subscription (supported: openai, xai).")
|
|
1258
1291
|
.action(async (provider) => {
|
|
1259
1292
|
const { runKeysLogin } = await import("./cli/keys.js");
|
|
1260
1293
|
await runKeysLogin(provider);
|
|
@@ -1391,7 +1424,7 @@ usage
|
|
|
1391
1424
|
const mcp = program.command("mcp").description("Manage MCP server configuration");
|
|
1392
1425
|
mcp
|
|
1393
1426
|
.command("setup-research")
|
|
1394
|
-
.description("Configure web research
|
|
1427
|
+
.description("Configure web research (native fetch_url + web_search; optional MCPs for context7/muonroi-docs)")
|
|
1395
1428
|
.action(async () => {
|
|
1396
1429
|
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
1397
1430
|
const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a)));
|
|
@@ -186,9 +186,13 @@ async function squashSinceMarker(cwd, markerSha, title) {
|
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
// ─── PR body prompt ───────────────────────────────────────────────────────────
|
|
189
|
-
const PR_BODY_SYSTEM = "You are a
|
|
190
|
-
"
|
|
191
|
-
"
|
|
189
|
+
const PR_BODY_SYSTEM = "You are a senior engineer writing the description for your own pull request. " +
|
|
190
|
+
"Write for a busy reviewer: they should understand what this PR does, why it exists, and how to verify it " +
|
|
191
|
+
"within thirty seconds of reading — before they open a single file. " +
|
|
192
|
+
"Write in plain, confident prose. Prefer specific claims ('caps retry backoff at 30s') over vague ones " +
|
|
193
|
+
"('improves retry handling'). Never restate filenames or diffs mechanically — explain intent and effect. " +
|
|
194
|
+
"Do not pad, do not apologize, and do not invent changes that are not evidenced by the task data or diff. " +
|
|
195
|
+
"Output ONLY the finished markdown body — no preamble, no commentary, and no code fence wrapping the whole output.";
|
|
192
196
|
function buildPrBodyPrompt(task, diff, intel, result, filesOutsideRadius) {
|
|
193
197
|
const diffSnippet = diff.length > 8192 ? `${diff.slice(0, 8192)}\n...[diff truncated to 8KB]` : diff;
|
|
194
198
|
const descriptionSummary = task.description.length > 600 ? `${task.description.slice(0, 597)}…` : task.description;
|
|
@@ -199,29 +203,35 @@ function buildPrBodyPrompt(task, diff, intel, result, filesOutsideRadius) {
|
|
|
199
203
|
? `\n## Review Concerns\n${result.reviewConcerns.map((c) => `- ${c}`).join("\n")}`
|
|
200
204
|
: "";
|
|
201
205
|
return [
|
|
202
|
-
"
|
|
203
|
-
"Use the
|
|
206
|
+
"Write the pull request body for the maintenance task below.",
|
|
207
|
+
"Use exactly the section structure described here, in this order. Render real content for every section — no placeholders, no angle brackets in the output.",
|
|
204
208
|
"Output ONLY the rendered markdown body — nothing else.",
|
|
205
209
|
"",
|
|
206
|
-
"##
|
|
210
|
+
"## Structure",
|
|
207
211
|
"---",
|
|
208
212
|
"## Summary",
|
|
209
|
-
"
|
|
213
|
+
"Two to four sentences a reviewer can read in isolation: what problem this PR solves, why it matters now, and the shape of the fix. Ground it in the task description, but rewrite it as prose — do not paste the task text verbatim.",
|
|
210
214
|
"",
|
|
211
215
|
"## What changed",
|
|
212
|
-
"
|
|
216
|
+
"Three to six bullets describing observable behavior changes, ordered most-significant first. Each bullet states an effect ('X now does Y', 'Z no longer happens when W'), not a file operation. Infer these from the diff hunks; mention a file path only when it clarifies scope. If the diff is trivially small, two bullets are fine — do not pad.",
|
|
213
217
|
"",
|
|
214
218
|
"## Test plan",
|
|
215
|
-
"
|
|
219
|
+
"One bullet per acceptance criterion, phrased as a verifiable check the reviewer could repeat. Then list the regression tests that were run. If something was NOT verified, say so plainly rather than omitting it.",
|
|
216
220
|
outsideSection ? "## Files outside declared impact radius" : "",
|
|
217
|
-
outsideSection
|
|
221
|
+
outsideSection
|
|
222
|
+
? "List each file from the task data below, and for each add a short honest note on why it was touched (or 'reason unclear from diff' if you cannot tell). These files deserve extra reviewer scrutiny — do not downplay them."
|
|
223
|
+
: "",
|
|
218
224
|
concernsSection ? "## Review Concerns" : "",
|
|
219
|
-
concernsSection
|
|
225
|
+
concernsSection
|
|
226
|
+
? "List each concern from the task data verbatim, one bullet each. These are non-blocking flags for reviewer awareness — preserve their meaning, do not soften or editorialize."
|
|
227
|
+
: "",
|
|
220
228
|
"## Related",
|
|
221
|
-
"- Impact radius:
|
|
222
|
-
"- Regression tests run:
|
|
229
|
+
"- Impact radius: the first 5 entries from the impact radius in the task data",
|
|
230
|
+
"- Regression tests run: the first 5 entries from the regression tests in the task data",
|
|
223
231
|
"---",
|
|
224
232
|
"",
|
|
233
|
+
"Rules: British understatement over marketing tone. No emoji. No headers beyond those specified. Keep the whole body under ~350 words unless the concerns/outside-radius sections force it longer.",
|
|
234
|
+
"",
|
|
225
235
|
"## Task data",
|
|
226
236
|
`Kind: ${task.kind}`,
|
|
227
237
|
`Title: ${task.title}`,
|
|
@@ -27,6 +27,27 @@ function removeDeprecatedToolsMcp(servers) {
|
|
|
27
27
|
console.error("[mcp:auto-setup] removed deprecated self-spawned muonroi-tools server — its tools are now native in-process builtins");
|
|
28
28
|
return true;
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Remove deprecated external MCP servers that are no longer seeded by default.
|
|
32
|
+
*
|
|
33
|
+
* - memory: superseded by native Experience Engine (ee_query + ee_write)
|
|
34
|
+
* - playwright: heavy browser automation; native research tools (fetch_url/web_search) cover most needs. Can be added manually.
|
|
35
|
+
* - figma: requires API key + specific workflow; removed from defaults. Can be added manually if needed.
|
|
36
|
+
*/
|
|
37
|
+
function removeDeprecatedExternalMcps(servers) {
|
|
38
|
+
const idsToRemove = new Set(["memory", "playwright", "figma"]);
|
|
39
|
+
let removed = false;
|
|
40
|
+
for (let i = servers.length - 1; i >= 0; i--) {
|
|
41
|
+
if (idsToRemove.has(servers[i].id)) {
|
|
42
|
+
servers.splice(i, 1);
|
|
43
|
+
removed = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (removed) {
|
|
47
|
+
console.error("[mcp:auto-setup] removed deprecated external MCPs (memory/playwright/figma). Use native EE for memory; fetch_url + web_search for research. Add playwright/figma manually only if full integration required.");
|
|
48
|
+
}
|
|
49
|
+
return removed;
|
|
50
|
+
}
|
|
30
51
|
const DEFAULT_CONFIGS = [
|
|
31
52
|
{
|
|
32
53
|
// Authoritative source for the Muonroi ecosystem (BB/.NET template recipes,
|
|
@@ -39,31 +60,6 @@ const DEFAULT_CONFIGS = [
|
|
|
39
60
|
transport: "http",
|
|
40
61
|
url: "https://docs-mcp.muonroi.com/mcp",
|
|
41
62
|
},
|
|
42
|
-
{
|
|
43
|
-
id: "playwright",
|
|
44
|
-
label: "Playwright",
|
|
45
|
-
enabled: true,
|
|
46
|
-
transport: "stdio",
|
|
47
|
-
command: "npx",
|
|
48
|
-
args: ["-y", "@playwright/mcp"],
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
id: "memory",
|
|
52
|
-
label: "Memory",
|
|
53
|
-
enabled: false,
|
|
54
|
-
transport: "stdio",
|
|
55
|
-
command: "npx",
|
|
56
|
-
args: ["-y", "@modelcontextprotocol/server-memory"],
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
id: "figma",
|
|
60
|
-
label: "Figma",
|
|
61
|
-
enabled: false,
|
|
62
|
-
transport: "stdio",
|
|
63
|
-
command: "npx",
|
|
64
|
-
args: ["-y", "figma-developer-mcp", "--stdio"],
|
|
65
|
-
env: { FIGMA_API_KEY: "" },
|
|
66
|
-
},
|
|
67
63
|
{
|
|
68
64
|
id: "context7",
|
|
69
65
|
label: "Context7 (Library Docs)",
|
|
@@ -71,21 +67,24 @@ const DEFAULT_CONFIGS = [
|
|
|
71
67
|
transport: "http",
|
|
72
68
|
url: "https://mcp.context7.com/mcp",
|
|
73
69
|
},
|
|
70
|
+
// fetch and tavily are now provided as *native* builtins (fetch_url / web_search).
|
|
71
|
+
// The external MCP versions are kept in the catalog for users who explicitly want them,
|
|
72
|
+
// but are no longer enabled by default for the inner agent.
|
|
74
73
|
{
|
|
75
74
|
id: "fetch",
|
|
76
|
-
label: "Fetch (URL → markdown)",
|
|
77
|
-
enabled:
|
|
75
|
+
label: "Fetch (URL → markdown) [MCP legacy]",
|
|
76
|
+
enabled: false,
|
|
78
77
|
transport: "stdio",
|
|
79
|
-
command: "
|
|
80
|
-
args: ["-y", "mcp-fetch-server"],
|
|
78
|
+
command: "bun",
|
|
79
|
+
args: ["x", "-y", "mcp-fetch-server"],
|
|
81
80
|
},
|
|
82
81
|
{
|
|
83
82
|
id: "tavily",
|
|
84
|
-
label: "Tavily Web Search",
|
|
83
|
+
label: "Tavily Web Search [MCP legacy]",
|
|
85
84
|
enabled: false,
|
|
86
85
|
transport: "stdio",
|
|
87
|
-
command: "
|
|
88
|
-
args: ["-y", "tavily-mcp"],
|
|
86
|
+
command: "bun",
|
|
87
|
+
args: ["x", "-y", "tavily-mcp"],
|
|
89
88
|
env: { TAVILY_API_KEY: "" },
|
|
90
89
|
},
|
|
91
90
|
];
|
|
@@ -108,10 +107,36 @@ function migrateServers(servers) {
|
|
|
108
107
|
}
|
|
109
108
|
return changed;
|
|
110
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Migrate any legacy "npx" stdio entries (from older default seeds or manual config)
|
|
112
|
+
* to "bun x" form. npx shims frequently produce immediate "Connection closed"
|
|
113
|
+
* under Bun on Windows; bun x gives clean stdio pipes. Idempotent.
|
|
114
|
+
*/
|
|
115
|
+
function migrateNpxToBunx(servers) {
|
|
116
|
+
let changed = false;
|
|
117
|
+
for (const server of servers) {
|
|
118
|
+
if (server.transport === "stdio" && server.command === "npx") {
|
|
119
|
+
server.command = "bun";
|
|
120
|
+
const rest = (server.args ?? []).filter((a) => a !== "-y");
|
|
121
|
+
server.args = ["x", "-y", ...rest];
|
|
122
|
+
changed = true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (changed) {
|
|
126
|
+
console.error("[mcp:auto-setup] migrated legacy npx-based MCP servers to bun x (fixes Connection closed on Bun/Windows)");
|
|
127
|
+
}
|
|
128
|
+
return changed;
|
|
129
|
+
}
|
|
111
130
|
export function ensureDefaultMcpServers() {
|
|
112
131
|
try {
|
|
113
132
|
const existing = loadMcpServers();
|
|
114
133
|
let dirty = migrateServers(existing);
|
|
134
|
+
// Upgrade legacy npx runners (most important fix for "Connection closed" during warm-up).
|
|
135
|
+
if (migrateNpxToBunx(existing))
|
|
136
|
+
dirty = true;
|
|
137
|
+
// Remove deprecated external MCPs (memory/playwright/figma) — replaced by native or manual opt-in.
|
|
138
|
+
if (removeDeprecatedExternalMcps(existing))
|
|
139
|
+
dirty = true;
|
|
115
140
|
// muonroi-tools is no longer self-spawned by the CLI — its capabilities
|
|
116
141
|
// (ee_query/ee_feedback/ee_health/usage_forensics/lsp_query/setup_guide/
|
|
117
142
|
// selfverify_*) are NATIVE in-process builtins now (src/tools/native-tools.ts).
|
|
@@ -237,7 +237,7 @@ export async function acquireMcpTools(servers, opts) {
|
|
|
237
237
|
* evicted by getOrConnect so a real turn retries.
|
|
238
238
|
*/
|
|
239
239
|
export async function warmMcpClients(servers, syncAndLog = false) {
|
|
240
|
-
const validServers = servers.filter(s => s.enabled && validateMcpServerConfig(s).ok);
|
|
240
|
+
const validServers = servers.filter((s) => s.enabled && validateMcpServerConfig(s).ok);
|
|
241
241
|
if (syncAndLog && validServers.length > 0) {
|
|
242
242
|
console.log(`[MCP] Warming up ${validServers.length} server(s)...`);
|
|
243
243
|
}
|
package/dist/src/mcp/ee-tools.js
CHANGED
|
@@ -140,6 +140,7 @@ export function registerEETools(server, deps = {}) {
|
|
|
140
140
|
id: clearedId,
|
|
141
141
|
verdict: result.verdict,
|
|
142
142
|
...(result.reason ? { reason: result.reason } : {}),
|
|
143
|
+
...(result.queued ? { queued: true } : {}),
|
|
143
144
|
pendingRemaining: ledger.pendingCount(),
|
|
144
145
|
});
|
|
145
146
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import http from "node:http";
|
|
2
2
|
import { URL } from "node:url";
|
|
3
|
-
const SUCCESS_HTML = `<!DOCTYPE html><html><body style="font-family:system-ui;text-align:center;padding:60px">
|
|
4
|
-
<h2>Authorization successful</h2><p>You can close this tab and return to the terminal.</p>
|
|
3
|
+
const SUCCESS_HTML = `<!DOCTYPE html><html><body style="font-family:system-ui;text-align:center;padding:60px">
|
|
4
|
+
<h2>Authorization successful</h2><p>You can close this tab and return to the terminal.</p>
|
|
5
5
|
</body></html>`;
|
|
6
6
|
export function startOAuthCallbackServer(opts) {
|
|
7
7
|
const callbackPath = opts.path ?? "/callback";
|
|
@@ -53,10 +53,10 @@ async function promptForKeyWithRetry(io) {
|
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
55
|
export async function runResearchOnboarding(io) {
|
|
56
|
-
io.log("\nWeb research
|
|
57
|
-
io.log(" -
|
|
58
|
-
io.log(" -
|
|
59
|
-
io.log(" -
|
|
56
|
+
io.log("\nWeb research tools (native builtins):\n");
|
|
57
|
+
io.log(" - fetch_url — fetch any public URL and return clean markdown/text (always available)\n");
|
|
58
|
+
io.log(" - web_search — Tavily-powered web search (free tier, needs API key)\n");
|
|
59
|
+
io.log(" - context7 / muonroi-docs — still available via MCP (library + ecosystem docs)\n");
|
|
60
60
|
io.log("\nTip: if you keep keys in Bitwarden, run `muonroi-cli mcp import-bw tavily` instead.\n\n");
|
|
61
61
|
const yn = (await io.askYesNo("Enable Tavily web search now? [Y/n]: ")).trim().toLowerCase();
|
|
62
62
|
let tavilyEnabled = false;
|
|
@@ -85,9 +85,10 @@ export async function runResearchMigrationPrompt(io) {
|
|
|
85
85
|
if (settings.webResearchPrompted === true) {
|
|
86
86
|
return { shown: false, tavilyEnabled: false };
|
|
87
87
|
}
|
|
88
|
-
io.log("\nNew: web research
|
|
89
|
-
io.log(" -
|
|
90
|
-
io.log(" - Tavily
|
|
88
|
+
io.log("\nNew: web research tools are available natively.\n");
|
|
89
|
+
io.log(" - fetch_url (URL → markdown) is always available.\n");
|
|
90
|
+
io.log(" - web_search (Tavily) needs a free API key (tavily.com).\n");
|
|
91
|
+
io.log(" - context7 + muonroi-docs remain as optional MCP for specialized docs.\n\n");
|
|
91
92
|
const choice = (await io.askChoice("Set up Tavily now? [Y/n/never]: ")).trim().toLowerCase();
|
|
92
93
|
let tavilyEnabled = false;
|
|
93
94
|
if (choice === "y" || choice === "yes" || choice === "") {
|
package/dist/src/mcp/runtime.js
CHANGED
|
@@ -65,11 +65,34 @@ function stripMcpInputSchema(tool) {
|
|
|
65
65
|
inputSchema: jsonSchema(LAZY_MCP_INPUT_SCHEMA),
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
|
+
function getMcpStdioRunner() {
|
|
69
|
+
// Prefer Bun's runner because:
|
|
70
|
+
// - The CLI is launched via `bun run`
|
|
71
|
+
// - npx .cmd shims have been observed to cause immediate "Connection closed"
|
|
72
|
+
// (MCPClientError) for StdioClientTransport on Windows + Bun (see probe results).
|
|
73
|
+
// - bun x resolves + spawns package bins with clean stdio pipes.
|
|
74
|
+
return { command: "bun", prefixArgs: ["x", "-y"] };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Upgrade legacy "npx" (or npm exec) invocations recorded in user settings
|
|
78
|
+
* to the bun-based runner. This heals persisted configs from before the fix
|
|
79
|
+
* without requiring the user to re-run setup.
|
|
80
|
+
*/
|
|
81
|
+
function normalizeStdioCommand(command, args) {
|
|
82
|
+
const a = args ?? [];
|
|
83
|
+
if (command === "npx" || (command === "npm" && a[0] === "exec")) {
|
|
84
|
+
const r = getMcpStdioRunner();
|
|
85
|
+
const pkgArgs = a.filter((x) => x !== "-y");
|
|
86
|
+
return { command: r.command, args: [...r.prefixArgs, ...pkgArgs] };
|
|
87
|
+
}
|
|
88
|
+
return { command, args: a };
|
|
89
|
+
}
|
|
68
90
|
function toTransport(server, authProvider) {
|
|
69
91
|
if (server.transport === "stdio") {
|
|
92
|
+
const { command, args } = normalizeStdioCommand(server.command ?? "", server.args);
|
|
70
93
|
return new StdioClientTransport({
|
|
71
|
-
command
|
|
72
|
-
args
|
|
94
|
+
command,
|
|
95
|
+
args,
|
|
73
96
|
env: server.env ? { ...getDefaultEnvironment(), ...server.env } : undefined,
|
|
74
97
|
cwd: server.cwd,
|
|
75
98
|
stderr: "pipe",
|
|
@@ -111,6 +134,15 @@ export async function connectOneServer(rawServer, opts) {
|
|
|
111
134
|
// Hydrate env vars from the OS keychain before spawning — e.g. inject
|
|
112
135
|
// TAVILY_API_KEY for the tavily MCP if stored via the research-onboarding wizard.
|
|
113
136
|
const server = await hydrateServerEnv(rawServer);
|
|
137
|
+
// Fast-fail for servers that require keys but have none. Prevents "Connection closed"
|
|
138
|
+
// with zero actionable info. The server binary may start and list tools, but first
|
|
139
|
+
// use would fail — better to give clear guidance at warmup time.
|
|
140
|
+
if (server.id === "tavily") {
|
|
141
|
+
const key = server.env?.TAVILY_API_KEY;
|
|
142
|
+
if (!key || key.length < 16) {
|
|
143
|
+
throw new Error("Tavily is enabled but TAVILY_API_KEY is missing. Run `muonroi-cli mcp setup-research` or `muonroi-cli mcp key tavily`, or disable the server in /mcp config.");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
114
146
|
let authProvider;
|
|
115
147
|
let cleanup;
|
|
116
148
|
if (server.transport !== "stdio" && opts?.onOAuthRequired) {
|
|
@@ -6,4 +6,4 @@
|
|
|
6
6
|
* and the muonroi-tools MCP server (src/mcp/tools-server.ts, for external agents).
|
|
7
7
|
* Keeping it here avoids duplicating ~70 lines across the two.
|
|
8
8
|
*/
|
|
9
|
-
export declare const SETUP_GUIDE_TEXT = "# muonroi-cli Setup Guide\n\n## Install (
|
|
9
|
+
export declare const SETUP_GUIDE_TEXT = "# muonroi-cli Setup Guide\n\n## Install (Recommended \u2014 NPM/Bun global install)\nNPM (requires Node >= 20):\n npm install -g muonroi-cli\n\nBun (requires Bun >= 1.3):\n bun add -g muonroi-cli\n\n## Install (Alternative \u2014 Prebuilt standalone binary, requires repo access)\nLinux / macOS:\n curl -fsSL https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.sh | bash\n\nWindows PowerShell:\n irm https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.ps1 | iex\n\nThe installers fetch a pre-compiled single binary from GitHub Releases.\n\n## First run\n- Wizard appears automatically.\n- Lists supported providers (DeepSeek + SiliconFlow ready; others via BYOK).\n- Four credential options: paste key, Bitwarden sync (B in /providers), keys export/import (encrypted bundle), or skip for later.\n- Keys land in OS keychain (keytar). Settings written to ~/.muonroi-cli/user-settings.json.\n- Role routing (leader/implement/verify/research) is configured for you.\n\nAfter setup: run `muonroi-cli doctor` to validate.\n\n## Essential commands\n- Interactive TUI: `muonroi-cli` (or `node dist/index.js` after build)\n- Headless one-shot: `muonroi-cli --prompt \"your task\" --max-tool-rounds 8`\n- Health + MCP nudge: `muonroi-cli doctor`\n- Update: `muonroi-cli update` (or set \"autoUpdate\": true in user-settings)\n- Keys move between machines: `muonroi-cli keys export file.json` then import on target\n- Native tools MCP (for external agents): `muonroi-cli tools-mcp` (stdio)\n- Harness driver MCP: `muonroi-cli mcp-driver`\n\n## MCP integration (for Claude Desktop, Cursor, other agents)\nAdd to your MCP client config:\n\n{\n \"mcpServers\": {\n \"muonroi-tools\": {\n \"command\": \"bun\",\n \"args\": [\"run\", \"/absolute/path/to/muonroi-cli/src/index.ts\", \"tools-mcp\"]\n }\n }\n}\n\n(Use absolute path. After `bun run build`: \"node\", \"dist/index.js\", \"tools-mcp\")\n\nThe CLI's OWN inner agent exposes these as NATIVE in-process tools (no MCP self-spawn):\n- setup_guide (this document)\n- ee_query / ee_health / ee_feedback \u2014 Experience Engine semantic recall + compaction checkpoints + feedback for learning\n- usage_forensics <id-prefix> \u2014 per-session cost/token forensics (peak input, cache hits, anomalies)\n- lsp_query \u2014 goToDefinition, findReferences, hover, symbols, call hierarchy etc.\n- selfverify_* \u2014 Tier-1 heuristic + Tier-2 agentic self-QA harness runs (start/poll/result/cancel/list)\n\nFor BB/.NET template recipes and package docs, also connect an external \"muonroi-docs\" MCP server if available (provides docs_search + setup_guide for the templates).\n\n## Development\ngit clone https://github.com/muonroi/muonroi-cli.git\ncd muonroi-cli && bun install\n\nbun run dev # run from source (TUI)\nbun run typecheck # tsc --noEmit\nbun run test # vitest (unit + headless)\nbunx vitest -c vitest.harness.config.ts run tests/harness/ # TUI E2E (named-pipes on Win, fd3/4 on POSIX)\nbun run build # or build:binary for standalone exe\n\nSee AGENTS.md (quick ref + rules), CLAUDE.md (harness verification), README.md.\n\n## Verify\nmuonroi-cli doctor\n# Checks runtimes, catalog load, keychain, MCP servers enabled, council research MCP nudge, EE reachability, recent error rate.\n# Any \"warn\" entries tell you exactly what to enable (e.g. tavily for web research in council).\n\nFor BB-aware scaffolding (/ideal on a muonroi-building-block target): ensure dotnet SDK + the three Muonroi.*.Template packages are installed via NuGet; doctor surfaces missing feed/template cases.\n";
|
|
@@ -6,81 +6,82 @@
|
|
|
6
6
|
* and the muonroi-tools MCP server (src/mcp/tools-server.ts, for external agents).
|
|
7
7
|
* Keeping it here avoids duplicating ~70 lines across the two.
|
|
8
8
|
*/
|
|
9
|
-
export const SETUP_GUIDE_TEXT = `# muonroi-cli Setup Guide
|
|
10
|
-
|
|
11
|
-
## Install (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
bun run
|
|
73
|
-
bun run
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
|
|
9
|
+
export const SETUP_GUIDE_TEXT = `# muonroi-cli Setup Guide
|
|
10
|
+
|
|
11
|
+
## Install (Recommended — NPM/Bun global install)
|
|
12
|
+
NPM (requires Node >= 20):
|
|
13
|
+
npm install -g muonroi-cli
|
|
14
|
+
|
|
15
|
+
Bun (requires Bun >= 1.3):
|
|
16
|
+
bun add -g muonroi-cli
|
|
17
|
+
|
|
18
|
+
## Install (Alternative — Prebuilt standalone binary, requires repo access)
|
|
19
|
+
Linux / macOS:
|
|
20
|
+
curl -fsSL https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.sh | bash
|
|
21
|
+
|
|
22
|
+
Windows PowerShell:
|
|
23
|
+
irm https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.ps1 | iex
|
|
24
|
+
|
|
25
|
+
The installers fetch a pre-compiled single binary from GitHub Releases.
|
|
26
|
+
|
|
27
|
+
## First run
|
|
28
|
+
- Wizard appears automatically.
|
|
29
|
+
- Lists supported providers (DeepSeek + SiliconFlow ready; others via BYOK).
|
|
30
|
+
- Four credential options: paste key, Bitwarden sync (B in /providers), keys export/import (encrypted bundle), or skip for later.
|
|
31
|
+
- Keys land in OS keychain (keytar). Settings written to ~/.muonroi-cli/user-settings.json.
|
|
32
|
+
- Role routing (leader/implement/verify/research) is configured for you.
|
|
33
|
+
|
|
34
|
+
After setup: run \`muonroi-cli doctor\` to validate.
|
|
35
|
+
|
|
36
|
+
## Essential commands
|
|
37
|
+
- Interactive TUI: \`muonroi-cli\` (or \`node dist/index.js\` after build)
|
|
38
|
+
- Headless one-shot: \`muonroi-cli --prompt "your task" --max-tool-rounds 8\`
|
|
39
|
+
- Health + MCP nudge: \`muonroi-cli doctor\`
|
|
40
|
+
- Update: \`muonroi-cli update\` (or set "autoUpdate": true in user-settings)
|
|
41
|
+
- Keys move between machines: \`muonroi-cli keys export file.json\` then import on target
|
|
42
|
+
- Native tools MCP (for external agents): \`muonroi-cli tools-mcp\` (stdio)
|
|
43
|
+
- Harness driver MCP: \`muonroi-cli mcp-driver\`
|
|
44
|
+
|
|
45
|
+
## MCP integration (for Claude Desktop, Cursor, other agents)
|
|
46
|
+
Add to your MCP client config:
|
|
47
|
+
|
|
48
|
+
{
|
|
49
|
+
"mcpServers": {
|
|
50
|
+
"muonroi-tools": {
|
|
51
|
+
"command": "bun",
|
|
52
|
+
"args": ["run", "/absolute/path/to/muonroi-cli/src/index.ts", "tools-mcp"]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
(Use absolute path. After \`bun run build\`: "node", "dist/index.js", "tools-mcp")
|
|
58
|
+
|
|
59
|
+
The CLI's OWN inner agent exposes these as NATIVE in-process tools (no MCP self-spawn):
|
|
60
|
+
- setup_guide (this document)
|
|
61
|
+
- ee_query / ee_health / ee_feedback — Experience Engine semantic recall + compaction checkpoints + feedback for learning
|
|
62
|
+
- usage_forensics <id-prefix> — per-session cost/token forensics (peak input, cache hits, anomalies)
|
|
63
|
+
- lsp_query — goToDefinition, findReferences, hover, symbols, call hierarchy etc.
|
|
64
|
+
- selfverify_* — Tier-1 heuristic + Tier-2 agentic self-QA harness runs (start/poll/result/cancel/list)
|
|
65
|
+
|
|
66
|
+
For BB/.NET template recipes and package docs, also connect an external "muonroi-docs" MCP server if available (provides docs_search + setup_guide for the templates).
|
|
67
|
+
|
|
68
|
+
## Development
|
|
69
|
+
git clone https://github.com/muonroi/muonroi-cli.git
|
|
70
|
+
cd muonroi-cli && bun install
|
|
71
|
+
|
|
72
|
+
bun run dev # run from source (TUI)
|
|
73
|
+
bun run typecheck # tsc --noEmit
|
|
74
|
+
bun run test # vitest (unit + headless)
|
|
75
|
+
bunx vitest -c vitest.harness.config.ts run tests/harness/ # TUI E2E (named-pipes on Win, fd3/4 on POSIX)
|
|
76
|
+
bun run build # or build:binary for standalone exe
|
|
77
|
+
|
|
78
|
+
See AGENTS.md (quick ref + rules), CLAUDE.md (harness verification), README.md.
|
|
79
|
+
|
|
80
|
+
## Verify
|
|
81
|
+
muonroi-cli doctor
|
|
82
|
+
# Checks runtimes, catalog load, keychain, MCP servers enabled, council research MCP nudge, EE reachability, recent error rate.
|
|
83
|
+
# Any "warn" entries tell you exactly what to enable (e.g. tavily for web research in council).
|
|
84
|
+
|
|
85
|
+
For BB-aware scaffolding (/ideal on a muonroi-building-block target): ensure dotnet SDK + the three Muonroi.*.Template packages are installed via NuGet; doctor surfaces missing feed/template cases.
|
|
85
86
|
`;
|
|
86
87
|
//# sourceMappingURL=setup-guide-text.js.map
|