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
|
@@ -267,17 +267,6 @@ export async function prewarmOwnerOnlyAclWin32({ bridge = true } = {}) {
|
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
|
|
270
|
-
/** Test/diagnostic hook: whether a helper is attached, its requests awaiting
|
|
271
|
-
* an answer, and the starts inside the current restart window. */
|
|
272
|
-
export function ownerOnlyAclHelperStats() {
|
|
273
|
-
return {
|
|
274
|
-
alive: aclHelper !== null,
|
|
275
|
-
pid: aclHelper?.child.pid ?? null,
|
|
276
|
-
pending: aclHelper?.pending.size ?? 0,
|
|
277
|
-
recentStarts: aclHelperStartTimes.length,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
|
|
281
270
|
/** Test hook: the live helper process, or null. */
|
|
282
271
|
export function ownerOnlyAclHelperForTests() {
|
|
283
272
|
return aclHelper?.child ?? null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Side-effect import for the git-heavy suites. Import it before anything that
|
|
2
|
+
// spawns git or snapshots process.env.
|
|
3
|
+
//
|
|
4
|
+
// On Windows `git` on PATH is usually Git for Windows' cmd\git.exe launcher,
|
|
5
|
+
// which starts the real git.exe as a second process, so every spawn pays two
|
|
6
|
+
// process creations (~75 ms instead of ~40 ms). These suites spawn hundreds of
|
|
7
|
+
// git processes, test and code under test alike (the git runner worker shares
|
|
8
|
+
// process.env), so the real binary's directory (`git --exec-path`, where git
|
|
9
|
+
// itself resolves its subcommands) goes first on PATH. Same git, same config;
|
|
10
|
+
// only the launcher hop is skipped. Elsewhere `git` already is the binary.
|
|
11
|
+
import { spawnSync } from 'node:child_process';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { delimiter, join, normalize } from 'node:path';
|
|
14
|
+
|
|
15
|
+
if (process.platform === 'win32') {
|
|
16
|
+
const probe = spawnSync('git', ['--exec-path'], { encoding: 'utf8', windowsHide: true });
|
|
17
|
+
const dir = probe.status === 0 ? normalize(probe.stdout.trim()) : '';
|
|
18
|
+
if (dir && existsSync(join(dir, 'git.exe'))) process.env.PATH = `${dir}${delimiter}${process.env.PATH}`;
|
|
19
|
+
}
|
|
@@ -6,18 +6,43 @@
|
|
|
6
6
|
// uses PKCE (S256), state and a loopback redirect
|
|
7
7
|
// (developers.google.com/identity/protocols/oauth2/native-app).
|
|
8
8
|
//
|
|
9
|
-
// The values come
|
|
10
|
-
//
|
|
11
|
-
//
|
|
9
|
+
// The source ships no client. The values come from the environment first
|
|
10
|
+
// (MIXDOG_GOOGLE_OAUTH_CLIENT_ID / _SECRET: a developer's override, and what
|
|
11
|
+
// `npm run dev:isolated` passes through), then from the generated, gitignored
|
|
12
|
+
// google-oauth-client.generated.json beside this file. Release packaging
|
|
13
|
+
// writes that file from the repository secrets
|
|
14
|
+
// (scripts/embed-google-oauth-client.mjs) before the npm package and every
|
|
15
|
+
// desktop runtime.asar are built, so each shipped build carries it. A build
|
|
16
|
+
// with neither offers no built-in Google sign-in (the user's own Google
|
|
17
|
+
// client still works).
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
import { readFileSync } from 'node:fs';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
|
|
22
|
+
/** The generated file release packaging writes (see the header). */
|
|
23
|
+
export const GOOGLE_OAUTH_CLIENT_FILE = fileURLToPath(new URL('./google-oauth-client.generated.json', import.meta.url));
|
|
24
|
+
|
|
25
|
+
const text = (value) => String(value || '').trim();
|
|
26
|
+
|
|
27
|
+
function embeddedClient(file) {
|
|
28
|
+
let source;
|
|
29
|
+
try {
|
|
30
|
+
source = readFileSync(file, 'utf8');
|
|
31
|
+
} catch (error) {
|
|
32
|
+
if (error?.code === 'ENOENT') return null;
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
const { clientId, clientSecret } = JSON.parse(source);
|
|
36
|
+
return text(clientId) ? { clientId: text(clientId), clientSecret: text(clientSecret) } : null;
|
|
37
|
+
}
|
|
14
38
|
|
|
15
39
|
/** `{ clientId, clientSecret }` of Mixdog's Google client, or null when this
|
|
16
|
-
* build has none.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return { clientId, clientSecret:
|
|
40
|
+
* build has none. The environment wins over the generated file as a whole:
|
|
41
|
+
* the two are never mixed. */
|
|
42
|
+
export function googleOAuthClient({ env = process.env, file = GOOGLE_OAUTH_CLIENT_FILE } = {}) {
|
|
43
|
+
const clientId = text(env.MIXDOG_GOOGLE_OAUTH_CLIENT_ID);
|
|
44
|
+
if (clientId) return { clientId, clientSecret: text(env.MIXDOG_GOOGLE_OAUTH_CLIENT_SECRET) };
|
|
45
|
+
return embeddedClient(file);
|
|
21
46
|
}
|
|
22
47
|
|
|
23
48
|
/** Google issues a refresh token only for `access_type=offline`. */
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Mixy's heartbeat interval setting (`heartbeatIntervalMinutes` in the config):
|
|
2
|
+
// one of a few fixed choices, shared by the runtime, the desktop's IPC check
|
|
3
|
+
// and the Settings picker. "Off" is the separate `heartbeat` switch.
|
|
4
|
+
export const HEARTBEAT_INTERVAL_CHOICES = Object.freeze([30, 60, 120, 240]);
|
|
5
|
+
export const DEFAULT_HEARTBEAT_INTERVAL_MINUTES = 60;
|
|
6
|
+
|
|
7
|
+
/** `value` when it is one of the choices, else the default (a stored value
|
|
8
|
+
* that is no longer, or never was, a choice reads as the default). */
|
|
9
|
+
export function normalizeHeartbeatIntervalMinutes(value) {
|
|
10
|
+
return HEARTBEAT_INTERVAL_CHOICES.includes(value) ? value : DEFAULT_HEARTBEAT_INTERVAL_MINUTES;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** `value` when it is one of the choices; throws otherwise (a write). */
|
|
14
|
+
export function requireHeartbeatIntervalMinutes(value) {
|
|
15
|
+
if (!HEARTBEAT_INTERVAL_CHOICES.includes(value)) {
|
|
16
|
+
throw new Error(`heartbeat interval must be one of ${HEARTBEAT_INTERVAL_CHOICES.join(', ')} minutes`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// idle-auto-clear-gate.mjs — the idle auto-clear predicate, shared by the
|
|
2
|
+
// submit gate (tui/session/session-flow/auto-clear.mjs); the cache warmer
|
|
3
|
+
// (agent/orchestrator/session/cache-warm.mjs) registers its successful warms,
|
|
4
|
+
// which count as cache use (sessionActivityTimestamp). A thread is cleared before
|
|
5
|
+
// a submit when auto-clear is on, it has been idle for at least the window
|
|
6
|
+
// since its activity timestamp, and its context is not below the minimum
|
|
7
|
+
// share of the compaction trigger.
|
|
8
|
+
import { attachmentTextForPart, isAttachmentReference } from '../attachments/store.mjs';
|
|
9
|
+
|
|
10
|
+
export function promptContentText(content) {
|
|
11
|
+
if (typeof content === 'string') return content;
|
|
12
|
+
if (Array.isArray(content)) {
|
|
13
|
+
return content
|
|
14
|
+
.map((part) => {
|
|
15
|
+
if (typeof part === 'string') return part;
|
|
16
|
+
if (part?.type === 'text') return isAttachmentReference(part) ? attachmentTextForPart(part) : part.text || '';
|
|
17
|
+
if (part?.type === 'image') return '[Image]';
|
|
18
|
+
if (part?.type === 'file') return '[File]';
|
|
19
|
+
return part?.text || '';
|
|
20
|
+
})
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
.join('\n');
|
|
23
|
+
}
|
|
24
|
+
return String(content ?? '');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function timestampMs(value) {
|
|
28
|
+
if (value == null || value === '') return 0;
|
|
29
|
+
const n = Number(value);
|
|
30
|
+
if (Number.isFinite(n) && n > 0) return n;
|
|
31
|
+
const parsed = Date.parse(String(value));
|
|
32
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function hasModelVisibleConversation(session) {
|
|
36
|
+
const messages = Array.isArray(session?.messages) ? session.messages : [];
|
|
37
|
+
return messages.some((message) => {
|
|
38
|
+
const role = message?.role;
|
|
39
|
+
if (role !== 'user' && role !== 'assistant' && role !== 'tool') return false;
|
|
40
|
+
const text = promptContentText(message.content).trim();
|
|
41
|
+
if (role === 'user' && text.startsWith('<system-reminder>')) return false;
|
|
42
|
+
if (role === 'assistant' && text === '.' && !Array.isArray(message.toolCalls)) return false;
|
|
43
|
+
return !!text || role === 'assistant' || role === 'tool';
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// When a session's prompt cache was last used by a successful cache warm (a
|
|
48
|
+
// read with no write), registered by the warmer (cache-warm.mjs, from its
|
|
49
|
+
// durable touch store); 0 when none.
|
|
50
|
+
let lastCacheWarmUse = () => 0;
|
|
51
|
+
|
|
52
|
+
/** Register the source of a session's last successful cache-warm use
|
|
53
|
+
* (`(sessionId) => epoch ms | 0`); null restores none. */
|
|
54
|
+
export function setCacheWarmUseSource(source) {
|
|
55
|
+
lastCacheWarmUse = typeof source === 'function' ? source : () => 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* When the session was last active (0: no model-visible conversation): the
|
|
60
|
+
* latest of its own activity and the last successful cache warm. Idleness is
|
|
61
|
+
* measured from the last time the cached prompt was actually used, and a warm
|
|
62
|
+
* that read the cache without writing used it; the session's own timestamps
|
|
63
|
+
* are never moved.
|
|
64
|
+
*/
|
|
65
|
+
export function sessionActivityTimestamp(session, fallback = 0) {
|
|
66
|
+
if (!hasModelVisibleConversation(session)) return 0;
|
|
67
|
+
const own = timestampMs(session?.lastUsedAt) || timestampMs(session?.updatedAt) || timestampMs(fallback);
|
|
68
|
+
return Math.max(own, timestampMs(lastCacheWarmUse(session?.id)));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// A zero is often an unavailable/stale meter field, not an authoritative
|
|
72
|
+
// measurement. Do not let it mask the sibling live estimate.
|
|
73
|
+
function contextUsageBelowThreshold(runtime, minContextPercent) {
|
|
74
|
+
if (!(minContextPercent > 0)) return false;
|
|
75
|
+
const status = runtime.contextStatus?.() || null;
|
|
76
|
+
const usedTokens = Math.max(
|
|
77
|
+
0,
|
|
78
|
+
Number(status?.usedTokens) || 0,
|
|
79
|
+
Number(status?.currentEstimatedTokens) || 0,
|
|
80
|
+
Number(status?.compaction?.currentEstimatedTokens) || 0
|
|
81
|
+
);
|
|
82
|
+
const triggerTokens = Number(
|
|
83
|
+
status?.compaction?.triggerTokens ||
|
|
84
|
+
status?.compaction?.autoCompactTokenLimit ||
|
|
85
|
+
runtime.session?.autoCompactTokenLimit ||
|
|
86
|
+
0
|
|
87
|
+
);
|
|
88
|
+
if (!Number.isFinite(usedTokens) || !Number.isFinite(triggerTokens) || !(usedTokens > 0 && triggerTokens > 0)) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return (usedTokens / triggerTokens) * 100 < minContextPercent;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Whether the idle gate clears the thread before a submit at `at`: `cfg` is
|
|
96
|
+
* the auto-clear state (`enabled`, `idleMs`, `minContextPercent`), the
|
|
97
|
+
* activity is `activityAt` (sessionActivityTimestamp) and `runtime` answers
|
|
98
|
+
* `contextStatus()` for the thread. The submit gate adds its own transient
|
|
99
|
+
* conditions (busy, queued input, a clear already running).
|
|
100
|
+
*/
|
|
101
|
+
export function idleAutoClearDue({ cfg, activityAt, at, runtime }) {
|
|
102
|
+
if (!cfg?.enabled || !activityAt || at - activityAt < cfg.idleMs) return false;
|
|
103
|
+
return !contextUsageBelowThreshold(runtime, Number(cfg.minContextPercent ?? 10));
|
|
104
|
+
}
|
|
@@ -7,6 +7,9 @@ const FAST_MODE_BETA_HEADER = 'fast-mode-2026-02-01';
|
|
|
7
7
|
const TOOL_SEARCH_BETA_HEADER = 'advanced-tool-use-2025-11-20';
|
|
8
8
|
const THINKING_DISPLAY_UPDATES_BETA_HEADER = 'thinking-display-updates-2026-08-18';
|
|
9
9
|
export const SERVER_SIDE_FALLBACK_BETA_HEADER = 'server-side-fallback-2026-07-01';
|
|
10
|
+
// Turn-scoped mid-conversation system messages (clear_at), sent only when the
|
|
11
|
+
// request body carries one.
|
|
12
|
+
export const TURN_SCOPED_SYSTEM_BETA_HEADER = 'mid-conversation-system-clear-at-2026-08-21';
|
|
10
13
|
|
|
11
14
|
// Fast mode ships on Opus 5.5, Opus 5 and Opus 4.8 only. Opus 4.7 rejects
|
|
12
15
|
// `speed: "fast"` and Opus 4.6 silently runs at standard speed.
|
|
@@ -28,6 +31,7 @@ export function buildAnthropicBetaHeaders({
|
|
|
28
31
|
effort = false,
|
|
29
32
|
serverFallback = false,
|
|
30
33
|
thinkingDisplayUpdates = false,
|
|
34
|
+
turnScopedSystem = false,
|
|
31
35
|
} = {}) {
|
|
32
36
|
const headers = String(base || '')
|
|
33
37
|
.split(',')
|
|
@@ -48,5 +52,8 @@ export function buildAnthropicBetaHeaders({
|
|
|
48
52
|
if (thinkingDisplayUpdates && !headers.includes(THINKING_DISPLAY_UPDATES_BETA_HEADER)) {
|
|
49
53
|
headers.push(THINKING_DISPLAY_UPDATES_BETA_HEADER);
|
|
50
54
|
}
|
|
55
|
+
if (turnScopedSystem && !headers.includes(TURN_SCOPED_SYSTEM_BETA_HEADER)) {
|
|
56
|
+
headers.push(TURN_SCOPED_SYSTEM_BETA_HEADER);
|
|
57
|
+
}
|
|
51
58
|
return headers.join(',');
|
|
52
59
|
}
|
|
@@ -63,3 +63,15 @@ export function emitsAnthropicProgressUpdates(model) {
|
|
|
63
63
|
const id = normalizeClaudeModelId(model);
|
|
64
64
|
return /^claude-(?:opus-5-5|sonnet-5-5|fable-5-1|mythos-5-1|fable-5)(?:-\d{8})?$/.test(id);
|
|
65
65
|
}
|
|
66
|
+
|
|
67
|
+
// Models that accept turn-scoped mid-conversation system messages
|
|
68
|
+
// ({role:'system', clear_at:'next_user_message'}, beta
|
|
69
|
+
// mid-conversation-system-clear-at-2026-08-21). An id list for the same
|
|
70
|
+
// reason as above: a wrong "yes" is a 400 on every request, a wrong "no" only
|
|
71
|
+
// keeps the legacy tail-reminder layout — so unknown ids stay off.
|
|
72
|
+
export function supportsAnthropicTurnScopedSystemMessages(model) {
|
|
73
|
+
const id = normalizeClaudeModelId(model);
|
|
74
|
+
return /^claude-(?:fable-5-1|mythos-5-1|fable-5|mythos-5|opus-5-5|opus-5|opus-4-8|sonnet-5-5|haiku-5-5)(?:-\d{8})?$/.test(
|
|
75
|
+
id
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -92,6 +92,7 @@ const PROVIDER_CATALOGS = Object.freeze({
|
|
|
92
92
|
rosterLimitsAuthoritative: true,
|
|
93
93
|
},
|
|
94
94
|
'cursor-oauth': { relay: true },
|
|
95
|
+
'devin-oauth': { relay: true },
|
|
95
96
|
'cursor-api': { relay: true },
|
|
96
97
|
// The models.dev listing id of the Go gateway: a relay catalog, not a
|
|
97
98
|
// selectable provider (the model lookup needs it flagged as a relay).
|
|
@@ -22,7 +22,7 @@ export function usageRollupDayKey(ts) {
|
|
|
22
22
|
// background runners. An unknown source counts as conversation on purpose: a
|
|
23
23
|
// new runner showing up in the user's totals is visible and correctable, while
|
|
24
24
|
// silently dropping the user's own turns is neither.
|
|
25
|
-
const BACKGROUND_SOURCES = new Set(['memory-cycle', 'schedule', 'webhook', 'native-web-search']);
|
|
25
|
+
const BACKGROUND_SOURCES = new Set(['memory-cycle', 'schedule', 'webhook', 'native-web-search', 'cache-warm']);
|
|
26
26
|
|
|
27
27
|
export function isConversationUsageSource(sourceType) {
|
|
28
28
|
const id = typeof sourceType === 'string' ? sourceType.trim().toLowerCase() : '';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outgoing-request surrogate sanitizer.
|
|
3
|
+
*
|
|
4
|
+
* A lone UTF-16 surrogate (half of an emoji left by a char-count cut, or
|
|
5
|
+
* carried by tool output / file content) is serialized by JSON.stringify as a
|
|
6
|
+
* `\ud83d` escape that provider APIs reject ("not valid JSON"). This rewrites
|
|
7
|
+
* every string value and every object key to well-formed text (lone surrogate
|
|
8
|
+
* -> U+FFFD) in the request that is about to be sent.
|
|
9
|
+
*
|
|
10
|
+
* Copy-on-write: a request that is already well-formed is returned as the very
|
|
11
|
+
* same object (no allocation, identity kept for caches keyed on messages or
|
|
12
|
+
* tool lists). Only the containers on the path to a bad string are copied; the
|
|
13
|
+
* stored transcript is never mutated. Only arrays and plain objects are
|
|
14
|
+
* walked: Buffer / Uint8Array / ArrayBuffer and any other class instance are
|
|
15
|
+
* binary or opaque payloads and are returned untouched. Own symbol properties
|
|
16
|
+
* (e.g. the provider-native tool prefix count on a tool list) survive a copy.
|
|
17
|
+
*/
|
|
18
|
+
function copySymbols(target, source) {
|
|
19
|
+
for (const symbol of Object.getOwnPropertySymbols(source)) {
|
|
20
|
+
Object.defineProperty(target, symbol, Object.getOwnPropertyDescriptor(source, symbol));
|
|
21
|
+
}
|
|
22
|
+
return target;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function setOwn(target, key, value) {
|
|
26
|
+
Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function walk(value, active) {
|
|
30
|
+
if (typeof value === 'string') return value.isWellFormed() ? value : value.toWellFormed();
|
|
31
|
+
if (value === null || typeof value !== 'object' || active.has(value)) return value;
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
active.add(value);
|
|
34
|
+
let out = null;
|
|
35
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
36
|
+
const next = walk(value[i], active);
|
|
37
|
+
if (!out && next !== value[i]) out = value.slice();
|
|
38
|
+
if (out) out[i] = next;
|
|
39
|
+
}
|
|
40
|
+
active.delete(value);
|
|
41
|
+
return out ? copySymbols(out, value) : value;
|
|
42
|
+
}
|
|
43
|
+
const proto = Object.getPrototypeOf(value);
|
|
44
|
+
if (proto !== Object.prototype && proto !== null) return value;
|
|
45
|
+
active.add(value);
|
|
46
|
+
const keys = Object.keys(value);
|
|
47
|
+
let out = null;
|
|
48
|
+
for (let i = 0; i < keys.length; i += 1) {
|
|
49
|
+
const key = keys[i];
|
|
50
|
+
const entry = value[key];
|
|
51
|
+
const nextKey = key.isWellFormed() ? key : key.toWellFormed();
|
|
52
|
+
const nextEntry = walk(entry, active);
|
|
53
|
+
if (!out && (nextKey !== key || nextEntry !== entry)) {
|
|
54
|
+
out = Object.create(proto);
|
|
55
|
+
for (let j = 0; j < i; j += 1) setOwn(out, keys[j], value[keys[j]]);
|
|
56
|
+
}
|
|
57
|
+
if (out) setOwn(out, nextKey, nextEntry);
|
|
58
|
+
}
|
|
59
|
+
active.delete(value);
|
|
60
|
+
return out ? copySymbols(out, value) : value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** `value` with every string and object key made well-formed; `value` itself when it already is. */
|
|
64
|
+
export function sanitizeSurrogates(value) {
|
|
65
|
+
return walk(value, new WeakSet());
|
|
66
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Whether the representative bot (Mixy) exists: the one rule. The desktop
|
|
2
|
+
// answers from it (getLeadStatus `exists`, main/mixy-first.ts), and so do
|
|
3
|
+
// Mixy's routines (routine-owner.mjs `no-mixy`), her heartbeat and the
|
|
4
|
+
// heartbeat reports queued for her chat (mixy-heartbeat.mjs,
|
|
5
|
+
// agent-home-delivery.mjs), all through routine-owner.mjs readMixyExists.
|
|
6
|
+
//
|
|
7
|
+
// `created: false` (Mixy's agent.json) is no. Otherwise she exists on
|
|
8
|
+
// evidence that the user made or uses her:
|
|
9
|
+
// - a name (the 대표 에이전트 dialog always sets one; her profile can);
|
|
10
|
+
// - a message the user wrote in her thread (`homeChatted`,
|
|
11
|
+
// agent-kind.mjs homeThreadEvidence);
|
|
12
|
+
// - a schedule or webhook she owns (`ownsRoutines`): the user set it up,
|
|
13
|
+
// and since v1.3.0 it ran for her whether or not she was named.
|
|
14
|
+
// Without any of them she does not exist: v1.3.0's untouched automatic
|
|
15
|
+
// `{"created": true}`, and an undecided profile (`created` null). Her own
|
|
16
|
+
// posts in her thread, heartbeat reports and routine results, are no
|
|
17
|
+
// evidence. `ownsRoutines` is read only when nothing else decides.
|
|
18
|
+
export async function mixyExists(status, ownsRoutines) {
|
|
19
|
+
if (status?.created === false) return false;
|
|
20
|
+
if (String(status?.name ?? '').trim() || status?.homeChatted === true) return true;
|
|
21
|
+
return (await ownsRoutines()) === true;
|
|
22
|
+
}
|
|
@@ -1,21 +1,32 @@
|
|
|
1
|
-
|
|
1
|
+
import { createSharedAbortable } from './abort-race.mjs';
|
|
2
|
+
|
|
3
|
+
/** Lazy per-dataDir PG handle: one in-flight init, bootstrap lock, retry after
|
|
4
|
+
* failure. `signal` withdraws a caller; the init (a PG runtime install
|
|
5
|
+
* included) is cancelled once every caller has (createSharedAbortable). */
|
|
2
6
|
export function createPgSchemaDb({ schema, ddl, defaultDataDir, ensurePg, withLock }) {
|
|
3
7
|
const ready = new Map();
|
|
4
|
-
return
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
return function getDb(dataDir = defaultDataDir(), { signal = null } = {}) {
|
|
9
|
+
let shared = ready.get(dataDir);
|
|
10
|
+
if (!shared) {
|
|
11
|
+
const entry = createSharedAbortable(
|
|
12
|
+
async (initSignal) => {
|
|
13
|
+
const { db, pool } = await ensurePg(dataDir, { schema, signal: initSignal });
|
|
14
|
+
initSignal.throwIfAborted();
|
|
15
|
+
// Serialize CREATE TABLE across concurrent first-boot processes on the
|
|
16
|
+
// same cluster-global advisory lock the adapter uses for schema bootstrap.
|
|
17
|
+
await withLock(pool, () => db.exec(ddl));
|
|
18
|
+
return db;
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
// Let the next call retry after a transient failure or a cancellation.
|
|
22
|
+
onSettled: (failed) => {
|
|
23
|
+
if (failed && ready.get(dataDir) === entry) ready.delete(dataDir);
|
|
24
|
+
},
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
shared = entry;
|
|
28
|
+
ready.set(dataDir, entry);
|
|
19
29
|
}
|
|
30
|
+
return shared.join(signal);
|
|
20
31
|
};
|
|
21
32
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
const PROFILE_LANGUAGES = Object.freeze([
|
|
6
6
|
{ id: 'system', label: 'System (locale)', prompt: null },
|
|
7
7
|
{ id: 'en', label: 'English', prompt: 'English' },
|
|
8
|
-
{ id: 'ko', label: '
|
|
8
|
+
{ id: 'ko', label: '한국어', prompt: 'Korean' },
|
|
9
9
|
{ id: 'ja', label: '日本語', prompt: 'Japanese (日本語)' },
|
|
10
10
|
{ id: 'zh-Hans', label: '中文(简体)', prompt: 'Simplified Chinese (简体中文)' },
|
|
11
11
|
{ id: 'zh-Hant', label: '中文(繁體)', prompt: 'Traditional Chinese (繁體中文)' },
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const PROMPT_ORIGIN_CHANNEL: 'channel';
|
|
2
|
+
export declare const PROMPT_ORIGIN_AGENT_REPORT: 'agent-report';
|
|
3
|
+
export type PromptOrigin = typeof PROMPT_ORIGIN_CHANNEL | typeof PROMPT_ORIGIN_AGENT_REPORT;
|
|
4
|
+
export declare function promptOriginOf(value: unknown): PromptOrigin | null;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// A submitted prompt's provenance, carried apart from its presentation mode
|
|
2
|
+
// (`origin` on the submit options, the queue entry, the turn input and the
|
|
3
|
+
// stored user message's meta). Dependency-free: the desktop main process
|
|
4
|
+
// stamps it too (agent-room-turn.ts).
|
|
5
|
+
|
|
6
|
+
/** Real external activity presented as a task notification: an inbound
|
|
7
|
+
* channel message (Discord, Telegram, webhook event rules …). */
|
|
8
|
+
export const PROMPT_ORIGIN_CHANNEL = 'channel';
|
|
9
|
+
|
|
10
|
+
/** A turn the runtime starts because another bot or agent reported back: a
|
|
11
|
+
* bot-home wake (daemon.mjs `wake`) or a group-room member's relay of its
|
|
12
|
+
* reported work (agent-room-turn.ts). System-caused, though presented as a
|
|
13
|
+
* prompt. */
|
|
14
|
+
export const PROMPT_ORIGIN_AGENT_REPORT = 'agent-report';
|
|
15
|
+
|
|
16
|
+
const KNOWN_ORIGINS = new Set([PROMPT_ORIGIN_CHANNEL, PROMPT_ORIGIN_AGENT_REPORT]);
|
|
17
|
+
|
|
18
|
+
/** `value` when it is a known provenance, else null. */
|
|
19
|
+
export function promptOriginOf(value) {
|
|
20
|
+
return KNOWN_ORIGINS.has(value) ? value : null;
|
|
21
|
+
}
|