mixdog 1.3.5 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +2 -2
- package/README.md +2 -2
- package/package.json +2 -11
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +16 -5
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +37 -37
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +123 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -4
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +20 -2
- package/scripts/test-data-dir.mjs +10 -7
- package/scripts/test.mjs +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/app.mjs +4 -0
- package/src/defaults/shipped-history.json +22 -1
- package/src/defaults/skills/browser-use/SKILL.md +62 -12
- package/src/defaults/skills/code-tidy/SKILL.md +142 -270
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
- package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
- package/src/defaults/skills/computer-use/SKILL.md +35 -9
- package/src/defaults/skills/setup/SKILL.md +22 -0
- package/src/defaults/skills/setup/references/actions.md +39 -5
- package/src/defaults/skills/setup/references/surfaces.md +11 -2
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/rules-builder.cjs +39 -20
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +11 -10
- package/src/rules/lead/LEAD.md +23 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/rules/shared/70-delivery.md +7 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +17 -1
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
- package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
- package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
- package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
- package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
- package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
- package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
- package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
- package/src/runtime/browser-bridge/action-schema.mjs +13 -2
- package/src/runtime/browser-bridge/client.mjs +73 -8
- package/src/runtime/browser-bridge/input-fields.mjs +8 -9
- package/src/runtime/browser-bridge/mail-links.mjs +107 -0
- package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
- package/src/runtime/channels/lib/config.mjs +6 -61
- package/src/runtime/channels/lib/crash-log.mjs +1 -1
- package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
- package/src/runtime/channels/lib/event-queue.mjs +3 -18
- package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
- package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
- package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
- package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
- package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
- package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
- package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
- package/src/runtime/channels/lib/scheduler.mjs +33 -147
- package/src/runtime/channels/lib/schedules-db.mjs +34 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/whisper-port.mjs +10 -1
- package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
- package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
- package/src/runtime/channels/lib/worker-main.mjs +10 -34
- package/src/runtime/computer-bridge/action-schema.mjs +42 -1
- package/src/runtime/computer-bridge/actions.mjs +9 -1
- package/src/runtime/computer-bridge/client.mjs +180 -8
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
- package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
- package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
- package/src/runtime/connectors/gmail-app-password.mjs +172 -39
- package/src/runtime/connectors/google-mcp.mjs +10 -12
- package/src/runtime/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
- package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
- package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
- package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- package/src/runtime/session-search/session-search-db.mjs +73 -9
- package/src/runtime/session-search/session-search-ingest.mjs +110 -20
- package/src/runtime/shared/abort-race.mjs +89 -0
- package/src/runtime/shared/agent-avatar.d.mts +0 -1
- package/src/runtime/shared/agent-kind.mjs +4 -3
- package/src/runtime/shared/bot-owned-work.mjs +56 -0
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +2 -13
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +29 -0
- package/src/runtime/shared/connector-catalog.mjs +150 -0
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -17
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/err-text.mjs +24 -15
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- package/src/runtime/shared/file-permissions.d.mts +0 -8
- package/src/runtime/shared/file-permissions.mjs +0 -11
- package/src/runtime/shared/git-direct.test-support.mjs +19 -0
- package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
- package/src/runtime/shared/heartbeat-interval.mjs +19 -0
- package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
- package/src/runtime/shared/llm/cost.mjs +5 -1
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -0
- package/src/runtime/shared/orchestration.d.mts +2 -0
- package/src/runtime/shared/pg-schema-db.mjs +27 -16
- package/src/runtime/shared/profile-config.cjs +1 -1
- package/src/runtime/shared/prompt-origin.d.mts +4 -0
- package/src/runtime/shared/prompt-origin.mjs +21 -0
- package/src/runtime/shared/provider-accounts.mjs +7 -1
- package/src/runtime/shared/provider-display-name.mjs +29 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
- package/src/runtime/shared/routine-trigger.d.mts +2 -0
- package/src/runtime/shared/routine-trigger.mjs +10 -0
- package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
- package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
- package/src/runtime/shared/session-activity-signal.mjs +48 -1
- package/src/runtime/shared/session-scratch.mjs +37 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
- package/src/runtime/shared/session-sidebar-host.mjs +7 -3
- package/src/runtime/shared/session-turn-prelude.mjs +18 -0
- package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +2 -15
- package/src/runtime/shared/tool-surface.mjs +3 -0
- package/src/runtime/shared/tool-work-units.mjs +2 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +15 -0
- package/src/runtime/shared/worktrees/manager.mjs +87 -38
- package/src/runtime/shared/worktrees/test-support.mjs +14 -13
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +29 -8
- package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
- package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
- package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
- package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
- package/src/session-runtime/agent-home-delivery.mjs +489 -185
- package/src/session-runtime/agent-task-sessions.mjs +467 -229
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/apis.mjs +9 -0
- package/src/session-runtime/boot/infrastructure.mjs +4 -0
- package/src/session-runtime/boot/providers.mjs +3 -0
- package/src/session-runtime/boot/tools.mjs +11 -2
- package/src/session-runtime/bot-status.mjs +12 -6
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +271 -25
- package/src/session-runtime/conversation-import/service.mjs +26 -5
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
- package/src/session-runtime/lifecycle/teardown.mjs +23 -5
- package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +153 -33
- package/src/session-runtime/model-route/set-route.mjs +11 -2
- package/src/session-runtime/notification-bus.mjs +31 -117
- package/src/session-runtime/notification-completion-queue.mjs +54 -0
- package/src/session-runtime/notification-listeners.mjs +76 -0
- package/src/session-runtime/owned-automation-run.mjs +2 -1
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- package/src/session-runtime/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -2
- package/src/session-runtime/resource-mcp-api.mjs +143 -224
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
- package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
- package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
- package/src/session-runtime/resource-mcp-servers.mjs +78 -0
- package/src/session-runtime/resource-mcp-store.mjs +49 -0
- package/src/session-runtime/resource-recall-api.mjs +6 -1
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
- package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
- package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
- package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
- package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
- package/src/session-runtime/services/channel-admin.mjs +7 -13
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/provider-admin.mjs +2 -1
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +1 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
- package/src/session-runtime/settings-compaction-api.mjs +2 -40
- package/src/session-runtime/settings-system-api.mjs +13 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +145 -22
- package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workspace/transitions.mjs +25 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
- package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
- package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
- package/src/standalone/channel-transport/client-registry.mjs +24 -163
- package/src/standalone/channel-transport.mjs +1 -1
- package/src/standalone/daemon-channels-loader.mjs +10 -8
- package/src/standalone/daemon-session-control/list-page.mjs +72 -0
- package/src/standalone/daemon-session-control/request.mjs +51 -0
- package/src/standalone/daemon-session-control/room-host.mjs +57 -0
- package/src/standalone/daemon-session-control/route-control.mjs +48 -0
- package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
- package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
- package/src/standalone/daemon-session-control.mjs +142 -190
- package/src/standalone/daemon.mjs +26 -3
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +5 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- package/src/standalone/session-service/quota-resume.mjs +3 -0
- package/src/standalone/session-service/retention/busy.mjs +65 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/app/app-view/floating-panel.jsx +7 -4
- package/src/tui/app/model-options.mjs +3 -28
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +9 -5
- package/src/tui/components/QuestionPanel.jsx +13 -4
- package/src/tui/dist/index.mjs +133 -92
- package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/notice-surface.mjs +7 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
- package/src/tui/session/session-api/routes-write.mjs +5 -1
- package/src/tui/session/session-api/routes.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +17 -1
- package/src/tui/session/session-flow/auto-clear.mjs +4 -33
- package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
- package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
- package/src/tui/session/session-flow/drain-retry.mjs +35 -0
- package/src/tui/session/session-flow/drain.mjs +118 -149
- package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
- package/src/tui/session/tool-approval-delegation.mjs +64 -0
- package/src/tui/session/tool-approval-request.mjs +39 -0
- package/src/tui/session/tool-approval-settle.mjs +62 -0
- package/src/tui/session/tool-approval.mjs +69 -115
- package/src/tui/session/tui-steering-persist.mjs +8 -1
- package/src/tui/session/turn-stream.mjs +19 -2
- package/src/tui/session/turn.mjs +1 -0
- package/src/ui/statusline-agents.mjs +1 -3
- package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
- package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
- package/scripts/code-graph-description-contract.mjs +0 -188
- package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { BOT_HOP_LIMIT_ERROR, MAX_BOT_HOPS } from '../../runtime/shared/bot-hops.mjs';
|
|
2
|
+
import { roomMemberOfSession, roomSessionId } from '../../runtime/agent/orchestrator/session/agent-room.mjs';
|
|
3
|
+
|
|
4
|
+
// Why a send from a conversation that is no bot's reports nothing back.
|
|
5
|
+
const NOT_BOT_REASON = 'only a bot conversation gets session results reported back; check that session for the result';
|
|
6
|
+
|
|
7
|
+
/** Throws unless a send to `sessionId` carries a prompt and addresses no
|
|
8
|
+
* room member's session directly. */
|
|
9
|
+
export function assertSendRequest(args, sessionId) {
|
|
10
|
+
if (typeof args.prompt !== 'string' || !args.prompt.trim()) {
|
|
11
|
+
throw new Error('session: prompt is required for action=send');
|
|
12
|
+
}
|
|
13
|
+
// A room member's session is the room's to drive: a message goes to the
|
|
14
|
+
// room, naming the member.
|
|
15
|
+
if (roomMemberOfSession(sessionId)) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
`session: ${sessionId} is a group-room member's session; send to its room (session_id ${roomSessionId(roomMemberOfSession(sessionId).roomId)}) with to: <member>`
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Applies effort `level` (checked) to `sessionId`, just before the prompt is queued. */
|
|
23
|
+
export function effortApplier(service, sessionId, level) {
|
|
24
|
+
// sessionOnly: the session's route changes, never the user's saved model settings.
|
|
25
|
+
return async () => {
|
|
26
|
+
const applied = await service.configureSession(
|
|
27
|
+
{ sessionId, action: 'setEffort', args: [level, { sessionOnly: true }] },
|
|
28
|
+
{ revision: 1 }
|
|
29
|
+
);
|
|
30
|
+
if (applied?.value === false) {
|
|
31
|
+
throw new Error(`session: ${sessionId} is busy with another command; effort not changed`);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** `hop`, refused past MAX_BOT_HOPS. */
|
|
37
|
+
export function chainedHop(hop) {
|
|
38
|
+
if (hop > MAX_BOT_HOPS) throw new Error(BOT_HOP_LIMIT_ERROR);
|
|
39
|
+
return hop;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The report origin with the send's hop and bot chain carried on. */
|
|
43
|
+
export function chainedOrigin(origin, hop, botChain) {
|
|
44
|
+
let chained = origin;
|
|
45
|
+
if (hop > 0) chained = { ...chained, hop };
|
|
46
|
+
if (botChain.length) chained = { ...chained, botChain };
|
|
47
|
+
return chained;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The result of a send that reports nothing back (no report origin). */
|
|
51
|
+
export function unreportedSendResult(sessionId, addressed, accepted, hop) {
|
|
52
|
+
return {
|
|
53
|
+
sessionId,
|
|
54
|
+
...addressed,
|
|
55
|
+
accepted,
|
|
56
|
+
reportsBack: false,
|
|
57
|
+
...(accepted ? { reportsBackReason: NOT_BOT_REASON } : {}),
|
|
58
|
+
...(hop > 0 ? { hop } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SESSION_ID_PATTERN } from '../../runtime/agent/orchestrator/runtime-core/session-id.mjs';
|
|
2
|
+
import { assertWorktreeMutationAllowed } from '../../session-runtime/services/worktree-access.mjs';
|
|
3
|
+
|
|
4
|
+
// The workspace methods `worktree` reaches on another session (all on the
|
|
5
|
+
// session protocol's read/configure allowlists).
|
|
6
|
+
const WORKTREE_METHODS = new Set([
|
|
7
|
+
'getBranchMenu',
|
|
8
|
+
'requestWorktree',
|
|
9
|
+
'selectBranch',
|
|
10
|
+
'mergeWorkspace',
|
|
11
|
+
'removeWorktree',
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Another session's workspace for the git tool's worktree operations
|
|
16
|
+
* (session-runtime/workspace/worktree-tool.mjs): one workspace method with
|
|
17
|
+
* one input, through the same configure / read lanes the desktop uses. No
|
|
18
|
+
* `ownTurn` ever crosses: the target must be idle. A change (anything but
|
|
19
|
+
* the menu read) needs the caller's trusted scope (`callerScope`, from
|
|
20
|
+
* worktree-access.mjs worktreeCallerScope) to be an attended conversation.
|
|
21
|
+
*/
|
|
22
|
+
export function createWorktreeControl(getSessionService) {
|
|
23
|
+
return async function worktreeControl(args, caller, callerScope) {
|
|
24
|
+
const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';
|
|
25
|
+
if (!SESSION_ID_PATTERN.test(sessionId)) throw new Error('session: session_id is required for action=worktree');
|
|
26
|
+
if (sessionId === caller) throw new Error('session: worktree control must target another session');
|
|
27
|
+
if (!WORKTREE_METHODS.has(args.method)) throw new Error(`session: unsupported worktree method "${args.method}"`);
|
|
28
|
+
if (args.method !== 'getBranchMenu') assertWorktreeMutationAllowed(callerScope, `session: worktree ${args.method}`);
|
|
29
|
+
const service = getSessionService();
|
|
30
|
+
if (!service) throw new Error('session: session service is unavailable');
|
|
31
|
+
if (args.method === 'getBranchMenu') {
|
|
32
|
+
return (await service.readSession({ sessionId, action: 'getBranchMenu', args: [] })).value;
|
|
33
|
+
}
|
|
34
|
+
const result = await service.configureSession(
|
|
35
|
+
{ sessionId, action: args.method, args: [args.input ?? {}] },
|
|
36
|
+
{ revision: 1 }
|
|
37
|
+
);
|
|
38
|
+
return result.value;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -1,138 +1,114 @@
|
|
|
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';
|
|
10
|
+
import { BOT_TARGET_ACTIONS, isBotShaped, unknownBotError } from '../session-runtime/bot-target.mjs';
|
|
7
11
|
import { checkEffort, readModelCatalog } from '../session-runtime/task-session-route.mjs';
|
|
8
|
-
import {
|
|
9
|
-
BOT_HOP_LIMIT_ERROR,
|
|
10
|
-
MAX_BOT_HOPS,
|
|
11
|
-
assertBotChainTarget,
|
|
12
|
-
botChainOf,
|
|
13
|
-
rememberSubmissionBotChain,
|
|
14
|
-
} from '../runtime/shared/bot-hops.mjs';
|
|
12
|
+
import { assertBotChainTarget, botChainOf } from '../runtime/shared/bot-hops.mjs';
|
|
15
13
|
import { agentIdOfHomeSession } from '../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
16
14
|
import { rebindDelegation } from '../runtime/agent/orchestrator/session/human-gate/delegation.mjs';
|
|
17
|
-
import { isAgentOnlySession } from '../runtime/agent/orchestrator/session/store-summary-visibility.mjs';
|
|
18
15
|
import { readSessionSidebarState } from '../runtime/shared/session-sidebar-host.mjs';
|
|
19
|
-
import {
|
|
16
|
+
import { roomIdOfSession } from '../runtime/agent/orchestrator/session/agent-room.mjs';
|
|
17
|
+
import { escapeHarnessTags } from '../runtime/shared/shell-output-summary.mjs';
|
|
18
|
+
import { truncateToolText } from '../runtime/shared/tool-primitives.mjs';
|
|
19
|
+
import { requestCaller, targetRequest } from './daemon-session-control/request.mjs';
|
|
20
|
+
import { createWorktreeControl } from './daemon-session-control/worktree-control.mjs';
|
|
21
|
+
import { createRouteControl } from './daemon-session-control/route-control.mjs';
|
|
20
22
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const NOT_BOT_REASON = 'only a bot conversation gets session results reported back; check that session for the result';
|
|
23
|
+
TOP_CURSOR,
|
|
24
|
+
assertListFlags,
|
|
25
|
+
listOutputOptions,
|
|
26
|
+
listRowFilter,
|
|
27
|
+
listedSessions,
|
|
28
|
+
liveCandidates,
|
|
29
|
+
liveRowOverlay,
|
|
30
|
+
pinnedLiveRows,
|
|
31
|
+
} from './daemon-session-control/list-page.mjs';
|
|
32
|
+
import { roomAddressee, roomSubmitter, stopRoomExchange } from './daemon-session-control/room-host.mjs';
|
|
33
|
+
import {
|
|
34
|
+
assertSendRequest,
|
|
35
|
+
chainedHop,
|
|
36
|
+
chainedOrigin,
|
|
37
|
+
effortApplier,
|
|
38
|
+
unreportedSendResult,
|
|
39
|
+
} from './daemon-session-control/send-turn.mjs';
|
|
39
40
|
|
|
40
|
-
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
/** Sessions with live work now, from the sources the Agents pool reads:
|
|
42
|
+
* `own` (id → its latest sign of work, epoch ms) — a turn in flight in this
|
|
43
|
+
* process, or a pool row still running or queued (worker index
|
|
44
|
+
* status/stage); `agents` — the Leads such an Agent session works for. */
|
|
45
|
+
async function storedLiveWork() {
|
|
46
|
+
const [
|
|
47
|
+
{ inFlightSessionActivity },
|
|
48
|
+
{ listStoredAgentWorkersAsync },
|
|
49
|
+
{ hasPendingAgentWork, sessionsWithPendingWork },
|
|
50
|
+
] = await Promise.all([
|
|
51
|
+
import('../runtime/agent/orchestrator/session/manager/runtime-state.mjs'),
|
|
52
|
+
import('../runtime/agent/orchestrator/session/store-agent-worker-rows.mjs'),
|
|
53
|
+
import('../runtime/shared/pending-agent-work.mjs'),
|
|
54
|
+
]);
|
|
55
|
+
const { working, agentWorking } = inFlightSessionActivity();
|
|
56
|
+
const pool = await listStoredAgentWorkersAsync({ runningSessionIds: working });
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
const own = new Map([...working].map((id) => [id, now]));
|
|
59
|
+
for (const row of pool) {
|
|
60
|
+
const id = String(row?.sessionId || '');
|
|
61
|
+
if (id && !own.has(id) && hasPendingAgentWork(row)) own.set(id, Date.parse(row.updatedAt) || 0);
|
|
49
62
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
return { own, agents: new Set([...agentWorking, ...sessionsWithPendingWork(pool)]) };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The catalog row of `sessionId` read by id, or null when the catalog would not list it. */
|
|
67
|
+
async function storedCatalogRow(sessionId) {
|
|
68
|
+
const { readStoredSessionCatalogRow } = await import(
|
|
69
|
+
'../runtime/agent/orchestrator/session/store-summary-reader.mjs'
|
|
70
|
+
);
|
|
71
|
+
return readStoredSessionCatalogRow(sessionId);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** The stored title of `sessionId` (its session record), or null. */
|
|
75
|
+
async function storedTitle(sessionId) {
|
|
76
|
+
const { readStoredSessionTranscript } = await import(
|
|
77
|
+
'../runtime/agent/orchestrator/session/store-summary-reader.mjs'
|
|
78
|
+
);
|
|
79
|
+
return (await readStoredSessionTranscript(sessionId, { metadataOnly: true }))?.title || null;
|
|
54
80
|
}
|
|
55
81
|
|
|
56
82
|
/** Model-facing session operations over the same service used by desktop and TUI. */
|
|
57
83
|
export function createSessionControl({
|
|
58
84
|
getSessionService,
|
|
59
85
|
agentTasks = createAgentTaskSessions({ getSessionService }),
|
|
60
|
-
|
|
86
|
+
listBots,
|
|
87
|
+
botStatus = createBotStatus({ getSessionService, listBots }),
|
|
88
|
+
// Agent work a session handed off and still waits on (agent-task-sessions.mjs).
|
|
89
|
+
pendingWork = taskSessionPendingWork,
|
|
90
|
+
liveWork = storedLiveWork,
|
|
91
|
+
readRow = storedCatalogRow,
|
|
92
|
+
readTitle = storedTitle,
|
|
61
93
|
}) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* (session-runtime/workspace/worktree-tool.mjs): one workspace method with
|
|
65
|
-
* one input, through the same configure / read lanes the desktop uses. No
|
|
66
|
-
* `ownTurn` ever crosses: the target must be idle. A change (anything but
|
|
67
|
-
* the menu read) needs the caller's trusted scope (`callerScope`, from
|
|
68
|
-
* worktree-access.mjs worktreeCallerScope) to be an attended conversation.
|
|
69
|
-
*/
|
|
70
|
-
async function worktreeControl(args, caller, callerScope) {
|
|
71
|
-
const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';
|
|
72
|
-
if (!SESSION_ID_PATTERN.test(sessionId)) throw new Error('session: session_id is required for action=worktree');
|
|
73
|
-
if (sessionId === caller) throw new Error('session: worktree control must target another session');
|
|
74
|
-
if (!WORKTREE_METHODS.has(args.method)) throw new Error(`session: unsupported worktree method "${args.method}"`);
|
|
75
|
-
if (args.method !== 'getBranchMenu') assertWorktreeMutationAllowed(callerScope, `session: worktree ${args.method}`);
|
|
76
|
-
const service = getSessionService();
|
|
77
|
-
if (!service) throw new Error('session: session service is unavailable');
|
|
78
|
-
if (args.method === 'getBranchMenu') {
|
|
79
|
-
return (await service.readSession({ sessionId, action: 'getBranchMenu', args: [] })).value;
|
|
80
|
-
}
|
|
81
|
-
const result = await service.configureSession(
|
|
82
|
-
{ sessionId, action: args.method, args: [args.input ?? {}] },
|
|
83
|
-
{ revision: 1 }
|
|
84
|
-
);
|
|
85
|
-
return result.value;
|
|
86
|
-
}
|
|
94
|
+
const worktreeControl = createWorktreeControl(getSessionService);
|
|
95
|
+
const routeControl = createRouteControl(getSessionService);
|
|
87
96
|
|
|
88
|
-
|
|
97
|
+
async function control(args = {}, context = {}) {
|
|
89
98
|
const action = args.action;
|
|
90
|
-
|
|
91
|
-
action !== 'list' &&
|
|
92
|
-
action !== 'create' &&
|
|
93
|
-
action !== 'bots' &&
|
|
94
|
-
action !== 'worktree' &&
|
|
95
|
-
!TARGET_ACTIONS.has(action)
|
|
96
|
-
) {
|
|
97
|
-
throw new Error(`session: unsupported remote action "${action}"`);
|
|
98
|
-
}
|
|
99
|
-
const caller = context.callerSessionId;
|
|
100
|
-
if (typeof caller !== 'string' || !SESSION_ID_PATTERN.test(caller)) {
|
|
101
|
-
throw new Error('session: caller session is required');
|
|
102
|
-
}
|
|
99
|
+
const caller = requestCaller(action, context);
|
|
103
100
|
// `callerAgentId`: set only for an attended agent conversation (workspace-tools.mjs).
|
|
104
101
|
if (action === 'create') return agentTasks.create(args, context);
|
|
105
102
|
if (action === 'worktree') return worktreeControl(args, caller, context.callerScope);
|
|
103
|
+
// The setup tool's per-session route actions (authorized by the setup executor).
|
|
104
|
+
if (action === 'route') return routeControl(args, caller);
|
|
106
105
|
// `callerScope`: the caller's schedule-access scope (workspace-tools.mjs).
|
|
107
106
|
if (action === 'bots') return botStatus(args, context);
|
|
108
|
-
const sessionId
|
|
109
|
-
if (TARGET_ACTIONS.has(action) && !SESSION_ID_PATTERN.test(sessionId)) {
|
|
110
|
-
throw new Error(`session: session_id is required for action=${action}`);
|
|
111
|
-
}
|
|
112
|
-
if (MUTATING_ACTIONS.has(action) && sessionId === caller) {
|
|
113
|
-
throw new Error(`session: ${action} must target another session`);
|
|
114
|
-
}
|
|
115
|
-
const limit = args.limit ?? 25;
|
|
116
|
-
if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
117
|
-
throw new Error('session: limit must be an integer from 1 to 100');
|
|
118
|
-
}
|
|
119
|
-
const offset = args.offset ?? 0;
|
|
120
|
-
const textOffset = args.text_offset ?? 0;
|
|
121
|
-
if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(offset + limit)) {
|
|
122
|
-
throw new Error('session: offset must be a nonnegative safe integer');
|
|
123
|
-
}
|
|
124
|
-
if (!Number.isSafeInteger(textOffset) || textOffset < 0) throw new Error('session: invalid text_offset');
|
|
125
|
-
if (args.text_offset !== undefined && (args.offset === undefined || limit !== 1 || !args.item_id)) {
|
|
126
|
-
throw new Error('session: text_offset requires offset, limit:1 and item_id from read');
|
|
127
|
-
}
|
|
107
|
+
const { sessionId, limit, offset, textOffset } = targetRequest(args, action, caller);
|
|
128
108
|
const service = getSessionService();
|
|
129
109
|
if (!service) throw new Error('session: session service is unavailable');
|
|
130
110
|
if (action === 'list') {
|
|
131
|
-
|
|
132
|
-
if (args[flag] !== undefined && typeof args[flag] !== 'boolean') {
|
|
133
|
-
throw new Error(`session: ${flag} must be a boolean`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
111
|
+
assertListFlags(args);
|
|
136
112
|
// Scoped like bots (`callerScope`, bot-status.mjs): the human's sessions
|
|
137
113
|
// list everything with previews, a bot (or its unattended run) lists the
|
|
138
114
|
// same rows (so it can find a session to send to) but only its own carry
|
|
@@ -143,28 +119,38 @@ export function createSessionControl({
|
|
|
143
119
|
// out, so a page is never short while more rows match.
|
|
144
120
|
const own = scopedBot(context.callerScope);
|
|
145
121
|
const archived = (await readSessionSidebarState())?.archived ?? {};
|
|
146
|
-
const keep = (
|
|
147
|
-
|
|
148
|
-
|
|
122
|
+
const keep = listRowFilter(args, archived);
|
|
123
|
+
// Live work is overlaid on every row: a catalog row keeps the status and
|
|
124
|
+
// recency of its last settled turn, so a long-running agent read `idle`
|
|
125
|
+
// and sorted by its first prompt. The first page lists the live rows
|
|
126
|
+
// first (newest sign of work first); a later page keeps catalog order,
|
|
127
|
+
// where such a row may show again (never skipped).
|
|
128
|
+
const live = await liveWork();
|
|
129
|
+
const withLive = liveRowOverlay(live);
|
|
130
|
+
// Each live session's row is read by id (wherever it sits in the
|
|
131
|
+
// catalog), filtered like the listing, and the newest `limit` lead.
|
|
132
|
+
const candidates = liveCandidates(live);
|
|
133
|
+
let pinned = [];
|
|
134
|
+
if (!args.cursor && candidates.length) {
|
|
135
|
+
pinned = pinnedLiveRows(await Promise.all(candidates.map((id) => readRow(id))), keep, withLive, limit);
|
|
136
|
+
}
|
|
137
|
+
const pinnedIds = new Set(pinned.map((row) => row.id));
|
|
138
|
+
const want = limit - pinned.length;
|
|
149
139
|
// Bounded: past 10000 rows scanned with fewer than `limit` matching, the
|
|
150
140
|
// page ends (possibly empty) with a nextCursor to continue from.
|
|
151
|
-
const scan =
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
141
|
+
const scan =
|
|
142
|
+
want > 0
|
|
143
|
+
? await scanCatalog(service, (row) => !pinnedIds.has(row.id) && keep(row), {
|
|
144
|
+
cursor: args.cursor || null,
|
|
145
|
+
want,
|
|
146
|
+
maxRows: 10_000,
|
|
147
|
+
})
|
|
148
|
+
: { rows: [], nextCursor: TOP_CURSOR };
|
|
149
|
+
const sessions = listedSessions(pinned, scan.rows, withLive, archived);
|
|
150
|
+
return sessionListOutput({ sessions, nextCursor: scan.nextCursor }, limit, listOutputOptions(own, pinnedIds));
|
|
156
151
|
}
|
|
157
152
|
if (action === 'send') {
|
|
158
|
-
|
|
159
|
-
throw new Error('session: prompt is required for action=send');
|
|
160
|
-
}
|
|
161
|
-
// A room member's session is the room's to drive: a message goes to the
|
|
162
|
-
// room, naming the member.
|
|
163
|
-
if (roomMemberOfSession(sessionId)) {
|
|
164
|
-
throw new Error(
|
|
165
|
-
`session: ${sessionId} is a group-room member's session; send to its room (session_id ${roomSessionId(roomMemberOfSession(sessionId).roomId)}) with to: <member>`
|
|
166
|
-
);
|
|
167
|
-
}
|
|
153
|
+
assertSendRequest(args, sessionId);
|
|
168
154
|
// A send to a room's log is a message to one member there (`to`, or a
|
|
169
155
|
// leading @name), run by the desktop room host; the member's turn in
|
|
170
156
|
// its member session is the turn that answers and reports.
|
|
@@ -186,32 +172,7 @@ export function createSessionControl({
|
|
|
186
172
|
const prompt = handoffContent(room ? room.text : args.prompt, context.attachmentParts);
|
|
187
173
|
const turnSessionId = room ? room.sessionId : sessionId;
|
|
188
174
|
const from = { sessionId: caller, ...(context.callerAgentId ? { agentId: context.callerAgentId } : {}) };
|
|
189
|
-
|
|
190
|
-
// chain through the room counts on toward MAX_BOT_HOPS; its bot chain is
|
|
191
|
-
// recorded under every submission id that turn may take.
|
|
192
|
-
const submit = room
|
|
193
|
-
? async ({ id, onSettled, follow, transcriptMeta } = {}) => {
|
|
194
|
-
rememberSubmissionBotChain(id, transcriptMeta?.botChain);
|
|
195
|
-
const followed = follow
|
|
196
|
-
? (submissionId) => {
|
|
197
|
-
rememberSubmissionBotChain(submissionId, transcriptMeta?.botChain);
|
|
198
|
-
return follow(submissionId);
|
|
199
|
-
}
|
|
200
|
-
: null;
|
|
201
|
-
return {
|
|
202
|
-
accepted:
|
|
203
|
-
(await room.host.ask(sessionId, {
|
|
204
|
-
agentId: room.agentId,
|
|
205
|
-
prompt,
|
|
206
|
-
from,
|
|
207
|
-
...(id ? { id } : {}),
|
|
208
|
-
...(transcriptMeta?.hop > 0 ? { hop: transcriptMeta.hop } : {}),
|
|
209
|
-
...(onSettled ? { onSettled } : {}),
|
|
210
|
-
...(followed ? { follow: followed } : {}),
|
|
211
|
-
})) === true,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
: null;
|
|
175
|
+
const submit = room ? roomSubmitter(room, sessionId, prompt, from) : null;
|
|
215
176
|
const addressed = room ? { to: room.agentId } : {};
|
|
216
177
|
let origin = await agentTasks.reportOrigin(turnSessionId, context.callerAgentId, caller);
|
|
217
178
|
// `effort` is the menu's effort pick on the target: checked now against the
|
|
@@ -228,29 +189,15 @@ export function createSessionControl({
|
|
|
228
189
|
const target = (await service.readSession({ sessionId, transcriptItemLimit: 1 })).full;
|
|
229
190
|
if (!target) throw new Error(`session: ${sessionId} is unavailable`);
|
|
230
191
|
const level = checkEffort(args.effort, target, await readModelCatalog(service, caller));
|
|
231
|
-
|
|
232
|
-
applyEffort = async () => {
|
|
233
|
-
const applied = await service.configureSession(
|
|
234
|
-
{ sessionId, action: 'setEffort', args: [level, { sessionOnly: true }] },
|
|
235
|
-
{ revision: 1 }
|
|
236
|
-
);
|
|
237
|
-
if (applied?.value === false) {
|
|
238
|
-
throw new Error(`session: ${sessionId} is busy with another command; effort not changed`);
|
|
239
|
-
}
|
|
240
|
-
};
|
|
192
|
+
applyEffort = effortApplier(service, sessionId, level);
|
|
241
193
|
}
|
|
242
194
|
// A send made in a bot-descended turn (`callerHop` > 0), or by a bot to
|
|
243
195
|
// another session, extends the chain by one; a bot's own task session
|
|
244
196
|
// only continues it. Refused past the limit, whatever the target.
|
|
245
197
|
const turnHop = Number(context.callerHop) || 0;
|
|
246
|
-
const chained = (hop) => {
|
|
247
|
-
if (hop > MAX_BOT_HOPS) throw new Error(BOT_HOP_LIMIT_ERROR);
|
|
248
|
-
return hop;
|
|
249
|
-
};
|
|
250
198
|
if (origin) {
|
|
251
|
-
const hop =
|
|
252
|
-
|
|
253
|
-
if (botChain.length) origin = { ...origin, botChain };
|
|
199
|
+
const hop = chainedHop(origin.target === 'session' ? turnHop + 1 : turnHop);
|
|
200
|
+
origin = chainedOrigin(origin, hop, botChain);
|
|
254
201
|
// The task session a bot created acts as the sending conversation does
|
|
255
202
|
// from now on (attended chat or run); another's session keeps its own.
|
|
256
203
|
if (origin.target !== 'session') await rebindDelegation(sessionId, caller);
|
|
@@ -258,7 +205,7 @@ export function createSessionControl({
|
|
|
258
205
|
const sent = await agentTasks.send(turnSessionId, prompt, origin, submit);
|
|
259
206
|
return { sessionId, ...addressed, ...sent, ...(hop > 0 ? { hop } : {}) };
|
|
260
207
|
}
|
|
261
|
-
const hop = turnHop > 0 ?
|
|
208
|
+
const hop = turnHop > 0 ? chainedHop(turnHop + 1) : 0;
|
|
262
209
|
await applyEffort();
|
|
263
210
|
const chainMeta = { ...(hop > 0 ? { hop } : {}), ...(botChain.length ? { botChain } : {}) };
|
|
264
211
|
let accepted;
|
|
@@ -273,27 +220,12 @@ export function createSessionControl({
|
|
|
273
220
|
});
|
|
274
221
|
accepted = result.accepted === true;
|
|
275
222
|
}
|
|
276
|
-
return
|
|
277
|
-
sessionId,
|
|
278
|
-
...addressed,
|
|
279
|
-
accepted,
|
|
280
|
-
reportsBack: false,
|
|
281
|
-
...(accepted ? { reportsBackReason: NOT_BOT_REASON } : {}),
|
|
282
|
-
...(hop > 0 ? { hop } : {}),
|
|
283
|
-
};
|
|
223
|
+
return unreportedSendResult(sessionId, addressed, accepted, hop);
|
|
284
224
|
}
|
|
285
225
|
if (action === 'cancel') {
|
|
286
226
|
// A room's exchange is run by the desktop room host, so its stop (the UI
|
|
287
227
|
// stop button) ends it; the log is not a session the service can abort.
|
|
288
|
-
if (roomIdOfSession(sessionId))
|
|
289
|
-
let host;
|
|
290
|
-
try {
|
|
291
|
-
host = agentRoomHost();
|
|
292
|
-
} catch (error) {
|
|
293
|
-
throw new Error(`session: cannot cancel ${sessionId}: ${error.message}`);
|
|
294
|
-
}
|
|
295
|
-
return { sessionId, aborted: host.stop(sessionId) === true };
|
|
296
|
-
}
|
|
228
|
+
if (roomIdOfSession(sessionId)) return stopRoomExchange(sessionId);
|
|
297
229
|
const result = await service.abortSession({ sessionId });
|
|
298
230
|
return { sessionId, aborted: result.aborted === true };
|
|
299
231
|
}
|
|
@@ -315,9 +247,12 @@ export function createSessionControl({
|
|
|
315
247
|
});
|
|
316
248
|
const snapshot = result.full;
|
|
317
249
|
if (!snapshot) throw new Error(`session: ${sessionId} is unavailable`);
|
|
250
|
+
// The snapshot carries no title: it lives on the session record. Quoted
|
|
251
|
+
// like a listed title.
|
|
252
|
+
const title = await readTitle(sessionId);
|
|
318
253
|
return {
|
|
319
254
|
sessionId,
|
|
320
|
-
title:
|
|
255
|
+
title: title ? escapeHarnessTags(truncateToolText(title, SESSION_TITLE_LIMIT)) : null,
|
|
321
256
|
cwd: snapshot.cwd ?? null,
|
|
322
257
|
provider: snapshot.provider ?? null,
|
|
323
258
|
model: snapshot.model ?? null,
|
|
@@ -325,7 +260,24 @@ export function createSessionControl({
|
|
|
325
260
|
autoEffort: snapshot.autoEffort ?? null,
|
|
326
261
|
fast: snapshot.fast ?? null,
|
|
327
262
|
busy: snapshot.busy === true,
|
|
263
|
+
// A Lead idle between turns while its agents run is still working:
|
|
264
|
+
// their results wake it, so `busy` alone would read as stalled.
|
|
265
|
+
agentsWorking: (await pendingWork(sessionId)) === true,
|
|
328
266
|
quotaResume: snapshot.quotaResume ?? null,
|
|
329
267
|
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return async function executeSessionControl(args = {}, context = {}) {
|
|
271
|
+
try {
|
|
272
|
+
return await control(args, context);
|
|
273
|
+
} catch (error) {
|
|
274
|
+
// A bot id is resolved to its home chat before this (workspace-tools.mjs),
|
|
275
|
+
// so a bot-shaped id the session service found no session for is no bot
|
|
276
|
+
// either: say which ids are.
|
|
277
|
+
const id = typeof args.session_id === 'string' ? args.session_id.trim() : '';
|
|
278
|
+
const missing = [`${id} is not available`, `${id} is unavailable`].some((text) => error?.message?.includes(text));
|
|
279
|
+
if (!BOT_TARGET_ACTIONS.has(args.action) || !isBotShaped(id) || !missing) throw error;
|
|
280
|
+
throw await unknownBotError(id, listBots, error);
|
|
281
|
+
}
|
|
330
282
|
};
|
|
331
283
|
}
|
|
@@ -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';
|
|
@@ -1017,6 +1022,9 @@ async function main() {
|
|
|
1017
1022
|
options: {
|
|
1018
1023
|
mode: 'prompt',
|
|
1019
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',
|
|
1020
1028
|
...(id ? { id } : {}),
|
|
1021
1029
|
...(hop > 0 ? { transcriptMeta: { hop } } : {}),
|
|
1022
1030
|
onSettled: (detail) => settle(String(detail?.status || 'failed')),
|
|
@@ -1029,7 +1037,10 @@ async function main() {
|
|
|
1029
1037
|
(await sessionService.submitSession({ sessionId, prompt, options }))?.accepted === true,
|
|
1030
1038
|
abort: (sessionId) => sessionService.abortSession({ sessionId }),
|
|
1031
1039
|
});
|
|
1032
|
-
//
|
|
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.
|
|
1033
1044
|
import('../session-runtime/mixy-heartbeat.mjs')
|
|
1034
1045
|
.then(({ startMixyHeartbeat }) =>
|
|
1035
1046
|
startMixyHeartbeat({ getSessionService: () => sessionService, log: (line) => log(`heartbeat: ${line}`) })
|
|
@@ -1041,6 +1052,18 @@ async function main() {
|
|
|
1041
1052
|
// Agents' sends whose report an earlier process had not queued yet.
|
|
1042
1053
|
agentTasks.recover().catch((error) => log(`agent task report recovery failed: ${error?.message || error}`));
|
|
1043
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}`));
|
|
1044
1067
|
sessionTransport = createSessionTransport({
|
|
1045
1068
|
// ctx carries the CLIENT token: the session service refcounts views across
|
|
1046
1069
|
// processes with it, so a terminal exiting cannot destroy the session a
|
|
@@ -1096,7 +1119,7 @@ async function main() {
|
|
|
1096
1119
|
|
|
1097
1120
|
// A pinned channel session outlives the daemon that pinned it. Reactivate the
|
|
1098
1121
|
// durable intent AFTER the ready handshake (activation itself brings the
|
|
1099
|
-
//
|
|
1122
|
+
// channel bridge up); with no intent on disk this is a no-op and the
|
|
1100
1123
|
// channels graph stays dormant.
|
|
1101
1124
|
if (transport.remoteIntentSessionId) {
|
|
1102
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
|
});
|