mixdog 1.3.5 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/daemon-stub.mjs +1 -1
  5. package/scripts/gate-local.mjs +4 -2
  6. package/scripts/native-release-status.mjs +2 -2
  7. package/scripts/recall-history-cases.json +1 -1
  8. package/scripts/suite-health.mjs +10 -1
  9. package/scripts/test.mjs +7 -11
  10. package/src/agents/reviewer/AGENT.md +7 -11
  11. package/src/agents/reviewer/agent.json +1 -1
  12. package/src/defaults/shipped-history.json +17 -1
  13. package/src/defaults/skills/browser-use/SKILL.md +59 -11
  14. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  15. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  16. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  17. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  18. package/src/defaults/skills/computer-use/SKILL.md +33 -9
  19. package/src/defaults/skills/setup/SKILL.md +22 -0
  20. package/src/defaults/skills/setup/references/actions.md +39 -5
  21. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  22. package/src/defaults/skills/visualize/SKILL.md +2 -1
  23. package/src/lib/rules-builder.cjs +10 -8
  24. package/src/rules/agent/AGENT.md +6 -6
  25. package/src/rules/lead/LEAD.md +18 -20
  26. package/src/rules/shared/05-tool-calls.md +5 -6
  27. package/src/rules/shared/10-tool-workflow.md +2 -0
  28. package/src/rules/shared/60-verification.md +7 -5
  29. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  30. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  31. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  32. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
  36. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  37. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  38. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  39. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +181 -133
  40. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  41. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  42. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +145 -66
  46. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
  48. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  49. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  50. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  51. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  52. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -13
  53. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  54. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  55. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  56. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  57. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  58. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  59. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  60. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  61. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  62. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  64. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  65. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  66. package/src/runtime/agent/orchestrator/providers/registry.mjs +26 -0
  67. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  68. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  69. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
  70. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  71. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  72. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  73. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  75. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  76. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
  77. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +133 -22
  78. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  79. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  80. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  81. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  82. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  83. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  84. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
  86. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
  87. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  88. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
  90. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -2
  91. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  92. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +3 -2
  93. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  94. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  95. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
  96. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  97. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  98. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  99. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  100. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  101. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  102. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  103. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
  104. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  105. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  106. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
  107. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
  108. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  109. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
  110. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  111. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
  112. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  113. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
  114. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
  115. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  116. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
  117. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  118. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  120. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  121. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  122. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  123. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  124. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  125. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  126. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  127. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  128. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
  129. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
  130. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
  131. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  132. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  133. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  134. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  135. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +18 -1
  136. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  137. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  138. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  141. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  142. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  143. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  144. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +25 -5
  145. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
  146. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  147. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  148. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  149. package/src/runtime/browser-bridge/client.mjs +73 -8
  150. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  151. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  152. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  153. package/src/runtime/channels/lib/config.mjs +6 -61
  154. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  155. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  156. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  157. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  158. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  159. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  160. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  161. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  162. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  163. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  164. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  165. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  166. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  167. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  168. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  169. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  170. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  171. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  172. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  173. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  174. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  175. package/src/runtime/computer-bridge/actions.mjs +9 -1
  176. package/src/runtime/computer-bridge/client.mjs +180 -8
  177. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  178. package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
  179. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  180. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  181. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  182. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  183. package/src/runtime/connectors/google-mcp.mjs +10 -12
  184. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  185. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  186. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  187. package/src/runtime/session-search/session-search-db.mjs +73 -9
  188. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  189. package/src/runtime/shared/abort-race.mjs +89 -0
  190. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  191. package/src/runtime/shared/agent-kind.mjs +4 -3
  192. package/src/runtime/shared/bounded-download.mjs +8 -3
  193. package/src/runtime/shared/config.mjs +2 -13
  194. package/src/runtime/shared/connector-accounts.mjs +20 -10
  195. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  196. package/src/runtime/shared/connector-catalog.mjs +150 -0
  197. package/src/runtime/shared/connector-triggers.mjs +22 -19
  198. package/src/runtime/shared/defaults-separation.mjs +2 -14
  199. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  200. package/src/runtime/shared/err-text.mjs +24 -15
  201. package/src/runtime/shared/file-permissions.d.mts +0 -8
  202. package/src/runtime/shared/file-permissions.mjs +0 -11
  203. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  204. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  205. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  206. package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
  207. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  208. package/src/runtime/shared/mixy-presence.mjs +22 -0
  209. package/src/runtime/shared/orchestration.d.mts +2 -0
  210. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  211. package/src/runtime/shared/profile-config.cjs +1 -1
  212. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  213. package/src/runtime/shared/prompt-origin.mjs +21 -0
  214. package/src/runtime/shared/provider-accounts.mjs +7 -1
  215. package/src/runtime/shared/provider-display-name.mjs +29 -0
  216. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  217. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  218. package/src/runtime/shared/routine-trigger.mjs +10 -0
  219. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  220. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  221. package/src/runtime/shared/session-activity-signal.mjs +34 -1
  222. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  223. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  224. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  225. package/src/runtime/shared/tool-result-summary.mjs +1 -14
  226. package/src/runtime/shared/worktrees/test-support.mjs +9 -4
  227. package/src/runtime/terminal-bridge/client.mjs +10 -1
  228. package/src/runtime/visualize-bridge/client.mjs +27 -8
  229. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  230. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  231. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  232. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  233. package/src/session-runtime/agent-home-delivery.mjs +448 -185
  234. package/src/session-runtime/agent-task-sessions.mjs +329 -180
  235. package/src/session-runtime/boot/apis.mjs +9 -0
  236. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  237. package/src/session-runtime/boot/providers.mjs +3 -0
  238. package/src/session-runtime/boot/tools.mjs +6 -1
  239. package/src/session-runtime/config-lifecycle.mjs +6 -0
  240. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  241. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
  242. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
  243. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  244. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
  245. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  246. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  247. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  248. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  249. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  250. package/src/session-runtime/notification-bus.mjs +31 -117
  251. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  252. package/src/session-runtime/notification-listeners.mjs +76 -0
  253. package/src/session-runtime/owned-automation-run.mjs +2 -1
  254. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  255. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  256. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  257. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  258. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  259. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  260. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  261. package/src/session-runtime/routine-owner.mjs +40 -9
  262. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  263. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
  264. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  265. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  266. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  267. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  268. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  269. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  270. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  271. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  272. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  273. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  274. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  275. package/src/session-runtime/services/channel-admin.mjs +7 -13
  276. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  277. package/src/session-runtime/services/seeds.mjs +0 -28
  278. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  279. package/src/session-runtime/session-create/session-options.mjs +1 -0
  280. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  281. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  282. package/src/session-runtime/settings-system-api.mjs +13 -1
  283. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  284. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  285. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  286. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  287. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  288. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  289. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  290. package/src/session-runtime/tool-policy/policy-stage.mjs +16 -2
  291. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  292. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  293. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  294. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  295. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  296. package/src/standalone/channel-transport.mjs +1 -1
  297. package/src/standalone/daemon-channels-loader.mjs +10 -8
  298. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  299. package/src/standalone/daemon-session-control/request.mjs +51 -0
  300. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  301. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  302. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  303. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  304. package/src/standalone/daemon-session-control.mjs +124 -188
  305. package/src/standalone/daemon.mjs +26 -3
  306. package/src/standalone/session-client.mjs +7 -3
  307. package/src/standalone/session-protocol.mjs +5 -0
  308. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  309. package/src/standalone/session-service/quota-resume.mjs +3 -0
  310. package/src/standalone/session-service/retention/busy.mjs +65 -1
  311. package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
  312. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  313. package/src/standalone/session-tool-output.mjs +15 -7
  314. package/src/tui/app/model-options.mjs +3 -28
  315. package/src/tui/dist/index.mjs +58 -64
  316. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  317. package/src/tui/session/initial-state.mjs +3 -0
  318. package/src/tui/session/notice-surface.mjs +7 -1
  319. package/src/tui/session/queue-helpers.mjs +3 -42
  320. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  321. package/src/tui/session/session-api/routes-write.mjs +5 -1
  322. package/src/tui/session/session-api/routes.mjs +1 -0
  323. package/src/tui/session/session-api/settings.mjs +17 -1
  324. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  325. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  326. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  327. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  328. package/src/tui/session/session-flow/drain.mjs +118 -149
  329. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  330. package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
  331. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  332. package/src/tui/session/tool-approval-request.mjs +39 -0
  333. package/src/tui/session/tool-approval-settle.mjs +62 -0
  334. package/src/tui/session/tool-approval.mjs +69 -115
  335. package/src/tui/session/tui-steering-persist.mjs +8 -1
  336. package/src/tui/session/turn-stream.mjs +19 -2
  337. package/src/tui/session/turn.mjs +1 -0
  338. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  339. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  340. package/scripts/code-graph-description-contract.mjs +0 -188
  341. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -3,27 +3,17 @@
3
3
  // pending queue so the model sees it next turn. The delivered registry keeps
4
4
  // those two paths from double-injecting the same completion.
5
5
  import { modelVisibleToolCompletionMessage } from '../runtime/shared/tool-execution-contract.mjs';
6
- import {
7
- PENDING_MODE_TASK_NOTIFICATION,
8
- markCompletionEntry,
9
- } from '../runtime/agent/orchestrator/session/manager/pending-messages.mjs';
10
- import {
11
- isDeliveredCompletion,
12
- logDuplicateSkip,
13
- recordDeliveredCompletion,
14
- } from '../runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
6
+ import { PENDING_MODE_TASK_NOTIFICATION } from '../runtime/agent/orchestrator/session/manager/pending-messages.mjs';
7
+ import { recordDeliveredCompletion } from '../runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
15
8
  import { shouldMirrorCompletionToPendingQueue } from './runtime-tool-routing.mjs';
16
9
  import { notifyTrace } from '../runtime/shared/notify-trace.mjs';
10
+ import { cleanSessionId, createListenerBindings, sessionListenersOf } from './notification-listeners.mjs';
11
+ import { createCompletionQueue } from './notification-completion-queue.mjs';
17
12
 
18
- const sessionNotificationListeners = new Map();
19
13
  // A completion that waits this long between enqueue and wake is reported: the
20
14
  // queue is durable, so the delay is a scheduling symptom, not a lost message.
21
15
  const WAKE_DELAY_REPORT_MS = 1_000;
22
16
 
23
- function cleanSessionId(value) {
24
- return String(value || '').trim();
25
- }
26
-
27
17
  // A queued completion only reaches the model on the next turn, so a session
28
18
  // with no user input pending is woken with an empty turn. One wake per session
29
19
  // runs at a time, and a completion suppressed by that in-flight wake is
@@ -63,7 +53,9 @@ export function createCompletionWakeScheduler({ getCurrentSessionId, getTurnApi,
63
53
  if (typeof beforeWake === 'function') {
64
54
  try {
65
55
  await beforeWake(ownerSessionId);
66
- } catch {}
56
+ } catch {
57
+ // The pre-wake hook is best-effort; the wake proceeds without it.
58
+ }
67
59
  if (cleanSessionId(getCurrentSessionId()) !== ownerSessionId || !ownerOpen(ownerSessionId)) return;
68
60
  }
69
61
  // The wake continues the user turn that launched the worker, so its
@@ -102,10 +94,15 @@ export function createCompletionWakeScheduler({ getCurrentSessionId, getTurnApi,
102
94
  };
103
95
  }
104
96
 
105
- function emitToListeners(source, content, meta = {}) {
97
+ function emitToListeners(source, content, meta = {}, origin = null) {
106
98
  const text = String(content || '').trim();
107
99
  if (!text) return { handled: false, modelVisibleDelivered: false };
108
- const event = { content: text, meta: meta && typeof meta === 'object' ? meta : {} };
100
+ const event = {
101
+ content: text,
102
+ meta: meta && typeof meta === 'object' ? meta : {},
103
+ // The notification's provenance apart from its meta (PROMPT_ORIGIN_CHANNEL).
104
+ ...(origin ? { origin } : {}),
105
+ };
109
106
  let handled = false;
110
107
  for (const listener of [...source]) {
111
108
  try {
@@ -118,8 +115,9 @@ function emitToListeners(source, content, meta = {}) {
118
115
  }
119
116
 
120
117
  export function createNotificationBus({ listeners, mgr, onCompletionQueued, getOwnerLifecycle }) {
121
- const boundSessionListeners = new Map();
122
- const queuedCompletionIds = new Map();
118
+ const { subscribeRuntimeNotification, bindRuntimeNotificationSession, clearRuntimeNotifications } =
119
+ createListenerBindings({ listeners });
120
+ const enqueueCompletion = createCompletionQueue({ mgr, onCompletionQueued });
123
121
 
124
122
  // Owner identity + lifecycle generation. A closing/terminal owner (or a
125
123
  // callback captured under an earlier generation) keeps its result for
@@ -137,12 +135,14 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
137
135
  return emitToListeners(listeners, content, meta);
138
136
  }
139
137
 
140
- function notifySession(sessionId, content, meta = {}) {
138
+ // `origin`: the notification's provenance (PROMPT_ORIGIN_CHANNEL for an
139
+ // inbound channel message), carried to the queue beside its mode.
140
+ function notifySession(sessionId, content, meta = {}, { origin = null } = {}) {
141
141
  const targetSessionId = cleanSessionId(sessionId);
142
142
  if (!targetSessionId) return false;
143
- const targetListeners = sessionNotificationListeners.get(targetSessionId) || [];
143
+ const targetListeners = sessionListenersOf(targetSessionId);
144
144
  const open = ownerOpen(targetSessionId);
145
- const { handled } = emitToListeners(targetListeners, content, open ? meta : closedMeta(meta));
145
+ const { handled } = emitToListeners(targetListeners, content, open ? meta : closedMeta(meta), origin);
146
146
  if (handled) return true;
147
147
  if (!open) return false;
148
148
  if (typeof mgr.enqueuePendingMessage !== 'function') return false;
@@ -151,7 +151,13 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
151
151
  // is the runtime reporting, exactly as an attached TUI queues it: a
152
152
  // task notification, so text inside it — fenced external webhook values
153
153
  // included — never drives explicit skill selection.
154
- return mgr.enqueuePendingMessage(targetSessionId, { content, mode: PENDING_MODE_TASK_NOTIFICATION }) > 0;
154
+ return (
155
+ mgr.enqueuePendingMessage(targetSessionId, {
156
+ content,
157
+ mode: PENDING_MODE_TASK_NOTIFICATION,
158
+ ...(origin ? { origin } : {}),
159
+ }) > 0
160
+ );
155
161
  } catch {
156
162
  return false;
157
163
  }
@@ -164,50 +170,14 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
164
170
  function notifySessionUi(sessionId, content, meta = {}) {
165
171
  const targetSessionId = cleanSessionId(sessionId);
166
172
  if (!targetSessionId) return false;
167
- const targetListeners = sessionNotificationListeners.get(targetSessionId) || [];
173
+ const targetListeners = sessionListenersOf(targetSessionId);
168
174
  return emitToListeners(targetListeners, content, meta).handled;
169
175
  }
170
176
 
171
- // Enqueue the model-visible twin unless it was already delivered; returns
172
- // true when the caller may treat the completion as delivered.
173
- function enqueueCompletion(callerSessionId, text, meta, path) {
174
- const visible = modelVisibleToolCompletionMessage(text, meta);
175
- // Non-completion notifications yield '' here and are never queued.
176
- if (!visible) return false;
177
- if (isDeliveredCompletion({ executionId: meta?.execution_id, text: visible })) {
178
- // Delivered + ACKed on the TUI path: suppress the duplicate but report
179
- // DELIVERED so the caller stops retrying.
180
- logDuplicateSkip(path, { executionId: meta?.execution_id, text: visible });
181
- return true;
182
- }
183
- const entry = markCompletionEntry(visible, { executionId: meta?.execution_id, meta });
184
- const queueKey = `${callerSessionId}:${entry.id}`;
185
- if (queuedCompletionIds.has(queueKey)) {
186
- logDuplicateSkip(`${path}-queued`, { executionId: meta?.execution_id, text: visible });
187
- return true;
188
- }
189
- const enqueued = mgr.enqueuePendingMessage(callerSessionId, entry) > 0;
190
- if (!enqueued) return false;
191
- queuedCompletionIds.set(queueKey, Date.now());
192
- while (queuedCompletionIds.size > 512) queuedCompletionIds.delete(queuedCompletionIds.keys().next().value);
193
- if (typeof onCompletionQueued === 'function') {
194
- try {
195
- onCompletionQueued({
196
- sessionId: callerSessionId,
197
- executionId: meta?.execution_id || null,
198
- enqueuedAt: entry.enqueuedAt,
199
- });
200
- } catch {
201
- /* wake-up is best-effort; the durable queue remains authoritative */
202
- }
203
- }
204
- return true;
205
- }
206
-
207
177
  function notifySessionCompletion(sessionId, text, meta = {}, capturedGeneration = undefined) {
208
178
  const targetSessionId = cleanSessionId(sessionId);
209
179
  if (!targetSessionId) return false;
210
- const targetListeners = sessionNotificationListeners.get(targetSessionId) || [];
180
+ const targetListeners = sessionListenersOf(targetSessionId);
211
181
  const open = ownerOpen(targetSessionId, capturedGeneration);
212
182
  const ownerMeta = {
213
183
  ...(meta && typeof meta === 'object' ? meta : {}),
@@ -262,62 +232,6 @@ export function createNotificationBus({ listeners, mgr, onCompletionQueued, getO
262
232
  return (text, meta = {}) => notifySessionCompletion(ownerSessionId, text, meta, generation);
263
233
  }
264
234
 
265
- function bindListenerToSession(sessionId, listener) {
266
- const ownerSessionId = cleanSessionId(sessionId);
267
- if (!ownerSessionId || typeof listener !== 'function') return;
268
- let bucket = sessionNotificationListeners.get(ownerSessionId);
269
- if (!bucket) {
270
- bucket = new Set();
271
- sessionNotificationListeners.set(ownerSessionId, bucket);
272
- }
273
- bucket.add(listener);
274
- let ownedBucket = boundSessionListeners.get(ownerSessionId);
275
- if (!ownedBucket) {
276
- ownedBucket = new Set();
277
- boundSessionListeners.set(ownerSessionId, ownedBucket);
278
- }
279
- ownedBucket.add(listener);
280
- }
281
-
282
- function unbindListener(listener) {
283
- for (const [sessionId, ownedBucket] of boundSessionListeners) {
284
- if (!ownedBucket.delete(listener)) continue;
285
- const bucket = sessionNotificationListeners.get(sessionId);
286
- bucket?.delete(listener);
287
- if (bucket?.size === 0) sessionNotificationListeners.delete(sessionId);
288
- if (ownedBucket.size === 0) boundSessionListeners.delete(sessionId);
289
- }
290
- }
291
-
292
- function subscribeRuntimeNotification(sessionId, listener) {
293
- const ownerSessionId = cleanSessionId(sessionId);
294
- if (typeof listener !== 'function') return () => {};
295
- listeners.add(listener);
296
- bindListenerToSession(ownerSessionId, listener);
297
- return () => {
298
- listeners.delete(listener);
299
- unbindListener(listener);
300
- };
301
- }
302
-
303
- function bindRuntimeNotificationSession(sessionId) {
304
- const ownerSessionId = cleanSessionId(sessionId);
305
- if (!ownerSessionId) return false;
306
- for (const listener of listeners) bindListenerToSession(ownerSessionId, listener);
307
- return true;
308
- }
309
-
310
- function clearRuntimeNotifications() {
311
- for (const [sessionId, ownedBucket] of boundSessionListeners) {
312
- const bucket = sessionNotificationListeners.get(sessionId);
313
- if (!bucket) continue;
314
- for (const listener of ownedBucket) bucket.delete(listener);
315
- if (bucket.size === 0) sessionNotificationListeners.delete(sessionId);
316
- }
317
- boundSessionListeners.clear();
318
- listeners.clear();
319
- }
320
-
321
235
  return {
322
236
  emitRuntimeNotification,
323
237
  notifySession,
@@ -0,0 +1,54 @@
1
+ // The model-visible queue path of a terminal tool completion
2
+ // (notification-bus.mjs): enqueue its twin once, skipping a completion the TUI
3
+ // path already delivered or this bus already queued.
4
+ import { modelVisibleToolCompletionMessage } from '../runtime/shared/tool-execution-contract.mjs';
5
+ import { markCompletionEntry } from '../runtime/agent/orchestrator/session/manager/pending-messages.mjs';
6
+ import {
7
+ isDeliveredCompletion,
8
+ logDuplicateSkip,
9
+ } from '../runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
10
+
11
+ // Bounded memory of `${session}:${entry id}` keys this bus queued.
12
+ const QUEUED_COMPLETION_IDS_MAX = 512;
13
+
14
+ export function createCompletionQueue({ mgr, onCompletionQueued }) {
15
+ const queuedCompletionIds = new Map();
16
+
17
+ // Enqueue the model-visible twin unless it was already delivered; returns
18
+ // true when the caller may treat the completion as delivered.
19
+ return function enqueueCompletion(callerSessionId, text, meta, path) {
20
+ const visible = modelVisibleToolCompletionMessage(text, meta);
21
+ // Non-completion notifications yield '' here and are never queued.
22
+ if (!visible) return false;
23
+ if (isDeliveredCompletion({ executionId: meta?.execution_id, text: visible })) {
24
+ // Delivered + ACKed on the TUI path: suppress the duplicate but report
25
+ // DELIVERED so the caller stops retrying.
26
+ logDuplicateSkip(path, { executionId: meta?.execution_id, text: visible });
27
+ return true;
28
+ }
29
+ const entry = markCompletionEntry(visible, { executionId: meta?.execution_id, meta });
30
+ const queueKey = `${callerSessionId}:${entry.id}`;
31
+ if (queuedCompletionIds.has(queueKey)) {
32
+ logDuplicateSkip(`${path}-queued`, { executionId: meta?.execution_id, text: visible });
33
+ return true;
34
+ }
35
+ const enqueued = mgr.enqueuePendingMessage(callerSessionId, entry) > 0;
36
+ if (!enqueued) return false;
37
+ queuedCompletionIds.set(queueKey, Date.now());
38
+ while (queuedCompletionIds.size > QUEUED_COMPLETION_IDS_MAX) {
39
+ queuedCompletionIds.delete(queuedCompletionIds.keys().next().value);
40
+ }
41
+ if (typeof onCompletionQueued === 'function') {
42
+ try {
43
+ onCompletionQueued({
44
+ sessionId: callerSessionId,
45
+ executionId: meta?.execution_id || null,
46
+ enqueuedAt: entry.enqueuedAt,
47
+ });
48
+ } catch {
49
+ /* wake-up is best-effort; the durable queue remains authoritative */
50
+ }
51
+ }
52
+ return true;
53
+ };
54
+ }
@@ -0,0 +1,76 @@
1
+ // Session-bound runtime notification listeners (notification-bus.mjs). The
2
+ // per-session listener sets are process-wide; each bus owns which of its
3
+ // listeners it bound to which session, and unbinds only those.
4
+
5
+ const sessionNotificationListeners = new Map();
6
+
7
+ export function cleanSessionId(value) {
8
+ return String(value || '').trim();
9
+ }
10
+
11
+ /** The listeners bound to one session (an empty array when none). */
12
+ export function sessionListenersOf(sessionId) {
13
+ return sessionNotificationListeners.get(sessionId) || [];
14
+ }
15
+
16
+ export function createListenerBindings({ listeners }) {
17
+ const boundSessionListeners = new Map();
18
+
19
+ function bindListenerToSession(sessionId, listener) {
20
+ const ownerSessionId = cleanSessionId(sessionId);
21
+ if (!ownerSessionId || typeof listener !== 'function') return;
22
+ let bucket = sessionNotificationListeners.get(ownerSessionId);
23
+ if (!bucket) {
24
+ bucket = new Set();
25
+ sessionNotificationListeners.set(ownerSessionId, bucket);
26
+ }
27
+ bucket.add(listener);
28
+ let ownedBucket = boundSessionListeners.get(ownerSessionId);
29
+ if (!ownedBucket) {
30
+ ownedBucket = new Set();
31
+ boundSessionListeners.set(ownerSessionId, ownedBucket);
32
+ }
33
+ ownedBucket.add(listener);
34
+ }
35
+
36
+ function unbindListener(listener) {
37
+ for (const [sessionId, ownedBucket] of boundSessionListeners) {
38
+ if (!ownedBucket.delete(listener)) continue;
39
+ const bucket = sessionNotificationListeners.get(sessionId);
40
+ bucket?.delete(listener);
41
+ if (bucket?.size === 0) sessionNotificationListeners.delete(sessionId);
42
+ if (ownedBucket.size === 0) boundSessionListeners.delete(sessionId);
43
+ }
44
+ }
45
+
46
+ function subscribeRuntimeNotification(sessionId, listener) {
47
+ const ownerSessionId = cleanSessionId(sessionId);
48
+ if (typeof listener !== 'function') return () => {};
49
+ listeners.add(listener);
50
+ bindListenerToSession(ownerSessionId, listener);
51
+ return () => {
52
+ listeners.delete(listener);
53
+ unbindListener(listener);
54
+ };
55
+ }
56
+
57
+ function bindRuntimeNotificationSession(sessionId) {
58
+ const ownerSessionId = cleanSessionId(sessionId);
59
+ if (!ownerSessionId) return false;
60
+ for (const listener of listeners) bindListenerToSession(ownerSessionId, listener);
61
+ return true;
62
+ }
63
+
64
+ function clearRuntimeNotifications() {
65
+ for (const [sessionId, ownedBucket] of boundSessionListeners) {
66
+ const bucket = sessionNotificationListeners.get(sessionId);
67
+ if (!bucket) continue;
68
+ for (const listener of ownedBucket) bucket.delete(listener);
69
+ if (bucket.size === 0) sessionNotificationListeners.delete(sessionId);
70
+ }
71
+ boundSessionListeners.clear();
72
+ listeners.clear();
73
+ }
74
+
75
+ return { subscribeRuntimeNotification, bindRuntimeNotificationSession, clearRuntimeNotifications };
76
+ }
@@ -131,7 +131,8 @@ export async function runOwnedAutomation(kind, row, run, deps = {}) {
131
131
  reserved = false,
132
132
  signal = null,
133
133
  now = Date.now,
134
- ownerProblem = routineOwnerProblem,
134
+ // `row` is stored: for Mixy, itself evidence of her (routine-owner.mjs).
135
+ ownerProblem = (ownerAgentId) => routineOwnerProblem(ownerAgentId, null, { stored: true }),
135
136
  log = defaultLog,
136
137
  } = deps;
137
138
  const name = row.name;
@@ -39,9 +39,7 @@ export function createChannelStart({
39
39
  async function onChannelStartTimer() {
40
40
  timers.channelStartTimer = null;
41
41
  if (isCloseRequested()) return;
42
- // Channels-module and remote toggles gate MESSAGING; automation
43
- // (enabled schedules/webhooks) keeps the worker boot alive — its
44
- // channel worker runs headless: only active automation boots it.
42
+ // Only active automation (enabled schedules/webhooks) boots the worker.
45
43
  const automation = await hasActiveAutomation().catch(() => false);
46
44
  if (!automation) {
47
45
  bootProfile('channels:start-disabled');
@@ -69,10 +67,8 @@ export function createChannelStart({
69
67
  timers.channelStartTimer.unref?.();
70
68
  }
71
69
 
72
- // Boot-time automation autostart. Automation decoupling (user decision):
73
- // enabled schedules/webhooks boot the worker on their own — no messaging
74
- // provider. The worker runs headless (scheduler/webhooks/voice only).
75
- // Unlike scheduleChannelStart this probes once at the boot delay and never
70
+ // Boot-time automation autostart: enabled schedules/webhooks boot the worker
71
+ // on their own (scheduler/webhooks/voice only). Unlike scheduleChannelStart this probes once at the boot delay and never
76
72
  // re-arms. The probe itself is shared process-wide (channel-admin
77
73
  // hasActiveAutomation), so N runtimes booting together check once.
78
74
  function scheduleAutomationAutostart(delayMs) {