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
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
*
|
|
25
25
|
* Override the push gate with `MUONROI_ALLOW_PUSH_ON_RED=1`.
|
|
26
26
|
*/
|
|
27
|
+
import { spawnSync } from "node:child_process";
|
|
27
28
|
import * as fs from "node:fs";
|
|
28
29
|
import * as path from "node:path";
|
|
29
30
|
import { isVerificationCommand } from "../orchestrator/tool-args-hash.js";
|
|
@@ -216,6 +217,173 @@ export function checkSensitiveStaging(cwd) {
|
|
|
216
217
|
"To bypass this gate (not recommended), set MUONROI_ALLOW_BROAD_STAGE=1.";
|
|
217
218
|
return { blocked: true, sensitive, message };
|
|
218
219
|
}
|
|
220
|
+
// ── Destructive-op guard (2026-07-12) ──────────────────────────────────────
|
|
221
|
+
//
|
|
222
|
+
// Motivation: an autonomous /ideal plan-adherence fix sub-agent ran
|
|
223
|
+
// `git checkout -- <files>` + committed the result, silently discarding the
|
|
224
|
+
// user's UNCOMMITTED, unrelated working-tree changes (a whole set of harness
|
|
225
|
+
// fixes). No existing guard caught it. This guard classifies commands that
|
|
226
|
+
// irreversibly discard uncommitted work and blocks them PRE-EXECUTION when
|
|
227
|
+
// there is actually work at risk. Routed as the `destructive-revert` safety
|
|
228
|
+
// kind: interactive → askcard (allow-once/block, never auto-allow even in
|
|
229
|
+
// yolo); headless/autonomous → hard-block. Escape hatch:
|
|
230
|
+
// MUONROI_ALLOW_DESTRUCTIVE_REVERT=1 (user-set, logged like the other gates).
|
|
231
|
+
// `git checkout … -- ` (discard paths) OR `git checkout .` (discard all).
|
|
232
|
+
const CHECKOUT_DISCARD_RE = /\bgit\b[^|&;\n]*[ \t]checkout\b(?:[^|&;\n]*[ \t]--(?:[ \t]|$)|[ \t]+\.(?=[ \t]|$))/;
|
|
233
|
+
// `git restore …` discards the working tree by default. `git restore --staged`
|
|
234
|
+
// WITHOUT `--worktree`/`-W` only unstages (non-destructive) — exempt that.
|
|
235
|
+
const RESTORE_RE = /\bgit\b[^|&;\n]*[ \t]restore\b/;
|
|
236
|
+
const RESTORE_STAGED_RE = /[ \t]--staged\b/;
|
|
237
|
+
const RESTORE_WORKTREE_RE = /[ \t](?:--worktree\b|-[a-z]*W)/;
|
|
238
|
+
// `git reset --hard` throws away all uncommitted changes.
|
|
239
|
+
const RESET_HARD_RE = /\bgit\b[^|&;\n]*[ \t]reset\b[^|&;\n]*[ \t]--hard\b/;
|
|
240
|
+
// `git clean -f[d][x]` deletes untracked files.
|
|
241
|
+
const CLEAN_FORCE_RE = /\bgit\b[^|&;\n]*[ \t]clean\b[^|&;\n]*[ \t]-[a-eg-wyz]*f/;
|
|
242
|
+
// `git stash drop` / `git stash clear` destroy stashed work.
|
|
243
|
+
const STASH_DROP_RE = /\bgit\b[^|&;\n]*[ \t]stash[ \t]+(?:drop|clear)\b/;
|
|
244
|
+
// `rm` (not rmdir) — targets checked against git tracking below.
|
|
245
|
+
const RM_RE = /(?:^|[|&;\n]|\s)rm\b(?!dir)/;
|
|
246
|
+
export function analyzeDestructiveGit(command) {
|
|
247
|
+
const c = stripQuoted(command);
|
|
248
|
+
if (RESET_HARD_RE.test(c))
|
|
249
|
+
return { kind: "reset-hard", untrackedRisk: false };
|
|
250
|
+
if (CHECKOUT_DISCARD_RE.test(c))
|
|
251
|
+
return { kind: "checkout-discard", untrackedRisk: false };
|
|
252
|
+
if (RESTORE_RE.test(c)) {
|
|
253
|
+
const stagedOnly = RESTORE_STAGED_RE.test(c) && !RESTORE_WORKTREE_RE.test(c);
|
|
254
|
+
if (!stagedOnly)
|
|
255
|
+
return { kind: "restore", untrackedRisk: false };
|
|
256
|
+
}
|
|
257
|
+
if (CLEAN_FORCE_RE.test(c))
|
|
258
|
+
return { kind: "clean", untrackedRisk: true };
|
|
259
|
+
if (STASH_DROP_RE.test(c))
|
|
260
|
+
return { kind: "stash-drop", untrackedRisk: false };
|
|
261
|
+
return { kind: null, untrackedRisk: false };
|
|
262
|
+
}
|
|
263
|
+
function git(cwd, args) {
|
|
264
|
+
try {
|
|
265
|
+
const r = spawnSync("git", args, { cwd, encoding: "utf8", timeout: 8000, maxBuffer: 8 * 1024 * 1024 });
|
|
266
|
+
return (r.stdout ?? "").trim();
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return "";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** Working-tree paths that a destructive command would discard (best-effort). */
|
|
273
|
+
function atRiskPaths(cwd, untrackedRisk) {
|
|
274
|
+
// NOTE: read raw stdout — do NOT trim the whole output. Porcelain v1 lines
|
|
275
|
+
// are "XY<space>PATH" where XY is 2 chars; a global trim would eat the leading
|
|
276
|
+
// space of a " M file" line and shift the path parse by one character.
|
|
277
|
+
let raw;
|
|
278
|
+
try {
|
|
279
|
+
const r = spawnSync("git", ["status", "--porcelain"], {
|
|
280
|
+
cwd,
|
|
281
|
+
encoding: "utf8",
|
|
282
|
+
timeout: 8000,
|
|
283
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
284
|
+
});
|
|
285
|
+
raw = r.stdout ?? "";
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
const out = [];
|
|
291
|
+
for (const line of raw.split("\n")) {
|
|
292
|
+
if (line.length < 4)
|
|
293
|
+
continue;
|
|
294
|
+
const xy = line.slice(0, 2);
|
|
295
|
+
const file = line.slice(3).trim();
|
|
296
|
+
const isUntracked = xy === "??";
|
|
297
|
+
if (untrackedRisk ? isUntracked : !isUntracked && xy !== "!!")
|
|
298
|
+
out.push(file);
|
|
299
|
+
}
|
|
300
|
+
return out;
|
|
301
|
+
}
|
|
302
|
+
/** Extract rm target tokens (non-flag args) from a single-clause rm command. */
|
|
303
|
+
function rmTargets(command) {
|
|
304
|
+
const c = stripQuoted(command);
|
|
305
|
+
const m = c.match(/(?:^|[|&;\n]|\s)rm\b(?!dir)([^|&;\n]*)/);
|
|
306
|
+
if (!m)
|
|
307
|
+
return [];
|
|
308
|
+
return m[1]
|
|
309
|
+
.split(/\s+/)
|
|
310
|
+
.map((t) => t.trim())
|
|
311
|
+
.filter((t) => t.length > 0 && !t.startsWith("-") && t !== '""' && t !== "''");
|
|
312
|
+
}
|
|
313
|
+
/** rm targets that are git-tracked (file directly, or a dir containing tracked files). */
|
|
314
|
+
function rmTrackedTargets(cwd, command) {
|
|
315
|
+
const targets = rmTargets(command);
|
|
316
|
+
const tracked = [];
|
|
317
|
+
for (const t of targets) {
|
|
318
|
+
// Tracked file?
|
|
319
|
+
const asFile = spawnSync("git", ["ls-files", "--error-unmatch", t], {
|
|
320
|
+
cwd,
|
|
321
|
+
encoding: "utf8",
|
|
322
|
+
timeout: 6000,
|
|
323
|
+
});
|
|
324
|
+
if (asFile.status === 0) {
|
|
325
|
+
tracked.push(t);
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
// Directory containing tracked files?
|
|
329
|
+
const underDir = git(cwd, ["ls-files", "--", t]);
|
|
330
|
+
if (underDir)
|
|
331
|
+
tracked.push(t);
|
|
332
|
+
}
|
|
333
|
+
return tracked;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Pre-execution guard: block a working-tree-destroying command when it would
|
|
337
|
+
* actually discard uncommitted work. Returns blocked=false (no message) when
|
|
338
|
+
* the command is non-destructive, when nothing is at risk, or when the user set
|
|
339
|
+
* the escape hatch. Deterministic + cheap (a couple of git plumbing calls).
|
|
340
|
+
*/
|
|
341
|
+
export function checkDestructiveOp(command, cwd) {
|
|
342
|
+
if (process.env.MUONROI_ALLOW_DESTRUCTIVE_REVERT === "1") {
|
|
343
|
+
return { blocked: false, kind: null, message: "" };
|
|
344
|
+
}
|
|
345
|
+
const shape = analyzeDestructiveGit(command);
|
|
346
|
+
if (shape.kind) {
|
|
347
|
+
let atRisk;
|
|
348
|
+
if (shape.kind === "stash-drop") {
|
|
349
|
+
atRisk = git(cwd, ["stash", "list"]).split("\n").filter(Boolean);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
atRisk = atRiskPaths(cwd, shape.untrackedRisk);
|
|
353
|
+
}
|
|
354
|
+
if (atRisk.length === 0)
|
|
355
|
+
return { blocked: false, kind: shape.kind, message: "" };
|
|
356
|
+
return { blocked: true, kind: shape.kind, message: destructiveMessage(shape.kind, atRisk) };
|
|
357
|
+
}
|
|
358
|
+
if (RM_RE.test(stripQuoted(command))) {
|
|
359
|
+
const tracked = rmTrackedTargets(cwd, command);
|
|
360
|
+
if (tracked.length > 0) {
|
|
361
|
+
return { blocked: true, kind: "rm-tracked", message: destructiveMessage("rm-tracked", tracked) };
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return { blocked: false, kind: null, message: "" };
|
|
365
|
+
}
|
|
366
|
+
function destructiveMessage(kind, items) {
|
|
367
|
+
const list = items
|
|
368
|
+
.slice(0, 30)
|
|
369
|
+
.map((n) => ` • ${n}`)
|
|
370
|
+
.join("\n");
|
|
371
|
+
const more = items.length > 30 ? `\n … and ${items.length - 30} more` : "";
|
|
372
|
+
const verb = {
|
|
373
|
+
"checkout-discard": "`git checkout` discarding working-tree changes",
|
|
374
|
+
restore: "`git restore` discarding working-tree changes",
|
|
375
|
+
"reset-hard": "`git reset --hard` discarding ALL uncommitted changes",
|
|
376
|
+
clean: "`git clean` deleting untracked files",
|
|
377
|
+
"stash-drop": "`git stash drop/clear` destroying stashed work",
|
|
378
|
+
"rm-tracked": "`rm` deleting git-tracked file(s)",
|
|
379
|
+
};
|
|
380
|
+
return (`BLOCKED: refusing ${verb[kind]} — this irreversibly discards uncommitted work:\n` +
|
|
381
|
+
`${list}${more}\n\n` +
|
|
382
|
+
"These changes are NOT committed and cannot be recovered once discarded. If you did " +
|
|
383
|
+
"not intend to destroy them, leave them alone (they may be the user's unrelated work). " +
|
|
384
|
+
"To keep them, `git add` + `git commit` (or `git stash`) FIRST, then retry. To bypass " +
|
|
385
|
+
"this guard for a genuine, intentional discard, set MUONROI_ALLOW_DESTRUCTIVE_REVERT=1.");
|
|
386
|
+
}
|
|
219
387
|
/**
|
|
220
388
|
* @deprecated Use checkSensitiveStaging() for hard-blocking.
|
|
221
389
|
* Kept for call sites that emit a trailing warning (non-broad-stage contexts).
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { type ToolSet } from "ai";
|
|
22
22
|
/** The native tool names this module registers — used by the MCP-twin dedup. */
|
|
23
|
-
export declare const NATIVE_MUONROI_TOOL_NAMES: readonly ["ee_health", "ee_feedback", "ee_write", "usage_forensics", "lsp_query", "setup_guide", "selfverify_start", "selfverify_status", "selfverify_result", "selfverify_list", "selfverify_cancel"];
|
|
23
|
+
export declare const NATIVE_MUONROI_TOOL_NAMES: readonly ["ee_health", "ee_feedback", "ee_write", "usage_forensics", "lsp_query", "wait_for_diagnostics", "impact_of_change", "lsp_mutation_preview", "setup_guide", "selfverify_start", "selfverify_status", "selfverify_result", "selfverify_list", "selfverify_cancel"];
|
|
24
24
|
export interface NativeToolOpts {
|
|
25
25
|
/** Workspace cwd for lsp_query. Defaults to process.cwd(). */
|
|
26
26
|
cwd?: string;
|
|
@@ -19,9 +19,22 @@
|
|
|
19
19
|
* identical across the two surfaces.
|
|
20
20
|
*/
|
|
21
21
|
import { dynamicTool, jsonSchema } from "ai";
|
|
22
|
-
import { LSP_TOOL_OPERATIONS } from "../lsp/types.js";
|
|
22
|
+
import { LSP_TOOL_OPERATIONS, LspError } from "../lsp/types.js";
|
|
23
23
|
import { getSelfVerifyJobManager } from "../mcp/self-verify-runner.js";
|
|
24
24
|
import { SETUP_GUIDE_TEXT } from "../mcp/setup-guide-text.js";
|
|
25
|
+
/** Map a thrown error to the LspError tagged-union shape. */
|
|
26
|
+
function mapLspError(e) {
|
|
27
|
+
if (e instanceof LspError)
|
|
28
|
+
return e;
|
|
29
|
+
if (e && typeof e === "object" && "kind" in e && "message" in e) {
|
|
30
|
+
return new LspError(e.kind, e.message);
|
|
31
|
+
}
|
|
32
|
+
return new LspError("unknown", e instanceof Error ? e.message : String(e));
|
|
33
|
+
}
|
|
34
|
+
function lspErrLine(e) {
|
|
35
|
+
const err = mapLspError(e);
|
|
36
|
+
return JSON.stringify({ error: err.kind, message: err.message });
|
|
37
|
+
}
|
|
25
38
|
/** The native tool names this module registers — used by the MCP-twin dedup. */
|
|
26
39
|
export const NATIVE_MUONROI_TOOL_NAMES = [
|
|
27
40
|
"ee_health",
|
|
@@ -29,6 +42,9 @@ export const NATIVE_MUONROI_TOOL_NAMES = [
|
|
|
29
42
|
"ee_write",
|
|
30
43
|
"usage_forensics",
|
|
31
44
|
"lsp_query",
|
|
45
|
+
"wait_for_diagnostics",
|
|
46
|
+
"impact_of_change",
|
|
47
|
+
"lsp_mutation_preview",
|
|
32
48
|
"setup_guide",
|
|
33
49
|
"selfverify_start",
|
|
34
50
|
"selfverify_status",
|
|
@@ -86,6 +102,10 @@ export function registerNativeMuonroiTools(tools, opts = {}) {
|
|
|
86
102
|
const { feedbackEE } = await import("../ee/search.js");
|
|
87
103
|
const { sessionRecallLedger } = await import("../ee/recall-ledger.js");
|
|
88
104
|
const result = await feedbackEE(id, collection, verdict, reason);
|
|
105
|
+
// A queued result (brain unreachable → durably enqueued) counts as success:
|
|
106
|
+
// the agent has discharged its rating, so clear the ledger regardless. This
|
|
107
|
+
// is what stops the mandatory-rating gate from looping while the brain is
|
|
108
|
+
// down — the previous "return early, don't clear" path re-nagged every turn.
|
|
89
109
|
if (!result.ok)
|
|
90
110
|
return errLine("feedback_failed", result.error ?? "feedback POST failed");
|
|
91
111
|
const clearedId = result.resolvedId ?? id;
|
|
@@ -96,6 +116,7 @@ export function registerNativeMuonroiTools(tools, opts = {}) {
|
|
|
96
116
|
id: clearedId,
|
|
97
117
|
verdict: result.verdict,
|
|
98
118
|
...(result.reason ? { reason: result.reason } : {}),
|
|
119
|
+
...(result.queued ? { queued: true } : {}),
|
|
99
120
|
pendingRemaining: sessionRecallLedger.pendingCount(),
|
|
100
121
|
});
|
|
101
122
|
}
|
|
@@ -214,6 +235,65 @@ export function registerNativeMuonroiTools(tools, opts = {}) {
|
|
|
214
235
|
}
|
|
215
236
|
},
|
|
216
237
|
});
|
|
238
|
+
// ── Sprint 1: readiness contract tools ─────────────────────────────────────
|
|
239
|
+
tools.wait_for_diagnostics = dynamicTool({
|
|
240
|
+
description: "Wait for LSP diagnostics on a file, with timeout clamping (default 1500ms, max 5000ms). " +
|
|
241
|
+
"Returns { diagnostics: LspDiagnostic[], lspStatus: 'ok'|'partial'|'unavailable', clean: boolean, metadata: { tokenBudgetUsed } }. " +
|
|
242
|
+
"clean=true means zero error-level diagnostics. Grep fallback is allowed when lspStatus !== 'ok'.",
|
|
243
|
+
inputSchema: jsonSchema({
|
|
244
|
+
type: "object",
|
|
245
|
+
properties: {
|
|
246
|
+
filePath: { type: "string", description: "Absolute or workspace-relative path" },
|
|
247
|
+
timeout: { type: "number", description: "Timeout in ms (default 1500, max 5000)", optional: true },
|
|
248
|
+
},
|
|
249
|
+
required: ["filePath"],
|
|
250
|
+
}),
|
|
251
|
+
execute: async (input) => {
|
|
252
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
253
|
+
try {
|
|
254
|
+
const { getOrCreateManager } = await import("../lsp/runtime.js");
|
|
255
|
+
return json(await getOrCreateManager(cwd).waitForDiagnostics(input.filePath, input.timeout ?? 1500));
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
return lspErrLine(e);
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
tools.impact_of_change = dynamicTool({
|
|
263
|
+
description: "Analyse impact of a change: returns { references, diagnostics, referencesComplete, safeToRename, clean, " +
|
|
264
|
+
"suggestedGuard, degraded, lspStatus, metadata }. Safe for use as lsp-before-grep gate: grep fallback is " +
|
|
265
|
+
"allowed when lspStatus !== 'ok'; safeToRename is true only when refs are complete and the union is clean.",
|
|
266
|
+
inputSchema: jsonSchema({
|
|
267
|
+
type: "object",
|
|
268
|
+
properties: {
|
|
269
|
+
filePath: { type: "string", description: "Absolute or workspace-relative path" },
|
|
270
|
+
query: { type: "string", description: "Optional symbol query", optional: true },
|
|
271
|
+
},
|
|
272
|
+
required: ["filePath"],
|
|
273
|
+
}),
|
|
274
|
+
execute: async (input) => {
|
|
275
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
276
|
+
const { getOrCreateManager } = await import("../lsp/runtime.js");
|
|
277
|
+
return json(await getOrCreateManager(cwd).impactOfChange(input.filePath, input.query));
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
tools.lsp_mutation_preview = dynamicTool({
|
|
281
|
+
description: "Preview a mutation (stub — no real edits). Returns { op: 'allowlist', dryRunResult: { proposedEdits: [], " +
|
|
282
|
+
"tokenEstimate: 0 }, schemaVersion: '1.0' }. MUTATION_TOOLS gating applies; no apply path in Sprint 1.",
|
|
283
|
+
inputSchema: jsonSchema({
|
|
284
|
+
type: "object",
|
|
285
|
+
properties: {
|
|
286
|
+
filePath: { type: "string", description: "File path" },
|
|
287
|
+
change: { type: "string", description: "Change specification (stub)" },
|
|
288
|
+
},
|
|
289
|
+
required: ["filePath", "change"],
|
|
290
|
+
}),
|
|
291
|
+
execute: async (input) => {
|
|
292
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
293
|
+
const { getOrCreateManager } = await import("../lsp/runtime.js");
|
|
294
|
+
return json(await getOrCreateManager(cwd).lspMutationPreview(input.filePath, input.change));
|
|
295
|
+
},
|
|
296
|
+
});
|
|
217
297
|
// ── Onboarding: setup_guide ───────────────────────────────────────────────
|
|
218
298
|
tools.setup_guide = dynamicTool({
|
|
219
299
|
description: "Returns the up-to-date setup / install / first-run / MCP wiring / verify guide for muonroi-cli. Call this " +
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* is sent to the API for all providers (including DeepSeek, Gemini, etc.).
|
|
7
7
|
*/
|
|
8
8
|
import { type ToolSet } from "ai";
|
|
9
|
+
import type { AskUserAskInfo } from "../orchestrator/ask-user.js";
|
|
9
10
|
import type { AgentMode, TaskRequest, ToolResult } from "../types/index.js";
|
|
10
11
|
import type { BashTool } from "./bash.js";
|
|
11
12
|
interface ToolRegistryOpts {
|
|
@@ -15,6 +16,8 @@ interface ToolRegistryOpts {
|
|
|
15
16
|
listDelegations?: () => Promise<ToolResult>;
|
|
16
17
|
killDelegation?: (id: string) => Promise<ToolResult>;
|
|
17
18
|
modelId?: string;
|
|
19
|
+
/** L1 model depth tier — gates gsd_plan_review registration. */
|
|
20
|
+
depthTier?: "quick" | "standard" | "heavy";
|
|
18
21
|
consultParentSession?: (question: string) => Promise<string>;
|
|
19
22
|
/**
|
|
20
23
|
* When false, the 3 vision-proxy tools (analyze_image, ask_vision_proxy,
|
|
@@ -31,6 +34,23 @@ interface ToolRegistryOpts {
|
|
|
31
34
|
* isolated state (legacy per-closure behaviour).
|
|
32
35
|
*/
|
|
33
36
|
sessionId?: string;
|
|
37
|
+
runDebate?: (topic: string) => Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* When true, the `convene_council` tool is registered so the agent can
|
|
40
|
+
* convene the multi-model council on demand mid-turn. Set by the tool-engine
|
|
41
|
+
* only when the council is actually usable for this session
|
|
42
|
+
* (`configuredRoleCount >= getAutoCouncilMinRoles()`); omitted/false → the
|
|
43
|
+
* tool is absent so the model never calls a council that cannot convene.
|
|
44
|
+
*/
|
|
45
|
+
councilConfigured?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* When provided, the `ask_user` tool is registered so the agent can ask the
|
|
48
|
+
* human a question mid-turn and receive their answer AS the tool result. The
|
|
49
|
+
* handler blocks until the human responds (or dismisses). Omitted (headless
|
|
50
|
+
* with no answerer) → the tool is absent, so the model never calls a card
|
|
51
|
+
* that can never be answered.
|
|
52
|
+
*/
|
|
53
|
+
askUser?: (info: AskUserAskInfo) => Promise<string>;
|
|
34
54
|
}
|
|
35
55
|
/**
|
|
36
56
|
* Phase 4R: session-scoped bash repeat detector state.
|