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
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/providers/siliconflow-sse-repair.ts
|
|
3
|
-
*
|
|
4
|
-
* SiliconFlow streaming returns OpenAI-compatible SSE, but on Qwen3-30B
|
|
5
|
-
* tool-calling turns the FIRST `tool_calls` delta for a given index can
|
|
6
|
-
* arrive without `id` and/or `function.name` — those fields are pushed
|
|
7
|
-
* into a later chunk while the first chunk carries partial arguments.
|
|
8
|
-
*
|
|
9
|
-
* `@ai-sdk/openai-compatible@2.0.42` throws
|
|
10
|
-
* `InvalidResponseDataError("Expected 'id' to be a string.")` at
|
|
11
|
-
* `openai-compatible-chat-language-model.ts:537-541` the moment that
|
|
12
|
-
* first malformed delta lands. The user-visible failure: session
|
|
13
|
-
* 44db9105b119 (2026-05-26) crashed mid-stream right after the first
|
|
14
|
-
* grep tool call returned, with no recoverable state.
|
|
15
|
-
*
|
|
16
|
-
* Evidence chain:
|
|
17
|
-
* - DB row `routing|Qwen/Qwen3-30B-A3B-Instruct-2507` ts=12:30:33
|
|
18
|
-
* - DB row `tool_result|grep` ts=12:31:05.753 (last persisted event)
|
|
19
|
-
* - TUI scrollback shows `Expected 'id' to be a string.` ts=12:31:10
|
|
20
|
-
* - AI SDK source at the cited line confirms this is the ONLY path
|
|
21
|
-
* to that exact error message
|
|
22
|
-
*
|
|
23
|
-
* The fix is a `fetch` interceptor for SiliconFlow streaming responses:
|
|
24
|
-
*
|
|
25
|
-
* 1. Per index, buffer (id, name, args) until BOTH id+name are seen.
|
|
26
|
-
* 2. The moment both arrive, emit ONE synthesized "first chunk" with
|
|
27
|
-
* the accumulated arguments string.
|
|
28
|
-
* 3. After that, every subsequent delta for that index passes through
|
|
29
|
-
* unmodified.
|
|
30
|
-
*
|
|
31
|
-
* Well-formed streams (id+name on the first chunk) hit only the
|
|
32
|
-
* pass-through path — the repairer is a no-op for them.
|
|
33
|
-
*
|
|
34
|
-
* Tests in `__tests__/siliconflow-sse-repair.test.ts` pin both the
|
|
35
|
-
* malformed and well-formed cases, plus non-SSE pass-through, [DONE]
|
|
36
|
-
* sentinel, and multi-index streams.
|
|
37
|
-
*/
|
|
38
|
-
export class SiliconflowSseRepairer {
|
|
39
|
-
states = new Map();
|
|
40
|
-
/**
|
|
41
|
-
* Process one SSE event. Returns the repaired event text (possibly
|
|
42
|
-
* empty string to suppress the event entirely).
|
|
43
|
-
*
|
|
44
|
-
* The event text MUST include the trailing blank-line terminator
|
|
45
|
-
* (`\n\n` or `\r\n\r\n`); the caller is responsible for splitting on
|
|
46
|
-
* event boundaries.
|
|
47
|
-
*/
|
|
48
|
-
repairEvent(eventText) {
|
|
49
|
-
const dataMatch = eventText.match(/^data: (.+?)(\r?\n|$)/m);
|
|
50
|
-
if (!dataMatch)
|
|
51
|
-
return eventText;
|
|
52
|
-
const dataPayload = dataMatch[1] ?? "";
|
|
53
|
-
if (dataPayload === "[DONE]" || dataPayload.trim() === "")
|
|
54
|
-
return eventText;
|
|
55
|
-
let obj;
|
|
56
|
-
try {
|
|
57
|
-
obj = JSON.parse(dataPayload);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return eventText;
|
|
61
|
-
}
|
|
62
|
-
const choice = obj?.choices?.[0];
|
|
63
|
-
const delta = choice?.delta;
|
|
64
|
-
if (!delta || typeof delta !== "object")
|
|
65
|
-
return eventText;
|
|
66
|
-
const rawToolCalls = delta.tool_calls;
|
|
67
|
-
if (!Array.isArray(rawToolCalls) || rawToolCalls.length === 0)
|
|
68
|
-
return eventText;
|
|
69
|
-
const tcs = rawToolCalls;
|
|
70
|
-
const outTcs = [];
|
|
71
|
-
for (const tc of tcs) {
|
|
72
|
-
const idx = typeof tc.index === "number" ? tc.index : 0;
|
|
73
|
-
let st = this.states.get(idx);
|
|
74
|
-
if (!st) {
|
|
75
|
-
st = { index: idx, args: "", flushed: false };
|
|
76
|
-
this.states.set(idx, st);
|
|
77
|
-
}
|
|
78
|
-
if (st.flushed) {
|
|
79
|
-
outTcs.push(tc);
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
if (typeof tc.id === "string" && tc.id.length > 0)
|
|
83
|
-
st.id = tc.id;
|
|
84
|
-
if (typeof tc.function?.name === "string" && tc.function.name.length > 0)
|
|
85
|
-
st.name = tc.function.name;
|
|
86
|
-
if (typeof tc.type === "string" && tc.type.length > 0)
|
|
87
|
-
st.type = tc.type;
|
|
88
|
-
if (typeof tc.function?.arguments === "string")
|
|
89
|
-
st.args += tc.function.arguments;
|
|
90
|
-
if (st.id != null && st.name != null) {
|
|
91
|
-
outTcs.push({
|
|
92
|
-
index: idx,
|
|
93
|
-
id: st.id,
|
|
94
|
-
type: st.type ?? "function",
|
|
95
|
-
function: {
|
|
96
|
-
name: st.name,
|
|
97
|
-
arguments: st.args,
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
st.flushed = true;
|
|
101
|
-
st.args = "";
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const hasOtherContent = delta.content != null ||
|
|
105
|
-
delta.reasoning_content != null ||
|
|
106
|
-
choice?.finish_reason != null;
|
|
107
|
-
if (outTcs.length === 0 && !hasOtherContent)
|
|
108
|
-
return "";
|
|
109
|
-
if (outTcs.length === 0) {
|
|
110
|
-
delete delta.tool_calls;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
delta.tool_calls = outTcs;
|
|
114
|
-
}
|
|
115
|
-
const newPayload = JSON.stringify(obj);
|
|
116
|
-
return eventText.replace(/^data: .+?(\r?\n|$)/m, `data: ${newPayload}$1`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Wrap a `fetch` implementation so SiliconFlow SSE responses are
|
|
121
|
-
* repaired before reaching `@ai-sdk/openai-compatible`. Non-SSE
|
|
122
|
-
* responses are passed through untouched.
|
|
123
|
-
*/
|
|
124
|
-
export function createSiliconflowRepairFetch(base = fetch) {
|
|
125
|
-
return async function repairFetch(input, init) {
|
|
126
|
-
const res = await base(input, init);
|
|
127
|
-
if (!res.body)
|
|
128
|
-
return res;
|
|
129
|
-
const ct = (res.headers.get("content-type") ?? "").toLowerCase();
|
|
130
|
-
if (!ct.includes("text/event-stream"))
|
|
131
|
-
return res;
|
|
132
|
-
const repairer = new SiliconflowSseRepairer();
|
|
133
|
-
const decoder = new TextDecoder();
|
|
134
|
-
const encoder = new TextEncoder();
|
|
135
|
-
let buf = "";
|
|
136
|
-
const repaired = new ReadableStream({
|
|
137
|
-
async start(controller) {
|
|
138
|
-
const reader = res.body.getReader();
|
|
139
|
-
try {
|
|
140
|
-
for (;;) {
|
|
141
|
-
const { done, value } = await reader.read();
|
|
142
|
-
if (done) {
|
|
143
|
-
if (buf.length > 0)
|
|
144
|
-
controller.enqueue(encoder.encode(buf));
|
|
145
|
-
controller.close();
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
buf += decoder.decode(value, { stream: true });
|
|
149
|
-
for (;;) {
|
|
150
|
-
const crlf = buf.indexOf("\r\n\r\n");
|
|
151
|
-
const lf = buf.indexOf("\n\n");
|
|
152
|
-
const idx = crlf === -1 ? lf : lf === -1 ? crlf : Math.min(crlf, lf);
|
|
153
|
-
if (idx === -1)
|
|
154
|
-
break;
|
|
155
|
-
const sepLen = idx === crlf ? 4 : 2;
|
|
156
|
-
const event = buf.slice(0, idx + sepLen);
|
|
157
|
-
buf = buf.slice(idx + sepLen);
|
|
158
|
-
const out = repairer.repairEvent(event);
|
|
159
|
-
if (out.length > 0)
|
|
160
|
-
controller.enqueue(encoder.encode(out));
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
catch (err) {
|
|
165
|
-
controller.error(err);
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
return new Response(repaired, {
|
|
170
|
-
status: res.status,
|
|
171
|
-
statusText: res.statusText,
|
|
172
|
-
headers: res.headers,
|
|
173
|
-
});
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
export const _internals = { SiliconflowSseRepairer };
|
|
177
|
-
//# sourceMappingURL=siliconflow-sse-repair.js.map
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/providers/strategies/google.strategy.ts
|
|
3
|
-
*
|
|
4
|
-
* Google strategy (powered by Agy OAuth when using "google" provider without API key).
|
|
5
|
-
*
|
|
6
|
-
* Approach A: When OAuth Bearer headers are present, uses a custom fetch-based
|
|
7
|
-
* provider that sends `Authorization: Bearer <token>` directly to the Gemini
|
|
8
|
-
* API, bypassing @ai-sdk/google's apiKey-based auth.
|
|
9
|
-
*
|
|
10
|
-
* Approach C: Supports self-registered OAuth client via env vars
|
|
11
|
-
* (MUONROI_GOOGLE_CLIENT_ID / MUONROI_GOOGLE_CLIENT_SECRET) or user settings
|
|
12
|
-
* (providers.google.oauthClientId / oauthClientSecret).
|
|
13
|
-
*/
|
|
14
|
-
import { type ProviderCapabilities } from "../capabilities.js";
|
|
15
|
-
import type { ProviderFactory } from "../runtime.js";
|
|
16
|
-
import type { ProviderId } from "../types.js";
|
|
17
|
-
import { BaseProviderStrategy, type CreateFactoryOpts } from "./base.strategy.js";
|
|
18
|
-
export declare class GoogleStrategy extends BaseProviderStrategy {
|
|
19
|
-
readonly id: ProviderId;
|
|
20
|
-
readonly capabilities: ProviderCapabilities;
|
|
21
|
-
createFactory(opts: CreateFactoryOpts): ProviderFactory;
|
|
22
|
-
}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/providers/strategies/google.strategy.ts
|
|
3
|
-
*
|
|
4
|
-
* Google strategy (powered by Agy OAuth when using "google" provider without API key).
|
|
5
|
-
*
|
|
6
|
-
* Approach A: When OAuth Bearer headers are present, uses a custom fetch-based
|
|
7
|
-
* provider that sends `Authorization: Bearer <token>` directly to the Gemini
|
|
8
|
-
* API, bypassing @ai-sdk/google's apiKey-based auth.
|
|
9
|
-
*
|
|
10
|
-
* Approach C: Supports self-registered OAuth client via env vars
|
|
11
|
-
* (MUONROI_GOOGLE_CLIENT_ID / MUONROI_GOOGLE_CLIENT_SECRET) or user settings
|
|
12
|
-
* (providers.google.oauthClientId / oauthClientSecret).
|
|
13
|
-
*/
|
|
14
|
-
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
15
|
-
import { getProviderCapabilities } from "../capabilities.js";
|
|
16
|
-
import { BaseProviderStrategy } from "./base.strategy.js";
|
|
17
|
-
function createBearerTokenModel(baseURL, headers) {
|
|
18
|
-
// Remove any trailing slash from baseURL for consistent path building
|
|
19
|
-
const apiBase = baseURL.replace(/\/+$/, "");
|
|
20
|
-
return (modelId) => {
|
|
21
|
-
// Return a minimal LanguageModelV1-compatible object that streamText can use.
|
|
22
|
-
// We implement the subset of the interface that streamText actually calls.
|
|
23
|
-
return {
|
|
24
|
-
specificationVersion: "v1",
|
|
25
|
-
provider: "google",
|
|
26
|
-
modelId,
|
|
27
|
-
async doGenerate(options) {
|
|
28
|
-
const url = `${apiBase}/models/${modelId}:generateContent`;
|
|
29
|
-
const requestBody = {
|
|
30
|
-
contents: [{ parts: [{ text: options.prompt }] }],
|
|
31
|
-
};
|
|
32
|
-
if (options.maxTokens)
|
|
33
|
-
requestBody.generationConfig = {
|
|
34
|
-
...requestBody.generationConfig,
|
|
35
|
-
maxOutputTokens: options.maxTokens,
|
|
36
|
-
};
|
|
37
|
-
if (options.temperature !== undefined)
|
|
38
|
-
requestBody.generationConfig = {
|
|
39
|
-
...requestBody.generationConfig,
|
|
40
|
-
temperature: options.temperature,
|
|
41
|
-
};
|
|
42
|
-
if (options.tools && options.tools.length > 0) {
|
|
43
|
-
requestBody.tools = options.tools.map((t) => ({
|
|
44
|
-
functionDeclarations: [
|
|
45
|
-
{
|
|
46
|
-
name: t.name ?? "unknown",
|
|
47
|
-
description: t.description ?? "",
|
|
48
|
-
parameters: t.parameters ?? {},
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
const res = await fetch(url, {
|
|
54
|
-
method: "POST",
|
|
55
|
-
headers: {
|
|
56
|
-
"Content-Type": "application/json",
|
|
57
|
-
...headers,
|
|
58
|
-
},
|
|
59
|
-
body: JSON.stringify(requestBody),
|
|
60
|
-
});
|
|
61
|
-
if (!res.ok) {
|
|
62
|
-
const text = await res.text().catch(() => "");
|
|
63
|
-
throw new Error(`Gemini API error (${res.status}): ${text}`);
|
|
64
|
-
}
|
|
65
|
-
const data = (await res.json());
|
|
66
|
-
const candidate = data.candidates?.[0];
|
|
67
|
-
const text = candidate?.content?.parts?.map((p) => p.text ?? "").join("") ?? "";
|
|
68
|
-
return {
|
|
69
|
-
text,
|
|
70
|
-
finishReason: candidate?.finishReason?.toLowerCase() ?? "stop",
|
|
71
|
-
usage: { promptTokens: 0, completionTokens: 0 },
|
|
72
|
-
};
|
|
73
|
-
},
|
|
74
|
-
async doStream(options) {
|
|
75
|
-
const url = `${apiBase}/models/${modelId}:streamGenerateContent`;
|
|
76
|
-
const requestBody = {
|
|
77
|
-
contents: [{ parts: [{ text: options.prompt }] }],
|
|
78
|
-
};
|
|
79
|
-
if (options.maxTokens)
|
|
80
|
-
requestBody.generationConfig = {
|
|
81
|
-
...requestBody.generationConfig,
|
|
82
|
-
maxOutputTokens: options.maxTokens,
|
|
83
|
-
};
|
|
84
|
-
if (options.temperature !== undefined)
|
|
85
|
-
requestBody.generationConfig = {
|
|
86
|
-
...requestBody.generationConfig,
|
|
87
|
-
temperature: options.temperature,
|
|
88
|
-
};
|
|
89
|
-
const res = await fetch(url, {
|
|
90
|
-
method: "POST",
|
|
91
|
-
headers: {
|
|
92
|
-
"Content-Type": "application/json",
|
|
93
|
-
...headers,
|
|
94
|
-
},
|
|
95
|
-
body: JSON.stringify(requestBody),
|
|
96
|
-
});
|
|
97
|
-
if (!res.ok) {
|
|
98
|
-
const text = await res.text().catch(() => "");
|
|
99
|
-
throw new Error(`Gemini API error (${res.status}): ${text}`);
|
|
100
|
-
}
|
|
101
|
-
const reader = res.body?.getReader();
|
|
102
|
-
if (!reader)
|
|
103
|
-
throw new Error("No response body");
|
|
104
|
-
const decoder = new TextDecoder();
|
|
105
|
-
let buffer = "";
|
|
106
|
-
return {
|
|
107
|
-
stream: new ReadableStream({
|
|
108
|
-
async start(controller) {
|
|
109
|
-
try {
|
|
110
|
-
while (true) {
|
|
111
|
-
const { done, value } = await reader.read();
|
|
112
|
-
if (done)
|
|
113
|
-
break;
|
|
114
|
-
buffer += decoder.decode(value, { stream: true });
|
|
115
|
-
// Parse SSE-like lines: "data: {...}\n\n"
|
|
116
|
-
const lines = buffer.split("\n");
|
|
117
|
-
buffer = lines.pop() ?? "";
|
|
118
|
-
for (const line of lines) {
|
|
119
|
-
const trimmed = line.trim();
|
|
120
|
-
if (!trimmed || trimmed.startsWith("data: ")) {
|
|
121
|
-
const jsonStr = trimmed.startsWith("data: ") ? trimmed.slice(6) : trimmed;
|
|
122
|
-
if (!jsonStr)
|
|
123
|
-
continue;
|
|
124
|
-
try {
|
|
125
|
-
const parsed = JSON.parse(jsonStr);
|
|
126
|
-
const candidate = parsed.candidates?.[0];
|
|
127
|
-
const text = candidate?.content?.parts?.map((p) => p.text ?? "").join("") ?? "";
|
|
128
|
-
if (text) {
|
|
129
|
-
controller.enqueue({ type: "text-delta", textDelta: text });
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// skip unparseable chunks
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
catch (e) {
|
|
140
|
-
controller.error(e);
|
|
141
|
-
}
|
|
142
|
-
finally {
|
|
143
|
-
controller.close();
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
}),
|
|
147
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
148
|
-
rawCall: async () => ({ rawResponse: undefined }),
|
|
149
|
-
};
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
// ---------------------------------------------------------------------------
|
|
155
|
-
// GoogleStrategy
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
export class GoogleStrategy extends BaseProviderStrategy {
|
|
158
|
-
id = "google";
|
|
159
|
-
capabilities = getProviderCapabilities("google");
|
|
160
|
-
createFactory(opts) {
|
|
161
|
-
// Approach A: When OAuth Bearer headers are present, use the custom
|
|
162
|
-
// fetch-based provider that sends ONLY the Authorization header (no
|
|
163
|
-
// apiKey / X-Goog-Api-Key). This works with gcloud ADC tokens (Approach B)
|
|
164
|
-
// and self-registered OAuth tokens (Approach C).
|
|
165
|
-
if (opts.headers) {
|
|
166
|
-
const bearerModelFn = createBearerTokenModel(opts.baseURL ?? "https://generativelanguage.googleapis.com/v1beta", opts.headers);
|
|
167
|
-
return (modelId) => bearerModelFn(modelId);
|
|
168
|
-
}
|
|
169
|
-
// Standard API-key path: delegate to @ai-sdk/google.
|
|
170
|
-
const p = createGoogleGenerativeAI({ apiKey: opts.apiKey, baseURL: opts.baseURL });
|
|
171
|
-
return (modelId) => p(modelId);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=google.strategy.js.map
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/providers/strategies/siliconflow.strategy.ts
|
|
3
|
-
*
|
|
4
|
-
* Phase 12.2-G4 — SiliconFlow 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 { createSiliconflowRepairFetch } from "../siliconflow-sse-repair.js";
|
|
10
|
-
import { BaseProviderStrategy } from "./base.strategy.js";
|
|
11
|
-
import { transformThinkingModeBody } from "./thinking-mode.js";
|
|
12
|
-
export class SiliconflowStrategy extends BaseProviderStrategy {
|
|
13
|
-
id = "siliconflow";
|
|
14
|
-
capabilities = getProviderCapabilities("siliconflow");
|
|
15
|
-
createFactory(opts) {
|
|
16
|
-
const p = createOpenAICompatible({
|
|
17
|
-
name: this.id,
|
|
18
|
-
baseURL: opts.baseURL ?? OPENAI_COMPATIBLE_BASE_URLS.siliconflow,
|
|
19
|
-
apiKey: opts.apiKey,
|
|
20
|
-
fetch: createSiliconflowRepairFetch(),
|
|
21
|
-
// Thinking-mode round-trip fix (code 20015): backfill reasoning_content
|
|
22
|
-
// on every assistant turn, or disable thinking when
|
|
23
|
-
// MUONROI_DEEPSEEK_DISABLE_THINKING=1. See thinking-mode.ts.
|
|
24
|
-
transformRequestBody: (body) => transformThinkingModeBody(body),
|
|
25
|
-
});
|
|
26
|
-
return (modelId) => p(modelId);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=siliconflow.strategy.js.map
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
export interface ChatFeedProps {
|
|
3
|
-
getSide: any;
|
|
4
|
-
getPartnerLast: any;
|
|
5
|
-
resolveStyle: any;
|
|
6
|
-
scrollRef: any;
|
|
7
|
-
messages: any;
|
|
8
|
-
expandedMessages: any;
|
|
9
|
-
liveTurnSourceLabel: any;
|
|
10
|
-
activeToolCalls: any;
|
|
11
|
-
streamContent: any;
|
|
12
|
-
isProcessing: any;
|
|
13
|
-
activeSubagent: any;
|
|
14
|
-
councilPhases: any;
|
|
15
|
-
productStatus: any;
|
|
16
|
-
councilStatuses: any;
|
|
17
|
-
councilInfoCards: any;
|
|
18
|
-
councilMessages: any;
|
|
19
|
-
councilPlaceholders: any;
|
|
20
|
-
reasoningActive: any;
|
|
21
|
-
lastReasoningElapsedMs: any;
|
|
22
|
-
streamReasoning: any;
|
|
23
|
-
showPlanPanel: any;
|
|
24
|
-
planQuestions: any;
|
|
25
|
-
pqs: any;
|
|
26
|
-
pendingPaymentApproval: any;
|
|
27
|
-
activeHaltCard: any;
|
|
28
|
-
haltSelectedIndex: any;
|
|
29
|
-
initNewForm: any;
|
|
30
|
-
pointToExistingForm: any;
|
|
31
|
-
councilProgress: any;
|
|
32
|
-
pendingCouncilQuestion: any;
|
|
33
|
-
councilCardState: any;
|
|
34
|
-
pendingCouncilPreflight: any;
|
|
35
|
-
preflightCardState: any;
|
|
36
|
-
t: any;
|
|
37
|
-
width: any;
|
|
38
|
-
modeInfo: any;
|
|
39
|
-
}
|
|
40
|
-
export declare function ChatFeed(props: ChatFeedProps): React.ReactNode;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
-
import { Semantic } from "@muonroi/agent-harness-opentui";
|
|
3
|
-
import { ProductStatusCard } from "../cards/product-status-card.js";
|
|
4
|
-
import { makePairKey } from "../components/bubble-layout.js";
|
|
5
|
-
import { CouncilInfoCardView } from "../components/council-info-card.js";
|
|
6
|
-
import { CouncilLeaderBubble } from "../components/council-leader-bubble.js";
|
|
7
|
-
import { CouncilMessageBubble } from "../components/council-message-bubble.js";
|
|
8
|
-
import { CouncilPhaseTimeline } from "../components/council-phase-timeline.js";
|
|
9
|
-
import { CouncilPlaceholderBubble } from "../components/council-placeholder-bubble.js";
|
|
10
|
-
import { CouncilQuestionCard } from "../components/council-question-card.js";
|
|
11
|
-
import { CouncilStatusList } from "../components/council-status-list.js";
|
|
12
|
-
import { CouncilSynthesisBanner } from "../components/council-synthesis-banner.js";
|
|
13
|
-
import { HaltRecoveryCard } from "../components/halt-recovery-card.js";
|
|
14
|
-
import { InitNewFormCard } from "../components/init-new-form-card.js";
|
|
15
|
-
import { computeMcpRunInfo, MessageView } from "../components/message-view.js";
|
|
16
|
-
import { PointToExistingFormCard } from "../components/point-to-existing-form-card.js";
|
|
17
|
-
import { DelegationTaskLine, InlineTool, ShimmerText, SubagentActivity, SubagentTaskLine, } from "../components/tool-result-views.js";
|
|
18
|
-
import { Markdown } from "../markdown.js";
|
|
19
|
-
import { PaymentApprovalPanel } from "../modals/wallet-picker-modal.js";
|
|
20
|
-
import { PlanQuestionsPanel } from "../plan.js";
|
|
21
|
-
import { buildPreflightQuestion } from "../utils/format.js";
|
|
22
|
-
import { toolArgs, toolLabel, tryParseArg } from "../utils/tools.js";
|
|
23
|
-
export function ChatFeed(props) {
|
|
24
|
-
const { modeInfo, getSide, getPartnerLast, resolveStyle, scrollRef, messages, expandedMessages, liveTurnSourceLabel, activeToolCalls, streamContent, isProcessing, activeSubagent, councilPhases, productStatus, councilStatuses, councilInfoCards, councilMessages, councilPlaceholders, reasoningActive, lastReasoningElapsedMs, streamReasoning, showPlanPanel, planQuestions, pqs, pendingPaymentApproval, activeHaltCard, haltSelectedIndex, initNewForm, pointToExistingForm, councilProgress, pendingCouncilQuestion, councilCardState, pendingCouncilPreflight, preflightCardState, t, width, } = props;
|
|
25
|
-
return (_jsx(Semantic, { id: "log", role: "log", props: { scrollTop: scrollRef.current?.scrollTop ?? 0 }, children: _jsxs("scrollbox", { ref: scrollRef, flexGrow: 1, stickyScroll: true, stickyStart: "bottom", children: [(() => {
|
|
26
|
-
const mcpRuns = computeMcpRunInfo(messages);
|
|
27
|
-
// Phase 5 F7 — index of the last assistant message so
|
|
28
|
-
// MessageView can skip auto-collapse on it (final answer
|
|
29
|
-
// should always be fully visible, not hidden behind
|
|
30
|
-
// "ctrl+e expand").
|
|
31
|
-
let _lastAssistantIdx = -1;
|
|
32
|
-
for (let _i = messages.length - 1; _i >= 0; _i--) {
|
|
33
|
-
if (messages[_i]?.type === "assistant") {
|
|
34
|
-
_lastAssistantIdx = _i;
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return messages.map((msg, i) => (
|
|
39
|
-
// biome-ignore lint/suspicious/noArrayIndexKey: append-only message log; index is part of the stable semantic id
|
|
40
|
-
_jsx(Semantic, { id: `msg-${i}`, role: "listitem", name: `${msg.type ?? "msg"}:${String(msg.content ?? "").slice(0, 40)}`, children: _jsx(MessageView, { entry: msg, index: i, t: t, modeColor: modeInfo.color, expandedMessages: expandedMessages, mcpRun: mcpRuns[i], isFinalAssistant: i === _lastAssistantIdx }, `${msg.timestamp?.getTime?.() ?? i}-${msg.type}-${msg.remoteKey ?? ""}-${String(msg.content ?? "").slice(0, 24)}`) }, `sem-${msg.timestamp?.getTime?.() ?? i}-${i}`)));
|
|
41
|
-
})(), liveTurnSourceLabel && (activeToolCalls.length > 0 || streamContent || isProcessing) && (_jsx("box", { paddingLeft: 3, marginTop: 1, flexShrink: 0, children: _jsx("text", { fg: t.textMuted, children: liveTurnSourceLabel }) })), activeToolCalls.map((tc) => tc.function.name === "task" ? (_jsx(SubagentTaskLine, { t: t, agent: tryParseArg(tc, "agent") || "sub-agent", label: toolArgs(tc) || "Working", pending: true }, tc.id)) : tc.function.name === "delegate" ? (_jsx(DelegationTaskLine, { t: t, label: toolArgs(tc) || "Background research", pending: true, id: undefined }, tc.id)) : (_jsx(InlineTool, { t: t, pending: true, children: toolLabel(tc) }, tc.id))), activeSubagent && _jsx(SubagentActivity, { t: t, status: activeSubagent }), councilPhases.length > 0 && (_jsx(Semantic, { id: "council-phases", role: "listbox", name: "Council Phases", children: _jsx(CouncilPhaseTimeline, { phases: councilPhases, theme: t }) })), productStatus && _jsx(ProductStatusCard, { data: productStatus, theme: t }), councilStatuses.length > 0 && (_jsx(Semantic, { id: "council-status", role: "listbox", name: "Council Status", children: _jsx(CouncilStatusList, { statuses: councilStatuses, theme: t }) })), councilInfoCards.map((card, idx) => (_jsx(Semantic, { id: `council-card-${idx}`, role: "listitem", name: card.title || `Council card ${idx}`, children: _jsx(CouncilInfoCardView, { card: card, terminalCols: width, theme: t }, `info-card-${idx}-${card.title}`) }, `sem-info-${idx}-${card.title}`))), councilMessages.map((cm, idx) => {
|
|
42
|
-
const side = cm.kind === "debate" && cm.partner
|
|
43
|
-
? getSide(makePairKey(cm.speaker.role, cm.partner.role), cm.speaker.role)
|
|
44
|
-
: "left";
|
|
45
|
-
const semName = `${cm.kind}:${cm.speaker?.role ?? "?"}`;
|
|
46
|
-
if (cm.kind === "leader") {
|
|
47
|
-
return (_jsx(Semantic, { id: `council-msg-${idx}`, role: "listitem", name: semName, value: cm.text, children: _jsx(CouncilLeaderBubble, { msg: cm, terminalCols: width }, idx) }, `sem-cm-${idx}`));
|
|
48
|
-
}
|
|
49
|
-
if (cm.kind === "synthesis") {
|
|
50
|
-
return (_jsx(Semantic, { id: `council-msg-${idx}`, role: "listitem", name: semName, value: cm.text, children: _jsx(CouncilSynthesisBanner, { msg: cm }, idx) }, `sem-cm-${idx}`));
|
|
51
|
-
}
|
|
52
|
-
const pairKey = cm.partner ? makePairKey(cm.speaker.role, cm.partner.role) : `solo::${cm.speaker.role}`;
|
|
53
|
-
const partnerLastText = cm.partner ? getPartnerLast(pairKey, cm.partner.role) : undefined;
|
|
54
|
-
return (_jsx(Semantic, { id: `council-msg-${idx}`, role: "listitem", name: semName, value: cm.text, children: _jsx(CouncilMessageBubble, { msg: cm, terminalCols: width, side: side, resolveStyle: resolveStyle, partnerLastText: partnerLastText, partnerRole: cm.partner?.role, theme: t }, idx) }, `sem-cm-${idx}`));
|
|
55
|
-
}), Array.from(councilPlaceholders.entries()).map(([id, p]) => (_jsx(CouncilPlaceholderBubble, { role: p.role, side: p.side, terminalCols: width, color: p.color, theme: t, variant: p.variant }, id))), (reasoningActive || lastReasoningElapsedMs > 0) && (_jsxs("box", { paddingLeft: 3, marginTop: 1, flexShrink: 0, flexDirection: "column", children: [_jsx("text", { fg: t.textMuted, children: reasoningActive ? "[Thought] Thinking..." : `[Thought] Thought for ${(lastReasoningElapsedMs / 1000).toFixed(1)}s` }), streamReasoning ? (_jsx("box", { border: ["left"], borderColor: t.textMuted, paddingLeft: 2, marginTop: 1, flexDirection: "column", children: reasoningActive ? (
|
|
56
|
-
// While actively streaming, render only the last 3
|
|
57
|
-
// non-empty lines as plain text to avoid Markdown
|
|
58
|
-
// re-parse overhead every 150ms.
|
|
59
|
-
_jsx("text", { fg: t.textMuted, children: streamReasoning
|
|
60
|
-
.split("\n")
|
|
61
|
-
.filter((l) => l.trim().length > 0)
|
|
62
|
-
.slice(-3)
|
|
63
|
-
.join(" · ") })) : (_jsx(Markdown, { content: streamReasoning, t: t })) })) : null] })), streamContent && (_jsx("box", { paddingLeft: 3, marginTop: 1, flexShrink: 0, children: _jsx(Markdown, { content: streamContent, t: t }) })), isProcessing && !streamContent && activeToolCalls.length === 0 && (_jsx(ShimmerText, { t: t, text: "Planning next moves" })), showPlanPanel && _jsx(PlanQuestionsPanel, { t: t, questions: planQuestions, state: pqs }), pendingPaymentApproval && _jsx(PaymentApprovalPanel, { t: t, payment: pendingPaymentApproval }), activeHaltCard && (_jsx(HaltRecoveryCard, { halt: activeHaltCard, selectedIndex: haltSelectedIndex, terminalCols: width, theme: t })), initNewForm && _jsx(InitNewFormCard, { state: initNewForm, terminalCols: width, theme: t }), pointToExistingForm && _jsx(PointToExistingFormCard, { state: pointToExistingForm, terminalCols: width, theme: t }), councilProgress && (_jsx(Semantic, { id: "continue-as-council-progress", role: "log", name: "Council brainstorm", children: _jsx("box", { flexDirection: "column", borderStyle: "single", borderColor: councilProgress.status === "error" ? t.initFormError : t.text, padding: 1, marginTop: 1, children: _jsxs("text", { fg: t.text, children: [councilProgress.status === "running" && "Council brainstorming — writing spec.md...", councilProgress.status === "done" &&
|
|
64
|
-
`Council brainstorm complete: ${councilProgress.specPath}${councilProgress.hasContent ? "" : " (no content — production council wiring deferred)"}`, councilProgress.status === "error" && `Council brainstorm failed: ${councilProgress.error}`] }) }) })), pendingCouncilQuestion && councilCardState && (_jsx(CouncilQuestionCard, { question: pendingCouncilQuestion, theme: t, state: councilCardState })), pendingCouncilPreflight && preflightCardState && (_jsx(CouncilQuestionCard, { question: buildPreflightQuestion(pendingCouncilPreflight), theme: t, state: preflightCardState }))] }) }));
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=chat-feed.js.map
|