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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip inline chain-of-thought markup from council LLM output.
|
|
3
|
+
*
|
|
4
|
+
* Some providers (kimi-k2.7 via opencode-go, GLM thinking variants) emit
|
|
5
|
+
* reasoning inline as `<think>…</think>` in `result.text` instead of the AI
|
|
6
|
+
* SDK's separated `reasoningText`. Rendered verbatim, the user sees hundreds
|
|
7
|
+
* of words of internal drafting above every debate turn (live-verified
|
|
8
|
+
* 2026-07-06). Applied at the council LLM boundary (src/council/llm.ts) so
|
|
9
|
+
* every consumer — debate turns, leader evals, synthesis — is covered.
|
|
10
|
+
*
|
|
11
|
+
* Handles three shapes:
|
|
12
|
+
* - complete `<think>…</think>` blocks anywhere (global, case-insensitive)
|
|
13
|
+
* - an unclosed trailing `<think>…` block (output truncated mid-reasoning)
|
|
14
|
+
* - a stray leading `…</think>` (model omitted the opener; everything up to
|
|
15
|
+
* and including the close tag is reasoning)
|
|
16
|
+
*/
|
|
17
|
+
export function stripThinkBlocks(text) {
|
|
18
|
+
if (!text || !/<\/?think>/i.test(text))
|
|
19
|
+
return text;
|
|
20
|
+
let out = text.replace(/<think>[\s\S]*?<\/think>/gi, "");
|
|
21
|
+
// Stray close tag with no opener before it → everything before it is reasoning.
|
|
22
|
+
const closeIdx = out.search(/<\/think>/i);
|
|
23
|
+
if (closeIdx !== -1) {
|
|
24
|
+
out = out.slice(closeIdx).replace(/^<\/think>/i, "");
|
|
25
|
+
}
|
|
26
|
+
// Unclosed opener → everything after it is reasoning that got truncated.
|
|
27
|
+
const openIdx = out.search(/<think>/i);
|
|
28
|
+
if (openIdx !== -1) {
|
|
29
|
+
out = out.slice(0, openIdx);
|
|
30
|
+
}
|
|
31
|
+
return out.trim();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=strip-think.js.map
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { ModelMessage } from "ai";
|
|
2
2
|
import type { ProcessMessageObserver } from "../orchestrator/agent-options.js";
|
|
3
|
+
import type { TaskRequest, ToolResult } from "../types/index.js";
|
|
3
4
|
import type { ModelRole } from "../utils/settings.js";
|
|
5
|
+
/**
|
|
6
|
+
* Bridge to the orchestrator's isolated sub-agent runner (runTaskRequest). When
|
|
7
|
+
* wired into a council run, heavy phases (research; #3 grounding-verify) execute
|
|
8
|
+
* in a budget-capped, near-empty explore sub-agent instead of an in-process
|
|
9
|
+
* multi-step generateText that bloats the council thread/context. The bridge
|
|
10
|
+
* closure captures the council abort signal, so callers pass only the request.
|
|
11
|
+
*/
|
|
12
|
+
export type IsolatedTaskRunner = (request: TaskRequest) => Promise<ToolResult>;
|
|
4
13
|
export interface CouncilQuestion {
|
|
5
14
|
questionId: string;
|
|
6
15
|
question: string;
|
|
@@ -37,6 +46,14 @@ export interface ClarifiedSpec {
|
|
|
37
46
|
}>;
|
|
38
47
|
/** Populated by P6 when the spec is converted to a Backlog. */
|
|
39
48
|
backlogId?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Ongoing-task / conversation context captured at council entry. Attached in
|
|
51
|
+
* council/index.ts on BOTH the explicit `/council` path and auto-council, so
|
|
52
|
+
* every debate stage (not just the opening statement) stays anchored to the
|
|
53
|
+
* parent task and the decisions already made earlier in the session. Optional
|
|
54
|
+
* for backward compat — empty when the council runs with no prior context.
|
|
55
|
+
*/
|
|
56
|
+
parentContext?: string;
|
|
40
57
|
}
|
|
41
58
|
export interface CouncilPreflight {
|
|
42
59
|
preflightId: string;
|
|
@@ -73,6 +90,12 @@ export interface LeaderEvaluation {
|
|
|
73
90
|
* close to resolving the last unresolved point.
|
|
74
91
|
*/
|
|
75
92
|
extendRounds?: number;
|
|
93
|
+
/**
|
|
94
|
+
* One-line focus/topic the leader sets for the NEXT round when the debate
|
|
95
|
+
* continues. Surfaced in the round-grouped transcript overview (P6). Optional
|
|
96
|
+
* — absent on convergence/stop.
|
|
97
|
+
*/
|
|
98
|
+
nextRoundFocus?: string;
|
|
76
99
|
}
|
|
77
100
|
export interface DebateState {
|
|
78
101
|
spec: ClarifiedSpec;
|
|
@@ -83,8 +106,34 @@ export interface DebateState {
|
|
|
83
106
|
active: CouncilParticipant[];
|
|
84
107
|
/** Evidence density from the final leader evaluation (0.0–1.0). Drives confidence badge. */
|
|
85
108
|
finalEvidenceDensity?: number;
|
|
109
|
+
/**
|
|
110
|
+
* Total claims participants explicitly tagged ([CONFIRMED]/[REFUTED]/
|
|
111
|
+
* [UNVERIFIED]) across the debate. 0 = no evidence tags emitted, so density
|
|
112
|
+
* is unmeasurable rather than genuinely 0% — the badge distinguishes them.
|
|
113
|
+
*/
|
|
114
|
+
finalTaggedClaims?: number;
|
|
86
115
|
/** Role-indexed per-round positions for follow-up citations. */
|
|
87
116
|
archive?: DebateArchiveEntry[];
|
|
117
|
+
/**
|
|
118
|
+
* F1 — the last successful round's per-criterion met flags, index-aligned to
|
|
119
|
+
* `spec.successCriteria`. Lets the post-debate card tell whether the debate
|
|
120
|
+
* actually satisfied the pinned success criteria (distinct from evidence
|
|
121
|
+
* density) so an unmet outcome is framed as provisional, not a settled
|
|
122
|
+
* decision. Undefined when the spec had no pinned criteria or no round eval
|
|
123
|
+
* ever produced a criteria status (treated as all-unmet by the card).
|
|
124
|
+
*/
|
|
125
|
+
finalCriteriaMet?: boolean[];
|
|
126
|
+
/**
|
|
127
|
+
* B4 interactive escalation outcome. Set only when the user was prompted at a
|
|
128
|
+
* stop-with-unmet boundary and chose an action: `extend` granted extra rounds
|
|
129
|
+
* past the ceiling, `accept` proceeded with criteria open, `rescope` asked to
|
|
130
|
+
* narrow the scope. Undefined when no escalation fired (auto-resolved, headless,
|
|
131
|
+
* or all criteria met). Lets synthesis/caller react to a user-driven partial stop.
|
|
132
|
+
*/
|
|
133
|
+
escalation?: {
|
|
134
|
+
action: "extend" | "accept" | "rescope";
|
|
135
|
+
grantedRounds?: number;
|
|
136
|
+
};
|
|
88
137
|
}
|
|
89
138
|
/**
|
|
90
139
|
* Single position taken by a participant in one round. Used to answer
|
|
@@ -186,7 +235,37 @@ export interface EnhancedCouncilOutcome {
|
|
|
186
235
|
answer: string;
|
|
187
236
|
};
|
|
188
237
|
plan?: ActionPlan;
|
|
238
|
+
/**
|
|
239
|
+
* Model-first post-debate options. The leader synthesis picks 2-4 actions
|
|
240
|
+
* from the wired handler vocabulary that FIT this debate's intent (a bug
|
|
241
|
+
* investigation vs an evaluation vs a plan warrant different follow-ups),
|
|
242
|
+
* ordered best-first. Rendered as the post-debate askcard instead of the
|
|
243
|
+
* old fixed "accept / research / apply" template. Empty/absent → index.ts
|
|
244
|
+
* falls back to the deterministic option set.
|
|
245
|
+
*/
|
|
246
|
+
nextActions?: Array<{
|
|
247
|
+
action: PostDebateActionId;
|
|
248
|
+
label: string;
|
|
249
|
+
reason?: string;
|
|
250
|
+
}>;
|
|
189
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Post-debate actions the leader may recommend. Bounded to handlers wired in
|
|
254
|
+
* index.ts's post-debate switch — the model selects/orders/labels FROM this
|
|
255
|
+
* vocabulary, it cannot invent new actions. Context-only actions
|
|
256
|
+
* (retry_synthesis on failure, refine on empty sections) are added by index.ts,
|
|
257
|
+
* not the model.
|
|
258
|
+
*/
|
|
259
|
+
export type PostDebateActionId = "ask_followup" | "generate_plan" | "implement" | "save_exit"
|
|
260
|
+
/**
|
|
261
|
+
* Persist the outcome and hand control back to the session with the synthesis
|
|
262
|
+
* enriched into the message history (appendCompletedTurn), so the agent keeps
|
|
263
|
+
* working on the ORIGINAL task using the debate's trusted conclusion as
|
|
264
|
+
* context. The right default for a pure discussion / hard-problem debate whose
|
|
265
|
+
* deliverable is the conclusion itself. Behaves like save_exit at the handler
|
|
266
|
+
* level (falls through to persistence) — the distinction is intent + framing.
|
|
267
|
+
*/
|
|
268
|
+
| "continue_session";
|
|
190
269
|
export interface CouncilConfig {
|
|
191
270
|
topic: string;
|
|
192
271
|
conversationContext: string;
|
|
@@ -211,6 +290,13 @@ export interface CouncilConfig {
|
|
|
211
290
|
internetFirst?: boolean;
|
|
212
291
|
/** When true, leader sub-tasks downshift to cheaper tier models on the same provider. */
|
|
213
292
|
costAware?: boolean;
|
|
293
|
+
/**
|
|
294
|
+
* Feature B — council debate language override. When set, runDebate uses this
|
|
295
|
+
* instead of reading `getCouncilLanguage()` from settings. Values: "auto"
|
|
296
|
+
* (follow the brief's language), "english" (historical English-only debate),
|
|
297
|
+
* or any locale label. Undefined → resolved from the user setting.
|
|
298
|
+
*/
|
|
299
|
+
debateLanguage?: string;
|
|
214
300
|
/**
|
|
215
301
|
* Enclosing council run id (= sessionId). Used only as the correlationId on the
|
|
216
302
|
* observe-only `council-turn-length` harness event so per-turn length samples can
|
|
@@ -218,6 +304,58 @@ export interface CouncilConfig {
|
|
|
218
304
|
* stable literal); has no effect on debate behaviour.
|
|
219
305
|
*/
|
|
220
306
|
runId?: string;
|
|
307
|
+
/**
|
|
308
|
+
* B4 interactive escalation channel. When wired, a debate about to STOP with
|
|
309
|
+
* pinned criteria still unmet (leader gave up or hit the ceiling) hands the
|
|
310
|
+
* decision to the user via a council_question askcard instead of silently
|
|
311
|
+
* synthesizing a partial outcome. Optional: headless/direct callers omit it and
|
|
312
|
+
* the debate falls through to the diagnostic closing verdict unchanged. Same
|
|
313
|
+
* responder the clarifier + post-debate askcards use.
|
|
314
|
+
*/
|
|
315
|
+
respondToQuestion?: QuestionResponder;
|
|
316
|
+
/**
|
|
317
|
+
* convene_council path — when true, the mid-debate escalation askcard
|
|
318
|
+
* (runEscalationPrompt) is auto-accepted WITHOUT emitting a blocking
|
|
319
|
+
* council_question card. The convene tool runs the council autonomously
|
|
320
|
+
* mid-agent-turn: there is no interactive user answering the escalation, so a
|
|
321
|
+
* card would hang the tool call. Auto-accept = conclude with the best
|
|
322
|
+
* synthesis so far. No decision is hardcoded post-synthesis — the calling
|
|
323
|
+
* agent decides what to do with the returned conclusion.
|
|
324
|
+
*/
|
|
325
|
+
convenePath?: boolean;
|
|
326
|
+
/**
|
|
327
|
+
* C (mid-debate checkpoint) — directory to persist the per-round debate
|
|
328
|
+
* checkpoint (`debate-checkpoint.json`), normally the run dir
|
|
329
|
+
* `.muonroi-flow/runs/<runId>`. When set, runDebate snapshots its state after
|
|
330
|
+
* each completed round and deletes it on normal completion. Unset → no
|
|
331
|
+
* checkpointing (direct callers/tests).
|
|
332
|
+
*/
|
|
333
|
+
checkpointDir?: string;
|
|
334
|
+
/**
|
|
335
|
+
* C — a prior checkpoint to resume from. When present AND it matches this
|
|
336
|
+
* debate (same problem statement + panel), runDebate skips the research +
|
|
337
|
+
* opening phases and the already-completed rounds, restoring the accumulated
|
|
338
|
+
* transcript, and continues from the last completed round. Ignored on mismatch.
|
|
339
|
+
*/
|
|
340
|
+
resumeCheckpoint?: import("./debate-checkpoint.js").DebateCheckpoint;
|
|
341
|
+
/**
|
|
342
|
+
* #2 — isolated research bridge. When wired (interactive /council + auto-
|
|
343
|
+
* council), the initial/mid-debate research phase runs in a budget-capped
|
|
344
|
+
* explore sub-agent (near-empty context, independent compaction) instead of
|
|
345
|
+
* an in-process 15-step generateText that accretes tool clutter into the
|
|
346
|
+
* council thread. Optional: headless/direct callers/tests omit it and research
|
|
347
|
+
* falls back to `llm.research`.
|
|
348
|
+
*/
|
|
349
|
+
runIsolatedTask?: IsolatedTaskRunner;
|
|
350
|
+
/**
|
|
351
|
+
* Sprint-2 item 3 — per-stance recall at debate opening. When wired, runDebate
|
|
352
|
+
* calls this once before opening statements with the panel's stances/roles and
|
|
353
|
+
* a query; the returned per-role seed text is folded into each participant's
|
|
354
|
+
* opening context so every stance opens grounded in the prior experience its
|
|
355
|
+
* lens cares about (the EE server weights recall collections by stance).
|
|
356
|
+
* Optional: headless/direct callers/tests omit it and openings run unchanged.
|
|
357
|
+
*/
|
|
358
|
+
stanceRecall?: (roles: string[], query: string) => Promise<Map<string, string>>;
|
|
221
359
|
}
|
|
222
360
|
/**
|
|
223
361
|
* JSON shape persisted as `[Council Memory] {...}` in the session messages.
|
|
@@ -40,6 +40,22 @@ export declare function getArtifact(toolCallId: string): ArtifactEntry | null;
|
|
|
40
40
|
export declare function findArtifactByQuery(query: string): (ArtifactEntry & {
|
|
41
41
|
toolCallId: string;
|
|
42
42
|
}) | null;
|
|
43
|
+
/**
|
|
44
|
+
* B (cheap-model anti-mù) — fuzzy in-memory fallback for a MALFORMED artifact id.
|
|
45
|
+
* Cheap models routinely botch the `tool-artifact id=<toolCallId>` contract by
|
|
46
|
+
* passing FILE PATHS instead of the opaque call id (observed live:
|
|
47
|
+
* `tool-artifact id=src/todo.js src/cli.js …`). extractArtifactId can't parse a
|
|
48
|
+
* path (its id charset excludes `/`), so the exact lookup silently misses and
|
|
49
|
+
* the model is stranded. When the exact id lookup has already failed, match by
|
|
50
|
+
* path against each cached artifact's content (a read_file result carries its
|
|
51
|
+
* `[<path>: lines …]` header) so the recall still succeeds. Returns the MOST
|
|
52
|
+
* recently-recorded artifact whose content references any path token in the
|
|
53
|
+
* hint, or null when the hint has no path-like token / nothing matches — so a
|
|
54
|
+
* genuinely-unknown id never fuzzy-matches unrelated content.
|
|
55
|
+
*/
|
|
56
|
+
export declare function findArtifactByHint(hint: string): (ArtifactEntry & {
|
|
57
|
+
toolCallId: string;
|
|
58
|
+
}) | null;
|
|
43
59
|
/**
|
|
44
60
|
* Disk-tier lookup (survives restart). Scans the spill file newest-first so the
|
|
45
61
|
* most recent record for an id wins. Fail-open: a missing/corrupt file yields
|
|
@@ -99,6 +99,38 @@ export function findArtifactByQuery(query) {
|
|
|
99
99
|
const hit = store.get(id);
|
|
100
100
|
return hit ? { toolCallId: id, toolName: hit.toolName, content: hit.content } : null;
|
|
101
101
|
}
|
|
102
|
+
/** Path-like tokens (contain a slash or a trailing file extension) from a hint. */
|
|
103
|
+
function pathTokens(hint) {
|
|
104
|
+
return (hint.match(/[^\s"']+/g) ?? [])
|
|
105
|
+
.map((t) => t.replace(/^id=/i, "")) // drop the contract's `id=` glued to the first path token
|
|
106
|
+
.filter((t) => t.includes("/") || /\.[A-Za-z0-9]{1,5}$/.test(t));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* B (cheap-model anti-mù) — fuzzy in-memory fallback for a MALFORMED artifact id.
|
|
110
|
+
* Cheap models routinely botch the `tool-artifact id=<toolCallId>` contract by
|
|
111
|
+
* passing FILE PATHS instead of the opaque call id (observed live:
|
|
112
|
+
* `tool-artifact id=src/todo.js src/cli.js …`). extractArtifactId can't parse a
|
|
113
|
+
* path (its id charset excludes `/`), so the exact lookup silently misses and
|
|
114
|
+
* the model is stranded. When the exact id lookup has already failed, match by
|
|
115
|
+
* path against each cached artifact's content (a read_file result carries its
|
|
116
|
+
* `[<path>: lines …]` header) so the recall still succeeds. Returns the MOST
|
|
117
|
+
* recently-recorded artifact whose content references any path token in the
|
|
118
|
+
* hint, or null when the hint has no path-like token / nothing matches — so a
|
|
119
|
+
* genuinely-unknown id never fuzzy-matches unrelated content.
|
|
120
|
+
*/
|
|
121
|
+
export function findArtifactByHint(hint) {
|
|
122
|
+
const tokens = pathTokens(hint || "");
|
|
123
|
+
if (tokens.length === 0)
|
|
124
|
+
return null;
|
|
125
|
+
let match = null;
|
|
126
|
+
// Map insertion order is oldest→newest; keep the LAST (newest) match.
|
|
127
|
+
for (const [toolCallId, entry] of store) {
|
|
128
|
+
if (tokens.some((t) => entry.content.includes(t))) {
|
|
129
|
+
match = { toolCallId, toolName: entry.toolName, content: entry.content };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return match;
|
|
133
|
+
}
|
|
102
134
|
/**
|
|
103
135
|
* Disk-tier lookup (survives restart). Scans the spill file newest-first so the
|
|
104
136
|
* most recent record for an id wins. Fail-open: a missing/corrupt file yields
|
package/dist/src/ee/auth.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export interface ExperienceConfig {
|
|
|
9
9
|
authToken?: string;
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
+
export declare function relativizePath(p: string): string;
|
|
12
13
|
export declare function loadEEAuthToken(opts?: {
|
|
13
14
|
home?: string;
|
|
14
15
|
}): Promise<string | null>;
|
|
@@ -24,6 +25,25 @@ export declare function refreshAuthToken(opts?: {
|
|
|
24
25
|
export declare function writeExperienceConfig(patch: Partial<ExperienceConfig>, opts?: {
|
|
25
26
|
home?: string;
|
|
26
27
|
}): Promise<void>;
|
|
28
|
+
/** Where the EE config lives, for display in setup/status output. */
|
|
29
|
+
export declare function getExperienceConfigPath(opts?: {
|
|
30
|
+
home?: string;
|
|
31
|
+
}): string;
|
|
32
|
+
/**
|
|
33
|
+
* Best-effort reachability probe against an EE server's /health.
|
|
34
|
+
*
|
|
35
|
+
* Returns a reason on failure rather than a bare boolean: "saved but not
|
|
36
|
+
* reachable" and "saved, server says 401" are different problems for the user
|
|
37
|
+
* to act on, and collapsing them to `false` hides which one they have.
|
|
38
|
+
* Never throws — a probe is diagnostics, and must not fail a config write that
|
|
39
|
+
* already succeeded.
|
|
40
|
+
*/
|
|
41
|
+
export declare function probeEEHealth(baseUrl: string, token?: string, opts?: {
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
ok: boolean;
|
|
45
|
+
detail: string;
|
|
46
|
+
}>;
|
|
27
47
|
export declare function getCachedAuthToken(): string | null;
|
|
28
48
|
export declare function getEmbeddingModelVersion(): string;
|
|
29
49
|
export declare function getCachedServerBaseUrl(): string | null;
|
package/dist/src/ee/auth.js
CHANGED
|
@@ -8,7 +8,20 @@ import * as os from "node:os";
|
|
|
8
8
|
import * as path from "node:path";
|
|
9
9
|
import { redactor } from "../utils/redactor.js";
|
|
10
10
|
function configPath(homeOverride) {
|
|
11
|
-
|
|
11
|
+
const base = homeOverride ?? os.homedir();
|
|
12
|
+
const normalizedBase = base.replace(/\\/g, "/");
|
|
13
|
+
return path.join(normalizedBase, ".experience", "config.json").replace(/\\/g, "/");
|
|
14
|
+
}
|
|
15
|
+
export function relativizePath(p) {
|
|
16
|
+
if (!p)
|
|
17
|
+
return p;
|
|
18
|
+
let normalized = p.replace(/\\/g, "/");
|
|
19
|
+
const home = os.homedir().replace(/\\/g, "/");
|
|
20
|
+
const normalizedHome = home.endsWith("/") ? home.slice(0, -1) : home;
|
|
21
|
+
if (normalized.startsWith(normalizedHome)) {
|
|
22
|
+
normalized = "~" + normalized.slice(normalizedHome.length);
|
|
23
|
+
}
|
|
24
|
+
return normalized;
|
|
12
25
|
}
|
|
13
26
|
let _token = null;
|
|
14
27
|
let _embeddingModelVersion = null;
|
|
@@ -55,9 +68,48 @@ export async function writeExperienceConfig(patch, opts = {}) {
|
|
|
55
68
|
// No existing config (or unreadable) — start fresh.
|
|
56
69
|
}
|
|
57
70
|
const merged = { ...existing, ...patch };
|
|
58
|
-
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
71
|
+
await fs.mkdir(path.dirname(p), { recursive: true, mode: 0o700 });
|
|
59
72
|
await fs.writeFile(p, `${JSON.stringify(merged, null, 2)}\n`, "utf8");
|
|
60
73
|
}
|
|
74
|
+
/** Where the EE config lives, for display in setup/status output. */
|
|
75
|
+
export function getExperienceConfigPath(opts = {}) {
|
|
76
|
+
return configPath(opts.home);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Best-effort reachability probe against an EE server's /health.
|
|
80
|
+
*
|
|
81
|
+
* Returns a reason on failure rather than a bare boolean: "saved but not
|
|
82
|
+
* reachable" and "saved, server says 401" are different problems for the user
|
|
83
|
+
* to act on, and collapsing them to `false` hides which one they have.
|
|
84
|
+
* Never throws — a probe is diagnostics, and must not fail a config write that
|
|
85
|
+
* already succeeded.
|
|
86
|
+
*/
|
|
87
|
+
export async function probeEEHealth(baseUrl, token, opts = {}) {
|
|
88
|
+
const ac = new AbortController();
|
|
89
|
+
const timer = setTimeout(() => ac.abort(), opts.timeoutMs ?? 4000);
|
|
90
|
+
try {
|
|
91
|
+
const res = await fetch(`${baseUrl}/health`, {
|
|
92
|
+
signal: ac.signal,
|
|
93
|
+
headers: token ? { authorization: `Bearer ${token}` } : undefined,
|
|
94
|
+
});
|
|
95
|
+
if (res.ok)
|
|
96
|
+
return { ok: true, detail: `HTTP ${res.status}` };
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
detail: res.status === 401 || res.status === 403
|
|
100
|
+
? `HTTP ${res.status} — the server rejected this auth token`
|
|
101
|
+
: `HTTP ${res.status}`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const message = err?.name === "AbortError" ? "timed out" : (err?.message ?? String(err));
|
|
106
|
+
console.error(`[ee/auth] /health probe failed for ${baseUrl}: ${message}`);
|
|
107
|
+
return { ok: false, detail: message };
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
61
113
|
export function getCachedAuthToken() {
|
|
62
114
|
return _token;
|
|
63
115
|
}
|
package/dist/src/ee/bridge.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { type PilContextResponse } from "../pil/schema.js";
|
|
2
2
|
export type { WhoAmIDim, WhoAmIDimName, WhoAmIProfile } from "./who-am-i.js";
|
|
3
3
|
export { getWhoAmIProfile, outputStyleFromProfile, resetWhoAmICache } from "./who-am-i.js";
|
|
4
|
+
import { type WhoAmIProfile } from "./who-am-i.js";
|
|
5
|
+
/** Test-only: allow a fresh warm attempt after resetWhoAmICache(). */
|
|
6
|
+
export declare function resetWhoAmIBrainWarm(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Fire-and-forget at session boot. Derives a brain-based Who-Am-I profile on a
|
|
9
|
+
* thin-client and primes the sync cache. Fail-open + bounded (deriveWhoAmIFromBrain
|
|
10
|
+
* wraps its own timeouts); never throws, never blocks a real device-local profile.
|
|
11
|
+
* Returns the primed profile (or null) for callers/tests that want to await it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function warmWhoAmIFromBrain(): Promise<WhoAmIProfile | null>;
|
|
4
14
|
interface EEPoint {
|
|
5
15
|
id: string | number;
|
|
6
16
|
score?: number;
|
package/dist/src/ee/bridge.js
CHANGED
|
@@ -17,6 +17,59 @@ import { classifyEeError, logEeFailure, readTimeoutEnv, withEeTimeout } from "..
|
|
|
17
17
|
// local-only (no network), cached, and fail-open — the same contract as the rest
|
|
18
18
|
// of this bridge.
|
|
19
19
|
export { getWhoAmIProfile, outputStyleFromProfile, resetWhoAmICache } from "./who-am-i.js";
|
|
20
|
+
import { getWhoAmIProfile, primeWhoAmICache } from "./who-am-i.js";
|
|
21
|
+
import { deriveWhoAmIFromBrain, isBrainWhoAmIEnabled } from "./who-am-i-brain.js";
|
|
22
|
+
// Thin-client brain-derived Who-Am-I warm. The device-local profile.yaml pipeline is
|
|
23
|
+
// full-brain-only (see who-am-i-brain.ts), so on a thin-client getWhoAmIProfile() is
|
|
24
|
+
// always null and the PIL loses every style signal. warmWhoAmIFromBrain() derives the
|
|
25
|
+
// same profile shape from the reachable `experience-behavioral` brain and primes the
|
|
26
|
+
// per-process cache, so subsequent SYNC getWhoAmIProfile() reads (pipeline.ts:107,
|
|
27
|
+
// layer4/5/6) pick it up. Idempotent + guarded: runs at most once per process, only
|
|
28
|
+
// on a thin-client, only when no device-local profile exists, only when enabled.
|
|
29
|
+
let _brainWhoAmIAttempted = false;
|
|
30
|
+
/** Test-only: allow a fresh warm attempt after resetWhoAmICache(). */
|
|
31
|
+
export function resetWhoAmIBrainWarm() {
|
|
32
|
+
_brainWhoAmIAttempted = false;
|
|
33
|
+
}
|
|
34
|
+
async function isThinClient() {
|
|
35
|
+
try {
|
|
36
|
+
const { getCachedEEClientMode } = await import("./client-mode.js");
|
|
37
|
+
const modeInfo = getCachedEEClientMode();
|
|
38
|
+
if (modeInfo)
|
|
39
|
+
return modeInfo.mode === "thin" || modeInfo.mode === "thin-degraded";
|
|
40
|
+
return !!(await import("./auth.js")).getCachedServerBaseUrl();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fire-and-forget at session boot. Derives a brain-based Who-Am-I profile on a
|
|
48
|
+
* thin-client and primes the sync cache. Fail-open + bounded (deriveWhoAmIFromBrain
|
|
49
|
+
* wraps its own timeouts); never throws, never blocks a real device-local profile.
|
|
50
|
+
* Returns the primed profile (or null) for callers/tests that want to await it.
|
|
51
|
+
*/
|
|
52
|
+
export async function warmWhoAmIFromBrain() {
|
|
53
|
+
if (_brainWhoAmIAttempted)
|
|
54
|
+
return getWhoAmIProfile();
|
|
55
|
+
_brainWhoAmIAttempted = true;
|
|
56
|
+
try {
|
|
57
|
+
if (!isBrainWhoAmIEnabled())
|
|
58
|
+
return null;
|
|
59
|
+
if (getWhoAmIProfile())
|
|
60
|
+
return getWhoAmIProfile(); // real device-local profile wins
|
|
61
|
+
if (!(await isThinClient()))
|
|
62
|
+
return null;
|
|
63
|
+
const derived = await deriveWhoAmIFromBrain({ searchByText, classifyViaBrain });
|
|
64
|
+
if (derived)
|
|
65
|
+
primeWhoAmICache(derived);
|
|
66
|
+
return derived;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logEeFailure("bridge.warmWhoAmIFromBrain", classifyEeError(err), err);
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
20
73
|
/**
|
|
21
74
|
* Phase 21.5 — `routeModel` / `routeTask` budget. EE server unreachability used
|
|
22
75
|
* to hang `/ideal` for the OS-level fetch connect timeout (~5 min on Windows).
|
|
@@ -33,6 +86,11 @@ let _loadAttempted = false;
|
|
|
33
86
|
* Returns the absolute path if the file is accessible, null otherwise.
|
|
34
87
|
*/
|
|
35
88
|
async function resolveCorePath() {
|
|
89
|
+
if (process.env.MUONROI_TEST_EE_CORE_PATH) {
|
|
90
|
+
if (process.env.MUONROI_TEST_EE_CORE_PATH === "null")
|
|
91
|
+
return null;
|
|
92
|
+
return process.env.MUONROI_TEST_EE_CORE_PATH;
|
|
93
|
+
}
|
|
36
94
|
const installed = path.join(os.homedir(), ".experience", "experience-core.js");
|
|
37
95
|
try {
|
|
38
96
|
await fs.access(installed);
|