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
|
@@ -1,24 +1,6 @@
|
|
|
1
|
-
import { loadConfig
|
|
1
|
+
import { loadConfig } from '../config.mjs';
|
|
2
2
|
|
|
3
|
-
function
|
|
4
|
-
const typeChanged = (next?.name || '') !== (previous?.name || '');
|
|
5
|
-
const credentialsChanged = !typeChanged && String(next?.token || '') !== String(previous?.token || '');
|
|
6
|
-
return { typeChanged, changed: typeChanged || credentialsChanged };
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function createConfigReloader({
|
|
10
|
-
state,
|
|
11
|
-
getConfig,
|
|
12
|
-
setConfig,
|
|
13
|
-
getProvider,
|
|
14
|
-
setProvider,
|
|
15
|
-
getBridgeRuntimeConnected,
|
|
16
|
-
scheduler,
|
|
17
|
-
statusState,
|
|
18
|
-
services,
|
|
19
|
-
stopOwnedRuntime,
|
|
20
|
-
refreshBridgeOwnershipSafe,
|
|
21
|
-
}) {
|
|
3
|
+
export function createConfigReloader({ state, getConfig, setConfig, getBridgeRuntimeConnected, scheduler, services }) {
|
|
22
4
|
function reloadScheduler() {
|
|
23
5
|
// The scheduler must be RE-ARMED by the reload whenever it is supposed to
|
|
24
6
|
// be running: `restart: false` only destroys the cron/one-shot bindings and
|
|
@@ -26,50 +8,13 @@ export function createConfigReloader({
|
|
|
26
8
|
// startAutomationRuntime() is already past its automationRunning guard, so
|
|
27
9
|
// nobody would call scheduler.start() again and every saved/edited schedule
|
|
28
10
|
// stayed silently disarmed until the daemon restarted.
|
|
29
|
-
scheduler.reloadConfig(getConfig().
|
|
11
|
+
scheduler.reloadConfig(getConfig().schedules ?? [], {
|
|
30
12
|
restart: state.automationRunning || getBridgeRuntimeConnected(),
|
|
31
13
|
});
|
|
32
14
|
}
|
|
33
|
-
async function swapProvider(nextProvider, typeChanged) {
|
|
34
|
-
const shouldRestart = getBridgeRuntimeConnected() || state.bridgeRuntimeStarting;
|
|
35
|
-
if (shouldRestart) await stopOwnedRuntime('provider config changed');
|
|
36
|
-
// A start in flight when the stop landed was signalled to bail (and
|
|
37
|
-
// disconnects the OLD provider). Wait for it to FULLY settle before the
|
|
38
|
-
// fresh start below, or startOwnedRuntime's in-flight guard would drop the
|
|
39
|
-
// restart and the NEW provider would never connect (lost-restart race).
|
|
40
|
-
if (state.inFlightStart) {
|
|
41
|
-
try {
|
|
42
|
-
await state.inFlightStart;
|
|
43
|
-
} catch {}
|
|
44
|
-
}
|
|
45
|
-
setProvider(nextProvider);
|
|
46
|
-
// A provider-type change wipes the persisted routing ids; messaging is
|
|
47
|
-
// retired, so only the status snapshot needs clearing.
|
|
48
|
-
if (typeChanged) {
|
|
49
|
-
try {
|
|
50
|
-
statusState.update((snapshot) => {
|
|
51
|
-
snapshot.channelId = '';
|
|
52
|
-
snapshot.transcriptPath = '';
|
|
53
|
-
});
|
|
54
|
-
} catch {}
|
|
55
|
-
}
|
|
56
|
-
if (shouldRestart) refreshBridgeOwnershipSafe({ restoreBinding: !typeChanged });
|
|
57
|
-
}
|
|
58
15
|
return async function reloadRuntimeConfig() {
|
|
59
|
-
|
|
60
|
-
// File-watch/tool-triggered reloads bypass the short keychain hit cache:
|
|
61
|
-
// another process may have just saved or rotated the channel credential.
|
|
62
|
-
setConfig(await loadConfig({ freshSecrets: true }));
|
|
16
|
+
setConfig(await loadConfig());
|
|
63
17
|
reloadScheduler();
|
|
64
|
-
const nextProvider = createProvider(getConfig());
|
|
65
|
-
const change = describeProviderChange(previousProvider, nextProvider);
|
|
66
|
-
if (change.changed) {
|
|
67
|
-
await swapProvider(nextProvider, change.typeChanged);
|
|
68
|
-
} else if (nextProvider !== previousProvider) {
|
|
69
|
-
try {
|
|
70
|
-
await nextProvider.disconnect?.();
|
|
71
|
-
} catch {}
|
|
72
|
-
}
|
|
73
18
|
if (getBridgeRuntimeConnected() || state.automationRunning) {
|
|
74
19
|
services.syncWebhookAndEventRuntime({ reload: true });
|
|
75
20
|
} else {
|
|
@@ -2,12 +2,8 @@ import { startSnapshotWriter } from '../status-snapshot.mjs';
|
|
|
2
2
|
import { refreshActiveInstance, releaseOwnedChannelLocks, clearActiveInstance } from '../runtime-paths.mjs';
|
|
3
3
|
import { initAgentProviders } from './automation-start.mjs';
|
|
4
4
|
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
async function releaseStartingProvider(startingProvider, instanceId) {
|
|
8
|
-
try {
|
|
9
|
-
await startingProvider.disconnect();
|
|
10
|
-
} catch {}
|
|
5
|
+
// Release the owner-side adverts a start claimed. Every step is best-effort.
|
|
6
|
+
function releaseOwnerAdverts(instanceId) {
|
|
11
7
|
try {
|
|
12
8
|
releaseOwnedChannelLocks(instanceId);
|
|
13
9
|
} catch {}
|
|
@@ -16,24 +12,6 @@ async function releaseStartingProvider(startingProvider, instanceId) {
|
|
|
16
12
|
} catch {}
|
|
17
13
|
}
|
|
18
14
|
|
|
19
|
-
// Mark a start as in flight and hand back the settle function that clears
|
|
20
|
-
// the marker and wakes anyone awaiting state.inFlightStart.
|
|
21
|
-
function openInFlightStart(state) {
|
|
22
|
-
let settle;
|
|
23
|
-
state.bridgeRuntimeStarting = true;
|
|
24
|
-
state.stopRequested = false;
|
|
25
|
-
state.inFlightStart = new Promise((resolve) => {
|
|
26
|
-
settle = resolve;
|
|
27
|
-
});
|
|
28
|
-
return () => {
|
|
29
|
-
state.bridgeRuntimeStarting = false;
|
|
30
|
-
state.inFlightStart = null;
|
|
31
|
-
const done = settle;
|
|
32
|
-
settle = null;
|
|
33
|
-
done?.();
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
15
|
// Daemon model: the machine-global service (singleton-owner lock in
|
|
38
16
|
// src/standalone) guarantees exactly one runtime per machine, so this process
|
|
39
17
|
// is the unconditional bridge owner — no seat to claim, no takeover handler,
|
|
@@ -41,7 +19,6 @@ function openInFlightStart(state) {
|
|
|
41
19
|
// metadata advert.
|
|
42
20
|
export function createOwnedStarter({
|
|
43
21
|
state,
|
|
44
|
-
getProvider,
|
|
45
22
|
getBridgeRuntimeConnected,
|
|
46
23
|
setBridgeRuntimeConnected,
|
|
47
24
|
getChannelBridgeActive,
|
|
@@ -50,44 +27,20 @@ export function createOwnedStarter({
|
|
|
50
27
|
scheduler,
|
|
51
28
|
logOwnership,
|
|
52
29
|
services,
|
|
53
|
-
startAutomationRuntime,
|
|
54
30
|
notifyRemoteAcquired,
|
|
55
31
|
}) {
|
|
56
|
-
//
|
|
57
|
-
// explicit activation/reload recovery: re-binding status on every tick
|
|
58
|
-
// could move the transcript cursor to EOF, and probing the gateway during
|
|
59
|
-
// the provider's own reconnect window can reset a healthy reconnect loop.
|
|
60
|
-
async function selfHealOwnedRuntime(options = {}) {
|
|
61
|
-
if (options.resetProvider !== true) return;
|
|
62
|
-
if (state.selfHealing) return;
|
|
63
|
-
state.selfHealing = true;
|
|
64
|
-
try {
|
|
65
|
-
if (typeof getProvider()?._resetClient === 'function') {
|
|
66
|
-
await getProvider()
|
|
67
|
-
._resetClient()
|
|
68
|
-
.catch((e) => {
|
|
69
|
-
process.stderr.write(
|
|
70
|
-
`mixdog: self-heal provider reset failed (non-fatal): ${e instanceof Error ? e.message : String(e)}\n`
|
|
71
|
-
);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
} finally {
|
|
75
|
-
state.selfHealing = false;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// Re-checked after each post-connect await so a stopOwnedRuntime() landing
|
|
32
|
+
// Checked after the await in a start so a stopOwnedRuntime() landing
|
|
79
33
|
// mid-start cannot be overridden by the resuming start. Idempotent with the
|
|
80
|
-
// stop's own teardown
|
|
81
|
-
|
|
82
|
-
async function bailIfStopRequested(startingProvider) {
|
|
34
|
+
// stop's own teardown.
|
|
35
|
+
function bailIfStopRequested() {
|
|
83
36
|
if (!state.stopRequested) return false;
|
|
84
|
-
|
|
37
|
+
releaseOwnerAdverts(instanceId);
|
|
85
38
|
setBridgeRuntimeConnected(false);
|
|
86
39
|
state.stopRequested = false;
|
|
87
40
|
return true;
|
|
88
41
|
}
|
|
89
|
-
//
|
|
90
|
-
//
|
|
42
|
+
// Activation after an automation-only start must not double-arm the
|
|
43
|
+
// scheduler/snapshot timers; the webhook/event sync is idempotent.
|
|
91
44
|
function armAutomation() {
|
|
92
45
|
if (!state.automationRunning) {
|
|
93
46
|
scheduler.start();
|
|
@@ -96,76 +49,41 @@ export function createOwnedStarter({
|
|
|
96
49
|
services.syncWebhookAndEventRuntime();
|
|
97
50
|
state.automationRunning = true;
|
|
98
51
|
}
|
|
99
|
-
|
|
100
|
-
// the provider library, bad token, gateway outage — must not take schedules/webhooks
|
|
101
|
-
// down with it. Sends stay dead (connected=false) but session runs, the
|
|
102
|
-
// webhook server and the relay tunnel keep working.
|
|
103
|
-
async function degradeToAutomation() {
|
|
104
|
-
if (state.stopRequested) return;
|
|
105
|
-
// Already degraded-started by an earlier attempt; this run was only a
|
|
106
|
-
// messaging reconnect retry.
|
|
107
|
-
if (state.automationRunning) return;
|
|
108
|
-
try {
|
|
109
|
-
await startAutomationRuntime();
|
|
110
|
-
} catch (e) {
|
|
111
|
-
process.stderr.write(`mixdog: degraded automation start failed: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
async function connectAndArm(startingProvider) {
|
|
115
|
-
// Awaited so callers (and bindingReady) only resolve after the binding is
|
|
116
|
-
// real; a fire-and-forget connect let bindingReady fire before listeners
|
|
117
|
-
// were attached.
|
|
118
|
-
await startingProvider.connect();
|
|
119
|
-
if (await bailIfStopRequested(startingProvider)) return;
|
|
120
|
-
try {
|
|
121
|
-
refreshActiveInstance(instanceId, { providerReady: true });
|
|
122
|
-
} catch {}
|
|
52
|
+
async function activateBridge() {
|
|
123
53
|
setBridgeRuntimeConnected(true);
|
|
124
|
-
// Reached only on a not-
|
|
125
|
-
//
|
|
126
|
-
// + activate). Notifying post-connect means a connect failure leaves the
|
|
127
|
-
// parent non-remote instead of remote-with-no-bridge.
|
|
54
|
+
// Reached only on a not-active -> active transition, so this fires exactly
|
|
55
|
+
// once per activation across every start path.
|
|
128
56
|
notifyRemoteAcquired();
|
|
129
57
|
await initAgentProviders();
|
|
130
|
-
if (
|
|
58
|
+
if (bailIfStopRequested()) return;
|
|
131
59
|
armAutomation();
|
|
132
|
-
process.stderr.write(`mixdog: running with ${getProvider().name} provider\n`);
|
|
133
60
|
logOwnership(`active owner lead=${TERMINAL_LEAD_PID} pid=${process.pid}`);
|
|
134
61
|
}
|
|
135
|
-
async function startOwnedRuntime(
|
|
136
|
-
if (getBridgeRuntimeConnected())
|
|
137
|
-
if (!state.bridgeRuntimeStarting) await selfHealOwnedRuntime(options);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
62
|
+
async function startOwnedRuntime() {
|
|
63
|
+
if (getBridgeRuntimeConnected()) return;
|
|
140
64
|
if (state.bridgeRuntimeStarting) return;
|
|
141
65
|
if (!getChannelBridgeActive()) return;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
// the worker's provider while connect() is pending, and using the captured
|
|
145
|
-
// instance for both connect() and the bail/failure disconnect guarantees
|
|
146
|
-
// we tear down the one we started (closing the both-providers-live window).
|
|
147
|
-
const startingProvider = getProvider();
|
|
148
|
-
try {
|
|
149
|
-
refreshActiveInstance(instanceId, { providerReady: false });
|
|
150
|
-
} catch (e) {
|
|
151
|
-
settleInFlightStart();
|
|
152
|
-
process.stderr.write(
|
|
153
|
-
`mixdog: pre-connect metadata advert aborted (${e instanceof Error ? e.message : String(e)})\n`
|
|
154
|
-
);
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
66
|
+
state.bridgeRuntimeStarting = true;
|
|
67
|
+
state.stopRequested = false;
|
|
157
68
|
try {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
`mixdog:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
69
|
+
try {
|
|
70
|
+
refreshActiveInstance(instanceId);
|
|
71
|
+
} catch (e) {
|
|
72
|
+
process.stderr.write(`mixdog: metadata advert aborted (${e instanceof Error ? e.message : String(e)})\n`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
await activateBridge();
|
|
77
|
+
} catch (e) {
|
|
78
|
+
process.stderr.write(
|
|
79
|
+
`mixdog: bridge start failed (non-fatal): ${e instanceof Error ? e.message : String(e)}\n`
|
|
80
|
+
);
|
|
81
|
+
// Roll back the owner-side state advertised before the start.
|
|
82
|
+
releaseOwnerAdverts(instanceId);
|
|
83
|
+
setBridgeRuntimeConnected(false);
|
|
84
|
+
}
|
|
167
85
|
} finally {
|
|
168
|
-
|
|
86
|
+
state.bridgeRuntimeStarting = false;
|
|
169
87
|
}
|
|
170
88
|
}
|
|
171
89
|
return { startOwnedRuntime };
|
|
@@ -3,7 +3,6 @@ import { releaseOwnedChannelLocks, clearActiveInstance } from '../runtime-paths.
|
|
|
3
3
|
|
|
4
4
|
export function createOwnedStopper({
|
|
5
5
|
state,
|
|
6
|
-
getProvider,
|
|
7
6
|
getBridgeRuntimeConnected,
|
|
8
7
|
setBridgeRuntimeConnected,
|
|
9
8
|
instanceId,
|
|
@@ -11,19 +10,9 @@ export function createOwnedStopper({
|
|
|
11
10
|
logOwnership,
|
|
12
11
|
services,
|
|
13
12
|
}) {
|
|
14
|
-
// Only disconnect when connect() actually completed; disconnecting
|
|
15
|
-
// mid-connect races the connect promise. In-flight outbound sends are
|
|
16
|
-
// drained first (bounded inside drainPendingSends) so a handoff never cuts
|
|
17
|
-
// off a reply mid-delivery.
|
|
18
|
-
async function disconnectConnectedProvider() {
|
|
19
|
-
try {
|
|
20
|
-
await getProvider().drainPendingSends?.();
|
|
21
|
-
} catch {}
|
|
22
|
-
await getProvider().disconnect();
|
|
23
|
-
}
|
|
24
13
|
return async function stopOwnedRuntime(reason) {
|
|
25
14
|
// A start advertises owner metadata and claims channel locks before
|
|
26
|
-
//
|
|
15
|
+
// it finishes; a stop landing in that window (starting=true,
|
|
27
16
|
// connected=false) still has partial state to tear down.
|
|
28
17
|
if (
|
|
29
18
|
!getBridgeRuntimeConnected() &&
|
|
@@ -33,27 +22,21 @@ export function createOwnedStopper({
|
|
|
33
22
|
) {
|
|
34
23
|
return;
|
|
35
24
|
}
|
|
36
|
-
// Signal an in-flight start to abort
|
|
37
|
-
//
|
|
38
|
-
// after the teardown below.
|
|
25
|
+
// Signal an in-flight start to abort at its next checkpoint; otherwise it
|
|
26
|
+
// would re-launch scheduler/webhook after the teardown below.
|
|
39
27
|
if (state.bridgeRuntimeStarting || state.automationStartPromise) state.stopRequested = true;
|
|
40
28
|
if (state.automationStartPromise) {
|
|
41
29
|
try {
|
|
42
30
|
await state.automationStartPromise;
|
|
43
31
|
} catch {}
|
|
44
32
|
}
|
|
45
|
-
const wasConnected = getBridgeRuntimeConnected();
|
|
46
33
|
scheduler.stop();
|
|
47
34
|
stopSnapshotWriter();
|
|
48
35
|
await services.stopWebhookAndEventRuntime();
|
|
49
36
|
state.automationRunning = false;
|
|
50
37
|
releaseOwnedChannelLocks(instanceId);
|
|
51
38
|
clearActiveInstance(instanceId);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
} finally {
|
|
55
|
-
setBridgeRuntimeConnected(false);
|
|
56
|
-
logOwnership(`standby: ${reason}`);
|
|
57
|
-
}
|
|
39
|
+
setBridgeRuntimeConnected(false);
|
|
40
|
+
logOwnership(`standby: ${reason}`);
|
|
58
41
|
};
|
|
59
42
|
}
|
|
@@ -8,15 +8,9 @@ export function createOwnedRuntimeState() {
|
|
|
8
8
|
// stopOwnedRuntime() landed while an owned or automation start was in
|
|
9
9
|
// flight; the in-flight run bails at its next checkpoint.
|
|
10
10
|
stopRequested: false,
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
inFlightStart: null,
|
|
14
|
-
// Automation (scheduler + webhook server + relay tunnel) can outlive a
|
|
15
|
-
// failed/absent messaging provider; tracked apart from the connect flag.
|
|
11
|
+
// Automation (scheduler + webhook server + relay tunnel) can run without
|
|
12
|
+
// the bridge being active; tracked apart from the bridge-connected flag.
|
|
16
13
|
automationRunning: false,
|
|
17
14
|
automationStartPromise: null,
|
|
18
|
-
// Coalesces concurrent refreshBridgeOwnership() callers.
|
|
19
|
-
refreshInFlight: null,
|
|
20
|
-
selfHealing: false,
|
|
21
15
|
};
|
|
22
16
|
}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
// Owned-runtime lifecycle:
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// semantics are preserved.
|
|
1
|
+
// Owned-runtime lifecycle: bridge activation, automation runtime (scheduler +
|
|
2
|
+
// webhook/event runtime) and config hot-reload. The phases live under
|
|
3
|
+
// owned-runtime/ and share one explicit state object; config /
|
|
4
|
+
// bridgeRuntimeConnected / webhookServer / eventPipeline stay on the worker
|
|
5
|
+
// (get/set) so file-level reference semantics are preserved.
|
|
7
6
|
import { createOwnedRuntimeState } from './owned-runtime/state.mjs';
|
|
8
7
|
import { createAutomationServices } from './owned-runtime/automation-services.mjs';
|
|
9
8
|
import { createAutomationStarter } from './owned-runtime/automation-start.mjs';
|
|
10
9
|
import { createOwnedStarter } from './owned-runtime/owned-start.mjs';
|
|
11
10
|
import { createOwnedStopper } from './owned-runtime/owned-stop.mjs';
|
|
12
|
-
import { createOwnershipRefresh } from './owned-runtime/ownership-refresh.mjs';
|
|
13
11
|
import { createConfigReloader } from './owned-runtime/config-reload.mjs';
|
|
14
12
|
|
|
15
13
|
export function createOwnedRuntime(deps) {
|
|
@@ -26,29 +24,14 @@ export function createOwnedRuntime(deps) {
|
|
|
26
24
|
...deps,
|
|
27
25
|
state,
|
|
28
26
|
services,
|
|
29
|
-
startAutomationRuntime,
|
|
30
27
|
notifyRemoteAcquired,
|
|
31
28
|
});
|
|
32
29
|
const stopOwnedRuntime = createOwnedStopper({ ...deps, state, services });
|
|
33
|
-
const {
|
|
34
|
-
...deps,
|
|
35
|
-
state,
|
|
36
|
-
startOwnedRuntime,
|
|
37
|
-
stopOwnedRuntime,
|
|
38
|
-
});
|
|
39
|
-
const reloadRuntimeConfig = createConfigReloader({
|
|
40
|
-
...deps,
|
|
41
|
-
state,
|
|
42
|
-
services,
|
|
43
|
-
stopOwnedRuntime,
|
|
44
|
-
refreshBridgeOwnershipSafe,
|
|
45
|
-
});
|
|
30
|
+
const reloadRuntimeConfig = createConfigReloader({ ...deps, state, services });
|
|
46
31
|
return {
|
|
47
32
|
startAutomationRuntime,
|
|
48
33
|
startOwnedRuntime,
|
|
49
34
|
stopOwnedRuntime,
|
|
50
|
-
refreshBridgeOwnership,
|
|
51
|
-
refreshBridgeOwnershipSafe,
|
|
52
35
|
reloadRuntimeConfig,
|
|
53
36
|
notifyRemoteAcquired,
|
|
54
37
|
};
|
|
@@ -28,8 +28,8 @@ function setChannelNotifySink(fn) {
|
|
|
28
28
|
function createParentBridge({ getInstanceId, ipcProcess = process }) {
|
|
29
29
|
function sendNotifyToParent(method, params) {
|
|
30
30
|
// The channel schema requires meta: Record<string,string>.
|
|
31
|
-
// Coerce every meta value to string so a non-string (e.g. a
|
|
32
|
-
//
|
|
31
|
+
// Coerce every meta value to string so a non-string (e.g. a numeric
|
|
32
|
+
// meta field) can't fail zod and silently drop the notify.
|
|
33
33
|
// silent_to_agent stays boolean — an internal routing flag the daemon
|
|
34
34
|
// router / agentNotify consume (=== true) before the zod boundary.
|
|
35
35
|
const outParams = normalizeChannelNotifyParams(method, params);
|
|
@@ -81,9 +81,9 @@ function activeInstanceStaleReason(state) {
|
|
|
81
81
|
// NOTE: ownership is no longer decided here — the machine-global channels
|
|
82
82
|
// daemon (singleton-owner lock in src/standalone) is the authority. This
|
|
83
83
|
// PID-death check only marks a metadata advert whose owning process is gone so
|
|
84
|
-
// refreshActiveInstance can avoid preserving its owner fields.
|
|
85
|
-
// ui_heartbeat_at staleness branch
|
|
86
|
-
//
|
|
84
|
+
// refreshActiveInstance can avoid preserving its owner fields. There is no
|
|
85
|
+
// ui_heartbeat_at staleness branch: its false-stale eviction wrongly dropped
|
|
86
|
+
// live owners.
|
|
87
87
|
return null;
|
|
88
88
|
}
|
|
89
89
|
function buildRuntimeIdentity() {
|
|
@@ -126,11 +126,8 @@ function readActiveInstance() {
|
|
|
126
126
|
/** Caller-supplied advert fields, in the order every writer publishes them. */
|
|
127
127
|
function metaFields(meta) {
|
|
128
128
|
return {
|
|
129
|
-
...(meta?.channelId ? { channelId: meta.channelId } : {}),
|
|
130
129
|
...(meta?.transcriptPath ? { transcriptPath: meta.transcriptPath } : {}),
|
|
131
130
|
...(meta?.httpPort ? { httpPort: meta.httpPort } : {}),
|
|
132
|
-
...Object.fromEntries(Object.entries(meta || {}).filter(([k]) => k.startsWith('gateway_'))),
|
|
133
|
-
...(typeof meta?.providerReady === 'boolean' ? { providerReady: meta.providerReady } : {}),
|
|
134
131
|
};
|
|
135
132
|
}
|
|
136
133
|
function buildActiveInstanceState(instanceId, meta) {
|
|
@@ -143,41 +140,6 @@ function buildActiveInstanceState(instanceId, meta) {
|
|
|
143
140
|
...metaFields(meta),
|
|
144
141
|
};
|
|
145
142
|
}
|
|
146
|
-
function isProcessAlive(pid) {
|
|
147
|
-
try {
|
|
148
|
-
process.kill(pid, 0);
|
|
149
|
-
return true;
|
|
150
|
-
} catch (e) {
|
|
151
|
-
return !(e && e.code === 'ESRCH');
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// gateway_* fields are preserved while the gateway owner is alive: the gateway
|
|
155
|
-
// child advertises itself independently, and active-owner heartbeats must not
|
|
156
|
-
// erase that discovery record while its owning server-main process is still
|
|
157
|
-
// alive. Writes into `preservedExtra` (and clears from `next`).
|
|
158
|
-
function preserveGatewayFields(prev, meta, identity, preservedExtra, next) {
|
|
159
|
-
const prevGatewayServerPid = parsePositivePid(prev?.gateway_server_pid);
|
|
160
|
-
const prevGatewayOwnerAlive = prevGatewayServerPid !== null && isProcessAlive(prevGatewayServerPid);
|
|
161
|
-
const sameGatewayAdvertiser =
|
|
162
|
-
prevGatewayServerPid !== null && identity.server_pid !== null && prevGatewayServerPid === identity.server_pid;
|
|
163
|
-
if (!(sameGatewayAdvertiser || prevGatewayOwnerAlive)) return;
|
|
164
|
-
if (!prev || !Object.hasOwn(prev, 'gateway_port')) return;
|
|
165
|
-
for (const [key, value] of Object.entries(prev)) {
|
|
166
|
-
if (key.startsWith('gateway_')) preservedExtra[key] = value;
|
|
167
|
-
}
|
|
168
|
-
preservedExtra.gateway_server_pid = prevGatewayServerPid;
|
|
169
|
-
// Clear session-scoped gateway metrics when the transcript changes — a new
|
|
170
|
-
// session must not inherit the previous session's context usage before the
|
|
171
|
-
// gateway re-advertises.
|
|
172
|
-
const nonEmptyString = (value) => (typeof value === 'string' && value ? value : null);
|
|
173
|
-
const metricTranscript = nonEmptyString(prev.gateway_transcript_path) ?? nonEmptyString(prev.transcriptPath);
|
|
174
|
-
if (typeof meta?.transcriptPath === 'string' && meta.transcriptPath && metricTranscript !== meta.transcriptPath) {
|
|
175
|
-
delete preservedExtra.gateway_context_used_pct;
|
|
176
|
-
delete preservedExtra.gateway_last_usage;
|
|
177
|
-
delete next.gateway_context_used_pct;
|
|
178
|
-
delete next.gateway_last_usage;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
143
|
function refreshActiveInstance(instanceId, meta, options) {
|
|
182
144
|
ensureRuntimeDirs();
|
|
183
145
|
// Periodic refresh/heartbeat callers pass options.timeoutMs:0 (try-once) so
|
|
@@ -237,7 +199,6 @@ function refreshActiveInstance(instanceId, meta, options) {
|
|
|
237
199
|
const preservedExtra = Object.fromEntries(
|
|
238
200
|
Object.entries(prevForPreserve ?? {}).filter(([k]) => k.startsWith('pg_'))
|
|
239
201
|
);
|
|
240
|
-
preserveGatewayFields(prevForPreserve, meta, identity, preservedExtra, next);
|
|
241
202
|
return { ...preservedExtra, ...next };
|
|
242
203
|
},
|
|
243
204
|
writeOpts
|
|
@@ -354,7 +315,7 @@ function cleanupInstanceRuntimeFiles(instanceId) {
|
|
|
354
315
|
for (const target of targets) {
|
|
355
316
|
removeFileIfExists(target);
|
|
356
317
|
}
|
|
357
|
-
// Remove artifacts left by pre-standalone
|
|
318
|
+
// Remove per-instance permission artifacts left by pre-standalone builds.
|
|
358
319
|
forEachFile(RUNTIME_ROOT, (fullPath, file) => {
|
|
359
320
|
if (file.startsWith(`perm-${sanitize(instanceId)}-`)) {
|
|
360
321
|
removeFileIfExists(fullPath);
|