mixdog 1.4.0 → 1.4.2
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/package.json +3 -2
- package/scripts/build-shipped-history.mjs +115 -33
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/gate-local.mjs +183 -63
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/gate-scheduler.mjs +138 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +91 -66
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +124 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +16 -4
- package/scripts/lib/test-spawn-ledger.mjs +12 -3
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -5
- package/scripts/suite-health.mjs +115 -24
- package/scripts/test-data-dir.mjs +10 -7
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/app.mjs +4 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +23 -2
- package/src/defaults/skills/browser-use/SKILL.md +10 -5
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +16 -4
- package/src/defaults/skills/goal-management/SKILL.md +1 -1
- package/src/defaults/skills/setup/references/actions.md +12 -6
- package/src/defaults/skills/setup/references/surfaces.md +2 -2
- package/src/defaults/skills/setup-guide/SKILL.md +5 -2
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/rules-builder.cjs +35 -42
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +5 -4
- package/src/rules/lead/LEAD.md +12 -7
- package/src/rules/shared/10-tool-workflow.md +3 -1
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +8 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +156 -24
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +8 -8
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
- package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +88 -54
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +54 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +37 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +248 -41
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +160 -31
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +22 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +49 -22
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +45 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +567 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +41 -13
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +102 -12
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +160 -36
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +164 -23
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +139 -19
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +100 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +14 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +23 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +39 -21
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +30 -13
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +63 -6
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +35 -13
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +24 -14
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +10 -6
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +56 -29
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +30 -7
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +252 -39
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +61 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +46 -20
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +67 -31
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +25 -13
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +103 -13
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +34 -10
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +28 -4
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/whisper-port.mjs +29 -11
- package/src/runtime/channels/lib/whisper-server.mjs +10 -1
- package/src/runtime/computer-bridge/action-schema.mjs +2 -2
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +5 -4
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
- package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
- package/src/runtime/connectors/gmail-app-password.mjs +3 -3
- package/src/runtime/explore/explorer.mjs +93 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/index.mjs +4 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +10 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +4 -2
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +15 -6
- package/src/runtime/shared/bot-owned-work.mjs +56 -0
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +11 -4
- package/src/runtime/shared/connector-catalog.mjs +60 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/defaults-separation.mjs +1 -4
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +13 -15
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/idle-auto-clear-gate.mjs +29 -7
- package/src/runtime/shared/llm/cost.mjs +11 -2
- package/src/runtime/shared/llm/http-agent.mjs +313 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +452 -0
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -0
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/session-activity-signal.mjs +14 -0
- package/src/runtime/shared/session-scratch.mjs +37 -0
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +113 -36
- package/src/runtime/shared/tool-work-units.mjs +6 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +9 -3
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +72 -0
- package/src/runtime/shared/worktrees/manager.mjs +285 -168
- package/src/runtime/shared/worktrees/test-support.mjs +6 -10
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +7 -4
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +6 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +1 -1
- package/src/session-runtime/agent-home-delivery.mjs +41 -0
- package/src/session-runtime/agent-task-sessions.mjs +458 -312
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/bot-status.mjs +107 -101
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +401 -36
- package/src/session-runtime/conversation-import/service.mjs +35 -8
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +12 -13
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +1 -0
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +145 -112
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/session-catalog.mjs +9 -1
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- package/src/session-runtime/model-route/set-route.mjs +11 -2
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -2
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
- package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-recall-api.mjs +6 -1
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +4 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +6 -2
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +10 -6
- package/src/session-runtime/services/provider-admin.mjs +283 -11
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +6 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +1 -0
- package/src/session-runtime/turn/agent-ops.mjs +23 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +25 -5
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +108 -1041
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +80 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +73 -56
- package/src/standalone/daemon-desktop-runtime.mjs +2 -0
- package/src/standalone/daemon-session-control.mjs +169 -138
- package/src/standalone/daemon.mjs +7 -0
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +5 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +4 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- package/src/standalone/session-service/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- package/src/standalone/session-service/session-calls/session-action.mjs +10 -3
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/App.jsx +154 -164
- package/src/tui/app/app-view/floating-panel.jsx +10 -4
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +21 -10
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +58 -21
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +29 -18
- package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
- package/src/tui/app/slash-commands.mjs +1 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +3 -2
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +47 -32
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +19 -5
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/QuestionPanel.jsx +13 -4
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/dist/index.mjs +1963 -1361
- package/src/tui/session/goal-turn-state.mjs +6 -2
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- package/src/tui/session/session-api/routes-agent-definitions.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-flow/queue/take-entries.mjs +11 -0
- package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- package/src/ui/statusline-agents.mjs +1 -3
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
|
@@ -27,11 +27,24 @@ export function createWsEventSwitch({
|
|
|
27
27
|
// already cleared the pre-stream watchdog and armed the single idle timer.
|
|
28
28
|
// response.created is a MEANINGFUL frame, so it also satisfies the
|
|
29
29
|
// first-meaningful watchdog (keepalive/metadata frames never reach here,
|
|
30
|
-
// so they never clear it).
|
|
31
|
-
//
|
|
32
|
-
//
|
|
30
|
+
// so they never clear it). It is still metadata, not model output: it
|
|
31
|
+
// neither ends the first-output phase nor arms the semantic idle, and the
|
|
32
|
+
// agent sees it as transport.
|
|
33
33
|
watchdogs.clearFirstMeaningful();
|
|
34
|
-
progress('
|
|
34
|
+
progress('transport');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// A tool item starting is model output: it resets the semantic-idle timer so
|
|
38
|
+
// long server-side tool latency after item-added (before any arg delta) is
|
|
39
|
+
// not mistaken for a silent stall. An empty reasoning or message item is
|
|
40
|
+
// progress only once the model has produced output; before that the silent
|
|
41
|
+
// thinking follows it.
|
|
42
|
+
function onItemAdded() {
|
|
43
|
+
let kind = null;
|
|
44
|
+
if (response.toolInFlight) kind = 'tool';
|
|
45
|
+
else if (watchdogs.semanticSeen()) kind = 'semantic';
|
|
46
|
+
if (kind) watchdogs.bumpSemantic();
|
|
47
|
+
progress(kind ?? 'transport');
|
|
35
48
|
}
|
|
36
49
|
|
|
37
50
|
function onOutputTextDelta(delta) {
|
|
@@ -84,11 +97,7 @@ export function createWsEventSwitch({
|
|
|
84
97
|
case 'response.output_item.added':
|
|
85
98
|
response.noteItemAdded(event.item);
|
|
86
99
|
reportStreamItemStart(onStreamItemStart, responsesItemStart(event.item));
|
|
87
|
-
|
|
88
|
-
// long server-side tool latency after item-added (before any arg
|
|
89
|
-
// delta) is not mistaken for a silent stall.
|
|
90
|
-
watchdogs.resetSemantic();
|
|
91
|
-
progress(response.toolInFlight ? 'tool' : 'semantic');
|
|
100
|
+
onItemAdded();
|
|
92
101
|
break;
|
|
93
102
|
case 'response.function_call_arguments.delta':
|
|
94
103
|
case 'response.custom_tool_call_input.delta':
|
|
@@ -115,9 +124,10 @@ export function createWsEventSwitch({
|
|
|
115
124
|
const kind = response.completeOutputItem(event.item);
|
|
116
125
|
// A stream that names the phase only on the finished message.
|
|
117
126
|
if (event.item?.type === 'message') reportStreamItemStart(onStreamItemStart, responsesItemStart(event.item));
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
|
|
127
|
+
// A completed item (reasoning, message, tool call) is model output —
|
|
128
|
+
// it ends the first-output phase and resets semantic idle so latency
|
|
129
|
+
// before the next item/args does not stall.
|
|
130
|
+
watchdogs.bumpSemantic();
|
|
121
131
|
progress(kind);
|
|
122
132
|
break;
|
|
123
133
|
}
|
|
@@ -24,11 +24,13 @@ import {
|
|
|
24
24
|
PROVIDER_SSE_IDLE_WATCHDOG_ENABLED,
|
|
25
25
|
PROVIDER_WS_FIRST_MEANINGFUL_TIMEOUT_MS,
|
|
26
26
|
PROVIDER_WS_SEMANTIC_IDLE_TIMEOUT_MS,
|
|
27
|
+
providerFirstOutputTimeoutMs,
|
|
27
28
|
} from '../stall-policy.mjs';
|
|
28
29
|
import { _wsErrLabel, WS_MAX_INCOMING_FRAME_BYTES } from './openai-ws-pool.mjs';
|
|
29
30
|
import { createWsResponseState } from './openai-ws-response-state.mjs';
|
|
30
31
|
import { createWsTextRelay } from './openai-ws-text-relay.mjs';
|
|
31
32
|
import { createWsStreamWatchdogs } from './openai-ws-watchdogs.mjs';
|
|
33
|
+
import { streamFirstOutputWindow } from './lib/first-output-window.mjs';
|
|
32
34
|
import {
|
|
33
35
|
enableSessionTransportTracking,
|
|
34
36
|
disableSessionTransportTracking,
|
|
@@ -85,6 +87,7 @@ function resolveStreamTimeouts(_timeouts) {
|
|
|
85
87
|
interChunkMs: _positiveInt(_timeouts?.interChunkMs, WS_INTER_CHUNK_MS),
|
|
86
88
|
maxIncomingFrameBytes: _positiveInt(_timeouts?.maxIncomingFrameBytes, WS_MAX_INCOMING_FRAME_BYTES),
|
|
87
89
|
firstMeaningfulMs: _positiveInt(_timeouts?.firstMeaningfulMs, PROVIDER_WS_FIRST_MEANINGFUL_TIMEOUT_MS),
|
|
90
|
+
firstOutputMs: _positiveInt(_timeouts?.firstOutputMs, providerFirstOutputTimeoutMs(semanticIdleMs)),
|
|
88
91
|
semanticIdleMs,
|
|
89
92
|
semanticIdleEnabled: PROVIDER_SSE_IDLE_WATCHDOG_ENABLED && semanticIdleMs > 0,
|
|
90
93
|
};
|
|
@@ -112,7 +115,8 @@ export async function _streamResponse({
|
|
|
112
115
|
if (socket?.readyState === WebSocket.OPEN) {
|
|
113
116
|
markSessionTransportActivity(state?.sessionId);
|
|
114
117
|
}
|
|
115
|
-
const { maxIncomingFrameBytes, ...timeouts } = resolveStreamTimeouts(_timeouts);
|
|
118
|
+
const { maxIncomingFrameBytes, firstOutputMs, ...timeouts } = resolveStreamTimeouts(_timeouts);
|
|
119
|
+
const firstOutput = streamFirstOutputWindow({ sessionId: state?.sessionId, onStreamDelta, timeoutMs: firstOutputMs });
|
|
116
120
|
const streamingStart = Date.now();
|
|
117
121
|
// Mid-stream retry classifier needs to distinguish "stream died before we
|
|
118
122
|
// even saw response.created" from "stream died after we had a partial
|
|
@@ -182,6 +186,7 @@ export async function _streamResponse({
|
|
|
182
186
|
streamingStart,
|
|
183
187
|
currentModel: () => response.model,
|
|
184
188
|
timeouts,
|
|
189
|
+
firstOutput,
|
|
185
190
|
attachPartialState,
|
|
186
191
|
fail,
|
|
187
192
|
});
|
|
@@ -256,6 +261,7 @@ export async function _streamResponse({
|
|
|
256
261
|
if (!handlers.attach()) return;
|
|
257
262
|
watchdogs.armPreStream();
|
|
258
263
|
watchdogs.armFirstMeaningful();
|
|
264
|
+
watchdogs.armFirstOutput();
|
|
259
265
|
// No proactive client ping: Codex's Responses WebSocket uses the library
|
|
260
266
|
// default (automatic pong replies, no periodic client ping). Incoming
|
|
261
267
|
// frames remain bounded by the 300s stream idle timeout.
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* openai-ws-watchdogs.mjs — the
|
|
2
|
+
* openai-ws-watchdogs.mjs — the five timers that bound one Responses WS
|
|
3
3
|
* stream, and what each one proves when it fires:
|
|
4
4
|
*
|
|
5
5
|
* pre-stream — no server event at all after response.create (a wedged
|
|
6
6
|
* post-upgrade socket); cleared by ANY frame.
|
|
7
7
|
* first-meaningful — no response.created / content / tool-arg delta, even
|
|
8
8
|
* while keepalive frames keep arriving; cleared once.
|
|
9
|
+
* first-output — no semantic output (reasoning, text, tool call) within
|
|
10
|
+
* the first-output window; metadata, empty items and
|
|
11
|
+
* keepalives never clear or extend it; cleared once.
|
|
9
12
|
* inter-chunk — byte silence mid-stream; reset by EVERY frame.
|
|
10
|
-
* semantic idle — deltas then silence (keepalives only);
|
|
11
|
-
*
|
|
13
|
+
* semantic idle — deltas then silence (keepalives only); armed by the
|
|
14
|
+
* first semantic output, then reset by meaningful output
|
|
15
|
+
* and item lifecycle.
|
|
12
16
|
*
|
|
13
17
|
* Every expiry hands a tagged error to `fail`, which owns terminalError, the
|
|
14
18
|
* socket close and the settle; the timers never touch the Promise.
|
|
@@ -23,6 +27,8 @@ import { streamStalledError } from '../stall-policy.mjs';
|
|
|
23
27
|
* @param {number} deps.streamingStart
|
|
24
28
|
* @param {() => string} deps.currentModel
|
|
25
29
|
* @param {{ preResponseCreatedMs: number, firstMeaningfulMs: number, interChunkMs: number, semanticIdleMs: number, semanticIdleEnabled: boolean }} deps.timeouts
|
|
30
|
+
* @param {ReturnType<typeof import('./lib/first-output-window.mjs').streamFirstOutputWindow>} deps.firstOutput
|
|
31
|
+
* the logical request's first-output window
|
|
26
32
|
* @param {(err: Error) => Error} deps.attachPartialState
|
|
27
33
|
* @param {(err: Error, closeReason: string) => void} deps.fail
|
|
28
34
|
*/
|
|
@@ -32,6 +38,7 @@ export function createWsStreamWatchdogs({
|
|
|
32
38
|
streamingStart,
|
|
33
39
|
currentModel,
|
|
34
40
|
timeouts,
|
|
41
|
+
firstOutput,
|
|
35
42
|
attachPartialState,
|
|
36
43
|
fail,
|
|
37
44
|
}) {
|
|
@@ -86,27 +93,30 @@ export function createWsStreamWatchdogs({
|
|
|
86
93
|
// synthesized completion. Attach the streamed partial state so
|
|
87
94
|
// the loop's partial/tool recovery can finalize it explicitly.
|
|
88
95
|
err.streamStalled = true;
|
|
96
|
+
err.code = 'ESTREAMSTALL';
|
|
89
97
|
attachPartialState(err);
|
|
90
98
|
fail(err, 'inter_chunk_timeout');
|
|
91
99
|
}, interChunkMs);
|
|
92
100
|
};
|
|
101
|
+
// A semantic stall (first-output or idle window): partial-final recovery
|
|
102
|
+
// attaches the streamed partial state so a wedged FINAL no-tool summary can
|
|
103
|
+
// be accepted as partial-final success by the loop. pendingToolUse gates
|
|
104
|
+
// out mid-flight tools.
|
|
105
|
+
const failStalled = (event, timeoutMs) => {
|
|
106
|
+
traceWsTimeout(event, timeoutMs);
|
|
107
|
+
const err = streamStalledError('Responses WS', timeoutMs, {
|
|
108
|
+
emittedToolCall: !!midState?.emittedToolCall,
|
|
109
|
+
});
|
|
110
|
+
attachPartialState(err);
|
|
111
|
+
try {
|
|
112
|
+
err.wsCloseCode = 4000;
|
|
113
|
+
} catch {}
|
|
114
|
+
fail(err, event);
|
|
115
|
+
};
|
|
93
116
|
const resetSemanticIdle = () => {
|
|
94
117
|
if (!semanticIdleEnabled) return;
|
|
95
118
|
if (semanticIdleTimer) clearTimeout(semanticIdleTimer);
|
|
96
|
-
semanticIdleTimer = setTimeout(() =>
|
|
97
|
-
traceWsTimeout('semantic_idle_timeout', semanticIdleMs);
|
|
98
|
-
const err = streamStalledError('Responses WS', semanticIdleMs, {
|
|
99
|
-
emittedToolCall: !!midState?.emittedToolCall,
|
|
100
|
-
});
|
|
101
|
-
// Partial-final recovery: attach streamed partial state so a wedged
|
|
102
|
-
// FINAL no-tool summary can be accepted as partial-final success by
|
|
103
|
-
// the loop. pendingToolUse gates out mid-flight tools.
|
|
104
|
-
attachPartialState(err);
|
|
105
|
-
try {
|
|
106
|
-
err.wsCloseCode = 4000;
|
|
107
|
-
} catch {}
|
|
108
|
-
fail(err, 'semantic_idle_timeout');
|
|
109
|
-
}, semanticIdleMs);
|
|
119
|
+
semanticIdleTimer = setTimeout(() => failStalled('semantic_idle_timeout', semanticIdleMs), semanticIdleMs);
|
|
110
120
|
try {
|
|
111
121
|
semanticIdleTimer.unref?.();
|
|
112
122
|
} catch {}
|
|
@@ -164,24 +174,41 @@ export function createWsStreamWatchdogs({
|
|
|
164
174
|
firstMeaningfulTimer.unref?.();
|
|
165
175
|
} catch {}
|
|
166
176
|
},
|
|
177
|
+
/** Fires if the logical request produces no semantic output by its
|
|
178
|
+
* first-output deadline. Metadata (response.created / in_progress), empty
|
|
179
|
+
* item lifecycle and keepalive frames never clear or extend it, and the
|
|
180
|
+
* shorter semantic idle does not run before the first output, so a model
|
|
181
|
+
* may think silently past the idle window. A request that already had
|
|
182
|
+
* output has none: its stream runs under the semantic idle from its
|
|
183
|
+
* first frame (resetIdle). */
|
|
184
|
+
armFirstOutput() {
|
|
185
|
+
if (!firstOutput.outputSeen && semanticIdleEnabled && firstOutput.timeoutMs > 0) {
|
|
186
|
+
firstOutput.arm(() => failStalled('first_output_timeout', firstOutput.timeoutMs));
|
|
187
|
+
}
|
|
188
|
+
},
|
|
167
189
|
/** Called on EVERY parsed server event: any frame proves the socket is
|
|
168
190
|
* live. Also clears the pre-stream watchdog in case the first event is
|
|
169
|
-
* not response.created
|
|
191
|
+
* not response.created, and starts the semantic idle (once) for a
|
|
192
|
+
* request that already had output. */
|
|
170
193
|
resetIdle() {
|
|
171
194
|
clearPreStream();
|
|
172
195
|
resetInterChunk();
|
|
196
|
+
if (firstOutput.outputSeen && !semanticIdleTimer) resetSemanticIdle();
|
|
173
197
|
},
|
|
174
|
-
/** Meaningful-output progress: text/reasoning/tool
|
|
175
|
-
*
|
|
198
|
+
/** Meaningful-output progress: text/reasoning/tool output. The first one
|
|
199
|
+
* also satisfies the first-meaningful watchdog and ends the first-output
|
|
200
|
+
* phase. */
|
|
176
201
|
bumpSemantic() {
|
|
177
202
|
clearFirstMeaningful();
|
|
203
|
+
firstOutput.noteOutput();
|
|
178
204
|
resetSemanticIdle();
|
|
179
205
|
},
|
|
180
|
-
/**
|
|
181
|
-
|
|
206
|
+
/** Whether the model has produced semantic output on this stream. */
|
|
207
|
+
semanticSeen: () => firstOutput.outputSeen,
|
|
182
208
|
/** response.created is meaningful on its own. */
|
|
183
209
|
clearFirstMeaningful,
|
|
184
210
|
clearAll() {
|
|
211
|
+
firstOutput.clear();
|
|
185
212
|
if (idleTimer) clearTimeout(idleTimer);
|
|
186
213
|
if (interChunkTimer) {
|
|
187
214
|
clearTimeout(interChunkTimer);
|
|
@@ -228,7 +228,7 @@ export class OpenCodeGoOAuthProvider {
|
|
|
228
228
|
});
|
|
229
229
|
const response = await consoleGetJson(CONFIG_URL, tokens, { fetchFn: this.config.fetchImpl, refresh: true });
|
|
230
230
|
const remote = goConfigFromResponse(response, listsGoModels(response) ? null : await loadModelsDevGoModels());
|
|
231
|
-
publish(remote.models, {
|
|
231
|
+
await publish(remote.models, {
|
|
232
232
|
baseURL: remote.baseURL,
|
|
233
233
|
headers: remote.headers,
|
|
234
234
|
accountId: tokens.account_id,
|
|
@@ -170,7 +170,9 @@ export class OpenCodeGoProvider {
|
|
|
170
170
|
const { OpenCodeGoGeminiEngine } = await import('./opencode-go-gemini.mjs');
|
|
171
171
|
this.gemini = new OpenCodeGoGeminiEngine({
|
|
172
172
|
...this.config,
|
|
173
|
-
|
|
173
|
+
// The OAuth org config names the chat base `.../go/openai/v1`; the
|
|
174
|
+
// generateContent routes live under `.../go/v1` and 404 on it.
|
|
175
|
+
baseURL: String(this.openai.baseURL).replace(/\/openai\/v1$/i, '/v1'),
|
|
174
176
|
extraHeaders: {
|
|
175
177
|
...GO_GATEWAY_PRESET.extraHeaders,
|
|
176
178
|
...(this.config.extraHeaders || {}),
|
|
@@ -3,7 +3,9 @@ import { oauthCredentialProbeState } from './oauth-credential-probes.mjs';
|
|
|
3
3
|
import { providerAvailable } from './provider-availability.mjs';
|
|
4
4
|
import { refreshCatalog as refreshMetadataCatalog } from './model-catalog.mjs';
|
|
5
5
|
import { wrapProviderAdmission } from './admission-scheduler.mjs';
|
|
6
|
-
import { createAccountPoolProvider } from './account-pool.mjs';
|
|
6
|
+
import { createAccountPoolProvider, createCustomKeyPoolProvider } from './account-pool.mjs';
|
|
7
|
+
import { customKeyEngine } from './custom-provider-keys.mjs';
|
|
8
|
+
import { customProviderKeyIds } from '../../../shared/provider-accounts.mjs';
|
|
7
9
|
import { isInclusiveProvider } from '../../../shared/llm/cost.mjs';
|
|
8
10
|
import { noEnabledProvidersError } from './registry-errors.mjs';
|
|
9
11
|
import { providerTakesNativePdf } from '../../../attachments/store.mjs';
|
|
@@ -182,6 +184,7 @@ async function loadProviderExport(cacheKey, spec, exportName, signal = null) {
|
|
|
182
184
|
const PROVIDER_MODULES = {
|
|
183
185
|
anthropic: ['./anthropic.mjs', 'AnthropicProvider'],
|
|
184
186
|
gemini: ['./gemini.mjs', 'GeminiProvider'],
|
|
187
|
+
'vertex-ai': ['./vertex-ai.mjs', 'VertexAIProvider'],
|
|
185
188
|
'openai-oauth': ['./openai-oauth.mjs', 'OpenAIOAuthProvider'],
|
|
186
189
|
'anthropic-oauth': ['./anthropic-oauth.mjs', 'AnthropicOAuthProvider'],
|
|
187
190
|
'grok-oauth': ['./grok-oauth.mjs', 'GrokOAuthProvider'],
|
|
@@ -227,13 +230,39 @@ async function instantiateProvider(name, Ctor, cfg, proxyChannel = null) {
|
|
|
227
230
|
const { createModelProxyProvider } = await import('./model-proxy-provider.mjs');
|
|
228
231
|
return wrapProviderAdmission(createModelProxyProvider(name, cfg, proxyChannel ?? getModelProxyChannel()), name);
|
|
229
232
|
}
|
|
230
|
-
if (isCustomProviderConfig(name, cfg))
|
|
233
|
+
if (isCustomProviderConfig(name, cfg)) {
|
|
234
|
+
const { [CUSTOM_KEY_IDS]: keyIds, ...settings } = cfg;
|
|
235
|
+
const primary = wrapProviderAdmission(await Ctor(name, settings), name);
|
|
236
|
+
// Only a provider with additional keys sends through the key roster.
|
|
237
|
+
if (!keyIds?.length) return primary;
|
|
238
|
+
return createCustomKeyPoolProvider(name, primary, (id) => customKeyEngine(primary, name, id));
|
|
239
|
+
}
|
|
231
240
|
if (Object.hasOwn(OPENAI_COMPAT_PRESETS, name) && !Object.hasOwn(PROVIDER_MODULES, name)) {
|
|
232
241
|
return wrapProviderAdmission(new Ctor(name, cfg), name);
|
|
233
242
|
}
|
|
234
243
|
return createAccountPoolProvider(name, () => wrapProviderAdmission(new Ctor(cfg), name));
|
|
235
244
|
}
|
|
236
245
|
|
|
246
|
+
// A custom provider's additional keys live in its key roster, not the config.
|
|
247
|
+
// Their ids are read once per init and join its entry (and so its reuse
|
|
248
|
+
// signature): a save that changes them rebuilds the provider, which is wrapped
|
|
249
|
+
// in the key pool only while it has some. A single-key provider's entry and
|
|
250
|
+
// sends stay as they were, with no roster read per send.
|
|
251
|
+
const CUSTOM_KEY_IDS = 'customKeyIds';
|
|
252
|
+
|
|
253
|
+
function withCustomKeyIds(config) {
|
|
254
|
+
if (!config || typeof config !== 'object') return config;
|
|
255
|
+
let out = config;
|
|
256
|
+
for (const [name, cfg] of Object.entries(config)) {
|
|
257
|
+
if (!isCustomProviderConfig(name, cfg) || cfg.auth === 'none') continue;
|
|
258
|
+
const ids = customProviderKeyIds(name);
|
|
259
|
+
if (!ids.length) continue;
|
|
260
|
+
if (out === config) out = { ...config };
|
|
261
|
+
out[name] = { ...cfg, [CUSTOM_KEY_IDS]: ids };
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
}
|
|
265
|
+
|
|
237
266
|
let _initProvidersCalls = 0;
|
|
238
267
|
/** Test seam: how many times initProviders was called in this process. */
|
|
239
268
|
export function _initProvidersCallCountForTest() {
|
|
@@ -249,6 +278,8 @@ export async function initProviders(config, { signal = null } = {}) {
|
|
|
249
278
|
if (proxyChannel) {
|
|
250
279
|
const { loadModelProxyProviderConfig } = await import('./model-proxy-provider.mjs');
|
|
251
280
|
config = await awaitWithAbort(loadModelProxyProviderConfig({ channel: proxyChannel }), signal);
|
|
281
|
+
} else {
|
|
282
|
+
config = withCustomKeyIds(config);
|
|
252
283
|
}
|
|
253
284
|
const sig = reuseSignature(config, proxyChannel);
|
|
254
285
|
// Coalesce: an identical config is already mid-init — attach to it.
|
|
@@ -684,6 +715,18 @@ export function refreshProviderCatalogsOnStartup() {
|
|
|
684
715
|
return _startupCatalogRefreshPromise;
|
|
685
716
|
}
|
|
686
717
|
|
|
718
|
+
// Force-refresh only the named providers' catalogs, each bounded like the full
|
|
719
|
+
// refresh. It leaves the 24h window, the catalog revision and every other
|
|
720
|
+
// provider's cache alone.
|
|
721
|
+
export function refreshProviderCatalogsFor(names) {
|
|
722
|
+
const pending = [];
|
|
723
|
+
for (const [name, provider] of availableProviderEntries()) {
|
|
724
|
+
const refreshFn = names.includes(name) ? providerCatalogRefreshFn(provider) : null;
|
|
725
|
+
if (refreshFn) pending.push(boundedCatalogRefresh(name, provider, refreshFn, 'catalog refresh'));
|
|
726
|
+
}
|
|
727
|
+
return Promise.allSettled(pending);
|
|
728
|
+
}
|
|
729
|
+
|
|
687
730
|
// Refresh the complete catalog at most once per 24h process window. The timer
|
|
688
731
|
// above calls this automatically when the window expires; callers may bypass
|
|
689
732
|
// that window after an explicit auth/config/model-refresh action.
|