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,270 @@
|
|
|
1
|
+
// src/ee/extract-style.ts
|
|
2
|
+
//
|
|
3
|
+
// Personality / working-style extraction — the WRITE arm that CLOSES the who-am-i loop.
|
|
4
|
+
//
|
|
5
|
+
// The READ arm (who-am-i-brain.ts) derives a WhoAmIProfile from the `experience-behavioral`
|
|
6
|
+
// brain: it searches the user's accumulated style rules and classifies them into dims that
|
|
7
|
+
// the PIL layers read. But on a thin-client NOTHING was feeding that collection with style
|
|
8
|
+
// signals mined from the user's OWN muonroi-cli sessions — the general server extract
|
|
9
|
+
// (`extractFromSession`) only mines TECHNICAL mistakes/lessons (detectExperience → extractQA),
|
|
10
|
+
// never "the user prefers concise answers / rejects hand-holding / decides fast". So the loop
|
|
11
|
+
// was open: who-am-i could only read rules the user hand-authored or the Claude Code Stop hook
|
|
12
|
+
// happened to capture.
|
|
13
|
+
//
|
|
14
|
+
// This module runs at session-end (alongside extractSession) and mines the transcript for the
|
|
15
|
+
// USER's working-style, writing each high-confidence signal as a natural-language behavioral
|
|
16
|
+
// rule into `experience-behavioral` via writeExperienceEE. Next session, who-am-i-brain reads
|
|
17
|
+
// those rules back and classifies them into dims → the loop is closed.
|
|
18
|
+
//
|
|
19
|
+
// Design guarantees:
|
|
20
|
+
// • Agent-first (no keyword regex): the transcript→style mapping is decided by the brain LLM
|
|
21
|
+
// (classifyViaBrain), honouring the repo rule that classification is never regex. The only
|
|
22
|
+
// regex here is tolerant JSON extraction from the LLM reply.
|
|
23
|
+
// • Natural-language interface (NOT a shared enum): the WRITE side emits plain style
|
|
24
|
+
// sentences; the READ side (who-am-i-brain) re-classifies them with its own DIM_VOCAB.
|
|
25
|
+
// Neither side imports the other's vocabulary — so there is no cross-module enum coupling
|
|
26
|
+
// to drift (contrast the EE-side DIM_VOCAB lockstep this deliberately avoids).
|
|
27
|
+
// • Anti-pollution: experience-behavioral also drives passive hint injection, so a wrong or
|
|
28
|
+
// low-confidence guess is actively harmful (it feeds who-am-i AND every passive hint). We
|
|
29
|
+
// gate HARD — high confidence floor, length bounds, a small per-session cap, and a stable
|
|
30
|
+
// per-signal title so repeated sessions MERGE instead of accreting near-duplicates.
|
|
31
|
+
// • Fail-open: any gap (classifier null, unparseable output, dep throws, EE down) writes
|
|
32
|
+
// nothing and never throws. Style converges over many sessions; missing one is harmless.
|
|
33
|
+
/** The collection who-am-i-brain reads back — keep in lockstep with BEHAVIORAL_COLLECTION there. */
|
|
34
|
+
const BEHAVIORAL_COLLECTION = "experience-behavioral";
|
|
35
|
+
/**
|
|
36
|
+
* Only signals at/above this confidence are written. High on purpose: a style rule that lands
|
|
37
|
+
* in experience-behavioral influences who-am-i AND passive hints, so a confident-but-wrong
|
|
38
|
+
* guess is worse than silence. The brain self-reports confidence per the prompt contract.
|
|
39
|
+
*/
|
|
40
|
+
const STYLE_WRITE_MIN_CONFIDENCE = 0.7;
|
|
41
|
+
/** At most this many style rules per session — style is slow-moving; a burst is almost always noise. */
|
|
42
|
+
const MAX_STYLE_RULES_PER_SESSION = 3;
|
|
43
|
+
/** A style rule shorter than this is too vague to guide anything; longer than this is task prose leaking in. */
|
|
44
|
+
const MIN_RULE_CHARS = 15;
|
|
45
|
+
const MAX_RULE_CHARS = 240;
|
|
46
|
+
/**
|
|
47
|
+
* Off the hot path (fire-and-forget at session-end), so a wide budget. The server's strong
|
|
48
|
+
* brainExtractModel is a reasoning model (deepseek-v4-flash) whose think+emit cycle runs
|
|
49
|
+
* ~4-10s on this transcript-sized prompt (verified live). 20s clears the tail; it never blocks
|
|
50
|
+
* anything (background). Mirrors who-am-i-brain's budget.
|
|
51
|
+
*/
|
|
52
|
+
const STYLE_CLASSIFY_TIMEOUT_MS = 20000;
|
|
53
|
+
/**
|
|
54
|
+
* The rules JSON itself is tiny (~150 tokens), but the server's extract model
|
|
55
|
+
* (deepseek-v4-flash) is a REASONING model — its thinking tokens count against this same
|
|
56
|
+
* budget and land in a separate reasoning_content field, NOT the JSON. A tight cap (500) let
|
|
57
|
+
* the reasoning consume the whole budget and truncate the actual JSON to empty → intermittent
|
|
58
|
+
* zero-rule results (verified live: identical input gave 3 rules then 0). Give thinking ample
|
|
59
|
+
* headroom so the JSON always survives; the extra tokens are only spent when the model
|
|
60
|
+
* actually reasons, and this is an off-hot-path background call.
|
|
61
|
+
*/
|
|
62
|
+
const STYLE_CLASSIFY_MAX_TOKENS = 3000;
|
|
63
|
+
/**
|
|
64
|
+
* System-prompt override — REQUIRED, same reason as who-am-i-brain: the EE brain proxy's
|
|
65
|
+
* default system prompt is a tier-classifier ("output ONE word … ignore content") that
|
|
66
|
+
* hijacks structured output into garbage. Verified on the live VPS (2026-07-05).
|
|
67
|
+
*/
|
|
68
|
+
const STYLE_SYSTEM_PROMPT = "You mine a developer's WORKING STYLE from a session transcript — how they prefer to " +
|
|
69
|
+
"communicate, decide, delegate, receive feedback, and handle risk. Follow the user " +
|
|
70
|
+
"message instructions EXACTLY and output ONLY the requested JSON object. Do not classify " +
|
|
71
|
+
"task complexity, do not output single words, do not add prose before or after the JSON.";
|
|
72
|
+
/** Feature flag — default ON, opt out with MUONROI_STYLE_EXTRACT=0. */
|
|
73
|
+
export function isStyleExtractEnabled() {
|
|
74
|
+
return process.env.MUONROI_STYLE_EXTRACT !== "0";
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* PURE: build the style-mining prompt. Asks the brain to emit 0..N natural-language style
|
|
78
|
+
* rules about the USER (never the task), each standalone and reusable as future guidance,
|
|
79
|
+
* with a self-reported confidence. Emitting NOTHING when the transcript shows no clear style
|
|
80
|
+
* is explicitly the right answer — we would rather miss a session than pollute the brain.
|
|
81
|
+
*/
|
|
82
|
+
export function buildStyleExtractPrompt(transcript) {
|
|
83
|
+
return [
|
|
84
|
+
"From the session transcript below, extract DURABLE signals about the DEVELOPER's working",
|
|
85
|
+
"style — not the task, not the code. Look for how they prefer to communicate (concise vs",
|
|
86
|
+
"detailed), decide (fast/intuitive vs deliberate), delegate (autonomous vs collaborative),",
|
|
87
|
+
"receive feedback (blunt correction vs gentle), and tolerate risk.",
|
|
88
|
+
"",
|
|
89
|
+
"Output ONLY a JSON object of the form:",
|
|
90
|
+
'{"rules": [{"rule": "<one imperative sentence of durable style guidance>", "confidence": 0.0-1.0}]}',
|
|
91
|
+
"",
|
|
92
|
+
"Rules:",
|
|
93
|
+
'- Each `rule` must be a standalone, reusable instruction (e.g. "The user prefers concise',
|
|
94
|
+
' answers — skip preamble and lead with the recommendation."). NOT a fact about this task.',
|
|
95
|
+
"- Emit a signal ONLY when the transcript gives clear, repeated evidence. When in doubt, omit it.",
|
|
96
|
+
"- An EMPTY array is the correct answer for a task-only session with no style signal.",
|
|
97
|
+
"- Never invent a preference the transcript does not actually demonstrate.",
|
|
98
|
+
"- confidence reflects how strongly the transcript supports the rule.",
|
|
99
|
+
"",
|
|
100
|
+
"Transcript:",
|
|
101
|
+
transcript,
|
|
102
|
+
].join("\n");
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* PURE: coerce a brain reply (JSON string, fenced block, or already-parsed object) into a
|
|
106
|
+
* gated list of style rules. Applies the confidence floor, length bounds, dedup by normalized
|
|
107
|
+
* text, and the per-session cap. Returns [] when nothing usable survives (fail-open).
|
|
108
|
+
*/
|
|
109
|
+
export function parseStyleRules(raw) {
|
|
110
|
+
let obj = raw;
|
|
111
|
+
if (typeof raw === "string") {
|
|
112
|
+
const json = extractJsonObject(raw);
|
|
113
|
+
if (!json)
|
|
114
|
+
return [];
|
|
115
|
+
try {
|
|
116
|
+
obj = JSON.parse(json);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!obj || typeof obj !== "object")
|
|
123
|
+
return [];
|
|
124
|
+
const arr = obj.rules;
|
|
125
|
+
if (!Array.isArray(arr))
|
|
126
|
+
return [];
|
|
127
|
+
const seen = new Set();
|
|
128
|
+
const out = [];
|
|
129
|
+
for (const item of arr) {
|
|
130
|
+
if (!item || typeof item !== "object")
|
|
131
|
+
continue;
|
|
132
|
+
const rule = typeof item.rule === "string" ? item.rule.trim() : "";
|
|
133
|
+
const confidence = Number(item.confidence);
|
|
134
|
+
if (!rule || !Number.isFinite(confidence))
|
|
135
|
+
continue;
|
|
136
|
+
if (confidence < STYLE_WRITE_MIN_CONFIDENCE)
|
|
137
|
+
continue;
|
|
138
|
+
if (rule.length < MIN_RULE_CHARS || rule.length > MAX_RULE_CHARS)
|
|
139
|
+
continue;
|
|
140
|
+
const norm = rule.toLowerCase().replace(/\s+/g, " ");
|
|
141
|
+
if (seen.has(norm))
|
|
142
|
+
continue;
|
|
143
|
+
seen.add(norm);
|
|
144
|
+
out.push({ rule, confidence });
|
|
145
|
+
if (out.length >= MAX_STYLE_RULES_PER_SESSION)
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
/** Tolerantly extract the first balanced JSON object from an LLM reply. */
|
|
151
|
+
function extractJsonObject(text) {
|
|
152
|
+
const start = text.indexOf("{");
|
|
153
|
+
if (start === -1)
|
|
154
|
+
return null;
|
|
155
|
+
let depth = 0;
|
|
156
|
+
let inStr = false;
|
|
157
|
+
let esc = false;
|
|
158
|
+
for (let i = start; i < text.length; i++) {
|
|
159
|
+
const ch = text[i];
|
|
160
|
+
if (inStr) {
|
|
161
|
+
if (esc)
|
|
162
|
+
esc = false;
|
|
163
|
+
else if (ch === "\\")
|
|
164
|
+
esc = true;
|
|
165
|
+
else if (ch === '"')
|
|
166
|
+
inStr = false;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (ch === '"')
|
|
170
|
+
inStr = true;
|
|
171
|
+
else if (ch === "{")
|
|
172
|
+
depth++;
|
|
173
|
+
else if (ch === "}") {
|
|
174
|
+
depth--;
|
|
175
|
+
if (depth === 0)
|
|
176
|
+
return text.slice(start, i + 1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* PURE: a stable title for a style rule so repeated sessions MERGE server-side instead of
|
|
183
|
+
* accreting near-duplicates. Derived deterministically from the rule text (lowercased, first
|
|
184
|
+
* few significant words) — same recurring preference → same title → storeImportedExperience
|
|
185
|
+
* can collapse them. Marked with a "user-style:" prefix so the entries are identifiable and
|
|
186
|
+
* prunable as a class.
|
|
187
|
+
*/
|
|
188
|
+
export function styleRuleTitle(rule) {
|
|
189
|
+
const words = rule
|
|
190
|
+
.toLowerCase()
|
|
191
|
+
.replace(/[^a-z0-9\s]/g, " ")
|
|
192
|
+
.split(/\s+/)
|
|
193
|
+
.filter((w) => w.length > 3 && !STOPWORDS.has(w))
|
|
194
|
+
.slice(0, 5)
|
|
195
|
+
.join("-");
|
|
196
|
+
return `user-style:${words || "general"}`;
|
|
197
|
+
}
|
|
198
|
+
const STOPWORDS = new Set([
|
|
199
|
+
"the",
|
|
200
|
+
"user",
|
|
201
|
+
"prefers",
|
|
202
|
+
"wants",
|
|
203
|
+
"with",
|
|
204
|
+
"that",
|
|
205
|
+
"this",
|
|
206
|
+
"they",
|
|
207
|
+
"them",
|
|
208
|
+
"their",
|
|
209
|
+
"when",
|
|
210
|
+
"into",
|
|
211
|
+
"over",
|
|
212
|
+
"from",
|
|
213
|
+
"answers",
|
|
214
|
+
"answer",
|
|
215
|
+
"reply",
|
|
216
|
+
"replies",
|
|
217
|
+
]);
|
|
218
|
+
/**
|
|
219
|
+
* Classify the transcript into gated style rules. Fail-open []: a degraded brain must never
|
|
220
|
+
* break session teardown.
|
|
221
|
+
*/
|
|
222
|
+
export async function extractStyleSignals(deps, transcript) {
|
|
223
|
+
try {
|
|
224
|
+
if (!transcript || transcript.trim().length < 100)
|
|
225
|
+
return [];
|
|
226
|
+
const reply = await deps.classifyViaBrain(buildStyleExtractPrompt(transcript), STYLE_CLASSIFY_TIMEOUT_MS, {
|
|
227
|
+
systemPrompt: STYLE_SYSTEM_PROMPT,
|
|
228
|
+
responseFormat: { type: "json_object" },
|
|
229
|
+
maxTokens: STYLE_CLASSIFY_MAX_TOKENS,
|
|
230
|
+
// Structured multi-signal extraction needs the server's stronger brainExtractModel;
|
|
231
|
+
// the hot-path model is too weak (verified on the live VPS for the READ side too).
|
|
232
|
+
useExtractModel: true,
|
|
233
|
+
});
|
|
234
|
+
if (!reply)
|
|
235
|
+
return [];
|
|
236
|
+
return parseStyleRules(reply);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* End-to-end WRITE arm: mine style rules from the transcript and persist each to
|
|
244
|
+
* experience-behavioral. Returns the number written. Fire-and-forget from extractSession —
|
|
245
|
+
* fail-open, never throws. `projectSlug` scopes the rule; confidence carries through so the
|
|
246
|
+
* brain can weight it.
|
|
247
|
+
*/
|
|
248
|
+
export async function writeStyleSignals(deps, transcript, opts = {}) {
|
|
249
|
+
if (!isStyleExtractEnabled())
|
|
250
|
+
return 0;
|
|
251
|
+
const rules = await extractStyleSignals(deps, transcript);
|
|
252
|
+
let written = 0;
|
|
253
|
+
for (const r of rules) {
|
|
254
|
+
try {
|
|
255
|
+
const res = await deps.writeExperience(r.rule, {
|
|
256
|
+
collection: BEHAVIORAL_COLLECTION,
|
|
257
|
+
title: styleRuleTitle(r.rule),
|
|
258
|
+
projectSlug: opts.projectSlug,
|
|
259
|
+
confidence: r.confidence,
|
|
260
|
+
});
|
|
261
|
+
if (res.ok)
|
|
262
|
+
written++;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// fail-open per rule — one bad write must not abort the rest
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return written;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=extract-style.js.map
|
|
@@ -24,6 +24,15 @@ export interface RecallLedger {
|
|
|
24
24
|
clear(id: string): boolean;
|
|
25
25
|
/** Check if an id was ever cleared (fed back) in this session. Used by PIL Layer 3 to suppress re-injection. */
|
|
26
26
|
wasCleared(id: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if an id is currently PENDING (recorded as unrated debt, not yet fed
|
|
29
|
+
* back). PIL Layer 3 uses this to suppress re-injecting the FULL content of a
|
|
30
|
+
* hint it already surfaced earlier this session — the hit is already in the
|
|
31
|
+
* conversation history and still listed in the feedback nudge, so repeating
|
|
32
|
+
* its body every turn is pure token waste (the "hint lặp" repetition). First
|
|
33
|
+
* sighting is injected + recorded; subsequent turns skip the body.
|
|
34
|
+
*/
|
|
35
|
+
isPending(id: string): boolean;
|
|
27
36
|
/** Oldest-first list of still-unrated recalls. */
|
|
28
37
|
pending(): PendingRecall[];
|
|
29
38
|
pendingCount(): number;
|
|
@@ -45,6 +45,9 @@ export function createRecallLedger() {
|
|
|
45
45
|
wasCleared(id) {
|
|
46
46
|
return cleared.has(String(id ?? "").trim());
|
|
47
47
|
},
|
|
48
|
+
isPending(id) {
|
|
49
|
+
return map.has(String(id ?? "").trim());
|
|
50
|
+
},
|
|
48
51
|
pending() {
|
|
49
52
|
return [...map.values()].sort((a, b) => a.ts - b.ts);
|
|
50
53
|
},
|
package/dist/src/ee/scope.d.ts
CHANGED
package/dist/src/ee/scope.js
CHANGED
|
@@ -42,6 +42,30 @@ async function findGitRoot(start) {
|
|
|
42
42
|
}
|
|
43
43
|
return null;
|
|
44
44
|
}
|
|
45
|
+
export function sanitizeRemoteUrl(remoteUrl) {
|
|
46
|
+
const trimmed = remoteUrl.trim();
|
|
47
|
+
// If it starts with a scheme like http://, https://, ssh://, git:// etc.
|
|
48
|
+
if (/^[a-zA-Z0-9+-.]+:\/\//.test(trimmed)) {
|
|
49
|
+
try {
|
|
50
|
+
const parsed = new URL(trimmed);
|
|
51
|
+
if (parsed.protocol === "http:" ||
|
|
52
|
+
parsed.protocol === "https:" ||
|
|
53
|
+
parsed.protocol === "git+http:" ||
|
|
54
|
+
parsed.protocol === "git+https:") {
|
|
55
|
+
parsed.username = "";
|
|
56
|
+
parsed.password = "";
|
|
57
|
+
}
|
|
58
|
+
return parsed.toString();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Fallback for valid scheme prefix but invalid URL syntax
|
|
62
|
+
return trimmed.replace(/^([^:]+:\/\/)[^@]+@/, "$1");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Prevent parsing exceptions on SSH remotes (e.g. git@github.com:...)
|
|
66
|
+
// SCP-like SSH remotes do not start with a scheme + "://"
|
|
67
|
+
return trimmed;
|
|
68
|
+
}
|
|
45
69
|
export async function buildScope(opts) {
|
|
46
70
|
if (cached && cachedFor === opts.cwd)
|
|
47
71
|
return cached;
|
|
@@ -53,7 +77,8 @@ export async function buildScope(opts) {
|
|
|
53
77
|
}
|
|
54
78
|
const head = await fs.readFile(path.join(root, ".git", "HEAD"), "utf8").catch(() => "");
|
|
55
79
|
const cfg = await fs.readFile(path.join(root, ".git", "config"), "utf8").catch(() => "");
|
|
56
|
-
const { remote } = parseGitConfig(cfg);
|
|
80
|
+
const { remote: rawRemote } = parseGitConfig(cfg);
|
|
81
|
+
const remote = rawRemote ? sanitizeRemoteUrl(rawRemote) : undefined;
|
|
57
82
|
const { branch } = parseHEAD(head);
|
|
58
83
|
// Ecosystem detection — check if remote matches any configured pattern
|
|
59
84
|
if (remote) {
|
package/dist/src/ee/search.d.ts
CHANGED
|
@@ -76,6 +76,13 @@ export interface FeedbackResult {
|
|
|
76
76
|
verdict?: string;
|
|
77
77
|
reason?: string;
|
|
78
78
|
error?: string;
|
|
79
|
+
/**
|
|
80
|
+
* True when the brain was unreachable/transient and the verdict was durably
|
|
81
|
+
* enqueued for later delivery instead of lost. Callers treat this as success
|
|
82
|
+
* (the agent discharged its rating) and clear their recall ledger so the
|
|
83
|
+
* mandatory-rating gate cannot loop while the brain is down.
|
|
84
|
+
*/
|
|
85
|
+
queued?: boolean;
|
|
79
86
|
}
|
|
80
87
|
/**
|
|
81
88
|
* Record an agent verdict on a recalled `[id col]` entry, byte-for-byte matching
|
package/dist/src/ee/search.js
CHANGED
|
@@ -173,6 +173,13 @@ export async function feedbackEE(pointId, collection, verdict, reason) {
|
|
|
173
173
|
/* non-JSON error body — fall through to status-based handling */
|
|
174
174
|
}
|
|
175
175
|
if (!res.ok) {
|
|
176
|
+
// Transient server-side failures (5xx / rate limit / timeout) must not lose
|
|
177
|
+
// the verdict OR block the agent: queue it for later delivery. Hard client
|
|
178
|
+
// errors (bad collection, unknown id) are the caller's fault — surface them.
|
|
179
|
+
const transient = res.status >= 500 || res.status === 429 || res.status === 408;
|
|
180
|
+
if (transient && (await tryEnqueueFeedback(body))) {
|
|
181
|
+
return { ok: true, resolvedId: pointId, verdict: wire, reason, queued: true };
|
|
182
|
+
}
|
|
176
183
|
return { ok: false, error: json?.error || text || `HTTP ${res.status}` };
|
|
177
184
|
}
|
|
178
185
|
const resolvedId = json?.resolvedId || pointId;
|
|
@@ -182,9 +189,26 @@ export async function feedbackEE(pointId, collection, verdict, reason) {
|
|
|
182
189
|
catch (err) {
|
|
183
190
|
const { logEeFailure, classifyEeError } = await import("../utils/ee-logger.js");
|
|
184
191
|
logEeFailure("search.feedbackEE", classifyEeError(err), err);
|
|
192
|
+
// Network-level failure (brain down, socket drop) — durably queue so the
|
|
193
|
+
// verdict survives and the agent's rating gate does not loop. Only report a
|
|
194
|
+
// hard failure if even the enqueue fails.
|
|
195
|
+
if (await tryEnqueueFeedback(body)) {
|
|
196
|
+
return { ok: true, resolvedId: pointId, verdict: wire, reason, queued: true };
|
|
197
|
+
}
|
|
185
198
|
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
186
199
|
}
|
|
187
200
|
}
|
|
201
|
+
/** Enqueue a /api/feedback body to the offline queue; false if enqueue itself fails. */
|
|
202
|
+
async function tryEnqueueFeedback(body) {
|
|
203
|
+
try {
|
|
204
|
+
const { enqueue } = await import("./offline-queue.js");
|
|
205
|
+
await enqueue({ endpoint: "/api/feedback", body, enqueuedAt: Date.now() });
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
188
212
|
/**
|
|
189
213
|
* Mirror a feedback verdict as a LOCAL `op:'feedback'` activity row (parity with
|
|
190
214
|
* mirrorRecallLocally's `op:'recall'`). Lets the session-end nudge + forensics
|
|
@@ -23,6 +23,8 @@ import fs from "node:fs";
|
|
|
23
23
|
import os from "node:os";
|
|
24
24
|
import path from "node:path";
|
|
25
25
|
function experienceRoot() {
|
|
26
|
+
if (process.env.MUONROI_EXPERIENCE_ROOT_OVERRIDE)
|
|
27
|
+
return process.env.MUONROI_EXPERIENCE_ROOT_OVERRIDE;
|
|
26
28
|
return path.join(os.homedir(), ".experience");
|
|
27
29
|
}
|
|
28
30
|
function emitRoot() {
|
package/dist/src/ee/types.d.ts
CHANGED
|
@@ -125,6 +125,11 @@ export interface RouteModelRequest {
|
|
|
125
125
|
projectSize?: "small" | "medium" | "large";
|
|
126
126
|
filesTouched?: number;
|
|
127
127
|
mode?: string;
|
|
128
|
+
turnIndex?: number;
|
|
129
|
+
messageCount?: number;
|
|
130
|
+
compactionCount?: number;
|
|
131
|
+
totalSavedTokens?: number;
|
|
132
|
+
compactionSummary?: string;
|
|
128
133
|
};
|
|
129
134
|
runtime?: "claude" | "gemini" | "codex" | "opencode";
|
|
130
135
|
}
|
|
@@ -357,6 +362,15 @@ export interface EERecallOptions {
|
|
|
357
362
|
/** Override per-call timeout. Defaults to 15000ms — server bounds recall at ~8s internally; allow margin for embed + 3-leg search + network. */
|
|
358
363
|
timeoutMs?: number;
|
|
359
364
|
signal?: AbortSignal;
|
|
365
|
+
/**
|
|
366
|
+
* Council stance/role for per-stance recall weighting (Sprint-2 item 3). The
|
|
367
|
+
* server weights the recall collections toward the knowledge this stance cares
|
|
368
|
+
* about (researcher → principles, implementer → behavioral, verifier →
|
|
369
|
+
* self-QA). Unknown/absent stance is a no-op server-side.
|
|
370
|
+
*/
|
|
371
|
+
stance?: string;
|
|
372
|
+
/** Alias for stance; forwarded as body.role. Either resolves the same weights. */
|
|
373
|
+
role?: string;
|
|
360
374
|
}
|
|
361
375
|
export interface EEUserResponse {
|
|
362
376
|
user: string;
|
|
@@ -374,6 +388,14 @@ export interface BrainProxyOptions {
|
|
|
374
388
|
maxTokens?: number;
|
|
375
389
|
/** Override the brain provider (siliconflow | ollama | openai | ...). */
|
|
376
390
|
provider?: string;
|
|
391
|
+
/**
|
|
392
|
+
* Ask the server to use its stronger `brainExtractModel` (structured-extraction
|
|
393
|
+
* model) instead of the hot-path `brainModel`. Zero-hardcode by design: the client
|
|
394
|
+
* sends only this flag, the server resolves the model id from its own config + key.
|
|
395
|
+
* Used by the thin-client WhoAmI brain fallback, where the weak default model
|
|
396
|
+
* mis-spells the dim vocabulary. Ignored by servers that don't recognise it.
|
|
397
|
+
*/
|
|
398
|
+
useExtractModel?: boolean;
|
|
377
399
|
}
|
|
378
400
|
export interface EEClient {
|
|
379
401
|
health(): Promise<{
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type PrivacyLevel, type WhoAmIProfile } from "./who-am-i.js";
|
|
2
|
+
/** Feature flag — default ON, opt out with MUONROI_WHOAMI_BRAIN=0. */
|
|
3
|
+
export declare function isBrainWhoAmIEnabled(): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* PURE: build the classify prompt. Asks the brain to distil the retrieved rules into
|
|
6
|
+
* a strict dims JSON using only the allowed names + vocabulary. Emitting fewer dims
|
|
7
|
+
* (only the confident ones) is explicitly encouraged — downstream drops the rest.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildStyleClassifyPrompt(rules: string[]): string;
|
|
10
|
+
/**
|
|
11
|
+
* PURE: coerce a brain reply (JSON string, fenced block, or already-parsed object)
|
|
12
|
+
* into a privacy-gated WhoAmIProfile. Reuses selectWhoAmIDims for the allowlist +
|
|
13
|
+
* confidence floor. Returns null when nothing usable survives.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseBrainProfile(raw: unknown, level?: PrivacyLevel): WhoAmIProfile | null;
|
|
16
|
+
export interface BrainWhoAmIDeps {
|
|
17
|
+
searchByText: (text: string, collections: string[], topK: number) => Promise<Array<{
|
|
18
|
+
payload?: {
|
|
19
|
+
text?: string;
|
|
20
|
+
};
|
|
21
|
+
}>>;
|
|
22
|
+
classifyViaBrain: (prompt: string, timeoutMs?: number, options?: {
|
|
23
|
+
systemPrompt?: string;
|
|
24
|
+
responseFormat?: {
|
|
25
|
+
type: string;
|
|
26
|
+
};
|
|
27
|
+
maxTokens?: number;
|
|
28
|
+
useExtractModel?: boolean;
|
|
29
|
+
}) => Promise<string | null>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Derive a WhoAmIProfile from the behavioral brain. Search the user's style rules →
|
|
33
|
+
* classify them into dims via the brain LLM → privacy-gate locally. Fail-open null.
|
|
34
|
+
*/
|
|
35
|
+
export declare function deriveWhoAmIFromBrain(deps: BrainWhoAmIDeps, level?: PrivacyLevel): Promise<WhoAmIProfile | null>;
|