mixdog 1.3.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/oh-my-pi-MIT.txt +23 -0
- package/NOTICE.md +17 -2
- package/README.md +11 -0
- package/package.json +3 -11
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/embed-google-oauth-client.mjs +49 -0
- package/scripts/gate-local.mjs +4 -2
- package/scripts/lib/test-spawn-ledger.mjs +46 -1
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +10 -1
- package/scripts/test.mjs +12 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +25 -1
- package/src/defaults/skills/browser-use/SKILL.md +77 -17
- 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 +33 -9
- package/src/defaults/skills/setup/SKILL.md +29 -2
- package/src/defaults/skills/setup/references/actions.md +117 -28
- package/src/defaults/skills/setup/references/surfaces.md +77 -35
- package/src/defaults/skills/setup-guide/SKILL.md +3 -3
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/keychain-cjs.cjs +359 -29
- package/src/lib/rules-builder.cjs +10 -8
- package/src/rules/agent/AGENT.md +6 -6
- package/src/rules/agent-mode/AGENT_MODE.md +10 -2
- package/src/rules/agent-mode/MIXY.md +12 -0
- package/src/rules/lead/LEAD.md +18 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +193 -0
- 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/config.mjs +34 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +177 -73
- package/src/runtime/agent/orchestrator/mcp/client.mjs +25 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +31 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +16 -3
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +42 -7
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +21 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +23 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +230 -137
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +64 -7
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +18 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- 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.mjs +160 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +52 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +22 -6
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +15 -4
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +17 -2
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +142 -104
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +10 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -217
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -6
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +409 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-families.mjs +187 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-identity.mjs +342 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-models.mjs +541 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-protobuf.mjs +305 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-request.mjs +558 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-schema.mjs +880 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-session.mjs +190 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-tool-args.mjs +351 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +560 -0
- package/src/runtime/agent/orchestrator/providers/devin.mjs +491 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/gemini-output-limit.mjs +46 -0
- package/src/runtime/agent/orchestrator/providers/gemini-reasoning-relay.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +7 -11
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +61 -22
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +71 -4
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +25 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +96 -5
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +23 -5
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -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 +19 -1
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +39 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +6 -1
- 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/opencode-go-gemini.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/provider-availability.mjs +19 -0
- 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 +43 -3
- 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/providers/wire-protobuf-codec.mjs +368 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- 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 +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/reaction-tool-defs.mjs +133 -0
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +23 -5
- package/src/runtime/agent/orchestrator/runtime-core/tool-profile.mjs +35 -10
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +57 -10
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +9 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +0 -3
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +10 -4
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +148 -25
- 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/eager-dispatch.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +47 -9
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +51 -3
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +10 -2
- 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 +14 -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 +10 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +23 -5
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +60 -0
- 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-commit.mjs +2 -0
- 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 +14 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -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 +23 -13
- 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 +129 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
- package/src/runtime/agent/orchestrator/session/message-ids.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/message-reactions.mjs +89 -0
- package/src/runtime/agent/orchestrator/session/message-reactions.test-support.mjs +75 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +0 -2
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +47 -11
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +20 -2
- 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-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-header-cache.mjs +85 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +133 -18
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +11 -5
- 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/tool-batch/state.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-batch.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +25 -2
- 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/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/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.mjs +25 -5
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- 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/schedule-errors.mjs +51 -0
- package/src/runtime/channels/lib/scheduler.mjs +135 -154
- package/src/runtime/channels/lib/schedules-db.mjs +83 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +14 -2
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- 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 +19 -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 +27 -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/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/com/com-adapter.mjs +17 -1
- package/src/runtime/office/com/office-com-host.ps1 +51 -1
- package/src/runtime/office/pdf/cfb-fixture.mjs +328 -0
- package/src/runtime/office/pdf/cfb-protection.mjs +311 -0
- package/src/runtime/office/pdf/document-preview.mjs +326 -8
- package/src/runtime/office/pdf/ooxml-crypto.mjs +469 -0
- package/src/runtime/office/pdf/ooxml-key-worker.mjs +14 -0
- package/src/runtime/office/portable/portable-soffice.mjs +45 -5
- 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-hops.mjs +62 -2
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +51 -35
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +33 -2
- package/src/runtime/shared/connector-catalog.mjs +166 -8
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -14
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/developer-options.mjs +32 -1
- package/src/runtime/shared/err-text.mjs +24 -15
- 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/google-oauth-client.generated.json +4 -0
- package/src/runtime/shared/google-oauth-client.mjs +34 -9
- 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 +104 -0
- package/src/runtime/shared/llm/anthropic-betas.mjs +7 -0
- package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +12 -0
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +1 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/llm/well-formed.mjs +66 -0
- package/src/runtime/shared/mixy-presence.mjs +22 -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 +231 -59
- package/src/runtime/shared/provider-api-key.mjs +19 -8
- 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 +52 -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 +34 -1
- 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-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +1 -14
- package/src/runtime/shared/transcript-metadata.mjs +38 -0
- package/src/runtime/shared/user-data-guard.mjs +30 -2
- package/src/runtime/shared/worktrees/activity-gate.mjs +12 -5
- package/src/runtime/shared/worktrees/test-support.mjs +9 -4
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +27 -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 +486 -179
- package/src/session-runtime/agent-room-delivery.mjs +28 -1
- package/src/session-runtime/agent-task-sessions.mjs +561 -199
- package/src/session-runtime/boot/apis.mjs +9 -0
- package/src/session-runtime/boot/begin.mjs +3 -2
- 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 +8 -1
- package/src/session-runtime/bot-chain.mjs +32 -0
- package/src/session-runtime/bot-status.mjs +7 -4
- package/src/session-runtime/channel-config-api.mjs +63 -17
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +45 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +72 -5
- package/src/session-runtime/internal-tool-executor.mjs +4 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
- 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 +61 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +927 -0
- package/src/session-runtime/model-route/route-tuning.mjs +10 -6
- 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 +35 -13
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- package/src/session-runtime/provider-auth/login.mjs +7 -0
- package/src/session-runtime/provider-models/row-hydration.mjs +13 -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/routine-home-turn.mjs +33 -6
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/schedule-session-run.mjs +7 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +8 -12
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- 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 +73 -31
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/channel-worker.mjs +1 -1
- package/src/session-runtime/services/provider-admin.mjs +128 -25
- package/src/session-runtime/services/schedule-access.mjs +14 -0
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/services/usage-dashboard-model.mjs +1 -0
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +8 -4
- 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 +28 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +187 -29
- package/src/session-runtime/setup-tool/extended-actions.mjs +33 -2
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +68 -6
- package/src/session-runtime/setup-tool/tool-defs.mjs +92 -6
- package/src/session-runtime/task-session-route.mjs +99 -0
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +21 -4
- package/src/session-runtime/tool-policy/surface-helpers.mjs +2 -3
- package/src/session-runtime/tool-surface.mjs +4 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +98 -21
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -1
- package/src/session-runtime/workspace/transitions.mjs +10 -2
- 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 +161 -157
- package/src/standalone/daemon.mjs +33 -2
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +10 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +6 -2
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- 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 +23 -2
- package/src/standalone/session-service/session-calls/session-turns.mjs +6 -0
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-service.mjs +13 -0
- package/src/standalone/session-tool-output.mjs +21 -10
- package/src/tui/app/model-options.mjs +4 -27
- package/src/tui/dist/index.mjs +81 -65
- 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 +23 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- package/src/tui/session/session-api/integrations.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +8 -0
- 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 +30 -2
- 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 +5 -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 +36 -3
- package/src/tui/session/turn.mjs +23 -2
- 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
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// Devin request identity and the session-token -> user JWT exchange.
|
|
2
|
+
import { isIP } from 'node:net';
|
|
3
|
+
import { DEVIN_ENUMS } from './devin-wire-protobuf.mjs';
|
|
4
|
+
import { DevinWireError, devinUnary } from './devin-wire-transport.mjs';
|
|
5
|
+
|
|
6
|
+
export const DEVIN_DEFAULT_BASE_URL = 'https://server.codeium.com';
|
|
7
|
+
export const DEVIN_GET_USER_JWT_PATH = '/exa.auth_pb.AuthService/GetUserJwt';
|
|
8
|
+
// Unary; metadata is `devinRequestMetadata({ apiKey })` with the apiKey the
|
|
9
|
+
// JWT exchange accepted and no userJwt. See AssignModelRequest.
|
|
10
|
+
export const DEVIN_ASSIGN_MODEL_PATH = '/exa.api_server_pb.ApiServerService/AssignModel';
|
|
11
|
+
export const DEVIN_SESSION_TOKEN_PREFIX = 'devin-session-token$';
|
|
12
|
+
|
|
13
|
+
const DEVIN_OS = { darwin: 'darwin', win32: 'windows' }[process.platform] ?? 'linux';
|
|
14
|
+
|
|
15
|
+
// Released CLI identity used for auth and chat. The backend gates the CLI
|
|
16
|
+
// model surface and router assignment on this tuple.
|
|
17
|
+
const CLI_IDENTITY = Object.freeze({
|
|
18
|
+
ideName: 'devin-cli',
|
|
19
|
+
ideType: 'chisel',
|
|
20
|
+
ideVersion: '3000.11.3',
|
|
21
|
+
extensionName: 'chisel',
|
|
22
|
+
extensionVersion: '3000.11.3',
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Dev-channel identity that unlocks the full native model config set.
|
|
26
|
+
const DISCOVERY_IDENTITY = Object.freeze({
|
|
27
|
+
ideName: 'chisel',
|
|
28
|
+
ideVersion: '0.0.0-dev',
|
|
29
|
+
extensionName: 'chisel',
|
|
30
|
+
extensionVersion: '0.0.0-dev',
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Editor identity under which legacy Windsurf Enterprise seats expose their
|
|
34
|
+
// full roster (with the raw, unprefixed key); sent without `os`.
|
|
35
|
+
const LEGACY_IDENTITY = Object.freeze({
|
|
36
|
+
ideName: 'windsurf',
|
|
37
|
+
ideVersion: '3.2.23',
|
|
38
|
+
extensionName: 'windsurf',
|
|
39
|
+
extensionVersion: '1.48.2',
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Display slots the native client advertises for discovery; UNSPECIFIED (0)
|
|
43
|
+
// is implicit. Asking for the internal slots returns the full catalog, which
|
|
44
|
+
// is then filtered client-side.
|
|
45
|
+
const { DisplayOption } = DEVIN_ENUMS;
|
|
46
|
+
export const DEVIN_SUPPORTED_MODEL_DISPLAYS = Object.freeze([
|
|
47
|
+
DisplayOption.MODEL_ROUTER,
|
|
48
|
+
DisplayOption.QUICK_REVIEW,
|
|
49
|
+
DisplayOption.INTERNAL_DEFAULT,
|
|
50
|
+
DisplayOption.UNCLASSIFIED,
|
|
51
|
+
DisplayOption.NORMAL,
|
|
52
|
+
]);
|
|
53
|
+
|
|
54
|
+
// The session token as the wire carries it: the scheme prefix is required.
|
|
55
|
+
export function normalizeDevinSessionToken(token) {
|
|
56
|
+
const value = String(token || '');
|
|
57
|
+
if (!value) return '';
|
|
58
|
+
return value.startsWith(DEVIN_SESSION_TOKEN_PREFIX) ? value : `${DEVIN_SESSION_TOKEN_PREFIX}${value}`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// `Metadata` for every Devin call. `apiKey` is sent exactly as given (use
|
|
62
|
+
// normalizeDevinSessionToken for session tokens). client: 'cli' (auth, chat),
|
|
63
|
+
// 'discovery' (GetCliModelConfigs) or 'legacy' (legacy discovery fallback).
|
|
64
|
+
export function devinRequestMetadata({ apiKey = '', userJwt = '', client = 'cli' } = {}) {
|
|
65
|
+
if (client === 'discovery') {
|
|
66
|
+
return {
|
|
67
|
+
apiKey,
|
|
68
|
+
...DISCOVERY_IDENTITY,
|
|
69
|
+
locale: 'en',
|
|
70
|
+
os: DEVIN_OS,
|
|
71
|
+
supportedModelDisplays: [...DEVIN_SUPPORTED_MODEL_DISPLAYS],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (client === 'legacy') return { apiKey, ...LEGACY_IDENTITY, locale: 'en' };
|
|
75
|
+
return { apiKey, userJwt, ...CLI_IDENTITY, locale: 'en', os: DEVIN_OS };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function isPrivateIPv4(address) {
|
|
79
|
+
const [a, b] = address.split('.').map(Number);
|
|
80
|
+
return (
|
|
81
|
+
a === 0 ||
|
|
82
|
+
a === 10 ||
|
|
83
|
+
a === 127 ||
|
|
84
|
+
(a === 100 && b >= 64 && b <= 127) ||
|
|
85
|
+
(a === 169 && b === 254) ||
|
|
86
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
87
|
+
(a === 192 && b === 168) ||
|
|
88
|
+
(a === 198 && (b === 18 || b === 19)) ||
|
|
89
|
+
a >= 224
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function isPrivateIPv6(address) {
|
|
94
|
+
const value = address.toLowerCase();
|
|
95
|
+
if (value === '::' || value === '::1') return true;
|
|
96
|
+
const mapped = value.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);
|
|
97
|
+
if (mapped) return isPrivateIPv4(mapped[1]);
|
|
98
|
+
// WHATWG URL serializes mapped IPv4 as hex groups (::ffff:7f00:1).
|
|
99
|
+
const mappedHex = value.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
|
|
100
|
+
if (mappedHex) {
|
|
101
|
+
const high = parseInt(mappedHex[1], 16);
|
|
102
|
+
const low = parseInt(mappedHex[2], 16);
|
|
103
|
+
return isPrivateIPv4(`${high >> 8}.${high & 255}.${low >> 8}.${low & 255}`);
|
|
104
|
+
}
|
|
105
|
+
return /^f[cd]/.test(value) || /^fe[89ab]/.test(value) || /^ff/.test(value);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function rejectApiHost(reason) {
|
|
109
|
+
return new DevinWireError(`Devin returned an unsafe API host: ${reason}`, {
|
|
110
|
+
code: 'protocol',
|
|
111
|
+
retryable: false,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Validates a server-supplied API host before any credential is sent to it.
|
|
116
|
+
// Only public https origins (optionally with a path) are accepted; returns
|
|
117
|
+
// the normalized base URL without a trailing slash.
|
|
118
|
+
export function validateDevinApiHost(value) {
|
|
119
|
+
let url;
|
|
120
|
+
try {
|
|
121
|
+
url = new URL(String(value || '').trim());
|
|
122
|
+
} catch {
|
|
123
|
+
throw rejectApiHost('not a URL');
|
|
124
|
+
}
|
|
125
|
+
if (url.protocol !== 'https:') throw rejectApiHost('https is required');
|
|
126
|
+
if (url.username || url.password) throw rejectApiHost('embedded credentials');
|
|
127
|
+
if (url.search || url.hash) throw rejectApiHost('query or fragment');
|
|
128
|
+
const hostname = url.hostname
|
|
129
|
+
.replace(/^\[|\]$/g, '')
|
|
130
|
+
.replace(/\.$/, '')
|
|
131
|
+
.toLowerCase();
|
|
132
|
+
if (!hostname) throw rejectApiHost('missing host');
|
|
133
|
+
const family = isIP(hostname);
|
|
134
|
+
if (family === 4 && isPrivateIPv4(hostname)) throw rejectApiHost('private address');
|
|
135
|
+
if (family === 6 && isPrivateIPv6(hostname)) throw rejectApiHost('private address');
|
|
136
|
+
if (!family) {
|
|
137
|
+
if (!hostname.includes('.')) throw rejectApiHost('single-label host');
|
|
138
|
+
if (/(?:^|\.)(?:localhost|local|internal|localdomain|home\.arpa)$/.test(hostname)) {
|
|
139
|
+
throw rejectApiHost('local host name');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return `${url.origin}${url.pathname.replace(/\/+$/, '')}`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function requestUserJwt({ apiKey, baseUrl, fetchFn, signal }) {
|
|
146
|
+
return devinUnary({
|
|
147
|
+
baseUrl,
|
|
148
|
+
path: DEVIN_GET_USER_JWT_PATH,
|
|
149
|
+
requestType: 'GetUserJwtRequest',
|
|
150
|
+
responseType: 'GetUserJwtResponse',
|
|
151
|
+
message: { metadata: devinRequestMetadata({ apiKey }) },
|
|
152
|
+
fetchFn,
|
|
153
|
+
signal,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Exchanges a Devin session token for the user JWT chat calls carry.
|
|
158
|
+
// Returns { jwt, apiKey, apiHost? }: `apiKey` is the wire key that was
|
|
159
|
+
// accepted (the prefixed session token, or the raw token for legacy keys),
|
|
160
|
+
// to be reused in `Metadata.apiKey`; `apiHost` is the validated per-account
|
|
161
|
+
// API server when the server names one.
|
|
162
|
+
export async function exchangeDevinUserJwt({
|
|
163
|
+
sessionToken,
|
|
164
|
+
fetchFn = fetch,
|
|
165
|
+
signal,
|
|
166
|
+
baseUrl = DEVIN_DEFAULT_BASE_URL,
|
|
167
|
+
}) {
|
|
168
|
+
const raw = String(sessionToken || '');
|
|
169
|
+
if (!raw) {
|
|
170
|
+
throw new DevinWireError('Devin session token is missing', { code: 'unauthenticated', status: 401 });
|
|
171
|
+
}
|
|
172
|
+
let apiKey = normalizeDevinSessionToken(raw);
|
|
173
|
+
let response;
|
|
174
|
+
try {
|
|
175
|
+
response = await requestUserJwt({ apiKey, baseUrl, fetchFn, signal });
|
|
176
|
+
} catch (error) {
|
|
177
|
+
// Raw API keys are rejected (HTTP 401) with the session prefix; retry them as-is.
|
|
178
|
+
if (!(error instanceof DevinWireError) || error.status !== 401 || raw === apiKey) throw error;
|
|
179
|
+
apiKey = raw;
|
|
180
|
+
response = await requestUserJwt({ apiKey, baseUrl, fetchFn, signal });
|
|
181
|
+
}
|
|
182
|
+
const jwt = String(response.userJwt || '');
|
|
183
|
+
if (!jwt) throw new DevinWireError('Devin GetUserJwt returned no user JWT', { code: 'protocol' });
|
|
184
|
+
const customHost = String(response.customApiServerUrl || '').trim();
|
|
185
|
+
return {
|
|
186
|
+
jwt,
|
|
187
|
+
apiKey,
|
|
188
|
+
...(customHost ? { apiHost: validateDevinApiHost(customHost) } : {}),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
// Final parse of a Devin tool call's streamed arguments.
|
|
2
|
+
//
|
|
3
|
+
// Empty or whitespace-only arguments are `{}` (zero-argument tools may omit
|
|
4
|
+
// them). Valid JSON parses as is; otherwise a tolerant grammar repairs the
|
|
5
|
+
// common model malformations:
|
|
6
|
+
// - single-quoted strings and unquoted object keys;
|
|
7
|
+
// - stray / doubled / trailing commas, `//` and block comments;
|
|
8
|
+
// - Python `True` / `False` / `None`, relaxed numbers (`+1`, `.5`, `0x1f`);
|
|
9
|
+
// - invalid `\x` escapes kept literally;
|
|
10
|
+
// - an apostrophe inside a single-quoted string (`'it's'`) stays content;
|
|
11
|
+
// - an unquoted string value (`{"paths": src/*}`) up to `,` `}` `]` or newline.
|
|
12
|
+
// Truncated input, trailing garbage, non-finite numbers and barewords that
|
|
13
|
+
// could swallow a sibling field still fail: the call then carries Mixdog's
|
|
14
|
+
// invalid-arguments marker and never runs with half-formed arguments.
|
|
15
|
+
import { makeInvalidToolArgsMarker } from './lib/openai-tool-args.mjs';
|
|
16
|
+
|
|
17
|
+
const QUOTE = 0x22;
|
|
18
|
+
const SQUOTE = 0x27;
|
|
19
|
+
const BACKSLASH = 0x5c;
|
|
20
|
+
const SLASH = 0x2f;
|
|
21
|
+
const COLON = 0x3a;
|
|
22
|
+
const COMMA = 0x2c;
|
|
23
|
+
const LBRACE = 0x7b;
|
|
24
|
+
const RBRACE = 0x7d;
|
|
25
|
+
const LBRACKET = 0x5b;
|
|
26
|
+
const RBRACKET = 0x5d;
|
|
27
|
+
|
|
28
|
+
const KEYWORDS = Object.freeze([
|
|
29
|
+
['true', true],
|
|
30
|
+
['false', false],
|
|
31
|
+
['null', null],
|
|
32
|
+
['True', true],
|
|
33
|
+
['False', false],
|
|
34
|
+
['None', null],
|
|
35
|
+
]);
|
|
36
|
+
// Atoms never recovered as strings: a tool must not run with a non-finite or
|
|
37
|
+
// undefined value posing as text.
|
|
38
|
+
const NON_RECOVERABLE_BAREWORDS = new Set(['NaN', 'Infinity', '-Infinity', '+Infinity', 'undefined']);
|
|
39
|
+
const SIMPLE_ESCAPES = Object.freeze({
|
|
40
|
+
[QUOTE]: '"',
|
|
41
|
+
[SQUOTE]: "'",
|
|
42
|
+
[BACKSLASH]: '\\',
|
|
43
|
+
[SLASH]: '/',
|
|
44
|
+
98: '\b',
|
|
45
|
+
102: '\f',
|
|
46
|
+
110: '\n',
|
|
47
|
+
114: '\r',
|
|
48
|
+
116: '\t',
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const isWhitespace = (cp) => cp === 0x20 || cp === 0x09 || cp === 0x0a || cp === 0x0d;
|
|
52
|
+
const isHexDigit = (cp) => (cp >= 0x30 && cp <= 0x39) || ((cp | 0x20) >= 0x61 && (cp | 0x20) <= 0x66);
|
|
53
|
+
const isIdentChar = (cp) =>
|
|
54
|
+
(cp >= 0x30 && cp <= 0x39) || ((cp | 0x20) >= 0x61 && (cp | 0x20) <= 0x7a) || cp === 0x5f || cp === 0x24;
|
|
55
|
+
const isNumberStart = (cp) => cp === 0x2d || cp === 0x2b || cp === 0x2e || (cp >= 0x30 && cp <= 0x39);
|
|
56
|
+
const isNumberChar = (cp) =>
|
|
57
|
+
(cp >= 0x30 && cp <= 0x39) ||
|
|
58
|
+
cp === 0x2d ||
|
|
59
|
+
cp === 0x2b ||
|
|
60
|
+
cp === 0x2e ||
|
|
61
|
+
((cp | 0x20) >= 0x61 && (cp | 0x20) <= 0x66) ||
|
|
62
|
+
(cp | 0x20) === 0x78;
|
|
63
|
+
|
|
64
|
+
// The first index at or after `i` past whitespace and comments.
|
|
65
|
+
function skipInsignificant(s, i) {
|
|
66
|
+
const n = s.length;
|
|
67
|
+
for (;;) {
|
|
68
|
+
while (i < n && isWhitespace(s.charCodeAt(i))) i += 1;
|
|
69
|
+
if (i + 1 < n && s.charCodeAt(i) === SLASH) {
|
|
70
|
+
const next = s.charCodeAt(i + 1);
|
|
71
|
+
if (next === SLASH) {
|
|
72
|
+
i += 2;
|
|
73
|
+
while (i < n && s.charCodeAt(i) !== 0x0a) i += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (next === 0x2a) {
|
|
77
|
+
i += 2;
|
|
78
|
+
while (i + 1 < n && !(s.charCodeAt(i) === 0x2a && s.charCodeAt(i + 1) === SLASH)) i += 1;
|
|
79
|
+
i = Math.min(i + 2, n);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return i;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function hex4(s, pos) {
|
|
88
|
+
if (pos + 4 > s.length) return -1;
|
|
89
|
+
for (let k = pos; k < pos + 4; k += 1) if (!isHexDigit(s.charCodeAt(k))) return -1;
|
|
90
|
+
return Number.parseInt(s.slice(pos, pos + 4), 16);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function setOwn(target, key, value) {
|
|
94
|
+
Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
class TolerantJsonParser {
|
|
98
|
+
constructor(src) {
|
|
99
|
+
this.src = src;
|
|
100
|
+
this.pos = 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
peek() {
|
|
104
|
+
return this.src.charCodeAt(this.pos);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
get atEnd() {
|
|
108
|
+
return this.pos >= this.src.length;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
ws() {
|
|
112
|
+
this.pos = skipInsignificant(this.src, this.pos);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
fail(message) {
|
|
116
|
+
throw new SyntaxError(message);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
parse() {
|
|
120
|
+
this.ws();
|
|
121
|
+
if (this.atEnd) this.fail('Unexpected end of JSON input');
|
|
122
|
+
const value = this.value(false);
|
|
123
|
+
this.ws();
|
|
124
|
+
if (!this.atEnd) this.fail(`Unexpected trailing characters at position ${this.pos}`);
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
value(allowBareword) {
|
|
129
|
+
const c = this.peek();
|
|
130
|
+
if (c === LBRACE) return this.object();
|
|
131
|
+
if (c === LBRACKET) return this.array();
|
|
132
|
+
if (c === QUOTE || c === SQUOTE) return this.string(c);
|
|
133
|
+
if (isNumberStart(c)) return this.number();
|
|
134
|
+
const keyword = this.keyword();
|
|
135
|
+
if (keyword !== undefined) return keyword;
|
|
136
|
+
if (allowBareword) return this.bareword();
|
|
137
|
+
return this.fail(`Unexpected token at position ${this.pos}`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
object() {
|
|
141
|
+
this.pos += 1;
|
|
142
|
+
const out = {};
|
|
143
|
+
for (;;) {
|
|
144
|
+
this.ws();
|
|
145
|
+
if (this.atEnd) this.fail('Unterminated object');
|
|
146
|
+
const c = this.peek();
|
|
147
|
+
if (c === RBRACE) {
|
|
148
|
+
this.pos += 1;
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
if (c === COMMA) {
|
|
152
|
+
this.pos += 1;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const key = this.key();
|
|
156
|
+
this.ws();
|
|
157
|
+
if (this.peek() !== COLON) this.fail("Expected ':' in object");
|
|
158
|
+
this.pos += 1;
|
|
159
|
+
this.ws();
|
|
160
|
+
if (this.atEnd) this.fail("Expected value after ':'");
|
|
161
|
+
setOwn(out, key, this.value(true));
|
|
162
|
+
this.ws();
|
|
163
|
+
const d = this.peek();
|
|
164
|
+
if (d === COMMA) {
|
|
165
|
+
this.pos += 1;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (d === RBRACE) {
|
|
169
|
+
this.pos += 1;
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
this.fail("Expected ',' or '}' in object");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
array() {
|
|
177
|
+
this.pos += 1;
|
|
178
|
+
const out = [];
|
|
179
|
+
for (;;) {
|
|
180
|
+
this.ws();
|
|
181
|
+
if (this.atEnd) this.fail('Unterminated array');
|
|
182
|
+
const c = this.peek();
|
|
183
|
+
if (c === RBRACKET) {
|
|
184
|
+
this.pos += 1;
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
if (c === COMMA) {
|
|
188
|
+
this.pos += 1;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
out.push(this.value(true));
|
|
192
|
+
this.ws();
|
|
193
|
+
const d = this.peek();
|
|
194
|
+
if (d === COMMA) {
|
|
195
|
+
this.pos += 1;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (d === RBRACKET) {
|
|
199
|
+
this.pos += 1;
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
this.fail("Expected ',' or ']' in array");
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
key() {
|
|
207
|
+
const c = this.peek();
|
|
208
|
+
if (c === QUOTE || c === SQUOTE) return this.string(c);
|
|
209
|
+
const s = this.src;
|
|
210
|
+
const start = this.pos;
|
|
211
|
+
while (this.pos < s.length) {
|
|
212
|
+
const cc = s.charCodeAt(this.pos);
|
|
213
|
+
if (cc === COLON || cc === COMMA || cc === RBRACE || isWhitespace(cc)) break;
|
|
214
|
+
this.pos += 1;
|
|
215
|
+
}
|
|
216
|
+
if (this.pos === start) this.fail('Expected object key');
|
|
217
|
+
return s.slice(start, this.pos);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// A single quote closes only before a value terminator (or the end), so an
|
|
221
|
+
// apostrophe stays content; a double quote always closes.
|
|
222
|
+
closesSingleQuote(from) {
|
|
223
|
+
const k = skipInsignificant(this.src, from);
|
|
224
|
+
if (k >= this.src.length) return true;
|
|
225
|
+
const c = this.src.charCodeAt(k);
|
|
226
|
+
return c === COMMA || c === RBRACE || c === RBRACKET || c === COLON;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
string(quote) {
|
|
230
|
+
const s = this.src;
|
|
231
|
+
const n = s.length;
|
|
232
|
+
let i = this.pos + 1;
|
|
233
|
+
let out = '';
|
|
234
|
+
let runStart = i;
|
|
235
|
+
while (i < n) {
|
|
236
|
+
const cc = s.charCodeAt(i);
|
|
237
|
+
if (cc === quote) {
|
|
238
|
+
if (quote === QUOTE || this.closesSingleQuote(i + 1)) {
|
|
239
|
+
out += s.slice(runStart, i);
|
|
240
|
+
this.pos = i + 1;
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
i += 1;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (cc !== BACKSLASH) {
|
|
247
|
+
i += 1;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
out += s.slice(runStart, i);
|
|
251
|
+
i += 1;
|
|
252
|
+
if (i >= n) break;
|
|
253
|
+
const esc = s.charCodeAt(i);
|
|
254
|
+
if (SIMPLE_ESCAPES[esc] !== undefined) {
|
|
255
|
+
out += SIMPLE_ESCAPES[esc];
|
|
256
|
+
} else if (esc === 0x75) {
|
|
257
|
+
const unit = hex4(s, i + 1);
|
|
258
|
+
if (unit >= 0) {
|
|
259
|
+
out += String.fromCharCode(unit);
|
|
260
|
+
i += 4;
|
|
261
|
+
} else {
|
|
262
|
+
out += '\\u';
|
|
263
|
+
}
|
|
264
|
+
} else {
|
|
265
|
+
out += `\\${s[i]}`;
|
|
266
|
+
}
|
|
267
|
+
i += 1;
|
|
268
|
+
runStart = i;
|
|
269
|
+
}
|
|
270
|
+
return this.fail('Unterminated string');
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
number() {
|
|
274
|
+
const s = this.src;
|
|
275
|
+
const start = this.pos;
|
|
276
|
+
while (this.pos < s.length && isNumberChar(s.charCodeAt(this.pos))) this.pos += 1;
|
|
277
|
+
const token = s.slice(start, this.pos);
|
|
278
|
+
const value = Number(token);
|
|
279
|
+
if (!Number.isFinite(value)) this.fail(`Invalid number: ${token}`);
|
|
280
|
+
return value;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
keyword() {
|
|
284
|
+
for (const [word, value] of KEYWORDS) {
|
|
285
|
+
if (this.src.startsWith(word, this.pos) && !isIdentChar(this.src.charCodeAt(this.pos + word.length))) {
|
|
286
|
+
this.pos += word.length;
|
|
287
|
+
return value;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// An unquoted value up to `,` `}` `]` or a newline, trailing space trimmed.
|
|
294
|
+
// It fails at the end of input and on `"`, `{`, `[` or a key-like `:`
|
|
295
|
+
// (a missed comma must not swallow the next field); `:/` and `:\` stay
|
|
296
|
+
// literal so URLs and Windows paths recover.
|
|
297
|
+
bareword() {
|
|
298
|
+
const s = this.src;
|
|
299
|
+
const start = this.pos;
|
|
300
|
+
let i = start;
|
|
301
|
+
while (i < s.length) {
|
|
302
|
+
const cc = s.charCodeAt(i);
|
|
303
|
+
if (cc === COMMA || cc === RBRACE || cc === RBRACKET || cc === 0x0a || cc === 0x0d) break;
|
|
304
|
+
const next = s.charCodeAt(i + 1);
|
|
305
|
+
if (cc === QUOTE || cc === LBRACE || cc === LBRACKET || (cc === COLON && next !== SLASH && next !== BACKSLASH)) {
|
|
306
|
+
return this.fail(`Unexpected token at position ${start}`);
|
|
307
|
+
}
|
|
308
|
+
i += 1;
|
|
309
|
+
}
|
|
310
|
+
if (i >= s.length) return this.fail(`Unexpected token at position ${start}`);
|
|
311
|
+
let end = i;
|
|
312
|
+
while (end > start && isWhitespace(s.charCodeAt(end - 1))) end -= 1;
|
|
313
|
+
const word = s.slice(start, end);
|
|
314
|
+
if (NON_RECOVERABLE_BAREWORDS.has(word)) return this.fail(`Unexpected token at position ${start}`);
|
|
315
|
+
this.pos = i;
|
|
316
|
+
return word;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/** A JSON value with the common model malformations repaired; throws when unrepairable. */
|
|
321
|
+
export function parseDevinJsonWithRepair(json) {
|
|
322
|
+
try {
|
|
323
|
+
return JSON.parse(json);
|
|
324
|
+
} catch {
|
|
325
|
+
return new TolerantJsonParser(json).parse();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/** Final tool-call arguments: `{}` when empty, else repaired JSON, else the invalid-arguments marker. */
|
|
330
|
+
export function parseDevinToolArguments(raw) {
|
|
331
|
+
const text = typeof raw === 'string' ? raw : String(raw ?? '');
|
|
332
|
+
if (!text.trim()) return {};
|
|
333
|
+
try {
|
|
334
|
+
return parseDevinJsonWithRepair(text);
|
|
335
|
+
} catch (error) {
|
|
336
|
+
return makeInvalidToolArgsMarker(text, error instanceof Error ? error.message : String(error));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/** parseToolCalls for the compat stream consumer, with Devin's final argument parse. */
|
|
341
|
+
export function parseDevinToolCalls(choice) {
|
|
342
|
+
const calls = choice?.message?.tool_calls;
|
|
343
|
+
if (!calls?.length) return undefined;
|
|
344
|
+
return calls
|
|
345
|
+
.filter((call) => call.type === 'function')
|
|
346
|
+
.map((call) => ({
|
|
347
|
+
id: call.id,
|
|
348
|
+
name: call.function.name,
|
|
349
|
+
arguments: parseDevinToolArguments(call.function.arguments),
|
|
350
|
+
}));
|
|
351
|
+
}
|