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
|
@@ -40,3 +40,10 @@ export interface SlashMenuItem {
|
|
|
40
40
|
export declare const SLASH_MENU_ITEMS: SlashMenuItem[];
|
|
41
41
|
/** Items shown in the splash autocomplete + /help listing. */
|
|
42
42
|
export declare const VISIBLE_SLASH_MENU_ITEMS: SlashMenuItem[];
|
|
43
|
+
/**
|
|
44
|
+
* Arrow-navigation order for the empty-query ("just /") dropdown: primary
|
|
45
|
+
* surface first, then the hidden commands. The dropdown renders a scrolling
|
|
46
|
+
* viewport, so listing the full set here makes every command reachable by
|
|
47
|
+
* arrow keys without cluttering the top of the list (primary stays on top).
|
|
48
|
+
*/
|
|
49
|
+
export declare const SLASH_MENU_ITEMS_ARROW_ORDER: SlashMenuItem[];
|
|
@@ -31,26 +31,21 @@ export const SLASH_MENU_ITEMS = [
|
|
|
31
31
|
{ id: "providers", label: "providers", description: "Manage providers + API keys (enable/disable, set default)" },
|
|
32
32
|
{ id: "compact", label: "compact", description: "Compact conversation context" },
|
|
33
33
|
{ id: "clear", label: "clear", description: "Clear conversation and start fresh" },
|
|
34
|
-
{ id: "ideal", label: "ideal", description: "Product Ideal Loop —
|
|
34
|
+
{ id: "ideal", label: "ideal", description: "Product Ideal Loop — from idea to shipped product, autonomously" },
|
|
35
35
|
{ id: "council", label: "council", description: "Multi-model adversarial debate" },
|
|
36
36
|
// ── Hidden (still functional when typed in full) ───────────────────────
|
|
37
37
|
{ id: "help", label: "help", description: "Show available commands", hidden: true },
|
|
38
|
-
{ id: "config", label: "config", description: "Open provider and council configuration", hidden: true },
|
|
39
38
|
{ id: "remote-control", label: "remote-control", description: "Remote control", hidden: true },
|
|
40
|
-
{ id: "agents", label: "agents", description: "Manage custom sub-agents", hidden: true },
|
|
41
|
-
{ id: "schedule", label: "schedule", description: "View scheduled runs", hidden: true },
|
|
42
39
|
{ id: "mcp", label: "mcp", description: "Manage MCP servers", hidden: true },
|
|
43
40
|
{ id: "sandbox", label: "sandbox", description: "Select shell sandbox mode", hidden: true },
|
|
44
41
|
{ id: "wallet", label: "wallet", description: "Wallet and payment settings", hidden: true },
|
|
45
42
|
{ id: "models", label: "models", description: "Alias of /providers", hidden: true },
|
|
46
43
|
{ id: "new", label: "new session", description: "Start a new session", hidden: true },
|
|
47
|
-
{ id: "
|
|
44
|
+
{ id: "resume", label: "resume", description: "List recent sessions to resume" },
|
|
48
45
|
{ id: "commit-push", label: "commit & push", description: "Commit and push", hidden: true },
|
|
49
46
|
{ id: "commit-pr", label: "commit & pr", description: "Commit and open PR", hidden: true },
|
|
50
47
|
{ id: "review", label: "review", description: "Review recent changes", hidden: true },
|
|
51
48
|
{ id: "verify", label: "verify", description: "Run local verification", hidden: true },
|
|
52
|
-
{ id: "skills", label: "skills", description: "Manage skills", hidden: true },
|
|
53
|
-
{ id: "btw", label: "btw", description: "Ask a side question without interrupting", hidden: true },
|
|
54
49
|
{ id: "update", label: "update", description: "Update muonroi-cli to the latest version", hidden: true },
|
|
55
50
|
{ id: "cost", label: "cost", description: "Show session cost breakdown", hidden: true },
|
|
56
51
|
{ id: "ee", label: "ee", description: "Experience Engine status and controls", hidden: true },
|
|
@@ -74,21 +69,20 @@ export const SLASH_MENU_ITEMS = [
|
|
|
74
69
|
{ id: "pin", label: "pin", description: "Pin a user message so it survives compaction", hidden: true },
|
|
75
70
|
{ id: "unpin", label: "unpin", description: "Remove a pinned message by sequence number", hidden: true },
|
|
76
71
|
{ id: "pins", label: "pins", description: "List currently pinned message sequences", hidden: true },
|
|
77
|
-
{ id: "ee-stats", label: "ee stats", description: "Knowledge base statistics", hidden: true },
|
|
78
|
-
{ id: "ee-gates", label: "ee gates", description: "Quality gate checklist", hidden: true },
|
|
79
|
-
{ id: "ee-evolve", label: "ee evolve", description: "Trigger EE evolution cycle", hidden: true },
|
|
80
|
-
{ id: "ee-user", label: "ee user", description: "Current EE user identity", hidden: true },
|
|
81
|
-
{ id: "ee-search", label: "ee search", description: "Semantic search across knowledge base", hidden: true },
|
|
82
|
-
{ id: "ee-timeline", label: "ee timeline", description: "Principle evolution for a topic", hidden: true },
|
|
83
|
-
{ id: "ee-graph", label: "ee graph", description: "Principle relationship graph", hidden: true },
|
|
84
|
-
{ id: "ee-route", label: "ee route", description: "Route task to workflow", hidden: true },
|
|
85
|
-
{ id: "ee-context-on", label: "ee-context on", description: "Enable BB-aware EE context injection", hidden: true },
|
|
86
|
-
{ id: "ee-context-off", label: "ee-context off", description: "Disable BB-aware EE context injection", hidden: true },
|
|
87
|
-
{ id: "ee-context-status", label: "ee-context status", description: "Show current BB-context setting", hidden: true },
|
|
88
72
|
{ id: "export", label: "export", description: "Export entire conversation to a .txt file", hidden: true },
|
|
89
73
|
{ id: "status", label: "status", description: "Show Agile sprint progress dashboard", hidden: true },
|
|
90
74
|
{ id: "ponytail", label: "ponytail", description: "Toggle Lazy Senior AI Mode (on/off/status)", hidden: false },
|
|
91
75
|
];
|
|
92
76
|
/** Items shown in the splash autocomplete + /help listing. */
|
|
93
77
|
export const VISIBLE_SLASH_MENU_ITEMS = SLASH_MENU_ITEMS.filter((m) => !m.hidden);
|
|
78
|
+
/**
|
|
79
|
+
* Arrow-navigation order for the empty-query ("just /") dropdown: primary
|
|
80
|
+
* surface first, then the hidden commands. The dropdown renders a scrolling
|
|
81
|
+
* viewport, so listing the full set here makes every command reachable by
|
|
82
|
+
* arrow keys without cluttering the top of the list (primary stays on top).
|
|
83
|
+
*/
|
|
84
|
+
export const SLASH_MENU_ITEMS_ARROW_ORDER = [
|
|
85
|
+
...VISIBLE_SLASH_MENU_ITEMS,
|
|
86
|
+
...SLASH_MENU_ITEMS.filter((m) => m.hidden),
|
|
87
|
+
];
|
|
94
88
|
//# sourceMappingURL=menu-items.js.map
|
|
@@ -23,6 +23,8 @@ export interface SlashContext {
|
|
|
23
23
|
export type SlashHandler = (args: string[], ctx: SlashContext) => Promise<string> | string;
|
|
24
24
|
/** Register a slash command handler. */
|
|
25
25
|
export declare function registerSlash(name: string, handler: SlashHandler): void;
|
|
26
|
+
/** Unregister a slash command handler (used for tests). */
|
|
27
|
+
export declare function unregisterSlash(name: string): void;
|
|
26
28
|
/**
|
|
27
29
|
* Dispatch a slash command by name.
|
|
28
30
|
* Returns null if command not registered (caller falls back to legacy switch).
|
|
@@ -9,6 +9,10 @@ const registry = new Map();
|
|
|
9
9
|
export function registerSlash(name, handler) {
|
|
10
10
|
registry.set(name, handler);
|
|
11
11
|
}
|
|
12
|
+
/** Unregister a slash command handler (used for tests). */
|
|
13
|
+
export function unregisterSlash(name) {
|
|
14
|
+
registry.delete(name);
|
|
15
|
+
}
|
|
12
16
|
/**
|
|
13
17
|
* Dispatch a slash command by name.
|
|
14
18
|
* Returns null if command not registered (caller falls back to legacy switch).
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Cache-hit ratio = cache_read / total input (cumulative). `in_tokens` already
|
|
2
|
+
* includes cache-read tokens (verified: usage_events cache_read ⊆ input_tokens). */
|
|
3
|
+
export declare function computeCacheHitPct(s: {
|
|
4
|
+
in_tokens: number;
|
|
5
|
+
cache_read_tokens: number;
|
|
6
|
+
}): number | null;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Cache-hit ratio = cache_read / total input (cumulative). `in_tokens` already
|
|
2
|
+
* includes cache-read tokens (verified: usage_events cache_read ⊆ input_tokens). */
|
|
3
|
+
export function computeCacheHitPct(s) {
|
|
4
|
+
if (s.in_tokens <= 0)
|
|
5
|
+
return null;
|
|
6
|
+
const pct = (s.cache_read_tokens / s.in_tokens) * 100;
|
|
7
|
+
return Math.max(0, Math.min(100, Math.round(pct)));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=cache-hit.js.map
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Subscribes to statusBarStore for live updates (no polling).
|
|
8
8
|
*/
|
|
9
9
|
import * as React from "react";
|
|
10
|
-
import { type SprintProgressSegment, type StatusBarState } from "
|
|
10
|
+
import { type SprintProgressSegment, type StatusBarState } from "../../state/status-bar-store.js";
|
|
11
11
|
/**
|
|
12
12
|
* Format a SprintProgressSegment into the StatusBar display string.
|
|
13
13
|
* Format: Sprint N/M · X/Y stories · Z%
|
|
@@ -9,7 +9,8 @@ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
|
9
9
|
*/
|
|
10
10
|
import { Semantic } from "@muonroi/agent-harness-opentui";
|
|
11
11
|
import * as React from "react";
|
|
12
|
-
import { statusBarStore } from "
|
|
12
|
+
import { statusBarStore } from "../../state/status-bar-store.js";
|
|
13
|
+
import { computeCacheHitPct } from "./cache-hit.js";
|
|
13
14
|
import { TierBadge } from "./tier-badge.js";
|
|
14
15
|
import { UsdMeter } from "./usd-meter.js";
|
|
15
16
|
function useStatusBarState() {
|
|
@@ -57,7 +58,11 @@ export function renderStatusBar(s) {
|
|
|
57
58
|
: s.ctx_tokens !== undefined
|
|
58
59
|
? ` [ctx: ${fmtTokens(s.ctx_tokens)}]`
|
|
59
60
|
: "";
|
|
60
|
-
const
|
|
61
|
+
const hitPct = computeCacheHitPct(s);
|
|
62
|
+
const cacheSeg = s.cache_read_tokens
|
|
63
|
+
? ` ⊚${fmtTokens(s.cache_read_tokens)}${hitPct !== null ? ` ${hitPct}%` : ""}`
|
|
64
|
+
: "";
|
|
65
|
+
const tokenStr = `↑${fmtTokens(s.in_tokens)} ↓${fmtTokens(s.out_tokens)}${cacheSeg}${ctxFill}`;
|
|
61
66
|
const ee = EE_DOT[s.ee_status] ?? EE_DOT.unknown;
|
|
62
67
|
const slots = [
|
|
63
68
|
React.createElement("text", { key: "pm", fg: "#5c9cf5", "data-testid": "slot-provider-model" }, modelLabel),
|
|
@@ -66,7 +71,6 @@ export function renderStatusBar(s) {
|
|
|
66
71
|
React.createElement(UsdMeter, {
|
|
67
72
|
key: "usd",
|
|
68
73
|
session_usd: s.session_usd,
|
|
69
|
-
month_usd: s.month_usd,
|
|
70
74
|
current_pct: s.current_pct,
|
|
71
75
|
}),
|
|
72
76
|
React.createElement("text", { key: "ee", fg: ee.color, "data-testid": "slot-ee" }, ee.symbol),
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/ui/status-bar/usd-meter.tsx
|
|
3
3
|
*
|
|
4
|
-
* USD meter sub-component: session
|
|
5
|
-
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%.
|
|
4
|
+
* USD meter sub-component: session spend with threshold color escalation.
|
|
5
|
+
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%. The month total is
|
|
6
|
+
* intentionally NOT shown here (redundant on the status bar); it remains in the
|
|
7
|
+
* store and is surfaced on demand via `/cost`.
|
|
6
8
|
*/
|
|
7
9
|
import * as React from "react";
|
|
8
10
|
export interface UsdMeterProps {
|
|
9
11
|
session_usd: number;
|
|
10
|
-
month_usd: number;
|
|
11
12
|
current_pct: number;
|
|
12
13
|
}
|
|
13
|
-
export declare function UsdMeter({ session_usd,
|
|
14
|
+
export declare function UsdMeter({ session_usd, current_pct }: UsdMeterProps): React.ReactElement;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/ui/status-bar/usd-meter.tsx
|
|
3
3
|
*
|
|
4
|
-
* USD meter sub-component: session
|
|
5
|
-
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%.
|
|
4
|
+
* USD meter sub-component: session spend with threshold color escalation.
|
|
5
|
+
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%. The month total is
|
|
6
|
+
* intentionally NOT shown here (redundant on the status bar); it remains in the
|
|
7
|
+
* store and is surfaced on demand via `/cost`.
|
|
6
8
|
*/
|
|
7
9
|
import * as React from "react";
|
|
8
|
-
export function UsdMeter({ session_usd,
|
|
10
|
+
export function UsdMeter({ session_usd, current_pct }) {
|
|
9
11
|
const color = current_pct >= 100 ? "red" : current_pct >= 80 ? "yellow" : current_pct >= 50 ? "cyan" : "white";
|
|
10
|
-
const text = `session: $${session_usd.toFixed(2)}
|
|
12
|
+
const text = `session: $${session_usd.toFixed(2)}`;
|
|
11
13
|
return React.createElement("text", { fg: color, "data-testid": "usd-meter", "data-pct": current_pct }, text);
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=usd-meter.js.map
|
package/dist/src/ui/theme.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ export declare const dark: {
|
|
|
65
65
|
readonly syntaxRegex: "#d16969";
|
|
66
66
|
readonly syntaxTag: "#569cd6";
|
|
67
67
|
readonly syntaxAttr: "#9cdcfe";
|
|
68
|
+
readonly overlay: "#000000cc";
|
|
68
69
|
readonly councilLeaderBorder: "#666666";
|
|
69
70
|
readonly councilSynthesisBorder: "#5c9cf5";
|
|
70
71
|
readonly councilInfoCardBorder: "#4a4a4a";
|
package/dist/src/ui/theme.js
CHANGED
|
@@ -65,6 +65,8 @@ export const dark = {
|
|
|
65
65
|
syntaxRegex: "#d16969",
|
|
66
66
|
syntaxTag: "#569cd6",
|
|
67
67
|
syntaxAttr: "#9cdcfe",
|
|
68
|
+
// ── Overlay / modal backdrop ─────────────────────────────────────────────
|
|
69
|
+
overlay: "#000000cc",
|
|
68
70
|
// ── Council bubble tokens ────────────────────────────────────────────────
|
|
69
71
|
councilLeaderBorder: "#666666",
|
|
70
72
|
councilSynthesisBorder: "#5c9cf5",
|
package/dist/src/ui/types.d.ts
CHANGED
|
@@ -63,6 +63,13 @@ export interface AppStartupConfig {
|
|
|
63
63
|
* Never set this in production — only passed via --inject-halt CLI flag.
|
|
64
64
|
*/
|
|
65
65
|
injectHalt?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* TEST SEAM (A): when true, dispatch a synthetic `sprint_failed` halt chunk
|
|
68
|
+
* (Resume / Retry / Skip verify / Abort) after first idle. Lets harness E2E
|
|
69
|
+
* specs verify the sprint-break recovery card without a real mid-run failure.
|
|
70
|
+
* Never set this in production — only passed via --inject-halt-sprint.
|
|
71
|
+
*/
|
|
72
|
+
injectHaltSprint?: boolean;
|
|
66
73
|
}
|
|
67
74
|
export interface AppProps {
|
|
68
75
|
agent: Agent;
|
|
Binary file
|
|
@@ -35,4 +35,18 @@ export declare function buildPreflightQuestion(pf: {
|
|
|
35
35
|
model: string;
|
|
36
36
|
}>;
|
|
37
37
|
}): CouncilQuestionData;
|
|
38
|
+
/**
|
|
39
|
+
* F5 — the council entrypoint (council/index.ts) emits `leader`+`panel`+`topic`
|
|
40
|
+
* together exactly once, at the START of each debate; every later `council_meta`
|
|
41
|
+
* patch is partial (a lone roundBudget / researchMode / successCriteria /
|
|
42
|
+
* criteriaMet). That combination is the strongest new-council signal — stronger
|
|
43
|
+
* than a topic change, which misses a re-run on the SAME topic (auto-council
|
|
44
|
+
* re-firing on a phase, or a fresh /council after an Esc that skipped
|
|
45
|
+
* clearLiveTurnUi) and leaks the prior council's pinned criteria into the rail as
|
|
46
|
+
* stale ○ rows. The rail resets its meta+rounds on this.
|
|
47
|
+
*/
|
|
48
|
+
export declare function isCouncilStartPatch(patch: {
|
|
49
|
+
leader?: string;
|
|
50
|
+
panel?: string[];
|
|
51
|
+
}): boolean;
|
|
38
52
|
export declare function mapCouncilCardKey(key: KeyEvent): CouncilCardKey | null;
|
|
@@ -41,6 +41,13 @@ export function formatAnswerForLog(ans, ctx) {
|
|
|
41
41
|
return verb;
|
|
42
42
|
// Single line — labels carry value + rationale tail; keep echo to the value.
|
|
43
43
|
const valueOnly = label.split("—")[0].trim().replace(/\s+/g, " ");
|
|
44
|
+
// Internal snake_case action ids (continue_session, save_exit, generate_plan,
|
|
45
|
+
// ask_followup…) are routing tokens the user should NEVER see. When the value
|
|
46
|
+
// is such an id, echo the human label alone instead of "continue_session · …".
|
|
47
|
+
// Short human verbs (accept, skip, override) have no underscore and keep the
|
|
48
|
+
// value-prefixed forensics form below.
|
|
49
|
+
if (/_/.test(verb))
|
|
50
|
+
return valueOnly || verb;
|
|
44
51
|
if (ctx?.questionId) {
|
|
45
52
|
return `${verb} · ${ctx.questionId}=${valueOnly}`;
|
|
46
53
|
}
|
|
@@ -89,15 +96,28 @@ export function buildPreflightQuestion(pf) {
|
|
|
89
96
|
questionId: pf.preflightId,
|
|
90
97
|
phase: "preflight",
|
|
91
98
|
question: `Approve discussion plan for: ${pf.problemStatement}`,
|
|
92
|
-
context: pf.participants.length > 0 ? `
|
|
99
|
+
context: pf.participants.length > 0 ? `Panel: ${pf.participants.map((p) => p.model).join(", ")}` : undefined,
|
|
93
100
|
options: [
|
|
94
|
-
{ label: "Approve", value: "approve", kind: "choice", description: "
|
|
95
|
-
{ label: "Reject", value: "reject", kind: "choice", description: "
|
|
101
|
+
{ label: "Approve", value: "approve", kind: "choice", description: "Looks good — start the debate" },
|
|
102
|
+
{ label: "Reject", value: "reject", kind: "choice", description: "Hold off — go back and rephrase the topic" },
|
|
96
103
|
],
|
|
97
104
|
isRequired: true,
|
|
98
105
|
defaultIndex: 0,
|
|
99
106
|
};
|
|
100
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* F5 — the council entrypoint (council/index.ts) emits `leader`+`panel`+`topic`
|
|
110
|
+
* together exactly once, at the START of each debate; every later `council_meta`
|
|
111
|
+
* patch is partial (a lone roundBudget / researchMode / successCriteria /
|
|
112
|
+
* criteriaMet). That combination is the strongest new-council signal — stronger
|
|
113
|
+
* than a topic change, which misses a re-run on the SAME topic (auto-council
|
|
114
|
+
* re-firing on a phase, or a fresh /council after an Esc that skipped
|
|
115
|
+
* clearLiveTurnUi) and leaks the prior council's pinned criteria into the rail as
|
|
116
|
+
* stale ○ rows. The rail resets its meta+rounds on this.
|
|
117
|
+
*/
|
|
118
|
+
export function isCouncilStartPatch(patch) {
|
|
119
|
+
return !!patch.leader && !!patch.panel;
|
|
120
|
+
}
|
|
101
121
|
export function mapCouncilCardKey(key) {
|
|
102
122
|
if (key.name === "up")
|
|
103
123
|
return { kind: "up" };
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Plan 06 (status bar) subscribes to DowngradeEvent for UI updates.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { getRoutedModelByTier } from "../router/peak-hour.js";
|
|
11
11
|
import { getDefaultProvider } from "../utils/settings.js";
|
|
12
12
|
function buildDowngradeChain() {
|
|
13
13
|
const provider = getDefaultProvider() ?? undefined;
|
|
@@ -15,7 +15,7 @@ function buildDowngradeChain() {
|
|
|
15
15
|
const seen = new Set();
|
|
16
16
|
const chain = [];
|
|
17
17
|
for (const tier of tiers) {
|
|
18
|
-
const m =
|
|
18
|
+
const m = getRoutedModelByTier(tier, provider);
|
|
19
19
|
if (m && !seen.has(m.id)) {
|
|
20
20
|
chain.push(m.id);
|
|
21
21
|
seen.add(m.id);
|
|
@@ -24,12 +24,12 @@ async function ensureDirectory(filePath) {
|
|
|
24
24
|
export async function appendProductLedger(productRunId, entry, homeOverride) {
|
|
25
25
|
const filePath = getProductLedgerPath(productRunId, homeOverride);
|
|
26
26
|
await ensureDirectory(filePath);
|
|
27
|
-
// Ensure file exists for lockfile to target
|
|
27
|
+
// Ensure file exists for lockfile to target without truncating it concurrently
|
|
28
28
|
try {
|
|
29
29
|
await fs.access(filePath);
|
|
30
30
|
}
|
|
31
31
|
catch {
|
|
32
|
-
await fs.
|
|
32
|
+
await fs.appendFile(filePath, "");
|
|
33
33
|
}
|
|
34
34
|
const releaseLock = await lockfile.lock(filePath, {
|
|
35
35
|
retries: { retries: 10, minTimeout: 10, maxTimeout: 100 },
|
|
@@ -25,24 +25,24 @@ function readWin32() {
|
|
|
25
25
|
try {
|
|
26
26
|
const escaped = tmpFile.replace(/\\/g, "\\\\");
|
|
27
27
|
// Run in STA thread with retry — clipboard can be locked by other processes
|
|
28
|
-
const ps = `
|
|
29
|
-
Add-Type -AssemblyName System.Windows.Forms
|
|
30
|
-
Add-Type -AssemblyName System.Drawing
|
|
31
|
-
$maxRetries = 3
|
|
32
|
-
$img = $null
|
|
33
|
-
for ($i = 0; $i -lt $maxRetries; $i++) {
|
|
34
|
-
try {
|
|
35
|
-
$img = [System.Windows.Forms.Clipboard]::GetImage()
|
|
36
|
-
if ($img -ne $null) { break }
|
|
37
|
-
} catch {
|
|
38
|
-
# clipboard locked — wait and retry
|
|
39
|
-
}
|
|
40
|
-
Start-Sleep -Milliseconds 100
|
|
41
|
-
}
|
|
42
|
-
if ($img -ne $null) {
|
|
43
|
-
$img.Save('${escaped}', [System.Drawing.Imaging.ImageFormat]::Png)
|
|
44
|
-
$img.Dispose()
|
|
45
|
-
}
|
|
28
|
+
const ps = `
|
|
29
|
+
Add-Type -AssemblyName System.Windows.Forms
|
|
30
|
+
Add-Type -AssemblyName System.Drawing
|
|
31
|
+
$maxRetries = 3
|
|
32
|
+
$img = $null
|
|
33
|
+
for ($i = 0; $i -lt $maxRetries; $i++) {
|
|
34
|
+
try {
|
|
35
|
+
$img = [System.Windows.Forms.Clipboard]::GetImage()
|
|
36
|
+
if ($img -ne $null) { break }
|
|
37
|
+
} catch {
|
|
38
|
+
# clipboard locked — wait and retry
|
|
39
|
+
}
|
|
40
|
+
Start-Sleep -Milliseconds 100
|
|
41
|
+
}
|
|
42
|
+
if ($img -ne $null) {
|
|
43
|
+
$img.Save('${escaped}', [System.Drawing.Imaging.ImageFormat]::Png)
|
|
44
|
+
$img.Dispose()
|
|
45
|
+
}
|
|
46
46
|
`;
|
|
47
47
|
const result = spawnSync("powershell", ["-NoProfile", "-STA", "-Command", ps], { timeout: 8000 });
|
|
48
48
|
if (result.error || result.status !== 0)
|
|
@@ -81,11 +81,11 @@ function readDarwin() {
|
|
|
81
81
|
const pngpaste = spawnSync("pngpaste", [tmpFile], { timeout: 5000 });
|
|
82
82
|
if (pngpaste.status !== 0) {
|
|
83
83
|
spawnSync("screencapture", ["-c", "-x"]);
|
|
84
|
-
const osascript = `
|
|
85
|
-
set imgData to the clipboard as «class PNGf»
|
|
86
|
-
set f to open for access POSIX file "${tmpFile}" with write permission
|
|
87
|
-
write imgData to f
|
|
88
|
-
close access f
|
|
84
|
+
const osascript = `
|
|
85
|
+
set imgData to the clipboard as «class PNGf»
|
|
86
|
+
set f to open for access POSIX file "${tmpFile}" with write permission
|
|
87
|
+
write imgData to f
|
|
88
|
+
close access f
|
|
89
89
|
`;
|
|
90
90
|
spawnSync("osascript", ["-e", osascript], { timeout: 5000 });
|
|
91
91
|
}
|
|
@@ -194,7 +194,8 @@ export function detectInstallMethod(homeDir = os.homedir()) {
|
|
|
194
194
|
}
|
|
195
195
|
// Not under node_modules and not launched by node/bun → standalone binary.
|
|
196
196
|
const exeBase = ((process.execPath || "").replace(/\\/g, "/").split("/").pop() ?? "").toLowerCase();
|
|
197
|
-
|
|
197
|
+
const isNodeOrBunRunner = /^(node|bun)(\.exe|-[\d.]+)?$/i.test(exeBase);
|
|
198
|
+
if (!modPath.includes("/node_modules/") && !isNodeOrBunRunner) {
|
|
198
199
|
return "compiled";
|
|
199
200
|
}
|
|
200
201
|
// Linked/source build run from a git checkout (e.g. `bun link`, a symlinked
|
|
@@ -248,21 +249,23 @@ export async function runManagedUpdate(currentVersion) {
|
|
|
248
249
|
if (latestVersion && normalizedCurrent) {
|
|
249
250
|
hasUpdate = semverGt(latestVersion, normalizedCurrent);
|
|
250
251
|
if (hasUpdate) {
|
|
251
|
-
statusHeader =
|
|
252
|
+
statusHeader = `### 🔄 Update Available\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Latest Version:** \`v${latestVersion}\`\n* **Status:** A new version of \`muonroi-cli\` is available!\n\n`;
|
|
253
|
+
}
|
|
254
|
+
else if (semverGt(normalizedCurrent, latestVersion)) {
|
|
255
|
+
statusHeader = `### 🚀 Ahead of Latest Release\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Latest Version:** \`v${latestVersion}\`\n* **Status:** Your local installation is newer than the remote release tag.\n\n`;
|
|
252
256
|
}
|
|
253
257
|
else {
|
|
254
|
-
statusHeader =
|
|
258
|
+
statusHeader = `### ✅ Up to Date\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Latest Version:** \`v${latestVersion}\`\n* **Status:** You are already up to date!\n\n`;
|
|
255
259
|
}
|
|
256
260
|
}
|
|
257
261
|
else if (normalizedCurrent) {
|
|
258
|
-
statusHeader =
|
|
262
|
+
statusHeader = `### ⚠️ Update Status\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Status:** Unable to check the latest version from GitHub or NPM.\n\n`;
|
|
259
263
|
}
|
|
260
264
|
const cmd = getUpdateCommandForMethod(method);
|
|
261
265
|
if (cmd) {
|
|
262
|
-
const pm = method === "bun-global" ? "bun" : "npm";
|
|
263
266
|
const instruction = hasUpdate
|
|
264
|
-
? `To update, run this in a fresh terminal:\n\n
|
|
265
|
-
: `If you want to reinstall, run this in a fresh terminal:\n\n
|
|
267
|
+
? `To update, run this in a fresh terminal:\n\`\`\`bash\n${cmd}\n\`\`\`\nThen restart \`muonroi-cli\`.`
|
|
268
|
+
: `If you want to reinstall, run this in a fresh terminal:\n\`\`\`bash\n${cmd}\n\`\`\``;
|
|
266
269
|
return {
|
|
267
270
|
success: true,
|
|
268
271
|
output: `${statusHeader}${instruction}`,
|
|
@@ -272,8 +275,8 @@ export async function runManagedUpdate(currentVersion) {
|
|
|
272
275
|
const target = getReleaseTargetForPlatform();
|
|
273
276
|
const asset = target?.assetName ?? "the release asset for your platform";
|
|
274
277
|
const instruction = hasUpdate
|
|
275
|
-
? `Download the latest
|
|
276
|
-
: `If you want to reinstall, download the latest
|
|
278
|
+
? `Download the latest \`${asset}\` from [GitHub Releases](https://github.com/${GITHUB_REPO}/releases/latest) and replace the current binary, or rebuild from source.`
|
|
279
|
+
: `If you want to reinstall, download the latest \`${asset}\` from [GitHub Releases](https://github.com/${GITHUB_REPO}/releases/latest) and replace the current binary.`;
|
|
277
280
|
return {
|
|
278
281
|
success: true,
|
|
279
282
|
output: `${statusHeader}${instruction}`,
|
|
@@ -282,8 +285,8 @@ export async function runManagedUpdate(currentVersion) {
|
|
|
282
285
|
if (method === "dev-link") {
|
|
283
286
|
const target = root ?? "the muonroi-cli checkout";
|
|
284
287
|
const instruction = hasUpdate
|
|
285
|
-
? `To update, pull the latest changes and rebuild:\n\
|
|
286
|
-
: `To rebuild your local installation:\n\
|
|
288
|
+
? `To update, pull the latest changes and rebuild:\n\`\`\`bash\ngit -C "${target}" pull && bun install && bun run build\n\`\`\`\nThen restart \`muonroi-cli\`. (If you also use the compiled muonroi-cli-dev binary, rebuild that separately.)`
|
|
289
|
+
: `To rebuild your local installation:\n\`\`\`bash\ngit -C "${target}" pull && bun install && bun run build\n\`\`\`\nThen restart \`muonroi-cli\`.`;
|
|
287
290
|
return {
|
|
288
291
|
success: true,
|
|
289
292
|
output: `${statusHeader}${instruction}`,
|
package/dist/src/utils/logger.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* safe - Every tool call prompts the user for approval.
|
|
5
5
|
* auto-edit - File operation tools (read/write/edit/grep/list) auto-approve;
|
|
6
|
-
* shell execution
|
|
6
|
+
* shell execution auto-approves for non-dangerous commands;
|
|
7
|
+
* computer tools still require confirmation.
|
|
7
8
|
* yolo - All tool calls auto-approve without any prompting.
|
|
8
9
|
*/
|
|
9
10
|
import { appendDecisionLog } from "../usage/decision-log.js";
|
|
@@ -217,8 +218,9 @@ export function toolNeedsApproval(toolName, mode, context) {
|
|
|
217
218
|
return false;
|
|
218
219
|
}
|
|
219
220
|
if (mode === "auto-edit") {
|
|
220
|
-
|
|
221
|
-
|
|
221
|
+
// bash auto-approves when non-dangerous; only dangerous bash needs approval
|
|
222
|
+
if (toolName === "bash")
|
|
223
|
+
return dangerous(context?.command);
|
|
222
224
|
return !AUTO_EDIT_ALLOWED.has(toolName);
|
|
223
225
|
}
|
|
224
226
|
// "safe" — always confirm; dangerous patterns explicitly require (no bypass)
|
|
@@ -34,7 +34,7 @@ const STATIC_PATTERNS = [
|
|
|
34
34
|
},
|
|
35
35
|
// Environment variable assignments for common API keys
|
|
36
36
|
{
|
|
37
|
-
pattern: /(ANTHROPIC_API_KEY|OPENAI_API_KEY|
|
|
37
|
+
pattern: /(ANTHROPIC_API_KEY|OPENAI_API_KEY|DEEPSEEK_API_KEY)\s*=\s*\S+/g,
|
|
38
38
|
replacement: "$1=***REDACTED***",
|
|
39
39
|
},
|
|
40
40
|
// Authorization Bearer header
|