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
|
@@ -1,42 +1,81 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
sessionListOutput,
|
|
3
|
+
sessionReadOutput,
|
|
4
|
+
SESSION_TITLE_LIMIT,
|
|
5
|
+
SESSION_TOOL_OUTPUT_BYTES,
|
|
6
|
+
} from './session-tool-output.mjs';
|
|
7
|
+
import { createAgentTaskSessions, taskSessionPendingWork } from '../session-runtime/agent-task-sessions.mjs';
|
|
8
|
+
import { createBotStatus, scanCatalog, scopedBot } from '../session-runtime/bot-status.mjs';
|
|
6
9
|
import { handoffContent } from '../session-runtime/handoff-attachments.mjs';
|
|
7
|
-
import {
|
|
10
|
+
import { checkEffort, readModelCatalog } from '../session-runtime/task-session-route.mjs';
|
|
11
|
+
import { assertBotChainTarget, botChainOf } from '../runtime/shared/bot-hops.mjs';
|
|
12
|
+
import { agentIdOfHomeSession } from '../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
8
13
|
import { rebindDelegation } from '../runtime/agent/orchestrator/session/human-gate/delegation.mjs';
|
|
9
|
-
import { isAgentOnlySession } from '../runtime/agent/orchestrator/session/store-summary-visibility.mjs';
|
|
10
14
|
import { readSessionSidebarState } from '../runtime/shared/session-sidebar-host.mjs';
|
|
11
|
-
import {
|
|
15
|
+
import { roomIdOfSession } from '../runtime/agent/orchestrator/session/agent-room.mjs';
|
|
16
|
+
import { escapeHarnessTags } from '../runtime/shared/shell-output-summary.mjs';
|
|
17
|
+
import { truncateToolText } from '../runtime/shared/tool-primitives.mjs';
|
|
18
|
+
import { requestCaller, targetRequest } from './daemon-session-control/request.mjs';
|
|
19
|
+
import { createWorktreeControl } from './daemon-session-control/worktree-control.mjs';
|
|
20
|
+
import { createRouteControl } from './daemon-session-control/route-control.mjs';
|
|
12
21
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
TOP_CURSOR,
|
|
23
|
+
assertListFlags,
|
|
24
|
+
listOutputOptions,
|
|
25
|
+
listRowFilter,
|
|
26
|
+
listedSessions,
|
|
27
|
+
liveCandidates,
|
|
28
|
+
liveRowOverlay,
|
|
29
|
+
pinnedLiveRows,
|
|
30
|
+
} from './daemon-session-control/list-page.mjs';
|
|
31
|
+
import { roomAddressee, roomSubmitter, stopRoomExchange } from './daemon-session-control/room-host.mjs';
|
|
32
|
+
import {
|
|
33
|
+
assertSendRequest,
|
|
34
|
+
chainedHop,
|
|
35
|
+
chainedOrigin,
|
|
36
|
+
effortApplier,
|
|
37
|
+
unreportedSendResult,
|
|
38
|
+
} from './daemon-session-control/send-turn.mjs';
|
|
25
39
|
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
/** Sessions with live work now, from the sources the Agents pool reads:
|
|
41
|
+
* `own` (id → its latest sign of work, epoch ms) — a turn in flight in this
|
|
42
|
+
* process, or a pool row still running or queued (worker index
|
|
43
|
+
* status/stage); `agents` — the Leads such an Agent session works for. */
|
|
44
|
+
async function storedLiveWork() {
|
|
45
|
+
const [
|
|
46
|
+
{ inFlightSessionActivity },
|
|
47
|
+
{ listStoredAgentWorkersAsync },
|
|
48
|
+
{ hasPendingAgentWork, sessionsWithPendingWork },
|
|
49
|
+
] = await Promise.all([
|
|
50
|
+
import('../runtime/agent/orchestrator/session/manager/runtime-state.mjs'),
|
|
51
|
+
import('../runtime/agent/orchestrator/session/store-agent-worker-rows.mjs'),
|
|
52
|
+
import('../runtime/shared/pending-agent-work.mjs'),
|
|
53
|
+
]);
|
|
54
|
+
const { working, agentWorking } = inFlightSessionActivity();
|
|
55
|
+
const pool = await listStoredAgentWorkersAsync({ runningSessionIds: working });
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
const own = new Map([...working].map((id) => [id, now]));
|
|
58
|
+
for (const row of pool) {
|
|
59
|
+
const id = String(row?.sessionId || '');
|
|
60
|
+
if (id && !own.has(id) && hasPendingAgentWork(row)) own.set(id, Date.parse(row.updatedAt) || 0);
|
|
35
61
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
62
|
+
return { own, agents: new Set([...agentWorking, ...sessionsWithPendingWork(pool)]) };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The catalog row of `sessionId` read by id, or null when the catalog would not list it. */
|
|
66
|
+
async function storedCatalogRow(sessionId) {
|
|
67
|
+
const { readStoredSessionCatalogRow } = await import(
|
|
68
|
+
'../runtime/agent/orchestrator/session/store-summary-reader.mjs'
|
|
69
|
+
);
|
|
70
|
+
return readStoredSessionCatalogRow(sessionId);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The stored title of `sessionId` (its session record), or null. */
|
|
74
|
+
async function storedTitle(sessionId) {
|
|
75
|
+
const { readStoredSessionTranscript } = await import(
|
|
76
|
+
'../runtime/agent/orchestrator/session/store-summary-reader.mjs'
|
|
77
|
+
);
|
|
78
|
+
return (await readStoredSessionTranscript(sessionId, { metadataOnly: true }))?.title || null;
|
|
40
79
|
}
|
|
41
80
|
|
|
42
81
|
/** Model-facing session operations over the same service used by desktop and TUI. */
|
|
@@ -44,115 +83,86 @@ export function createSessionControl({
|
|
|
44
83
|
getSessionService,
|
|
45
84
|
agentTasks = createAgentTaskSessions({ getSessionService }),
|
|
46
85
|
botStatus = createBotStatus({ getSessionService }),
|
|
86
|
+
// Agent work a session handed off and still waits on (agent-task-sessions.mjs).
|
|
87
|
+
pendingWork = taskSessionPendingWork,
|
|
88
|
+
liveWork = storedLiveWork,
|
|
89
|
+
readRow = storedCatalogRow,
|
|
90
|
+
readTitle = storedTitle,
|
|
47
91
|
}) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
* (session-runtime/workspace/worktree-tool.mjs): one workspace method with
|
|
51
|
-
* one input, through the same configure / read lanes the desktop uses. No
|
|
52
|
-
* `ownTurn` ever crosses: the target must be idle. A change (anything but
|
|
53
|
-
* the menu read) needs the caller's trusted scope (`callerScope`, from
|
|
54
|
-
* worktree-access.mjs worktreeCallerScope) to be an attended conversation.
|
|
55
|
-
*/
|
|
56
|
-
async function worktreeControl(args, caller, callerScope) {
|
|
57
|
-
const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';
|
|
58
|
-
if (!SESSION_ID_PATTERN.test(sessionId)) throw new Error('session: session_id is required for action=worktree');
|
|
59
|
-
if (sessionId === caller) throw new Error('session: worktree control must target another session');
|
|
60
|
-
if (!WORKTREE_METHODS.has(args.method)) throw new Error(`session: unsupported worktree method "${args.method}"`);
|
|
61
|
-
if (args.method !== 'getBranchMenu') assertWorktreeMutationAllowed(callerScope, `session: worktree ${args.method}`);
|
|
62
|
-
const service = getSessionService();
|
|
63
|
-
if (!service) throw new Error('session: session service is unavailable');
|
|
64
|
-
if (args.method === 'getBranchMenu') {
|
|
65
|
-
return (await service.readSession({ sessionId, action: 'getBranchMenu', args: [] })).value;
|
|
66
|
-
}
|
|
67
|
-
const result = await service.configureSession(
|
|
68
|
-
{ sessionId, action: args.method, args: [args.input ?? {}] },
|
|
69
|
-
{ revision: 1 }
|
|
70
|
-
);
|
|
71
|
-
return result.value;
|
|
72
|
-
}
|
|
92
|
+
const worktreeControl = createWorktreeControl(getSessionService);
|
|
93
|
+
const routeControl = createRouteControl(getSessionService);
|
|
73
94
|
|
|
74
95
|
return async function executeSessionControl(args = {}, context = {}) {
|
|
75
96
|
const action = args.action;
|
|
76
|
-
|
|
77
|
-
action !== 'list' &&
|
|
78
|
-
action !== 'create' &&
|
|
79
|
-
action !== 'bots' &&
|
|
80
|
-
action !== 'worktree' &&
|
|
81
|
-
!TARGET_ACTIONS.has(action)
|
|
82
|
-
) {
|
|
83
|
-
throw new Error(`session: unsupported remote action "${action}"`);
|
|
84
|
-
}
|
|
85
|
-
const caller = context.callerSessionId;
|
|
86
|
-
if (typeof caller !== 'string' || !SESSION_ID_PATTERN.test(caller)) {
|
|
87
|
-
throw new Error('session: caller session is required');
|
|
88
|
-
}
|
|
97
|
+
const caller = requestCaller(action, context);
|
|
89
98
|
// `callerAgentId`: set only for an attended agent conversation (workspace-tools.mjs).
|
|
90
99
|
if (action === 'create') return agentTasks.create(args, context);
|
|
91
100
|
if (action === 'worktree') return worktreeControl(args, caller, context.callerScope);
|
|
101
|
+
// The setup tool's per-session route actions (authorized by the setup executor).
|
|
102
|
+
if (action === 'route') return routeControl(args, caller);
|
|
92
103
|
// `callerScope`: the caller's schedule-access scope (workspace-tools.mjs).
|
|
93
104
|
if (action === 'bots') return botStatus(args, context);
|
|
94
|
-
const sessionId
|
|
95
|
-
if (TARGET_ACTIONS.has(action) && !SESSION_ID_PATTERN.test(sessionId)) {
|
|
96
|
-
throw new Error(`session: session_id is required for action=${action}`);
|
|
97
|
-
}
|
|
98
|
-
if (MUTATING_ACTIONS.has(action) && sessionId === caller) {
|
|
99
|
-
throw new Error(`session: ${action} must target another session`);
|
|
100
|
-
}
|
|
101
|
-
const limit = args.limit ?? 25;
|
|
102
|
-
if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
103
|
-
throw new Error('session: limit must be an integer from 1 to 100');
|
|
104
|
-
}
|
|
105
|
-
const offset = args.offset ?? 0;
|
|
106
|
-
const textOffset = args.text_offset ?? 0;
|
|
107
|
-
if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(offset + limit)) {
|
|
108
|
-
throw new Error('session: offset must be a nonnegative safe integer');
|
|
109
|
-
}
|
|
110
|
-
if (!Number.isSafeInteger(textOffset) || textOffset < 0) throw new Error('session: invalid text_offset');
|
|
111
|
-
if (args.text_offset !== undefined && (args.offset === undefined || limit !== 1 || !args.item_id)) {
|
|
112
|
-
throw new Error('session: text_offset requires offset, limit:1 and item_id from read');
|
|
113
|
-
}
|
|
105
|
+
const { sessionId, limit, offset, textOffset } = targetRequest(args, action, caller);
|
|
114
106
|
const service = getSessionService();
|
|
115
107
|
if (!service) throw new Error('session: session service is unavailable');
|
|
116
108
|
if (action === 'list') {
|
|
117
|
-
|
|
118
|
-
if (args[flag] !== undefined && typeof args[flag] !== 'boolean') {
|
|
119
|
-
throw new Error(`session: ${flag} must be a boolean`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
109
|
+
assertListFlags(args);
|
|
122
110
|
// Scoped like bots (`callerScope`, bot-status.mjs): the human's sessions
|
|
123
|
-
// list everything, a bot (or its unattended run)
|
|
124
|
-
//
|
|
111
|
+
// list everything with previews, a bot (or its unattended run) lists the
|
|
112
|
+
// same rows (so it can find a session to send to) but only its own carry
|
|
113
|
+
// the bot, activity, preview and working state, anything else the plain
|
|
114
|
+
// rows without previews. Sub-agent sessions (a
|
|
125
115
|
// parent finds its own through the agent tool) and archived ones (the
|
|
126
116
|
// desktop's flag) only on request; the scan pages past the rows left
|
|
127
117
|
// out, so a page is never short while more rows match.
|
|
128
118
|
const own = scopedBot(context.callerScope);
|
|
129
119
|
const archived = (await readSessionSidebarState())?.archived ?? {};
|
|
130
|
-
const keep = (
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
120
|
+
const keep = listRowFilter(args, archived);
|
|
121
|
+
// Live work is overlaid on every row: a catalog row keeps the status and
|
|
122
|
+
// recency of its last settled turn, so a long-running agent read `idle`
|
|
123
|
+
// and sorted by its first prompt. The first page lists the live rows
|
|
124
|
+
// first (newest sign of work first); a later page keeps catalog order,
|
|
125
|
+
// where such a row may show again (never skipped).
|
|
126
|
+
const live = await liveWork();
|
|
127
|
+
const withLive = liveRowOverlay(live);
|
|
128
|
+
// Each live session's row is read by id (wherever it sits in the
|
|
129
|
+
// catalog), filtered like the listing, and the newest `limit` lead.
|
|
130
|
+
const candidates = liveCandidates(live);
|
|
131
|
+
let pinned = [];
|
|
132
|
+
if (!args.cursor && candidates.length) {
|
|
133
|
+
pinned = pinnedLiveRows(await Promise.all(candidates.map((id) => readRow(id))), keep, withLive, limit);
|
|
134
|
+
}
|
|
135
|
+
const pinnedIds = new Set(pinned.map((row) => row.id));
|
|
136
|
+
const want = limit - pinned.length;
|
|
134
137
|
// Bounded: past 10000 rows scanned with fewer than `limit` matching, the
|
|
135
138
|
// page ends (possibly empty) with a nextCursor to continue from.
|
|
136
|
-
const scan =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
+
const scan =
|
|
140
|
+
want > 0
|
|
141
|
+
? await scanCatalog(service, (row) => !pinnedIds.has(row.id) && keep(row), {
|
|
142
|
+
cursor: args.cursor || null,
|
|
143
|
+
want,
|
|
144
|
+
maxRows: 10_000,
|
|
145
|
+
})
|
|
146
|
+
: { rows: [], nextCursor: TOP_CURSOR };
|
|
147
|
+
const sessions = listedSessions(pinned, scan.rows, withLive, archived);
|
|
148
|
+
return sessionListOutput({ sessions, nextCursor: scan.nextCursor }, limit, listOutputOptions(own, pinnedIds));
|
|
139
149
|
}
|
|
140
150
|
if (action === 'send') {
|
|
141
|
-
|
|
142
|
-
throw new Error('session: prompt is required for action=send');
|
|
143
|
-
}
|
|
144
|
-
// A room member's session is the room's to drive: a message goes to the
|
|
145
|
-
// room, naming the member.
|
|
146
|
-
if (roomMemberOfSession(sessionId)) {
|
|
147
|
-
throw new Error(
|
|
148
|
-
`session: ${sessionId} is a group-room member's session; send to its room (session_id ${roomSessionId(roomMemberOfSession(sessionId).roomId)}) with to: <member>`
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
+
assertSendRequest(args, sessionId);
|
|
151
152
|
// A send to a room's log is a message to one member there (`to`, or a
|
|
152
153
|
// leading @name), run by the desktop room host; the member's turn in
|
|
153
154
|
// its member session is the turn that answers and reports.
|
|
154
155
|
const room = roomIdOfSession(sessionId) ? await roomAddressee(sessionId, args) : null;
|
|
155
156
|
if (room?.sessionId === caller) throw new Error('session: send must target another session');
|
|
157
|
+
// Work goes on to a bot (a room seat's, or a bot's home) only outside
|
|
158
|
+
// the caller's bot chain (`callerBotChain`, bot-chain.mjs), never back
|
|
159
|
+
// to the caller's own bot; the turn it starts carries that chain on.
|
|
160
|
+
const botChain = botChainOf(context.callerBotChain);
|
|
161
|
+
assertBotChainTarget(
|
|
162
|
+
room ? room.agentId : agentIdOfHomeSession(sessionId),
|
|
163
|
+
{ chain: botChain, self: context.callerBotId || context.callerAgentId || '' },
|
|
164
|
+
'session'
|
|
165
|
+
);
|
|
156
166
|
// An agent conversation's send reports its turn back to the agent's
|
|
157
167
|
// home: a task session it created by its stored origin, any other
|
|
158
168
|
// session by an origin for this send only.
|
|
@@ -160,42 +170,42 @@ export function createSessionControl({
|
|
|
160
170
|
const prompt = handoffContent(room ? room.text : args.prompt, context.attachmentParts);
|
|
161
171
|
const turnSessionId = room ? room.sessionId : sessionId;
|
|
162
172
|
const from = { sessionId: caller, ...(context.callerAgentId ? { agentId: context.callerAgentId } : {}) };
|
|
163
|
-
|
|
164
|
-
// chain through the room counts on toward MAX_BOT_HOPS.
|
|
165
|
-
const submit = room
|
|
166
|
-
? async ({ id, onSettled, follow, transcriptMeta } = {}) => ({
|
|
167
|
-
accepted:
|
|
168
|
-
(await room.host.ask(sessionId, {
|
|
169
|
-
agentId: room.agentId,
|
|
170
|
-
prompt,
|
|
171
|
-
from,
|
|
172
|
-
...(id ? { id } : {}),
|
|
173
|
-
...(transcriptMeta?.hop > 0 ? { hop: transcriptMeta.hop } : {}),
|
|
174
|
-
...(onSettled ? { onSettled } : {}),
|
|
175
|
-
...(follow ? { follow } : {}),
|
|
176
|
-
})) === true,
|
|
177
|
-
})
|
|
178
|
-
: null;
|
|
173
|
+
const submit = room ? roomSubmitter(room, sessionId, prompt, from) : null;
|
|
179
174
|
const addressed = room ? { to: room.agentId } : {};
|
|
180
175
|
let origin = await agentTasks.reportOrigin(turnSessionId, context.callerAgentId, caller);
|
|
176
|
+
// `effort` is the menu's effort pick on the target: checked now against the
|
|
177
|
+
// levels of its model, applied just before the prompt is queued.
|
|
178
|
+
let applyEffort = async () => {};
|
|
179
|
+
if (args.effort !== undefined) {
|
|
180
|
+
if (room) throw new Error('session: effort applies to a session, not a group room');
|
|
181
|
+
// Any bot, attended or not (`callerBotId`), changes only the task
|
|
182
|
+
// sessions it created; reports go only to a bot conversation.
|
|
183
|
+
const botId = context.callerBotId || context.callerAgentId || '';
|
|
184
|
+
if (botId && (await agentTasks.reportOrigin(sessionId, botId, caller))?.target === 'session') {
|
|
185
|
+
throw new Error('session: a bot may set the effort only of the task sessions it created');
|
|
186
|
+
}
|
|
187
|
+
const target = (await service.readSession({ sessionId, transcriptItemLimit: 1 })).full;
|
|
188
|
+
if (!target) throw new Error(`session: ${sessionId} is unavailable`);
|
|
189
|
+
const level = checkEffort(args.effort, target, await readModelCatalog(service, caller));
|
|
190
|
+
applyEffort = effortApplier(service, sessionId, level);
|
|
191
|
+
}
|
|
181
192
|
// A send made in a bot-descended turn (`callerHop` > 0), or by a bot to
|
|
182
193
|
// another session, extends the chain by one; a bot's own task session
|
|
183
194
|
// only continues it. Refused past the limit, whatever the target.
|
|
184
195
|
const turnHop = Number(context.callerHop) || 0;
|
|
185
|
-
const chained = (hop) => {
|
|
186
|
-
if (hop > MAX_BOT_HOPS) throw new Error(BOT_HOP_LIMIT_ERROR);
|
|
187
|
-
return hop;
|
|
188
|
-
};
|
|
189
196
|
if (origin) {
|
|
190
|
-
const hop =
|
|
191
|
-
|
|
197
|
+
const hop = chainedHop(origin.target === 'session' ? turnHop + 1 : turnHop);
|
|
198
|
+
origin = chainedOrigin(origin, hop, botChain);
|
|
192
199
|
// The task session a bot created acts as the sending conversation does
|
|
193
200
|
// from now on (attended chat or run); another's session keeps its own.
|
|
194
201
|
if (origin.target !== 'session') await rebindDelegation(sessionId, caller);
|
|
202
|
+
await applyEffort();
|
|
195
203
|
const sent = await agentTasks.send(turnSessionId, prompt, origin, submit);
|
|
196
204
|
return { sessionId, ...addressed, ...sent, ...(hop > 0 ? { hop } : {}) };
|
|
197
205
|
}
|
|
198
|
-
const hop = turnHop > 0 ?
|
|
206
|
+
const hop = turnHop > 0 ? chainedHop(turnHop + 1) : 0;
|
|
207
|
+
await applyEffort();
|
|
208
|
+
const chainMeta = { ...(hop > 0 ? { hop } : {}), ...(botChain.length ? { botChain } : {}) };
|
|
199
209
|
let accepted;
|
|
200
210
|
if (submit) accepted = (await submit(hop > 0 ? { transcriptMeta: { hop } } : {})).accepted;
|
|
201
211
|
else {
|
|
@@ -204,31 +214,16 @@ export function createSessionControl({
|
|
|
204
214
|
const result = await service.submitSession({
|
|
205
215
|
sessionId,
|
|
206
216
|
prompt,
|
|
207
|
-
options: { mode: 'prompt', transcriptMeta: { sender: 'lead', ...
|
|
217
|
+
options: { mode: 'prompt', transcriptMeta: { sender: 'lead', ...chainMeta } },
|
|
208
218
|
});
|
|
209
219
|
accepted = result.accepted === true;
|
|
210
220
|
}
|
|
211
|
-
return
|
|
212
|
-
sessionId,
|
|
213
|
-
...addressed,
|
|
214
|
-
accepted,
|
|
215
|
-
reportsBack: false,
|
|
216
|
-
...(accepted ? { reportsBackReason: NOT_BOT_REASON } : {}),
|
|
217
|
-
...(hop > 0 ? { hop } : {}),
|
|
218
|
-
};
|
|
221
|
+
return unreportedSendResult(sessionId, addressed, accepted, hop);
|
|
219
222
|
}
|
|
220
223
|
if (action === 'cancel') {
|
|
221
224
|
// A room's exchange is run by the desktop room host, so its stop (the UI
|
|
222
225
|
// stop button) ends it; the log is not a session the service can abort.
|
|
223
|
-
if (roomIdOfSession(sessionId))
|
|
224
|
-
let host;
|
|
225
|
-
try {
|
|
226
|
-
host = agentRoomHost();
|
|
227
|
-
} catch (error) {
|
|
228
|
-
throw new Error(`session: cannot cancel ${sessionId}: ${error.message}`);
|
|
229
|
-
}
|
|
230
|
-
return { sessionId, aborted: host.stop(sessionId) === true };
|
|
231
|
-
}
|
|
226
|
+
if (roomIdOfSession(sessionId)) return stopRoomExchange(sessionId);
|
|
232
227
|
const result = await service.abortSession({ sessionId });
|
|
233
228
|
return { sessionId, aborted: result.aborted === true };
|
|
234
229
|
}
|
|
@@ -250,13 +245,22 @@ export function createSessionControl({
|
|
|
250
245
|
});
|
|
251
246
|
const snapshot = result.full;
|
|
252
247
|
if (!snapshot) throw new Error(`session: ${sessionId} is unavailable`);
|
|
248
|
+
// The snapshot carries no title: it lives on the session record. Quoted
|
|
249
|
+
// like a listed title.
|
|
250
|
+
const title = await readTitle(sessionId);
|
|
253
251
|
return {
|
|
254
252
|
sessionId,
|
|
255
|
-
title:
|
|
253
|
+
title: title ? escapeHarnessTags(truncateToolText(title, SESSION_TITLE_LIMIT)) : null,
|
|
256
254
|
cwd: snapshot.cwd ?? null,
|
|
257
255
|
provider: snapshot.provider ?? null,
|
|
258
256
|
model: snapshot.model ?? null,
|
|
257
|
+
effort: snapshot.effort ?? null,
|
|
258
|
+
autoEffort: snapshot.autoEffort ?? null,
|
|
259
|
+
fast: snapshot.fast ?? null,
|
|
259
260
|
busy: snapshot.busy === true,
|
|
261
|
+
// A Lead idle between turns while its agents run is still working:
|
|
262
|
+
// their results wake it, so `busy` alone would read as stalled.
|
|
263
|
+
agentsWorking: (await pendingWork(sessionId)) === true,
|
|
260
264
|
quotaResume: snapshot.quotaResume ?? null,
|
|
261
265
|
};
|
|
262
266
|
};
|
|
@@ -77,7 +77,12 @@ import { createStoredSessionViews } from './daemon-stored-session-views.mjs';
|
|
|
77
77
|
import * as quotaResumeStore from '../runtime/shared/quota-resume-store.mjs';
|
|
78
78
|
import { registerWorktreeCacheCleanups } from '../runtime/shared/worktrees/cache-cleanups.mjs';
|
|
79
79
|
import { createInlineSessionRuntimeHost } from './session-runtime-inline-host.mjs';
|
|
80
|
-
import {
|
|
80
|
+
import {
|
|
81
|
+
postBeforeAgentTurn,
|
|
82
|
+
recoverScheduleResults,
|
|
83
|
+
setAgentHomeLiveSurface,
|
|
84
|
+
} from '../session-runtime/agent-home-delivery.mjs';
|
|
85
|
+
import { setSessionTurnPrelude } from '../runtime/shared/session-turn-prelude.mjs';
|
|
81
86
|
import { recoverRoutineDeliveries } from '../session-runtime/owned-automation-run.mjs';
|
|
82
87
|
import { getStandaloneMemoryRuntime } from '../session-runtime/services/memory-runtime-proxy.mjs';
|
|
83
88
|
import { registerTranscriptPurgeHook } from '../session-runtime/session-transcript-purge.mjs';
|
|
@@ -1001,6 +1006,8 @@ async function main() {
|
|
|
1001
1006
|
setAgentHomeLiveSurface({
|
|
1002
1007
|
busy: (sessionId) => sessionService.liveSessionBusy(sessionId),
|
|
1003
1008
|
notice: (sessionId, notice) => sessionService.pushLiveSessionNotice(sessionId, notice),
|
|
1009
|
+
// A bot's emoji reaction on a user message (message-reactions.mjs).
|
|
1010
|
+
react: (sessionId, messageId, reactions) => sessionService.setLiveMessageReactions(sessionId, messageId, reactions),
|
|
1004
1011
|
// A task session's result (session create): the agent relays it in one
|
|
1005
1012
|
// turn. Resolves false when the turn was refused, else `{ settled }`, the
|
|
1006
1013
|
// turn's end status ('done' when it finished).
|
|
@@ -1015,6 +1022,9 @@ async function main() {
|
|
|
1015
1022
|
options: {
|
|
1016
1023
|
mode: 'prompt',
|
|
1017
1024
|
kickoff: true,
|
|
1025
|
+
// Another bot or agent reported back: the runtime's turn, which the
|
|
1026
|
+
// prompt-cache warmer does not learn from (shared/prompt-origin.mjs).
|
|
1027
|
+
origin: 'agent-report',
|
|
1018
1028
|
...(id ? { id } : {}),
|
|
1019
1029
|
...(hop > 0 ? { transcriptMeta: { hop } } : {}),
|
|
1020
1030
|
onSettled: (detail) => settle(String(detail?.status || 'failed')),
|
|
@@ -1027,12 +1037,33 @@ async function main() {
|
|
|
1027
1037
|
(await sessionService.submitSession({ sessionId, prompt, options }))?.accepted === true,
|
|
1028
1038
|
abort: (sessionId) => sessionService.abortSession({ sessionId }),
|
|
1029
1039
|
});
|
|
1040
|
+
// A bot's next turn, whatever starts it, first reads the progress updates
|
|
1041
|
+
// queued for its thread (they wake nobody on their own).
|
|
1042
|
+
setSessionTurnPrelude(postBeforeAgentTurn);
|
|
1043
|
+
// Mixy's heartbeat check (user-set interval) (mixy-heartbeat.mjs), on an unref'd timer.
|
|
1044
|
+
import('../session-runtime/mixy-heartbeat.mjs')
|
|
1045
|
+
.then(({ startMixyHeartbeat }) =>
|
|
1046
|
+
startMixyHeartbeat({ getSessionService: () => sessionService, log: (line) => log(`heartbeat: ${line}`) })
|
|
1047
|
+
)
|
|
1048
|
+
.catch((error) => log(`heartbeat start failed: ${error?.message || error}`));
|
|
1030
1049
|
// Results queued before a restart are posted now; results a finished run
|
|
1031
1050
|
// could not queue (kept on its routine's record) are queued again.
|
|
1032
1051
|
recoverScheduleResults().catch((error) => log(`routine results recovery failed: ${error?.message || error}`));
|
|
1033
1052
|
// Agents' sends whose report an earlier process had not queued yet.
|
|
1034
1053
|
agentTasks.recover().catch((error) => log(`agent task report recovery failed: ${error?.message || error}`));
|
|
1035
1054
|
recoverRoutineDeliveries().catch((error) => log(`routine delivery recovery failed: ${error?.message || error}`));
|
|
1055
|
+
// Compaction-archive segments an earlier process could not publish.
|
|
1056
|
+
import('../runtime/agent/orchestrator/session/compaction-archive-capture.mjs')
|
|
1057
|
+
.then(({ recoverPendingCompactionArchives }) => recoverPendingCompactionArchives())
|
|
1058
|
+
.then((pending) => pending && log(`compaction archive: publishing pending segments of ${pending} session(s)`))
|
|
1059
|
+
.catch((error) => log(`compaction archive recovery failed: ${error?.message || error}`));
|
|
1060
|
+
// Prompt-cache warms toward routine fires (session/cache-warm.mjs) lived in
|
|
1061
|
+
// the previous process: re-arm them from their durable cache touches (the
|
|
1062
|
+
// re-arm waits for the providers to be registered).
|
|
1063
|
+
import('../runtime/agent/orchestrator/session/cache-warm.mjs')
|
|
1064
|
+
.then(({ rearmCacheWarmsAfterRestart }) => rearmCacheWarmsAfterRestart())
|
|
1065
|
+
.then((armed) => armed && log(`cache warm: re-armed ${armed} session(s)`))
|
|
1066
|
+
.catch((error) => log(`cache warm re-arm failed: ${error?.message || error}`));
|
|
1036
1067
|
sessionTransport = createSessionTransport({
|
|
1037
1068
|
// ctx carries the CLIENT token: the session service refcounts views across
|
|
1038
1069
|
// processes with it, so a terminal exiting cannot destroy the session a
|
|
@@ -1088,7 +1119,7 @@ async function main() {
|
|
|
1088
1119
|
|
|
1089
1120
|
// A pinned channel session outlives the daemon that pinned it. Reactivate the
|
|
1090
1121
|
// durable intent AFTER the ready handshake (activation itself brings the
|
|
1091
|
-
//
|
|
1122
|
+
// channel bridge up); with no intent on disk this is a no-op and the
|
|
1092
1123
|
// channels graph stays dormant.
|
|
1093
1124
|
if (transport.remoteIntentSessionId) {
|
|
1094
1125
|
void transport
|
|
@@ -274,7 +274,9 @@ async function replaceLowerDaemon(discovery, initialHealth, { log, onUpgradeWait
|
|
|
274
274
|
const notify = (state) => {
|
|
275
275
|
try {
|
|
276
276
|
onUpgradeWait?.({ state, ...info });
|
|
277
|
-
} catch {
|
|
277
|
+
} catch {
|
|
278
|
+
// A throwing progress callback must not abort the upgrade wait.
|
|
279
|
+
}
|
|
278
280
|
};
|
|
279
281
|
const done = () => {
|
|
280
282
|
notify('done');
|
|
@@ -376,7 +378,8 @@ export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = dae
|
|
|
376
378
|
}
|
|
377
379
|
|
|
378
380
|
/** Spawn-or-attach discovery for the machine-global daemon.
|
|
379
|
-
* `entry`
|
|
381
|
+
* `entry` and `proveOwner` are test seams; production always forks the real
|
|
382
|
+
* daemon and probes the real owner. */
|
|
380
383
|
export async function ensureDaemon({
|
|
381
384
|
cwd = process.cwd(),
|
|
382
385
|
log = () => {},
|
|
@@ -384,6 +387,7 @@ export async function ensureDaemon({
|
|
|
384
387
|
readyTimeoutMs = null,
|
|
385
388
|
onUpgradeWait = null,
|
|
386
389
|
entry = daemonEntry(),
|
|
390
|
+
proveOwner = proveDaemonOwnerRecord,
|
|
387
391
|
} = {}) {
|
|
388
392
|
const configuredTimeoutMs = Number(process.env.MIXDOG_DAEMON_READY_TIMEOUT_MS);
|
|
389
393
|
let requestedTimeoutMs = DEFAULT_DAEMON_READY_TIMEOUT_MS;
|
|
@@ -460,7 +464,7 @@ export async function ensureDaemon({
|
|
|
460
464
|
// answer with its pid — a crashed daemon leaves its files behind, naming a
|
|
461
465
|
// pid the OS may have reused. A probe cut short by this deadline proves
|
|
462
466
|
// nothing either way.
|
|
463
|
-
const proof = await
|
|
467
|
+
const proof = await proveOwner(daemonOwnerPath(), {
|
|
464
468
|
discoveryPath: sessionDiscoveryPath(),
|
|
465
469
|
budgetMs: Math.max(1, deadline - Date.now()),
|
|
466
470
|
});
|
|
@@ -27,6 +27,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
27
27
|
'getChannelSettings',
|
|
28
28
|
'getChannelSetup',
|
|
29
29
|
'getChannelWorkerStatus',
|
|
30
|
+
'getCacheWarmingSettings',
|
|
30
31
|
'getCompactionSettings',
|
|
31
32
|
'getConversationImportJobs',
|
|
32
33
|
'getDeveloperSettings',
|
|
@@ -40,6 +41,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
40
41
|
'getOAuthProviderLoginStatus',
|
|
41
42
|
'getOutputStyle',
|
|
42
43
|
'getOrchestrationMode',
|
|
44
|
+
'getConfiguredOrchestrationMode',
|
|
43
45
|
'getProfile',
|
|
44
46
|
'getProviderSetup',
|
|
45
47
|
'getProviderAccounts',
|
|
@@ -47,6 +49,8 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
47
49
|
'getQuotaHistory',
|
|
48
50
|
'getRecapSettings',
|
|
49
51
|
'getSessionTitleSettings',
|
|
52
|
+
'getHeartbeatSettings',
|
|
53
|
+
'getReactionSettings',
|
|
50
54
|
'getLeadAppearance',
|
|
51
55
|
'getBotOrder',
|
|
52
56
|
'getWebSearchRoute',
|
|
@@ -134,6 +138,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
134
138
|
'deleteMediaAssets',
|
|
135
139
|
'deleteSchedule',
|
|
136
140
|
'saveCustomProvider',
|
|
141
|
+
'saveCustomProviderKey',
|
|
137
142
|
'removeCustomProvider',
|
|
138
143
|
'updateCustomProviderModel',
|
|
139
144
|
'setModelPreferences',
|
|
@@ -208,6 +213,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
208
213
|
'setAgentRoute',
|
|
209
214
|
'setAutoClear',
|
|
210
215
|
'setAutoUpdate',
|
|
216
|
+
'setCacheWarmingEnabled',
|
|
211
217
|
'setCompactionSettings',
|
|
212
218
|
'setCwd',
|
|
213
219
|
'setDeveloperOption',
|
|
@@ -238,6 +244,10 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
238
244
|
'setProgressHint',
|
|
239
245
|
'setRecapEnabled',
|
|
240
246
|
'setAiSessionTitles',
|
|
247
|
+
'setHeartbeatEnabled',
|
|
248
|
+
'setHeartbeatInterval',
|
|
249
|
+
'noteUserInput',
|
|
250
|
+
'setReactionsEnabled',
|
|
241
251
|
'setLeadAppearance',
|
|
242
252
|
'setBotOrder',
|
|
243
253
|
'setRoute',
|
|
@@ -64,9 +64,10 @@ export function createAgentCancellation({
|
|
|
64
64
|
if (typeof closeCanonical !== 'function') {
|
|
65
65
|
throw new TypeError('session runtime must implement closeCanonicalSession');
|
|
66
66
|
}
|
|
67
|
+
const wasRunning = descriptor.status === 'running';
|
|
67
68
|
// The close clears the transcript: capture a running turn's transcript
|
|
68
69
|
// first so the cancelled turn still hands off its partial output.
|
|
69
|
-
if (
|
|
70
|
+
if (wasRunning) {
|
|
70
71
|
try {
|
|
71
72
|
const { messages } = await entry.runtime.readModelMessages(0);
|
|
72
73
|
rememberCancelTranscript(id, messages);
|
|
@@ -77,7 +78,10 @@ export function createAgentCancellation({
|
|
|
77
78
|
const closed = await closeCanonical.call(entry.runtime, reason, { tombstone: options.tombstone === true });
|
|
78
79
|
if (closed !== true) throw new Error(`agent session ${id} could not be durably closed`);
|
|
79
80
|
descriptor.closed = options.tombstone === true;
|
|
80
|
-
|
|
81
|
+
// Only a close that stopped a running turn is a cancellation; closing a
|
|
82
|
+
// finished agent (cleanup after its handoff) keeps its last status.
|
|
83
|
+
if (descriptor.closed) descriptor.status = 'closed';
|
|
84
|
+
else if (wasRunning) descriptor.status = 'cancelled';
|
|
81
85
|
descriptor.stage = descriptor.status;
|
|
82
86
|
descriptor.updatedAt = Date.now();
|
|
83
87
|
return true;
|
|
@@ -31,6 +31,7 @@ export function createAgentChildFactory({ registry, rehydrateAgentSessions, crea
|
|
|
31
31
|
sourceName: spec.sourceName || spec.agent || 'agent',
|
|
32
32
|
clientHostPid: spec.clientHostPid || null,
|
|
33
33
|
...(preset.fallbacks !== undefined ? { routeFallbacks: preset.fallbacks } : {}),
|
|
34
|
+
...(preset.fallbackSource ? { routeFallbackSource: preset.fallbackSource } : {}),
|
|
34
35
|
};
|
|
35
36
|
const created = await createSession({
|
|
36
37
|
cwd: spec.cwd || process.cwd(),
|
|
@@ -44,6 +44,9 @@ async function resumeDueEntry(entry, { store, materializeSession, readQuotaUsabl
|
|
|
44
44
|
try {
|
|
45
45
|
usable = await readQuotaUsable(provider, model);
|
|
46
46
|
} catch (error) {
|
|
47
|
+
// A disconnected PC supplies no quota reading. The scheduler's outer
|
|
48
|
+
// deferral keeps this reservation without spending an exhaustion attempt.
|
|
49
|
+
if (error?.code === 'MODEL_PROXY_UNAVAILABLE') throw error;
|
|
47
50
|
log(`quota resume usage reading failed provider=${provider}: ${error?.message || error}`);
|
|
48
51
|
}
|
|
49
52
|
if (!isCurrent(store, entry)) return 'cancelled';
|