muonroi-cli 1.8.4 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +17 -5
- package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
- package/dist/packages/agent-harness-core/src/driver.js +46 -0
- package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
- package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
- package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
- package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
- package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
- package/dist/packages/agent-harness-core/src/protocol.js +15 -0
- package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
- package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
- package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
- package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
- package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
- package/dist/packages/agent-harness-opentui/src/install.js +10 -0
- package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
- package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
- package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
- package/dist/src/agent-harness/mock-model.d.ts +38 -0
- package/dist/src/agent-harness/mock-model.js +69 -3
- package/dist/src/agent-harness/test-spawn.js +31 -0
- package/dist/src/chat/chat-keychain.d.ts +7 -12
- package/dist/src/chat/chat-keychain.js +19 -86
- package/dist/src/cli/config/screen-providers.js +1 -1
- package/dist/src/cli/cost-forensics.d.ts +10 -0
- package/dist/src/cli/cost-forensics.js +18 -3
- package/dist/src/cli/keys-bundle.d.ts +1 -1
- package/dist/src/cli/keys-bundle.js +1 -1
- package/dist/src/cli/keys.d.ts +10 -47
- package/dist/src/cli/keys.js +31 -399
- package/dist/src/council/clarifier.d.ts +31 -3
- package/dist/src/council/clarifier.js +220 -32
- package/dist/src/council/context.js +49 -15
- package/dist/src/council/debate-checkpoint.d.ts +129 -0
- package/dist/src/council/debate-checkpoint.js +176 -0
- package/dist/src/council/debate-planner.js +54 -5
- package/dist/src/council/debate-summary.d.ts +25 -0
- package/dist/src/council/debate-summary.js +85 -0
- package/dist/src/council/debate.d.ts +169 -2
- package/dist/src/council/debate.js +1265 -135
- package/dist/src/council/index.d.ts +108 -1
- package/dist/src/council/index.js +670 -197
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +94 -0
- package/dist/src/council/llm.js +348 -55
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +82 -0
- package/dist/src/council/planner.js +40 -0
- package/dist/src/council/preflight.d.ts +17 -0
- package/dist/src/council/preflight.js +50 -2
- package/dist/src/council/prompts.d.ts +39 -4
- package/dist/src/council/prompts.js +256 -69
- package/dist/src/council/stance-recall.d.ts +42 -0
- package/dist/src/council/stance-recall.js +57 -0
- package/dist/src/council/strip-think.d.ts +17 -0
- package/dist/src/council/strip-think.js +33 -0
- package/dist/src/council/types.d.ts +138 -0
- package/dist/src/ee/artifact-cache.d.ts +16 -0
- package/dist/src/ee/artifact-cache.js +32 -0
- package/dist/src/ee/auth.d.ts +20 -0
- package/dist/src/ee/auth.js +54 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +109 -21
- package/dist/src/ee/ee-onboarding.js +6 -26
- package/dist/src/ee/export-transcripts.d.ts +1 -0
- package/dist/src/ee/export-transcripts.js +8 -10
- package/dist/src/ee/extract-session.js +29 -0
- package/dist/src/ee/extract-style.d.ts +58 -0
- package/dist/src/ee/extract-style.js +270 -0
- package/dist/src/ee/recall-ledger.d.ts +9 -0
- package/dist/src/ee/recall-ledger.js +3 -0
- package/dist/src/ee/scope.d.ts +1 -0
- package/dist/src/ee/scope.js +26 -1
- package/dist/src/ee/search.d.ts +7 -0
- package/dist/src/ee/search.js +24 -0
- package/dist/src/ee/transcript-emit.js +2 -0
- package/dist/src/ee/types.d.ts +22 -0
- package/dist/src/ee/who-am-i-brain.d.ts +35 -0
- package/dist/src/ee/who-am-i-brain.js +220 -0
- package/dist/src/ee/who-am-i.d.ts +10 -3
- package/dist/src/ee/who-am-i.js +12 -0
- package/dist/src/ee/workflow-event.d.ts +48 -0
- package/dist/src/ee/workflow-event.js +81 -0
- package/dist/src/flow/compaction/compress.d.ts +3 -3
- package/dist/src/flow/compaction/compress.js +58 -8
- package/dist/src/flow/compaction/extract.d.ts +4 -7
- package/dist/src/flow/compaction/extract.js +50 -10
- package/dist/src/flow/compaction/index.d.ts +14 -1
- package/dist/src/flow/compaction/index.js +96 -3
- package/dist/src/flow/compaction/input-guard.d.ts +24 -0
- package/dist/src/flow/compaction/input-guard.js +43 -0
- package/dist/src/flow/compaction/progress.d.ts +35 -0
- package/dist/src/flow/compaction/progress.js +35 -0
- package/dist/src/flow/fold-planning.d.ts +36 -0
- package/dist/src/flow/fold-planning.js +83 -0
- package/dist/src/flow/hierarchy.d.ts +146 -0
- package/dist/src/flow/hierarchy.js +427 -0
- package/dist/src/flow/index.d.ts +1 -0
- package/dist/src/flow/index.js +2 -0
- package/dist/src/flow/run-artifacts.d.ts +102 -0
- package/dist/src/flow/run-artifacts.js +208 -0
- package/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/dist/src/gsd/assessment-schema.d.ts +44 -0
- package/dist/src/gsd/assessment-schema.js +134 -0
- package/dist/src/gsd/capability-registry.d.ts +45 -0
- package/dist/src/gsd/capability-registry.js +337 -0
- package/dist/src/gsd/complexity-assessor.d.ts +39 -0
- package/dist/src/gsd/complexity-assessor.js +152 -0
- package/dist/src/gsd/config-bridge.d.ts +7 -0
- package/dist/src/gsd/config-bridge.js +114 -0
- package/dist/src/gsd/config-loader.d.ts +27 -0
- package/dist/src/gsd/config-loader.js +50 -0
- package/dist/src/gsd/council-context.d.ts +44 -0
- package/dist/src/gsd/council-context.js +114 -0
- package/dist/src/gsd/ee-closure.d.ts +28 -0
- package/dist/src/gsd/ee-closure.js +49 -0
- package/dist/src/gsd/flags.d.ts +66 -0
- package/dist/src/gsd/flags.js +102 -0
- package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
- package/dist/src/gsd/gsd-dispatch.js +131 -0
- package/dist/src/gsd/gsd-runtime.d.ts +22 -0
- package/dist/src/gsd/gsd-runtime.js +37 -0
- package/dist/src/gsd/host-adapter.d.ts +11 -0
- package/dist/src/gsd/host-adapter.js +29 -0
- package/dist/src/gsd/index.d.ts +24 -1
- package/dist/src/gsd/index.js +27 -0
- package/dist/src/gsd/loop-host-contract.d.ts +21 -0
- package/dist/src/gsd/loop-host-contract.js +39 -0
- package/dist/src/gsd/loop-host.d.ts +69 -0
- package/dist/src/gsd/loop-host.js +245 -0
- package/dist/src/gsd/loop-resolver.d.ts +36 -0
- package/dist/src/gsd/loop-resolver.js +79 -0
- package/dist/src/gsd/model-tier.d.ts +13 -0
- package/dist/src/gsd/model-tier.js +45 -0
- package/dist/src/gsd/mutation-gate.d.ts +16 -0
- package/dist/src/gsd/mutation-gate.js +41 -0
- package/dist/src/gsd/native-roadmap.d.ts +89 -0
- package/dist/src/gsd/native-roadmap.js +343 -0
- package/dist/src/gsd/native-state.d.ts +47 -0
- package/dist/src/gsd/native-state.js +220 -0
- package/dist/src/gsd/paths.d.ts +23 -0
- package/dist/src/gsd/paths.js +66 -0
- package/dist/src/gsd/phase-dag.d.ts +12 -0
- package/dist/src/gsd/phase-dag.js +94 -0
- package/dist/src/gsd/phase-sync.d.ts +42 -0
- package/dist/src/gsd/phase-sync.js +321 -0
- package/dist/src/gsd/pil-gate-context.d.ts +13 -0
- package/dist/src/gsd/pil-gate-context.js +64 -0
- package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
- package/dist/src/gsd/pil-gate-critic.js +74 -0
- package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
- package/dist/src/gsd/plan-council-prompts.js +79 -0
- package/dist/src/gsd/plan-council.d.ts +44 -0
- package/dist/src/gsd/plan-council.js +283 -0
- package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
- package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
- package/dist/src/gsd/product-workspace.d.ts +13 -0
- package/dist/src/gsd/product-workspace.js +124 -0
- package/dist/src/gsd/ship-bridge.d.ts +25 -0
- package/dist/src/gsd/ship-bridge.js +65 -0
- package/dist/src/gsd/state-document.d.ts +40 -0
- package/dist/src/gsd/state-document.js +163 -0
- package/dist/src/gsd/verdict-schema.d.ts +39 -0
- package/dist/src/gsd/verdict-schema.js +144 -0
- package/dist/src/gsd/verify-context.d.ts +22 -0
- package/dist/src/gsd/verify-context.js +27 -0
- package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
- package/dist/src/gsd/verify-council-prompts.js +85 -0
- package/dist/src/gsd/verify-council.d.ts +25 -0
- package/dist/src/gsd/verify-council.js +119 -0
- package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
- package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
- package/dist/src/gsd/workflow-engine.d.ts +60 -0
- package/dist/src/gsd/workflow-engine.js +207 -0
- package/dist/src/gsd/workflow-tools.d.ts +13 -0
- package/dist/src/gsd/workflow-tools.js +277 -0
- package/dist/src/headless/council-answers.js +4 -0
- package/dist/src/hooks/index.js +1 -1
- package/dist/src/index.js +172 -270
- package/dist/src/lsp/builtins.js +3 -1
- package/dist/src/lsp/manager.d.ts +5 -1
- package/dist/src/lsp/manager.js +249 -3
- package/dist/src/lsp/npm-cache.d.ts +11 -1
- package/dist/src/lsp/npm-cache.js +17 -1
- package/dist/src/lsp/runtime.d.ts +6 -1
- package/dist/src/lsp/runtime.js +17 -1
- package/dist/src/lsp/types.d.ts +83 -1
- package/dist/src/lsp/types.js +10 -0
- package/dist/src/maintain/pr-builder.js +23 -13
- package/dist/src/mcp/auto-setup.js +57 -32
- package/dist/src/mcp/client-pool.js +44 -16
- package/dist/src/mcp/lsp-tools.d.ts +5 -1
- package/dist/src/mcp/lsp-tools.js +93 -2
- package/dist/src/mcp/mcp-keychain.d.ts +3 -5
- package/dist/src/mcp/mcp-keychain.js +9 -49
- package/dist/src/mcp/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -2
- package/dist/src/mcp/setup-guide-text.d.ts +1 -1
- package/dist/src/mcp/setup-guide-text.js +22 -2
- package/dist/src/mcp/tools-server.d.ts +10 -0
- package/dist/src/mcp/tools-server.js +10 -2
- package/dist/src/models/catalog-client.d.ts +87 -0
- package/dist/src/models/catalog-client.js +105 -38
- package/dist/src/models/catalog.json +528 -265
- package/dist/src/models/registry.d.ts +22 -7
- package/dist/src/models/registry.js +73 -10
- package/dist/src/ops/doctor.js +1 -1
- package/dist/src/orchestrator/ask-user.d.ts +61 -0
- package/dist/src/orchestrator/ask-user.js +65 -0
- package/dist/src/orchestrator/auto-commit.js +1 -1
- package/dist/src/orchestrator/batch-turn-runner.js +2 -2
- package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
- package/dist/src/orchestrator/cache-prefix.js +83 -0
- package/dist/src/orchestrator/compact-request.d.ts +32 -0
- package/dist/src/orchestrator/compact-request.js +41 -0
- package/dist/src/orchestrator/compaction.d.ts +12 -3
- package/dist/src/orchestrator/compaction.js +35 -15
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +74 -32
- package/dist/src/orchestrator/council-request.d.ts +49 -0
- package/dist/src/orchestrator/council-request.js +62 -0
- package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
- package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
- package/dist/src/orchestrator/error-utils.d.ts +29 -0
- package/dist/src/orchestrator/error-utils.js +132 -24
- package/dist/src/orchestrator/grounding-check.js +39 -1
- package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
- package/dist/src/orchestrator/interactive-pause.js +36 -0
- package/dist/src/orchestrator/message-processor.d.ts +4 -0
- package/dist/src/orchestrator/message-processor.js +268 -41
- package/dist/src/orchestrator/orchestrator.d.ts +64 -3
- package/dist/src/orchestrator/orchestrator.js +823 -120
- package/dist/src/orchestrator/preprocessor.js +3 -3
- package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
- package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
- package/dist/src/orchestrator/prompts.js +17 -17
- package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
- package/dist/src/orchestrator/reactive-delegation.js +59 -0
- package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
- package/dist/src/orchestrator/retry-classifier.js +46 -2
- package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
- package/dist/src/orchestrator/safety-askcard.js +5 -2
- package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
- package/dist/src/orchestrator/safety-intercept.js +62 -0
- package/dist/src/orchestrator/scope-reminder.js +1 -1
- package/dist/src/orchestrator/session-experience.d.ts +2 -1
- package/dist/src/orchestrator/session-experience.js +2 -1
- package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
- package/dist/src/orchestrator/should-run-gate.js +18 -0
- package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
- package/dist/src/orchestrator/stall-watchdog.js +65 -10
- package/dist/src/orchestrator/stream-runner.d.ts +13 -3
- package/dist/src/orchestrator/stream-runner.js +115 -49
- package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-cap.js +16 -1
- package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
- package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
- package/dist/src/orchestrator/subagent-compactor.js +126 -15
- package/dist/src/orchestrator/tool-engine.d.ts +41 -0
- package/dist/src/orchestrator/tool-engine.js +846 -66
- package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
- package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
- package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
- package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
- package/dist/src/orchestrator/turn-watchdog.js +84 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +6 -4
- package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
- package/dist/src/pil/cheap-model-playbook.js +5 -1
- package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
- package/dist/src/pil/cheap-model-workbooks.js +1 -1
- package/dist/src/pil/discovery-types.d.ts +1 -0
- package/dist/src/pil/discovery.d.ts +1 -1
- package/dist/src/pil/discovery.js +18 -13
- package/dist/src/pil/layer1-intent.d.ts +18 -6
- package/dist/src/pil/layer1-intent.js +66 -757
- package/dist/src/pil/layer15-context-scan.js +15 -1
- package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
- package/dist/src/pil/layer1_5-complexity-size.js +31 -5
- package/dist/src/pil/layer3-ee-injection.js +23 -8
- package/dist/src/pil/layer4-gsd.js +69 -16
- package/dist/src/pil/layer5-context.js +7 -3
- package/dist/src/pil/layer6-output.d.ts +23 -0
- package/dist/src/pil/layer6-output.js +5 -1
- package/dist/src/pil/llm-classify.d.ts +111 -5
- package/dist/src/pil/llm-classify.js +421 -189
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +8 -0
- package/dist/src/pil/pipeline.js +36 -2
- package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
- package/dist/src/pil/repo-grounding-probe.js +136 -0
- package/dist/src/pil/repo-structure-hints.d.ts +7 -0
- package/dist/src/pil/repo-structure-hints.js +45 -0
- package/dist/src/pil/response-tools.js +5 -3
- package/dist/src/pil/schema.d.ts +1 -0
- package/dist/src/pil/schema.js +2 -0
- package/dist/src/pil/types.d.ts +18 -0
- package/dist/src/playbook/directives.d.ts +4 -0
- package/dist/src/playbook/directives.js +17 -5
- package/dist/src/product-loop/artifact-io.js +4 -0
- package/dist/src/product-loop/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- package/dist/src/product-loop/criteria-seed.d.ts +51 -0
- package/dist/src/product-loop/criteria-seed.js +200 -0
- package/dist/src/product-loop/discovery-context-format.js +3 -1
- package/dist/src/product-loop/discovery-ecosystem.js +4 -1
- package/dist/src/product-loop/discovery-interview.d.ts +9 -0
- package/dist/src/product-loop/discovery-interview.js +60 -12
- package/dist/src/product-loop/discovery-recommender.js +2 -1
- package/dist/src/product-loop/discovery-schema.js +19 -2
- package/dist/src/product-loop/discovery-triage.d.ts +23 -0
- package/dist/src/product-loop/discovery-triage.js +109 -0
- package/dist/src/product-loop/gather.js +150 -2
- package/dist/src/product-loop/ideal-trace.d.ts +7 -0
- package/dist/src/product-loop/ideal-trace.js +64 -0
- package/dist/src/product-loop/index.d.ts +13 -1
- package/dist/src/product-loop/index.js +340 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +330 -106
- package/dist/src/product-loop/phase-plan.d.ts +21 -0
- package/dist/src/product-loop/phase-plan.js +81 -6
- package/dist/src/product-loop/phase-rituals.d.ts +3 -0
- package/dist/src/product-loop/phase-rituals.js +8 -3
- package/dist/src/product-loop/phase-runner.js +39 -12
- package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
- package/dist/src/product-loop/plan-adherence-review.js +144 -0
- package/dist/src/product-loop/sprint-runner.d.ts +173 -0
- package/dist/src/product-loop/sprint-runner.js +863 -19
- package/dist/src/product-loop/types.d.ts +61 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- package/dist/src/providers/anthropic.d.ts +9 -8
- package/dist/src/providers/anthropic.js +13 -47
- package/dist/src/providers/auth/browser-flow.d.ts +1 -1
- package/dist/src/providers/auth/browser-flow.js +1 -1
- package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
- package/dist/src/providers/auth/grok-oauth.js +30 -5
- package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
- package/dist/src/providers/auth/openai-oauth.js +15 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.d.ts +9 -9
- package/dist/src/providers/auth/token-store.js +8 -67
- package/dist/src/providers/auth/types.d.ts +9 -1
- package/dist/src/providers/auth/types.js +1 -1
- package/dist/src/providers/capabilities.d.ts +24 -5
- package/dist/src/providers/capabilities.js +42 -24
- package/dist/src/providers/endpoints.d.ts +2 -2
- package/dist/src/providers/endpoints.js +11 -10
- package/dist/src/providers/env-store.d.ts +17 -0
- package/dist/src/providers/env-store.js +228 -0
- package/dist/src/providers/keychain.d.ts +22 -18
- package/dist/src/providers/keychain.js +127 -140
- package/dist/src/providers/mcp-vision-bridge.js +56 -146
- package/dist/src/providers/openai-compatible.js +8 -1
- package/dist/src/providers/pricing.d.ts +2 -2
- package/dist/src/providers/pricing.js +3 -13
- package/dist/src/providers/runtime.d.ts +43 -3
- package/dist/src/providers/runtime.js +88 -14
- package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
- package/dist/src/providers/strategies/base.strategy.js +24 -1
- package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
- package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
- package/dist/src/providers/strategies/registry.js +4 -4
- package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
- package/dist/src/providers/strategies/thinking-mode.js +288 -1
- package/dist/src/providers/strategies/xai.strategy.js +27 -0
- package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
- package/dist/src/providers/strategies/zai.strategy.js +44 -0
- package/dist/src/providers/types.d.ts +5 -6
- package/dist/src/providers/types.js +2 -2
- package/dist/src/providers/vision-backend.d.ts +47 -0
- package/dist/src/providers/vision-backend.js +258 -0
- package/dist/src/providers/vision-proxy.d.ts +22 -9
- package/dist/src/providers/vision-proxy.js +63 -132
- package/dist/src/providers/warm.d.ts +65 -0
- package/dist/src/providers/warm.js +145 -0
- package/dist/src/providers/wire-debug.js +95 -0
- package/dist/src/router/decide.d.ts +13 -0
- package/dist/src/router/decide.js +138 -36
- package/dist/src/router/peak-hour.d.ts +38 -0
- package/dist/src/router/peak-hour.js +107 -0
- package/dist/src/router/step-router.js +3 -2
- package/dist/src/router/warm.js +4 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +26 -0
- package/dist/src/scaffold/point-to-existing.d.ts +21 -0
- package/dist/src/scaffold/point-to-existing.js +25 -0
- package/dist/src/self-qa/agentic-loop.js +6 -5
- package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
- package/dist/src/{ui/state → state}/active-run.js +21 -0
- package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
- package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
- package/dist/src/state/turn-trace.d.ts +43 -0
- package/dist/src/state/turn-trace.js +32 -0
- package/dist/src/storage/db.js +2 -1
- package/dist/src/storage/index.d.ts +1 -1
- package/dist/src/storage/index.js +1 -1
- package/dist/src/storage/interaction-log.d.ts +1 -1
- package/dist/src/storage/migrations.js +71 -1
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +78 -21
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +340 -15
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/git-safety.d.ts +19 -0
- package/dist/src/tools/git-safety.js +168 -0
- package/dist/src/tools/native-tools.d.ts +1 -1
- package/dist/src/tools/native-tools.js +81 -1
- package/dist/src/tools/registry.d.ts +20 -0
- package/dist/src/tools/registry.js +576 -23
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +147 -4
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
- package/dist/src/ui/components/agent-rail-activities.js +47 -0
- package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
- package/dist/src/ui/components/bubble-body-guard.js +50 -0
- package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
- package/dist/src/ui/components/compact-progress-card.js +42 -0
- package/dist/src/ui/components/context-rail.d.ts +26 -0
- package/dist/src/ui/components/context-rail.js +33 -0
- package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
- package/dist/src/ui/components/council-conclusion-card.js +420 -0
- package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
- package/dist/src/ui/components/council-debate-pill.js +34 -0
- package/dist/src/ui/components/council-info-card.js +2 -2
- package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
- package/dist/src/ui/components/council-leader-bubble.js +21 -11
- package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
- package/dist/src/ui/components/council-message-bubble.js +16 -15
- package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
- package/dist/src/ui/components/council-phase-timeline.js +66 -17
- package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
- package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
- package/dist/src/ui/components/council-question-card.js +13 -12
- package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
- package/dist/src/ui/components/council-rail-rounds.js +57 -0
- package/dist/src/ui/components/council-round-group.d.ts +38 -0
- package/dist/src/ui/components/council-round-group.js +88 -0
- package/dist/src/ui/components/council-status-list.d.ts +3 -1
- package/dist/src/ui/components/council-status-list.js +36 -24
- package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
- package/dist/src/ui/components/council-synthesis-banner.js +20 -5
- package/dist/src/ui/components/halt-recovery-card.js +9 -5
- package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
- package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
- package/dist/src/ui/components/message-view.d.ts +15 -0
- package/dist/src/ui/components/message-view.js +50 -1
- package/dist/src/ui/components/prompt-box.js +18 -16
- package/dist/src/ui/components/session-tree-card.d.ts +14 -0
- package/dist/src/ui/components/session-tree-card.js +46 -0
- package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
- package/dist/src/ui/components/slash-inline-menu.js +26 -5
- package/dist/src/ui/components/task-list-panel.d.ts +14 -1
- package/dist/src/ui/components/task-list-panel.js +22 -2
- package/dist/src/ui/components/tool-group.d.ts +15 -3
- package/dist/src/ui/components/tool-group.js +69 -11
- package/dist/src/ui/containers/modals-layer.d.ts +4 -2
- package/dist/src/ui/containers/modals-layer.js +2 -2
- package/dist/src/ui/council-harness-event.d.ts +57 -0
- package/dist/src/ui/council-harness-event.js +46 -0
- package/dist/src/ui/heartbeat-debug.d.ts +29 -0
- package/dist/src/ui/heartbeat-debug.js +45 -0
- package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
- package/dist/src/ui/mcp-modal.js +2 -4
- package/dist/src/ui/modals/api-key-modal.js +1 -1
- package/dist/src/ui/modals/connect-modal.js +4 -3
- package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
- package/dist/src/ui/modals/model-picker-modal.js +8 -10
- package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
- package/dist/src/ui/modals/session-picker-modal.js +3 -5
- package/dist/src/ui/picker-providers.d.ts +1 -1
- package/dist/src/ui/picker-providers.js +1 -1
- package/dist/src/ui/primitives/index.d.ts +1 -0
- package/dist/src/ui/primitives/index.js +2 -0
- package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
- package/dist/src/ui/primitives/semantic-primitives.js +81 -0
- package/dist/src/ui/slash/compact.js +5 -7
- package/dist/src/ui/slash/cost.js +1 -1
- package/dist/src/ui/slash/council.js +19 -1
- package/dist/src/ui/slash/debug.d.ts +3 -31
- package/dist/src/ui/slash/debug.js +9 -20
- package/dist/src/ui/slash/ee.js +81 -0
- package/dist/src/ui/slash/ideal.d.ts +6 -2
- package/dist/src/ui/slash/ideal.js +97 -7
- package/dist/src/ui/slash/menu-items.d.ts +7 -0
- package/dist/src/ui/slash/menu-items.js +23 -20
- package/dist/src/ui/slash/registry.d.ts +2 -0
- package/dist/src/ui/slash/registry.js +4 -0
- package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
- package/dist/src/ui/status-bar/cache-hit.js +9 -0
- package/dist/src/ui/status-bar/index.d.ts +1 -1
- package/dist/src/ui/status-bar/index.js +7 -3
- package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
- package/dist/src/ui/status-bar/usd-meter.js +6 -4
- package/dist/src/ui/theme.d.ts +1 -0
- package/dist/src/ui/theme.js +2 -0
- package/dist/src/ui/types.d.ts +7 -0
- package/dist/src/ui/use-app-logic.js +0 -0
- package/dist/src/ui/utils/agent-activities.d.ts +39 -0
- package/dist/src/ui/utils/agent-activities.js +96 -0
- package/dist/src/ui/utils/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
- package/dist/src/ui/utils/group-tool-entries.js +111 -0
- package/dist/src/ui/utils/tool-summary.d.ts +21 -0
- package/dist/src/ui/utils/tool-summary.js +91 -0
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/event-loop-monitor.d.ts +85 -0
- package/dist/src/utils/event-loop-monitor.js +107 -0
- package/dist/src/utils/install-manager.js +2 -1
- package/dist/src/utils/llm-deadline.d.ts +14 -0
- package/dist/src/utils/llm-deadline.js +19 -0
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/loop-profiler.d.ts +102 -0
- package/dist/src/utils/loop-profiler.js +202 -0
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +180 -5
- package/dist/src/utils/settings.js +271 -31
- package/dist/src/utils/side-question.d.ts +1 -2
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/visible-retry.d.ts +11 -0
- package/dist/src/utils/visible-retry.js +10 -1
- package/dist/src/verify/entrypoint.d.ts +1 -1
- package/dist/src/verify/entrypoint.js +52 -17
- package/dist/src/verify/orchestrator.d.ts +1 -1
- package/dist/src/verify/orchestrator.js +20 -3
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +134 -132
- package/dist/src/cli/bw-vault.d.ts +0 -55
- package/dist/src/cli/bw-vault.js +0 -133
- package/dist/src/mcp/ee-tools.d.ts +0 -46
- package/dist/src/mcp/ee-tools.js +0 -193
- package/dist/src/providers/auth/gcloud.d.ts +0 -28
- package/dist/src/providers/auth/gcloud.js +0 -102
- package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
- package/dist/src/providers/auth/gemini-oauth.js +0 -472
- package/dist/src/providers/gemini.d.ts +0 -11
- package/dist/src/providers/gemini.js +0 -45
- package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
- package/dist/src/providers/siliconflow-sse-repair.js +0 -177
- package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
- package/dist/src/providers/strategies/google.strategy.js +0 -174
- package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
- package/dist/src/ui/containers/chat-feed.d.ts +0 -40
- package/dist/src/ui/containers/chat-feed.js +0 -66
|
@@ -36,8 +36,21 @@ export function shouldDisableThinking() {
|
|
|
36
36
|
* (non-empty/present) one, so SiliconFlow's thinking-mode validator never
|
|
37
37
|
* sees a reasoning-less assistant turn. Assistant turns that already carry a
|
|
38
38
|
* real `reasoning_content` are left untouched.
|
|
39
|
+
*
|
|
40
|
+
* `opts.onlyIfMixed` (used by Z.ai): skip the backfill entirely when NO
|
|
41
|
+
* assistant message in the history carries a `reasoning_content` field. This
|
|
42
|
+
* guards non-thinking models (glm-4.5-air, glm-4.6v-flash) from having an
|
|
43
|
+
* unknown `reasoning_content` field injected — which would itself trigger
|
|
44
|
+
* Z.ai's 1210. Once any one assistant turn carries reasoning (i.e. the
|
|
45
|
+
* conversation is in thinking mode — confirmed by the model's own emission),
|
|
46
|
+
* the backfill brings every other assistant turn up to the same shape.
|
|
39
47
|
*/
|
|
40
|
-
function backfillReasoningContent(messages) {
|
|
48
|
+
export function backfillReasoningContent(messages, opts = {}) {
|
|
49
|
+
if (opts.onlyIfMixed) {
|
|
50
|
+
const hasAnyReasoning = messages.some((m) => m?.role === "assistant" && typeof m.reasoning_content === "string");
|
|
51
|
+
if (!hasAnyReasoning)
|
|
52
|
+
return messages;
|
|
53
|
+
}
|
|
41
54
|
let mutated = false;
|
|
42
55
|
const next = messages.map((m) => {
|
|
43
56
|
if (m?.role !== "assistant")
|
|
@@ -63,6 +76,75 @@ function backfillReasoningContent(messages) {
|
|
|
63
76
|
});
|
|
64
77
|
return mutated ? next : messages;
|
|
65
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Split assistant messages that carry MORE THAN ONE `tool_calls` entry into a
|
|
81
|
+
* sequence of single-tool-call assistant turns, each immediately followed by
|
|
82
|
+
* its matching `role:"tool"` result. Identity (returns the same array by
|
|
83
|
+
* reference) when no assistant message has >1 tool_calls.
|
|
84
|
+
*
|
|
85
|
+
* WHY (verified from live sessions c0dcf9153803 / c1f5ca294496 and the
|
|
86
|
+
* llm-wire.log forensics on 2026-07-02): both the Z.ai GLM coding endpoint
|
|
87
|
+
* (HTTP 400 / code 1210 "Invalid API parameter") and the opencode Console Go
|
|
88
|
+
* proxy (HTTP 400 invalid_request_error "Upstream request failed") REJECT a
|
|
89
|
+
* follow-up request whose history contains an assistant turn that emitted a
|
|
90
|
+
* large batch of parallel tool_calls (observed 5, 6, 8, 12, and 17 in a single
|
|
91
|
+
* assistant message). Forcing `parallel_tool_calls:false` does NOT prevent
|
|
92
|
+
* this — the model ignores the flag and still emits batches, and the flag has
|
|
93
|
+
* no effect on assistant turns already in the history. The only reliable fix
|
|
94
|
+
* is to reshape the echoed-back history so no single assistant turn presents
|
|
95
|
+
* more than one tool_call.
|
|
96
|
+
*
|
|
97
|
+
* Safety: because this is a no-op unless an assistant turn has >1 tool_calls,
|
|
98
|
+
* it can only ever alter requests that match the known-failing pattern —
|
|
99
|
+
* requests that already succeed (≤1 tool_call per turn) are returned
|
|
100
|
+
* untouched.
|
|
101
|
+
*
|
|
102
|
+
* `reasoning_content` (when present) is kept on the FIRST split turn only and
|
|
103
|
+
* blanked to "" on the rest, so a single reasoning segment is not duplicated
|
|
104
|
+
* across the synthesized turns. Assistant `content` is likewise kept on the
|
|
105
|
+
* first and blanked on the rest.
|
|
106
|
+
*/
|
|
107
|
+
export function splitParallelToolCalls(messages) {
|
|
108
|
+
const needsSplit = messages.some((m) => m?.role === "assistant" && Array.isArray(m.tool_calls) && m.tool_calls.length > 1);
|
|
109
|
+
if (!needsSplit)
|
|
110
|
+
return messages;
|
|
111
|
+
const out = [];
|
|
112
|
+
for (let i = 0; i < messages.length; i++) {
|
|
113
|
+
const m = messages[i];
|
|
114
|
+
const toolCalls = m?.role === "assistant" && Array.isArray(m.tool_calls) ? m.tool_calls : null;
|
|
115
|
+
if (!toolCalls || toolCalls.length <= 1) {
|
|
116
|
+
out.push(m);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// Collect the contiguous block of role:"tool" results that follows this
|
|
120
|
+
// assistant turn, keyed by tool_call_id, so each split can carry its own.
|
|
121
|
+
const resultsById = new Map();
|
|
122
|
+
let j = i + 1;
|
|
123
|
+
while (j < messages.length && messages[j]?.role === "tool") {
|
|
124
|
+
const id = messages[j].tool_call_id;
|
|
125
|
+
if (typeof id === "string")
|
|
126
|
+
resultsById.set(id, messages[j]);
|
|
127
|
+
j++;
|
|
128
|
+
}
|
|
129
|
+
for (let k = 0; k < toolCalls.length; k++) {
|
|
130
|
+
const tc = toolCalls[k];
|
|
131
|
+
const single = { ...m, tool_calls: [tc] };
|
|
132
|
+
if (k > 0) {
|
|
133
|
+
// Avoid duplicating reasoning/content across the synthesized turns.
|
|
134
|
+
if (typeof m.reasoning_content === "string")
|
|
135
|
+
single.reasoning_content = "";
|
|
136
|
+
single.content = "";
|
|
137
|
+
}
|
|
138
|
+
out.push(single);
|
|
139
|
+
const res = typeof tc.id === "string" ? resultsById.get(tc.id) : undefined;
|
|
140
|
+
if (res)
|
|
141
|
+
out.push(res);
|
|
142
|
+
}
|
|
143
|
+
// Skip past the consumed tool-result block.
|
|
144
|
+
i = j - 1;
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
66
148
|
/**
|
|
67
149
|
* The shared `transformRequestBody` for deepseek + siliconflow. Runs on the
|
|
68
150
|
* fully-serialized wire body right before fetch.
|
|
@@ -83,4 +165,209 @@ export function transformThinkingModeBody(body) {
|
|
|
83
165
|
return body;
|
|
84
166
|
return { ...body, messages: patched };
|
|
85
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Should the Z.ai thinking-disable escape hatch fire? Off by default — Z.ai
|
|
170
|
+
* GLM coding-plan endpoints (`api.z.ai/api/coding/paas/v4`) auto-enable
|
|
171
|
+
* thinking for reasoning-capable models (glm-4.7, glm-5.x), and we want the
|
|
172
|
+
* reasoning_content round-trip to succeed. Set `MUONROI_ZAI_DISABLE_THINKING=1`
|
|
173
|
+
* to mirror DeepSeek's fallback B (disable thinking entirely).
|
|
174
|
+
*/
|
|
175
|
+
export function shouldDisableZaiThinking() {
|
|
176
|
+
const v = process.env.MUONROI_ZAI_DISABLE_THINKING;
|
|
177
|
+
if (v !== undefined && (v === "1" || v.toLowerCase() === "true"))
|
|
178
|
+
return true;
|
|
179
|
+
// One-shot runtime degrade: once a zai/opencode coding endpoint has rejected a
|
|
180
|
+
// request with a generic param error (1210 / "Upstream request failed"), we
|
|
181
|
+
// flip thinking OFF for the remainder of the session so the retry (and every
|
|
182
|
+
// subsequent call) sends the simpler, validator-safe shape. See
|
|
183
|
+
// markProviderThinkingDegrade / retry-classifier.ts.
|
|
184
|
+
return _thinkingDegraded;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Runtime "degrade" latch. Set once a z.ai / opencode-go coding endpoint
|
|
188
|
+
* rejects a request with a generic, spec-undocumented param error (code 1210
|
|
189
|
+
* "Invalid API parameter" / Console Go "Upstream request failed"). Because
|
|
190
|
+
* z.ai does NOT document the exact constraint (verified 2026-07-02 against
|
|
191
|
+
* docs.z.ai/api-reference/api-code — 1210 is an intentionally generic bucket),
|
|
192
|
+
* a fully preventive client fix is impossible. The pragmatic guard is: give the
|
|
193
|
+
* request exactly one retry with a degraded-but-valid body (thinking disabled →
|
|
194
|
+
* no reasoning_content round-trip requirement; parallel tool_calls already
|
|
195
|
+
* split). retry-classifier.ts drives the one-shot semantics.
|
|
196
|
+
*/
|
|
197
|
+
let _thinkingDegraded = false;
|
|
198
|
+
/** True once a provider param-reject has flipped the session into degraded mode. */
|
|
199
|
+
export function isProviderThinkingDegraded() {
|
|
200
|
+
return _thinkingDegraded;
|
|
201
|
+
}
|
|
202
|
+
/** Latch degraded mode on (idempotent). Called by the retry classifier. */
|
|
203
|
+
export function markProviderThinkingDegrade() {
|
|
204
|
+
_thinkingDegraded = true;
|
|
205
|
+
}
|
|
206
|
+
/** Test-only reset so the module latch doesn't leak across cases. */
|
|
207
|
+
export function _resetProviderThinkingDegrade() {
|
|
208
|
+
_thinkingDegraded = false;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Ensure every assistant `tool_calls[].function.arguments` is a valid JSON
|
|
212
|
+
* STRING. GLM's coding endpoint returns a generic 1210 with the underlying
|
|
213
|
+
* detail "error parsing parameters: unexpected end of JSON input" when an
|
|
214
|
+
* assistant turn echoes back a tool call whose `arguments` is empty, missing,
|
|
215
|
+
* or truncated (verified failure mode reported by crush #1237 and opencode
|
|
216
|
+
* users — a big parallel-tool-call batch clamped by max_tokens truncates the
|
|
217
|
+
* last call's arguments mid-string). Repairs are conservative: a value that
|
|
218
|
+
* already parses as JSON is left untouched; only empty/missing/unparseable
|
|
219
|
+
* arguments are replaced with `"{}"`, and a stray object is re-stringified.
|
|
220
|
+
* No-op (returns input by reference) when nothing needs repair.
|
|
221
|
+
*/
|
|
222
|
+
export function sanitizeToolCallArguments(messages) {
|
|
223
|
+
let mutated = false;
|
|
224
|
+
const next = messages.map((m) => {
|
|
225
|
+
if (m?.role !== "assistant")
|
|
226
|
+
return m;
|
|
227
|
+
const calls = m.tool_calls;
|
|
228
|
+
if (!Array.isArray(calls) || calls.length === 0)
|
|
229
|
+
return m;
|
|
230
|
+
let callsChanged = false;
|
|
231
|
+
const newCalls = calls.map((c) => {
|
|
232
|
+
const call = c;
|
|
233
|
+
const fn = call?.function;
|
|
234
|
+
if (!fn || typeof fn !== "object")
|
|
235
|
+
return c;
|
|
236
|
+
const args = fn.arguments;
|
|
237
|
+
let repaired;
|
|
238
|
+
if (typeof args === "string") {
|
|
239
|
+
const trimmed = args.trim();
|
|
240
|
+
if (trimmed === "") {
|
|
241
|
+
repaired = "{}";
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
try {
|
|
245
|
+
const parsed = JSON.parse(trimmed);
|
|
246
|
+
// Tool arguments MUST be a JSON object. grok-composer (and some other
|
|
247
|
+
// models) occasionally emit a bare string / number / array / null —
|
|
248
|
+
// valid JSON but the wrong shape — which xAI rejects with 400
|
|
249
|
+
// "expected JSON object for tool arguments" (a non-transient error
|
|
250
|
+
// that wedges the retry loop). Normalize any non-object to {}.
|
|
251
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
252
|
+
repaired = "{}";
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
repaired = "{}";
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else if (args === undefined || args === null) {
|
|
261
|
+
repaired = "{}";
|
|
262
|
+
}
|
|
263
|
+
else if (typeof args === "object") {
|
|
264
|
+
// Wire shape should be a string; re-stringify a stray object.
|
|
265
|
+
try {
|
|
266
|
+
repaired = JSON.stringify(args);
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
repaired = "{}";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (repaired === undefined)
|
|
273
|
+
return c;
|
|
274
|
+
callsChanged = true;
|
|
275
|
+
return { ...call, function: { ...fn, arguments: repaired } };
|
|
276
|
+
});
|
|
277
|
+
if (!callsChanged)
|
|
278
|
+
return m;
|
|
279
|
+
mutated = true;
|
|
280
|
+
return { ...m, tool_calls: newCalls };
|
|
281
|
+
});
|
|
282
|
+
return mutated ? next : messages;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Z.ai's `transformRequestBody`. Mirrors `transformThinkingModeBody` but with
|
|
286
|
+
* one critical difference: the reasoning_content backfill is GATED on
|
|
287
|
+
* `onlyIfMixed` — it only fires once at least one assistant message in the
|
|
288
|
+
* history already carries reasoning_content. This protects non-thinking Z.ai
|
|
289
|
+
* models (glm-4.5-air, glm-4.6v-flash) which would otherwise reject the
|
|
290
|
+
* injected field with HTTP 400 / code 1210.
|
|
291
|
+
*
|
|
292
|
+
* Verified failure: session c0dcf9153803 — GLM-4.7 on the Z.ai coding
|
|
293
|
+
* endpoint. First 4 assistant turns succeeded; on the 5th streamText call
|
|
294
|
+
* (after 6 tool rounds, where intermediate assistant steps carried tool_calls
|
|
295
|
+
* WITHOUT reasoning), Z.ai rejected the whole request with code 1210
|
|
296
|
+
* "Invalid API parameter". Same class of bug as SiliconFlow 20015 (see
|
|
297
|
+
* `transformThinkingModeBody` above), but Z.ai also hosts non-thinking models
|
|
298
|
+
* on the same strategy, so the backfill must stay conditional.
|
|
299
|
+
*
|
|
300
|
+
* H3 mitigation (added after c7c4a6487847 + 94827f75a69e + c94360bac00f + c1f5ca294496):
|
|
301
|
+
* GLM coding endpoint rejects the request (often as generic 1210) when the
|
|
302
|
+
* history contains assistant turns with multiple tool_calls (even after forcing
|
|
303
|
+
* parallel_tool_calls:false — model still emitted batches of 2-5). The reject
|
|
304
|
+
* frequently manifests as stall timeout because the provider stops emitting
|
|
305
|
+
* chunks. We do extra sanitization here:
|
|
306
|
+
* - force parallel_tool_calls:false
|
|
307
|
+
* - drop response_format when null/empty (combo with tools is fragile)
|
|
308
|
+
* - clamp max_tokens > 4096 down to 4096 (higher values seen in 1210s)
|
|
309
|
+
* Trade-off: more sequential tool use + slightly lower token budget.
|
|
310
|
+
*/
|
|
311
|
+
export function transformZaiThinkingBody(body) {
|
|
312
|
+
const out = { ...body };
|
|
313
|
+
if (shouldDisableZaiThinking()) {
|
|
314
|
+
out.thinking = { type: "disabled" };
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
const messages = body.messages;
|
|
318
|
+
if (Array.isArray(messages)) {
|
|
319
|
+
let patched = backfillReasoningContent(messages, { onlyIfMixed: true });
|
|
320
|
+
// Extra hardening inspired by opencode + observed Z.ai GLM behavior:
|
|
321
|
+
// Assistant messages that only contain tool_calls sometimes arrive with
|
|
322
|
+
// content: null. The coding endpoint can be strict about this shape
|
|
323
|
+
// when reasoning_content is also present.
|
|
324
|
+
patched = patched.map((m) => {
|
|
325
|
+
if (m?.role !== "assistant")
|
|
326
|
+
return m;
|
|
327
|
+
const mm = m;
|
|
328
|
+
const hasToolCalls = Array.isArray(mm.tool_calls) && mm.tool_calls.length > 0;
|
|
329
|
+
if (hasToolCalls && (mm.content === null || mm.content === undefined)) {
|
|
330
|
+
return { ...mm, content: "" };
|
|
331
|
+
}
|
|
332
|
+
return m;
|
|
333
|
+
});
|
|
334
|
+
// H3 REAL FIX (parallel_tool_calls:false proven ineffective — the model
|
|
335
|
+
// ignores it and still emits 8-17 tool_calls; the coding endpoint then
|
|
336
|
+
// 1210s on the echo-back). Split multi-tool-call assistant turns so no
|
|
337
|
+
// single assistant message ever presents >1 tool_call to Z.ai.
|
|
338
|
+
patched = splitParallelToolCalls(patched);
|
|
339
|
+
// Guard the "unexpected end of JSON input" 1210 sub-cause: ensure every
|
|
340
|
+
// echoed tool_call carries valid JSON arguments (empty/truncated → "{}").
|
|
341
|
+
patched = sanitizeToolCallArguments(patched);
|
|
342
|
+
if (patched !== messages) {
|
|
343
|
+
out.messages = patched;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// H3 mitigation (Z.ai coding 1210 on 8-17 parallel tool_calls, still seen
|
|
348
|
+
// with smaller batches in c1f5ca294496 even after the flag):
|
|
349
|
+
// Always force parallel_tool_calls:false. Kept as belt-and-suspenders even
|
|
350
|
+
// though the split above is the actual lever (the model ignores this flag).
|
|
351
|
+
out.parallel_tool_calls = false;
|
|
352
|
+
// Z.ai coding endpoint is known to return generic 1210 for certain param
|
|
353
|
+
// combinations when tools are present (observed across many sessions).
|
|
354
|
+
// - response_format (even when null) combined with tools has been implicated.
|
|
355
|
+
// - Higher max_tokens (e.g. 8192) appeared in failing requests.
|
|
356
|
+
// Clean these here so they never reach the wire for zai.
|
|
357
|
+
if ("response_format" in out) {
|
|
358
|
+
const rf = out.response_format;
|
|
359
|
+
if (rf == null || (typeof rf === "object" && Object.keys(rf).length === 0)) {
|
|
360
|
+
delete out.response_format;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (typeof out.max_tokens === "number" && out.max_tokens > 4096) {
|
|
364
|
+
out.max_tokens = 4096;
|
|
365
|
+
}
|
|
366
|
+
// Also normalize possible camelCase variant the SDK might emit
|
|
367
|
+
if ("parallelToolCalls" in out) {
|
|
368
|
+
out.parallel_tool_calls = out.parallelToolCalls;
|
|
369
|
+
delete out.parallelToolCalls;
|
|
370
|
+
}
|
|
371
|
+
return out;
|
|
372
|
+
}
|
|
86
373
|
//# sourceMappingURL=thinking-mode.js.map
|
|
@@ -7,6 +7,7 @@ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
|
7
7
|
import { getProviderCapabilities } from "../capabilities.js";
|
|
8
8
|
import { OPENAI_COMPATIBLE_BASE_URLS } from "../endpoints.js";
|
|
9
9
|
import { BaseProviderStrategy } from "./base.strategy.js";
|
|
10
|
+
import { sanitizeToolCallArguments, splitParallelToolCalls } from "./thinking-mode.js";
|
|
10
11
|
export class XAIStrategy extends BaseProviderStrategy {
|
|
11
12
|
id = "xai";
|
|
12
13
|
capabilities = getProviderCapabilities("xai");
|
|
@@ -22,6 +23,32 @@ export class XAIStrategy extends BaseProviderStrategy {
|
|
|
22
23
|
baseURL: opts.baseURL ?? OPENAI_COMPATIBLE_BASE_URLS.xai,
|
|
23
24
|
apiKey: opts.apiKey ?? (opts.headers ? "oauth" : undefined),
|
|
24
25
|
...(opts.headers ? { headers: opts.headers } : {}),
|
|
26
|
+
// grok-composer (Cursor Composer via xAI) emits BATCHES of parallel
|
|
27
|
+
// tool_calls per assistant turn, and some carry empty/truncated
|
|
28
|
+
// `arguments` strings. On the next multi-step request xAI rejects the
|
|
29
|
+
// replayed history with 400 `invalid-argument: expected JSON object for
|
|
30
|
+
// tool arguments` — a NON-transient error, so the bounded stream-retry
|
|
31
|
+
// re-sends the same malformed history and the turn wedges (observed live
|
|
32
|
+
// 2026-07-14, run mrkoeezk9a29: /ideal sprint impl made one tool-call
|
|
33
|
+
// response then never progressed, 0 files, across every path). Mirror the
|
|
34
|
+
// opencode-go/zai fix: split multi-tool-call assistant turns into
|
|
35
|
+
// sequential single-call turns and repair empty/truncated tool arguments
|
|
36
|
+
// to `{}` before they reach the upstream. Both helpers are no-ops unless
|
|
37
|
+
// the failing pattern is present, so healthy requests are untouched.
|
|
38
|
+
transformRequestBody: (body) => {
|
|
39
|
+
const out = { ...body };
|
|
40
|
+
if (Array.isArray(out.messages)) {
|
|
41
|
+
out.messages = splitParallelToolCalls(out.messages);
|
|
42
|
+
out.messages = sanitizeToolCallArguments(out.messages);
|
|
43
|
+
}
|
|
44
|
+
if ("response_format" in out) {
|
|
45
|
+
const rf = out.response_format;
|
|
46
|
+
if (rf == null || (typeof rf === "object" && Object.keys(rf).length === 0)) {
|
|
47
|
+
delete out.response_format;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
},
|
|
25
52
|
});
|
|
26
53
|
return (modelId) => p(modelId);
|
|
27
54
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/providers/strategies/zai.strategy.ts
|
|
3
|
+
*
|
|
4
|
+
* Z.ai strategy via `@ai-sdk/openai-compatible`.
|
|
5
|
+
*/
|
|
6
|
+
import { type ProviderCapabilities } from "../capabilities.js";
|
|
7
|
+
import type { ProviderFactory } from "../runtime.js";
|
|
8
|
+
import type { ProviderId } from "../types.js";
|
|
9
|
+
import { BaseProviderStrategy, type CreateFactoryOpts } from "./base.strategy.js";
|
|
10
|
+
export declare class ZaiStrategy extends BaseProviderStrategy {
|
|
11
|
+
readonly id: ProviderId;
|
|
12
|
+
readonly capabilities: ProviderCapabilities;
|
|
13
|
+
createFactory(opts: CreateFactoryOpts): ProviderFactory;
|
|
14
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/providers/strategies/zai.strategy.ts
|
|
3
|
+
*
|
|
4
|
+
* Z.ai 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 { transformZaiThinkingBody } from "./thinking-mode.js";
|
|
11
|
+
export class ZaiStrategy extends BaseProviderStrategy {
|
|
12
|
+
id = "zai";
|
|
13
|
+
capabilities = getProviderCapabilities("zai");
|
|
14
|
+
createFactory(opts) {
|
|
15
|
+
const p = createOpenAICompatible({
|
|
16
|
+
name: this.id,
|
|
17
|
+
baseURL: opts.baseURL ?? OPENAI_COMPATIBLE_BASE_URLS.zai,
|
|
18
|
+
apiKey: opts.apiKey ?? (opts.headers ? "oauth" : undefined),
|
|
19
|
+
...(opts.headers ? { headers: opts.headers } : {}),
|
|
20
|
+
// Many Z.ai users (especially Coding Plan) hit 1210 / empty responses
|
|
21
|
+
// when using the wrong baseURL or when the SDK sends extra fields.
|
|
22
|
+
// Default is the coding/paas/v4 endpoint (matching opencode recommendations).
|
|
23
|
+
// Users can override via --base-url or provider config for the standard paas.
|
|
24
|
+
// Z.ai coding endpoint (api.z.ai/api/coding/paas/v4) auto-enables
|
|
25
|
+
// thinking for GLM-4.7 / GLM-5.x. In a multi-step tool loop some
|
|
26
|
+
// intermediate assistant turns carry tool_calls WITHOUT reasoning, so
|
|
27
|
+
// @ai-sdk/openai-compatible serializes them without a reasoning_content
|
|
28
|
+
// key → Z.ai rejects the whole request with HTTP 400 / code 1210
|
|
29
|
+
// "Invalid API parameter".
|
|
30
|
+
//
|
|
31
|
+
// We follow patterns seen in other mature clients (e.g. opencode) for
|
|
32
|
+
// robust GLM coding plan usage:
|
|
33
|
+
// - Conditional reasoning_content backfill (onlyIfMixed)
|
|
34
|
+
// - Force parallel_tool_calls: false (model still sometimes batches 2-5)
|
|
35
|
+
// - Drop null response_format (fragile with tools)
|
|
36
|
+
// - Clamp max_tokens, normalize tool-only assistant content shape
|
|
37
|
+
//
|
|
38
|
+
// See transformZaiThinkingBody for the full sanitization.
|
|
39
|
+
transformRequestBody: (body) => transformZaiThinkingBody(body),
|
|
40
|
+
});
|
|
41
|
+
return (modelId) => p(modelId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=zai.strategy.js.map
|
|
@@ -59,10 +59,9 @@ export interface ProviderRequest {
|
|
|
59
59
|
export type ProviderStream = AsyncGenerator<StreamChunk, void, unknown>;
|
|
60
60
|
/**
|
|
61
61
|
* Supported provider identifiers.
|
|
62
|
-
* '
|
|
63
|
-
* share the OpenAI-compatible adapter with different baseURLs.
|
|
62
|
+
* 'deepseek' shares the OpenAI-compatible adapter with a custom baseURL.
|
|
64
63
|
*/
|
|
65
|
-
export type ProviderId = "anthropic" | "openai" | "
|
|
64
|
+
export type ProviderId = "anthropic" | "openai" | "deepseek" | "xai" | "ollama" | "zai" | "opencode-go";
|
|
66
65
|
/**
|
|
67
66
|
* Single source of truth for the canonical ordering of all provider IDs.
|
|
68
67
|
* Phase 12.2-G5: every site that needs to iterate providers (config screens,
|
|
@@ -70,7 +69,7 @@ export type ProviderId = "anthropic" | "openai" | "google" | "deepseek" | "silic
|
|
|
70
69
|
* this constant instead of duplicating the literal array. Filter/slice
|
|
71
70
|
* variations are allowed (e.g. `ALL_PROVIDER_IDS.filter(p => p !== "xai")`).
|
|
72
71
|
*/
|
|
73
|
-
export declare const ALL_PROVIDER_IDS: readonly ["anthropic", "openai", "
|
|
72
|
+
export declare const ALL_PROVIDER_IDS: readonly ["anthropic", "openai", "deepseek", "xai", "ollama", "zai", "opencode-go"];
|
|
74
73
|
/** Convenience iterator over the canonical provider list. */
|
|
75
74
|
export declare function iterProviders(): readonly ProviderId[];
|
|
76
75
|
/**
|
|
@@ -79,7 +78,7 @@ export declare function iterProviders(): readonly ProviderId[];
|
|
|
79
78
|
export interface ProviderConfig {
|
|
80
79
|
/** BYOK API key. Ollama may be keyless; defaults to env OLLAMA_API_KEY when present. */
|
|
81
80
|
apiKey?: string;
|
|
82
|
-
/** Base URL override for OpenAI-compatible providers (deepseek
|
|
81
|
+
/** Base URL override for OpenAI-compatible providers (deepseek) + ollama VPS. */
|
|
83
82
|
baseURL?: string;
|
|
84
83
|
/** AI model identifier, e.g. "claude-3-5-haiku-latest". */
|
|
85
84
|
model: string;
|
|
@@ -91,7 +90,7 @@ export interface ProviderConfig {
|
|
|
91
90
|
*
|
|
92
91
|
* Adding OAuth for a new provider:
|
|
93
92
|
* 1. Add an entry to `providers/auth/registry.ts` (login flow + token store).
|
|
94
|
-
* 2. Ensure that provider's adapter honors `oauthHeaders` (see openai.ts/anthropic.ts
|
|
93
|
+
* 2. Ensure that provider's adapter honors `oauthHeaders` (see openai.ts/anthropic.ts).
|
|
95
94
|
* 3. Done — `createAdapterAsync` dispatches via the registry; no other code edits required.
|
|
96
95
|
*/
|
|
97
96
|
oauthHeaders?: Record<string, string>;
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
export const ALL_PROVIDER_IDS = [
|
|
19
19
|
"anthropic",
|
|
20
20
|
"openai",
|
|
21
|
-
"google",
|
|
22
21
|
"deepseek",
|
|
23
|
-
"siliconflow",
|
|
24
22
|
"xai",
|
|
25
23
|
"ollama",
|
|
24
|
+
"zai",
|
|
25
|
+
"opencode-go",
|
|
26
26
|
];
|
|
27
27
|
/** Convenience iterator over the canonical provider list. */
|
|
28
28
|
export function iterProviders() {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog-driven vision proxy backend — replaces hardcoded SiliconFlow Qwen VL.
|
|
3
|
+
* Used by vision-proxy.ts (message path) and mcp-vision-bridge.ts (tool path).
|
|
4
|
+
*/
|
|
5
|
+
import type { CatalogVisionProxySlot } from "../models/catalog-client.js";
|
|
6
|
+
import type { ProviderId } from "./types.js";
|
|
7
|
+
export type VisionTaskKind = "default" | "ocr" | "design";
|
|
8
|
+
export declare function looksLikeOcrIntent(text: string): boolean;
|
|
9
|
+
export declare function resolveVisionChain(kind: VisionTaskKind): CatalogVisionProxySlot[];
|
|
10
|
+
/** Vision-proxy chain filtered to providers that currently have API keys. */
|
|
11
|
+
export declare function resolveAvailableVisionChain(kind?: VisionTaskKind): Promise<CatalogVisionProxySlot[]>;
|
|
12
|
+
export declare function isVisionBackendAvailable(kind?: VisionTaskKind): Promise<boolean>;
|
|
13
|
+
export interface NativeVisionFallback {
|
|
14
|
+
modelId: string;
|
|
15
|
+
provider: ProviderId;
|
|
16
|
+
source: "vision_proxy_slot" | "catalog_vision";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* When vision-proxy backends have no keys, pick a catalog vision model (with key)
|
|
20
|
+
* so images can be sent natively instead of failing on a text-only primary.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findNativeVisionFallback(opts?: {
|
|
23
|
+
excludeModelId?: string;
|
|
24
|
+
}): Promise<NativeVisionFallback | null>;
|
|
25
|
+
export declare function collectVisionUnavailableReasons(kind?: VisionTaskKind): Promise<string[]>;
|
|
26
|
+
export type VisionCallResult = {
|
|
27
|
+
ok: true;
|
|
28
|
+
text: string;
|
|
29
|
+
model: string;
|
|
30
|
+
provider: string;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
reason: string;
|
|
34
|
+
};
|
|
35
|
+
export declare function callVisionBackend(chain: CatalogVisionProxySlot[], content: Array<Record<string, unknown>>, signal?: AbortSignal, responseFormat?: {
|
|
36
|
+
type: "json_object";
|
|
37
|
+
}): Promise<VisionCallResult>;
|
|
38
|
+
/** Ask the vision model to write as direct sight for the primary (text-only) agent. */
|
|
39
|
+
export declare function wrapAnalyzerInstructions(userPrompt: string, kind: VisionTaskKind): string;
|
|
40
|
+
/**
|
|
41
|
+
* Envelope injected into text-only model context — reads as native vision, not third-party analysis.
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatNativeVisionObservation(observation: string, opts: {
|
|
44
|
+
imageCount: number;
|
|
45
|
+
cachedIds?: string[];
|
|
46
|
+
}): string;
|
|
47
|
+
export declare function formatNativeVisionUnavailable(imageCount: number, reasons: string[], cachedIds?: string[]): string;
|