mixdog 1.3.5 → 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/NOTICE.md +2 -2
- package/README.md +2 -2
- package/package.json +2 -11
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +4 -2
- 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 +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +17 -1
- package/src/defaults/skills/browser-use/SKILL.md +59 -11
- 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 +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 +10 -8
- package/src/rules/agent/AGENT.md +6 -6
- 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/title-completion.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
- 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 +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 +176 -72
- package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +181 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- 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 +145 -66
- 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-transport.mjs +123 -102
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -13
- 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/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-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/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 +26 -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 +12 -7
- 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/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.mjs +125 -30
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +133 -22
- 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 +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 +18 -22
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -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/route-fallback.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -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 +3 -2
- 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 +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-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/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/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.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-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 +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/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 +18 -1
- 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/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/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 +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 +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/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/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 -14
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- 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/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/usage-rollup.mjs +1 -1
- 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 +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 +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-result-summary.mjs +1 -14
- 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 +448 -185
- package/src/session-runtime/agent-task-sessions.mjs +329 -180
- 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 +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/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/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 +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/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/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-owner.mjs +40 -9
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- 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 +7 -13
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- 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 +16 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- 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 +124 -188
- 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/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-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/tui/app/model-options.mjs +3 -28
- package/src/tui/dist/index.mjs +58 -64
- 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 +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 +19 -2
- package/src/tui/session/turn.mjs +1 -0
- 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
|
@@ -3,27 +3,17 @@
|
|
|
3
3
|
// pending queue so the model sees it next turn. The delivered registry keeps
|
|
4
4
|
// those two paths from double-injecting the same completion.
|
|
5
5
|
import { modelVisibleToolCompletionMessage } from '../runtime/shared/tool-execution-contract.mjs';
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
markCompletionEntry,
|
|
9
|
-
} from '../runtime/agent/orchestrator/session/manager/pending-messages.mjs';
|
|
10
|
-
import {
|
|
11
|
-
isDeliveredCompletion,
|
|
12
|
-
logDuplicateSkip,
|
|
13
|
-
recordDeliveredCompletion,
|
|
14
|
-
} from '../runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
|
|
6
|
+
import { PENDING_MODE_TASK_NOTIFICATION } from '../runtime/agent/orchestrator/session/manager/pending-messages.mjs';
|
|
7
|
+
import { recordDeliveredCompletion } from '../runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
|
|
15
8
|
import { shouldMirrorCompletionToPendingQueue } from './runtime-tool-routing.mjs';
|
|
16
9
|
import { notifyTrace } from '../runtime/shared/notify-trace.mjs';
|
|
10
|
+
import { cleanSessionId, createListenerBindings, sessionListenersOf } from './notification-listeners.mjs';
|
|
11
|
+
import { createCompletionQueue } from './notification-completion-queue.mjs';
|
|
17
12
|
|
|
18
|
-
const sessionNotificationListeners = new Map();
|
|
19
13
|
// A completion that waits this long between enqueue and wake is reported: the
|
|
20
14
|
// queue is durable, so the delay is a scheduling symptom, not a lost message.
|
|
21
15
|
const WAKE_DELAY_REPORT_MS = 1_000;
|
|
22
16
|
|
|
23
|
-
function cleanSessionId(value) {
|
|
24
|
-
return String(value || '').trim();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
17
|
// A queued completion only reaches the model on the next turn, so a session
|
|
28
18
|
// with no user input pending is woken with an empty turn. One wake per session
|
|
29
19
|
// runs at a time, and a completion suppressed by that in-flight wake is
|
|
@@ -63,7 +53,9 @@ export function createCompletionWakeScheduler({ getCurrentSessionId, getTurnApi,
|
|
|
63
53
|
if (typeof beforeWake === 'function') {
|
|
64
54
|
try {
|
|
65
55
|
await beforeWake(ownerSessionId);
|
|
66
|
-
} catch {
|
|
56
|
+
} catch {
|
|
57
|
+
// The pre-wake hook is best-effort; the wake proceeds without it.
|
|
58
|
+
}
|
|
67
59
|
if (cleanSessionId(getCurrentSessionId()) !== ownerSessionId || !ownerOpen(ownerSessionId)) return;
|
|
68
60
|
}
|
|
69
61
|
// The wake continues the user turn that launched the worker, so its
|
|
@@ -102,10 +94,15 @@ export function createCompletionWakeScheduler({ getCurrentSessionId, getTurnApi,
|
|
|
102
94
|
};
|
|
103
95
|
}
|
|
104
96
|
|
|
105
|
-
function emitToListeners(source, content, meta = {}) {
|
|
97
|
+
function emitToListeners(source, content, meta = {}, origin = null) {
|
|
106
98
|
const text = String(content || '').trim();
|
|
107
99
|
if (!text) return { handled: false, modelVisibleDelivered: false };
|
|
108
|
-
const event = {
|
|
100
|
+
const event = {
|
|
101
|
+
content: text,
|
|
102
|
+
meta: meta && typeof meta === 'object' ? meta : {},
|
|
103
|
+
// The notification's provenance apart from its meta (PROMPT_ORIGIN_CHANNEL).
|
|
104
|
+
...(origin ? { origin } : {}),
|
|
105
|
+
};
|
|
109
106
|
let handled = false;
|
|
110
107
|
for (const listener of [...source]) {
|
|
111
108
|
try {
|
|
@@ -118,8 +115,9 @@ function emitToListeners(source, content, meta = {}) {
|
|
|
118
115
|
}
|
|
119
116
|
|
|
120
117
|
export function createNotificationBus({ listeners, mgr, onCompletionQueued, getOwnerLifecycle }) {
|
|
121
|
-
const
|
|
122
|
-
|
|
118
|
+
const { subscribeRuntimeNotification, bindRuntimeNotificationSession, clearRuntimeNotifications } =
|
|
119
|
+
createListenerBindings({ listeners });
|
|
120
|
+
const enqueueCompletion = createCompletionQueue({ mgr, onCompletionQueued });
|
|
123
121
|
|
|
124
122
|
// Owner identity + lifecycle generation. A closing/terminal owner (or a
|
|
125
123
|
// callback captured under an earlier generation) keeps its result for
|
|
@@ -137,12 +135,14 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
|
|
|
137
135
|
return emitToListeners(listeners, content, meta);
|
|
138
136
|
}
|
|
139
137
|
|
|
140
|
-
|
|
138
|
+
// `origin`: the notification's provenance (PROMPT_ORIGIN_CHANNEL for an
|
|
139
|
+
// inbound channel message), carried to the queue beside its mode.
|
|
140
|
+
function notifySession(sessionId, content, meta = {}, { origin = null } = {}) {
|
|
141
141
|
const targetSessionId = cleanSessionId(sessionId);
|
|
142
142
|
if (!targetSessionId) return false;
|
|
143
|
-
const targetListeners =
|
|
143
|
+
const targetListeners = sessionListenersOf(targetSessionId);
|
|
144
144
|
const open = ownerOpen(targetSessionId);
|
|
145
|
-
const { handled } = emitToListeners(targetListeners, content, open ? meta : closedMeta(meta));
|
|
145
|
+
const { handled } = emitToListeners(targetListeners, content, open ? meta : closedMeta(meta), origin);
|
|
146
146
|
if (handled) return true;
|
|
147
147
|
if (!open) return false;
|
|
148
148
|
if (typeof mgr.enqueuePendingMessage !== 'function') return false;
|
|
@@ -151,7 +151,13 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
|
|
|
151
151
|
// is the runtime reporting, exactly as an attached TUI queues it: a
|
|
152
152
|
// task notification, so text inside it — fenced external webhook values
|
|
153
153
|
// included — never drives explicit skill selection.
|
|
154
|
-
return
|
|
154
|
+
return (
|
|
155
|
+
mgr.enqueuePendingMessage(targetSessionId, {
|
|
156
|
+
content,
|
|
157
|
+
mode: PENDING_MODE_TASK_NOTIFICATION,
|
|
158
|
+
...(origin ? { origin } : {}),
|
|
159
|
+
}) > 0
|
|
160
|
+
);
|
|
155
161
|
} catch {
|
|
156
162
|
return false;
|
|
157
163
|
}
|
|
@@ -164,50 +170,14 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
|
|
|
164
170
|
function notifySessionUi(sessionId, content, meta = {}) {
|
|
165
171
|
const targetSessionId = cleanSessionId(sessionId);
|
|
166
172
|
if (!targetSessionId) return false;
|
|
167
|
-
const targetListeners =
|
|
173
|
+
const targetListeners = sessionListenersOf(targetSessionId);
|
|
168
174
|
return emitToListeners(targetListeners, content, meta).handled;
|
|
169
175
|
}
|
|
170
176
|
|
|
171
|
-
// Enqueue the model-visible twin unless it was already delivered; returns
|
|
172
|
-
// true when the caller may treat the completion as delivered.
|
|
173
|
-
function enqueueCompletion(callerSessionId, text, meta, path) {
|
|
174
|
-
const visible = modelVisibleToolCompletionMessage(text, meta);
|
|
175
|
-
// Non-completion notifications yield '' here and are never queued.
|
|
176
|
-
if (!visible) return false;
|
|
177
|
-
if (isDeliveredCompletion({ executionId: meta?.execution_id, text: visible })) {
|
|
178
|
-
// Delivered + ACKed on the TUI path: suppress the duplicate but report
|
|
179
|
-
// DELIVERED so the caller stops retrying.
|
|
180
|
-
logDuplicateSkip(path, { executionId: meta?.execution_id, text: visible });
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
const entry = markCompletionEntry(visible, { executionId: meta?.execution_id, meta });
|
|
184
|
-
const queueKey = `${callerSessionId}:${entry.id}`;
|
|
185
|
-
if (queuedCompletionIds.has(queueKey)) {
|
|
186
|
-
logDuplicateSkip(`${path}-queued`, { executionId: meta?.execution_id, text: visible });
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
const enqueued = mgr.enqueuePendingMessage(callerSessionId, entry) > 0;
|
|
190
|
-
if (!enqueued) return false;
|
|
191
|
-
queuedCompletionIds.set(queueKey, Date.now());
|
|
192
|
-
while (queuedCompletionIds.size > 512) queuedCompletionIds.delete(queuedCompletionIds.keys().next().value);
|
|
193
|
-
if (typeof onCompletionQueued === 'function') {
|
|
194
|
-
try {
|
|
195
|
-
onCompletionQueued({
|
|
196
|
-
sessionId: callerSessionId,
|
|
197
|
-
executionId: meta?.execution_id || null,
|
|
198
|
-
enqueuedAt: entry.enqueuedAt,
|
|
199
|
-
});
|
|
200
|
-
} catch {
|
|
201
|
-
/* wake-up is best-effort; the durable queue remains authoritative */
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
177
|
function notifySessionCompletion(sessionId, text, meta = {}, capturedGeneration = undefined) {
|
|
208
178
|
const targetSessionId = cleanSessionId(sessionId);
|
|
209
179
|
if (!targetSessionId) return false;
|
|
210
|
-
const targetListeners =
|
|
180
|
+
const targetListeners = sessionListenersOf(targetSessionId);
|
|
211
181
|
const open = ownerOpen(targetSessionId, capturedGeneration);
|
|
212
182
|
const ownerMeta = {
|
|
213
183
|
...(meta && typeof meta === 'object' ? meta : {}),
|
|
@@ -262,62 +232,6 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
|
|
|
262
232
|
return (text, meta = {}) => notifySessionCompletion(ownerSessionId, text, meta, generation);
|
|
263
233
|
}
|
|
264
234
|
|
|
265
|
-
function bindListenerToSession(sessionId, listener) {
|
|
266
|
-
const ownerSessionId = cleanSessionId(sessionId);
|
|
267
|
-
if (!ownerSessionId || typeof listener !== 'function') return;
|
|
268
|
-
let bucket = sessionNotificationListeners.get(ownerSessionId);
|
|
269
|
-
if (!bucket) {
|
|
270
|
-
bucket = new Set();
|
|
271
|
-
sessionNotificationListeners.set(ownerSessionId, bucket);
|
|
272
|
-
}
|
|
273
|
-
bucket.add(listener);
|
|
274
|
-
let ownedBucket = boundSessionListeners.get(ownerSessionId);
|
|
275
|
-
if (!ownedBucket) {
|
|
276
|
-
ownedBucket = new Set();
|
|
277
|
-
boundSessionListeners.set(ownerSessionId, ownedBucket);
|
|
278
|
-
}
|
|
279
|
-
ownedBucket.add(listener);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
function unbindListener(listener) {
|
|
283
|
-
for (const [sessionId, ownedBucket] of boundSessionListeners) {
|
|
284
|
-
if (!ownedBucket.delete(listener)) continue;
|
|
285
|
-
const bucket = sessionNotificationListeners.get(sessionId);
|
|
286
|
-
bucket?.delete(listener);
|
|
287
|
-
if (bucket?.size === 0) sessionNotificationListeners.delete(sessionId);
|
|
288
|
-
if (ownedBucket.size === 0) boundSessionListeners.delete(sessionId);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function subscribeRuntimeNotification(sessionId, listener) {
|
|
293
|
-
const ownerSessionId = cleanSessionId(sessionId);
|
|
294
|
-
if (typeof listener !== 'function') return () => {};
|
|
295
|
-
listeners.add(listener);
|
|
296
|
-
bindListenerToSession(ownerSessionId, listener);
|
|
297
|
-
return () => {
|
|
298
|
-
listeners.delete(listener);
|
|
299
|
-
unbindListener(listener);
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function bindRuntimeNotificationSession(sessionId) {
|
|
304
|
-
const ownerSessionId = cleanSessionId(sessionId);
|
|
305
|
-
if (!ownerSessionId) return false;
|
|
306
|
-
for (const listener of listeners) bindListenerToSession(ownerSessionId, listener);
|
|
307
|
-
return true;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
function clearRuntimeNotifications() {
|
|
311
|
-
for (const [sessionId, ownedBucket] of boundSessionListeners) {
|
|
312
|
-
const bucket = sessionNotificationListeners.get(sessionId);
|
|
313
|
-
if (!bucket) continue;
|
|
314
|
-
for (const listener of ownedBucket) bucket.delete(listener);
|
|
315
|
-
if (bucket.size === 0) sessionNotificationListeners.delete(sessionId);
|
|
316
|
-
}
|
|
317
|
-
boundSessionListeners.clear();
|
|
318
|
-
listeners.clear();
|
|
319
|
-
}
|
|
320
|
-
|
|
321
235
|
return {
|
|
322
236
|
emitRuntimeNotification,
|
|
323
237
|
notifySession,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// The model-visible queue path of a terminal tool completion
|
|
2
|
+
// (notification-bus.mjs): enqueue its twin once, skipping a completion the TUI
|
|
3
|
+
// path already delivered or this bus already queued.
|
|
4
|
+
import { modelVisibleToolCompletionMessage } from '../runtime/shared/tool-execution-contract.mjs';
|
|
5
|
+
import { markCompletionEntry } from '../runtime/agent/orchestrator/session/manager/pending-messages.mjs';
|
|
6
|
+
import {
|
|
7
|
+
isDeliveredCompletion,
|
|
8
|
+
logDuplicateSkip,
|
|
9
|
+
} from '../runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
|
|
10
|
+
|
|
11
|
+
// Bounded memory of `${session}:${entry id}` keys this bus queued.
|
|
12
|
+
const QUEUED_COMPLETION_IDS_MAX = 512;
|
|
13
|
+
|
|
14
|
+
export function createCompletionQueue({ mgr, onCompletionQueued }) {
|
|
15
|
+
const queuedCompletionIds = new Map();
|
|
16
|
+
|
|
17
|
+
// Enqueue the model-visible twin unless it was already delivered; returns
|
|
18
|
+
// true when the caller may treat the completion as delivered.
|
|
19
|
+
return function enqueueCompletion(callerSessionId, text, meta, path) {
|
|
20
|
+
const visible = modelVisibleToolCompletionMessage(text, meta);
|
|
21
|
+
// Non-completion notifications yield '' here and are never queued.
|
|
22
|
+
if (!visible) return false;
|
|
23
|
+
if (isDeliveredCompletion({ executionId: meta?.execution_id, text: visible })) {
|
|
24
|
+
// Delivered + ACKed on the TUI path: suppress the duplicate but report
|
|
25
|
+
// DELIVERED so the caller stops retrying.
|
|
26
|
+
logDuplicateSkip(path, { executionId: meta?.execution_id, text: visible });
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
const entry = markCompletionEntry(visible, { executionId: meta?.execution_id, meta });
|
|
30
|
+
const queueKey = `${callerSessionId}:${entry.id}`;
|
|
31
|
+
if (queuedCompletionIds.has(queueKey)) {
|
|
32
|
+
logDuplicateSkip(`${path}-queued`, { executionId: meta?.execution_id, text: visible });
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
const enqueued = mgr.enqueuePendingMessage(callerSessionId, entry) > 0;
|
|
36
|
+
if (!enqueued) return false;
|
|
37
|
+
queuedCompletionIds.set(queueKey, Date.now());
|
|
38
|
+
while (queuedCompletionIds.size > QUEUED_COMPLETION_IDS_MAX) {
|
|
39
|
+
queuedCompletionIds.delete(queuedCompletionIds.keys().next().value);
|
|
40
|
+
}
|
|
41
|
+
if (typeof onCompletionQueued === 'function') {
|
|
42
|
+
try {
|
|
43
|
+
onCompletionQueued({
|
|
44
|
+
sessionId: callerSessionId,
|
|
45
|
+
executionId: meta?.execution_id || null,
|
|
46
|
+
enqueuedAt: entry.enqueuedAt,
|
|
47
|
+
});
|
|
48
|
+
} catch {
|
|
49
|
+
/* wake-up is best-effort; the durable queue remains authoritative */
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Session-bound runtime notification listeners (notification-bus.mjs). The
|
|
2
|
+
// per-session listener sets are process-wide; each bus owns which of its
|
|
3
|
+
// listeners it bound to which session, and unbinds only those.
|
|
4
|
+
|
|
5
|
+
const sessionNotificationListeners = new Map();
|
|
6
|
+
|
|
7
|
+
export function cleanSessionId(value) {
|
|
8
|
+
return String(value || '').trim();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** The listeners bound to one session (an empty array when none). */
|
|
12
|
+
export function sessionListenersOf(sessionId) {
|
|
13
|
+
return sessionNotificationListeners.get(sessionId) || [];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createListenerBindings({ listeners }) {
|
|
17
|
+
const boundSessionListeners = new Map();
|
|
18
|
+
|
|
19
|
+
function bindListenerToSession(sessionId, listener) {
|
|
20
|
+
const ownerSessionId = cleanSessionId(sessionId);
|
|
21
|
+
if (!ownerSessionId || typeof listener !== 'function') return;
|
|
22
|
+
let bucket = sessionNotificationListeners.get(ownerSessionId);
|
|
23
|
+
if (!bucket) {
|
|
24
|
+
bucket = new Set();
|
|
25
|
+
sessionNotificationListeners.set(ownerSessionId, bucket);
|
|
26
|
+
}
|
|
27
|
+
bucket.add(listener);
|
|
28
|
+
let ownedBucket = boundSessionListeners.get(ownerSessionId);
|
|
29
|
+
if (!ownedBucket) {
|
|
30
|
+
ownedBucket = new Set();
|
|
31
|
+
boundSessionListeners.set(ownerSessionId, ownedBucket);
|
|
32
|
+
}
|
|
33
|
+
ownedBucket.add(listener);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function unbindListener(listener) {
|
|
37
|
+
for (const [sessionId, ownedBucket] of boundSessionListeners) {
|
|
38
|
+
if (!ownedBucket.delete(listener)) continue;
|
|
39
|
+
const bucket = sessionNotificationListeners.get(sessionId);
|
|
40
|
+
bucket?.delete(listener);
|
|
41
|
+
if (bucket?.size === 0) sessionNotificationListeners.delete(sessionId);
|
|
42
|
+
if (ownedBucket.size === 0) boundSessionListeners.delete(sessionId);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function subscribeRuntimeNotification(sessionId, listener) {
|
|
47
|
+
const ownerSessionId = cleanSessionId(sessionId);
|
|
48
|
+
if (typeof listener !== 'function') return () => {};
|
|
49
|
+
listeners.add(listener);
|
|
50
|
+
bindListenerToSession(ownerSessionId, listener);
|
|
51
|
+
return () => {
|
|
52
|
+
listeners.delete(listener);
|
|
53
|
+
unbindListener(listener);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function bindRuntimeNotificationSession(sessionId) {
|
|
58
|
+
const ownerSessionId = cleanSessionId(sessionId);
|
|
59
|
+
if (!ownerSessionId) return false;
|
|
60
|
+
for (const listener of listeners) bindListenerToSession(ownerSessionId, listener);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function clearRuntimeNotifications() {
|
|
65
|
+
for (const [sessionId, ownedBucket] of boundSessionListeners) {
|
|
66
|
+
const bucket = sessionNotificationListeners.get(sessionId);
|
|
67
|
+
if (!bucket) continue;
|
|
68
|
+
for (const listener of ownedBucket) bucket.delete(listener);
|
|
69
|
+
if (bucket.size === 0) sessionNotificationListeners.delete(sessionId);
|
|
70
|
+
}
|
|
71
|
+
boundSessionListeners.clear();
|
|
72
|
+
listeners.clear();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return { subscribeRuntimeNotification, bindRuntimeNotificationSession, clearRuntimeNotifications };
|
|
76
|
+
}
|
|
@@ -131,7 +131,8 @@ export async function runOwnedAutomation(kind, row, run, deps = {}) {
|
|
|
131
131
|
reserved = false,
|
|
132
132
|
signal = null,
|
|
133
133
|
now = Date.now,
|
|
134
|
-
|
|
134
|
+
// `row` is stored: for Mixy, itself evidence of her (routine-owner.mjs).
|
|
135
|
+
ownerProblem = (ownerAgentId) => routineOwnerProblem(ownerAgentId, null, { stored: true }),
|
|
135
136
|
log = defaultLog,
|
|
136
137
|
} = deps;
|
|
137
138
|
const name = row.name;
|
|
@@ -39,9 +39,7 @@ export function createChannelStart({
|
|
|
39
39
|
async function onChannelStartTimer() {
|
|
40
40
|
timers.channelStartTimer = null;
|
|
41
41
|
if (isCloseRequested()) return;
|
|
42
|
-
//
|
|
43
|
-
// (enabled schedules/webhooks) keeps the worker boot alive — its
|
|
44
|
-
// channel worker runs headless: only active automation boots it.
|
|
42
|
+
// Only active automation (enabled schedules/webhooks) boots the worker.
|
|
45
43
|
const automation = await hasActiveAutomation().catch(() => false);
|
|
46
44
|
if (!automation) {
|
|
47
45
|
bootProfile('channels:start-disabled');
|
|
@@ -69,10 +67,8 @@ export function createChannelStart({
|
|
|
69
67
|
timers.channelStartTimer.unref?.();
|
|
70
68
|
}
|
|
71
69
|
|
|
72
|
-
// Boot-time automation autostart
|
|
73
|
-
//
|
|
74
|
-
// provider. The worker runs headless (scheduler/webhooks/voice only).
|
|
75
|
-
// Unlike scheduleChannelStart this probes once at the boot delay and never
|
|
70
|
+
// Boot-time automation autostart: enabled schedules/webhooks boot the worker
|
|
71
|
+
// on their own (scheduler/webhooks/voice only). Unlike scheduleChannelStart this probes once at the boot delay and never
|
|
76
72
|
// re-arms. The probe itself is shared process-wide (channel-admin
|
|
77
73
|
// hasActiveAutomation), so N runtimes booting together check once.
|
|
78
74
|
function scheduleAutomationAutostart(delayMs) {
|