muonroi-cli 1.8.3 → 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 +21 -21
- package/README.md +133 -122
- 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 +30 -15
- 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 +254 -84
- 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/oauth-callback.js +2 -2
- 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 +77 -76
- 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 +8 -8
- 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 +159 -159
- 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 +26 -0
- package/dist/src/orchestrator/tool-engine.js +669 -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/layer2_5-ponytail.js +8 -8
- 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/done-gate.js +3 -3
- 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 +327 -116
- 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/progress-snapshot.js +4 -4
- 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 +82 -172
- 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/reporter/index.js +1 -1
- 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/bb-ecosystem-apply.js +47 -47
- package/dist/src/scaffold/bb-quality-gate.js +5 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +86 -60
- package/dist/src/scaffold/init-new.js +453 -453
- 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 +22 -22
- 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/interaction-log.js +5 -5
- package/dist/src/storage/migrations.js +196 -126
- package/dist/src/storage/session-experience-store.js +4 -4
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +112 -55
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +383 -112
- package/dist/src/storage/usage.js +14 -14
- package/dist/src/storage/workspaces.js +12 -12
- 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-inspect.js +4 -4
- 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/clipboard-image.js +23 -23
- package/dist/src/utils/install-manager.js +14 -11
- 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/side-question.js +2 -2
- package/dist/src/utils/skills.js +3 -3
- 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,8 +1,24 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { getModelInfo } from "../models/registry.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
3
4
|
import { getReasoningEffortForModel } from "../utils/settings.js";
|
|
4
5
|
import { getProviderCapabilities } from "./capabilities.js";
|
|
5
6
|
import { getProviderStrategy } from "./strategies/registry.js";
|
|
7
|
+
/**
|
|
8
|
+
* Session-scoped registry of the most-recently-built factory per provider.
|
|
9
|
+
* resolveModelRuntime consults this to auto-correct a factory/model provider
|
|
10
|
+
* mismatch: when a caller reuses provider A's factory to run a model that
|
|
11
|
+
* belongs to provider B (a real hazard in sub-task paths like compaction that
|
|
12
|
+
* inherit the parent session's factory), we substitute B's real factory if one
|
|
13
|
+
* was built this session. Single-orchestrator invariant (v1, see CQ-16a) makes
|
|
14
|
+
* a module-level map safe. Last-built wins, so a /model key change that rebuilds
|
|
15
|
+
* a provider's factory transparently refreshes the entry.
|
|
16
|
+
*/
|
|
17
|
+
const providerFactoryRegistry = new Map();
|
|
18
|
+
/** Test seam: clear the registry between cases so entries never leak across specs. */
|
|
19
|
+
export function __resetProviderFactoryRegistry() {
|
|
20
|
+
providerFactoryRegistry.clear();
|
|
21
|
+
}
|
|
6
22
|
/**
|
|
7
23
|
* Phase 12.2-G4: thin dispatcher delegating to the provider strategy registry.
|
|
8
24
|
* Each provider's SDK wiring + `factory.responses` + `defaultProviderOptions`
|
|
@@ -10,15 +26,16 @@ import { getProviderStrategy } from "./strategies/registry.js";
|
|
|
10
26
|
*/
|
|
11
27
|
export function createProviderFactory(id, opts) {
|
|
12
28
|
const strategy = getProviderStrategy(id);
|
|
13
|
-
|
|
29
|
+
const factory = strategy.createFactory(opts);
|
|
30
|
+
factory.providerId = id;
|
|
31
|
+
providerFactoryRegistry.set(id, factory);
|
|
32
|
+
return { id, factory };
|
|
14
33
|
}
|
|
15
34
|
/**
|
|
16
35
|
* Async variant of createProviderFactory.
|
|
17
36
|
* For OpenAI: loads stored OAuth tokens (auto-refreshing if expiring) and injects
|
|
18
37
|
* them as Authorization / ChatGPT-Account-ID headers so subscription-backed
|
|
19
38
|
* ChatGPT Plus/Pro accounts work without an API key.
|
|
20
|
-
* For Google: loads stored Agy OAuth tokens and injects Authorization header
|
|
21
|
-
* so users can authenticate via their Google account without a GOOGLE_API_KEY.
|
|
22
39
|
* Falls back to API-key path when no tokens are stored.
|
|
23
40
|
* All other providers: identical to createProviderFactory.
|
|
24
41
|
*/
|
|
@@ -38,13 +55,12 @@ export async function createProviderFactoryAsync(id, opts) {
|
|
|
38
55
|
// override the OAuth backend and produce a 401 "Missing scopes:
|
|
39
56
|
// api.responses.write" when the subscription token hits the platform
|
|
40
57
|
// API. Fall back to opts.baseURL only when the OAuth provider declares
|
|
41
|
-
// no dedicated backend (cfg.baseURL undefined
|
|
58
|
+
// no dedicated backend (cfg.baseURL undefined).
|
|
42
59
|
//
|
|
43
60
|
// However, a user-specified baseURL in settings (e.g. switching to a
|
|
44
61
|
// different backend after an OAuth provider is killed) MUST override
|
|
45
|
-
// the hardcoded OAuth default. This lets users migrate
|
|
46
|
-
//
|
|
47
|
-
// modifying source.
|
|
62
|
+
// the hardcoded OAuth default. This lets users migrate to a new
|
|
63
|
+
// proxy/backend without modifying source.
|
|
48
64
|
const { loadUserSettings } = await import("../utils/settings.js");
|
|
49
65
|
const userSettings = loadUserSettings();
|
|
50
66
|
const userBaseURL = userSettings?.providers?.[id]?.baseURL;
|
|
@@ -68,8 +84,8 @@ export async function createProviderFactoryAsync(id, opts) {
|
|
|
68
84
|
}
|
|
69
85
|
export function resolveModelRuntime(factory, modelId) {
|
|
70
86
|
// Resolve aliases (e.g. "deepseek-v4-flash") to the provider-native id
|
|
71
|
-
// (e.g. "deepseek-
|
|
72
|
-
// Without this,
|
|
87
|
+
// (e.g. "deepseek-v4-flash") BEFORE invoking the factory.
|
|
88
|
+
// Without this, DeepSeek / xAI reject the request because
|
|
73
89
|
// the alias is not a valid model id on their API.
|
|
74
90
|
const mockGlobals = globalThis;
|
|
75
91
|
const modelInfo = getModelInfo(modelId);
|
|
@@ -78,6 +94,32 @@ export function resolveModelRuntime(factory, modelId) {
|
|
|
78
94
|
if (!providerId && !mockGlobals.__muonroiMockModel) {
|
|
79
95
|
throw new Error(`Model "${modelId}" not found in catalog — cannot determine provider.`);
|
|
80
96
|
}
|
|
97
|
+
// Factory/model provider guard (Layer 2). A caller that reuses one provider's
|
|
98
|
+
// factory to run a model from another provider (e.g. compaction inheriting the
|
|
99
|
+
// parent session's native factory for a gateway-routed model) would otherwise
|
|
100
|
+
// POST to the wrong endpoint. If the passed factory is stamped for a different
|
|
101
|
+
// provider AND we built the correct one this session, substitute it so the
|
|
102
|
+
// request lands on the right backend; otherwise keep going (Part 3's wire-id
|
|
103
|
+
// normalization keeps it valid) but log the mismatch so it is never silent.
|
|
104
|
+
let effectiveFactory = factory;
|
|
105
|
+
if (providerId && factory.providerId && factory.providerId !== providerId) {
|
|
106
|
+
const correct = providerFactoryRegistry.get(providerId);
|
|
107
|
+
if (correct) {
|
|
108
|
+
effectiveFactory = correct;
|
|
109
|
+
logger.debug("orchestrator", "Redirected model to its own provider factory", {
|
|
110
|
+
modelId: canonicalId,
|
|
111
|
+
modelProvider: providerId,
|
|
112
|
+
factoryProvider: factory.providerId,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
logger.warn("orchestrator", "Factory/model provider mismatch; no factory for model's provider", {
|
|
117
|
+
modelId: canonicalId,
|
|
118
|
+
modelProvider: providerId,
|
|
119
|
+
factoryProvider: factory.providerId,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
81
123
|
const userEffort = getReasoningEffortForModel(modelId);
|
|
82
124
|
const mockModel = mockGlobals.__muonroiMockModel;
|
|
83
125
|
// Determine the language model + unsupportedParams + provider-level defaults.
|
|
@@ -107,12 +149,12 @@ export function resolveModelRuntime(factory, modelId) {
|
|
|
107
149
|
else {
|
|
108
150
|
const strategy = getProviderStrategy(providerId);
|
|
109
151
|
resolved = strategy.resolve({
|
|
110
|
-
factory,
|
|
152
|
+
factory: effectiveFactory,
|
|
111
153
|
modelId: canonicalId,
|
|
112
154
|
modelInfo,
|
|
113
155
|
reasoningEffort: userEffort,
|
|
114
156
|
});
|
|
115
|
-
providerLevelDefaults =
|
|
157
|
+
providerLevelDefaults = effectiveFactory.defaultProviderOptions;
|
|
116
158
|
}
|
|
117
159
|
// Merge provider-level defaults from the factory (e.g. OAuth backends inject
|
|
118
160
|
// `instructions` + `store: false` for the ChatGPT Codex API). This keeps
|
|
@@ -229,6 +271,27 @@ export function shouldDropParam(runtime, param) {
|
|
|
229
271
|
}
|
|
230
272
|
return runtime.unsupportedParams?.includes(param) ?? false;
|
|
231
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Resolve the `temperature` spread for a streamText/generateText call.
|
|
276
|
+
*
|
|
277
|
+
* Returns `{}` (omit the param) when the model does not accept temperature
|
|
278
|
+
* (reasoning models, OAuth `unsupportedParams`), `{ temperature: <fixed> }`
|
|
279
|
+
* when the catalog pins a `fixed_temperature` (e.g. Moonshot/Kimi via
|
|
280
|
+
* opencode-go reject any value but `1` with "invalid temperature: only 1 is
|
|
281
|
+
* allowed for this model"), otherwise `{ temperature: <desired> }`.
|
|
282
|
+
*
|
|
283
|
+
* Every orchestrator call site that sets a temperature MUST go through this
|
|
284
|
+
* helper — inlining `temperature: 0.7` is what made every Kimi tool-loop turn
|
|
285
|
+
* fail wholesale (mirrors `resolveTemperature` used in src/council/llm.ts).
|
|
286
|
+
*/
|
|
287
|
+
export function resolveTemperatureParam(runtime, desired) {
|
|
288
|
+
if (shouldDropParam(runtime, "temperature"))
|
|
289
|
+
return {};
|
|
290
|
+
const fixed = runtime.modelInfo?.fixedTemperature;
|
|
291
|
+
if (typeof fixed === "number")
|
|
292
|
+
return { temperature: fixed };
|
|
293
|
+
return { temperature: desired };
|
|
294
|
+
}
|
|
232
295
|
export function detectProviderForModel(modelId) {
|
|
233
296
|
const info = getModelInfo(modelId);
|
|
234
297
|
if (info?.provider) {
|
|
@@ -240,12 +303,12 @@ export function detectProviderForModel(modelId) {
|
|
|
240
303
|
return "deepseek";
|
|
241
304
|
if (id.startsWith("gpt-") || id.startsWith("o1") || id.startsWith("o3") || id.startsWith("o4"))
|
|
242
305
|
return "openai";
|
|
243
|
-
if (id.startsWith("gemini") || id.startsWith("models/gemini"))
|
|
244
|
-
return "google";
|
|
245
306
|
if (id.startsWith("grok"))
|
|
246
307
|
return "xai";
|
|
247
|
-
if (id.includes("
|
|
248
|
-
return "
|
|
308
|
+
if (id.includes("glm") || id.startsWith("z-ai") || id.startsWith("zai"))
|
|
309
|
+
return "zai";
|
|
310
|
+
if (id.startsWith("opencode"))
|
|
311
|
+
return "opencode-go";
|
|
249
312
|
if (id.startsWith("llama") || id.startsWith("mistral") || id.startsWith("phi-"))
|
|
250
313
|
return "ollama";
|
|
251
314
|
if (id.startsWith("claude"))
|
|
@@ -17,6 +17,22 @@ import type { ModelInfo } from "../../types/index.js";
|
|
|
17
17
|
import type { ProviderCapabilities } from "../capabilities.js";
|
|
18
18
|
import type { ProviderFactory, ResolvedModelRuntime } from "../runtime.js";
|
|
19
19
|
import type { ProviderId } from "../types.js";
|
|
20
|
+
/**
|
|
21
|
+
* Catalog ids for models reached through the OpenCode Go (Console Go) gateway
|
|
22
|
+
* carry an `opencode/` routing prefix (e.g. `opencode/deepseek-v4-flash`). That
|
|
23
|
+
* prefix is a *routing* marker, not part of the wire model name any upstream
|
|
24
|
+
* accepts — the gateway itself strips it before forwarding (see
|
|
25
|
+
* OpenCodeGoStrategy.createFactory). When a task sub-model resolved from that
|
|
26
|
+
* catalog id is run through a DIFFERENT provider's factory (e.g. the compaction
|
|
27
|
+
* proposer reusing the parent's native DeepSeek factory), the raw prefixed id
|
|
28
|
+
* would otherwise be POSTed to api.deepseek.com and rejected with HTTP 400
|
|
29
|
+
* "The supported API model names are deepseek-v4-pro or deepseek-v4-flash, but
|
|
30
|
+
* you passed opencode/deepseek-v4-flash". Stripping here — the single chokepoint
|
|
31
|
+
* every provider's resolve() flows through — makes the wire name always native.
|
|
32
|
+
* The returned `modelId` keeps the catalog id so usage/pricing attribution is
|
|
33
|
+
* unchanged; only the id handed to factory() is normalized.
|
|
34
|
+
*/
|
|
35
|
+
export declare function toWireModelId(modelId: string): string;
|
|
20
36
|
export interface CreateFactoryOpts {
|
|
21
37
|
apiKey?: string;
|
|
22
38
|
baseURL?: string;
|
|
@@ -13,6 +13,24 @@
|
|
|
13
13
|
* 3. Register the singleton in `strategies/registry.ts`.
|
|
14
14
|
* 4. Add the ProviderId to `src/providers/types.ts` if not already present.
|
|
15
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* Catalog ids for models reached through the OpenCode Go (Console Go) gateway
|
|
18
|
+
* carry an `opencode/` routing prefix (e.g. `opencode/deepseek-v4-flash`). That
|
|
19
|
+
* prefix is a *routing* marker, not part of the wire model name any upstream
|
|
20
|
+
* accepts — the gateway itself strips it before forwarding (see
|
|
21
|
+
* OpenCodeGoStrategy.createFactory). When a task sub-model resolved from that
|
|
22
|
+
* catalog id is run through a DIFFERENT provider's factory (e.g. the compaction
|
|
23
|
+
* proposer reusing the parent's native DeepSeek factory), the raw prefixed id
|
|
24
|
+
* would otherwise be POSTed to api.deepseek.com and rejected with HTTP 400
|
|
25
|
+
* "The supported API model names are deepseek-v4-pro or deepseek-v4-flash, but
|
|
26
|
+
* you passed opencode/deepseek-v4-flash". Stripping here — the single chokepoint
|
|
27
|
+
* every provider's resolve() flows through — makes the wire name always native.
|
|
28
|
+
* The returned `modelId` keeps the catalog id so usage/pricing attribution is
|
|
29
|
+
* unchanged; only the id handed to factory() is normalized.
|
|
30
|
+
*/
|
|
31
|
+
export function toWireModelId(modelId) {
|
|
32
|
+
return modelId.startsWith("opencode/") ? modelId.slice("opencode/".length) : modelId;
|
|
33
|
+
}
|
|
16
34
|
/**
|
|
17
35
|
* Shared base — most providers want the same `resolve` body. Subclasses
|
|
18
36
|
* override only when truly different.
|
|
@@ -21,7 +39,12 @@ export class BaseProviderStrategy {
|
|
|
21
39
|
resolve(opts) {
|
|
22
40
|
const { factory, modelId, modelInfo, reasoningEffort } = opts;
|
|
23
41
|
const useResponsesApi = this.capabilities.usesResponsesAPI(modelInfo);
|
|
24
|
-
|
|
42
|
+
// Normalize the wire model name (strip the `opencode/` routing prefix) so a
|
|
43
|
+
// native provider factory never receives a gateway-routed id. See
|
|
44
|
+
// toWireModelId above. `modelId` (catalog id) is still returned below for
|
|
45
|
+
// attribution — only the id passed to factory() is normalized.
|
|
46
|
+
const wireModelId = toWireModelId(modelId);
|
|
47
|
+
const model = useResponsesApi && factory.responses ? factory.responses(wireModelId) : factory(wireModelId);
|
|
25
48
|
const providerOptions = this.capabilities.buildProviderOptions({
|
|
26
49
|
model: modelInfo,
|
|
27
50
|
reasoningEffort,
|
package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts}
RENAMED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* src/providers/strategies/
|
|
2
|
+
* src/providers/strategies/opencode-go.strategy.ts
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* OpenCode Go strategy via `@ai-sdk/openai-compatible`.
|
|
5
5
|
*/
|
|
6
6
|
import { type ProviderCapabilities } from "../capabilities.js";
|
|
7
7
|
import type { ProviderFactory } from "../runtime.js";
|
|
8
8
|
import type { ProviderId } from "../types.js";
|
|
9
9
|
import { BaseProviderStrategy, type CreateFactoryOpts } from "./base.strategy.js";
|
|
10
|
-
export declare class
|
|
10
|
+
export declare class OpenCodeGoStrategy extends BaseProviderStrategy {
|
|
11
11
|
readonly id: ProviderId;
|
|
12
12
|
readonly capabilities: ProviderCapabilities;
|
|
13
13
|
createFactory(opts: CreateFactoryOpts): ProviderFactory;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/providers/strategies/opencode-go.strategy.ts
|
|
3
|
+
*
|
|
4
|
+
* OpenCode Go strategy via `@ai-sdk/openai-compatible`.
|
|
5
|
+
*/
|
|
6
|
+
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
7
|
+
import { getProviderCapabilities } from "../capabilities.js";
|
|
8
|
+
import { OPENAI_COMPATIBLE_BASE_URLS } from "../endpoints.js";
|
|
9
|
+
import { BaseProviderStrategy } from "./base.strategy.js";
|
|
10
|
+
import { backfillReasoningContent, sanitizeToolCallArguments, splitParallelToolCalls, transformThinkingModeBody, transformZaiThinkingBody, } from "./thinking-mode.js";
|
|
11
|
+
export class OpenCodeGoStrategy extends BaseProviderStrategy {
|
|
12
|
+
id = "opencode-go";
|
|
13
|
+
capabilities = getProviderCapabilities("opencode-go");
|
|
14
|
+
createFactory(opts) {
|
|
15
|
+
const p = createOpenAICompatible({
|
|
16
|
+
name: this.id,
|
|
17
|
+
baseURL: opts.baseURL ?? OPENAI_COMPATIBLE_BASE_URLS["opencode-go"],
|
|
18
|
+
apiKey: opts.apiKey ?? (opts.headers ? "oauth" : undefined),
|
|
19
|
+
...(opts.headers ? { headers: opts.headers } : {}),
|
|
20
|
+
// DeepSeek models (common via opencode-go) do not support full json_schema,
|
|
21
|
+
// only json_object. Prevent AI SDK from sending unsupported schema.
|
|
22
|
+
supportsStructuredOutputs: false,
|
|
23
|
+
// Apply thinking-mode transform for deepseek models routed via opencode-go (e.g. deepseek-v4-flash).
|
|
24
|
+
// The opencode Console Go backend forwards to DeepSeek, which requires reasoning_content
|
|
25
|
+
// roundtrips (like direct DeepSeek). Without it, histories with tool calls produce
|
|
26
|
+
// "Upstream request failed" / invalid_request_error (observed in session 53f3c3ea4ae8).
|
|
27
|
+
// Inspect body.model (after possible prefix) to apply only when appropriate.
|
|
28
|
+
transformRequestBody: (body) => {
|
|
29
|
+
const modelInBody = body?.model || "";
|
|
30
|
+
const isDeepseekModel = modelInBody.includes("deepseek") || modelInBody.includes("v4-flash");
|
|
31
|
+
const isGlmModel = modelInBody.includes("glm");
|
|
32
|
+
let out = body;
|
|
33
|
+
if (isDeepseekModel) {
|
|
34
|
+
out = transformThinkingModeBody(body);
|
|
35
|
+
}
|
|
36
|
+
else if (isGlmModel) {
|
|
37
|
+
// For GLM models via opencode-go, use zai-style sanitization (reasoning backfill + tool shape).
|
|
38
|
+
out = transformZaiThinkingBody(body);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Other reasoning-capable models via Console Go (e.g. kimi-k2.7-code).
|
|
42
|
+
// Verified 2026-07-02 (session 53f3c3ea4ae8): kimi histories arrive
|
|
43
|
+
// MIXED — some assistant turns carry reasoning_content, some do not —
|
|
44
|
+
// and Console Go rejects the request (400 "Upstream request failed").
|
|
45
|
+
// Apply the same mixed-history reasoning backfill Z.ai uses.
|
|
46
|
+
out = { ...body };
|
|
47
|
+
if (Array.isArray(out.messages)) {
|
|
48
|
+
out.messages = backfillReasoningContent(out.messages, { onlyIfMixed: true });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// H3 REAL FIX — Console Go's upstream (kimi / deepseek / glm) rejects a
|
|
52
|
+
// follow-up whose history has an assistant turn with a batch of parallel
|
|
53
|
+
// tool_calls (observed 5/6 for kimi, up to 17 for glm). parallel_tool_calls
|
|
54
|
+
// below is ignored by the model, so split any multi-tool-call assistant
|
|
55
|
+
// turn into sequential single-call turns. No-op unless the failing
|
|
56
|
+
// pattern is present, so successful requests are untouched.
|
|
57
|
+
if (Array.isArray(out.messages)) {
|
|
58
|
+
out.messages = splitParallelToolCalls(out.messages);
|
|
59
|
+
// Repair empty/truncated tool_call arguments ("unexpected end of JSON
|
|
60
|
+
// input" 1210 sub-cause) before they reach the Console Go upstream.
|
|
61
|
+
out.messages = sanitizeToolCallArguments(out.messages);
|
|
62
|
+
}
|
|
63
|
+
// Additional sanitization for opencode-go (proxy can be sensitive):
|
|
64
|
+
// Force no parallel to avoid large tool result batches causing upstream failures.
|
|
65
|
+
// Drop null response_format.
|
|
66
|
+
out.parallel_tool_calls = false;
|
|
67
|
+
if ("response_format" in out) {
|
|
68
|
+
const rf = out.response_format;
|
|
69
|
+
if (rf == null || (typeof rf === "object" && Object.keys(rf).length === 0)) {
|
|
70
|
+
delete out.response_format;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
return (modelId) => {
|
|
77
|
+
// Strip 'opencode/' prefix if present
|
|
78
|
+
const cleanId = modelId.startsWith("opencode/") ? modelId.slice(9) : modelId;
|
|
79
|
+
return p(cleanId);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=opencode-go.strategy.js.map
|
|
@@ -6,19 +6,19 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { AnthropicStrategy } from "./anthropic.strategy.js";
|
|
8
8
|
import { DeepSeekStrategy } from "./deepseek.strategy.js";
|
|
9
|
-
import { GoogleStrategy } from "./google.strategy.js";
|
|
10
9
|
import { OllamaStrategy } from "./ollama.strategy.js";
|
|
11
10
|
import { OpenAIStrategy } from "./openai.strategy.js";
|
|
12
|
-
import {
|
|
11
|
+
import { OpenCodeGoStrategy } from "./opencode-go.strategy.js";
|
|
13
12
|
import { XAIStrategy } from "./xai.strategy.js";
|
|
13
|
+
import { ZaiStrategy } from "./zai.strategy.js";
|
|
14
14
|
const STRATEGIES = {
|
|
15
15
|
anthropic: new AnthropicStrategy(),
|
|
16
16
|
openai: new OpenAIStrategy(),
|
|
17
|
-
google: new GoogleStrategy(),
|
|
18
17
|
deepseek: new DeepSeekStrategy(),
|
|
19
|
-
siliconflow: new SiliconflowStrategy(),
|
|
20
18
|
xai: new XAIStrategy(),
|
|
21
19
|
ollama: new OllamaStrategy(),
|
|
20
|
+
zai: new ZaiStrategy(),
|
|
21
|
+
"opencode-go": new OpenCodeGoStrategy(),
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
24
|
* Returns the strategy singleton for a given provider id. Throws on unknown
|
|
@@ -28,8 +28,117 @@
|
|
|
28
28
|
* https://api-docs.deepseek.com/guides/thinking_mode
|
|
29
29
|
*/
|
|
30
30
|
export declare function shouldDisableThinking(): boolean;
|
|
31
|
+
interface WireMessage {
|
|
32
|
+
role?: unknown;
|
|
33
|
+
content?: unknown;
|
|
34
|
+
reasoning_content?: unknown;
|
|
35
|
+
tool_calls?: unknown;
|
|
36
|
+
[k: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Backfill `reasoning_content: ""` onto any assistant message that lacks a
|
|
40
|
+
* (non-empty/present) one, so SiliconFlow's thinking-mode validator never
|
|
41
|
+
* sees a reasoning-less assistant turn. Assistant turns that already carry a
|
|
42
|
+
* real `reasoning_content` are left untouched.
|
|
43
|
+
*
|
|
44
|
+
* `opts.onlyIfMixed` (used by Z.ai): skip the backfill entirely when NO
|
|
45
|
+
* assistant message in the history carries a `reasoning_content` field. This
|
|
46
|
+
* guards non-thinking models (glm-4.5-air, glm-4.6v-flash) from having an
|
|
47
|
+
* unknown `reasoning_content` field injected — which would itself trigger
|
|
48
|
+
* Z.ai's 1210. Once any one assistant turn carries reasoning (i.e. the
|
|
49
|
+
* conversation is in thinking mode — confirmed by the model's own emission),
|
|
50
|
+
* the backfill brings every other assistant turn up to the same shape.
|
|
51
|
+
*/
|
|
52
|
+
export declare function backfillReasoningContent(messages: WireMessage[], opts?: {
|
|
53
|
+
onlyIfMixed?: boolean;
|
|
54
|
+
}): WireMessage[];
|
|
55
|
+
/**
|
|
56
|
+
* Split assistant messages that carry MORE THAN ONE `tool_calls` entry into a
|
|
57
|
+
* sequence of single-tool-call assistant turns, each immediately followed by
|
|
58
|
+
* its matching `role:"tool"` result. Identity (returns the same array by
|
|
59
|
+
* reference) when no assistant message has >1 tool_calls.
|
|
60
|
+
*
|
|
61
|
+
* WHY (verified from live sessions c0dcf9153803 / c1f5ca294496 and the
|
|
62
|
+
* llm-wire.log forensics on 2026-07-02): both the Z.ai GLM coding endpoint
|
|
63
|
+
* (HTTP 400 / code 1210 "Invalid API parameter") and the opencode Console Go
|
|
64
|
+
* proxy (HTTP 400 invalid_request_error "Upstream request failed") REJECT a
|
|
65
|
+
* follow-up request whose history contains an assistant turn that emitted a
|
|
66
|
+
* large batch of parallel tool_calls (observed 5, 6, 8, 12, and 17 in a single
|
|
67
|
+
* assistant message). Forcing `parallel_tool_calls:false` does NOT prevent
|
|
68
|
+
* this — the model ignores the flag and still emits batches, and the flag has
|
|
69
|
+
* no effect on assistant turns already in the history. The only reliable fix
|
|
70
|
+
* is to reshape the echoed-back history so no single assistant turn presents
|
|
71
|
+
* more than one tool_call.
|
|
72
|
+
*
|
|
73
|
+
* Safety: because this is a no-op unless an assistant turn has >1 tool_calls,
|
|
74
|
+
* it can only ever alter requests that match the known-failing pattern —
|
|
75
|
+
* requests that already succeed (≤1 tool_call per turn) are returned
|
|
76
|
+
* untouched.
|
|
77
|
+
*
|
|
78
|
+
* `reasoning_content` (when present) is kept on the FIRST split turn only and
|
|
79
|
+
* blanked to "" on the rest, so a single reasoning segment is not duplicated
|
|
80
|
+
* across the synthesized turns. Assistant `content` is likewise kept on the
|
|
81
|
+
* first and blanked on the rest.
|
|
82
|
+
*/
|
|
83
|
+
export declare function splitParallelToolCalls(messages: WireMessage[]): WireMessage[];
|
|
31
84
|
/**
|
|
32
85
|
* The shared `transformRequestBody` for deepseek + siliconflow. Runs on the
|
|
33
86
|
* fully-serialized wire body right before fetch.
|
|
34
87
|
*/
|
|
35
88
|
export declare function transformThinkingModeBody<T extends Record<string, unknown>>(body: T): T;
|
|
89
|
+
/**
|
|
90
|
+
* Should the Z.ai thinking-disable escape hatch fire? Off by default — Z.ai
|
|
91
|
+
* GLM coding-plan endpoints (`api.z.ai/api/coding/paas/v4`) auto-enable
|
|
92
|
+
* thinking for reasoning-capable models (glm-4.7, glm-5.x), and we want the
|
|
93
|
+
* reasoning_content round-trip to succeed. Set `MUONROI_ZAI_DISABLE_THINKING=1`
|
|
94
|
+
* to mirror DeepSeek's fallback B (disable thinking entirely).
|
|
95
|
+
*/
|
|
96
|
+
export declare function shouldDisableZaiThinking(): boolean;
|
|
97
|
+
/** True once a provider param-reject has flipped the session into degraded mode. */
|
|
98
|
+
export declare function isProviderThinkingDegraded(): boolean;
|
|
99
|
+
/** Latch degraded mode on (idempotent). Called by the retry classifier. */
|
|
100
|
+
export declare function markProviderThinkingDegrade(): void;
|
|
101
|
+
/** Test-only reset so the module latch doesn't leak across cases. */
|
|
102
|
+
export declare function _resetProviderThinkingDegrade(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Ensure every assistant `tool_calls[].function.arguments` is a valid JSON
|
|
105
|
+
* STRING. GLM's coding endpoint returns a generic 1210 with the underlying
|
|
106
|
+
* detail "error parsing parameters: unexpected end of JSON input" when an
|
|
107
|
+
* assistant turn echoes back a tool call whose `arguments` is empty, missing,
|
|
108
|
+
* or truncated (verified failure mode reported by crush #1237 and opencode
|
|
109
|
+
* users — a big parallel-tool-call batch clamped by max_tokens truncates the
|
|
110
|
+
* last call's arguments mid-string). Repairs are conservative: a value that
|
|
111
|
+
* already parses as JSON is left untouched; only empty/missing/unparseable
|
|
112
|
+
* arguments are replaced with `"{}"`, and a stray object is re-stringified.
|
|
113
|
+
* No-op (returns input by reference) when nothing needs repair.
|
|
114
|
+
*/
|
|
115
|
+
export declare function sanitizeToolCallArguments(messages: WireMessage[]): WireMessage[];
|
|
116
|
+
/**
|
|
117
|
+
* Z.ai's `transformRequestBody`. Mirrors `transformThinkingModeBody` but with
|
|
118
|
+
* one critical difference: the reasoning_content backfill is GATED on
|
|
119
|
+
* `onlyIfMixed` — it only fires once at least one assistant message in the
|
|
120
|
+
* history already carries reasoning_content. This protects non-thinking Z.ai
|
|
121
|
+
* models (glm-4.5-air, glm-4.6v-flash) which would otherwise reject the
|
|
122
|
+
* injected field with HTTP 400 / code 1210.
|
|
123
|
+
*
|
|
124
|
+
* Verified failure: session c0dcf9153803 — GLM-4.7 on the Z.ai coding
|
|
125
|
+
* endpoint. First 4 assistant turns succeeded; on the 5th streamText call
|
|
126
|
+
* (after 6 tool rounds, where intermediate assistant steps carried tool_calls
|
|
127
|
+
* WITHOUT reasoning), Z.ai rejected the whole request with code 1210
|
|
128
|
+
* "Invalid API parameter". Same class of bug as SiliconFlow 20015 (see
|
|
129
|
+
* `transformThinkingModeBody` above), but Z.ai also hosts non-thinking models
|
|
130
|
+
* on the same strategy, so the backfill must stay conditional.
|
|
131
|
+
*
|
|
132
|
+
* H3 mitigation (added after c7c4a6487847 + 94827f75a69e + c94360bac00f + c1f5ca294496):
|
|
133
|
+
* GLM coding endpoint rejects the request (often as generic 1210) when the
|
|
134
|
+
* history contains assistant turns with multiple tool_calls (even after forcing
|
|
135
|
+
* parallel_tool_calls:false — model still emitted batches of 2-5). The reject
|
|
136
|
+
* frequently manifests as stall timeout because the provider stops emitting
|
|
137
|
+
* chunks. We do extra sanitization here:
|
|
138
|
+
* - force parallel_tool_calls:false
|
|
139
|
+
* - drop response_format when null/empty (combo with tools is fragile)
|
|
140
|
+
* - clamp max_tokens > 4096 down to 4096 (higher values seen in 1210s)
|
|
141
|
+
* Trade-off: more sequential tool use + slightly lower token budget.
|
|
142
|
+
*/
|
|
143
|
+
export declare function transformZaiThinkingBody<T extends Record<string, unknown>>(body: T): T;
|
|
144
|
+
export {};
|