mixdog 1.3.5 → 1.4.1
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/NOTICE.md +2 -2
- package/README.md +2 -2
- package/package.json +2 -11
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +16 -5
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +37 -37
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +123 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -4
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +20 -2
- package/scripts/test-data-dir.mjs +10 -7
- package/scripts/test.mjs +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/app.mjs +4 -0
- package/src/defaults/shipped-history.json +22 -1
- package/src/defaults/skills/browser-use/SKILL.md +62 -12
- package/src/defaults/skills/code-tidy/SKILL.md +142 -270
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
- package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
- package/src/defaults/skills/computer-use/SKILL.md +35 -9
- package/src/defaults/skills/setup/SKILL.md +22 -0
- package/src/defaults/skills/setup/references/actions.md +39 -5
- package/src/defaults/skills/setup/references/surfaces.md +11 -2
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/rules-builder.cjs +39 -20
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +11 -10
- package/src/rules/lead/LEAD.md +23 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +4 -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 +7 -5
- package/src/rules/shared/70-delivery.md +7 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +17 -1
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
- package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- 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 +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
- 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-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
- 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 +136 -5
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
- package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
- package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
- package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
- 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 +280 -45
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
- 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 +90 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
- 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 +31 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
- 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/ask-turn-state.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
- package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
- package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
- package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- 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/shell-runtime.mjs +7 -1
- 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/shell-warm-standby.mjs +26 -4
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
- package/src/runtime/browser-bridge/action-schema.mjs +13 -2
- package/src/runtime/browser-bridge/client.mjs +73 -8
- package/src/runtime/browser-bridge/input-fields.mjs +8 -9
- package/src/runtime/browser-bridge/mail-links.mjs +107 -0
- package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
- package/src/runtime/channels/lib/config.mjs +6 -61
- package/src/runtime/channels/lib/crash-log.mjs +1 -1
- package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
- package/src/runtime/channels/lib/event-queue.mjs +3 -18
- package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
- package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
- package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
- package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
- package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
- package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
- package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
- package/src/runtime/channels/lib/scheduler.mjs +33 -147
- package/src/runtime/channels/lib/schedules-db.mjs +34 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/whisper-port.mjs +10 -1
- package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
- package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
- package/src/runtime/channels/lib/worker-main.mjs +10 -34
- package/src/runtime/computer-bridge/action-schema.mjs +42 -1
- package/src/runtime/computer-bridge/actions.mjs +9 -1
- package/src/runtime/computer-bridge/client.mjs +180 -8
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
- 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/computer-bridge/linux-readiness.mjs +65 -23
- package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
- package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
- package/src/runtime/connectors/gmail-app-password.mjs +172 -39
- package/src/runtime/connectors/google-mcp.mjs +10 -12
- 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/lib/embedding-worker.mjs +6 -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/memory/lib/pg/adapter.mjs +77 -70
- package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
- package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
- 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 +3 -1
- 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/session-search/session-search-db.mjs +73 -9
- package/src/runtime/session-search/session-search-ingest.mjs +110 -20
- package/src/runtime/shared/abort-race.mjs +89 -0
- package/src/runtime/shared/agent-avatar.d.mts +0 -1
- package/src/runtime/shared/agent-kind.mjs +4 -3
- package/src/runtime/shared/bot-owned-work.mjs +56 -0
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +2 -13
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +29 -0
- package/src/runtime/shared/connector-catalog.mjs +150 -0
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -17
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/err-text.mjs +24 -15
- 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-permissions.d.mts +0 -8
- package/src/runtime/shared/file-permissions.mjs +0 -11
- package/src/runtime/shared/git-direct.test-support.mjs +19 -0
- package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
- package/src/runtime/shared/heartbeat-interval.mjs +19 -0
- package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
- package/src/runtime/shared/llm/cost.mjs +5 -1
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- 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/orchestration.d.mts +2 -0
- package/src/runtime/shared/pg-schema-db.mjs +27 -16
- package/src/runtime/shared/profile-config.cjs +1 -1
- package/src/runtime/shared/prompt-origin.d.mts +4 -0
- package/src/runtime/shared/prompt-origin.mjs +21 -0
- package/src/runtime/shared/provider-accounts.mjs +7 -1
- package/src/runtime/shared/provider-display-name.mjs +29 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
- package/src/runtime/shared/routine-trigger.d.mts +2 -0
- package/src/runtime/shared/routine-trigger.mjs +10 -0
- package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
- package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
- package/src/runtime/shared/session-activity-signal.mjs +48 -1
- package/src/runtime/shared/session-scratch.mjs +37 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
- package/src/runtime/shared/session-sidebar-host.mjs +7 -3
- package/src/runtime/shared/session-turn-prelude.mjs +18 -0
- 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 +2 -15
- package/src/runtime/shared/tool-surface.mjs +3 -0
- package/src/runtime/shared/tool-work-units.mjs +2 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +15 -0
- package/src/runtime/shared/worktrees/manager.mjs +87 -38
- package/src/runtime/shared/worktrees/test-support.mjs +14 -13
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +29 -8
- package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
- package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
- package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
- package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
- package/src/session-runtime/agent-home-delivery.mjs +489 -185
- package/src/session-runtime/agent-task-sessions.mjs +467 -229
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/apis.mjs +9 -0
- package/src/session-runtime/boot/infrastructure.mjs +4 -0
- package/src/session-runtime/boot/providers.mjs +3 -0
- package/src/session-runtime/boot/tools.mjs +11 -2
- package/src/session-runtime/bot-status.mjs +12 -6
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +271 -25
- package/src/session-runtime/conversation-import/service.mjs +26 -5
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
- package/src/session-runtime/lifecycle/teardown.mjs +23 -5
- package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +153 -33
- package/src/session-runtime/model-route/set-route.mjs +11 -2
- package/src/session-runtime/notification-bus.mjs +31 -117
- package/src/session-runtime/notification-completion-queue.mjs +54 -0
- package/src/session-runtime/notification-listeners.mjs +76 -0
- package/src/session-runtime/owned-automation-run.mjs +2 -1
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- 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 +143 -224
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
- package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
- package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
- package/src/session-runtime/resource-mcp-servers.mjs +78 -0
- package/src/session-runtime/resource-mcp-store.mjs +49 -0
- package/src/session-runtime/resource-recall-api.mjs +6 -1
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- 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/spawn-preset.mjs +13 -4
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
- package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
- package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
- package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
- package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
- package/src/session-runtime/services/channel-admin.mjs +7 -13
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/provider-admin.mjs +2 -1
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +1 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
- package/src/session-runtime/settings-compaction-api.mjs +2 -40
- package/src/session-runtime/settings-system-api.mjs +13 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +145 -22
- package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workspace/transitions.mjs +25 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
- package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
- package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
- package/src/standalone/channel-transport/client-registry.mjs +24 -163
- package/src/standalone/channel-transport.mjs +1 -1
- package/src/standalone/daemon-channels-loader.mjs +10 -8
- package/src/standalone/daemon-session-control/list-page.mjs +72 -0
- package/src/standalone/daemon-session-control/request.mjs +51 -0
- package/src/standalone/daemon-session-control/room-host.mjs +57 -0
- package/src/standalone/daemon-session-control/route-control.mjs +48 -0
- package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
- package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
- package/src/standalone/daemon-session-control.mjs +142 -190
- package/src/standalone/daemon.mjs +26 -3
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +5 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- package/src/standalone/session-service/quota-resume.mjs +3 -0
- package/src/standalone/session-service/retention/busy.mjs +65 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/app/app-view/floating-panel.jsx +7 -4
- package/src/tui/app/model-options.mjs +3 -28
- 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/provider-setup/oauth-actions.mjs +38 -20
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +9 -5
- package/src/tui/components/QuestionPanel.jsx +13 -4
- package/src/tui/dist/index.mjs +133 -92
- package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/notice-surface.mjs +7 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
- package/src/tui/session/session-api/routes-write.mjs +5 -1
- package/src/tui/session/session-api/routes.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +17 -1
- package/src/tui/session/session-flow/auto-clear.mjs +4 -33
- package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
- package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
- package/src/tui/session/session-flow/drain-retry.mjs +35 -0
- package/src/tui/session/session-flow/drain.mjs +118 -149
- package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
- package/src/tui/session/tool-approval-delegation.mjs +64 -0
- package/src/tui/session/tool-approval-request.mjs +39 -0
- package/src/tui/session/tool-approval-settle.mjs +62 -0
- package/src/tui/session/tool-approval.mjs +69 -115
- package/src/tui/session/tui-steering-persist.mjs +8 -1
- package/src/tui/session/turn-stream.mjs +19 -2
- package/src/tui/session/turn.mjs +1 -0
- package/src/ui/statusline-agents.mjs +1 -3
- package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
- package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
- package/scripts/code-graph-description-contract.mjs +0 -188
- package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
|
@@ -274,7 +274,7 @@ function* walkContentParts(content) {
|
|
|
274
274
|
* beforehand by preparePdfTextForProvider, so one reaching here is a bug.
|
|
275
275
|
* Null when the part is not a file at all.
|
|
276
276
|
*/
|
|
277
|
-
|
|
277
|
+
function textFormOfFilePart(part) {
|
|
278
278
|
if (part?.type !== 'file' && part?.type !== 'document') return null;
|
|
279
279
|
try {
|
|
280
280
|
const file = fileInfo(part);
|
|
@@ -840,6 +840,56 @@ function partCarriesLiveMedia(part) {
|
|
|
840
840
|
return Array.isArray(part.content) && contentCarriesLiveMedia(part.content);
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
+
/** An image part in any spelling the providers use: inline, URL, file id or
|
|
844
|
+
* URI, Gemini inline data. */
|
|
845
|
+
function isImagePart(part) {
|
|
846
|
+
return Boolean(
|
|
847
|
+
part.type === 'image' ||
|
|
848
|
+
part.type === 'image_url' ||
|
|
849
|
+
part.type === 'input_image' ||
|
|
850
|
+
imageUrlFromPart(part) ||
|
|
851
|
+
imageFileIdFromPart(part) ||
|
|
852
|
+
imageFileUriFromPart(part) ||
|
|
853
|
+
geminiInlineInfo(part)
|
|
854
|
+
);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
function mapPartText(part, mapText) {
|
|
858
|
+
if (typeof part === 'string') return mapText(part);
|
|
859
|
+
if (!part || typeof part !== 'object') return part;
|
|
860
|
+
// Media and attachment references are encodings, never text.
|
|
861
|
+
if (isAttachmentReference(part) || isImagePart(part) || fileInfo(part)) return part;
|
|
862
|
+
for (const key of ['text', 'content']) {
|
|
863
|
+
if (typeof part[key] === 'string') {
|
|
864
|
+
const next = mapText(part[key]);
|
|
865
|
+
return next === part[key] ? part : { ...part, [key]: next };
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
if (Array.isArray(part.content)) {
|
|
869
|
+
const nextContent = mapContentText(part.content, mapText);
|
|
870
|
+
if (nextContent !== part.content) return { ...part, content: nextContent };
|
|
871
|
+
}
|
|
872
|
+
return part;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/** `content` with `mapText` applied to its text and nothing else: a string,
|
|
876
|
+
* the text a text part or a part's string content carries (textFromPart),
|
|
877
|
+
* and nested part content; media parts and attachment references stay as
|
|
878
|
+
* they are. The same value when nothing changed. */
|
|
879
|
+
export function mapContentText(content, mapText) {
|
|
880
|
+
if (typeof content === 'string') return mapText(content);
|
|
881
|
+
const parts = contentParts(content);
|
|
882
|
+
if (!parts) return content;
|
|
883
|
+
let changed = false;
|
|
884
|
+
const out = parts.map((part) => {
|
|
885
|
+
const next = mapPartText(part, mapText);
|
|
886
|
+
if (next !== part) changed = true;
|
|
887
|
+
return next;
|
|
888
|
+
});
|
|
889
|
+
if (!changed) return content;
|
|
890
|
+
return Array.isArray(content) ? out : { ...content, content: out };
|
|
891
|
+
}
|
|
892
|
+
|
|
843
893
|
function sanitizePartForStoredHistory(part) {
|
|
844
894
|
if (typeof part === 'string') return part;
|
|
845
895
|
if (!part || typeof part !== 'object') return part;
|
|
@@ -849,15 +899,7 @@ function sanitizePartForStoredHistory(part) {
|
|
|
849
899
|
// reloading the session keeps the provider prompt cache intact.
|
|
850
900
|
const storedImage = part.type === 'image' ? storedImagePart(part) : null;
|
|
851
901
|
if (storedImage) return storedImage;
|
|
852
|
-
if (
|
|
853
|
-
part.type === 'image' ||
|
|
854
|
-
part.type === 'image_url' ||
|
|
855
|
-
part.type === 'input_image' ||
|
|
856
|
-
imageUrlFromPart(part) ||
|
|
857
|
-
imageFileIdFromPart(part) ||
|
|
858
|
-
imageFileUriFromPart(part) ||
|
|
859
|
-
geminiInlineInfo(part)
|
|
860
|
-
) {
|
|
902
|
+
if (isImagePart(part)) {
|
|
861
903
|
return { type: 'text', text: storedHistoryImagePlaceholder(part) };
|
|
862
904
|
}
|
|
863
905
|
const file = fileInfo(part);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// X25519 public key we send in the authorize URL; the reply (loopback redirect
|
|
3
3
|
// or a pasted code) carries `u` = ephemeralPub(32) | nonce(12) | ciphertext | tag(16).
|
|
4
4
|
import { createServer } from 'node:http';
|
|
5
|
+
import { listenOn } from './lib/listen-on.mjs';
|
|
5
6
|
import { lookup } from 'node:dns/promises';
|
|
6
7
|
import { createDecipheriv, createHash, createPublicKey, diffieHellman, generateKeyPairSync } from 'node:crypto';
|
|
7
8
|
import { openLoginUrl } from './lib/open-login-url.mjs';
|
|
@@ -112,16 +113,6 @@ async function loopbackAddresses() {
|
|
|
112
113
|
return ['127.0.0.1'];
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
function listenOn(server, port, host) {
|
|
116
|
-
return new Promise((resolve, reject) => {
|
|
117
|
-
server.once('error', reject);
|
|
118
|
-
server.listen(port, host, () => {
|
|
119
|
-
server.off('error', reject);
|
|
120
|
-
resolve();
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
116
|
export async function beginOAuthLogin({
|
|
126
117
|
openBrowser = true,
|
|
127
118
|
timeoutMs = LOGIN_TIMEOUT_MS,
|
|
@@ -5,7 +5,14 @@ export const MODEL_PROXY_OPERATIONS: Readonly<{
|
|
|
5
5
|
resolve: 'modelProxyResolve';
|
|
6
6
|
heartbeat: 'modelProxyHeartbeat';
|
|
7
7
|
}>;
|
|
8
|
-
export type ModelProxyMethod =
|
|
8
|
+
export type ModelProxyMethod =
|
|
9
|
+
| 'send'
|
|
10
|
+
| 'listModels'
|
|
11
|
+
| 'refreshModels'
|
|
12
|
+
| 'isAvailable'
|
|
13
|
+
| 'quotaUsable'
|
|
14
|
+
| 'resolveWireRoute'
|
|
15
|
+
| 'providerConfig';
|
|
9
16
|
export const MODEL_PROXY_METHODS: ReadonlyArray<ModelProxyMethod>;
|
|
10
17
|
export const MODEL_PROXY_HEARTBEAT_MS: number;
|
|
11
18
|
export const MODEL_PROXY_LEASE_MS: number;
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
// so a new process (or an offline one) starts from the newest version this
|
|
9
9
|
// machine has seen rather than from a floor that only moves with a release.
|
|
10
10
|
|
|
11
|
+
import { runAbortable } from '../../../shared/abort-race.mjs';
|
|
11
12
|
import { readLastKnownVersion, rememberLastKnownVersion } from './client-version-store.mjs';
|
|
12
13
|
|
|
13
14
|
const SEMVER = /^\d+\.\d+\.\d+$/;
|
|
@@ -41,11 +42,18 @@ export async function parseNpmLatest(res) {
|
|
|
41
42
|
return SEMVER.test(v) ? v : null;
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
/** One GET of `url` parsed to a version; null when offline, slow, or unrecognised.
|
|
45
|
+
/** One GET of `url` parsed to a version; null when offline, slow, or unrecognised.
|
|
46
|
+
* The deadline settles the lookup itself instead of relying on the request
|
|
47
|
+
* and its body read to honour the abort: a send awaits this lookup, and its
|
|
48
|
+
* timer is unref'd, so once the abort tears the socket down nothing else is
|
|
49
|
+
* left to wake a read that missed it. */
|
|
45
50
|
export async function fetchRemoteVersion(url, parse, timeoutMs = TIMEOUT_MS) {
|
|
51
|
+
const signal = AbortSignal.timeout(timeoutMs);
|
|
46
52
|
try {
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
return await runAbortable(signal, async () => {
|
|
54
|
+
const res = await fetch(url, { signal });
|
|
55
|
+
return res.ok ? (await parse(res)) || null : null;
|
|
56
|
+
});
|
|
49
57
|
} catch {
|
|
50
58
|
return null;
|
|
51
59
|
}
|
|
@@ -5,6 +5,7 @@ import { resolvePluginData } from '../../../shared/plugin-paths.mjs';
|
|
|
5
5
|
import { boundProviderAuthPath } from '../../../shared/provider-auth-binding.mjs';
|
|
6
6
|
import { cursorTokenExpiry } from './cursor-auth.mjs';
|
|
7
7
|
import { describeDevinOAuthCredentials } from './devin-auth.mjs';
|
|
8
|
+
import { isSignedInTokenDocument } from './lib/oauth-token-utils.mjs';
|
|
8
9
|
import { isValidMuseCredentialDocument } from './muse-code-oauth-tokens.mjs';
|
|
9
10
|
import { isValidOpenCodeGoCredentialDocument } from './opencode-go-oauth-tokens.mjs';
|
|
10
11
|
import { developerOptionEnabled, developerOptionForProvider } from '../../../shared/developer-options.mjs';
|
|
@@ -152,7 +153,7 @@ function openAIOAuthState() {
|
|
|
152
153
|
join(resolvePluginData(), 'openai-oauth.json'),
|
|
153
154
|
];
|
|
154
155
|
return memoProbe('openai-oauth', paths, () =>
|
|
155
|
-
resolveProbeState(paths, (docs) => docs.some((raw) =>
|
|
156
|
+
resolveProbeState(paths, (docs) => docs.some((raw) => isSignedInTokenDocument(raw)))
|
|
156
157
|
);
|
|
157
158
|
}
|
|
158
159
|
|
|
@@ -184,6 +184,7 @@ export async function sendCompatChat(provider, messages, useModel, tools, opts)
|
|
|
184
184
|
signal: attemptSignal,
|
|
185
185
|
label: provider.name,
|
|
186
186
|
providerName: provider.name,
|
|
187
|
+
sessionId: opts.sessionId,
|
|
187
188
|
onStreamDelta: opts.onStreamDelta,
|
|
188
189
|
onToolCall: opts.onToolCall,
|
|
189
190
|
onTextDelta: opts.onTextDelta,
|
|
@@ -5,7 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { mergeToolCallDelta } from './tool-call-acc.mjs';
|
|
7
7
|
import { reportStreamItemStart } from '../lib/send-callbacks.mjs';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
appendText,
|
|
10
|
+
drainLeakedCalls,
|
|
11
|
+
relayText,
|
|
12
|
+
reportLifecycle,
|
|
13
|
+
reportProgress,
|
|
14
|
+
reportTransport,
|
|
15
|
+
} from './stream-state.mjs';
|
|
9
16
|
import { chatContentParts } from '../openai-compat-reasoning-field.mjs';
|
|
10
17
|
|
|
11
18
|
function appendReasoning(state, text, source) {
|
|
@@ -50,7 +57,7 @@ export function applyCompatChunk(state, chunk) {
|
|
|
50
57
|
const choice = chunk?.choices?.[0];
|
|
51
58
|
const delta = choice?.delta;
|
|
52
59
|
if (typeof delta?.role === 'string' && delta.role) {
|
|
53
|
-
|
|
60
|
+
reportLifecycle(state, 'semantic');
|
|
54
61
|
}
|
|
55
62
|
const contentParts = chatContentParts(delta?.content);
|
|
56
63
|
if (contentParts) applyContentParts(state, contentParts);
|
|
@@ -70,6 +70,13 @@ export function reportProgress(state, kind) {
|
|
|
70
70
|
} catch {}
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
/** Chunk metadata without output (a role-only delta): progress once the
|
|
74
|
+
* model has produced output; before that it neither ends the first-output
|
|
75
|
+
* phase nor starts the semantic idle (the chunk already reported transport). */
|
|
76
|
+
export function reportLifecycle(state, kind) {
|
|
77
|
+
if (state.semanticIdleDeadlineAt > 0) reportProgress(state, kind);
|
|
78
|
+
}
|
|
79
|
+
|
|
73
80
|
/** Text the model exposed: accumulate, refresh the idle deadline, relay live. */
|
|
74
81
|
export function appendText(state, text) {
|
|
75
82
|
state.content += text;
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
PROVIDER_SSE_IDLE_WATCHDOG_ENABLED,
|
|
11
11
|
PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS,
|
|
12
12
|
createTimeoutSignal,
|
|
13
|
+
providerFirstOutputTimeoutMs,
|
|
13
14
|
} from '../stall-policy.mjs';
|
|
14
15
|
import { TIMEOUT_PHASE } from '../../../shared/provider-timeout-phase.mjs';
|
|
15
16
|
import {
|
|
@@ -28,6 +29,7 @@ import {
|
|
|
28
29
|
toolWorkStarted,
|
|
29
30
|
} from './openai-compat-chat-stream/stream-state.mjs';
|
|
30
31
|
import { applyCompatChunk } from './openai-compat-chat-stream/chunk-events.mjs';
|
|
32
|
+
import { streamFirstOutputWindow } from './lib/first-output-window.mjs';
|
|
31
33
|
import { incompleteStreamError, settleCompatStream } from './openai-compat-chat-stream/stream-result.mjs';
|
|
32
34
|
|
|
33
35
|
export async function consumeCompatChatCompletionStream(
|
|
@@ -45,11 +47,20 @@ export async function consumeCompatChatCompletionStream(
|
|
|
45
47
|
semanticIdleTimeoutMs,
|
|
46
48
|
firstByteTimeoutMs,
|
|
47
49
|
leakedToolCallRecovery = true,
|
|
50
|
+
sessionId = null,
|
|
48
51
|
} = {}
|
|
49
52
|
) {
|
|
50
53
|
const idleOverrideEnabled = Number.isFinite(Number(semanticIdleTimeoutMs)) && Number(semanticIdleTimeoutMs) > 0;
|
|
51
54
|
const idleEnabled = idleOverrideEnabled || PROVIDER_SSE_IDLE_WATCHDOG_ENABLED;
|
|
52
55
|
const idleMs = idleOverrideEnabled ? Number(semanticIdleTimeoutMs) : PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS;
|
|
56
|
+
// Until the first semantic output the logical request's first-output window
|
|
57
|
+
// bounds the stream; a request that already had output runs under the
|
|
58
|
+
// semantic idle from the stream's opening.
|
|
59
|
+
const firstOutput = streamFirstOutputWindow({
|
|
60
|
+
sessionId,
|
|
61
|
+
onStreamDelta,
|
|
62
|
+
timeoutMs: providerFirstOutputTimeoutMs(idleMs),
|
|
63
|
+
});
|
|
53
64
|
const state = createCompatStreamState({
|
|
54
65
|
providerName,
|
|
55
66
|
knownToolNames,
|
|
@@ -60,6 +71,7 @@ export async function consumeCompatChatCompletionStream(
|
|
|
60
71
|
onStreamItemStart,
|
|
61
72
|
leakedToolCallRecovery,
|
|
62
73
|
});
|
|
74
|
+
if (firstOutput.outputSeen) state.semanticIdleDeadlineAt = Date.now() + idleMs;
|
|
63
75
|
reportTransport(state);
|
|
64
76
|
const iterator = stream[Symbol.asyncIterator]();
|
|
65
77
|
let iteratorDone = false;
|
|
@@ -72,9 +84,8 @@ export async function consumeCompatChatCompletionStream(
|
|
|
72
84
|
while (true) {
|
|
73
85
|
const { value: chunk, done } = await nextAsyncWithWatchdog(iterator, {
|
|
74
86
|
signal: state.sawFirstEvent ? signal : firstByteTimeout.signal,
|
|
75
|
-
idleMs,
|
|
76
|
-
|
|
77
|
-
idleEnabled: state.sawFirstEvent && idleEnabled && state.semanticIdleDeadlineAt > 0,
|
|
87
|
+
...firstOutput.idleWatch(state.semanticIdleDeadlineAt, idleMs),
|
|
88
|
+
idleEnabled: state.sawFirstEvent && idleEnabled,
|
|
78
89
|
idleLabel: `${label} SSE idle`,
|
|
79
90
|
streamLabel: label,
|
|
80
91
|
emittedToolCall: () => toolWorkStarted(state),
|
|
@@ -147,7 +147,8 @@ function settleMaxOutputIncomplete(event, state, ctx, reason) {
|
|
|
147
147
|
function onCreated(event, state, ctx) {
|
|
148
148
|
if (event.response?.model) state.model = event.response.model;
|
|
149
149
|
if (event.response?.id) state.responseId = event.response.id;
|
|
150
|
-
|
|
150
|
+
// Metadata, not output: progress only once the stream has seen output.
|
|
151
|
+
ctx.onLifecycle?.('semantic');
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
function onOutputTextDelta(event, state, ctx) {
|
|
@@ -196,7 +197,8 @@ function onOutputItemAdded(event, state, ctx) {
|
|
|
196
197
|
state.toolInFlight = true;
|
|
197
198
|
}
|
|
198
199
|
reportStreamItemStart(ctx.onStreamItemStart, responsesItemStart(event.item));
|
|
199
|
-
|
|
200
|
+
if (state.toolInFlight) signal(ctx, 'tool');
|
|
201
|
+
else ctx.onLifecycle?.('semantic');
|
|
200
202
|
}
|
|
201
203
|
|
|
202
204
|
// A tool call's args (or custom-tool input) are streaming — mark tool work
|
|
@@ -241,6 +241,7 @@ async function streamCompatResponses({ provider, params, label, signal, opts, he
|
|
|
241
241
|
return await consumeCompatResponsesStream(stream, {
|
|
242
242
|
signal: attemptSignal,
|
|
243
243
|
label,
|
|
244
|
+
sessionId: opts.sessionId,
|
|
244
245
|
onStreamDelta: opts.onStreamDelta,
|
|
245
246
|
onToolCall: opts.onToolCall,
|
|
246
247
|
onTextDelta: opts.onTextDelta,
|
|
@@ -168,9 +168,11 @@ export async function nextAsyncWithWatchdog(
|
|
|
168
168
|
}
|
|
169
169
|
// The SDK JSON-decodes each frame inside next(): a SyntaxError here is a
|
|
170
170
|
// malformed wire frame, typed at this boundary and nowhere else.
|
|
171
|
-
iterator
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
iterator
|
|
172
|
+
.next()
|
|
173
|
+
.then(resolve, (error) =>
|
|
174
|
+
reject(error instanceof SyntaxError ? malformedCompatStreamError(streamLabel || idleLabel, error) : error)
|
|
175
|
+
);
|
|
174
176
|
});
|
|
175
177
|
} catch (err) {
|
|
176
178
|
if (idleTimedOut)
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
PROVIDER_SSE_IDLE_WATCHDOG_ENABLED,
|
|
8
8
|
PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS,
|
|
9
9
|
createTimeoutSignal,
|
|
10
|
+
providerFirstOutputTimeoutMs,
|
|
10
11
|
} from '../stall-policy.mjs';
|
|
11
12
|
import {
|
|
12
13
|
closeCompatStream,
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
parseCompletedToolCallArgumentsJson,
|
|
24
25
|
} from './lib/openai-tool-args.mjs';
|
|
25
26
|
import { handleCompatResponsesStreamEvent } from './openai-compat-responses-events.mjs';
|
|
27
|
+
import { streamFirstOutputWindow } from './lib/first-output-window.mjs';
|
|
26
28
|
import {
|
|
27
29
|
attachPartialState,
|
|
28
30
|
createResponsesLeakRelay,
|
|
@@ -56,6 +58,7 @@ export async function consumeCompatResponsesStream(
|
|
|
56
58
|
responseOutputText,
|
|
57
59
|
knownToolNames,
|
|
58
60
|
semanticIdleTimeoutMs,
|
|
61
|
+
sessionId = null,
|
|
59
62
|
} = {}
|
|
60
63
|
) {
|
|
61
64
|
try {
|
|
@@ -68,13 +71,23 @@ export async function consumeCompatResponsesStream(
|
|
|
68
71
|
const idleEnabled = idleOverrideEnabled || PROVIDER_SSE_IDLE_WATCHDOG_ENABLED;
|
|
69
72
|
// Per-event (last-event-relative) SEMANTIC idle — see the Chat path note.
|
|
70
73
|
const idleMs = idleOverrideEnabled ? Number(semanticIdleTimeoutMs) : PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS;
|
|
74
|
+
// Until the first semantic output the logical request's first-output window
|
|
75
|
+
// bounds the stream; a request that already had output runs under the
|
|
76
|
+
// semantic idle from the stream's opening.
|
|
77
|
+
const firstOutput = streamFirstOutputWindow({
|
|
78
|
+
sessionId,
|
|
79
|
+
onStreamDelta,
|
|
80
|
+
timeoutMs: providerFirstOutputTimeoutMs(idleMs),
|
|
81
|
+
});
|
|
71
82
|
const state = createResponsesStreamState();
|
|
83
|
+
if (firstOutput.outputSeen) state.semanticIdleDeadlineAt = Date.now() + idleMs;
|
|
72
84
|
const reportProgress = (kind) => {
|
|
73
85
|
if (kind !== 'transport') state.semanticIdleDeadlineAt = Date.now() + idleMs;
|
|
74
86
|
try {
|
|
75
87
|
onStreamDelta?.(kind);
|
|
76
88
|
} catch {}
|
|
77
89
|
};
|
|
90
|
+
const reportLifecycle = (kind) => reportProgress(state.semanticIdleDeadlineAt > 0 ? kind : 'transport');
|
|
78
91
|
let sawFirstEvent = false;
|
|
79
92
|
const { relayLeakText, flushLeak, leakedCalls } = createResponsesLeakRelay({
|
|
80
93
|
state,
|
|
@@ -88,6 +101,7 @@ export async function consumeCompatResponsesStream(
|
|
|
88
101
|
parseResponsesToolCalls,
|
|
89
102
|
responseOutputText,
|
|
90
103
|
onStreamDelta: reportProgress,
|
|
104
|
+
onLifecycle: reportLifecycle,
|
|
91
105
|
onToolCall,
|
|
92
106
|
onTextDelta,
|
|
93
107
|
onStreamItemStart,
|
|
@@ -98,9 +112,8 @@ export async function consumeCompatResponsesStream(
|
|
|
98
112
|
while (true) {
|
|
99
113
|
const { value: event, done } = await nextAsyncWithWatchdog(iterator, {
|
|
100
114
|
signal: sawFirstEvent ? signal : firstByteTimeout.signal,
|
|
101
|
-
idleMs,
|
|
102
|
-
|
|
103
|
-
idleEnabled: sawFirstEvent && idleEnabled && state.semanticIdleDeadlineAt > 0,
|
|
115
|
+
...firstOutput.idleWatch(state.semanticIdleDeadlineAt, idleMs),
|
|
116
|
+
idleEnabled: sawFirstEvent && idleEnabled,
|
|
104
117
|
idleLabel: `${label} SSE idle`,
|
|
105
118
|
streamLabel: label,
|
|
106
119
|
// Unsafe-to-retry once any tool call (native or recovered-leaked)
|
|
@@ -131,6 +131,7 @@ export async function sendXaiResponses(provider, messages, useModel, tools, opts
|
|
|
131
131
|
return await consumeCompatResponsesStream(stream, {
|
|
132
132
|
signal: attemptSignal,
|
|
133
133
|
label: 'xai:responses',
|
|
134
|
+
sessionId: opts.sessionId,
|
|
134
135
|
onStreamDelta: opts.onStreamDelta,
|
|
135
136
|
onToolCall: opts.onToolCall,
|
|
136
137
|
onTextDelta: opts.onTextDelta,
|
|
@@ -15,7 +15,7 @@ function outputItemKind(item) {
|
|
|
15
15
|
return 'semantic';
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export function createOutputItemEvents({ state, items, meaningful }) {
|
|
18
|
+
export function createOutputItemEvents({ state, items, meaningful, lifecycle }) {
|
|
19
19
|
const { toolTracker } = state;
|
|
20
20
|
|
|
21
21
|
const onOutputItemAdded = (item) => {
|
|
@@ -52,7 +52,10 @@ export function createOutputItemEvents({ state, items, meaningful }) {
|
|
|
52
52
|
toolTracker.mark(item);
|
|
53
53
|
state.toolInFlight = true;
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
// A tool call starting is model output; an empty reasoning or message
|
|
56
|
+
// item is lifecycle (the silent thinking follows it).
|
|
57
|
+
if (state.toolInFlight) meaningful('tool');
|
|
58
|
+
else lifecycle('semantic');
|
|
56
59
|
};
|
|
57
60
|
|
|
58
61
|
const onToolInputDelta = (itemId) => {
|
package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs
CHANGED
|
@@ -7,18 +7,28 @@ import { createOutputItemEvents } from './response-events/output-items.mjs';
|
|
|
7
7
|
import { createTerminalFrameEvents } from './response-events/terminal-frames.mjs';
|
|
8
8
|
import { reportStreamItemStart, responsesItemStart } from '../lib/send-callbacks.mjs';
|
|
9
9
|
|
|
10
|
-
export function createResponseEvents({
|
|
11
|
-
|
|
10
|
+
export function createResponseEvents({
|
|
11
|
+
state,
|
|
12
|
+
items,
|
|
13
|
+
text,
|
|
14
|
+
outcome,
|
|
15
|
+
meaningful,
|
|
16
|
+
lifecycle,
|
|
17
|
+
onServerEvent,
|
|
18
|
+
onStreamItemStart,
|
|
19
|
+
}) {
|
|
20
|
+
const output = createOutputItemEvents({ state, items, meaningful, lifecycle });
|
|
12
21
|
const terminal = createTerminalFrameEvents({ state, items, text, outcome, meaningful });
|
|
13
22
|
|
|
14
23
|
const handleEvent = (event) => {
|
|
15
24
|
if (!event || typeof event.type !== 'string') return;
|
|
16
25
|
onServerEvent();
|
|
17
26
|
switch (event.type) {
|
|
27
|
+
// The server's ack is metadata, not model output: it satisfies only the
|
|
28
|
+
// first-server-event deadline (onServerEvent above).
|
|
18
29
|
case 'response.created':
|
|
19
30
|
if (event.response?.model) state.model = event.response.model;
|
|
20
31
|
if (event.response?.id) state.responseId = event.response.id;
|
|
21
|
-
meaningful('semantic');
|
|
22
32
|
break;
|
|
23
33
|
case 'response.output_text.delta':
|
|
24
34
|
text.relayLeakText(event.delta || '');
|
|
@@ -24,7 +24,8 @@ import { createResponseEvents } from './openai-http-sse-response-state/response-
|
|
|
24
24
|
* @param {(call: object) => void} [deps.onToolCall]
|
|
25
25
|
* @param {(text: string) => void} [deps.onTextDelta]
|
|
26
26
|
* @param {(kind: string) => void} deps.meaningful semantic progress (re-arms the idle watchdog)
|
|
27
|
-
* @param {() => void} deps.
|
|
27
|
+
* @param {(kind: string) => void} [deps.lifecycle] item lifecycle without output: progress only after semantic output
|
|
28
|
+
* @param {() => void} deps.onServerEvent any parsed server event (satisfies the first-server-event deadline)
|
|
28
29
|
* @param {(detail: object) => void} [deps.onStreamItemStart] a tool call or phased message started
|
|
29
30
|
*/
|
|
30
31
|
export function createHttpSseResponseState({
|
|
@@ -33,6 +34,7 @@ export function createHttpSseResponseState({
|
|
|
33
34
|
onTextDelta,
|
|
34
35
|
onStreamItemStart = null,
|
|
35
36
|
meaningful,
|
|
37
|
+
lifecycle = () => {},
|
|
36
38
|
onServerEvent,
|
|
37
39
|
label,
|
|
38
40
|
}) {
|
|
@@ -40,7 +42,16 @@ export function createHttpSseResponseState({
|
|
|
40
42
|
const outcome = createResponseOutcome({ state });
|
|
41
43
|
const items = createResponseItems({ state, onToolCall });
|
|
42
44
|
const text = createTextRelay({ state, body, onTextDelta, meaningful, emitToolCall: items.emitToolCall });
|
|
43
|
-
const events = createResponseEvents({
|
|
45
|
+
const events = createResponseEvents({
|
|
46
|
+
state,
|
|
47
|
+
items,
|
|
48
|
+
text,
|
|
49
|
+
outcome,
|
|
50
|
+
meaningful,
|
|
51
|
+
lifecycle,
|
|
52
|
+
onServerEvent,
|
|
53
|
+
onStreamItemStart,
|
|
54
|
+
});
|
|
44
55
|
|
|
45
56
|
return {
|
|
46
57
|
handleEvent: events.handleEvent,
|