muonroi-cli 1.8.4 → 1.8.5
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-tee.d.ts +48 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
- package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
- 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 +28 -0
- package/dist/src/agent-harness/mock-model.js +63 -1
- package/dist/src/agent-harness/test-spawn.js +31 -0
- 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 +2 -2
- package/dist/src/cli/keys.js +19 -81
- package/dist/src/council/clarifier.d.ts +28 -2
- package/dist/src/council/clarifier.js +81 -15
- 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 +51 -3
- 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 +1210 -134
- package/dist/src/council/index.d.ts +85 -1
- package/dist/src/council/index.js +634 -196
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +32 -0
- package/dist/src/council/llm.js +231 -38
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +72 -0
- package/dist/src/council/planner.js +23 -0
- package/dist/src/council/preflight.d.ts +7 -0
- package/dist/src/council/preflight.js +14 -2
- package/dist/src/council/prompts.d.ts +30 -3
- package/dist/src/council/prompts.js +234 -64
- 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 +128 -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 +1 -0
- package/dist/src/ee/auth.js +15 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +81 -18
- 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 +45 -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 +13 -1
- package/dist/src/flow/compaction/index.js +70 -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/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 +55 -0
- package/dist/src/gsd/flags.js +83 -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 +251 -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/hooks/index.js +1 -1
- package/dist/src/index.js +44 -11
- 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 +1 -1
- package/dist/src/mcp/ee-tools.js +1 -0
- package/dist/src/mcp/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -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/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 +10 -0
- package/dist/src/orchestrator/compaction.js +27 -7
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +65 -24
- 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/message-processor.js +242 -33
- package/dist/src/orchestrator/orchestrator.d.ts +39 -3
- package/dist/src/orchestrator/orchestrator.js +651 -102
- package/dist/src/orchestrator/preprocessor.js +1 -1
- 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-intercept.d.ts +45 -0
- package/dist/src/orchestrator/safety-intercept.js +55 -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 +24 -3
- package/dist/src/orchestrator/stall-watchdog.js +47 -13
- package/dist/src/orchestrator/stream-runner.js +62 -29
- 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 +22 -0
- package/dist/src/orchestrator/tool-engine.js +620 -56
- 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 +37 -0
- package/dist/src/orchestrator/turn-watchdog.js +55 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +1 -1
- 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.js +16 -11
- 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/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 +33 -2
- package/dist/src/pil/llm-classify.js +123 -131
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +1 -0
- package/dist/src/pil/pipeline.js +34 -2
- 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/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- 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.js +32 -3
- package/dist/src/product-loop/discovery-schema.js +5 -1
- 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 +333 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +310 -99
- package/dist/src/product-loop/phase-plan.d.ts +5 -0
- package/dist/src/product-loop/phase-plan.js +39 -2
- package/dist/src/product-loop/phase-runner.js +9 -1
- package/dist/src/product-loop/sprint-runner.d.ts +111 -0
- package/dist/src/product-loop/sprint-runner.js +559 -16
- package/dist/src/product-loop/types.d.ts +36 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- 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/openai-oauth.js +1 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.js +4 -1
- package/dist/src/providers/auth/types.d.ts +1 -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/keychain.d.ts +1 -1
- package/dist/src/providers/keychain.js +7 -9
- 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 +27 -2
- package/dist/src/providers/runtime.js +78 -15
- 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 +280 -1
- 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/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 +3 -3
- 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 +284 -13
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/native-tools.js +5 -0
- package/dist/src/tools/registry.d.ts +3 -0
- package/dist/src/tools/registry.js +460 -22
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +118 -3
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- 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/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 +49 -15
- 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 +12 -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/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/containers/modals-layer.d.ts +2 -1
- 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/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/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 +12 -18
- 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/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/install-manager.js +2 -1
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +153 -5
- package/dist/src/utils/settings.js +233 -29
- 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 +1 -1
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +135 -132
- 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
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Vision proxy layer for text-only models (e.g. DeepSeek V4).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* structured text descriptions before the message reaches the primary model.
|
|
4
|
+
* Image parts in messages are sent to the catalog-configured vision backend
|
|
5
|
+
* (default: Z.ai glm-4.6v-flash) and replaced with native-sight observations
|
|
6
|
+
* so the primary model reasons as if it saw the image directly.
|
|
8
7
|
*/
|
|
9
8
|
import { getModelInfo } from "../models/registry.js";
|
|
10
|
-
import { apiBaseFor } from "./endpoints.js";
|
|
11
|
-
import { loadKeyForProvider } from "./keychain.js";
|
|
12
9
|
import { UI_LAYOUT_SCHEMA_HINT } from "./mcp-vision-bridge.js";
|
|
10
|
+
import { callVisionBackend, collectVisionUnavailableReasons, findNativeVisionFallback, formatNativeVisionObservation, formatNativeVisionUnavailable, isVisionBackendAvailable, looksLikeOcrIntent, resolveAvailableVisionChain, wrapAnalyzerInstructions, } from "./vision-backend.js";
|
|
13
11
|
const DESIGN_INTENT_PATTERNS = [
|
|
14
12
|
/\bredesign\b/i,
|
|
15
13
|
/\bdesign\s*(system|token|spec|review)?\b/i,
|
|
@@ -26,24 +24,40 @@ function looksLikeDesignIntent(text) {
|
|
|
26
24
|
return false;
|
|
27
25
|
return DESIGN_INTENT_PATTERNS.some((re) => re.test(text));
|
|
28
26
|
}
|
|
29
|
-
const VISION_MODELS = [
|
|
30
|
-
"Qwen/Qwen3-VL-8B-Instruct",
|
|
31
|
-
"Qwen/Qwen3-VL-30B-A3B-Instruct",
|
|
32
|
-
"Qwen/Qwen3-VL-32B-Instruct",
|
|
33
|
-
];
|
|
34
|
-
const SILICONFLOW_BASE = apiBaseFor("siliconflow");
|
|
35
|
-
const REQUEST_TIMEOUT_MS = 90_000;
|
|
36
|
-
/**
|
|
37
|
-
* Returns true when the model cannot handle image content natively.
|
|
38
|
-
*/
|
|
39
27
|
export function needsVisionProxy(modelId) {
|
|
40
28
|
const info = getModelInfo(modelId);
|
|
41
29
|
return info?.supportsVision === false;
|
|
42
30
|
}
|
|
43
31
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
32
|
+
* Decide how to handle images when the active model is text-only:
|
|
33
|
+
* proxy backend, switch to a native vision model, or surface unavailable.
|
|
46
34
|
*/
|
|
35
|
+
export async function planImageHandlingForTextOnlyModel(opts) {
|
|
36
|
+
if (!needsVisionProxy(opts.primaryModelId)) {
|
|
37
|
+
return { strategy: "proxy" };
|
|
38
|
+
}
|
|
39
|
+
const kind = opts.kind ?? "default";
|
|
40
|
+
if (await isVisionBackendAvailable(kind)) {
|
|
41
|
+
return { strategy: "proxy" };
|
|
42
|
+
}
|
|
43
|
+
const fallback = await findNativeVisionFallback({ excludeModelId: opts.primaryModelId });
|
|
44
|
+
if (fallback) {
|
|
45
|
+
return { strategy: "native_model", fallback };
|
|
46
|
+
}
|
|
47
|
+
const reasons = await collectVisionUnavailableReasons(kind);
|
|
48
|
+
return {
|
|
49
|
+
strategy: "unavailable",
|
|
50
|
+
notice: formatNativeVisionUnavailable(opts.imageCount, reasons),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** True when proxy backend or a native vision model can handle images for this text-only model. */
|
|
54
|
+
export async function canHandleImagesForTextOnlyModel(modelId) {
|
|
55
|
+
if (!needsVisionProxy(modelId))
|
|
56
|
+
return true;
|
|
57
|
+
if (await isVisionBackendAvailable())
|
|
58
|
+
return true;
|
|
59
|
+
return (await findNativeVisionFallback({ excludeModelId: modelId })) !== null;
|
|
60
|
+
}
|
|
47
61
|
export async function proxyVision(messages, modelId, signal) {
|
|
48
62
|
if (!needsVisionProxy(modelId)) {
|
|
49
63
|
return { messages, proxied: false, imageCount: 0 };
|
|
@@ -66,6 +80,7 @@ export async function proxyVision(messages, modelId, signal) {
|
|
|
66
80
|
totalImages += imageParts.length;
|
|
67
81
|
const userText = textParts.map((t) => t.text).join("\n");
|
|
68
82
|
const designIntent = looksLikeDesignIntent(userText);
|
|
83
|
+
const ocrIntent = looksLikeOcrIntent(userText);
|
|
69
84
|
const svgFast = trySvgFastPath(imageParts, designIntent);
|
|
70
85
|
if (svgFast) {
|
|
71
86
|
processed.push({
|
|
@@ -74,27 +89,22 @@ export async function proxyVision(messages, modelId, signal) {
|
|
|
74
89
|
});
|
|
75
90
|
continue;
|
|
76
91
|
}
|
|
77
|
-
const
|
|
92
|
+
const kind = designIntent ? "design" : ocrIntent ? "ocr" : "default";
|
|
93
|
+
const descriptions = await describeImages(imageParts, textParts, signal, kind);
|
|
78
94
|
const newContent = [...textParts, { type: "text", text: descriptions }];
|
|
79
95
|
processed.push({ ...msg, content: newContent });
|
|
80
96
|
}
|
|
81
97
|
return { messages: processed, proxied: totalImages > 0, imageCount: totalImages };
|
|
82
98
|
}
|
|
83
|
-
async function describeImages(images, contextTexts, signal,
|
|
84
|
-
let apiKey;
|
|
85
|
-
try {
|
|
86
|
-
apiKey = await loadKeyForProvider("siliconflow");
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
return buildFallbackDescription(images, ["SILICONFLOW_API_KEY not configured"]);
|
|
90
|
-
}
|
|
99
|
+
async function describeImages(images, contextTexts, signal, kind = "default") {
|
|
91
100
|
const userContext = contextTexts.map((t) => t.text).join("\n");
|
|
101
|
+
const designIntent = kind === "design";
|
|
92
102
|
const visionContent = [];
|
|
93
103
|
visionContent.push({
|
|
94
104
|
type: "text",
|
|
95
|
-
text: designIntent
|
|
105
|
+
text: wrapAnalyzerInstructions(designIntent
|
|
96
106
|
? buildDesignPrompt(userContext, images.length)
|
|
97
|
-
: buildAnalysisPrompt(userContext, images.length),
|
|
107
|
+
: buildAnalysisPrompt(userContext, images.length, kind === "ocr"), kind),
|
|
98
108
|
});
|
|
99
109
|
for (const img of images) {
|
|
100
110
|
visionContent.push({
|
|
@@ -106,24 +116,12 @@ async function describeImages(images, contextTexts, signal, designIntent = false
|
|
|
106
116
|
});
|
|
107
117
|
}
|
|
108
118
|
const responseFormat = designIntent ? { type: "json_object" } : undefined;
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (result.ok)
|
|
114
|
-
return formatVisionResult(result.text, images.length, model, designIntent);
|
|
115
|
-
failureReasons.push(`${model}: ${result.reason}`);
|
|
116
|
-
console.warn(`[vision-proxy] ${model} failed (${result.reason}), trying next...`);
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
if (signal?.aborted)
|
|
120
|
-
throw err;
|
|
121
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
122
|
-
failureReasons.push(`${model}: ${msg}`);
|
|
123
|
-
console.warn(`[vision-proxy] ${model} threw (${msg}), trying next...`);
|
|
124
|
-
}
|
|
119
|
+
const chain = await resolveAvailableVisionChain(kind);
|
|
120
|
+
const result = await callVisionBackend(chain, visionContent, signal, responseFormat);
|
|
121
|
+
if (result.ok) {
|
|
122
|
+
return formatNativeVisionObservation(result.text, { imageCount: images.length });
|
|
125
123
|
}
|
|
126
|
-
return
|
|
124
|
+
return formatNativeVisionUnavailable(images.length, [result.reason]);
|
|
127
125
|
}
|
|
128
126
|
function trySvgFastPath(images, designIntent) {
|
|
129
127
|
if (images.length === 0)
|
|
@@ -142,64 +140,23 @@ function trySvgFastPath(images, designIntent) {
|
|
|
142
140
|
return svg.length > 32_000 ? `${svg.slice(0, 32_000)}\n<!-- truncated -->` : svg;
|
|
143
141
|
})
|
|
144
142
|
.join("\n\n");
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return `\n${header}${guidance}\n\`\`\`svg\n${decoded}\n\`\`\`\n[/Vision Proxy]\n`;
|
|
143
|
+
const observation = designIntent
|
|
144
|
+
? `I see ${images.length} SVG source(s). The vector markup below is exact — use element attributes (x, y, width, fill, text) directly.\n\nMap to layout schema:\n${UI_LAYOUT_SCHEMA_HINT}\n\n\`\`\`svg\n${decoded}\n\`\`\``
|
|
145
|
+
: `I see ${images.length} SVG source(s). Vector markup (read attributes directly):\n\n\`\`\`svg\n${decoded}\n\`\`\``;
|
|
146
|
+
return formatNativeVisionObservation(observation, { imageCount: images.length });
|
|
150
147
|
}
|
|
151
|
-
|
|
152
|
-
const controller = new AbortController();
|
|
153
|
-
let timedOut = false;
|
|
154
|
-
const timeout = setTimeout(() => {
|
|
155
|
-
timedOut = true;
|
|
156
|
-
controller.abort();
|
|
157
|
-
}, REQUEST_TIMEOUT_MS);
|
|
158
|
-
if (signal) {
|
|
159
|
-
signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
160
|
-
}
|
|
161
|
-
let res;
|
|
162
|
-
try {
|
|
163
|
-
res = await fetch(`${SILICONFLOW_BASE}/chat/completions`, {
|
|
164
|
-
method: "POST",
|
|
165
|
-
headers: {
|
|
166
|
-
"Content-Type": "application/json",
|
|
167
|
-
Authorization: `Bearer ${apiKey}`,
|
|
168
|
-
},
|
|
169
|
-
body: JSON.stringify({
|
|
170
|
-
model,
|
|
171
|
-
messages: [{ role: "user", content }],
|
|
172
|
-
max_tokens: 3072,
|
|
173
|
-
temperature: 0.1,
|
|
174
|
-
...(responseFormat ? { response_format: responseFormat } : {}),
|
|
175
|
-
}),
|
|
176
|
-
signal: controller.signal,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
clearTimeout(timeout);
|
|
181
|
-
if (timedOut)
|
|
182
|
-
return { ok: false, reason: `timeout after ${REQUEST_TIMEOUT_MS}ms` };
|
|
183
|
-
if (signal?.aborted)
|
|
184
|
-
throw err;
|
|
185
|
-
return { ok: false, reason: `network error: ${err instanceof Error ? err.message : String(err)}` };
|
|
186
|
-
}
|
|
187
|
-
clearTimeout(timeout);
|
|
188
|
-
if (!res.ok) {
|
|
189
|
-
const errText = await res.text().catch(() => "unknown error");
|
|
190
|
-
return { ok: false, reason: `HTTP ${res.status} ${errText.slice(0, 200)}` };
|
|
191
|
-
}
|
|
192
|
-
const data = (await res.json().catch(() => null));
|
|
193
|
-
const text = data?.choices?.[0]?.message?.content;
|
|
194
|
-
if (!text)
|
|
195
|
-
return { ok: false, reason: "empty response body" };
|
|
196
|
-
return { ok: true, text };
|
|
197
|
-
}
|
|
198
|
-
function buildAnalysisPrompt(userContext, imageCount) {
|
|
148
|
+
function buildAnalysisPrompt(userContext, imageCount, ocrFocus) {
|
|
199
149
|
const plural = imageCount > 1 ? `${imageCount} images` : "the image";
|
|
150
|
+
const ocrBlock = ocrFocus
|
|
151
|
+
? [
|
|
152
|
+
"OCR focus: transcribe ALL visible text exactly (preserve line breaks, labels, error codes).",
|
|
153
|
+
"Note any text that is blurry or partially cut off.",
|
|
154
|
+
"",
|
|
155
|
+
]
|
|
156
|
+
: [];
|
|
200
157
|
return [
|
|
201
|
-
`
|
|
202
|
-
|
|
158
|
+
`Analyze ${plural} for a software developer working in a coding CLI.`,
|
|
159
|
+
...ocrBlock,
|
|
203
160
|
"Focus on:",
|
|
204
161
|
"- UI layout and component structure (if screenshot)",
|
|
205
162
|
"- All visible text, labels, buttons, and form elements",
|
|
@@ -212,45 +169,19 @@ function buildAnalysisPrompt(userContext, imageCount) {
|
|
|
212
169
|
userContext ? `\nDeveloper's context: "${userContext}"` : "",
|
|
213
170
|
].join("\n");
|
|
214
171
|
}
|
|
215
|
-
function formatVisionResult(description, imageCount, model, designIntent = false) {
|
|
216
|
-
const usedModel = model ?? VISION_MODELS[0];
|
|
217
|
-
const tag = designIntent ? "design contract via" : "analyzed via";
|
|
218
|
-
const single = designIntent ? "design contract via" : "analyzed via";
|
|
219
|
-
const header = imageCount > 1
|
|
220
|
-
? `[Vision Proxy — ${imageCount} images ${tag} ${usedModel}]`
|
|
221
|
-
: `[Vision Proxy — image ${single} ${usedModel}]`;
|
|
222
|
-
return `\n${header}\n${description}\n[/Vision Proxy]\n`;
|
|
223
|
-
}
|
|
224
172
|
function buildDesignPrompt(userContext, imageCount) {
|
|
225
173
|
const plural = imageCount > 1 ? `${imageCount} images` : "the image";
|
|
226
174
|
return [
|
|
227
|
-
`Analyze ${plural} as a UI/UX design contract for a software developer
|
|
228
|
-
"
|
|
229
|
-
"",
|
|
230
|
-
"Return ONLY a single JSON object matching this exact shape (no markdown, no commentary, no code fences):",
|
|
175
|
+
`Analyze ${plural} as a UI/UX design contract for a software developer.`,
|
|
176
|
+
"Return ONLY a single JSON object matching this exact shape (no markdown, no commentary):",
|
|
231
177
|
UI_LAYOUT_SCHEMA_HINT,
|
|
232
178
|
"",
|
|
233
179
|
"Extraction rules:",
|
|
234
|
-
"- bbox: pixel coordinates relative to the visible image (origin top-left).
|
|
235
|
-
"- Colors: 6-digit lowercase hex (#rrggbb).
|
|
236
|
-
"-
|
|
237
|
-
"- spacingScalePx / radiusScalePx: distinct observed values, sorted ascending.",
|
|
238
|
-
"- components[]: every visible interactive or content element. Stable IDs like 'btn_signup'.",
|
|
239
|
-
"- children[]: component IDs nested inside this component.",
|
|
240
|
-
"- hierarchy[]: visual reading order of headings — level 1 hero, 2 section, 3 sub.",
|
|
180
|
+
"- bbox: pixel coordinates relative to the visible image (origin top-left).",
|
|
181
|
+
"- Colors: 6-digit lowercase hex (#rrggbb).",
|
|
182
|
+
"- components[]: every visible interactive or content element.",
|
|
241
183
|
"- text: EXACT visible string. null only when no text (icon-only).",
|
|
242
|
-
"- notes[]: things schema cannot capture — gradients, illustrations, motion.",
|
|
243
|
-
"",
|
|
244
|
-
"If a field is genuinely not determinable, use null. Never invent values.",
|
|
245
184
|
userContext ? `\nDeveloper's context: "${userContext}"` : "",
|
|
246
185
|
].join("\n");
|
|
247
186
|
}
|
|
248
|
-
function buildFallbackDescription(images, reasons = []) {
|
|
249
|
-
const count = images.length;
|
|
250
|
-
const types = [...new Set(images.map((i) => i.mediaType))].join(", ");
|
|
251
|
-
const detail = reasons.length > 0
|
|
252
|
-
? `Reason(s): ${reasons.join(" | ")}`
|
|
253
|
-
: "Reason: unknown — check SILICONFLOW_API_KEY and model availability.";
|
|
254
|
-
return `\n[Vision Proxy — unavailable, ${count} image(s) (${types}) could not be analyzed. ${detail}]\n`;
|
|
255
|
-
}
|
|
256
187
|
//# sourceMappingURL=vision-proxy.js.map
|
|
@@ -90,6 +90,95 @@ function summarizeMessage(m) {
|
|
|
90
90
|
}
|
|
91
91
|
return { role, contentKind: "string", textChars: 0 };
|
|
92
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Reduce a request body (from AI SDK's `error.requestBodyValues`) to a
|
|
95
|
+
* PII-safe shape: top-level param key list + each assistant message's field
|
|
96
|
+
* key list. Values are NEVER persisted — only key names. This is the
|
|
97
|
+
* diagnostic evidence needed when a provider rejects "an invalid parameter"
|
|
98
|
+
* (Z.ai 1210, SiliconFlow 20015) and we must see which field was present or
|
|
99
|
+
* missing on each assistant turn in a multi-step tool loop.
|
|
100
|
+
*/
|
|
101
|
+
function summarizeRequestBodyShape(body) {
|
|
102
|
+
if (!body || typeof body !== "object")
|
|
103
|
+
return undefined;
|
|
104
|
+
const b = body;
|
|
105
|
+
const paramKeys = Object.keys(b).sort();
|
|
106
|
+
const configParamValues = extractConfigParamValues(b);
|
|
107
|
+
const messages = b.messages;
|
|
108
|
+
if (!Array.isArray(messages)) {
|
|
109
|
+
return {
|
|
110
|
+
paramKeys,
|
|
111
|
+
assistantFieldKeys: [],
|
|
112
|
+
assistantCount: 0,
|
|
113
|
+
assistantLens: [],
|
|
114
|
+
totalReasoningChars: 0,
|
|
115
|
+
responseFormat: b.response_format ?? undefined,
|
|
116
|
+
configParamValues,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const assistantMsgs = messages.filter((m) => m?.role === "assistant");
|
|
120
|
+
// De-duplicate the field-key signature across assistant messages so a long
|
|
121
|
+
// history doesn't bloat the log — we only care WHICH fields co-occur.
|
|
122
|
+
const signatures = new Set();
|
|
123
|
+
const assistantLens = [];
|
|
124
|
+
let totalReasoningChars = 0;
|
|
125
|
+
for (const m of assistantMsgs) {
|
|
126
|
+
const msg = m;
|
|
127
|
+
const keys = Object.keys(msg ?? {})
|
|
128
|
+
.sort()
|
|
129
|
+
.join(",");
|
|
130
|
+
signatures.add(keys);
|
|
131
|
+
const rc = msg?.reasoning_content;
|
|
132
|
+
const rcLen = typeof rc === "string" ? rc.length : null;
|
|
133
|
+
if (rcLen !== null)
|
|
134
|
+
totalReasoningChars += rcLen;
|
|
135
|
+
const contentLen = typeof msg?.content === "string"
|
|
136
|
+
? msg.content.length
|
|
137
|
+
: Array.isArray(msg?.content)
|
|
138
|
+
? msg.content.reduce((n, p) => n + (typeof p?.text === "string" ? p.text.length : 0), 0)
|
|
139
|
+
: 0;
|
|
140
|
+
const toolCallsLen = Array.isArray(msg?.tool_calls) ? msg.tool_calls.length : 0;
|
|
141
|
+
assistantLens.push({ rc: rcLen, content: contentLen, toolCalls: toolCallsLen });
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
paramKeys,
|
|
145
|
+
assistantFieldKeys: [...signatures],
|
|
146
|
+
assistantCount: assistantMsgs.length,
|
|
147
|
+
assistantLens,
|
|
148
|
+
totalReasoningChars,
|
|
149
|
+
responseFormat: b.response_format ?? undefined,
|
|
150
|
+
configParamValues,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Scalar SDK-config params whose VALUES are PII-safe (generation config, not
|
|
155
|
+
* user prompt content) and which are the likely culprits when a provider
|
|
156
|
+
* rejects with a generic "Invalid API parameter" (Z.ai 1210, SiliconFlow
|
|
157
|
+
* 20015). `messages` and `tools` are deliberately excluded — their values may
|
|
158
|
+
* carry prompts/PII, and counts are already captured elsewhere.
|
|
159
|
+
*/
|
|
160
|
+
const CONFIG_PARAM_KEYS = [
|
|
161
|
+
"reasoning_effort",
|
|
162
|
+
"verbosity",
|
|
163
|
+
"tool_choice",
|
|
164
|
+
"response_format",
|
|
165
|
+
"max_tokens",
|
|
166
|
+
"temperature",
|
|
167
|
+
"top_p",
|
|
168
|
+
"frequency_penalty",
|
|
169
|
+
"presence_penalty",
|
|
170
|
+
"seed",
|
|
171
|
+
"stop",
|
|
172
|
+
"parallel_tool_calls",
|
|
173
|
+
];
|
|
174
|
+
function extractConfigParamValues(body) {
|
|
175
|
+
const out = {};
|
|
176
|
+
for (const k of CONFIG_PARAM_KEYS) {
|
|
177
|
+
if (k in body)
|
|
178
|
+
out[k] = body[k] ?? null;
|
|
179
|
+
}
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
93
182
|
export const wireDebug = {
|
|
94
183
|
enabled: ENABLED,
|
|
95
184
|
/** Log an outgoing streamText/streamObject call. */
|
|
@@ -129,6 +218,12 @@ export const wireDebug = {
|
|
|
129
218
|
statusCode: typeof e?.statusCode === "number" ? e.statusCode : undefined,
|
|
130
219
|
url: typeof e?.url === "string" ? e.url : undefined,
|
|
131
220
|
responseBody: typeof e?.responseBody === "string" ? e.responseBody.slice(0, 4000) : undefined,
|
|
221
|
+
// Evidence for "Invalid API parameter" (e.g. Z.ai code 1210,
|
|
222
|
+
// SiliconFlow 20015): capture the SHAPE (key names only — no values,
|
|
223
|
+
// PII-safe) of every assistant message in the request body so we can
|
|
224
|
+
// see which field the provider rejected and whether reasoning_content
|
|
225
|
+
// was present/missing across the multi-step tool-loop history.
|
|
226
|
+
requestBodyShape: summarizeRequestBodyShape(e?.requestBodyValues),
|
|
132
227
|
cause: e?.cause && typeof e.cause === "object"
|
|
133
228
|
? {
|
|
134
229
|
message: typeof e.cause.message === "string"
|
|
@@ -14,6 +14,14 @@ export interface DecideOpts {
|
|
|
14
14
|
signal?: AbortSignal;
|
|
15
15
|
defaultModel: string;
|
|
16
16
|
defaultProvider: string;
|
|
17
|
+
/**
|
|
18
|
+
* Optional session id for audit logging. When provided, a `routing`
|
|
19
|
+
* interaction event is emitted whenever the turn's routed model differs from
|
|
20
|
+
* `defaultModel` (the stored session.model) — making per-turn overrides
|
|
21
|
+
* observable instead of silent. Fixes the "session.model lie": a user on
|
|
22
|
+
* flash could not see when the router silently promoted them to pro.
|
|
23
|
+
*/
|
|
24
|
+
sessionId?: string;
|
|
17
25
|
/** Override home directory for ledger (testing). */
|
|
18
26
|
homeOverride?: string;
|
|
19
27
|
/** PIL enrichment signals — forwarded to EE context. */
|
|
@@ -27,6 +35,11 @@ export interface DecideOpts {
|
|
|
27
35
|
projectSize?: "small" | "medium" | "large" | null;
|
|
28
36
|
filesTouched?: number;
|
|
29
37
|
mode?: string | null;
|
|
38
|
+
turnIndex?: number;
|
|
39
|
+
messageCount?: number;
|
|
40
|
+
compactionCount?: number;
|
|
41
|
+
totalSavedTokens?: number;
|
|
42
|
+
compactionSummary?: string | null;
|
|
30
43
|
};
|
|
31
44
|
}
|
|
32
45
|
export declare function clearRouteCache(): void;
|