muonroi-cli 1.8.4 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +17 -5
- package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
- package/dist/packages/agent-harness-core/src/driver.js +46 -0
- package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
- package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
- package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
- package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
- package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
- package/dist/packages/agent-harness-core/src/protocol.js +15 -0
- package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
- package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
- package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
- package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
- package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
- package/dist/packages/agent-harness-opentui/src/install.js +10 -0
- package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
- package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
- package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
- package/dist/src/agent-harness/mock-model.d.ts +38 -0
- package/dist/src/agent-harness/mock-model.js +69 -3
- package/dist/src/agent-harness/test-spawn.js +31 -0
- package/dist/src/chat/chat-keychain.d.ts +7 -12
- package/dist/src/chat/chat-keychain.js +19 -86
- package/dist/src/cli/config/screen-providers.js +1 -1
- package/dist/src/cli/cost-forensics.d.ts +10 -0
- package/dist/src/cli/cost-forensics.js +18 -3
- package/dist/src/cli/keys-bundle.d.ts +1 -1
- package/dist/src/cli/keys-bundle.js +1 -1
- package/dist/src/cli/keys.d.ts +10 -47
- package/dist/src/cli/keys.js +31 -399
- package/dist/src/council/clarifier.d.ts +31 -3
- package/dist/src/council/clarifier.js +220 -32
- package/dist/src/council/context.js +49 -15
- package/dist/src/council/debate-checkpoint.d.ts +129 -0
- package/dist/src/council/debate-checkpoint.js +176 -0
- package/dist/src/council/debate-planner.js +54 -5
- package/dist/src/council/debate-summary.d.ts +25 -0
- package/dist/src/council/debate-summary.js +85 -0
- package/dist/src/council/debate.d.ts +169 -2
- package/dist/src/council/debate.js +1265 -135
- package/dist/src/council/index.d.ts +108 -1
- package/dist/src/council/index.js +670 -197
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +94 -0
- package/dist/src/council/llm.js +348 -55
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +82 -0
- package/dist/src/council/planner.js +40 -0
- package/dist/src/council/preflight.d.ts +17 -0
- package/dist/src/council/preflight.js +50 -2
- package/dist/src/council/prompts.d.ts +39 -4
- package/dist/src/council/prompts.js +256 -69
- package/dist/src/council/stance-recall.d.ts +42 -0
- package/dist/src/council/stance-recall.js +57 -0
- package/dist/src/council/strip-think.d.ts +17 -0
- package/dist/src/council/strip-think.js +33 -0
- package/dist/src/council/types.d.ts +138 -0
- package/dist/src/ee/artifact-cache.d.ts +16 -0
- package/dist/src/ee/artifact-cache.js +32 -0
- package/dist/src/ee/auth.d.ts +20 -0
- package/dist/src/ee/auth.js +54 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +109 -21
- package/dist/src/ee/ee-onboarding.js +6 -26
- package/dist/src/ee/export-transcripts.d.ts +1 -0
- package/dist/src/ee/export-transcripts.js +8 -10
- package/dist/src/ee/extract-session.js +29 -0
- package/dist/src/ee/extract-style.d.ts +58 -0
- package/dist/src/ee/extract-style.js +270 -0
- package/dist/src/ee/recall-ledger.d.ts +9 -0
- package/dist/src/ee/recall-ledger.js +3 -0
- package/dist/src/ee/scope.d.ts +1 -0
- package/dist/src/ee/scope.js +26 -1
- package/dist/src/ee/search.d.ts +7 -0
- package/dist/src/ee/search.js +24 -0
- package/dist/src/ee/transcript-emit.js +2 -0
- package/dist/src/ee/types.d.ts +22 -0
- package/dist/src/ee/who-am-i-brain.d.ts +35 -0
- package/dist/src/ee/who-am-i-brain.js +220 -0
- package/dist/src/ee/who-am-i.d.ts +10 -3
- package/dist/src/ee/who-am-i.js +12 -0
- package/dist/src/ee/workflow-event.d.ts +48 -0
- package/dist/src/ee/workflow-event.js +81 -0
- package/dist/src/flow/compaction/compress.d.ts +3 -3
- package/dist/src/flow/compaction/compress.js +58 -8
- package/dist/src/flow/compaction/extract.d.ts +4 -7
- package/dist/src/flow/compaction/extract.js +50 -10
- package/dist/src/flow/compaction/index.d.ts +14 -1
- package/dist/src/flow/compaction/index.js +96 -3
- package/dist/src/flow/compaction/input-guard.d.ts +24 -0
- package/dist/src/flow/compaction/input-guard.js +43 -0
- package/dist/src/flow/compaction/progress.d.ts +35 -0
- package/dist/src/flow/compaction/progress.js +35 -0
- package/dist/src/flow/fold-planning.d.ts +36 -0
- package/dist/src/flow/fold-planning.js +83 -0
- package/dist/src/flow/hierarchy.d.ts +146 -0
- package/dist/src/flow/hierarchy.js +427 -0
- package/dist/src/flow/index.d.ts +1 -0
- package/dist/src/flow/index.js +2 -0
- package/dist/src/flow/run-artifacts.d.ts +102 -0
- package/dist/src/flow/run-artifacts.js +208 -0
- package/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/dist/src/gsd/assessment-schema.d.ts +44 -0
- package/dist/src/gsd/assessment-schema.js +134 -0
- package/dist/src/gsd/capability-registry.d.ts +45 -0
- package/dist/src/gsd/capability-registry.js +337 -0
- package/dist/src/gsd/complexity-assessor.d.ts +39 -0
- package/dist/src/gsd/complexity-assessor.js +152 -0
- package/dist/src/gsd/config-bridge.d.ts +7 -0
- package/dist/src/gsd/config-bridge.js +114 -0
- package/dist/src/gsd/config-loader.d.ts +27 -0
- package/dist/src/gsd/config-loader.js +50 -0
- package/dist/src/gsd/council-context.d.ts +44 -0
- package/dist/src/gsd/council-context.js +114 -0
- package/dist/src/gsd/ee-closure.d.ts +28 -0
- package/dist/src/gsd/ee-closure.js +49 -0
- package/dist/src/gsd/flags.d.ts +66 -0
- package/dist/src/gsd/flags.js +102 -0
- package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
- package/dist/src/gsd/gsd-dispatch.js +131 -0
- package/dist/src/gsd/gsd-runtime.d.ts +22 -0
- package/dist/src/gsd/gsd-runtime.js +37 -0
- package/dist/src/gsd/host-adapter.d.ts +11 -0
- package/dist/src/gsd/host-adapter.js +29 -0
- package/dist/src/gsd/index.d.ts +24 -1
- package/dist/src/gsd/index.js +27 -0
- package/dist/src/gsd/loop-host-contract.d.ts +21 -0
- package/dist/src/gsd/loop-host-contract.js +39 -0
- package/dist/src/gsd/loop-host.d.ts +69 -0
- package/dist/src/gsd/loop-host.js +245 -0
- package/dist/src/gsd/loop-resolver.d.ts +36 -0
- package/dist/src/gsd/loop-resolver.js +79 -0
- package/dist/src/gsd/model-tier.d.ts +13 -0
- package/dist/src/gsd/model-tier.js +45 -0
- package/dist/src/gsd/mutation-gate.d.ts +16 -0
- package/dist/src/gsd/mutation-gate.js +41 -0
- package/dist/src/gsd/native-roadmap.d.ts +89 -0
- package/dist/src/gsd/native-roadmap.js +343 -0
- package/dist/src/gsd/native-state.d.ts +47 -0
- package/dist/src/gsd/native-state.js +220 -0
- package/dist/src/gsd/paths.d.ts +23 -0
- package/dist/src/gsd/paths.js +66 -0
- package/dist/src/gsd/phase-dag.d.ts +12 -0
- package/dist/src/gsd/phase-dag.js +94 -0
- package/dist/src/gsd/phase-sync.d.ts +42 -0
- package/dist/src/gsd/phase-sync.js +321 -0
- package/dist/src/gsd/pil-gate-context.d.ts +13 -0
- package/dist/src/gsd/pil-gate-context.js +64 -0
- package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
- package/dist/src/gsd/pil-gate-critic.js +74 -0
- package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
- package/dist/src/gsd/plan-council-prompts.js +79 -0
- package/dist/src/gsd/plan-council.d.ts +44 -0
- package/dist/src/gsd/plan-council.js +283 -0
- package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
- package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
- package/dist/src/gsd/product-workspace.d.ts +13 -0
- package/dist/src/gsd/product-workspace.js +124 -0
- package/dist/src/gsd/ship-bridge.d.ts +25 -0
- package/dist/src/gsd/ship-bridge.js +65 -0
- package/dist/src/gsd/state-document.d.ts +40 -0
- package/dist/src/gsd/state-document.js +163 -0
- package/dist/src/gsd/verdict-schema.d.ts +39 -0
- package/dist/src/gsd/verdict-schema.js +144 -0
- package/dist/src/gsd/verify-context.d.ts +22 -0
- package/dist/src/gsd/verify-context.js +27 -0
- package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
- package/dist/src/gsd/verify-council-prompts.js +85 -0
- package/dist/src/gsd/verify-council.d.ts +25 -0
- package/dist/src/gsd/verify-council.js +119 -0
- package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
- package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
- package/dist/src/gsd/workflow-engine.d.ts +60 -0
- package/dist/src/gsd/workflow-engine.js +207 -0
- package/dist/src/gsd/workflow-tools.d.ts +13 -0
- package/dist/src/gsd/workflow-tools.js +277 -0
- package/dist/src/headless/council-answers.js +4 -0
- package/dist/src/hooks/index.js +1 -1
- package/dist/src/index.js +172 -270
- package/dist/src/lsp/builtins.js +3 -1
- package/dist/src/lsp/manager.d.ts +5 -1
- package/dist/src/lsp/manager.js +249 -3
- package/dist/src/lsp/npm-cache.d.ts +11 -1
- package/dist/src/lsp/npm-cache.js +17 -1
- package/dist/src/lsp/runtime.d.ts +6 -1
- package/dist/src/lsp/runtime.js +17 -1
- package/dist/src/lsp/types.d.ts +83 -1
- package/dist/src/lsp/types.js +10 -0
- package/dist/src/maintain/pr-builder.js +23 -13
- package/dist/src/mcp/auto-setup.js +57 -32
- package/dist/src/mcp/client-pool.js +44 -16
- package/dist/src/mcp/lsp-tools.d.ts +5 -1
- package/dist/src/mcp/lsp-tools.js +93 -2
- package/dist/src/mcp/mcp-keychain.d.ts +3 -5
- package/dist/src/mcp/mcp-keychain.js +9 -49
- package/dist/src/mcp/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -2
- package/dist/src/mcp/setup-guide-text.d.ts +1 -1
- package/dist/src/mcp/setup-guide-text.js +22 -2
- package/dist/src/mcp/tools-server.d.ts +10 -0
- package/dist/src/mcp/tools-server.js +10 -2
- package/dist/src/models/catalog-client.d.ts +87 -0
- package/dist/src/models/catalog-client.js +105 -38
- package/dist/src/models/catalog.json +528 -265
- package/dist/src/models/registry.d.ts +22 -7
- package/dist/src/models/registry.js +73 -10
- package/dist/src/ops/doctor.js +1 -1
- package/dist/src/orchestrator/ask-user.d.ts +61 -0
- package/dist/src/orchestrator/ask-user.js +65 -0
- package/dist/src/orchestrator/auto-commit.js +1 -1
- package/dist/src/orchestrator/batch-turn-runner.js +2 -2
- package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
- package/dist/src/orchestrator/cache-prefix.js +83 -0
- package/dist/src/orchestrator/compact-request.d.ts +32 -0
- package/dist/src/orchestrator/compact-request.js +41 -0
- package/dist/src/orchestrator/compaction.d.ts +12 -3
- package/dist/src/orchestrator/compaction.js +35 -15
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +74 -32
- package/dist/src/orchestrator/council-request.d.ts +49 -0
- package/dist/src/orchestrator/council-request.js +62 -0
- package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
- package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
- package/dist/src/orchestrator/error-utils.d.ts +29 -0
- package/dist/src/orchestrator/error-utils.js +132 -24
- package/dist/src/orchestrator/grounding-check.js +39 -1
- package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
- package/dist/src/orchestrator/interactive-pause.js +36 -0
- package/dist/src/orchestrator/message-processor.d.ts +4 -0
- package/dist/src/orchestrator/message-processor.js +268 -41
- package/dist/src/orchestrator/orchestrator.d.ts +64 -3
- package/dist/src/orchestrator/orchestrator.js +823 -120
- package/dist/src/orchestrator/preprocessor.js +3 -3
- package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
- package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
- package/dist/src/orchestrator/prompts.js +17 -17
- package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
- package/dist/src/orchestrator/reactive-delegation.js +59 -0
- package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
- package/dist/src/orchestrator/retry-classifier.js +46 -2
- package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
- package/dist/src/orchestrator/safety-askcard.js +5 -2
- package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
- package/dist/src/orchestrator/safety-intercept.js +62 -0
- package/dist/src/orchestrator/scope-reminder.js +1 -1
- package/dist/src/orchestrator/session-experience.d.ts +2 -1
- package/dist/src/orchestrator/session-experience.js +2 -1
- package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
- package/dist/src/orchestrator/should-run-gate.js +18 -0
- package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
- package/dist/src/orchestrator/stall-watchdog.js +65 -10
- package/dist/src/orchestrator/stream-runner.d.ts +13 -3
- package/dist/src/orchestrator/stream-runner.js +115 -49
- package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-cap.js +16 -1
- package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
- package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
- package/dist/src/orchestrator/subagent-compactor.js +126 -15
- package/dist/src/orchestrator/tool-engine.d.ts +41 -0
- package/dist/src/orchestrator/tool-engine.js +846 -66
- package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
- package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
- package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
- package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
- package/dist/src/orchestrator/turn-watchdog.js +84 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +6 -4
- package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
- package/dist/src/pil/cheap-model-playbook.js +5 -1
- package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
- package/dist/src/pil/cheap-model-workbooks.js +1 -1
- package/dist/src/pil/discovery-types.d.ts +1 -0
- package/dist/src/pil/discovery.d.ts +1 -1
- package/dist/src/pil/discovery.js +18 -13
- package/dist/src/pil/layer1-intent.d.ts +18 -6
- package/dist/src/pil/layer1-intent.js +66 -757
- package/dist/src/pil/layer15-context-scan.js +15 -1
- package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
- package/dist/src/pil/layer1_5-complexity-size.js +31 -5
- package/dist/src/pil/layer3-ee-injection.js +23 -8
- package/dist/src/pil/layer4-gsd.js +69 -16
- package/dist/src/pil/layer5-context.js +7 -3
- package/dist/src/pil/layer6-output.d.ts +23 -0
- package/dist/src/pil/layer6-output.js +5 -1
- package/dist/src/pil/llm-classify.d.ts +111 -5
- package/dist/src/pil/llm-classify.js +421 -189
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +8 -0
- package/dist/src/pil/pipeline.js +36 -2
- package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
- package/dist/src/pil/repo-grounding-probe.js +136 -0
- package/dist/src/pil/repo-structure-hints.d.ts +7 -0
- package/dist/src/pil/repo-structure-hints.js +45 -0
- package/dist/src/pil/response-tools.js +5 -3
- package/dist/src/pil/schema.d.ts +1 -0
- package/dist/src/pil/schema.js +2 -0
- package/dist/src/pil/types.d.ts +18 -0
- package/dist/src/playbook/directives.d.ts +4 -0
- package/dist/src/playbook/directives.js +17 -5
- package/dist/src/product-loop/artifact-io.js +4 -0
- package/dist/src/product-loop/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- package/dist/src/product-loop/criteria-seed.d.ts +51 -0
- package/dist/src/product-loop/criteria-seed.js +200 -0
- package/dist/src/product-loop/discovery-context-format.js +3 -1
- package/dist/src/product-loop/discovery-ecosystem.js +4 -1
- package/dist/src/product-loop/discovery-interview.d.ts +9 -0
- package/dist/src/product-loop/discovery-interview.js +60 -12
- package/dist/src/product-loop/discovery-recommender.js +2 -1
- package/dist/src/product-loop/discovery-schema.js +19 -2
- package/dist/src/product-loop/discovery-triage.d.ts +23 -0
- package/dist/src/product-loop/discovery-triage.js +109 -0
- package/dist/src/product-loop/gather.js +150 -2
- package/dist/src/product-loop/ideal-trace.d.ts +7 -0
- package/dist/src/product-loop/ideal-trace.js +64 -0
- package/dist/src/product-loop/index.d.ts +13 -1
- package/dist/src/product-loop/index.js +340 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +330 -106
- package/dist/src/product-loop/phase-plan.d.ts +21 -0
- package/dist/src/product-loop/phase-plan.js +81 -6
- package/dist/src/product-loop/phase-rituals.d.ts +3 -0
- package/dist/src/product-loop/phase-rituals.js +8 -3
- package/dist/src/product-loop/phase-runner.js +39 -12
- package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
- package/dist/src/product-loop/plan-adherence-review.js +144 -0
- package/dist/src/product-loop/sprint-runner.d.ts +173 -0
- package/dist/src/product-loop/sprint-runner.js +863 -19
- package/dist/src/product-loop/types.d.ts +61 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- package/dist/src/providers/anthropic.d.ts +9 -8
- package/dist/src/providers/anthropic.js +13 -47
- package/dist/src/providers/auth/browser-flow.d.ts +1 -1
- package/dist/src/providers/auth/browser-flow.js +1 -1
- package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
- package/dist/src/providers/auth/grok-oauth.js +30 -5
- package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
- package/dist/src/providers/auth/openai-oauth.js +15 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.d.ts +9 -9
- package/dist/src/providers/auth/token-store.js +8 -67
- package/dist/src/providers/auth/types.d.ts +9 -1
- package/dist/src/providers/auth/types.js +1 -1
- package/dist/src/providers/capabilities.d.ts +24 -5
- package/dist/src/providers/capabilities.js +42 -24
- package/dist/src/providers/endpoints.d.ts +2 -2
- package/dist/src/providers/endpoints.js +11 -10
- package/dist/src/providers/env-store.d.ts +17 -0
- package/dist/src/providers/env-store.js +228 -0
- package/dist/src/providers/keychain.d.ts +22 -18
- package/dist/src/providers/keychain.js +127 -140
- package/dist/src/providers/mcp-vision-bridge.js +56 -146
- package/dist/src/providers/openai-compatible.js +8 -1
- package/dist/src/providers/pricing.d.ts +2 -2
- package/dist/src/providers/pricing.js +3 -13
- package/dist/src/providers/runtime.d.ts +43 -3
- package/dist/src/providers/runtime.js +88 -14
- package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
- package/dist/src/providers/strategies/base.strategy.js +24 -1
- package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
- package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
- package/dist/src/providers/strategies/registry.js +4 -4
- package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
- package/dist/src/providers/strategies/thinking-mode.js +288 -1
- package/dist/src/providers/strategies/xai.strategy.js +27 -0
- package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
- package/dist/src/providers/strategies/zai.strategy.js +44 -0
- package/dist/src/providers/types.d.ts +5 -6
- package/dist/src/providers/types.js +2 -2
- package/dist/src/providers/vision-backend.d.ts +47 -0
- package/dist/src/providers/vision-backend.js +258 -0
- package/dist/src/providers/vision-proxy.d.ts +22 -9
- package/dist/src/providers/vision-proxy.js +63 -132
- package/dist/src/providers/warm.d.ts +65 -0
- package/dist/src/providers/warm.js +145 -0
- package/dist/src/providers/wire-debug.js +95 -0
- package/dist/src/router/decide.d.ts +13 -0
- package/dist/src/router/decide.js +138 -36
- package/dist/src/router/peak-hour.d.ts +38 -0
- package/dist/src/router/peak-hour.js +107 -0
- package/dist/src/router/step-router.js +3 -2
- package/dist/src/router/warm.js +4 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +26 -0
- package/dist/src/scaffold/point-to-existing.d.ts +21 -0
- package/dist/src/scaffold/point-to-existing.js +25 -0
- package/dist/src/self-qa/agentic-loop.js +6 -5
- package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
- package/dist/src/{ui/state → state}/active-run.js +21 -0
- package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
- package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
- package/dist/src/state/turn-trace.d.ts +43 -0
- package/dist/src/state/turn-trace.js +32 -0
- package/dist/src/storage/db.js +2 -1
- package/dist/src/storage/index.d.ts +1 -1
- package/dist/src/storage/index.js +1 -1
- package/dist/src/storage/interaction-log.d.ts +1 -1
- package/dist/src/storage/migrations.js +71 -1
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +78 -21
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +340 -15
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/git-safety.d.ts +19 -0
- package/dist/src/tools/git-safety.js +168 -0
- package/dist/src/tools/native-tools.d.ts +1 -1
- package/dist/src/tools/native-tools.js +81 -1
- package/dist/src/tools/registry.d.ts +20 -0
- package/dist/src/tools/registry.js +576 -23
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +147 -4
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
- package/dist/src/ui/components/agent-rail-activities.js +47 -0
- package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
- package/dist/src/ui/components/bubble-body-guard.js +50 -0
- package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
- package/dist/src/ui/components/compact-progress-card.js +42 -0
- package/dist/src/ui/components/context-rail.d.ts +26 -0
- package/dist/src/ui/components/context-rail.js +33 -0
- package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
- package/dist/src/ui/components/council-conclusion-card.js +420 -0
- package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
- package/dist/src/ui/components/council-debate-pill.js +34 -0
- package/dist/src/ui/components/council-info-card.js +2 -2
- package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
- package/dist/src/ui/components/council-leader-bubble.js +21 -11
- package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
- package/dist/src/ui/components/council-message-bubble.js +16 -15
- package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
- package/dist/src/ui/components/council-phase-timeline.js +66 -17
- package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
- package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
- package/dist/src/ui/components/council-question-card.js +13 -12
- package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
- package/dist/src/ui/components/council-rail-rounds.js +57 -0
- package/dist/src/ui/components/council-round-group.d.ts +38 -0
- package/dist/src/ui/components/council-round-group.js +88 -0
- package/dist/src/ui/components/council-status-list.d.ts +3 -1
- package/dist/src/ui/components/council-status-list.js +36 -24
- package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
- package/dist/src/ui/components/council-synthesis-banner.js +20 -5
- package/dist/src/ui/components/halt-recovery-card.js +9 -5
- package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
- package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
- package/dist/src/ui/components/message-view.d.ts +15 -0
- package/dist/src/ui/components/message-view.js +50 -1
- package/dist/src/ui/components/prompt-box.js +18 -16
- package/dist/src/ui/components/session-tree-card.d.ts +14 -0
- package/dist/src/ui/components/session-tree-card.js +46 -0
- package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
- package/dist/src/ui/components/slash-inline-menu.js +26 -5
- package/dist/src/ui/components/task-list-panel.d.ts +14 -1
- package/dist/src/ui/components/task-list-panel.js +22 -2
- package/dist/src/ui/components/tool-group.d.ts +15 -3
- package/dist/src/ui/components/tool-group.js +69 -11
- package/dist/src/ui/containers/modals-layer.d.ts +4 -2
- package/dist/src/ui/containers/modals-layer.js +2 -2
- package/dist/src/ui/council-harness-event.d.ts +57 -0
- package/dist/src/ui/council-harness-event.js +46 -0
- package/dist/src/ui/heartbeat-debug.d.ts +29 -0
- package/dist/src/ui/heartbeat-debug.js +45 -0
- package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
- package/dist/src/ui/mcp-modal.js +2 -4
- package/dist/src/ui/modals/api-key-modal.js +1 -1
- package/dist/src/ui/modals/connect-modal.js +4 -3
- package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
- package/dist/src/ui/modals/model-picker-modal.js +8 -10
- package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
- package/dist/src/ui/modals/session-picker-modal.js +3 -5
- package/dist/src/ui/picker-providers.d.ts +1 -1
- package/dist/src/ui/picker-providers.js +1 -1
- package/dist/src/ui/primitives/index.d.ts +1 -0
- package/dist/src/ui/primitives/index.js +2 -0
- package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
- package/dist/src/ui/primitives/semantic-primitives.js +81 -0
- package/dist/src/ui/slash/compact.js +5 -7
- package/dist/src/ui/slash/cost.js +1 -1
- package/dist/src/ui/slash/council.js +19 -1
- package/dist/src/ui/slash/debug.d.ts +3 -31
- package/dist/src/ui/slash/debug.js +9 -20
- package/dist/src/ui/slash/ee.js +81 -0
- package/dist/src/ui/slash/ideal.d.ts +6 -2
- package/dist/src/ui/slash/ideal.js +97 -7
- package/dist/src/ui/slash/menu-items.d.ts +7 -0
- package/dist/src/ui/slash/menu-items.js +23 -20
- package/dist/src/ui/slash/registry.d.ts +2 -0
- package/dist/src/ui/slash/registry.js +4 -0
- package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
- package/dist/src/ui/status-bar/cache-hit.js +9 -0
- package/dist/src/ui/status-bar/index.d.ts +1 -1
- package/dist/src/ui/status-bar/index.js +7 -3
- package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
- package/dist/src/ui/status-bar/usd-meter.js +6 -4
- package/dist/src/ui/theme.d.ts +1 -0
- package/dist/src/ui/theme.js +2 -0
- package/dist/src/ui/types.d.ts +7 -0
- package/dist/src/ui/use-app-logic.js +0 -0
- package/dist/src/ui/utils/agent-activities.d.ts +39 -0
- package/dist/src/ui/utils/agent-activities.js +96 -0
- package/dist/src/ui/utils/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
- package/dist/src/ui/utils/group-tool-entries.js +111 -0
- package/dist/src/ui/utils/tool-summary.d.ts +21 -0
- package/dist/src/ui/utils/tool-summary.js +91 -0
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/event-loop-monitor.d.ts +85 -0
- package/dist/src/utils/event-loop-monitor.js +107 -0
- package/dist/src/utils/install-manager.js +2 -1
- package/dist/src/utils/llm-deadline.d.ts +14 -0
- package/dist/src/utils/llm-deadline.js +19 -0
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/loop-profiler.d.ts +102 -0
- package/dist/src/utils/loop-profiler.js +202 -0
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +180 -5
- package/dist/src/utils/settings.js +271 -31
- package/dist/src/utils/side-question.d.ts +1 -2
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/visible-retry.d.ts +11 -0
- package/dist/src/utils/visible-retry.js +10 -1
- package/dist/src/verify/entrypoint.d.ts +1 -1
- package/dist/src/verify/entrypoint.js +52 -17
- package/dist/src/verify/orchestrator.d.ts +1 -1
- package/dist/src/verify/orchestrator.js +20 -3
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +134 -132
- package/dist/src/cli/bw-vault.d.ts +0 -55
- package/dist/src/cli/bw-vault.js +0 -133
- package/dist/src/mcp/ee-tools.d.ts +0 -46
- package/dist/src/mcp/ee-tools.js +0 -193
- package/dist/src/providers/auth/gcloud.d.ts +0 -28
- package/dist/src/providers/auth/gcloud.js +0 -102
- package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
- package/dist/src/providers/auth/gemini-oauth.js +0 -472
- package/dist/src/providers/gemini.d.ts +0 -11
- package/dist/src/providers/gemini.js +0 -45
- package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
- package/dist/src/providers/siliconflow-sse-repair.js +0 -177
- package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
- package/dist/src/providers/strategies/google.strategy.js +0 -174
- package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
- package/dist/src/ui/containers/chat-feed.d.ts +0 -40
- package/dist/src/ui/containers/chat-feed.js +0 -66
|
@@ -19,6 +19,35 @@ import { spawn } from "node:child_process";
|
|
|
19
19
|
import { randomUUID } from "node:crypto";
|
|
20
20
|
import { createServer } from "node:net";
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
|
+
// Internal: teardown-safe stream error guards
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Attach `'error'` listeners to both transport streams so a broken-pipe write
|
|
26
|
+
* (EPIPE / UV_EPIPE -4047 on Windows) or a peer reset (ECONNRESET) during
|
|
27
|
+
* process teardown is logged and swallowed instead of surfacing as an
|
|
28
|
+
* *uncaught* stream error that crashes the whole vitest worker.
|
|
29
|
+
*
|
|
30
|
+
* Root cause of the flake: when the child is killed in `afterAll`, an in-flight
|
|
31
|
+
* `inWrite.write()` (driver sendKey/sendType) or a half-open `outRead` races the
|
|
32
|
+
* child's death. A WritableStream with no `'error'` listener rethrows EPIPE as
|
|
33
|
+
* an unhandled exception — under full-suite load this reliably reproduces on
|
|
34
|
+
* `events.spec.ts` and fails the file even though every assertion passed.
|
|
35
|
+
*
|
|
36
|
+
* Logging (not silent swallow) satisfies the No-Silent-Catch rule — teardown
|
|
37
|
+
* broken-pipe is expected, but a mid-test error still gets a diagnostic line.
|
|
38
|
+
*/
|
|
39
|
+
function attachStreamErrorGuards(inWrite, outRead) {
|
|
40
|
+
const guard = (label) => (err) => {
|
|
41
|
+
// EPIPE / ECONNRESET / ERR_STREAM_DESTROYED are all normal teardown races.
|
|
42
|
+
const code = err?.code ?? "unknown";
|
|
43
|
+
if (code !== "EPIPE" && code !== "ECONNRESET" && code !== "ERR_STREAM_DESTROYED") {
|
|
44
|
+
console.error(`[test-spawn] ${label} stream error (${code}): ${err?.message}`);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
inWrite.on("error", guard("inWrite"));
|
|
48
|
+
outRead.on("error", guard("outRead"));
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
22
51
|
// Internal: Windows named-pipe transport
|
|
23
52
|
// ---------------------------------------------------------------------------
|
|
24
53
|
function makePipeName(role) {
|
|
@@ -143,6 +172,7 @@ async function spawnWindows(args, opts) {
|
|
|
143
172
|
outServer.close();
|
|
144
173
|
};
|
|
145
174
|
proc.once("exit", cleanup);
|
|
175
|
+
attachStreamErrorGuards(inSocket, outSocket);
|
|
146
176
|
return {
|
|
147
177
|
proc,
|
|
148
178
|
inWrite: inSocket, // host writes commands → child reads on MUONROI_HARNESS_IN_PIPE
|
|
@@ -161,6 +191,7 @@ function spawnPosix(args, opts) {
|
|
|
161
191
|
const proc = spawn("bun", ["run", ...args], spawnOptions);
|
|
162
192
|
const outRead = proc.stdio[3];
|
|
163
193
|
const inWrite = proc.stdio[4];
|
|
194
|
+
attachStreamErrorGuards(inWrite, outRead);
|
|
164
195
|
return { proc, inWrite, outRead, cleanup: () => { } };
|
|
165
196
|
}
|
|
166
197
|
// ---------------------------------------------------------------------------
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/chat/chat-keychain.ts
|
|
3
3
|
*
|
|
4
|
-
* Chat-service
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
7
|
-
*
|
|
8
|
-
* Priority: OS keychain (keytar) > environment variable > null.
|
|
9
|
-
* On CLI startup, hydrateChatEnvFromKeychain() populates process.env from
|
|
10
|
-
* keychain for any chat secret not already set in env.
|
|
4
|
+
* Chat-service secret store, keyed by ChatSecretId (Discord, Slack). Backed by
|
|
5
|
+
* the env-store (`.env` file + process.env + Windows registry mirror) — the OS
|
|
6
|
+
* keychain (keytar) has been removed. Reads come straight from process.env.
|
|
11
7
|
*/
|
|
12
8
|
export type ChatSecretId = "discord-token" | "discord-guild-id" | "slack-token" | "slack-team-id";
|
|
13
9
|
export declare function setChatSecret(id: ChatSecretId, value: string): Promise<boolean>;
|
|
14
10
|
export declare function getChatSecret(id: ChatSecretId): Promise<string | null>;
|
|
15
11
|
export declare function deleteChatSecret(id: ChatSecretId): Promise<boolean>;
|
|
16
12
|
/**
|
|
17
|
-
* List all stored chat secret IDs.
|
|
18
|
-
* Note: This only returns secrets stored in OS keychain, not those in env.
|
|
13
|
+
* List all stored chat secret IDs (those present in the environment).
|
|
19
14
|
*/
|
|
20
15
|
export declare function listChatSecrets(): Promise<ChatSecretId[]>;
|
|
21
16
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
17
|
+
* Retained for boot compatibility (index.ts). Chat secrets now live in the
|
|
18
|
+
* environment (loaded from the env-store at startup), so there is nothing to
|
|
19
|
+
* hydrate — this is a no-op.
|
|
25
20
|
*/
|
|
26
21
|
export declare function hydrateChatEnvFromKeychain(): Promise<void>;
|
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/chat/chat-keychain.ts
|
|
3
3
|
*
|
|
4
|
-
* Chat-service
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
7
|
-
*
|
|
8
|
-
* Priority: OS keychain (keytar) > environment variable > null.
|
|
9
|
-
* On CLI startup, hydrateChatEnvFromKeychain() populates process.env from
|
|
10
|
-
* keychain for any chat secret not already set in env.
|
|
4
|
+
* Chat-service secret store, keyed by ChatSecretId (Discord, Slack). Backed by
|
|
5
|
+
* the env-store (`.env` file + process.env + Windows registry mirror) — the OS
|
|
6
|
+
* keychain (keytar) has been removed. Reads come straight from process.env.
|
|
11
7
|
*/
|
|
8
|
+
import { clearEnvVar, persistEnvVar } from "../providers/env-store.js";
|
|
12
9
|
import { redactor } from "../utils/redactor.js";
|
|
13
|
-
const KEYCHAIN_SERVICE = "muonroi-cli";
|
|
14
|
-
const ACCOUNT_BY_CHAT = {
|
|
15
|
-
"discord-token": "chat-discord-token",
|
|
16
|
-
"discord-guild-id": "chat-discord-guild-id",
|
|
17
|
-
"slack-token": "chat-slack-token",
|
|
18
|
-
"slack-team-id": "chat-slack-team-id",
|
|
19
|
-
};
|
|
20
10
|
const ENV_BY_CHAT = {
|
|
21
11
|
"discord-token": "MUONROI_DISCORD_TOKEN",
|
|
22
12
|
"discord-guild-id": "MUONROI_DISCORD_GUILD_ID",
|
|
@@ -24,107 +14,50 @@ const ENV_BY_CHAT = {
|
|
|
24
14
|
"slack-team-id": "MUONROI_SLACK_TEAM_ID",
|
|
25
15
|
};
|
|
26
16
|
const MIN_LEN = 8; // guild IDs are short (18-19 digits); tokens ~70 chars. Use 8 as floor.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return (await import("keytar"));
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
17
|
+
function isTokenSecret(id) {
|
|
18
|
+
return id === "discord-token" || id === "slack-token";
|
|
34
19
|
}
|
|
35
20
|
export async function setChatSecret(id, value) {
|
|
36
21
|
if (!value || value.length < MIN_LEN) {
|
|
37
22
|
throw new Error(`Value for chat secret '${id}' is too short (< ${MIN_LEN} chars).`);
|
|
38
23
|
}
|
|
39
|
-
|
|
40
|
-
if (!kt?.setPassword)
|
|
41
|
-
return false;
|
|
42
|
-
// Enroll token values in redactor, but not IDs (they are not secrets)
|
|
43
|
-
if (id === "discord-token" || id === "slack-token") {
|
|
24
|
+
if (isTokenSecret(id))
|
|
44
25
|
redactor.enrollSecret(value);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
await kt.setPassword(KEYCHAIN_SERVICE, ACCOUNT_BY_CHAT[id], value);
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
// Runtime backend failure (e.g. Linux without libsecret or no active secret service).
|
|
52
|
-
if (process.env.DEBUG || process.env.MUONROI_DEBUG_KEYCHAIN) {
|
|
53
|
-
console.error(`[chat-keychain] setPassword backend error for ${id}:`, err?.message || err);
|
|
54
|
-
}
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
26
|
+
persistEnvVar(ENV_BY_CHAT[id], value);
|
|
27
|
+
return true;
|
|
57
28
|
}
|
|
58
29
|
export async function getChatSecret(id) {
|
|
59
|
-
const kt = await loadKeytar();
|
|
60
|
-
if (kt) {
|
|
61
|
-
try {
|
|
62
|
-
const v = await kt.getPassword(KEYCHAIN_SERVICE, ACCOUNT_BY_CHAT[id]);
|
|
63
|
-
if (v && v.length >= MIN_LEN) {
|
|
64
|
-
// Enroll in redactor only for token values
|
|
65
|
-
if (id === "discord-token" || id === "slack-token") {
|
|
66
|
-
redactor.enrollSecret(v);
|
|
67
|
-
}
|
|
68
|
-
return v;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
/* keytar backend failure → fall through to env */
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
30
|
const envKey = process.env[ENV_BY_CHAT[id]];
|
|
76
31
|
if (envKey && envKey.length >= MIN_LEN) {
|
|
77
|
-
|
|
78
|
-
if (id === "discord-token" || id === "slack-token") {
|
|
32
|
+
if (isTokenSecret(id))
|
|
79
33
|
redactor.enrollSecret(envKey);
|
|
80
|
-
}
|
|
81
34
|
return envKey;
|
|
82
35
|
}
|
|
83
36
|
return null;
|
|
84
37
|
}
|
|
85
38
|
export async function deleteChatSecret(id) {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
try {
|
|
90
|
-
return await kt.deletePassword(KEYCHAIN_SERVICE, ACCOUNT_BY_CHAT[id]);
|
|
91
|
-
}
|
|
92
|
-
catch (err) {
|
|
93
|
-
if (process.env.DEBUG || process.env.MUONROI_DEBUG_KEYCHAIN) {
|
|
94
|
-
console.error(`[chat-keychain] deletePassword backend error for ${id}:`, err?.message || err);
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
39
|
+
const had = !!process.env[ENV_BY_CHAT[id]];
|
|
40
|
+
clearEnvVar(ENV_BY_CHAT[id]);
|
|
41
|
+
return had;
|
|
98
42
|
}
|
|
99
43
|
/**
|
|
100
|
-
* List all stored chat secret IDs.
|
|
101
|
-
* Note: This only returns secrets stored in OS keychain, not those in env.
|
|
44
|
+
* List all stored chat secret IDs (those present in the environment).
|
|
102
45
|
*/
|
|
103
46
|
export async function listChatSecrets() {
|
|
104
47
|
const ids = ["discord-token", "discord-guild-id", "slack-token", "slack-team-id"];
|
|
105
48
|
const stored = [];
|
|
106
49
|
for (const id of ids) {
|
|
107
|
-
|
|
108
|
-
if (v) {
|
|
50
|
+
if (await getChatSecret(id))
|
|
109
51
|
stored.push(id);
|
|
110
|
-
}
|
|
111
52
|
}
|
|
112
53
|
return stored;
|
|
113
54
|
}
|
|
114
55
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
56
|
+
* Retained for boot compatibility (index.ts). Chat secrets now live in the
|
|
57
|
+
* environment (loaded from the env-store at startup), so there is nothing to
|
|
58
|
+
* hydrate — this is a no-op.
|
|
118
59
|
*/
|
|
119
60
|
export async function hydrateChatEnvFromKeychain() {
|
|
120
|
-
|
|
121
|
-
for (const id of ids) {
|
|
122
|
-
const envName = ENV_BY_CHAT[id];
|
|
123
|
-
if (process.env[envName])
|
|
124
|
-
continue; // env wins
|
|
125
|
-
const v = await getChatSecret(id);
|
|
126
|
-
if (v)
|
|
127
|
-
process.env[envName] = v;
|
|
128
|
-
}
|
|
61
|
+
// Intentional no-op: env-store already populated process.env at startup.
|
|
129
62
|
}
|
|
130
63
|
//# sourceMappingURL=chat-keychain.js.map
|
|
@@ -9,7 +9,7 @@ import { A, captureKey, divider, enterRawMode, hiddenPrompt, maskKey } from "./t
|
|
|
9
9
|
* until their integration is hardened — the router can still target them
|
|
10
10
|
* programmatically. To re-expose one, add its id here.
|
|
11
11
|
*/
|
|
12
|
-
const VISIBLE_PROVIDERS = ["deepseek", "
|
|
12
|
+
const VISIBLE_PROVIDERS = ["deepseek", "zai", "opencode-go", "xai"];
|
|
13
13
|
const ALL_PROVIDERS = [...VISIBLE_PROVIDERS, "ollama"];
|
|
14
14
|
void KEYCHAIN_PROVIDER_IDS;
|
|
15
15
|
async function loadRows() {
|
|
@@ -35,6 +35,16 @@ export interface CostForensicsSummary {
|
|
|
35
35
|
totalCostUsd: number;
|
|
36
36
|
cacheHitRatio: number;
|
|
37
37
|
peakSingleCallInput: number;
|
|
38
|
+
/**
|
|
39
|
+
* Peak FRESH (uncached) input on any single usage event — `max(input -
|
|
40
|
+
* cacheRead)`. This is the cap-escape discriminator: `task`/`council` rows
|
|
41
|
+
* store `totalUsage` AGGREGATED across a streamText call's internal steps, so
|
|
42
|
+
* a high `peakSingleCallInput` on those sources is usually cached-prefix reuse
|
|
43
|
+
* across steps (high cache hit), NOT a single call that breached the cap. A
|
|
44
|
+
* genuine cold cap-escape sends >cap FRESH tokens in one call, which shows up
|
|
45
|
+
* here regardless of source.
|
|
46
|
+
*/
|
|
47
|
+
peakSingleCallFresh: number;
|
|
38
48
|
events: CostForensicsRow[];
|
|
39
49
|
/** Anti-mù counters for this session (null when none recorded). */
|
|
40
50
|
experience: SessionExperienceCounts | null;
|
|
@@ -83,6 +83,7 @@ export function collectCostForensics(sessionId) {
|
|
|
83
83
|
let totalCacheCreation = 0;
|
|
84
84
|
let totalCostMicros = 0;
|
|
85
85
|
let peakSingleCallInput = 0;
|
|
86
|
+
let peakSingleCallFresh = 0;
|
|
86
87
|
for (const e of events) {
|
|
87
88
|
totalInput += e.inputTokens;
|
|
88
89
|
totalOutput += e.outputTokens;
|
|
@@ -91,6 +92,9 @@ export function collectCostForensics(sessionId) {
|
|
|
91
92
|
totalCostMicros += e.costMicros;
|
|
92
93
|
if (e.inputTokens > peakSingleCallInput)
|
|
93
94
|
peakSingleCallInput = e.inputTokens;
|
|
95
|
+
const fresh = Math.max(0, e.inputTokens - e.cacheReadTokens);
|
|
96
|
+
if (fresh > peakSingleCallFresh)
|
|
97
|
+
peakSingleCallFresh = fresh;
|
|
94
98
|
}
|
|
95
99
|
const cacheable = totalInput;
|
|
96
100
|
const cacheHitRatio = cacheable > 0 ? totalCacheRead / cacheable : 0;
|
|
@@ -106,6 +110,7 @@ export function collectCostForensics(sessionId) {
|
|
|
106
110
|
totalCostUsd: totalCostMicros / 1_000_000,
|
|
107
111
|
cacheHitRatio,
|
|
108
112
|
peakSingleCallInput,
|
|
113
|
+
peakSingleCallFresh,
|
|
109
114
|
events,
|
|
110
115
|
experience: selectSessionExperience(sessionId),
|
|
111
116
|
};
|
|
@@ -159,7 +164,8 @@ export function printCostForensics(summary, opts = {}) {
|
|
|
159
164
|
w(`Total output tokens: ${formatNum(summary.totalOutput)}`);
|
|
160
165
|
w(`Cache read tokens: ${formatNum(summary.totalCacheRead)} (${formatPct(summary.cacheHitRatio)} of input)`);
|
|
161
166
|
w(`Cache create tokens: ${formatNum(summary.totalCacheCreation)}`);
|
|
162
|
-
w(`Peak single call: ${formatNum(summary.peakSingleCallInput)} input`
|
|
167
|
+
w(`Peak single call: ${formatNum(summary.peakSingleCallInput)} input ` +
|
|
168
|
+
`(${formatNum(summary.peakSingleCallFresh)} fresh)`);
|
|
163
169
|
w(`Estimated cost: $${summary.totalCostUsd.toFixed(4)}`);
|
|
164
170
|
// Cache-cadence diagnostic — surface fast-loop prompt-cache latency loss.
|
|
165
171
|
const cadence = computeCacheCadence(summary.events);
|
|
@@ -199,8 +205,17 @@ export function printCostForensics(summary, opts = {}) {
|
|
|
199
205
|
}
|
|
200
206
|
// Acceptance hints — surface anomalies relative to Phase A/B/C targets.
|
|
201
207
|
const anomalies = [];
|
|
202
|
-
|
|
203
|
-
|
|
208
|
+
// Phase B breach = a single call that sent >80K FRESH (uncached) tokens.
|
|
209
|
+
// Use FRESH, not raw input: `task`/`council` usage rows store `totalUsage`
|
|
210
|
+
// aggregated across a streamText call's internal steps, so a high raw input
|
|
211
|
+
// there is normally cached-prefix reuse across steps (high cache hit), NOT a
|
|
212
|
+
// cold cap breach. Evidence: session 6f17a13c1591 peaked at 378,613 raw input
|
|
213
|
+
// but only 54,389 fresh (324,224 cache-read) — aggregate reuse, no breach.
|
|
214
|
+
if (summary.peakSingleCallFresh > 80_000) {
|
|
215
|
+
anomalies.push(`peak single-call FRESH input ${formatNum(summary.peakSingleCallFresh)} > 80,000 — sub-agent cap may not have kicked in (Phase B target breach)`);
|
|
216
|
+
}
|
|
217
|
+
else if (summary.peakSingleCallInput > 80_000) {
|
|
218
|
+
anomalies.push(`peak single-call input ${formatNum(summary.peakSingleCallInput)} > 80,000 but only ${formatNum(summary.peakSingleCallFresh)} FRESH — aggregate multi-step reuse (task/council totalUsage), NOT a cap breach`);
|
|
204
219
|
}
|
|
205
220
|
if (summary.events.some((e) => e.messageSeq === null && e.source === "message")) {
|
|
206
221
|
anomalies.push(`some 'message' events have NULL message_seq — Phase A5 message write-ahead bypassed (check persistMessageWriteAhead wiring)`);
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Format (JSON):
|
|
8
8
|
* { v:1, kdf:"scrypt", salt:hex, iv:hex, tag:hex, ct:base64 }
|
|
9
9
|
*
|
|
10
|
-
* Plaintext payload (JSON): { providers: { deepseek: "sk-...",
|
|
10
|
+
* Plaintext payload (JSON): { providers: { deepseek: "sk-...", xai: "xai-..." } }
|
|
11
11
|
*
|
|
12
12
|
* Crypto:
|
|
13
13
|
* - scrypt(passphrase, salt, 32) → 256-bit key
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Format (JSON):
|
|
8
8
|
* { v:1, kdf:"scrypt", salt:hex, iv:hex, tag:hex, ct:base64 }
|
|
9
9
|
*
|
|
10
|
-
* Plaintext payload (JSON): { providers: { deepseek: "sk-...",
|
|
10
|
+
* Plaintext payload (JSON): { providers: { deepseek: "sk-...", xai: "xai-..." } }
|
|
11
11
|
*
|
|
12
12
|
* Crypto:
|
|
13
13
|
* - scrypt(passphrase, salt, 32) → 256-bit key
|
package/dist/src/cli/keys.d.ts
CHANGED
|
@@ -1,62 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `muonroi-cli keys` subcommand group.
|
|
3
3
|
*
|
|
4
|
-
* Manages provider API keys via the
|
|
5
|
-
*
|
|
6
|
-
* keychain → env → settings.json priority chain in providers/keychain.ts.
|
|
7
|
-
*
|
|
8
|
-
* On Linux without libsecret + an active secret service (gnome-keyring etc.),
|
|
9
|
-
* or in headless sessions, keychain writes return false and callers fall back
|
|
10
|
-
* to advising environment variables (which are still honored at runtime).
|
|
4
|
+
* Manages provider API keys via the env-store. Keys are read by the CLI through
|
|
5
|
+
* the env-store → env → settings.json priority chain in providers/keychain.ts.
|
|
11
6
|
*
|
|
12
7
|
* Subcommands:
|
|
13
|
-
* keys set <provider> — interactive prompt, stores
|
|
8
|
+
* keys set <provider> — interactive prompt, stores the key
|
|
14
9
|
* keys list — show masked keys currently stored
|
|
15
10
|
* keys delete <provider> — remove a stored key
|
|
16
|
-
* keys
|
|
17
|
-
* keys
|
|
18
|
-
* keys login <provider> — OAuth login (openai,
|
|
19
|
-
* keys logout <provider> — OAuth logout (openai,
|
|
11
|
+
* keys export <file> — export keys to an encrypted portable bundle
|
|
12
|
+
* keys import <file> — import an encrypted bundle
|
|
13
|
+
* keys login <provider> — OAuth login (openai, xai)
|
|
14
|
+
* keys logout <provider> — OAuth logout (openai, xai)
|
|
20
15
|
*/
|
|
21
16
|
import { type ChatSecretId } from "../chat/chat-keychain.js";
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
export declare function runKeysSet(provider: string, options?: KeysSetOptions): Promise<void>;
|
|
27
|
-
export declare function runMcpKeysSet(id: string, options?: KeysSetOptions): Promise<void>;
|
|
17
|
+
export type KeysSetOptions = Record<string, never>;
|
|
18
|
+
export declare function runKeysSet(provider: string, _options?: KeysSetOptions): Promise<void>;
|
|
19
|
+
export declare function runMcpKeysSet(id: string, _options?: KeysSetOptions): Promise<void>;
|
|
28
20
|
export declare function runKeysList(): Promise<void>;
|
|
29
21
|
export declare function runKeysDelete(provider: string): Promise<void>;
|
|
30
22
|
export declare function runKeysExport(filePath: string): Promise<void>;
|
|
31
23
|
export declare function runKeysImport(filePath: string): Promise<void>;
|
|
32
|
-
interface BwImportOptions {
|
|
33
|
-
providers?: string[];
|
|
34
|
-
itemPrefix?: string;
|
|
35
|
-
}
|
|
36
|
-
export declare function runKeysImportBw(opts?: BwImportOptions): Promise<void>;
|
|
37
|
-
interface McpBwImportOptions {
|
|
38
|
-
keys?: string[];
|
|
39
|
-
itemPrefix?: string;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Import MCP secrets (e.g. Tavily) from a Bitwarden vault into the OS
|
|
43
|
-
* keychain via mcp-keychain. Vault items are expected at `<prefix><id>` —
|
|
44
|
-
* default prefix `muonroi-cli/`. The key value is read from the item's
|
|
45
|
-
* notes field, mirroring the provider import-bw flow.
|
|
46
|
-
*/
|
|
47
|
-
export declare function runMcpImportBw(opts?: McpBwImportOptions): Promise<void>;
|
|
48
24
|
export declare function runChatKeySet(id: ChatSecretId, value: string): Promise<void>;
|
|
49
|
-
interface ChatBwImportOptions {
|
|
50
|
-
ids?: ChatSecretId[];
|
|
51
|
-
itemPrefix?: string;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Import chat secrets (discord-token, discord-guild-id, slack-token, slack-team-id)
|
|
55
|
-
* from a Bitwarden vault into the OS keychain. Vault items are expected at
|
|
56
|
-
* `<prefix><id>` — default prefix `muonroi-cli/chat-`. The value is read from
|
|
57
|
-
* the item's notes field, mirroring the provider/MCP import-bw flow.
|
|
58
|
-
*/
|
|
59
|
-
export declare function runChatImportBw(opts?: ChatBwImportOptions): Promise<void>;
|
|
60
25
|
/**
|
|
61
26
|
* `muonroi-cli keys login <provider>`
|
|
62
27
|
*
|
|
@@ -74,5 +39,3 @@ export declare function runKeysLogin(provider: string): Promise<void>;
|
|
|
74
39
|
* through the OAuth registry — no provider branching.
|
|
75
40
|
*/
|
|
76
41
|
export declare function runKeysLogout(provider: string): Promise<void>;
|
|
77
|
-
export declare function runKeysCleanupSettings(): Promise<void>;
|
|
78
|
-
export {};
|