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,368 @@
|
|
|
1
|
+
// Schema-driven protobuf wire codec shared by the handwritten provider wires.
|
|
2
|
+
//
|
|
3
|
+
// A schema table maps message type names to `protobufFields([...])` rows of
|
|
4
|
+
// `[name, fieldNo, type, options]`. Types are scalars ('string', 'bytes',
|
|
5
|
+
// 'raw', 'bool', 'int', 'uint', 'double', 'float'), another message type name
|
|
6
|
+
// from the same table, or `mapOf(keyType, valueType)`. Options:
|
|
7
|
+
// repeated — the field is an array (numeric ones packed only when the
|
|
8
|
+
// codec is created with `packed: true`).
|
|
9
|
+
// presence — explicit presence (proto3 `optional` / oneof member): the value
|
|
10
|
+
// is written even when it equals the type default.
|
|
11
|
+
// 'int' covers int32/int64/enum (two's-complement varint); 'uint' covers
|
|
12
|
+
// uint32/uint64. Both decode to number.
|
|
13
|
+
// Width-specific varint types follow protobuf's per-width rules instead:
|
|
14
|
+
// 'int32' / 'enum' — integer number, truncated to 32 bits; decodes to number.
|
|
15
|
+
// 'uint32' — non-negative integer number, truncated to 32 bits; a
|
|
16
|
+
// varint longer than 5 bytes is rejected; decodes to number.
|
|
17
|
+
// 'int64' — bigint, integer number or decimal string, truncated to
|
|
18
|
+
// 64 bits; decodes to a signed bigint.
|
|
19
|
+
// 'uint64' — as int64 but negative input is rejected; decodes to an
|
|
20
|
+
// unsigned bigint.
|
|
21
|
+
// Decoded objects carry only fields seen on the wire, plus `$unknown` for
|
|
22
|
+
// unrecognised fields.
|
|
23
|
+
|
|
24
|
+
export function protobufFields(entries) {
|
|
25
|
+
return Object.fromEntries(entries.map(([name, no, type, options = {}]) => [no, { name, no, type, ...options }]));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const mapOf = (key, value) => ({ map: [key, value] });
|
|
29
|
+
export const repeated = Object.freeze({ repeated: true });
|
|
30
|
+
export const presence = Object.freeze({ presence: true });
|
|
31
|
+
|
|
32
|
+
const textEncoder = new TextEncoder();
|
|
33
|
+
const WIDTH_TYPES = new Set(['int32', 'enum', 'uint32', 'int64', 'uint64']);
|
|
34
|
+
const PACKABLE_TYPES = new Set(['bool', 'int', 'uint', 'double', 'float', ...WIDTH_TYPES]);
|
|
35
|
+
|
|
36
|
+
export function concatBytes(parts) {
|
|
37
|
+
const length = parts.reduce((sum, part) => sum + part.length, 0);
|
|
38
|
+
const output = new Uint8Array(length);
|
|
39
|
+
let offset = 0;
|
|
40
|
+
for (const part of parts) {
|
|
41
|
+
output.set(part, offset);
|
|
42
|
+
offset += part.length;
|
|
43
|
+
}
|
|
44
|
+
return output;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function encodeVarint(value) {
|
|
48
|
+
let current = BigInt(value ?? 0);
|
|
49
|
+
if (current < 0) current = BigInt.asUintN(64, current);
|
|
50
|
+
const bytes = [];
|
|
51
|
+
do {
|
|
52
|
+
let byte = Number(current & 0x7fn);
|
|
53
|
+
current >>= 7n;
|
|
54
|
+
if (current) byte |= 0x80;
|
|
55
|
+
bytes.push(byte);
|
|
56
|
+
} while (current);
|
|
57
|
+
return Uint8Array.from(bytes);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function encodeTag(no, wireType) {
|
|
61
|
+
return encodeVarint((BigInt(no) << 3n) | BigInt(wireType));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function isDefaultScalar(value) {
|
|
65
|
+
if (value === 0 || value === 0n || value === false || value === '') return true;
|
|
66
|
+
return value instanceof Uint8Array && value.length === 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// `label` prefixes every error ("Cursor protobuf"). `strict` rejects wire-type
|
|
70
|
+
// mismatches, field number 0, malformed UTF-8, varints longer than 10 bytes and
|
|
71
|
+
// truncated fixed-width values instead of decoding them leniently.
|
|
72
|
+
// `omitDefaults` skips proto3 implicit-presence fields that hold their type
|
|
73
|
+
// default, which yields canonical proto3 bytes; repeated elements are always
|
|
74
|
+
// written, defaults included. `packed` encodes repeated numeric fields packed
|
|
75
|
+
// and decodes them from either packed or unpacked wire form.
|
|
76
|
+
export function createProtobufCodec(
|
|
77
|
+
schemas,
|
|
78
|
+
{ label = 'protobuf', strict = false, omitDefaults = false, packed = false } = {}
|
|
79
|
+
) {
|
|
80
|
+
// A protobuf string is data, not a text document with a disposable BOM.
|
|
81
|
+
const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: strict });
|
|
82
|
+
|
|
83
|
+
const isMessageType = (type) => typeof type === 'string' && Object.hasOwn(schemas, type);
|
|
84
|
+
|
|
85
|
+
function wireTypeFor(type) {
|
|
86
|
+
if (type === 'double') return 1;
|
|
87
|
+
if (type === 'float') return 5;
|
|
88
|
+
if (type?.map || ['string', 'bytes', 'raw'].includes(type) || isMessageType(type)) return 2;
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function scalarBytes(type, value) {
|
|
93
|
+
if (type === 'string') return textEncoder.encode(String(value));
|
|
94
|
+
if (type === 'bytes' || type === 'raw') return value instanceof Uint8Array ? value : new Uint8Array(value);
|
|
95
|
+
if (type === 'double' || type === 'float') {
|
|
96
|
+
const size = type === 'double' ? 8 : 4;
|
|
97
|
+
const buffer = new ArrayBuffer(size);
|
|
98
|
+
const view = new DataView(buffer);
|
|
99
|
+
if (size === 8) view.setFloat64(0, Number(value), true);
|
|
100
|
+
else view.setFloat32(0, Number(value), true);
|
|
101
|
+
return new Uint8Array(buffer);
|
|
102
|
+
}
|
|
103
|
+
if (type === 'bool') return encodeVarint(value ? 1 : 0);
|
|
104
|
+
if (type === 'int' || type === 'uint') return encodeVarint(value);
|
|
105
|
+
if (WIDTH_TYPES.has(type)) return encodeVarint(BigInt.asUintN(64, BigInt(widthValue(type, value))));
|
|
106
|
+
if (isMessageType(type)) return encodeMessage(type, value);
|
|
107
|
+
throw new Error(`Unknown ${label} type: ${type}`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Validated, width-truncated value of a width-specific varint field.
|
|
111
|
+
function widthValue(type, value) {
|
|
112
|
+
if (type === 'int64' || type === 'uint64') {
|
|
113
|
+
let big;
|
|
114
|
+
if (typeof value === 'bigint') big = value;
|
|
115
|
+
else if (typeof value === 'number' && Number.isInteger(value)) big = BigInt(value);
|
|
116
|
+
else if (typeof value === 'string') {
|
|
117
|
+
try {
|
|
118
|
+
big = BigInt(value);
|
|
119
|
+
} catch {
|
|
120
|
+
// Reported below with the field type.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (big === undefined) throw new Error(`Invalid ${label} ${type} value: ${typeof value}`);
|
|
124
|
+
if (type === 'uint64' && big < 0n) throw new Error(`Invalid ${label} uint64 value: negative`);
|
|
125
|
+
return big;
|
|
126
|
+
}
|
|
127
|
+
if (typeof value !== 'number' || !Number.isInteger(value)) {
|
|
128
|
+
throw new Error(`Invalid ${label} ${type} value: ${typeof value}`);
|
|
129
|
+
}
|
|
130
|
+
if (type === 'uint32') {
|
|
131
|
+
if (value < 0) throw new Error(`Invalid ${label} uint32 value: negative`);
|
|
132
|
+
return value >>> 0;
|
|
133
|
+
}
|
|
134
|
+
return value | 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function shouldWrite(type, value) {
|
|
138
|
+
if (value == null) return false;
|
|
139
|
+
if (WIDTH_TYPES.has(type)) return !(omitDefaults && BigInt(widthValue(type, value)) === 0n);
|
|
140
|
+
if (type === 'string') return value !== '';
|
|
141
|
+
if (omitDefaults && !isMessageType(type)) return !isDefaultScalar(value);
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function encodeField(no, type, value) {
|
|
146
|
+
const wireType = wireTypeFor(type);
|
|
147
|
+
const payload = scalarBytes(type, value);
|
|
148
|
+
if (wireType === 2) return concatBytes([encodeTag(no, wireType), encodeVarint(payload.length), payload]);
|
|
149
|
+
return concatBytes([encodeTag(no, wireType), payload]);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function encodeMapField(no, [keyType, valueType], value) {
|
|
153
|
+
const parts = [];
|
|
154
|
+
for (const [key, entryValue] of Object.entries(value || {})) {
|
|
155
|
+
const entry = concatBytes([encodeField(1, keyType, key), encodeField(2, valueType, entryValue)]);
|
|
156
|
+
parts.push(concatBytes([encodeTag(no, 2), encodeVarint(entry.length), entry]));
|
|
157
|
+
}
|
|
158
|
+
return parts;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function encodeMessage(type, value = {}) {
|
|
162
|
+
const schema = schemas[type];
|
|
163
|
+
if (!schema) throw new Error(`Unknown ${label} message: ${type}`);
|
|
164
|
+
const parts = [];
|
|
165
|
+
for (const descriptor of Object.values(schema)) {
|
|
166
|
+
const fieldValue = value[descriptor.name];
|
|
167
|
+
if (descriptor.type?.map) {
|
|
168
|
+
parts.push(...encodeMapField(descriptor.no, descriptor.type.map, fieldValue));
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
let values = [fieldValue];
|
|
172
|
+
if (descriptor.repeated) {
|
|
173
|
+
values = Array.isArray(fieldValue) ? fieldValue : [];
|
|
174
|
+
if (packed && PACKABLE_TYPES.has(descriptor.type)) {
|
|
175
|
+
if (values.length) {
|
|
176
|
+
const payload = concatBytes(values.map((item) => scalarBytes(descriptor.type, item)));
|
|
177
|
+
parts.push(concatBytes([encodeTag(descriptor.no, 2), encodeVarint(payload.length), payload]));
|
|
178
|
+
}
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
for (const item of values) {
|
|
183
|
+
// A oneof's explicit empty string is a value, not an absent field;
|
|
184
|
+
// canonical proto3 keeps every repeated element.
|
|
185
|
+
const explicit = descriptor.presence || (omitDefaults && descriptor.repeated);
|
|
186
|
+
if ((explicit && item != null) || shouldWrite(descriptor.type, item)) {
|
|
187
|
+
parts.push(encodeField(descriptor.no, descriptor.type, item));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return concatBytes(parts);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
class ProtoReader {
|
|
195
|
+
constructor(bytes) {
|
|
196
|
+
this.bytes = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
197
|
+
this.offset = 0;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
get done() {
|
|
201
|
+
return this.offset >= this.bytes.length;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
varint() {
|
|
205
|
+
let value = 0n;
|
|
206
|
+
let shift = 0n;
|
|
207
|
+
while (!this.done) {
|
|
208
|
+
const byte = this.bytes[this.offset++];
|
|
209
|
+
value |= BigInt(byte & 0x7f) << shift;
|
|
210
|
+
if ((byte & 0x80) === 0) return value;
|
|
211
|
+
shift += 7n;
|
|
212
|
+
if (shift > (strict ? 63n : 70n)) throw new Error(`Invalid ${label} varint`);
|
|
213
|
+
}
|
|
214
|
+
throw new Error(`Truncated ${label} varint`);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// A 32-bit varint: at most 5 bytes, bits past 32 dropped.
|
|
218
|
+
varint32() {
|
|
219
|
+
let value = 0n;
|
|
220
|
+
for (let index = 0; index < 5; index++) {
|
|
221
|
+
if (this.done) throw new Error(`Truncated ${label} varint`);
|
|
222
|
+
const byte = this.bytes[this.offset++];
|
|
223
|
+
value |= BigInt(byte & 0x7f) << BigInt(7 * index);
|
|
224
|
+
if ((byte & 0x80) === 0) return Number(value & 0xffffffffn);
|
|
225
|
+
}
|
|
226
|
+
throw new Error(`Invalid ${label} 32-bit varint`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
take(length) {
|
|
230
|
+
const end = this.offset + length;
|
|
231
|
+
if (end > this.bytes.length) throw new Error(`Truncated ${label} field`);
|
|
232
|
+
const value = this.bytes.subarray(this.offset, end);
|
|
233
|
+
this.offset = end;
|
|
234
|
+
return value;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
bytesValue() {
|
|
238
|
+
return this.take(Number(this.varint()));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
skip(wireType) {
|
|
242
|
+
if (wireType === 0) this.varint();
|
|
243
|
+
else if (wireType === 1) this.take(8);
|
|
244
|
+
else if (wireType === 2) this.bytesValue();
|
|
245
|
+
else if (wireType === 5) this.take(4);
|
|
246
|
+
else throw new Error(`Unsupported ${label} wire type: ${wireType}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function decodeString(bytes) {
|
|
251
|
+
try {
|
|
252
|
+
return textDecoder.decode(bytes);
|
|
253
|
+
} catch (error) {
|
|
254
|
+
throw new Error(`Invalid ${label} UTF-8 string`, { cause: error });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function decodeScalar(reader, type, wireType) {
|
|
259
|
+
if (type === 'string') return decodeString(reader.bytesValue());
|
|
260
|
+
if (type === 'bytes' || type === 'raw') return new Uint8Array(reader.bytesValue());
|
|
261
|
+
if (type === 'double') {
|
|
262
|
+
if (wireType !== 1) throw new Error(`Invalid ${label} double`);
|
|
263
|
+
if (strict) {
|
|
264
|
+
const bytes = reader.take(8);
|
|
265
|
+
return new DataView(bytes.buffer, bytes.byteOffset, 8).getFloat64(0, true);
|
|
266
|
+
}
|
|
267
|
+
// Lenient read: the view is bounded by the backing buffer only.
|
|
268
|
+
const value = new DataView(reader.bytes.buffer, reader.bytes.byteOffset + reader.offset, 8).getFloat64(0, true);
|
|
269
|
+
reader.offset += 8;
|
|
270
|
+
return value;
|
|
271
|
+
}
|
|
272
|
+
if (type === 'float') {
|
|
273
|
+
if (wireType !== 5) throw new Error(`Invalid ${label} float`);
|
|
274
|
+
const bytes = reader.take(4);
|
|
275
|
+
return new DataView(bytes.buffer, bytes.byteOffset, 4).getFloat32(0, true);
|
|
276
|
+
}
|
|
277
|
+
if (type === 'bool') return reader.varint() !== 0n;
|
|
278
|
+
if (type === 'int') return Number(BigInt.asIntN(64, reader.varint()));
|
|
279
|
+
if (type === 'uint') return Number(reader.varint());
|
|
280
|
+
if (type === 'int32' || type === 'enum') return Number(BigInt.asIntN(32, reader.varint()));
|
|
281
|
+
if (type === 'uint32') return reader.varint32();
|
|
282
|
+
if (type === 'int64') return BigInt.asIntN(64, reader.varint());
|
|
283
|
+
if (type === 'uint64') return BigInt.asUintN(64, reader.varint());
|
|
284
|
+
if (isMessageType(type)) return decodeMessage(type, reader.bytesValue());
|
|
285
|
+
throw new Error(`Unknown ${label} type: ${type}`);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function checkWireType(descriptorName, type, wireType) {
|
|
289
|
+
if (strict && wireType !== wireTypeFor(type)) {
|
|
290
|
+
throw new Error(`Invalid ${label} wire type ${wireType} for ${descriptorName}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function decodeMapEntry(bytes, [keyType, valueType]) {
|
|
295
|
+
const reader = new ProtoReader(bytes);
|
|
296
|
+
let key = '';
|
|
297
|
+
let value = valueType === 'string' ? '' : undefined;
|
|
298
|
+
while (!reader.done) {
|
|
299
|
+
const tag = reader.varint();
|
|
300
|
+
const no = Number(tag >> 3n);
|
|
301
|
+
const wireType = Number(tag & 7n);
|
|
302
|
+
if (no === 1) {
|
|
303
|
+
checkWireType('map key', keyType, wireType);
|
|
304
|
+
key = decodeScalar(reader, keyType, wireType);
|
|
305
|
+
} else if (no === 2) {
|
|
306
|
+
checkWireType('map value', valueType, wireType);
|
|
307
|
+
value = decodeScalar(reader, valueType, wireType);
|
|
308
|
+
} else reader.skip(wireType);
|
|
309
|
+
}
|
|
310
|
+
return [String(key), value];
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function decodePacked(bytes, type) {
|
|
314
|
+
const reader = new ProtoReader(bytes);
|
|
315
|
+
const wireType = wireTypeFor(type);
|
|
316
|
+
const values = [];
|
|
317
|
+
while (!reader.done) values.push(decodeScalar(reader, type, wireType));
|
|
318
|
+
return values;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function decodeMessage(type, bytes) {
|
|
322
|
+
const schema = schemas[type];
|
|
323
|
+
if (!schema) throw new Error(`Unknown ${label} message: ${type}`);
|
|
324
|
+
const reader = new ProtoReader(bytes);
|
|
325
|
+
const output = {};
|
|
326
|
+
while (!reader.done) {
|
|
327
|
+
const tag = reader.varint();
|
|
328
|
+
const no = Number(tag >> 3n);
|
|
329
|
+
const wireType = Number(tag & 7n);
|
|
330
|
+
if (strict && no === 0) throw new Error(`Invalid ${label} field number 0`);
|
|
331
|
+
const descriptor = schema[no];
|
|
332
|
+
if (!descriptor) {
|
|
333
|
+
const start = reader.offset;
|
|
334
|
+
reader.skip(wireType);
|
|
335
|
+
output.$unknown ||= [];
|
|
336
|
+
output.$unknown.push({
|
|
337
|
+
no,
|
|
338
|
+
wireType,
|
|
339
|
+
data: new Uint8Array(reader.bytes.subarray(start, reader.offset)),
|
|
340
|
+
});
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (descriptor.type?.map) {
|
|
344
|
+
checkWireType(descriptor.name, descriptor.type, wireType);
|
|
345
|
+
const [key, value] = decodeMapEntry(reader.bytesValue(), descriptor.type.map);
|
|
346
|
+
output[descriptor.name] ||= {};
|
|
347
|
+
output[descriptor.name][key] = value;
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
if (packed && descriptor.repeated && wireType === 2 && PACKABLE_TYPES.has(descriptor.type)) {
|
|
351
|
+
output[descriptor.name] ||= [];
|
|
352
|
+
output[descriptor.name].push(...decodePacked(reader.bytesValue(), descriptor.type));
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
checkWireType(descriptor.name, descriptor.type, wireType);
|
|
356
|
+
const value = decodeScalar(reader, descriptor.type, wireType);
|
|
357
|
+
if (descriptor.repeated) {
|
|
358
|
+
output[descriptor.name] ||= [];
|
|
359
|
+
output[descriptor.name].push(value);
|
|
360
|
+
} else {
|
|
361
|
+
output[descriptor.name] = value;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return output;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return { encodeMessage, decodeMessage, encodeField, ProtoReader };
|
|
368
|
+
}
|
|
@@ -8,9 +8,9 @@ export const ASK_USER_TOOL_DEFS = Object.freeze([
|
|
|
8
8
|
name: 'ask_user',
|
|
9
9
|
title: 'Ask User',
|
|
10
10
|
trigger:
|
|
11
|
-
'Ask the user 1–4 multiple-choice questions and wait; when a plan needs the user to pick between clear options, instead of listing them in chat.',
|
|
11
|
+
'Ask the user 1–4 multiple-choice questions and wait; when a plan needs the user to pick between clear options, instead of listing them in chat. Also hands the user a page or app step (CAPTCHA, sign-in, 2FA, a secret).',
|
|
12
12
|
description:
|
|
13
|
-
'Ask the user multiple-choice questions and wait. Only for a decision only the user can make, with clear options; never for minor choices or approval of requested work, and open questions go in chat. Do not repeat the options in your message.',
|
|
13
|
+
'Ask the user multiple-choice questions and wait. Only for a decision only the user can make, with clear options; never for minor choices or approval of requested work, and open questions go in chat. Do not repeat the options in your message. A step only the user can do on a page or app (CAPTCHA, human check, sign-in, 2FA, a password) is a handoff here, never a request in plain chat.',
|
|
14
14
|
annotations: {
|
|
15
15
|
title: 'Ask User',
|
|
16
16
|
readOnlyHint: true,
|
|
@@ -55,7 +55,7 @@ export const ASK_USER_TOOL_DEFS = Object.freeze([
|
|
|
55
55
|
handoff: {
|
|
56
56
|
type: 'object',
|
|
57
57
|
description:
|
|
58
|
-
'Instead of questions: secret = the user types a password
|
|
58
|
+
'Instead of questions: secret = the user types a password, sign-in, new password or one-time code into that field of the page (you never see it; result entered/user_skipped/no_field/page_changed/blocked/expired); takeover = the user does a step (sign-in, CAPTCHA, 2FA) and says done.',
|
|
59
59
|
properties: {
|
|
60
60
|
kind: { type: 'string', enum: ['secret', 'takeover'] },
|
|
61
61
|
surface: { type: 'string', enum: ['browser', 'computer'] },
|
|
@@ -74,8 +74,9 @@ export const ASK_USER_TOOL_DEFS = Object.freeze([
|
|
|
74
74
|
description: 'browser takeover: login = sign-in window on url.',
|
|
75
75
|
},
|
|
76
76
|
url: { type: 'string', maxLength: 2048, description: 'login: sign-in page (https).' },
|
|
77
|
-
tab: { type: 'string', maxLength: 64, description: 'browser
|
|
78
|
-
window_id: { type: 'string', maxLength: 128, description: 'computer
|
|
77
|
+
tab: { type: 'string', maxLength: 64, description: 'browser: page ID from list_tabs.' },
|
|
78
|
+
window_id: { type: 'string', maxLength: 128, description: 'computer: exact window id (secret: required).' },
|
|
79
|
+
ref: { type: 'string', maxLength: 64, description: 'computer secret: field ref (required).' },
|
|
79
80
|
app: { type: 'string', maxLength: 120, description: 'computer takeover: app name.' },
|
|
80
81
|
},
|
|
81
82
|
required: ['kind', 'surface'],
|
|
@@ -106,13 +107,16 @@ export function validateAskUserHandoff(args) {
|
|
|
106
107
|
const login = handoffLogin(handoff);
|
|
107
108
|
let need = login ? 'sign_in' : 'action';
|
|
108
109
|
if (['sign_in', 'action', 'confirmation'].includes(handoff.need)) need = handoff.need;
|
|
110
|
+
const loginField = login ? { login } : {};
|
|
109
111
|
return {
|
|
110
112
|
kind: handoff.kind,
|
|
111
113
|
surface: handoff.surface,
|
|
112
114
|
target: text('target', 200),
|
|
113
115
|
field: text('field', 80),
|
|
114
116
|
instructions: text('instructions', 2000),
|
|
115
|
-
|
|
117
|
+
// A secret is bound to its page (browser tab) or window and field (computer).
|
|
118
|
+
identity: handoffIdentity(handoff),
|
|
119
|
+
...(handoff.kind === 'takeover' ? { need, ...loginField } : {}),
|
|
116
120
|
};
|
|
117
121
|
}
|
|
118
122
|
|
|
@@ -149,7 +153,8 @@ function handoffIdentity(handoff) {
|
|
|
149
153
|
.trim()
|
|
150
154
|
.slice(0, 120)
|
|
151
155
|
: '';
|
|
152
|
-
|
|
156
|
+
const ref = handoff.kind === 'secret' ? token('ref', 64) : '';
|
|
157
|
+
return { ...(windowId ? { windowId } : {}), ...(app ? { app } : {}), ...(ref ? { ref } : {}) };
|
|
153
158
|
}
|
|
154
159
|
|
|
155
160
|
/** Throws a clear error when the questions are malformed; returns the list. */
|
|
@@ -158,6 +158,8 @@ export function featureDisallowedToolsFor(
|
|
|
158
158
|
...(builtinFeatureActive(configLike, 'media') ? [] : ['media']),
|
|
159
159
|
...(builtinFeatureActive(configLike, 'tidy') ? [] : ['tidy']),
|
|
160
160
|
...(builtinFeatureActive(configLike, 'visualize') ? [] : ['visualize']),
|
|
161
|
+
// Bots' emoji reactions (Settings → General → Reactions); on unless turned off.
|
|
162
|
+
...(configLike?.reactions === false ? ['react'] : []),
|
|
161
163
|
];
|
|
162
164
|
// Headless exec uses the Lead surface and excludes Skill/MCP tools. When
|
|
163
165
|
// only its eager defaults remain, neither schemas nor loader guidance help.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// The fields of `session.compaction` that the saved global config owns, as
|
|
2
|
+
// opposed to the per-session state (archive, thresholds, outcome telemetry)
|
|
3
|
+
// the session owns. Shared by the config sync and by the compaction commit, so
|
|
4
|
+
// a commit that finishes after a reload never writes back a stale config value.
|
|
5
|
+
import { RETIRED_COMPACTION_FIELDS } from '../config-storage.mjs';
|
|
6
|
+
import { normalizeCompactionConfig } from './config-helpers.mjs';
|
|
7
|
+
|
|
8
|
+
// Every spelling of the main-context buffer budget; a new representation
|
|
9
|
+
// replaces the previous one.
|
|
10
|
+
export const MAIN_BUFFER_KEYS = [
|
|
11
|
+
'mainBufferTokens',
|
|
12
|
+
'mainBuffer',
|
|
13
|
+
'mainBufferPercent',
|
|
14
|
+
'mainBufferPct',
|
|
15
|
+
'mainBufferRatio',
|
|
16
|
+
'mainBufferFraction',
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
// Everything the normalizer emits for an empty config, the retired aliases it
|
|
20
|
+
// folds away, and every setting a session record is seeded from the config
|
|
21
|
+
// (session-record.mjs initialCompactionConfig). A field the config no longer
|
|
22
|
+
// sets is cleared so the session falls back to the default.
|
|
23
|
+
export const COMPACTION_CONFIG_KEYS = Object.freeze([
|
|
24
|
+
...Object.keys(normalizeCompactionConfig({})),
|
|
25
|
+
...RETIRED_COMPACTION_FIELDS,
|
|
26
|
+
'enabled',
|
|
27
|
+
'useMaintainer',
|
|
28
|
+
'model',
|
|
29
|
+
'summaryModel',
|
|
30
|
+
'timeoutMs',
|
|
31
|
+
'memoryTimeoutMs',
|
|
32
|
+
'buffer',
|
|
33
|
+
'bufferTokens',
|
|
34
|
+
'reservedTokens',
|
|
35
|
+
'bufferPercent',
|
|
36
|
+
'bufferPct',
|
|
37
|
+
'bufferRatio',
|
|
38
|
+
'bufferFraction',
|
|
39
|
+
...MAIN_BUFFER_KEYS,
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
// The resolved buffer is the plan's own measurement, recorded on every compact
|
|
43
|
+
// pass, so for the writers below it is telemetry and not a setting.
|
|
44
|
+
const RESOLVED_BUFFER_KEYS = new Set(['bufferTokens', 'bufferRatio']);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The `session.compaction` record a compaction writer produces: the live record
|
|
48
|
+
* plus its own outcome telemetry. Config-owned fields always come from the
|
|
49
|
+
* live record, never from the policy or the plan the writer started with: a
|
|
50
|
+
* reload that landed while the compaction was running (auto turned off, a
|
|
51
|
+
* model removed) must not be undone by the write that follows it.
|
|
52
|
+
*/
|
|
53
|
+
export function withLiveCompactionConfig(live, telemetry) {
|
|
54
|
+
const record = { ...live, auto: live.auto !== false, ...telemetry };
|
|
55
|
+
for (const key of COMPACTION_CONFIG_KEYS) {
|
|
56
|
+
if (key === 'auto' || RESOLVED_BUFFER_KEYS.has(key)) continue;
|
|
57
|
+
if (Object.hasOwn(live, key)) record[key] = live[key];
|
|
58
|
+
else delete record[key];
|
|
59
|
+
}
|
|
60
|
+
record.auto = live.auto !== false;
|
|
61
|
+
return record;
|
|
62
|
+
}
|
|
@@ -78,6 +78,14 @@ function resolveAutoEffort({ autoEffort, saved, preset = null }) {
|
|
|
78
78
|
return preset?.autoEffort !== false;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
/** The route's context percent: an explicit request, else the saved choice
|
|
82
|
+
* (read lazily) unless an exact token selection replaced it. */
|
|
83
|
+
function resolveContextPercent({ hasExplicitContextPercent, contextPercent, keepsSavedPercent, savedPercent }) {
|
|
84
|
+
if (hasExplicitContextPercent) return cleanContextPercent(contextPercent);
|
|
85
|
+
if (keepsSavedPercent) return cleanContextPercent(savedPercent());
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
|
|
81
89
|
export function makeResolveRoute(resolveDefaultProvider) {
|
|
82
90
|
return function resolveRoute(
|
|
83
91
|
config,
|
|
@@ -119,11 +127,12 @@ export function makeResolveRoute(resolveDefaultProvider) {
|
|
|
119
127
|
modelParameters: hasExplicitModelParameters
|
|
120
128
|
? cleanModelParameters(modelParameters)
|
|
121
129
|
: cleanModelParameters(saved.modelParameters ?? preset.modelParameters),
|
|
122
|
-
contextPercent:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
130
|
+
contextPercent: resolveContextPercent({
|
|
131
|
+
hasExplicitContextPercent,
|
|
132
|
+
contextPercent,
|
|
133
|
+
keepsSavedPercent,
|
|
134
|
+
savedPercent: () => saved.contextPercent ?? preset.contextPercent,
|
|
135
|
+
}),
|
|
127
136
|
...(tokens ? { contextTokens: tokens } : {}),
|
|
128
137
|
};
|
|
129
138
|
}
|
|
@@ -144,11 +153,12 @@ export function makeResolveRoute(resolveDefaultProvider) {
|
|
|
144
153
|
modelParameters: hasExplicitModelParameters
|
|
145
154
|
? cleanModelParameters(modelParameters)
|
|
146
155
|
: cleanModelParameters(saved.modelParameters),
|
|
147
|
-
contextPercent:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
156
|
+
contextPercent: resolveContextPercent({
|
|
157
|
+
hasExplicitContextPercent,
|
|
158
|
+
contextPercent,
|
|
159
|
+
keepsSavedPercent,
|
|
160
|
+
savedPercent: () => saved.contextPercent,
|
|
161
|
+
}),
|
|
152
162
|
...(tokens ? { contextTokens: tokens } : {}),
|
|
153
163
|
};
|
|
154
164
|
};
|
|
@@ -231,7 +241,7 @@ const AGENT_TERMINAL_REAP_MS = Object.freeze({ 'openai-oauth': 60 * 60 * 1000 })
|
|
|
231
241
|
|
|
232
242
|
/** A stored/requested idle value: AUTO_CLEAR_UNLIMITED, a window ≥ 1 min, or
|
|
233
243
|
* null when absent or invalid. */
|
|
234
|
-
|
|
244
|
+
function normalizeAutoClearIdleValue(value) {
|
|
235
245
|
if (value === null || value === undefined || typeof value === 'boolean') return null;
|
|
236
246
|
if (typeof value === 'string') {
|
|
237
247
|
const text = value.trim().toLowerCase();
|
|
@@ -290,11 +300,11 @@ export function autoClearProviderDefaults(providerIdleMs = null, extraProviders
|
|
|
290
300
|
const builtIn = Object.hasOwn(AUTO_CLEAR_PROVIDER_IDLE_MS, provider)
|
|
291
301
|
? AUTO_CLEAR_PROVIDER_IDLE_MS[provider]
|
|
292
302
|
: AUTO_CLEAR_PROVIDER_IDLE_MS.default;
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
303
|
+
let idleMs;
|
|
304
|
+
if (Object.hasOwn(overrides, provider)) idleMs = resolvedIdleMs(overrides[provider]);
|
|
305
|
+
else if (provider === 'default' || Object.hasOwn(AUTO_CLEAR_PROVIDER_IDLE_MS, provider)) {
|
|
306
|
+
idleMs = resolvedIdleMs(builtIn);
|
|
307
|
+
} else idleMs = autoClearIdleMsForProvider(provider, overrides);
|
|
298
308
|
return {
|
|
299
309
|
provider,
|
|
300
310
|
idleMs,
|
|
@@ -338,6 +348,17 @@ export function resolveAutoClearIdleMs(config, provider) {
|
|
|
338
348
|
return autoClearIdleMsForProvider(provider, raw.providerIdleMs);
|
|
339
349
|
}
|
|
340
350
|
|
|
351
|
+
/** The idle auto-clear gate's settings for a thread on `provider`
|
|
352
|
+
* (idle-auto-clear-gate.mjs): `{ enabled, idleMs, minContextPercent }`. */
|
|
353
|
+
function autoClearGateSettings(config, provider) {
|
|
354
|
+
const normalized = normalizeAutoClearConfig(config?.autoClear);
|
|
355
|
+
return {
|
|
356
|
+
enabled: normalized.enabled,
|
|
357
|
+
idleMs: resolveAutoClearIdleMs(config, provider),
|
|
358
|
+
minContextPercent: normalized.minContextPercent,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
341
362
|
export function normalizeSystemShellConfig(value = {}) {
|
|
342
363
|
const raw = value && typeof value === 'object' ? value : {};
|
|
343
364
|
const command = clean(raw.command);
|