muonroi-cli 1.8.4 → 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 +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-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 +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 +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 +234 -64
- 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/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -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/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 +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-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 +22 -0
- package/dist/src/orchestrator/tool-engine.js +620 -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/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/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 +310 -99
- 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/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 +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 +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/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 +3 -3
- 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 +284 -13
- 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.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/install-manager.js +2 -1
- 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/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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as os from "os";
|
|
3
3
|
import * as path from "path";
|
|
4
|
-
import { getEffectiveReasoningEffort, getFirstCatalogModel, getFirstCatalogProvider, getModelByTier, getModelIds, getModelInfo, MODELS, normalizeModelId, } from "../models/registry.js";
|
|
4
|
+
import { getCatalogCouncilRouting, getEffectiveReasoningEffort, getFirstCatalogModel, getFirstCatalogProvider, getModelByTier, getModelIds, getModelInfo, MODELS, normalizeModelId, } from "../models/registry.js";
|
|
5
5
|
import { apiBaseFor, PROVIDER_ENDPOINTS } from "../providers/endpoints.js";
|
|
6
6
|
import { ALL_PROVIDER_IDS } from "../providers/types.js";
|
|
7
7
|
import { logger } from "./logger.js";
|
|
@@ -72,8 +72,9 @@ export function parseSubAgentsRawList(raw) {
|
|
|
72
72
|
export function loadValidSubAgents() {
|
|
73
73
|
return parseSubAgentsRawList(loadUserSettings().subAgents);
|
|
74
74
|
}
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
function getUserSettingsPath() {
|
|
76
|
+
return path.join(os.homedir(), ".muonroi-cli", "user-settings.json");
|
|
77
|
+
}
|
|
77
78
|
function ensureDir(dir) {
|
|
78
79
|
if (!fs.existsSync(dir)) {
|
|
79
80
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
@@ -179,7 +180,7 @@ export function ensureFootprintGitignored(cwd = process.cwd()) {
|
|
|
179
180
|
}
|
|
180
181
|
}
|
|
181
182
|
export function loadUserSettings() {
|
|
182
|
-
return readJson(
|
|
183
|
+
return readJson(getUserSettingsPath()) || {};
|
|
183
184
|
}
|
|
184
185
|
export function saveUserSettings(partial) {
|
|
185
186
|
const current = loadUserSettings();
|
|
@@ -248,7 +249,7 @@ export function saveUserSettings(partial) {
|
|
|
248
249
|
}
|
|
249
250
|
: {}),
|
|
250
251
|
};
|
|
251
|
-
writeJson(
|
|
252
|
+
writeJson(getUserSettingsPath(), next);
|
|
252
253
|
}
|
|
253
254
|
export function loadProjectSettings() {
|
|
254
255
|
const projectPath = path.join(process.cwd(), ".muonroi-cli", "settings.json");
|
|
@@ -310,11 +311,6 @@ export function getProviderConfigs(mainApiKey) {
|
|
|
310
311
|
if (openaiKey) {
|
|
311
312
|
configs.openai = { apiKey: openaiKey, baseURL: p.openai?.baseURL };
|
|
312
313
|
}
|
|
313
|
-
// Google Gemini
|
|
314
|
-
const googleKey = process.env.GOOGLE_API_KEY ?? p.google?.apiKey;
|
|
315
|
-
if (googleKey) {
|
|
316
|
-
configs.google = { apiKey: googleKey, baseURL: p.google?.baseURL };
|
|
317
|
-
}
|
|
318
314
|
// DeepSeek
|
|
319
315
|
const deepseekKey = process.env.DEEPSEEK_API_KEY ?? p.deepseek?.apiKey;
|
|
320
316
|
if (deepseekKey) {
|
|
@@ -323,14 +319,6 @@ export function getProviderConfigs(mainApiKey) {
|
|
|
323
319
|
baseURL: p.deepseek?.baseURL ?? apiBaseFor("deepseek"),
|
|
324
320
|
};
|
|
325
321
|
}
|
|
326
|
-
// SiliconFlow
|
|
327
|
-
const siliconflowKey = process.env.SILICONFLOW_API_KEY ?? p.siliconflow?.apiKey;
|
|
328
|
-
if (siliconflowKey) {
|
|
329
|
-
configs.siliconflow = {
|
|
330
|
-
apiKey: siliconflowKey,
|
|
331
|
-
baseURL: p.siliconflow?.baseURL ?? apiBaseFor("siliconflow"),
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
322
|
// xAI / Grok (OpenAI-compatible)
|
|
335
323
|
const xaiKey = process.env.XAI_API_KEY ?? p.xai?.apiKey;
|
|
336
324
|
if (xaiKey) {
|
|
@@ -339,6 +327,22 @@ export function getProviderConfigs(mainApiKey) {
|
|
|
339
327
|
baseURL: p.xai?.baseURL ?? apiBaseFor("xai"),
|
|
340
328
|
};
|
|
341
329
|
}
|
|
330
|
+
// Z.ai (OpenAI-compatible)
|
|
331
|
+
const zaiKey = process.env.ZAI_API_KEY ?? p.zai?.apiKey;
|
|
332
|
+
if (zaiKey) {
|
|
333
|
+
configs.zai = {
|
|
334
|
+
apiKey: zaiKey,
|
|
335
|
+
baseURL: p.zai?.baseURL ?? apiBaseFor("zai"),
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
// OpenCode Go (OpenAI-compatible)
|
|
339
|
+
const opencodeGoKey = process.env.OPENCODE_GO_API_KEY ?? p["opencode-go"]?.apiKey;
|
|
340
|
+
if (opencodeGoKey) {
|
|
341
|
+
configs["opencode-go"] = {
|
|
342
|
+
apiKey: opencodeGoKey,
|
|
343
|
+
baseURL: p["opencode-go"]?.baseURL ?? apiBaseFor("opencode-go"),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
342
346
|
// Ollama — no key needed, just baseURL
|
|
343
347
|
const ollamaURL = process.env.OLLAMA_URL ?? p.ollama?.baseURL ?? "http://localhost:11434";
|
|
344
348
|
configs.ollama = { baseURL: ollamaURL };
|
|
@@ -591,6 +595,12 @@ export function getAutoCompactThresholdPct() {
|
|
|
591
595
|
return val;
|
|
592
596
|
return 0.4; // default 40% — Reduced from 25% after session bf58d0f46b51 analysis: 13 compacts in 43min generated 1.3M uncached tokens. Higher threshold = fewer compacts = less compaction overhead. For DeepSeek 128K context: fires at 51K instead of 32K.
|
|
593
597
|
}
|
|
598
|
+
export function getAutoCompactMinNewTokens() {
|
|
599
|
+
const val = loadUserSettings().autoCompactMinNewTokens;
|
|
600
|
+
if (typeof val === "number" && val >= 0 && val <= 200_000)
|
|
601
|
+
return val;
|
|
602
|
+
return 20_000; // Observed thrash: re-compact after ~14K new tokens (session ff932f8568e8).
|
|
603
|
+
}
|
|
594
604
|
/**
|
|
595
605
|
* Per-invocation cap on cumulative tool-output chars inside a `task`
|
|
596
606
|
* sub-agent. See orchestrator/sub-agent-cap.ts for the tiered compression
|
|
@@ -627,6 +637,31 @@ export function getProviderStallTimeoutMs() {
|
|
|
627
637
|
}
|
|
628
638
|
return 120_000;
|
|
629
639
|
}
|
|
640
|
+
/**
|
|
641
|
+
* No-forward-progress watchdog timeout (ms) for streaming model calls. Distinct
|
|
642
|
+
* from the stall watchdog: the stall watchdog re-arms on ANY stream chunk —
|
|
643
|
+
* including a reasoning model's `reasoning-delta` chunks — so a model stuck in an
|
|
644
|
+
* endless chain-of-thought keeps petting it and it NEVER fires (observed live
|
|
645
|
+
* 2026-07-10: a deepseek-v4-flash sub-agent churned reasoning for 30+ min, 1.4M
|
|
646
|
+
* input tokens, ZERO text/tool output, and the 2-min stall watchdog never tripped
|
|
647
|
+
* because reasoning chunks kept arriving). This second watchdog is petted ONLY on
|
|
648
|
+
* REAL forward progress (a text-delta or a tool-call), so a runaway-reasoning /
|
|
649
|
+
* no-output loop is aborted while a legitimately long reasoning burst that DOES
|
|
650
|
+
* eventually emit text/tools survives. Set generously above a normal reasoning
|
|
651
|
+
* burst. Range 30_000–1_800_000; 0 disables. Default 300_000 (5 min). Env
|
|
652
|
+
* override: MUONROI_PROVIDER_PROGRESS_TIMEOUT_MS.
|
|
653
|
+
*/
|
|
654
|
+
export function getProviderProgressTimeoutMs() {
|
|
655
|
+
const envRaw = process.env.MUONROI_PROVIDER_PROGRESS_TIMEOUT_MS;
|
|
656
|
+
if (envRaw !== undefined && envRaw !== "") {
|
|
657
|
+
const n = Number(envRaw);
|
|
658
|
+
if (Number.isFinite(n) && n === 0)
|
|
659
|
+
return 0; // explicit disable
|
|
660
|
+
if (Number.isFinite(n) && n >= 30_000 && n <= 1_800_000)
|
|
661
|
+
return Math.floor(n);
|
|
662
|
+
}
|
|
663
|
+
return 300_000;
|
|
664
|
+
}
|
|
630
665
|
/**
|
|
631
666
|
* Number of times to AUTOMATICALLY re-issue a streaming model call after the
|
|
632
667
|
* stall watchdog fires WITHOUT any chunk having arrived (a time-to-first-byte
|
|
@@ -702,17 +737,50 @@ export function getSubAgentCompactKeepLast() {
|
|
|
702
737
|
* top-level loops typically carry more useful early context.
|
|
703
738
|
* Env override: MUONROI_TOP_LEVEL_COMPACT_THRESHOLD_CHARS.
|
|
704
739
|
*/
|
|
705
|
-
export function getTopLevelCompactThresholdChars() {
|
|
740
|
+
export function getTopLevelCompactThresholdChars(contextWindowTokens) {
|
|
706
741
|
const envRaw = process.env.MUONROI_TOP_LEVEL_COMPACT_THRESHOLD_CHARS;
|
|
707
742
|
if (envRaw) {
|
|
708
743
|
const n = Number(envRaw);
|
|
709
|
-
if (Number.isFinite(n) && n >=
|
|
744
|
+
if (Number.isFinite(n) && n >= 10_000 && n <= 1_500_000)
|
|
710
745
|
return Math.floor(n);
|
|
711
746
|
}
|
|
712
|
-
//
|
|
713
|
-
//
|
|
714
|
-
//
|
|
715
|
-
|
|
747
|
+
// For small-context models (e.g. DeepSeek 64K), scale threshold proportionally
|
|
748
|
+
// to prevent linear token growth during tool loops. A model with 64K context
|
|
749
|
+
// gets threshold = 64000 * 4 * 0.35 = 89,600 chars (~22K tokens = 35% of window).
|
|
750
|
+
// Large-context models (128K+) keep the original 200K default.
|
|
751
|
+
if (contextWindowTokens && contextWindowTokens > 0) {
|
|
752
|
+
const dynamicThreshold = Math.floor(contextWindowTokens * 4 * 0.35);
|
|
753
|
+
return Math.min(200_000, dynamicThreshold);
|
|
754
|
+
}
|
|
755
|
+
return 200_000;
|
|
756
|
+
}
|
|
757
|
+
/**
|
|
758
|
+
* Compaction hysteresis factor for the top-level loop. Once B4 compaction has
|
|
759
|
+
* fired within a turn, the compacted prefix is FROZEN and only new messages are
|
|
760
|
+
* appended (keeping the provider prompt-cache prefix byte-stable) until the
|
|
761
|
+
* cumulative size grows past `lastTriggerChars * factor` — then it re-compacts.
|
|
762
|
+
*
|
|
763
|
+
* Why: measured on session 1afb2728e67a — a 24-step turn re-ran compaction every
|
|
764
|
+
* step, and each step's sliding keepLast boundary flipped one more tool result
|
|
765
|
+
* verbatim→stub, breaking the cache prefix at that position. 63% of that
|
|
766
|
+
* session's FRESH input came from 5 such compaction-induced cache breaks.
|
|
767
|
+
* Holding the boundary between compactions trades a higher peak input for far
|
|
768
|
+
* fewer cache-break re-bills.
|
|
769
|
+
*
|
|
770
|
+
* Range 1.0–3.0. Default 1.15 (re-compact at +15% growth). `1.0` or env `0`
|
|
771
|
+
* disables hysteresis → legacy per-step compaction.
|
|
772
|
+
* Env override: MUONROI_COMPACT_HYSTERESIS.
|
|
773
|
+
*/
|
|
774
|
+
export function getTopLevelCompactHysteresis() {
|
|
775
|
+
const envRaw = process.env.MUONROI_COMPACT_HYSTERESIS;
|
|
776
|
+
if (envRaw !== undefined && envRaw.trim() !== "") {
|
|
777
|
+
const n = Number(envRaw);
|
|
778
|
+
if (Number.isFinite(n) && n === 0)
|
|
779
|
+
return 1.0; // explicit disable
|
|
780
|
+
if (Number.isFinite(n) && n >= 1.0 && n <= 3.0)
|
|
781
|
+
return n;
|
|
782
|
+
}
|
|
783
|
+
return 1.15;
|
|
716
784
|
}
|
|
717
785
|
/**
|
|
718
786
|
* Phase B4 — number of trailing tool turns kept verbatim during top-level
|
|
@@ -720,22 +788,59 @@ export function getTopLevelCompactThresholdChars() {
|
|
|
720
788
|
* decisions across longer horizons.
|
|
721
789
|
* Env override: MUONROI_TOP_LEVEL_COMPACT_KEEP_LAST.
|
|
722
790
|
*/
|
|
723
|
-
export function getTopLevelCompactKeepLast() {
|
|
791
|
+
export function getTopLevelCompactKeepLast(contextWindowTokens) {
|
|
724
792
|
const envRaw = process.env.MUONROI_TOP_LEVEL_COMPACT_KEEP_LAST;
|
|
725
793
|
if (envRaw) {
|
|
726
794
|
const n = Number(envRaw);
|
|
727
795
|
if (Number.isFinite(n) && n >= 1 && n <= 30)
|
|
728
796
|
return Math.floor(n);
|
|
729
797
|
}
|
|
798
|
+
// Small-context models (< 100K tokens) benefit from keeping fewer trailing
|
|
799
|
+
// turns — each verbatim turn with tool results + reasoning tokens costs
|
|
800
|
+
// 5-15K tokens. Reduce from 5 to 3 for small windows.
|
|
801
|
+
if (contextWindowTokens && contextWindowTokens < 100_000) {
|
|
802
|
+
return 3;
|
|
803
|
+
}
|
|
730
804
|
return 5;
|
|
731
805
|
}
|
|
806
|
+
/**
|
|
807
|
+
* O2 — byte budget for the verbatim tail (last keepLast turns) in top-level B4
|
|
808
|
+
* compaction. The keepLast shrink is otherwise fill-ratio based, so on a
|
|
809
|
+
* large-context model a read-heavy tail stays verbatim at ~50% fill, pinning
|
|
810
|
+
* each tool round at 60-80K input (measured on July-8 sessions). This caps the
|
|
811
|
+
* tail's actual chars, shrinking keepLast further (floor 2) when the kept tool
|
|
812
|
+
* results are large. 0 disables. Env: MUONROI_TOP_LEVEL_COMPACT_TAIL_BUDGET_CHARS.
|
|
813
|
+
*/
|
|
814
|
+
export function getTopLevelCompactTailBudgetChars(contextWindowTokens) {
|
|
815
|
+
const envRaw = process.env.MUONROI_TOP_LEVEL_COMPACT_TAIL_BUDGET_CHARS;
|
|
816
|
+
if (envRaw !== undefined && envRaw.trim() !== "") {
|
|
817
|
+
const n = Number(envRaw);
|
|
818
|
+
// 0 = explicit disable; otherwise clamp to a sane floor so a fat-fingered
|
|
819
|
+
// tiny value can't stub away all recent context.
|
|
820
|
+
if (Number.isFinite(n) && n === 0)
|
|
821
|
+
return 0;
|
|
822
|
+
if (Number.isFinite(n) && n >= 20_000 && n <= 1_000_000)
|
|
823
|
+
return Math.floor(n);
|
|
824
|
+
}
|
|
825
|
+
// Default 50K chars (~12.5K tokens). Chosen from a deterministic measurement:
|
|
826
|
+
// on a realistic read-heavy turn the keepLast=5 verbatim tail is ~70-100K
|
|
827
|
+
// chars, so a looser budget (e.g. 120K) never bites (no-op). 50K shrinks the
|
|
828
|
+
// effective tail to ~3 turns on heavy turns (matching the sub-agent keepLast
|
|
829
|
+
// default) — ~7K tokens/call saved — while high-value results stay verbatim
|
|
830
|
+
// and light turns (below the 200K compaction threshold) are untouched. For
|
|
831
|
+
// small windows, scale to ~20% of the window so the tail can't dominate.
|
|
832
|
+
if (contextWindowTokens && contextWindowTokens > 0) {
|
|
833
|
+
return Math.min(50_000, Math.floor(contextWindowTokens * 4 * 0.2));
|
|
834
|
+
}
|
|
835
|
+
return 50_000;
|
|
836
|
+
}
|
|
732
837
|
/**
|
|
733
838
|
* Per-turn cap on cumulative tool-output chars inside the top-level
|
|
734
839
|
* orchestrator agentic loop. Same tiered compression as the sub-agent cap,
|
|
735
840
|
* higher default so single-tool turns are unaffected. Env override:
|
|
736
841
|
* MUONROI_TOP_LEVEL_TOOL_BUDGET_CHARS.
|
|
737
842
|
*/
|
|
738
|
-
export function getTopLevelToolBudgetChars(maxRounds) {
|
|
843
|
+
export function getTopLevelToolBudgetChars(maxRounds, contextWindowTokens) {
|
|
739
844
|
const envRaw = process.env.MUONROI_TOP_LEVEL_TOOL_BUDGET_CHARS;
|
|
740
845
|
if (envRaw) {
|
|
741
846
|
const n = Number(envRaw);
|
|
@@ -748,10 +853,35 @@ export function getTopLevelToolBudgetChars(maxRounds) {
|
|
|
748
853
|
// Dynamically scale default based on maxRounds relative to default base (40)
|
|
749
854
|
const baseRounds = 40;
|
|
750
855
|
const scale = maxRounds && maxRounds > baseRounds ? maxRounds / baseRounds : 1;
|
|
751
|
-
|
|
856
|
+
const baseDefault = Math.floor(400_000 * scale);
|
|
857
|
+
// For small-context models (e.g. DeepSeek 64K), scale the budget to 60% of
|
|
858
|
+
// the context window in chars so tiered compression kicks in before the
|
|
859
|
+
// cumulative tool output exceeds what the model can hold in context.
|
|
860
|
+
if (contextWindowTokens && contextWindowTokens > 0 && contextWindowTokens < 200_000) {
|
|
861
|
+
const windowBudget = Math.floor(contextWindowTokens * 4 * 0.6);
|
|
862
|
+
return Math.min(baseDefault, Math.max(50_000, windowBudget));
|
|
863
|
+
}
|
|
864
|
+
return baseDefault;
|
|
752
865
|
}
|
|
753
866
|
export function getRoleModel(role) {
|
|
754
|
-
|
|
867
|
+
const configured = loadUserSettings().roleModels?.[role];
|
|
868
|
+
if (!configured)
|
|
869
|
+
return undefined;
|
|
870
|
+
// Graceful staleness guard (mirrors getCurrentModel's pickValid): a role model
|
|
871
|
+
// persisted before a catalog rename/drop (e.g. "grok-build-0.1" after it was
|
|
872
|
+
// dropped in favor of grok-composer-2.5-fast) must NOT leak a dead id to the
|
|
873
|
+
// runtime, where resolveModelRuntime throws "not found in catalog — cannot
|
|
874
|
+
// determine provider" and takes down the whole council speaker (observed:
|
|
875
|
+
// Experience Auditor on the research role). If the catalog hasn't loaded yet,
|
|
876
|
+
// trust the normalized id; otherwise drop unresolved ids so the caller falls
|
|
877
|
+
// back to its own default instead of crashing.
|
|
878
|
+
const normalized = normalizeModelId(configured);
|
|
879
|
+
if (MODELS.length === 0)
|
|
880
|
+
return normalized;
|
|
881
|
+
if (getModelInfo(normalized))
|
|
882
|
+
return normalized;
|
|
883
|
+
logger.warn("cli", `roleModels.${role} = "${configured}" is not in the catalog (renamed or removed); ignoring so the caller falls back to its default. Update it via /config.`);
|
|
884
|
+
return undefined;
|
|
755
885
|
}
|
|
756
886
|
export function getRoleModels() {
|
|
757
887
|
return loadUserSettings().roleModels ?? {};
|
|
@@ -778,18 +908,92 @@ export function normalizeAutoCouncilMinRoles(val) {
|
|
|
778
908
|
export function getAutoCouncilConfidence() {
|
|
779
909
|
return normalizeAutoCouncilConfidence(loadUserSettings().autoCouncilConfidence);
|
|
780
910
|
}
|
|
911
|
+
/**
|
|
912
|
+
* Whether the auto-council path runs the pre-debate clarification interview
|
|
913
|
+
* (model-designed askcards) before debating. Default true so a broadly-scoped
|
|
914
|
+
* "debate mode" request is clarified first. Env override wins over the user
|
|
915
|
+
* setting for quick dev toggling; env "0"/"false" disables, "1"/"true" enables.
|
|
916
|
+
*/
|
|
917
|
+
export function isAutoCouncilClarifyEnabled() {
|
|
918
|
+
const env = process.env.MUONROI_AUTOCOUNCIL_CLARIFY?.trim().toLowerCase();
|
|
919
|
+
if (env === "0" || env === "false")
|
|
920
|
+
return false;
|
|
921
|
+
if (env === "1" || env === "true")
|
|
922
|
+
return true;
|
|
923
|
+
return loadUserSettings().autoCouncilClarify ?? true;
|
|
924
|
+
}
|
|
925
|
+
/**
|
|
926
|
+
* Whether auto-council should be skipped when the session model is a reasoning
|
|
927
|
+
* model. Default true. Env override wins over the user setting for quick dev
|
|
928
|
+
* toggling; env "0"/"false" disables the skip (forces council), "1"/"true"
|
|
929
|
+
* enables the skip.
|
|
930
|
+
*/
|
|
931
|
+
export function isAutoCouncilSkipReasoning() {
|
|
932
|
+
const env = process.env.MUONROI_AUTOCOUNCIL_SKIP_REASONING?.trim().toLowerCase();
|
|
933
|
+
if (env === "0" || env === "false")
|
|
934
|
+
return false;
|
|
935
|
+
if (env === "1" || env === "true")
|
|
936
|
+
return true;
|
|
937
|
+
return loadUserSettings().autoCouncilSkipReasoning ?? true;
|
|
938
|
+
}
|
|
781
939
|
export function getAutoCouncilMinRoles() {
|
|
782
940
|
return normalizeAutoCouncilMinRoles(loadUserSettings().autoCouncilMinRoles);
|
|
783
941
|
}
|
|
784
942
|
export function isCouncilMultiProviderPreferred() {
|
|
785
|
-
|
|
943
|
+
const user = loadUserSettings().councilPreferMultiProvider;
|
|
944
|
+
if (user !== undefined)
|
|
945
|
+
return user;
|
|
946
|
+
return getCatalogCouncilRouting()?.prefer_multi_provider ?? true;
|
|
786
947
|
}
|
|
787
948
|
export function getCouncilExperienceMode() {
|
|
788
949
|
return loadUserSettings().councilExperienceMode ?? "advisory";
|
|
789
950
|
}
|
|
951
|
+
export function normalizePeakHourPolicy(raw) {
|
|
952
|
+
if (!raw || typeof raw !== "object") {
|
|
953
|
+
return { enabled: true, mode: "switch" };
|
|
954
|
+
}
|
|
955
|
+
const p = raw;
|
|
956
|
+
return {
|
|
957
|
+
enabled: p.enabled !== false,
|
|
958
|
+
mode: p.mode === "downgrade" ? "downgrade" : "switch",
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
export function getPeakHourPolicy() {
|
|
962
|
+
return normalizePeakHourPolicy(loadUserSettings().peakHourPolicy);
|
|
963
|
+
}
|
|
790
964
|
export function isCouncilCostAware() {
|
|
791
965
|
return loadUserSettings().councilCostAware ?? true;
|
|
792
966
|
}
|
|
967
|
+
/**
|
|
968
|
+
* Normalize a raw councilLanguage value (Feature B). Trims + lowercases the two
|
|
969
|
+
* reserved modes ("auto", "english"); any other non-empty string is preserved
|
|
970
|
+
* as-is (trimmed) so locale labels keep the user's exact casing (e.g. "日本語").
|
|
971
|
+
* Empty / non-string → "auto".
|
|
972
|
+
*/
|
|
973
|
+
export function normalizeCouncilLanguage(raw) {
|
|
974
|
+
if (typeof raw !== "string")
|
|
975
|
+
return "auto";
|
|
976
|
+
const trimmed = raw.trim();
|
|
977
|
+
if (trimmed.length === 0)
|
|
978
|
+
return "auto";
|
|
979
|
+
const lower = trimmed.toLowerCase();
|
|
980
|
+
if (lower === "auto" || lower === "english")
|
|
981
|
+
return lower;
|
|
982
|
+
return trimmed;
|
|
983
|
+
}
|
|
984
|
+
export function getCouncilLanguage() {
|
|
985
|
+
return normalizeCouncilLanguage(loadUserSettings().councilLanguage);
|
|
986
|
+
}
|
|
987
|
+
/**
|
|
988
|
+
* Router tier-promotion ceiling. See UserSettings.routingPromoteMax.
|
|
989
|
+
* Default "balanced" — router may promote up to balanced but never silently
|
|
990
|
+
* to premium. Validated to the three allowed values; any unknown value
|
|
991
|
+
* falls back to the default.
|
|
992
|
+
*/
|
|
993
|
+
export function getRoutingPromoteMax() {
|
|
994
|
+
const raw = loadUserSettings().routingPromoteMax;
|
|
995
|
+
return raw === "off" || raw === "balanced" || raw === "any" ? raw : "balanced";
|
|
996
|
+
}
|
|
793
997
|
export function getDisabledProviders() {
|
|
794
998
|
const raw = loadUserSettings().disabledProviders;
|
|
795
999
|
if (!Array.isArray(raw))
|
|
@@ -17,4 +17,15 @@ export interface VisibleRetryOpts {
|
|
|
17
17
|
/** Hook called before each delay; default writes to stderr. */
|
|
18
18
|
onRetry?: (attempt: number, totalAttempts: number, delayMs: number, error: Error) => void;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Optional UI sink for retry progress. The TUI registers one via
|
|
22
|
+
* {@link setRetryReporter}; without it (headless/CLI, tests) retries fall back
|
|
23
|
+
* to stderr. This exists because a raw `process.stderr.write` under OpenTUI's
|
|
24
|
+
* raw-mode alt-screen paints over wherever the cursor sits — the retry line was
|
|
25
|
+
* bleeding into the composer input frame (user-reported). Routing through a
|
|
26
|
+
* toast keeps it in the proper surface.
|
|
27
|
+
*/
|
|
28
|
+
type RetryReporter = (message: string, level: "warn" | "info") => void;
|
|
29
|
+
export declare function setRetryReporter(fn: RetryReporter | null): void;
|
|
20
30
|
export declare function withVisibleRetry<T>(fn: () => Promise<T>, opts?: VisibleRetryOpts): Promise<T>;
|
|
31
|
+
export {};
|
|
@@ -6,9 +6,18 @@ function isRetryableError(err) {
|
|
|
6
6
|
const msg = (e?.message ?? "").toLowerCase();
|
|
7
7
|
return msg.includes("rate limit") || msg.includes("too many requests") || msg.includes("timeout");
|
|
8
8
|
}
|
|
9
|
+
let retryReporter = null;
|
|
10
|
+
export function setRetryReporter(fn) {
|
|
11
|
+
retryReporter = fn;
|
|
12
|
+
}
|
|
9
13
|
function defaultOnRetry(attempt, total, delayMs, error) {
|
|
10
14
|
const reason = error.statusCode === 429 ? "rate-limited (429)" : error.message.slice(0, 80);
|
|
11
|
-
|
|
15
|
+
const message = `[retry] ${reason} — waiting ${Math.round(delayMs / 1000)}s before attempt ${attempt + 1}/${total}`;
|
|
16
|
+
if (retryReporter) {
|
|
17
|
+
retryReporter(message, "warn");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
process.stderr.write(`${message}\n`);
|
|
12
21
|
}
|
|
13
22
|
export async function withVisibleRetry(fn, opts = {}) {
|
|
14
23
|
const delays = opts.delaysMs ?? [2000, 4000, 8000, 16000, 32000];
|
|
@@ -27,4 +27,4 @@ export declare function getVerifyCliError(options: {
|
|
|
27
27
|
hasPrompt?: boolean;
|
|
28
28
|
hasMessageArgs?: boolean;
|
|
29
29
|
}): string | null;
|
|
30
|
-
export { defaultShellInit, inferVerifyProjectProfile, inferVerifySmokeUrl, normalizeVerifyRecipe, type VerifyProjectProfile, } from "./recipes.js";
|
|
30
|
+
export { defaultShellInit, inferVerifyProjectProfile, inferVerifySmokeUrl, normalizeVerifyRecipe, shouldTrustDeterministicRecipe, type VerifyProjectProfile, } from "./recipes.js";
|
|
@@ -382,5 +382,5 @@ export function getVerifyCliError(options) {
|
|
|
382
382
|
}
|
|
383
383
|
return null;
|
|
384
384
|
}
|
|
385
|
-
export { defaultShellInit, inferVerifyProjectProfile, inferVerifySmokeUrl, normalizeVerifyRecipe, } from "./recipes.js";
|
|
385
|
+
export { defaultShellInit, inferVerifyProjectProfile, inferVerifySmokeUrl, normalizeVerifyRecipe, shouldTrustDeterministicRecipe, } from "./recipes.js";
|
|
386
386
|
//# sourceMappingURL=entrypoint.js.map
|
|
@@ -20,3 +20,16 @@ export declare function normalizeVerifyAppKind(value: string): VerifyAppKind;
|
|
|
20
20
|
export declare function normalizeVerifyRecipe(value: unknown): VerifyRecipe | null;
|
|
21
21
|
export declare function inferVerifySmokeUrl(settings?: SandboxSettings): string | null;
|
|
22
22
|
export declare function inferVerifyProjectProfile(cwd: string, baseSettings?: SandboxSettings, recipeOverride?: VerifyRecipe | null): VerifyProjectProfile;
|
|
23
|
+
/**
|
|
24
|
+
* Decides whether a deterministically-inferred recipe is trustworthy enough to
|
|
25
|
+
* hand to the sprint-1 verify gate INSTEAD of a null (which trips CB-3's
|
|
26
|
+
* "Recovery options" halt). It is trusted ONLY when the profiler recognized the
|
|
27
|
+
* ecosystem (`appKind !== "unknown"`) AND found at least one real test command —
|
|
28
|
+
* i.e. there is something concrete to verify against.
|
|
29
|
+
*
|
|
30
|
+
* This is the exact boundary `Orchestrator.detectVerifyRecipe` applies to its
|
|
31
|
+
* `inferVerifyProjectProfile(cwd)` fallback. Exported so the gate seam is
|
|
32
|
+
* covered by one unit test over the REAL predicate rather than a copy that can
|
|
33
|
+
* silently drift from production.
|
|
34
|
+
*/
|
|
35
|
+
export declare function shouldTrustDeterministicRecipe(recipe: Pick<VerifyRecipe, "appKind" | "testCommands">): boolean;
|
|
@@ -525,4 +525,19 @@ export function inferVerifyProjectProfile(cwd, baseSettings = {}, recipeOverride
|
|
|
525
525
|
recipe: recipeWithRuntime,
|
|
526
526
|
};
|
|
527
527
|
}
|
|
528
|
+
/**
|
|
529
|
+
* Decides whether a deterministically-inferred recipe is trustworthy enough to
|
|
530
|
+
* hand to the sprint-1 verify gate INSTEAD of a null (which trips CB-3's
|
|
531
|
+
* "Recovery options" halt). It is trusted ONLY when the profiler recognized the
|
|
532
|
+
* ecosystem (`appKind !== "unknown"`) AND found at least one real test command —
|
|
533
|
+
* i.e. there is something concrete to verify against.
|
|
534
|
+
*
|
|
535
|
+
* This is the exact boundary `Orchestrator.detectVerifyRecipe` applies to its
|
|
536
|
+
* `inferVerifyProjectProfile(cwd)` fallback. Exported so the gate seam is
|
|
537
|
+
* covered by one unit test over the REAL predicate rather than a copy that can
|
|
538
|
+
* silently drift from production.
|
|
539
|
+
*/
|
|
540
|
+
export function shouldTrustDeterministicRecipe(recipe) {
|
|
541
|
+
return recipe.appKind !== "unknown" && recipe.testCommands.length > 0;
|
|
542
|
+
}
|
|
528
543
|
//# sourceMappingURL=recipes.js.map
|