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/dist/src/ee/client.js
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
|
+
import * as os from "node:os";
|
|
1
2
|
import { classifyEeError, logEeFailure } from "../utils/ee-logger.js";
|
|
3
|
+
import { redactor } from "../utils/redactor.js";
|
|
2
4
|
import { drainQueue, enqueue } from "./offline-queue.js";
|
|
3
5
|
const DEFAULT_BASE = "http://localhost:8082";
|
|
6
|
+
function relativizePath(p) {
|
|
7
|
+
if (!p)
|
|
8
|
+
return p;
|
|
9
|
+
let normalized = p.replace(/\\/g, "/");
|
|
10
|
+
const home = os.homedir().replace(/\\/g, "/");
|
|
11
|
+
const normalizedHome = home.endsWith("/") ? home.slice(0, -1) : home;
|
|
12
|
+
if (normalized.startsWith(normalizedHome)) {
|
|
13
|
+
normalized = "~" + normalized.slice(normalizedHome.length);
|
|
14
|
+
}
|
|
15
|
+
return normalized;
|
|
16
|
+
}
|
|
17
|
+
function redactPayload(payload) {
|
|
18
|
+
if (!payload)
|
|
19
|
+
return payload;
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(redactor.redact(JSON.stringify(payload)));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return payload;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
4
27
|
/**
|
|
5
28
|
* Intercept timeout budget.
|
|
6
29
|
* Local: 100ms (localhost p99 is <10ms, 100ms catches wedged server).
|
|
@@ -184,19 +207,33 @@ export function createEEClient(opts = {}) {
|
|
|
184
207
|
}
|
|
185
208
|
return {
|
|
186
209
|
async health() {
|
|
210
|
+
const startedAt = Date.now();
|
|
187
211
|
try {
|
|
188
212
|
const resp = await f(`${baseUrl}/health`, {
|
|
189
213
|
signal: AbortSignal.timeout(DEFAULT_HEALTH_TIMEOUT_MS),
|
|
190
214
|
});
|
|
191
215
|
return { ok: resp.ok, status: resp.status };
|
|
192
216
|
}
|
|
193
|
-
catch {
|
|
217
|
+
catch (err) {
|
|
218
|
+
// status:0 means "no response" and says nothing about WHY. Timeout, DNS,
|
|
219
|
+
// refused connection and TLS failure all degrade to the same shape, so a
|
|
220
|
+
// bare catch here leaves an agent with an unfalsifiable symptom — exactly
|
|
221
|
+
// what happened on 2026-07-17, when status:0 was really the server
|
|
222
|
+
// blocking its event loop.
|
|
223
|
+
logEeFailure("client.health", classifyEeError(err), err, {
|
|
224
|
+
elapsedMs: Date.now() - startedAt,
|
|
225
|
+
budgetMs: DEFAULT_HEALTH_TIMEOUT_MS,
|
|
226
|
+
});
|
|
194
227
|
return { ok: false, status: 0 };
|
|
195
228
|
}
|
|
196
229
|
},
|
|
197
230
|
async intercept(req) {
|
|
231
|
+
const redactedReq = {
|
|
232
|
+
...req,
|
|
233
|
+
cwd: relativizePath(req.cwd),
|
|
234
|
+
};
|
|
198
235
|
// 1. Cache hit — skip network entirely
|
|
199
|
-
const cached = getCached(
|
|
236
|
+
const cached = getCached(redactedReq);
|
|
200
237
|
if (cached)
|
|
201
238
|
return cached;
|
|
202
239
|
// 2. Circuit breaker — skip if open
|
|
@@ -207,7 +244,7 @@ export function createEEClient(opts = {}) {
|
|
|
207
244
|
const resp = await f(`${baseUrl}/api/intercept`, {
|
|
208
245
|
method: "POST",
|
|
209
246
|
headers: headers(),
|
|
210
|
-
body: JSON.stringify({ ...
|
|
247
|
+
body: JSON.stringify(redactPayload({ ...redactedReq, skipRoute: true })),
|
|
211
248
|
signal: AbortSignal.timeout(interceptTimeoutMs),
|
|
212
249
|
});
|
|
213
250
|
if (!resp.ok) {
|
|
@@ -221,7 +258,7 @@ export function createEEClient(opts = {}) {
|
|
|
221
258
|
const raw = (await resp.json());
|
|
222
259
|
const result = normalizeInterceptResponse(raw);
|
|
223
260
|
recordCircuitSuccess({ fetchImpl: f, headers: headers(), baseUrl });
|
|
224
|
-
setCached(
|
|
261
|
+
setCached(redactedReq, result);
|
|
225
262
|
return result;
|
|
226
263
|
}
|
|
227
264
|
catch (err) {
|
|
@@ -231,10 +268,14 @@ export function createEEClient(opts = {}) {
|
|
|
231
268
|
}
|
|
232
269
|
},
|
|
233
270
|
async posttool(payload) {
|
|
271
|
+
const redactedPayload = {
|
|
272
|
+
...payload,
|
|
273
|
+
cwd: relativizePath(payload.cwd),
|
|
274
|
+
};
|
|
234
275
|
await f(`${baseUrl}/api/posttool`, {
|
|
235
276
|
method: "POST",
|
|
236
277
|
headers: headers(),
|
|
237
|
-
body: JSON.stringify(
|
|
278
|
+
body: JSON.stringify(redactPayload(redactedPayload)),
|
|
238
279
|
signal: AbortSignal.timeout(postToolTimeoutMs),
|
|
239
280
|
}).catch((err) => {
|
|
240
281
|
logEeFailure("client.posttool", classifyEeError(err), err);
|
|
@@ -243,6 +284,10 @@ export function createEEClient(opts = {}) {
|
|
|
243
284
|
},
|
|
244
285
|
async routeModel(req, signal) {
|
|
245
286
|
try {
|
|
287
|
+
const redactedReq = {
|
|
288
|
+
...req,
|
|
289
|
+
cwd: relativizePath(req.cwd),
|
|
290
|
+
};
|
|
246
291
|
const ctrl = new AbortController();
|
|
247
292
|
const t = setTimeout(() => ctrl.abort(), 250);
|
|
248
293
|
if (signal)
|
|
@@ -250,7 +295,7 @@ export function createEEClient(opts = {}) {
|
|
|
250
295
|
const resp = await f(`${baseUrl}/api/route-model`, {
|
|
251
296
|
method: "POST",
|
|
252
297
|
headers: headers(),
|
|
253
|
-
body: JSON.stringify(
|
|
298
|
+
body: JSON.stringify(redactPayload(redactedReq)),
|
|
254
299
|
signal: ctrl.signal,
|
|
255
300
|
});
|
|
256
301
|
clearTimeout(t);
|
|
@@ -264,6 +309,10 @@ export function createEEClient(opts = {}) {
|
|
|
264
309
|
},
|
|
265
310
|
async coldRoute(req, signal) {
|
|
266
311
|
try {
|
|
312
|
+
const redactedReq = {
|
|
313
|
+
...req,
|
|
314
|
+
cwd: relativizePath(req.cwd),
|
|
315
|
+
};
|
|
267
316
|
const ctrl = new AbortController();
|
|
268
317
|
const t = setTimeout(() => ctrl.abort(), 1000);
|
|
269
318
|
if (signal)
|
|
@@ -271,7 +320,7 @@ export function createEEClient(opts = {}) {
|
|
|
271
320
|
const resp = await f(`${baseUrl}/api/cold-route`, {
|
|
272
321
|
method: "POST",
|
|
273
322
|
headers: headers(),
|
|
274
|
-
body: JSON.stringify(
|
|
323
|
+
body: JSON.stringify(redactPayload(redactedReq)),
|
|
275
324
|
signal: ctrl.signal,
|
|
276
325
|
});
|
|
277
326
|
clearTimeout(t);
|
|
@@ -284,13 +333,14 @@ export function createEEClient(opts = {}) {
|
|
|
284
333
|
}
|
|
285
334
|
},
|
|
286
335
|
feedback(payload) {
|
|
336
|
+
const redactedPayload = redactPayload(payload);
|
|
287
337
|
f(`${baseUrl}/api/feedback`, {
|
|
288
338
|
method: "POST",
|
|
289
339
|
headers: headers(),
|
|
290
|
-
body: JSON.stringify(
|
|
340
|
+
body: JSON.stringify(redactedPayload),
|
|
291
341
|
}).catch((err) => {
|
|
292
342
|
logEeFailure("client.feedback", classifyEeError(err), err);
|
|
293
|
-
void enqueue({ endpoint: "/api/feedback", body:
|
|
343
|
+
void enqueue({ endpoint: "/api/feedback", body: redactedPayload, enqueuedAt: Date.now() });
|
|
294
344
|
});
|
|
295
345
|
},
|
|
296
346
|
/**
|
|
@@ -300,7 +350,7 @@ export function createEEClient(opts = {}) {
|
|
|
300
350
|
* stale_rule). Fire-and-forget; queued offline like standard feedback.
|
|
301
351
|
*/
|
|
302
352
|
noiseFeedback(payload) {
|
|
303
|
-
const body = { ...payload, verdict: "IRRELEVANT" };
|
|
353
|
+
const body = redactPayload({ ...payload, verdict: "IRRELEVANT" });
|
|
304
354
|
f(`${baseUrl}/api/feedback`, {
|
|
305
355
|
method: "POST",
|
|
306
356
|
headers: headers(),
|
|
@@ -322,10 +372,11 @@ export function createEEClient(opts = {}) {
|
|
|
322
372
|
},
|
|
323
373
|
// ─── P0: Route feedback (fire-and-forget) ─────────────────────────────────
|
|
324
374
|
routeFeedback(payload) {
|
|
375
|
+
const redactedPayload = redactPayload(payload);
|
|
325
376
|
f(`${baseUrl}/api/route-feedback`, {
|
|
326
377
|
method: "POST",
|
|
327
378
|
headers: headers(),
|
|
328
|
-
body: JSON.stringify(
|
|
379
|
+
body: JSON.stringify(redactedPayload),
|
|
329
380
|
}).catch((err) => {
|
|
330
381
|
logEeFailure("client.routeFeedback", classifyEeError(err), err);
|
|
331
382
|
/* fire-and-forget */
|
|
@@ -333,41 +384,54 @@ export function createEEClient(opts = {}) {
|
|
|
333
384
|
},
|
|
334
385
|
// ─── P1: Prompt-stale reconciliation ──────────────────────────────────────
|
|
335
386
|
async promptStale(req) {
|
|
387
|
+
const redactedReq = redactPayload({
|
|
388
|
+
...req,
|
|
389
|
+
nextPromptMeta: req.nextPromptMeta
|
|
390
|
+
? {
|
|
391
|
+
...req.nextPromptMeta,
|
|
392
|
+
cwd: req.nextPromptMeta.cwd ? relativizePath(req.nextPromptMeta.cwd) : undefined,
|
|
393
|
+
}
|
|
394
|
+
: undefined,
|
|
395
|
+
});
|
|
336
396
|
try {
|
|
337
397
|
const resp = await f(`${baseUrl}/api/prompt-stale`, {
|
|
338
398
|
method: "POST",
|
|
339
399
|
headers: headers(),
|
|
340
|
-
body: JSON.stringify(
|
|
400
|
+
body: JSON.stringify(redactedReq),
|
|
341
401
|
signal: AbortSignal.timeout(2000),
|
|
342
402
|
});
|
|
343
403
|
if (!resp.ok) {
|
|
344
|
-
void enqueue({ endpoint: "/api/prompt-stale", body:
|
|
404
|
+
void enqueue({ endpoint: "/api/prompt-stale", body: redactedReq, enqueuedAt: Date.now() });
|
|
345
405
|
return null;
|
|
346
406
|
}
|
|
347
407
|
return (await resp.json());
|
|
348
408
|
}
|
|
349
409
|
catch {
|
|
350
|
-
void enqueue({ endpoint: "/api/prompt-stale", body:
|
|
410
|
+
void enqueue({ endpoint: "/api/prompt-stale", body: redactedReq, enqueuedAt: Date.now() });
|
|
351
411
|
return null;
|
|
352
412
|
}
|
|
353
413
|
},
|
|
354
414
|
// ─── P1: Session extract ──────────────────────────────────────────────────
|
|
355
415
|
async extract(req, signal) {
|
|
416
|
+
const redactedReq = redactPayload({
|
|
417
|
+
...req,
|
|
418
|
+
projectPath: relativizePath(req.projectPath),
|
|
419
|
+
});
|
|
356
420
|
try {
|
|
357
421
|
const resp = await f(`${baseUrl}/api/extract`, {
|
|
358
422
|
method: "POST",
|
|
359
423
|
headers: headers(),
|
|
360
|
-
body: JSON.stringify(
|
|
424
|
+
body: JSON.stringify(redactedReq),
|
|
361
425
|
signal: signal ?? AbortSignal.timeout(10_000),
|
|
362
426
|
});
|
|
363
427
|
if (!resp.ok) {
|
|
364
|
-
void enqueue({ endpoint: "/api/extract", body:
|
|
428
|
+
void enqueue({ endpoint: "/api/extract", body: redactedReq, enqueuedAt: Date.now() });
|
|
365
429
|
return null;
|
|
366
430
|
}
|
|
367
431
|
return (await resp.json());
|
|
368
432
|
}
|
|
369
433
|
catch {
|
|
370
|
-
void enqueue({ endpoint: "/api/extract", body:
|
|
434
|
+
void enqueue({ endpoint: "/api/extract", body: redactedReq, enqueuedAt: Date.now() });
|
|
371
435
|
return null;
|
|
372
436
|
}
|
|
373
437
|
},
|
|
@@ -527,29 +591,51 @@ export function createEEClient(opts = {}) {
|
|
|
527
591
|
async recall(query, opts = {}) {
|
|
528
592
|
const body = { query };
|
|
529
593
|
if (opts.cwd)
|
|
530
|
-
body.cwd = opts.cwd;
|
|
594
|
+
body.cwd = relativizePath(opts.cwd);
|
|
531
595
|
if (opts.project)
|
|
532
596
|
body.project_slug = opts.project;
|
|
533
597
|
if (opts.sourceSession)
|
|
534
598
|
body.sourceSession = opts.sourceSession;
|
|
599
|
+
// Per-stance recall weighting (item 3): forward the council stance/role so
|
|
600
|
+
// the server weights recall collections toward what this stance cares about.
|
|
601
|
+
if (opts.stance)
|
|
602
|
+
body.stance = opts.stance;
|
|
603
|
+
if (opts.role)
|
|
604
|
+
body.role = opts.role;
|
|
605
|
+
const redactedBody = redactPayload(body);
|
|
535
606
|
// Server bounds the recall pipeline at ~8s internally (handleRecall's
|
|
536
607
|
// AbortSignal.timeout(8000)); embedding + 3-leg search + network push real
|
|
537
608
|
// wall-time past that (measured ~9.3s on a warm VPS). An 8s client ceiling
|
|
538
609
|
// races the server and loses → spurious ee_unavailable. 15s gives margin
|
|
539
610
|
// so a slow-but-valid recall still lands rather than being dropped.
|
|
540
611
|
const timeoutMs = opts.timeoutMs ?? 15000;
|
|
612
|
+
const startedAt = Date.now();
|
|
541
613
|
try {
|
|
542
614
|
const resp = await f(`${baseUrl}/api/recall`, {
|
|
543
615
|
method: "POST",
|
|
544
616
|
headers: headers(),
|
|
545
|
-
body: JSON.stringify(
|
|
617
|
+
body: JSON.stringify(redactedBody),
|
|
546
618
|
signal: opts.signal ?? AbortSignal.timeout(timeoutMs),
|
|
547
619
|
});
|
|
548
|
-
if (!resp.ok)
|
|
620
|
+
if (!resp.ok) {
|
|
621
|
+
// Keep returning null — callers map it to "EE unavailable" — but never
|
|
622
|
+
// discard the status. Collapsing 429/401/500 into the same null a
|
|
623
|
+
// timeout produces is what made the 2026-07-17 incident unfalsifiable
|
|
624
|
+
// from the client: "is the server rate-limiting us?" could not be
|
|
625
|
+
// answered without reading the server's source.
|
|
626
|
+
logEeFailure("client.recall", "error", new Error(`HTTP ${resp.status}`), {
|
|
627
|
+
status: resp.status,
|
|
628
|
+
elapsedMs: Date.now() - startedAt,
|
|
629
|
+
});
|
|
549
630
|
return null;
|
|
631
|
+
}
|
|
550
632
|
return (await resp.json());
|
|
551
633
|
}
|
|
552
|
-
catch {
|
|
634
|
+
catch (err) {
|
|
635
|
+
logEeFailure("client.recall", classifyEeError(err), err, {
|
|
636
|
+
elapsedMs: Date.now() - startedAt,
|
|
637
|
+
budgetMs: timeoutMs,
|
|
638
|
+
});
|
|
553
639
|
return null;
|
|
554
640
|
}
|
|
555
641
|
},
|
|
@@ -588,6 +674,8 @@ export function createEEClient(opts = {}) {
|
|
|
588
674
|
body.maxTokens = options.maxTokens;
|
|
589
675
|
if (options.provider)
|
|
590
676
|
body.provider = options.provider;
|
|
677
|
+
if (options.useExtractModel)
|
|
678
|
+
body.useExtractModel = true;
|
|
591
679
|
}
|
|
592
680
|
const resp = await f(`${baseUrl}/api/brain`, {
|
|
593
681
|
method: "POST",
|
|
@@ -8,27 +8,7 @@
|
|
|
8
8
|
* health probe is reported, not hidden, and never blocks setup.
|
|
9
9
|
*/
|
|
10
10
|
import { createInterface } from "node:readline";
|
|
11
|
-
import { writeExperienceConfig } from "./auth.js";
|
|
12
|
-
/** Best-effort reachability probe — returns true/false, never throws. */
|
|
13
|
-
async function probeHealth(baseUrl, token) {
|
|
14
|
-
try {
|
|
15
|
-
const ac = new AbortController();
|
|
16
|
-
const timer = setTimeout(() => ac.abort(), 4000);
|
|
17
|
-
try {
|
|
18
|
-
const res = await fetch(`${baseUrl}/health`, {
|
|
19
|
-
signal: ac.signal,
|
|
20
|
-
headers: token ? { authorization: `Bearer ${token}` } : undefined,
|
|
21
|
-
});
|
|
22
|
-
return res.ok;
|
|
23
|
-
}
|
|
24
|
-
finally {
|
|
25
|
-
clearTimeout(timer);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
11
|
+
import { probeEEHealth, writeExperienceConfig } from "./auth.js";
|
|
32
12
|
/**
|
|
33
13
|
* Returns true when a config was written (so the caller can reload EE auth).
|
|
34
14
|
* Returns false when skipped or invalid.
|
|
@@ -38,8 +18,8 @@ export async function firstRunEESetup() {
|
|
|
38
18
|
const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a)));
|
|
39
19
|
try {
|
|
40
20
|
process.stderr.write("\nExperience Engine (optional) — a shared brain that recalls past decisions, gotchas,\n" +
|
|
41
|
-
"and recipes so the agent works like a senior on your stack.
|
|
42
|
-
"
|
|
21
|
+
"and recipes so the agent works like a senior on your stack. Skipping is fine: you can\n" +
|
|
22
|
+
"connect one at any time with `/ee config <url> [token]`.\n\n");
|
|
43
23
|
const url = (await ask("EE server URL (blank to skip): ")).trim();
|
|
44
24
|
if (!url) {
|
|
45
25
|
process.stderr.write("Skipped Experience Engine setup.\n");
|
|
@@ -59,10 +39,10 @@ export async function firstRunEESetup() {
|
|
|
59
39
|
...(token ? { serverAuthToken: token } : {}),
|
|
60
40
|
});
|
|
61
41
|
process.stderr.write(`Wrote Experience Engine config → ~/.experience/config.json (serverBaseUrl=${normalized}).\n`);
|
|
62
|
-
const
|
|
63
|
-
process.stderr.write(
|
|
42
|
+
const health = await probeEEHealth(normalized, token || undefined);
|
|
43
|
+
process.stderr.write(health.ok
|
|
64
44
|
? " ✓ EE server reachable.\n"
|
|
65
|
-
:
|
|
45
|
+
: ` ⚠ Could not reach the EE server right now — ${health.detail} (saved anyway; recheck with '/ee config').\n`);
|
|
66
46
|
return true;
|
|
67
47
|
}
|
|
68
48
|
catch (err) {
|
|
@@ -10,9 +10,7 @@
|
|
|
10
10
|
* recover lessons from sessions that pre-date the transcript-emit feature.
|
|
11
11
|
* Idempotent: re-running overwrites the same per-session JSONL.
|
|
12
12
|
*/
|
|
13
|
-
import
|
|
14
|
-
import os from "node:os";
|
|
15
|
-
import path from "node:path";
|
|
13
|
+
import { getDatabase } from "../storage/db.js";
|
|
16
14
|
import { emitTranscriptToDisk, getEmitRoot } from "./transcript-emit.js";
|
|
17
15
|
async function openDb(dbPath) {
|
|
18
16
|
// Prefer better-sqlite3 (sync), fall back to bun:sqlite when running under Bun.
|
|
@@ -52,17 +50,15 @@ export async function exportTranscripts(opts = {}) {
|
|
|
52
50
|
const maxAgeDays = opts.maxAgeDays ?? 30;
|
|
53
51
|
const minMessages = opts.minMessages ?? 4;
|
|
54
52
|
const dryRun = opts.dryRun ?? false;
|
|
55
|
-
const
|
|
56
|
-
if (!fs.existsSync(dbPath)) {
|
|
57
|
-
throw new Error(`muonroi.db not found at ${dbPath}`);
|
|
58
|
-
}
|
|
59
|
-
const db = await openDb(dbPath);
|
|
53
|
+
const db = opts.dbOverride ?? getDatabase();
|
|
60
54
|
try {
|
|
61
55
|
const cutoff = Date.now() - maxAgeDays * 86400_000;
|
|
62
56
|
const cutoffIso = new Date(cutoff).toISOString();
|
|
63
57
|
// Pull sessions touched in window. cwd_last is the cwd at session-end —
|
|
64
58
|
// critical for EE scope detection so framework/lang resolve correctly.
|
|
65
|
-
const sessions = db
|
|
59
|
+
const sessions = db
|
|
60
|
+
.prepare(`SELECT id, updated_at, cwd_last FROM sessions WHERE updated_at >= '${cutoffIso}' ORDER BY updated_at DESC`)
|
|
61
|
+
.all();
|
|
66
62
|
const out = {
|
|
67
63
|
totalSessions: sessions.length,
|
|
68
64
|
written: 0,
|
|
@@ -71,7 +67,9 @@ export async function exportTranscripts(opts = {}) {
|
|
|
71
67
|
outputRoot: getEmitRoot(),
|
|
72
68
|
};
|
|
73
69
|
for (const s of sessions) {
|
|
74
|
-
const rows = db
|
|
70
|
+
const rows = db
|
|
71
|
+
.prepare(`SELECT session_id, seq, role, message_json FROM messages WHERE session_id = '${s.id.replace(/'/g, "''")}' ORDER BY seq ASC`)
|
|
72
|
+
.all();
|
|
75
73
|
if (rows.length === 0) {
|
|
76
74
|
out.skippedEmpty++;
|
|
77
75
|
continue;
|
|
@@ -47,9 +47,38 @@ export async function extractSession(messages, projectPath, source, sessionId) {
|
|
|
47
47
|
getDefaultEEClient()
|
|
48
48
|
.evolve("post-extract")
|
|
49
49
|
.catch(() => { });
|
|
50
|
+
// WRITE arm of the who-am-i loop — fire-and-forget. Mine the user's working style from
|
|
51
|
+
// this transcript and persist it to experience-behavioral, which who-am-i-brain reads
|
|
52
|
+
// back next session (READ arm). Deliberately NOT awaited: the classify is a ~9s brain
|
|
53
|
+
// call and must not block cli-exit (same rationale as the async extract). It completes on
|
|
54
|
+
// cli-clear (process stays alive) and is best-effort on cli-exit — style converges over
|
|
55
|
+
// sessions, so a missed teardown is harmless. Fail-open, gated behind its own flag.
|
|
56
|
+
void writeStyleSignalsFireAndForget(transcript);
|
|
50
57
|
}
|
|
51
58
|
catch {
|
|
52
59
|
// D-05: swallow all errors silently
|
|
53
60
|
}
|
|
54
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Fire-and-forget bridge from extractSession into the style WRITE arm. Kept separate so the
|
|
64
|
+
* bridge/search imports stay lazy (only paid when a real session ends) and so every failure
|
|
65
|
+
* mode — flag off, EE unreachable, classifier null, write error — degrades to a no-op.
|
|
66
|
+
*/
|
|
67
|
+
async function writeStyleSignalsFireAndForget(transcript) {
|
|
68
|
+
try {
|
|
69
|
+
const { isStyleExtractEnabled, writeStyleSignals } = await import("./extract-style.js");
|
|
70
|
+
if (!isStyleExtractEnabled())
|
|
71
|
+
return;
|
|
72
|
+
const { classifyViaBrain } = await import("./bridge.js");
|
|
73
|
+
const { writeExperienceEE } = await import("./search.js");
|
|
74
|
+
// No projectSlug: working style is a cross-repo property of the user, so style rules are
|
|
75
|
+
// written GLOBAL (unscoped) — who-am-i-brain searches experience-behavioral broadly and a
|
|
76
|
+
// repo-scoped style rule would be needlessly narrow. (Contrast the technical-lesson extract,
|
|
77
|
+
// which IS repo-scoped because a bug fix is repo-specific.)
|
|
78
|
+
await writeStyleSignals({ classifyViaBrain, writeExperience: writeExperienceEE }, transcript);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// swallow — style extraction is strictly best-effort
|
|
82
|
+
}
|
|
83
|
+
}
|
|
55
84
|
//# sourceMappingURL=extract-session.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { WriteExperienceResult } from "./search.js";
|
|
2
|
+
/** Feature flag — default ON, opt out with MUONROI_STYLE_EXTRACT=0. */
|
|
3
|
+
export declare function isStyleExtractEnabled(): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* PURE: build the style-mining prompt. Asks the brain to emit 0..N natural-language style
|
|
6
|
+
* rules about the USER (never the task), each standalone and reusable as future guidance,
|
|
7
|
+
* with a self-reported confidence. Emitting NOTHING when the transcript shows no clear style
|
|
8
|
+
* is explicitly the right answer — we would rather miss a session than pollute the brain.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildStyleExtractPrompt(transcript: string): string;
|
|
11
|
+
export interface StyleRule {
|
|
12
|
+
rule: string;
|
|
13
|
+
confidence: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* PURE: coerce a brain reply (JSON string, fenced block, or already-parsed object) into a
|
|
17
|
+
* gated list of style rules. Applies the confidence floor, length bounds, dedup by normalized
|
|
18
|
+
* text, and the per-session cap. Returns [] when nothing usable survives (fail-open).
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseStyleRules(raw: unknown): StyleRule[];
|
|
21
|
+
/**
|
|
22
|
+
* PURE: a stable title for a style rule so repeated sessions MERGE server-side instead of
|
|
23
|
+
* accreting near-duplicates. Derived deterministically from the rule text (lowercased, first
|
|
24
|
+
* few significant words) — same recurring preference → same title → storeImportedExperience
|
|
25
|
+
* can collapse them. Marked with a "user-style:" prefix so the entries are identifiable and
|
|
26
|
+
* prunable as a class.
|
|
27
|
+
*/
|
|
28
|
+
export declare function styleRuleTitle(rule: string): string;
|
|
29
|
+
export interface StyleExtractDeps {
|
|
30
|
+
classifyViaBrain: (prompt: string, timeoutMs?: number, options?: {
|
|
31
|
+
systemPrompt?: string;
|
|
32
|
+
responseFormat?: {
|
|
33
|
+
type: string;
|
|
34
|
+
};
|
|
35
|
+
maxTokens?: number;
|
|
36
|
+
useExtractModel?: boolean;
|
|
37
|
+
}) => Promise<string | null>;
|
|
38
|
+
writeExperience: (lesson: string, opts: {
|
|
39
|
+
collection?: string;
|
|
40
|
+
title?: string;
|
|
41
|
+
projectSlug?: string;
|
|
42
|
+
confidence?: number;
|
|
43
|
+
}) => Promise<WriteExperienceResult>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Classify the transcript into gated style rules. Fail-open []: a degraded brain must never
|
|
47
|
+
* break session teardown.
|
|
48
|
+
*/
|
|
49
|
+
export declare function extractStyleSignals(deps: StyleExtractDeps, transcript: string): Promise<StyleRule[]>;
|
|
50
|
+
/**
|
|
51
|
+
* End-to-end WRITE arm: mine style rules from the transcript and persist each to
|
|
52
|
+
* experience-behavioral. Returns the number written. Fire-and-forget from extractSession —
|
|
53
|
+
* fail-open, never throws. `projectSlug` scopes the rule; confidence carries through so the
|
|
54
|
+
* brain can weight it.
|
|
55
|
+
*/
|
|
56
|
+
export declare function writeStyleSignals(deps: StyleExtractDeps, transcript: string, opts?: {
|
|
57
|
+
projectSlug?: string;
|
|
58
|
+
}): Promise<number>;
|