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
package/LICENSE
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
MIT License
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Copyright (c) 2026 muonroi
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { type Predicate } from "./predicate.js";
|
|
2
|
-
import type { LiveEvent, LiveFrame, UINode } from "./protocol.js";
|
|
2
|
+
import type { LiveEvent, LiveFrame, UINode, VisualFrame } from "./protocol.js";
|
|
3
|
+
import { type VisualQualityReport } from "./visual-quality.js";
|
|
4
|
+
/** A single decoded cell from the rendered grid (returned by `visual_cell`). */
|
|
5
|
+
export type VisualCell = {
|
|
6
|
+
char: string;
|
|
7
|
+
fg: string;
|
|
8
|
+
bg: string;
|
|
9
|
+
attrs: number;
|
|
10
|
+
};
|
|
3
11
|
type WaitConditionIdle = {
|
|
4
12
|
idle: true;
|
|
5
13
|
};
|
|
@@ -31,6 +39,9 @@ type DriverDeps = {
|
|
|
31
39
|
type Ingested = {
|
|
32
40
|
kind: "frame";
|
|
33
41
|
frame: LiveFrame;
|
|
42
|
+
} | {
|
|
43
|
+
kind: "visual";
|
|
44
|
+
frame: VisualFrame;
|
|
34
45
|
} | {
|
|
35
46
|
kind: "idle";
|
|
36
47
|
} | {
|
|
@@ -69,6 +80,21 @@ export type Driver = {
|
|
|
69
80
|
*/
|
|
70
81
|
events: (filter?: EventFilter) => AsyncIterable<LiveEvent>;
|
|
71
82
|
render_text: () => string;
|
|
83
|
+
/** Latest VisualFrame — the ACTUAL rendered cell grid (colors + attributes),
|
|
84
|
+
* or null if the TUI has not emitted one (renderer not attached). */
|
|
85
|
+
snapshot_visual: () => VisualFrame | null;
|
|
86
|
+
/** Render the visual grid as plain text (what a human reads on screen) —
|
|
87
|
+
* faithful to the rendered characters, unlike render_text (semantic tree). */
|
|
88
|
+
render_visual: () => string;
|
|
89
|
+
/** Decode the cell at (row, col) — char + fg/bg hex + attribute bits — from
|
|
90
|
+
* the latest VisualFrame, accounting for wide (2-col) glyphs. Null if out of
|
|
91
|
+
* range or no visual frame yet. */
|
|
92
|
+
visual_cell: (row: number, col: number) => VisualCell | null;
|
|
93
|
+
/** Programmatic visual-quality heuristics over the latest VisualFrame:
|
|
94
|
+
* near-empty-row ratio, blank-row runs, whitespace density, and mojibake —
|
|
95
|
+
* the exact "messy render" signals the semantic tree is blind to. Null if no
|
|
96
|
+
* visual frame yet. */
|
|
97
|
+
visual_quality: () => VisualQualityReport | null;
|
|
72
98
|
_ingest: (m: Ingested) => void;
|
|
73
99
|
/** Called when the TUI exits. Cleanly terminates all active `events()` iterables. */
|
|
74
100
|
_closeAllSubscribers: () => void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { evaluatePredicate, predicateSchema } from "./predicate.js";
|
|
2
2
|
import { matchSelector } from "./selector.js";
|
|
3
|
+
import { computeVisualQuality } from "./visual-quality.js";
|
|
3
4
|
// ---------------------------------------------------------------------------
|
|
4
5
|
// Constants
|
|
5
6
|
// ---------------------------------------------------------------------------
|
|
@@ -12,6 +13,7 @@ const PER_SUBSCRIBER_QUEUE_CAP = 256;
|
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
13
14
|
export function createDriver(deps) {
|
|
14
15
|
let latestFrame = null;
|
|
16
|
+
let latestVisualFrame = null;
|
|
15
17
|
let lastIdleAt = -1;
|
|
16
18
|
const eventBuffer = [];
|
|
17
19
|
const waiters = new Set();
|
|
@@ -276,10 +278,54 @@ export function createDriver(deps) {
|
|
|
276
278
|
return "(no frame)";
|
|
277
279
|
return latestFrame.nodes.map((n) => renderNode(n, 0)).join("\n");
|
|
278
280
|
},
|
|
281
|
+
snapshot_visual() {
|
|
282
|
+
return latestVisualFrame;
|
|
283
|
+
},
|
|
284
|
+
render_visual() {
|
|
285
|
+
if (!latestVisualFrame)
|
|
286
|
+
return "(no visual frame)";
|
|
287
|
+
return latestVisualFrame.lines
|
|
288
|
+
.map((ln) => ln.spans
|
|
289
|
+
.map((s) => s.text)
|
|
290
|
+
.join("")
|
|
291
|
+
.replace(/\s+$/, ""))
|
|
292
|
+
.join("\n");
|
|
293
|
+
},
|
|
294
|
+
visual_cell(row, col) {
|
|
295
|
+
const frame = latestVisualFrame;
|
|
296
|
+
if (!frame)
|
|
297
|
+
return null;
|
|
298
|
+
const line = frame.lines[row];
|
|
299
|
+
if (!line)
|
|
300
|
+
return null;
|
|
301
|
+
// Walk spans accumulating display columns; a wide glyph spans 2 columns
|
|
302
|
+
// but its span.width already reflects that, so index within the run by
|
|
303
|
+
// string position while tracking the column cursor.
|
|
304
|
+
let colCursor = 0;
|
|
305
|
+
for (const span of line.spans) {
|
|
306
|
+
const chars = [...span.text];
|
|
307
|
+
for (const ch of chars) {
|
|
308
|
+
// A char occupies span.width / chars.length columns on average; for
|
|
309
|
+
// the common width===text-length case this is 1. Round to stay integral.
|
|
310
|
+
const chCols = Math.max(1, Math.round(span.width / Math.max(1, chars.length)));
|
|
311
|
+
if (col >= colCursor && col < colCursor + chCols) {
|
|
312
|
+
return { char: ch, fg: span.fg, bg: span.bg, attrs: span.attrs };
|
|
313
|
+
}
|
|
314
|
+
colCursor += chCols;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return null;
|
|
318
|
+
},
|
|
319
|
+
visual_quality() {
|
|
320
|
+
return latestVisualFrame ? computeVisualQuality(latestVisualFrame) : null;
|
|
321
|
+
},
|
|
279
322
|
_ingest(m) {
|
|
280
323
|
if (m.kind === "frame") {
|
|
281
324
|
latestFrame = m.frame;
|
|
282
325
|
}
|
|
326
|
+
else if (m.kind === "visual") {
|
|
327
|
+
latestVisualFrame = m.frame;
|
|
328
|
+
}
|
|
283
329
|
else if (m.kind === "idle") {
|
|
284
330
|
lastIdleAt = Date.now();
|
|
285
331
|
}
|
|
@@ -28,9 +28,20 @@ export const LIFECYCLE_PRESET = new Set([
|
|
|
28
28
|
"askcard-cancel",
|
|
29
29
|
"sprint-stage",
|
|
30
30
|
"sprint-halt",
|
|
31
|
+
// Emitted at product-loop/index.ts on plan commit; a wake-at-milestone monitor
|
|
32
|
+
// must see it. Was previously dropped by this preset despite being emitted.
|
|
33
|
+
"sprint-plan-committed",
|
|
31
34
|
"route-decision",
|
|
32
35
|
"steer-inject",
|
|
33
36
|
"usage",
|
|
37
|
+
// Ephemeral kinds carry a visualText snapshot for wake-at-milestone monitors
|
|
38
|
+
// (event-tee.ts EPHEMERAL_KINDS). The default preset must not drop them, or a
|
|
39
|
+
// monitor on MUONROI_HARNESS_EVENT_LOG misses errors/timeouts/disconnects.
|
|
40
|
+
"ee-timeout",
|
|
41
|
+
"ee-error",
|
|
42
|
+
"grounding-flag",
|
|
43
|
+
"stream-retry",
|
|
44
|
+
"disconnect",
|
|
34
45
|
]);
|
|
35
46
|
/**
|
|
36
47
|
* Returns a predicate that returns true when an event kind is allowed to emit.
|
|
@@ -53,6 +53,13 @@ const ALLOWED_FIELDS = {
|
|
|
53
53
|
status: "pass",
|
|
54
54
|
round: "pass",
|
|
55
55
|
correlationId: "pass",
|
|
56
|
+
// Liveness counters. Plain magnitudes (like elapsedMs / charCount above) —
|
|
57
|
+
// no prompt or response content — and without them a harness consumer
|
|
58
|
+
// cannot tell a slow reasoning call from a hung one, because `elapsedMs`
|
|
59
|
+
// alone freezes whenever the tick generator stops being pulled.
|
|
60
|
+
streamedChars: "pass",
|
|
61
|
+
lastDeltaAgeMs: "pass",
|
|
62
|
+
elapsedMs: "pass",
|
|
56
63
|
},
|
|
57
64
|
"council-turn-length": {
|
|
58
65
|
role: "pass",
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* event-tee.ts — optional JSONL sink for harness LiveEvents.
|
|
3
|
+
*
|
|
4
|
+
* Why: the MCP wake mechanism that re-invokes an external agent is a background
|
|
5
|
+
* task (e.g. a milestone watcher), which is a SEPARATE process from the MCP
|
|
6
|
+
* server. That watcher can only read files — it cannot reach the in-process
|
|
7
|
+
* driver that holds the real UI. So a generic, reusable milestone watcher needs
|
|
8
|
+
* the harness to persist events to a file it can tail.
|
|
9
|
+
*
|
|
10
|
+
* The DB only records debate-END rows (synthesis/debate_complete), so a
|
|
11
|
+
* DB-poll watcher is blind to mid-flight modal pauses (askcard-open) that never
|
|
12
|
+
* write a DB row. Teeing every LiveEvent to a JSONL file closes that gap for
|
|
13
|
+
* ANY event kind.
|
|
14
|
+
*
|
|
15
|
+
* Ephemeral events (toast, disconnect, retry, ee-*) flash and vanish before an
|
|
16
|
+
* agent can wake + render, so for those kinds — and ONLY those — we attach a
|
|
17
|
+
* plain-text visual snapshot captured at emit time, so the watcher's wake
|
|
18
|
+
* payload carries the exact frame. Persistent states (askcard, post-debate
|
|
19
|
+
* card) stay put, so the agent renders them fresh on demand; embedding a stale
|
|
20
|
+
* snapshot for those would be worse, not better.
|
|
21
|
+
*
|
|
22
|
+
* ON BY DEFAULT (see {@link resolveEventLogPath}): an opt-in sink is one nobody
|
|
23
|
+
* remembers to opt into, and the cost of the log missing is an agent that
|
|
24
|
+
* cannot tell "waiting for a human" from "hung" — the exact confusion this file
|
|
25
|
+
* exists to prevent. Set MUONROI_HARNESS_EVENT_LOG=0 (or "off"/"false") to
|
|
26
|
+
* disable, or to a path to choose your own.
|
|
27
|
+
*/
|
|
28
|
+
import type { LiveEvent } from "./protocol.js";
|
|
29
|
+
/**
|
|
30
|
+
* Event kinds that flash and disappear before an agent can wake + render.
|
|
31
|
+
* Only these carry an at-emit visual snapshot in the teed line.
|
|
32
|
+
*/
|
|
33
|
+
export declare const EPHEMERAL_KINDS: ReadonlySet<string>;
|
|
34
|
+
/** One teed JSONL record. */
|
|
35
|
+
export interface TeedEventLine {
|
|
36
|
+
ts: number;
|
|
37
|
+
kind: string;
|
|
38
|
+
event: LiveEvent;
|
|
39
|
+
/** Present only for EPHEMERAL_KINDS — plain-text visual frame at emit time. */
|
|
40
|
+
visualText?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve where events are teed, from the MUONROI_HARNESS_EVENT_LOG value.
|
|
44
|
+
*
|
|
45
|
+
* - unset/blank → a per-pid file in the OS temp dir (the default-on path)
|
|
46
|
+
* - "0" / "off" / "false" / "no" → null, sink disabled
|
|
47
|
+
* - anything else → that literal path
|
|
48
|
+
*
|
|
49
|
+
* Per-pid keeps concurrent harness servers from interleaving into one file, and
|
|
50
|
+
* puts the log where the OS already reclaims it — no rotation to maintain.
|
|
51
|
+
*
|
|
52
|
+
* @param pid - process id (injectable for tests).
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveEventLogPath(envValue?: string, pid?: number): string | null;
|
|
55
|
+
/**
|
|
56
|
+
* Build an event-tee sink. Returns null only when the sink is explicitly
|
|
57
|
+
* disabled — see {@link resolveEventLogPath}.
|
|
58
|
+
*
|
|
59
|
+
* @param getVisualText - lazily renders the current visual frame to plain text
|
|
60
|
+
* (driver.render_visual). Called ONLY for ephemeral kinds, so persistent
|
|
61
|
+
* events pay nothing.
|
|
62
|
+
* @param envValue - value of MUONROI_HARNESS_EVENT_LOG (injectable for tests).
|
|
63
|
+
*/
|
|
64
|
+
export declare function createEventTee(getVisualText: () => string | null, envValue?: string): ((event: LiveEvent) => void) | null;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* event-tee.ts — optional JSONL sink for harness LiveEvents.
|
|
3
|
+
*
|
|
4
|
+
* Why: the MCP wake mechanism that re-invokes an external agent is a background
|
|
5
|
+
* task (e.g. a milestone watcher), which is a SEPARATE process from the MCP
|
|
6
|
+
* server. That watcher can only read files — it cannot reach the in-process
|
|
7
|
+
* driver that holds the real UI. So a generic, reusable milestone watcher needs
|
|
8
|
+
* the harness to persist events to a file it can tail.
|
|
9
|
+
*
|
|
10
|
+
* The DB only records debate-END rows (synthesis/debate_complete), so a
|
|
11
|
+
* DB-poll watcher is blind to mid-flight modal pauses (askcard-open) that never
|
|
12
|
+
* write a DB row. Teeing every LiveEvent to a JSONL file closes that gap for
|
|
13
|
+
* ANY event kind.
|
|
14
|
+
*
|
|
15
|
+
* Ephemeral events (toast, disconnect, retry, ee-*) flash and vanish before an
|
|
16
|
+
* agent can wake + render, so for those kinds — and ONLY those — we attach a
|
|
17
|
+
* plain-text visual snapshot captured at emit time, so the watcher's wake
|
|
18
|
+
* payload carries the exact frame. Persistent states (askcard, post-debate
|
|
19
|
+
* card) stay put, so the agent renders them fresh on demand; embedding a stale
|
|
20
|
+
* snapshot for those would be worse, not better.
|
|
21
|
+
*
|
|
22
|
+
* ON BY DEFAULT (see {@link resolveEventLogPath}): an opt-in sink is one nobody
|
|
23
|
+
* remembers to opt into, and the cost of the log missing is an agent that
|
|
24
|
+
* cannot tell "waiting for a human" from "hung" — the exact confusion this file
|
|
25
|
+
* exists to prevent. Set MUONROI_HARNESS_EVENT_LOG=0 (or "off"/"false") to
|
|
26
|
+
* disable, or to a path to choose your own.
|
|
27
|
+
*/
|
|
28
|
+
import { appendFileSync } from "node:fs";
|
|
29
|
+
import { tmpdir } from "node:os";
|
|
30
|
+
import { join } from "node:path";
|
|
31
|
+
/**
|
|
32
|
+
* Event kinds that flash and disappear before an agent can wake + render.
|
|
33
|
+
* Only these carry an at-emit visual snapshot in the teed line.
|
|
34
|
+
*/
|
|
35
|
+
export const EPHEMERAL_KINDS = new Set([
|
|
36
|
+
"toast",
|
|
37
|
+
"disconnect",
|
|
38
|
+
"stream-retry",
|
|
39
|
+
"ee-timeout",
|
|
40
|
+
"ee-error",
|
|
41
|
+
"grounding-flag",
|
|
42
|
+
]);
|
|
43
|
+
/** Values that turn the sink off. Anything else is treated as a path. */
|
|
44
|
+
const DISABLE_VALUES = new Set(["0", "off", "false", "no"]);
|
|
45
|
+
/**
|
|
46
|
+
* Resolve where events are teed, from the MUONROI_HARNESS_EVENT_LOG value.
|
|
47
|
+
*
|
|
48
|
+
* - unset/blank → a per-pid file in the OS temp dir (the default-on path)
|
|
49
|
+
* - "0" / "off" / "false" / "no" → null, sink disabled
|
|
50
|
+
* - anything else → that literal path
|
|
51
|
+
*
|
|
52
|
+
* Per-pid keeps concurrent harness servers from interleaving into one file, and
|
|
53
|
+
* puts the log where the OS already reclaims it — no rotation to maintain.
|
|
54
|
+
*
|
|
55
|
+
* @param pid - process id (injectable for tests).
|
|
56
|
+
*/
|
|
57
|
+
export function resolveEventLogPath(envValue, pid = process.pid) {
|
|
58
|
+
const raw = (envValue ?? "").trim();
|
|
59
|
+
if (DISABLE_VALUES.has(raw.toLowerCase()))
|
|
60
|
+
return null;
|
|
61
|
+
if (raw)
|
|
62
|
+
return raw;
|
|
63
|
+
return join(tmpdir(), `muonroi-harness-events-${pid}.jsonl`);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build an event-tee sink. Returns null only when the sink is explicitly
|
|
67
|
+
* disabled — see {@link resolveEventLogPath}.
|
|
68
|
+
*
|
|
69
|
+
* @param getVisualText - lazily renders the current visual frame to plain text
|
|
70
|
+
* (driver.render_visual). Called ONLY for ephemeral kinds, so persistent
|
|
71
|
+
* events pay nothing.
|
|
72
|
+
* @param envValue - value of MUONROI_HARNESS_EVENT_LOG (injectable for tests).
|
|
73
|
+
*/
|
|
74
|
+
export function createEventTee(getVisualText, envValue) {
|
|
75
|
+
const path = resolveEventLogPath(envValue);
|
|
76
|
+
if (!path)
|
|
77
|
+
return null;
|
|
78
|
+
return (event) => {
|
|
79
|
+
// The idle sentinel arrives as { t: "idle" } — never here. Guard anyway so
|
|
80
|
+
// a malformed event can't crash the ingest loop.
|
|
81
|
+
const kind = event.kind;
|
|
82
|
+
if (typeof kind !== "string")
|
|
83
|
+
return;
|
|
84
|
+
const line = { ts: Date.now(), kind, event };
|
|
85
|
+
if (EPHEMERAL_KINDS.has(kind)) {
|
|
86
|
+
try {
|
|
87
|
+
const visual = getVisualText();
|
|
88
|
+
if (visual)
|
|
89
|
+
line.visualText = visual;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
// A visual-render failure must not drop the event record itself.
|
|
93
|
+
console.error(`[event-tee] visual snapshot failed for kind=${kind}: ${err?.message}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
appendFileSync(path, `${JSON.stringify(line)}\n`);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
console.error(`[event-tee] append failed (path=${path}, kind=${kind}): ${err?.message}`);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=event-tee.js.map
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
15
15
|
import { type Driver } from "./driver.js";
|
|
16
|
+
import type { LiveEvent } from "./protocol.js";
|
|
16
17
|
/**
|
|
17
18
|
* The result returned by a HarnessSpawn implementation.
|
|
18
19
|
* Both the POSIX fd-3/4 and Windows named-pipe transports satisfy this shape.
|
|
@@ -46,6 +47,18 @@ export declare function validateStartArgs(args: string[]): {
|
|
|
46
47
|
bad: string;
|
|
47
48
|
};
|
|
48
49
|
export declare function sanitizeEnv(env: Record<string, string>): Record<string, string>;
|
|
50
|
+
/**
|
|
51
|
+
* Build the child TUI's environment for tui.start.
|
|
52
|
+
*
|
|
53
|
+
* Starts from the driver's own env so PATH/HOME survive, overlays the
|
|
54
|
+
* caller-supplied keys, THEN strips the dangerous ones. The merge-before-strip
|
|
55
|
+
* order keeps the security posture (NODE_OPTIONS/LD_PRELOAD/… still removed)
|
|
56
|
+
* while guaranteeing PATH is present: bun drops the fd 3/4 stdio channels when a
|
|
57
|
+
* child is spawned with a partial env that lacks PATH, which yields a null
|
|
58
|
+
* inWrite and crashes the whole driver on spawn. `base` defaults to process.env
|
|
59
|
+
* and is injectable for tests.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildChildEnv(callerEnv?: Record<string, string>, base?: Record<string, string | undefined>): Record<string, string>;
|
|
49
62
|
/**
|
|
50
63
|
* Opt-in extra cwd roots for tui.start, layered ON TOP of the default
|
|
51
64
|
* {home, repo-root} allowlist. The posture stays deny-by-default: only roots an
|
|
@@ -72,6 +85,8 @@ export declare function validateMockLlmPath(value: string): boolean;
|
|
|
72
85
|
export declare function buildCapabilitiesPayload(): {
|
|
73
86
|
protocol: string;
|
|
74
87
|
features: readonly string[];
|
|
88
|
+
/** Where LiveEvents are teed as JSONL, or null when the sink is disabled. */
|
|
89
|
+
eventLogPath: string | null;
|
|
75
90
|
};
|
|
76
91
|
export declare function registerReadTools(server: McpServer, getDriver: () => Driver | null): void;
|
|
77
92
|
export declare function registerActionTools(server: McpServer, getDriver: () => Driver | null): void;
|
|
@@ -95,6 +110,16 @@ export declare function registerAsyncTools(server: McpServer, getDriver: () => D
|
|
|
95
110
|
export declare function createMcpHarnessServer({ spawn }: {
|
|
96
111
|
spawn: HarnessSpawn;
|
|
97
112
|
}): McpServer;
|
|
113
|
+
/**
|
|
114
|
+
* Build the onLine sidechannel handler: parse each JSON line, ingest frames /
|
|
115
|
+
* visuals / idle / events into the driver, and tee events to the optional JSONL
|
|
116
|
+
* sink. Extracted (and exported) so the frame/event/tee wiring is unit-testable
|
|
117
|
+
* without a live TUI or an MCP protocol handshake.
|
|
118
|
+
*
|
|
119
|
+
* @param driver the driver to ingest into (only _ingest is used).
|
|
120
|
+
* @param eventTee optional sink from createEventTee (null → no tee).
|
|
121
|
+
*/
|
|
122
|
+
export declare function makeLineHandler(driver: Pick<Driver, "_ingest">, eventTee: ((event: LiveEvent) => void) | null): (line: string) => void;
|
|
98
123
|
/**
|
|
99
124
|
* Run the MCP harness driver over stdio with the OpenTUI spawn implementation
|
|
100
125
|
* injected by the consumer.
|