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.
Files changed (515) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/check-voice-runtime-inputs.mjs +25 -0
  5. package/scripts/daemon-stub.mjs +1 -1
  6. package/scripts/gate-local.mjs +16 -5
  7. package/scripts/latest-guard.mjs +21 -9
  8. package/scripts/lib/isolated-test-env.mjs +10 -5
  9. package/scripts/lib/run-node-tests.mjs +37 -37
  10. package/scripts/lib/scoped-temp.d.mts +16 -0
  11. package/scripts/lib/scoped-temp.mjs +123 -0
  12. package/scripts/lib/stale-temp.mjs +44 -0
  13. package/scripts/native-release-status.mjs +2 -2
  14. package/scripts/post-release-check.mjs +1 -6
  15. package/scripts/pptx-kit-index.mjs +17 -4
  16. package/scripts/recall-history-cases.json +1 -1
  17. package/scripts/suite-health.mjs +20 -2
  18. package/scripts/test-data-dir.mjs +10 -7
  19. package/scripts/test.mjs +7 -11
  20. package/src/agents/reviewer/AGENT.md +7 -11
  21. package/src/agents/reviewer/agent.json +1 -1
  22. package/src/app.mjs +4 -0
  23. package/src/defaults/shipped-history.json +22 -1
  24. package/src/defaults/skills/browser-use/SKILL.md +62 -12
  25. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  26. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  27. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  28. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  29. package/src/defaults/skills/computer-use/SKILL.md +35 -9
  30. package/src/defaults/skills/setup/SKILL.md +22 -0
  31. package/src/defaults/skills/setup/references/actions.md +39 -5
  32. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  33. package/src/defaults/skills/visualize/SKILL.md +2 -1
  34. package/src/lib/rules-builder.cjs +39 -20
  35. package/src/output-styles/common.md +2 -2
  36. package/src/output-styles/simple.md +1 -1
  37. package/src/rules/agent/AGENT.md +11 -10
  38. package/src/rules/lead/LEAD.md +23 -20
  39. package/src/rules/shared/05-tool-calls.md +5 -6
  40. package/src/rules/shared/10-tool-workflow.md +4 -0
  41. package/src/rules/shared/45-destructive.md +0 -2
  42. package/src/rules/shared/50-execution.md +2 -0
  43. package/src/rules/shared/60-verification.md +7 -5
  44. package/src/rules/shared/70-delivery.md +7 -9
  45. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
  46. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  47. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  48. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  49. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
  50. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  51. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  52. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
  53. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
  54. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  55. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  56. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  57. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
  58. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
  59. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  60. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
  62. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
  63. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
  66. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  67. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
  70. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
  71. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  72. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
  73. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
  74. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  75. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  76. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  77. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
  78. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  79. package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
  80. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
  81. package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
  82. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
  83. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
  84. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
  85. package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
  87. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  88. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  89. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
  90. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  91. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  92. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  93. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
  102. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  103. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
  104. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
  105. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
  106. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
  107. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
  109. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  110. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  111. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  112. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  113. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
  117. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  118. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  119. package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
  120. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  121. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  122. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
  123. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  124. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  125. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  126. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
  127. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  129. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  130. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
  131. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
  132. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
  133. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
  134. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
  136. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
  137. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
  138. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
  139. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  140. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  141. package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
  142. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
  143. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
  144. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
  145. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
  146. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
  147. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  148. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  149. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  150. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  151. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  152. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
  153. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
  154. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  155. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  156. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
  158. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
  159. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
  160. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  161. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
  162. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  163. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  164. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
  165. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  166. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  167. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  168. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  170. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
  171. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
  172. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  173. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  174. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
  175. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  176. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  177. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
  178. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
  179. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
  180. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  181. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
  182. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
  183. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  184. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
  185. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
  186. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  187. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
  188. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
  189. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
  190. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  191. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
  192. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
  193. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  194. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  195. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  196. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  197. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  198. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  199. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  200. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  201. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  202. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
  203. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  204. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
  206. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
  207. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
  208. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
  209. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  210. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  211. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  213. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
  214. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  215. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  216. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  217. package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
  218. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  221. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  222. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  224. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
  225. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
  226. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
  227. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
  228. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
  229. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
  230. package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
  231. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
  232. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
  233. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
  234. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
  235. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
  236. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
  237. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  238. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
  239. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  240. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  241. package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
  242. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
  243. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  244. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  245. package/src/runtime/browser-bridge/client.mjs +73 -8
  246. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  247. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  248. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  249. package/src/runtime/channels/lib/config.mjs +6 -61
  250. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  251. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  252. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  253. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  254. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  255. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  256. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  257. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  258. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  259. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  260. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  261. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  262. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  263. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  264. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  265. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  266. package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
  267. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  268. package/src/runtime/channels/lib/whisper-port.mjs +10 -1
  269. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  270. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  271. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  272. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  273. package/src/runtime/computer-bridge/actions.mjs +9 -1
  274. package/src/runtime/computer-bridge/client.mjs +180 -8
  275. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  276. package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
  277. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
  278. package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
  279. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  280. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  281. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  282. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  283. package/src/runtime/connectors/google-mcp.mjs +10 -12
  284. package/src/runtime/local-provider/server-process.mjs +2 -1
  285. package/src/runtime/media/adapters/gemini-video.mjs +4 -1
  286. package/src/runtime/media/adapters/xai-media.mjs +2 -1
  287. package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
  288. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
  289. package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
  290. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  291. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  292. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  293. package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
  294. package/src/runtime/office/design/design-art-direction.mjs +29 -27
  295. package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
  296. package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
  297. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
  298. package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
  299. package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
  300. package/src/runtime/office/quality/design-review.mjs +1 -5
  301. package/src/runtime/office/quality/document-brief.mjs +1 -5
  302. package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
  303. package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
  304. package/src/runtime/session-search/session-search-db.mjs +73 -9
  305. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  306. package/src/runtime/shared/abort-race.mjs +89 -0
  307. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  308. package/src/runtime/shared/agent-kind.mjs +4 -3
  309. package/src/runtime/shared/bot-owned-work.mjs +56 -0
  310. package/src/runtime/shared/bounded-download.mjs +8 -3
  311. package/src/runtime/shared/config.mjs +2 -13
  312. package/src/runtime/shared/connector-accounts.mjs +20 -10
  313. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  314. package/src/runtime/shared/connector-catalog.mjs +150 -0
  315. package/src/runtime/shared/connector-triggers.mjs +22 -19
  316. package/src/runtime/shared/defaults-separation.mjs +2 -17
  317. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  318. package/src/runtime/shared/err-text.mjs +24 -15
  319. package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
  320. package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
  321. package/src/runtime/shared/file-permissions.d.mts +0 -8
  322. package/src/runtime/shared/file-permissions.mjs +0 -11
  323. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  324. package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
  325. package/src/runtime/shared/handoff-artifacts.mjs +18 -8
  326. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  327. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  328. package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
  329. package/src/runtime/shared/llm/cost.mjs +5 -1
  330. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  331. package/src/runtime/shared/loopback-listener.mjs +25 -2
  332. package/src/runtime/shared/mixy-presence.mjs +22 -0
  333. package/src/runtime/shared/model-route-chain.d.mts +7 -2
  334. package/src/runtime/shared/model-route-chain.mjs +22 -4
  335. package/src/runtime/shared/open-url.mjs +10 -0
  336. package/src/runtime/shared/orchestration.d.mts +2 -0
  337. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  338. package/src/runtime/shared/profile-config.cjs +1 -1
  339. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  340. package/src/runtime/shared/prompt-origin.mjs +21 -0
  341. package/src/runtime/shared/provider-accounts.mjs +7 -1
  342. package/src/runtime/shared/provider-display-name.mjs +29 -0
  343. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  344. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  345. package/src/runtime/shared/routine-trigger.mjs +10 -0
  346. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  347. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  348. package/src/runtime/shared/session-activity-signal.mjs +48 -1
  349. package/src/runtime/shared/session-scratch.mjs +37 -0
  350. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  351. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  352. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  353. package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
  354. package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
  355. package/src/runtime/shared/tool-result-summary.mjs +2 -15
  356. package/src/runtime/shared/tool-surface.mjs +3 -0
  357. package/src/runtime/shared/tool-work-units.mjs +2 -0
  358. package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
  359. package/src/runtime/shared/worktrees/contract.mjs +4 -1
  360. package/src/runtime/shared/worktrees/git.mjs +15 -0
  361. package/src/runtime/shared/worktrees/manager.mjs +87 -38
  362. package/src/runtime/shared/worktrees/test-support.mjs +14 -13
  363. package/src/runtime/terminal-bridge/client.mjs +10 -1
  364. package/src/runtime/visualize-bridge/client.mjs +29 -8
  365. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  366. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  367. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  368. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  369. package/src/session-runtime/agent-home-delivery.mjs +489 -185
  370. package/src/session-runtime/agent-task-sessions.mjs +467 -229
  371. package/src/session-runtime/agent-tool-routing.mjs +8 -41
  372. package/src/session-runtime/boot/apis.mjs +9 -0
  373. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  374. package/src/session-runtime/boot/providers.mjs +3 -0
  375. package/src/session-runtime/boot/tools.mjs +11 -2
  376. package/src/session-runtime/bot-status.mjs +12 -6
  377. package/src/session-runtime/bot-target.mjs +38 -0
  378. package/src/session-runtime/channel-config-api.mjs +6 -1
  379. package/src/session-runtime/config-lifecycle.mjs +6 -0
  380. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  381. package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
  382. package/src/session-runtime/conversation-import/discovery.mjs +271 -25
  383. package/src/session-runtime/conversation-import/service.mjs +26 -5
  384. package/src/session-runtime/handoff-attachments.mjs +82 -31
  385. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
  386. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
  387. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
  388. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
  389. package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
  390. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  391. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  392. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  393. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  394. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  395. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  396. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  397. package/src/session-runtime/model-route/set-route.mjs +11 -2
  398. package/src/session-runtime/notification-bus.mjs +31 -117
  399. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  400. package/src/session-runtime/notification-listeners.mjs +76 -0
  401. package/src/session-runtime/owned-automation-run.mjs +2 -1
  402. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  403. package/src/session-runtime/provider-catalog-cache.mjs +82 -36
  404. package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
  405. package/src/session-runtime/provider-models.mjs +4 -2
  406. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  407. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  408. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  409. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  410. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  411. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  412. package/src/session-runtime/resource-recall-api.mjs +6 -1
  413. package/src/session-runtime/routine-owner.mjs +40 -9
  414. package/src/session-runtime/runtime-feature-gates.mjs +5 -1
  415. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  416. package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
  417. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
  418. package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
  419. package/src/session-runtime/services/agent-tool/render.mjs +71 -17
  420. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
  421. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  422. package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
  423. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  424. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  425. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  426. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  427. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  428. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  429. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  430. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  431. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  432. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  433. package/src/session-runtime/services/channel-admin.mjs +7 -13
  434. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  435. package/src/session-runtime/services/provider-admin.mjs +2 -1
  436. package/src/session-runtime/services/seeds.mjs +0 -28
  437. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  438. package/src/session-runtime/session-create/session-options.mjs +1 -0
  439. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  440. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  441. package/src/session-runtime/settings-system-api.mjs +13 -1
  442. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  443. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  444. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  445. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  446. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  447. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  448. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  449. package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
  450. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  451. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
  452. package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
  453. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
  454. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  455. package/src/session-runtime/workspace/transitions.mjs +25 -0
  456. package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
  457. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  458. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  459. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  460. package/src/standalone/channel-transport.mjs +1 -1
  461. package/src/standalone/daemon-channels-loader.mjs +10 -8
  462. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  463. package/src/standalone/daemon-session-control/request.mjs +51 -0
  464. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  465. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  466. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  467. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  468. package/src/standalone/daemon-session-control.mjs +142 -190
  469. package/src/standalone/daemon.mjs +26 -3
  470. package/src/standalone/session-client.mjs +7 -3
  471. package/src/standalone/session-protocol.mjs +5 -0
  472. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  473. package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
  474. package/src/standalone/session-service/quota-resume.mjs +3 -0
  475. package/src/standalone/session-service/retention/busy.mjs +65 -1
  476. package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
  477. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  478. package/src/standalone/session-tool-output.mjs +15 -7
  479. package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
  480. package/src/tui/app/app-view/floating-panel.jsx +7 -4
  481. package/src/tui/app/model-options.mjs +3 -28
  482. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
  483. package/src/tui/app/model-picker/route-selection.mjs +5 -6
  484. package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
  485. package/src/tui/app/provider-setup/provider-items.mjs +8 -2
  486. package/src/tui/app/provider-setup-picker.mjs +9 -5
  487. package/src/tui/components/QuestionPanel.jsx +13 -4
  488. package/src/tui/dist/index.mjs +133 -92
  489. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  490. package/src/tui/session/initial-state.mjs +3 -0
  491. package/src/tui/session/notice-surface.mjs +7 -1
  492. package/src/tui/session/queue-helpers.mjs +3 -42
  493. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  494. package/src/tui/session/session-api/routes-write.mjs +5 -1
  495. package/src/tui/session/session-api/routes.mjs +1 -0
  496. package/src/tui/session/session-api/settings.mjs +17 -1
  497. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  498. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  499. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  500. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  501. package/src/tui/session/session-flow/drain.mjs +118 -149
  502. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  503. package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
  504. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  505. package/src/tui/session/tool-approval-request.mjs +39 -0
  506. package/src/tui/session/tool-approval-settle.mjs +62 -0
  507. package/src/tui/session/tool-approval.mjs +69 -115
  508. package/src/tui/session/tui-steering-persist.mjs +8 -1
  509. package/src/tui/session/turn-stream.mjs +19 -2
  510. package/src/tui/session/turn.mjs +1 -0
  511. package/src/ui/statusline-agents.mjs +1 -3
  512. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  513. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  514. package/scripts/code-graph-description-contract.mjs +0 -188
  515. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -1,24 +1,6 @@
1
- import { loadConfig, createProvider } from '../config.mjs';
1
+ import { loadConfig } from '../config.mjs';
2
2
 
3
- function describeProviderChange(previous, next) {
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().nonInteractive ?? [], getConfig().interactive ?? [], {
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
- const previousProvider = getProvider();
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
- // Tear down the provider THIS start connected plus the owner-side adverts it
6
- // claimed. Every step is best-effort so a half-open gateway cannot block it.
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
- // Explicit restore path for an already-connected owner. Reserved for
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: it covers both the pre-connected window (stop could
81
- // not disconnect an in-flight provider) and the post-connected one.
82
- async function bailIfStopRequested(startingProvider) {
34
+ // stop's own teardown.
35
+ function bailIfStopRequested() {
83
36
  if (!state.stopRequested) return false;
84
- await releaseStartingProvider(startingProvider, instanceId);
37
+ releaseOwnerAdverts(instanceId);
85
38
  setBridgeRuntimeConnected(false);
86
39
  state.stopRequested = false;
87
40
  return true;
88
41
  }
89
- // Reconnect after a degraded (automation-only) start must not double-arm
90
- // the scheduler/snapshot timers; the webhook/event sync is idempotent.
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
- // DEGRADED MODE: a messaging connect failure — packaged runtime without
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-connected -> connected transition, so this fires
125
- // exactly once per connect across every start path (boot + reload restart
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 (await bailIfStopRequested(startingProvider)) return;
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(options = {}) {
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
- const settleInFlightStart = openInFlightStart(state);
143
- // Capture the provider THIS start connects: a reload hot-swap can replace
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
- await connectAndArm(startingProvider);
159
- } catch (e) {
160
- process.stderr.write(
161
- `mixdog: provider connect failed (non-fatal, cycle1/MCP still up): ${e instanceof Error ? e.message : String(e)}\n`
162
- );
163
- // Roll back the owner-side state advertised before connect() ran; a
164
- // post-connect step may have thrown while the gateway is live.
165
- await releaseStartingProvider(startingProvider, instanceId);
166
- await degradeToAutomation();
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
- settleInFlightStart();
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
- // awaiting connect(); a stop landing in that window (starting=true,
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 right after its connect() resolves;
37
- // otherwise it would re-mark connected and re-launch scheduler/webhook
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
- try {
53
- if (wasConnected) await disconnectConnectedProvider();
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
- // Resolves when the current startOwnedRuntime() run fully settles, so a
12
- // reload can wait before issuing a restart (lost-restart race).
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: provider connect/disconnect, automation runtime
2
- // (scheduler + webhook/event runtime), ownership refresh and config
3
- // hot-reload. The phases live under owned-runtime/ and share one explicit
4
- // state object; config / provider / bridgeRuntimeConnected / webhookServer /
5
- // eventPipeline stay on the worker (get/set) so file-level reference
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 { refreshBridgeOwnership, refreshBridgeOwnershipSafe } = createOwnershipRefresh({
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 Discord
32
- // interaction.type number) can't fail zod and silently drop the notify.
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. The former
85
- // ui_heartbeat_at staleness branch was removed: its false-stale eviction was
86
- // the Discord-flapping root cause.
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 Discord approval builds.
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);