mixdog 1.2.5 → 1.3.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 (493) hide show
  1. package/LICENSES/simple-icons-CC0-1.0.txt +30 -0
  2. package/NOTICE.md +19 -0
  3. package/package.json +4 -1
  4. package/scripts/check-model-recommendations.mjs +89 -0
  5. package/scripts/gate-local.mjs +7 -0
  6. package/scripts/lib/gate-scheduler.mjs +2 -2
  7. package/scripts/lib/isolated-test-env.mjs +16 -0
  8. package/scripts/lib/run-node-tests.mjs +5 -14
  9. package/scripts/provider-pingpong-live.mjs +9 -9
  10. package/src/agents/advisor/AGENT.md +4 -4
  11. package/src/agents/advisor/agent.json +1 -1
  12. package/src/agents/reviewer/AGENT.md +5 -4
  13. package/src/agents/reviewer/agent.json +1 -1
  14. package/src/defaults/shipped-history.json +17 -0
  15. package/src/defaults/skills/browser-use/SKILL.md +7 -1
  16. package/src/defaults/skills/computer-use/SKILL.md +3 -1
  17. package/src/defaults/skills/memory-management/SKILL.md +4 -1
  18. package/src/defaults/skills/setup/references/actions.md +11 -4
  19. package/src/defaults/skills/setup-guide/SKILL.md +175 -0
  20. package/src/defaults/skills/setup-guide/model-recommendations.json +333 -0
  21. package/src/defaults/skills/visualize/SKILL.md +3 -2
  22. package/src/lib/rules-builder.cjs +56 -7
  23. package/src/output-styles/common.md +22 -6
  24. package/src/output-styles/detailed.md +7 -5
  25. package/src/output-styles/minimal.md +7 -3
  26. package/src/output-styles/simple.md +2 -3
  27. package/src/rules/agent/AGENT.md +7 -1
  28. package/src/rules/agent-mode/AGENT_MODE.md +24 -0
  29. package/src/rules/agent-mode/MIXY.md +21 -0
  30. package/src/rules/agent-mode/ROUTINE.md +6 -0
  31. package/src/rules/lead/LEAD.md +9 -4
  32. package/src/rules/shared/10-tool-workflow.md +2 -1
  33. package/src/rules/shared/60-verification.md +4 -5
  34. package/src/rules/shared/70-delivery.md +3 -0
  35. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -1
  36. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +86 -0
  37. package/src/runtime/agent/orchestrator/config.mjs +6 -0
  38. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +77 -14
  39. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +182 -13
  40. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +5 -3
  41. package/src/runtime/agent/orchestrator/internal-agents.mjs +10 -0
  42. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +215 -0
  43. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +58 -64
  44. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +10 -1
  45. package/src/runtime/agent/orchestrator/mcp/client.mjs +122 -15
  46. package/src/runtime/agent/orchestrator/mcp/oauth-account.mjs +97 -0
  47. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +2 -3
  48. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +49 -0
  49. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +59 -9
  50. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +32 -7
  51. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +45 -6
  52. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +195 -6
  53. package/src/runtime/agent/orchestrator/mcp/server-connectors.mjs +17 -0
  54. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +9 -2
  55. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  56. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +41 -19
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +3 -2
  58. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +4 -1
  59. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +2 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +3 -0
  61. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -1
  62. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +11 -5
  64. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +4 -0
  65. package/src/runtime/agent/orchestrator/providers/catalog-deadline.mjs +163 -0
  66. package/src/runtime/agent/orchestrator/providers/catalog-failures.mjs +34 -0
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +38 -14
  69. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +100 -26
  70. package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +24 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -0
  72. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +2 -1
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +4 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  76. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
  77. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +49 -4
  78. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +0 -7
  79. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +7 -1
  80. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  81. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +2 -0
  82. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  83. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +17 -12
  84. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +5 -1
  85. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +11 -2
  86. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +1 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +45 -16
  88. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -0
  89. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +1 -0
  90. package/src/runtime/agent/orchestrator/providers/openai-ws-connect.mjs +196 -0
  91. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +74 -9
  92. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +14 -1
  93. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -0
  94. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-login.mjs +194 -0
  95. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-tokens.mjs +353 -0
  96. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +293 -0
  97. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +33 -100
  98. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +23 -14
  99. package/src/runtime/agent/orchestrator/providers/registry.mjs +41 -27
  100. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +98 -4
  101. package/src/runtime/agent/orchestrator/runtime-core/context-status-shape.mjs +4 -0
  102. package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +6 -4
  103. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +15 -8
  104. package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -0
  105. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +12 -6
  106. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +32 -5
  107. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -4
  108. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +4 -1
  109. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +50 -20
  110. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +2 -0
  111. package/src/runtime/agent/orchestrator/session/agent-home.d.mts +4 -0
  112. package/src/runtime/agent/orchestrator/session/agent-home.mjs +33 -0
  113. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +62 -0
  114. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +15 -3
  115. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +31 -0
  116. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +241 -0
  117. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +162 -0
  118. package/src/runtime/agent/orchestrator/session/agent-room.mjs +641 -0
  119. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +7 -1
  120. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +74 -13
  121. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +102 -0
  122. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +8 -2
  123. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +16 -0
  124. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +2 -0
  125. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +6 -2
  126. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +165 -0
  127. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +95 -0
  128. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +221 -0
  129. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +195 -0
  130. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +167 -0
  131. package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +9 -0
  132. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +3 -1
  133. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +39 -2
  134. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +10 -0
  135. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +16 -1
  136. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +82 -33
  137. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +11 -4
  138. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +5 -4
  139. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +13 -3
  140. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +7 -0
  141. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +1 -0
  142. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +6 -1
  143. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  144. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -0
  145. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +13 -5
  146. package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +0 -8
  147. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +10 -7
  148. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +62 -22
  149. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +44 -16
  150. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -5
  151. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +23 -1
  152. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +81 -34
  153. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +39 -4
  154. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -5
  155. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +55 -8
  156. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -0
  157. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +3 -2
  158. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +6 -0
  159. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +58 -0
  160. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -2
  161. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +24 -0
  162. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +32 -5
  163. package/src/runtime/agent/orchestrator/session/request-fork.mjs +47 -0
  164. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +70 -0
  165. package/src/runtime/agent/orchestrator/session/routine-result.mjs +277 -0
  166. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +16 -1
  167. package/src/runtime/agent/orchestrator/session/side-question.mjs +5 -43
  168. package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +10 -0
  169. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +73 -6
  170. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +40 -0
  171. package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +15 -0
  172. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +12 -0
  173. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +8 -0
  174. package/src/runtime/agent/orchestrator/session/store-agent-worker-header.mjs +36 -0
  175. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +258 -43
  176. package/src/runtime/agent/orchestrator/session/store-record-strict-scan.mjs +325 -0
  177. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +84 -21
  178. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -12
  179. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +46 -0
  180. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +46 -30
  181. package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +0 -4
  182. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +144 -45
  183. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +32 -13
  184. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +364 -38
  185. package/src/runtime/agent/orchestrator/session/store.mjs +9 -2
  186. package/src/runtime/agent/orchestrator/session/task-wait-control.mjs +43 -12
  187. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +23 -6
  188. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +44 -1
  189. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +12 -6
  190. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +13 -7
  191. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/bashism-rewrite.mjs +1 -1
  192. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -1
  193. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +40 -7
  194. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +37 -34
  195. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +1 -1
  196. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +0 -4
  197. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -0
  198. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +29 -27
  199. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +1 -1
  200. package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +28 -11
  201. package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +12 -3
  202. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +203 -101
  203. package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +90 -41
  204. package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +17 -1
  205. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-delivery.mjs +199 -0
  206. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +12 -0
  207. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +165 -39
  208. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +25 -13
  209. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +113 -5
  210. package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +7 -6
  211. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +19 -4
  212. package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +5 -3
  213. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +25 -7
  214. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +2 -1
  215. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +3 -1
  216. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +12 -5
  217. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +61 -22
  218. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +32 -8
  219. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +193 -19
  220. package/src/runtime/agent/orchestrator/tools/builtin/shell-direct-exe.mjs +57 -7
  221. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +123 -32
  222. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +26 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +13 -28
  224. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +90 -11
  225. package/src/runtime/agent/orchestrator/tools/builtin/wait-budgets.mjs +23 -0
  226. package/src/runtime/agent/orchestrator/tools/builtin.mjs +54 -10
  227. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +22 -28
  228. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +11 -7
  229. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +126 -9
  230. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  231. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +15 -6
  232. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +64 -2
  233. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +10 -2
  234. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promotion-results.mjs +13 -3
  235. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +8 -0
  236. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -1
  237. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
  238. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +104 -55
  239. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +7 -2
  240. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +39 -23
  241. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +6 -2
  242. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  243. package/src/runtime/attachments/office-extract.mjs +11 -9
  244. package/src/runtime/browser-bridge/client.mjs +24 -0
  245. package/src/runtime/channels/lib/scheduler.mjs +40 -12
  246. package/src/runtime/channels/lib/schedules-db.mjs +71 -12
  247. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +36 -16
  248. package/src/runtime/channels/lib/webhook.mjs +0 -1
  249. package/src/runtime/channels/lib/webhooks-db.mjs +100 -10
  250. package/src/runtime/channels/lib/worker-main.mjs +17 -20
  251. package/src/runtime/computer-bridge/client.mjs +28 -1
  252. package/src/runtime/connectors/gmail-app-password.mjs +690 -0
  253. package/src/runtime/connectors/google-mcp.mjs +446 -0
  254. package/src/runtime/memory/lib/core-memory-access.mjs +69 -0
  255. package/src/runtime/memory/lib/core-memory-file.mjs +16 -8
  256. package/src/runtime/memory/lib/core-memory-index.mjs +15 -9
  257. package/src/runtime/memory/lib/core-memory-management.mjs +10 -4
  258. package/src/runtime/memory/lib/core-memory-store.mjs +53 -30
  259. package/src/runtime/memory/lib/core-memory-uniqueness.mjs +10 -6
  260. package/src/runtime/memory/lib/embedding-tokenizer.mjs +32 -18
  261. package/src/runtime/memory/lib/http-router/session-routes.mjs +3 -2
  262. package/src/runtime/memory/lib/memory-action-handlers/core-actions.mjs +44 -14
  263. package/src/runtime/memory/lib/memory-schema/core-and-meta.mjs +11 -0
  264. package/src/runtime/memory/lib/memory.mjs +7 -1
  265. package/src/runtime/memory/lib/query-core-recall.mjs +9 -1
  266. package/src/runtime/memory/lib/query-hybrid-search.mjs +2 -0
  267. package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -1
  268. package/src/runtime/memory/lib/tool-call-handler.mjs +9 -5
  269. package/src/runtime/memory/tool-defs.mjs +5 -0
  270. package/src/runtime/office/authoring/pptx-script-normalize.mjs +11 -8
  271. package/src/runtime/office/core/tabular.mjs +1 -1
  272. package/src/runtime/office/design/library/design-template-inspect.mjs +7 -4
  273. package/src/runtime/office/portable/docx-formatting.mjs +1 -1
  274. package/src/runtime/office/portable/docx-runs.mjs +1 -1
  275. package/src/runtime/office/portable/docx-tracked-edits.mjs +2 -2
  276. package/src/runtime/office/portable/portable-docx-edits.mjs +11 -10
  277. package/src/runtime/office/portable/portable-docx-operations.mjs +21 -17
  278. package/src/runtime/office/portable/portable-docx-parts.mjs +15 -9
  279. package/src/runtime/office/portable/portable-docx-styles.mjs +4 -1
  280. package/src/runtime/office/portable/portable-docx-xml.mjs +9 -9
  281. package/src/runtime/office/portable/portable-opc.mjs +27 -13
  282. package/src/runtime/office/portable/portable-pivot.mjs +3 -3
  283. package/src/runtime/office/portable/portable-pptx-chart.mjs +3 -3
  284. package/src/runtime/office/portable/portable-pptx-charts.mjs +24 -18
  285. package/src/runtime/office/portable/portable-pptx-core.mjs +5 -5
  286. package/src/runtime/office/portable/portable-pptx-deck.mjs +8 -4
  287. package/src/runtime/office/portable/portable-pptx-package.mjs +7 -4
  288. package/src/runtime/office/portable/portable-pptx-shapes.mjs +18 -9
  289. package/src/runtime/office/portable/portable-sheet-parts.mjs +9 -3
  290. package/src/runtime/office/portable/portable-sheet-xml.mjs +5 -5
  291. package/src/runtime/office/portable/portable-xlsx-charts.mjs +4 -1
  292. package/src/runtime/office/portable/portable-xlsx-drawings.mjs +10 -6
  293. package/src/runtime/office/portable/portable-xlsx-operations.mjs +8 -5
  294. package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +1 -1
  295. package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +11 -7
  296. package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +6 -3
  297. package/src/runtime/office/portable/portable-xml.mjs +1 -1
  298. package/src/runtime/shared/agent-avatar-sprites.mjs +445 -0
  299. package/src/runtime/shared/agent-avatar.d.mts +64 -0
  300. package/src/runtime/shared/agent-avatar.mjs +320 -0
  301. package/src/runtime/shared/agent-route-config.d.mts +3 -0
  302. package/src/runtime/shared/agent-route-config.mjs +16 -0
  303. package/src/runtime/shared/atomic-file.mjs +36 -14
  304. package/src/runtime/shared/background-tasks.mjs +60 -20
  305. package/src/runtime/shared/child-spawn-gate.mjs +26 -16
  306. package/src/runtime/shared/config.mjs +8 -11
  307. package/src/runtime/shared/connector-accounts.mjs +15 -0
  308. package/src/runtime/shared/connector-catalog.d.mts +52 -0
  309. package/src/runtime/shared/connector-catalog.mjs +230 -0
  310. package/src/runtime/shared/connector-triggers.d.mts +3 -0
  311. package/src/runtime/shared/connector-triggers.mjs +43 -0
  312. package/src/runtime/shared/file-lock.mjs +7 -1
  313. package/src/runtime/shared/file-permissions-worker.mjs +38 -0
  314. package/src/runtime/shared/file-permissions.d.mts +19 -4
  315. package/src/runtime/shared/file-permissions.mjs +310 -4
  316. package/src/runtime/shared/git-runner-worker.mjs +6 -78
  317. package/src/runtime/shared/google-oauth-client.mjs +24 -0
  318. package/src/runtime/shared/held-request-host.d.mts +12 -0
  319. package/src/runtime/shared/held-request-host.mjs +71 -0
  320. package/src/runtime/shared/llm/http-agent.mjs +7 -3
  321. package/src/runtime/shared/llm/provider-catalog-registry.mjs +10 -0
  322. package/src/runtime/shared/llm/usage-accounting.mjs +2 -0
  323. package/src/runtime/shared/llm/usage-ledger-import.mjs +32 -3
  324. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +12 -5
  325. package/src/runtime/shared/llm/usage-ledger-worker.mjs +1 -1
  326. package/src/runtime/shared/llm/usage-ledger.mjs +20 -5
  327. package/src/runtime/shared/memory-snapshot.mjs +5 -1
  328. package/src/runtime/shared/notify-trace.mjs +8 -1
  329. package/src/runtime/shared/plain-preview.d.mts +1 -0
  330. package/src/runtime/shared/plain-preview.mjs +28 -0
  331. package/src/runtime/shared/pristine-execution-contract.json +5 -1
  332. package/src/runtime/shared/process-runner-worker.mjs +7 -0
  333. package/src/runtime/shared/process-runner.mjs +38 -0
  334. package/src/runtime/shared/provider-accounts.mjs +2 -1
  335. package/src/runtime/shared/provider-api-key.mjs +0 -1
  336. package/src/runtime/shared/read-row-numbers.mjs +1 -1
  337. package/src/runtime/shared/resource-admission.mjs +60 -18
  338. package/src/runtime/shared/routine-limits.d.mts +11 -0
  339. package/src/runtime/shared/routine-limits.mjs +21 -0
  340. package/src/runtime/shared/routine-trigger.d.mts +10 -0
  341. package/src/runtime/shared/routine-trigger.mjs +44 -0
  342. package/src/runtime/shared/run-child.mjs +84 -0
  343. package/src/runtime/shared/schedule-model-ref.mjs +9 -10
  344. package/src/runtime/shared/session-activity-signal.mjs +23 -0
  345. package/src/runtime/shared/shell-output-summary.mjs +23 -0
  346. package/src/runtime/shared/singleton-owner.mjs +126 -42
  347. package/src/runtime/shared/slow-span.mjs +4 -12
  348. package/src/runtime/shared/statusline/statusline-segments.mjs +13 -1
  349. package/src/runtime/shared/tool-output-limit.mjs +4 -2
  350. package/src/runtime/shared/tool-output-marker.mjs +58 -0
  351. package/src/runtime/shared/transcript-metadata.mjs +10 -0
  352. package/src/runtime/shared/turn-changes.mjs +0 -8
  353. package/src/runtime/shared/usage-readout-totals.mjs +56 -0
  354. package/src/runtime/shared/user-data-guard.mjs +131 -34
  355. package/src/runtime/shared/worktrees/activity-gate.mjs +33 -8
  356. package/src/runtime/shared/worktrees/git-head.mjs +20 -2
  357. package/src/runtime/shared/worktrees/lock.mjs +3 -2
  358. package/src/runtime/terminal-bridge/tool-defs.mjs +1 -1
  359. package/src/runtime/tidy/runners/biome.mjs +3 -1
  360. package/src/runtime/tidy/shadow.mjs +2 -1
  361. package/src/runtime/web-search/index.mjs +5 -7
  362. package/src/runtime/web-search/lib/formatter.mjs +42 -6
  363. package/src/runtime/web-search/tool-defs.mjs +6 -1
  364. package/src/session-runtime/agent-home-delivery.mjs +459 -0
  365. package/src/session-runtime/agent-profile-changes.mjs +21 -0
  366. package/src/session-runtime/agent-room-delivery.mjs +92 -0
  367. package/src/session-runtime/agent-task-sessions.mjs +200 -0
  368. package/src/session-runtime/boot/apis.mjs +50 -18
  369. package/src/session-runtime/boot/facade.mjs +5 -8
  370. package/src/session-runtime/boot/infrastructure.mjs +28 -17
  371. package/src/session-runtime/boot/tools.mjs +3 -0
  372. package/src/session-runtime/channel-config-api.mjs +53 -5
  373. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +36 -20
  374. package/src/session-runtime/cwd-plugins/plugin-status.mjs +6 -1
  375. package/src/session-runtime/held-requests.mjs +228 -0
  376. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +121 -0
  377. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -1
  378. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +31 -2
  379. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +31 -2
  380. package/src/session-runtime/internal-tool-executor.mjs +2 -0
  381. package/src/session-runtime/lifecycle/session-catalog.mjs +9 -0
  382. package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +4 -3
  383. package/src/session-runtime/lifecycle/session-switch/resume.mjs +11 -4
  384. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +3 -3
  385. package/src/session-runtime/lifecycle/shared.mjs +25 -2
  386. package/src/session-runtime/lifecycle/teardown/session-close.mjs +2 -0
  387. package/src/session-runtime/lifecycle/teardown.mjs +5 -2
  388. package/src/session-runtime/lifecycle-api.mjs +3 -1
  389. package/src/session-runtime/mcp-glue/server-catalog.mjs +8 -0
  390. package/src/session-runtime/mcp-glue/server-input.mjs +3 -0
  391. package/src/session-runtime/mcp-oauth-login.mjs +112 -15
  392. package/src/session-runtime/model-route/set-route.mjs +14 -3
  393. package/src/session-runtime/owned-automation-run.mjs +229 -0
  394. package/src/session-runtime/provider-auth/login.mjs +10 -6
  395. package/src/session-runtime/provider-auth/setup.mjs +19 -2
  396. package/src/session-runtime/provider-catalog-cache.mjs +101 -25
  397. package/src/session-runtime/provider-models/catalog-load.mjs +14 -3
  398. package/src/session-runtime/provider-models/row-hydration.mjs +4 -0
  399. package/src/session-runtime/provider-models.mjs +76 -10
  400. package/src/session-runtime/provider-readiness.mjs +4 -0
  401. package/src/session-runtime/resource-api.mjs +5 -0
  402. package/src/session-runtime/resource-mcp-api.mjs +107 -13
  403. package/src/session-runtime/resource-skills-api.mjs +12 -0
  404. package/src/session-runtime/room-member-gate.mjs +48 -0
  405. package/src/session-runtime/routine-home-turn.mjs +156 -0
  406. package/src/session-runtime/routine-owner.mjs +48 -0
  407. package/src/session-runtime/schedule-session-run.mjs +30 -64
  408. package/src/session-runtime/services/agent-tool/close-flow.mjs +2 -1
  409. package/src/session-runtime/services/agent-tool/helpers.mjs +10 -0
  410. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +10 -2
  411. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +13 -4
  412. package/src/session-runtime/services/agent-tool/notify.mjs +15 -4
  413. package/src/session-runtime/services/agent-tool/restart-notify.mjs +134 -0
  414. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -1
  415. package/src/session-runtime/services/agent-tool/spawn-flow/deferred-spawn.mjs +2 -1
  416. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -3
  417. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +19 -4
  418. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +2 -0
  419. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -1
  420. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +8 -3
  421. package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -0
  422. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +4 -0
  423. package/src/session-runtime/services/agent-tool/worker-index.mjs +44 -10
  424. package/src/session-runtime/services/agent-tool.mjs +20 -0
  425. package/src/session-runtime/services/channel-admin.mjs +93 -24
  426. package/src/session-runtime/services/memory-access.mjs +37 -0
  427. package/src/session-runtime/services/provider-admin.mjs +166 -59
  428. package/src/session-runtime/services/schedule-access.mjs +91 -0
  429. package/src/session-runtime/services/usage-dashboard-model.mjs +2 -2
  430. package/src/session-runtime/services/usage-dashboard.mjs +27 -69
  431. package/src/session-runtime/session-create/session-options.mjs +34 -7
  432. package/src/session-runtime/session-hooks.mjs +16 -8
  433. package/src/session-runtime/setup-tool/executor.mjs +68 -6
  434. package/src/session-runtime/setup-tool/extended-actions.mjs +72 -14
  435. package/src/session-runtime/setup-tool/settings-contract.mjs +8 -6
  436. package/src/session-runtime/setup-tool/tool-defs.mjs +8 -0
  437. package/src/session-runtime/skills-api.mjs +16 -1
  438. package/src/session-runtime/tool-policy-refresh.mjs +238 -29
  439. package/src/session-runtime/turn/session-ops.mjs +10 -3
  440. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +11 -2
  441. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +3 -0
  442. package/src/session-runtime/usage-stats-api.mjs +6 -1
  443. package/src/session-runtime/webhook-session-run.mjs +49 -67
  444. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +239 -0
  445. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +556 -22
  446. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +11 -1
  447. package/src/session-runtime/workflow-agents-api.mjs +4 -1
  448. package/src/standalone/channel-transport/http-routes.mjs +10 -9
  449. package/src/standalone/daemon-agent-control.mjs +1 -8
  450. package/src/standalone/daemon-desktop-runtime.mjs +20 -7
  451. package/src/standalone/daemon-owner.mjs +117 -25
  452. package/src/standalone/daemon-session-control.mjs +11 -2
  453. package/src/standalone/daemon.mjs +61 -17
  454. package/src/standalone/session-call-cache.mjs +6 -0
  455. package/src/standalone/session-protocol.mjs +28 -1
  456. package/src/standalone/session-service/retention/busy.mjs +7 -2
  457. package/src/standalone/session-service/session-calls/session-turns.mjs +9 -0
  458. package/src/standalone/session-service.mjs +19 -0
  459. package/src/standalone/session-transport/routes.mjs +7 -6
  460. package/src/tui/app/model-options.mjs +39 -2
  461. package/src/tui/app/model-picker.mjs +16 -2
  462. package/src/tui/app/provider-setup-picker.mjs +1 -2
  463. package/src/tui/app/slash-commands.mjs +20 -0
  464. package/src/tui/dist/index.mjs +487 -128
  465. package/src/tui/session/context-state.mjs +6 -1
  466. package/src/tui/session/notice-surface.mjs +35 -4
  467. package/src/tui/session/notice-text.mjs +0 -1
  468. package/src/tui/session/queue-helpers.mjs +2 -1
  469. package/src/tui/session/session-api/extensions.mjs +4 -0
  470. package/src/tui/session/session-api/intake/submission.mjs +12 -13
  471. package/src/tui/session/session-api/integrations.mjs +9 -5
  472. package/src/tui/session/session-api/lifecycle/session-reset.mjs +13 -3
  473. package/src/tui/session/session-api/lifecycle.mjs +17 -1
  474. package/src/tui/session/session-api/routes.mjs +48 -3
  475. package/src/tui/session/session-flow/drain.mjs +20 -3
  476. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -1
  477. package/src/tui/session/session-flow/queue/take-entries.mjs +3 -2
  478. package/src/tui/session/session-flow/steering.mjs +104 -24
  479. package/src/tui/session/session-flow.mjs +2 -0
  480. package/src/tui/session/tool-approval.mjs +26 -5
  481. package/src/tui/session/transcript-intake.mjs +6 -2
  482. package/src/tui/session/transcript-spill.mjs +5 -1
  483. package/src/tui/session/tui-steering-persist.mjs +65 -42
  484. package/src/tui/session/turn-live-call.mjs +56 -0
  485. package/src/tui/session/turn-stream.mjs +33 -0
  486. package/src/tui/session/turn.mjs +50 -7
  487. package/src/ui/statusline.mjs +1 -6
  488. package/src/ui/streaming-markdown-heal.mjs +24 -7
  489. package/src/vendor/statusline/bin/statusline-route.mjs +0 -1
  490. package/src/vendor/statusline/src/gateway/route-meta.mjs +0 -1
  491. package/src/workflows/default/WORKFLOW.md +9 -13
  492. package/src/session-runtime/automation-agents.mjs +0 -94
  493. package/src/session-runtime/automation-workflow.mjs +0 -59
@@ -1,30 +1,30 @@
1
1
  {
2
- "version": "0.1.32",
2
+ "version": "0.1.33",
3
3
  "_comment": "Synced from immutable graph-v release assets.",
4
4
  "assets": {
5
5
  "darwin-arm64": {
6
- "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.32/mixdog-graph-darwin-arm64",
7
- "sha256": "e4efda42c8fac65f4ba7da894ad0679cbb541069470633ccf5e9752c9fac680e"
6
+ "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-darwin-arm64",
7
+ "sha256": "8637d61493eddca3eee80620a64e737f12eead44ea899ad19a18966a3843ff3a"
8
8
  },
9
9
  "darwin-x64": {
10
- "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.32/mixdog-graph-darwin-x64",
11
- "sha256": "9b6cc73185a0b3a59a1279727fc92b8674fc0f7b7519b28a5e75f26926802de8"
10
+ "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-darwin-x64",
11
+ "sha256": "49ce311687c3df7e7080ecb7694219c9b51bbbb272864aa43d2102a8baa83550"
12
12
  },
13
13
  "linux-arm64": {
14
- "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.32/mixdog-graph-linux-arm64",
15
- "sha256": "373522940be2e261bf7f4de3ad226d1e68d73ef1efe95307525b2f867322e722"
14
+ "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-linux-arm64",
15
+ "sha256": "2e2a4ea6dccc5b33f583040b0ee6e8d47f93a1e879eb17343acd0b2f9838696f"
16
16
  },
17
17
  "linux-x64": {
18
- "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.32/mixdog-graph-linux-x64",
19
- "sha256": "ae8dce99b93c31f5e9f5c5f510dafdc035896fb7faf1e04b5fb603e182a21525"
18
+ "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-linux-x64",
19
+ "sha256": "2cd1caa7f39e183d6fb6f7764f49e9a0643863d137c2bfb5f40bb7ac616c8d73"
20
20
  },
21
21
  "win32-arm64": {
22
- "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.32/mixdog-graph-win32-arm64.exe",
23
- "sha256": "077012187e7a48c6cea8b7e5cdcfd567e518239078a247a6062c32562a76658c"
22
+ "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-win32-arm64.exe",
23
+ "sha256": "592dfa7e95e1e91424c7467e74f35d09758de502be403b7d229444b435600392"
24
24
  },
25
25
  "win32-x64": {
26
- "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.32/mixdog-graph-win32-x64.exe",
27
- "sha256": "9a449f632ea6f5c6f08feb158a6bbf7f829a3d7731e36821d1dbc042ab69bf48"
26
+ "url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.33/mixdog-graph-win32-x64.exe",
27
+ "sha256": "0ed17859a39f0160421865f3a3486ce53957b836ee164d606434519b85b90830"
28
28
  }
29
29
  }
30
30
  }
@@ -27,14 +27,14 @@ export function unregisterOwnedShellTree(jobId, entry) {
27
27
  if (ownedTrees.get(key) === entry) ownedTrees.delete(key);
28
28
  }
29
29
 
30
- /** Cancel every shell tree of one owner session. Synchronous (the native
31
- * cancel's own result) when every snapshot is already complete; otherwise a
32
- * promise that sends the cancel once the snapshots land or the bound passes. */
33
- export function cancelOwnedShellTrees(ownerSessionId) {
34
- const owner = String(ownerSessionId || '').trim();
30
+ /** Prepare the kill of every registered tree — of one owner, or of all when
31
+ * `ownerSessionId` is null (runtime shutdown) — and unregister them. Returns
32
+ * the snapshots still pending (empty when all were complete). */
33
+ export function prepareOwnedShellTreeKills(ownerSessionId = null) {
34
+ const owner = ownerSessionId == null ? null : String(ownerSessionId).trim();
35
35
  const pending = [];
36
36
  for (const [jobId, entry] of [...ownedTrees]) {
37
- if (String(entry.ownerSessionId || '') !== owner) continue;
37
+ if (owner !== null && String(entry.ownerSessionId || '') !== owner) continue;
38
38
  let ready;
39
39
  try {
40
40
  ready = entry.prepareKill();
@@ -44,6 +44,15 @@ export function cancelOwnedShellTrees(ownerSessionId) {
44
44
  if (ready !== true) pending.push(Promise.resolve(ready).catch(() => false));
45
45
  unregisterOwnedShellTree(jobId, entry);
46
46
  }
47
+ return pending;
48
+ }
49
+
50
+ /** Cancel every shell tree of one owner session. Synchronous (the native
51
+ * cancel's own result) when every snapshot is already complete; otherwise a
52
+ * promise that sends the cancel once the snapshots land or the bound passes. */
53
+ export function cancelOwnedShellTrees(ownerSessionId) {
54
+ const owner = String(ownerSessionId || '').trim();
55
+ const pending = prepareOwnedShellTreeKills(owner);
47
56
  if (pending.length === 0) return cancelNativeTasks({ ownerSessionId: owner });
48
57
  let result = null;
49
58
  const send = () => {
@@ -32,6 +32,9 @@ export const TERMINATION_RECHECK_MS = 5_000;
32
32
  // read is not abandoned — a snapshot that lands later is still absorbed.
33
33
  export const PROCESS_TABLE_READ_BOUND_MS = 2_000;
34
34
 
35
+ // Kill-and-observe rounds of a survivor kill before it reports what is left.
36
+ const KILL_ROUNDS = 3;
37
+
35
38
  /** Resolve `promise`'s value, or `onTimeout` once `ms` elapse first. The
36
39
  * bound's timer is cleared whichever side wins. */
37
40
  export function withinBound(promise, ms, onTimeout) {
@@ -169,24 +172,53 @@ export function createProcessTreeTracker({ pid, members = [], exitObserved = fal
169
172
  };
170
173
  }
171
174
 
175
+ /** Terminate every identity the last observation found alive (console hosts
176
+ * excepted: they are witnesses, never workers). These are processes of a tree
177
+ * that was KILLED — they escaped its process group (setsid, job control, a
178
+ * double fork that kept its parent link) or outlived the root on Windows —
179
+ * so the kill is not finished while they run. Windows: taskkill /T /F;
180
+ * POSIX: SIGTERM, then SIGKILL after a short grace. */
181
+ function sweepLiveIdentities(tracker) {
182
+ const targets = tracker.live
183
+ .filter((entry) => entry.token != null && !CONSOLE_HOST.test(entry.name))
184
+ .map((entry) => entry.pid);
185
+ return targets.length > 0 ? killProcessTrees(targets) : Promise.resolve();
186
+ }
187
+
172
188
  /** One observation loop: observe now, then every `intervalMs` until the tree
173
189
  * is confirmed gone, then run `onTerminated` once. 'running', 'unknown', a
174
190
  * failed or unanswered (by the next cadence tick) observation and a failing
175
191
  * `onTerminated` all re-check on the same cadence; the first pass that is not
176
192
  * 'gone' calls `onUnconfirmed` once. The returned stop() clears the pending
177
193
  * timer; nothing else (listener, timer) outlives the loop. Nothing in it ever
178
- * releases on time alone. */
194
+ * releases on time alone.
195
+ *
196
+ * `sweep` (a killed tree): a pass that finds captured identities alive
197
+ * terminates them and observes again in the same pass, so a cancellation
198
+ * ends with the tree gone instead of a held folder over live processes.
199
+ *
200
+ * `ownerClosed`: once the owning session has closed and the root has
201
+ * exited, a tree without a complete pre-kill snapshot is observed after
202
+ * exit (what is still linked to the root) instead of answering 'unknown'
203
+ * forever — no one is left to release it, and the close must end in a
204
+ * definitive state. `onSurvivors(pids)` reports the pids a pass that is
205
+ * not 'gone' found alive, whenever that set changes, so out-of-process
206
+ * readers can tell a live hold from a stale one. */
179
207
  export function watchTermination({
180
208
  tracker,
181
209
  rootExited = () => true,
182
210
  onTerminated,
183
211
  onUnconfirmed = null,
212
+ onSurvivors = null,
213
+ ownerClosed = null,
184
214
  releaseRequested = null,
185
215
  intervalMs = TERMINATION_RECHECK_MS,
216
+ sweep = false,
186
217
  }) {
187
218
  let timer = null;
188
219
  let stopped = false;
189
220
  let reportedUnconfirmed = false;
221
+ let survivorKey = null;
190
222
  const stop = () => {
191
223
  stopped = true;
192
224
  if (timer) clearTimeout(timer);
@@ -202,10 +234,22 @@ export function watchTermination({
202
234
  if (releaseRequested?.()) state = 'gone';
203
235
  else
204
236
  try {
237
+ if (!tracker.complete && rootExited() && ownerClosed?.()) tracker.acceptExitObservation();
205
238
  observation = tracker.observe({ rootExited: rootExited() });
206
239
  observation.catch(() => {});
207
240
  // A pass that has not answered by the next cadence tick is unknown.
208
241
  state = await withinBound(observation, intervalMs, 'unknown');
242
+ if (state === 'running' && sweep && !stopped) {
243
+ await withinBound(
244
+ sweepLiveIdentities(tracker).catch(() => {}),
245
+ intervalMs,
246
+ null
247
+ );
248
+ await observation.catch(() => {});
249
+ observation = tracker.observe({ rootExited: rootExited() });
250
+ observation.catch(() => {});
251
+ state = await withinBound(observation, intervalMs, 'unknown');
252
+ }
209
253
  } catch {
210
254
  state = 'unknown';
211
255
  }
@@ -218,6 +262,18 @@ export function watchTermination({
218
262
  /* presentation only */
219
263
  }
220
264
  }
265
+ if (state !== 'gone' && onSurvivors) {
266
+ const pids = tracker.live.map((entry) => entry.pid);
267
+ const key = pids.join(',');
268
+ if (key !== survivorKey) {
269
+ survivorKey = key;
270
+ try {
271
+ onSurvivors(pids);
272
+ } catch {
273
+ /* presentation only */
274
+ }
275
+ }
276
+ }
221
277
  if (state === 'gone') {
222
278
  try {
223
279
  await onTerminated();
@@ -365,7 +421,13 @@ export async function killShellDescendants(handle) {
365
421
  .map((entry) => entry.pid);
366
422
  await killProcessTrees(targets).catch(() => {});
367
423
  const tracker = trackerFor(handle);
368
- const state = await tracker.observe({ rootExited: true });
424
+ let state = await tracker.observe({ rootExited: true });
425
+ // What the first kill missed (a child forked meanwhile, a slow exit) is
426
+ // found by the re-observation itself and killed in the next round.
427
+ for (let round = 1; state === 'running' && round < KILL_ROUNDS; round += 1) {
428
+ await sweepLiveIdentities(tracker).catch(() => {});
429
+ state = await tracker.observe({ rootExited: true });
430
+ }
369
431
  return { terminated: state === 'gone', survivors: tracker.live.map((entry) => entry.pid) };
370
432
  } catch {
371
433
  return { terminated: false, survivors: [...handle.watchPids] };
@@ -60,6 +60,14 @@ export async function promoteWithRetry(
60
60
  */
61
61
  export function killAfterFailedPromotion(run, reason, promotionFailure) {
62
62
  run.autoBackgrounded = false;
63
+ // The command finished while it was being promoted (the spawn server
64
+ // releases a foreground task's record at its exit, so the promotion found
65
+ // none): report that completion. Killing the exited root would have no
66
+ // pre-kill snapshot and hold the workspace as unconfirmed for good.
67
+ if (run.child.exitCode != null || run.child.signalCode != null) {
68
+ if (run.promotionClose) void run.settle(...run.promotionClose);
69
+ return;
70
+ }
63
71
  if (reason === 'timeout') {
64
72
  run.timedOut = true;
65
73
  treeKillForceSettle(run, 'timeout');
@@ -75,8 +83,8 @@ export function killAfterFailedPromotion(run, reason, promotionFailure) {
75
83
  }
76
84
 
77
85
  /**
78
- * The promoted job leaves foreground admission: its lease is RELEASED, which
79
- * also restores the parent's high-load share. A long-lived server must never
86
+ * The promoted job leaves foreground admission: its lease is RELEASED. A
87
+ * long-lived server must never
80
88
  * hold a foreground slot for its whole life; background jobs are not counted
81
89
  * against any cap (session/runtime close stops them via shutdownShellJobs).
82
90
  */
@@ -13,7 +13,18 @@ import {
13
13
  } from '../shell-run-state.mjs';
14
14
 
15
15
  const BACKGROUND_GUIDANCE =
16
- 'Completion arrives automatically; call task wait (not task read polling) when the result is due.';
16
+ 'Its result is delivered automatically when it finishes; use task wait only if you need it now.';
17
+
18
+ function backgroundVerb(reason, secs) {
19
+ if (reason === 'timeout') return `moved to background at timeout after ${secs}s`;
20
+ if (reason === 'input') return `moved to background on new user input after ${secs}s`;
21
+ if (reason === 'notification') {
22
+ return `moved to background after ${secs}s because a notification arrived (delivered to you now)`;
23
+ }
24
+ if (reason === 'interrupt') return `moved to background on interrupt after ${secs}s`;
25
+ if (reason === 'background') return 'started in the background';
26
+ return `moved to background after the ${secs}s hold`;
27
+ }
17
28
 
18
29
  export function promotedSpillPaths(taskOutput) {
19
30
  return {
@@ -89,8 +100,7 @@ export function resolveBackgrounded(run, { jobId, reason, remainingBackgroundTim
89
100
  // frame alive and could later kill an unrelated, already-returned job.
90
101
  detachAbortHandler(run);
91
102
  const secs = Math.max(0, Math.round(elapsedSinceStart(run) / 1000));
92
- const verb =
93
- reason === 'timeout' ? `moved to background at timeout after ${secs}s` : `auto-backgrounded after ${secs}s`;
103
+ const verb = backgroundVerb(reason, secs);
94
104
  run.resolveResult(
95
105
  new ExecResult({
96
106
  ...capturedFields(run, capture),
@@ -8,6 +8,8 @@ import { unregisterOwnedShellTree } from './owned-shell-trees.mjs';
8
8
  import {
9
9
  adoptShellWorkspaceAdmission,
10
10
  clearTerminationHold,
11
+ isShellOwnerSessionClosed,
12
+ noteShellJobSurvivors,
11
13
  registerTerminationHold,
12
14
  takeReleaseRequest,
13
15
  } from '../builtin/lib/shell-job-records.mjs';
@@ -56,8 +58,12 @@ export function releaseAdmissionOnConfirmedTermination(run, { markNow = true } =
56
58
  run.stopTerminationWatch = watchTermination({
57
59
  tracker: run.terminationTracker,
58
60
  rootExited: () => child.exitCode != null || child.signalCode != null,
61
+ // A killed run is not over while processes it started still run.
62
+ sweep: run.killed === true,
59
63
  onTerminated: release,
60
64
  onUnconfirmed: markNow ? null : () => keepTerminationUnconfirmedRecord(run),
65
+ onSurvivors: (pids) => void noteShellJobSurvivors(run.foregroundRecordId, pids),
66
+ ownerClosed: () => isShellOwnerSessionClosed(run.foregroundRecordInput?.ownerSessionId),
61
67
  releaseRequested: () => takeReleaseRequest(run.foregroundRecordId),
62
68
  });
63
69
  }
@@ -162,6 +168,8 @@ export function createSettle(run, releasePromotedCapture) {
162
168
  if (run.settled) return;
163
169
  if (run.ownedTree) unregisterOwnedShellTree(run.foregroundRecordId, run.ownedTree);
164
170
  if (run.autoBackgrounded) {
171
+ // A failed promotion settles the run with this close instead.
172
+ run.promotionClose = [exitCode, signal];
165
173
  releasePromotedCapture();
166
174
  return;
167
175
  }
@@ -30,7 +30,9 @@ export function registerForegroundOwnedTree(run, ownerSessionId) {
30
30
  run.killed = true;
31
31
  run.ownerCancelled = true;
32
32
  run.killCause = run.killCause || 'session-close';
33
- return run.terminationTracker?.complete === true || capturePreKill(run);
33
+ // Always a fresh read: an earlier one predates what the run started
34
+ // since. Pending, the kill is sent at the snapshot bound regardless.
35
+ return capturePreKill(run);
34
36
  },
35
37
  };
36
38
  registerOwnedShellTree(run.foregroundRecordId, run.ownedTree);
@@ -102,6 +104,9 @@ export function createShellRun({ abortSignal, resolve, jobId = null }) {
102
104
  // `settled`: whichever transition wins first wins for good.
103
105
  autoBackgrounded: false,
104
106
  autoBackgroundJobId: null,
107
+ // [exitCode, signal] of a 'close' that arrived while promotion was in
108
+ // flight; a promotion that then fails settles the run with it.
109
+ promotionClose: null,
105
110
  autoBgTimer: null,
106
111
  killUnconfirmed: false,
107
112
  child: null,
@@ -829,7 +829,7 @@ function unifiedUpdateHunks(sourceLines, section, displayPath, { fuzzy, rejectPa
829
829
  const loc = resolveV4AHunkPosition(sourceLines, hunk, nextSearchLine, { fuzzy });
830
830
  if (loc.skip) continue;
831
831
  if (loc.error) {
832
- const msg = `${loc.error.replace(/^V4A hunk /, `V4A hunk ${section.path}: `)}`;
832
+ const msg = `${loc.error.replace(/^V4A hunk /, () => `V4A hunk ${section.path}: `)}`;
833
833
  if (rejectPartial) throw new Error(msg);
834
834
  if (rejectedHunks) rejectedHunks.push({ file: section.path, hunk, reason: msg });
835
835
  continue;
@@ -288,6 +288,7 @@ async function settleQueuedPromotion(jobId) {
288
288
  function queueSaturatedAsTask(run, saturation, spec) {
289
289
  const queuedAbort = new AbortController();
290
290
  const taskId = run.foregroundRecordId;
291
+ let promotedJobId = null;
291
292
  let task;
292
293
  try {
293
294
  task = startBackgroundTask({
@@ -301,10 +302,15 @@ function queueSaturatedAsTask(run, saturation, spec) {
301
302
  input: { command: spec.command, cwd: spec.cwd },
302
303
  meta: { task_id: taskId, stdout: null, stderr: null, cwd: spec.cwd, timeoutMs: spec.backgroundDeadlineMs || 0 },
303
304
  resultType: 'shell_task_result',
305
+ // While the command runs in the foreground, its abort handler snapshots
306
+ // the tree before it kills. A native kill sent here as well would end
307
+ // the root first: the snapshot then misses the tree and the workspace
308
+ // stays held as unconfirmed forever. Only a promoted job is killed here.
304
309
  cancel: () => {
305
310
  queuedAbort.abort();
311
+ if (!promotedJobId) return;
306
312
  try {
307
- killShellJob(taskId);
313
+ killShellJob(promotedJobId);
308
314
  } catch {}
309
315
  },
310
316
  run: async () => {
@@ -313,11 +319,23 @@ function queueSaturatedAsTask(run, saturation, spec) {
313
319
  jobId: taskId,
314
320
  abortSignal: queuedAbort.signal,
315
321
  admissionWaitMs: 0,
316
- // The call already returned: nobody renders live progress.
322
+ // The call already returned: nobody renders live progress, and no
323
+ // hold remains for user input to end.
324
+ wakeSignal: null,
317
325
  onProgress: null,
318
326
  onOutputTail: null,
319
327
  });
320
- if (result.backgrounded && result.jobId) return settleQueuedPromotion(result.jobId);
328
+ if (result.backgrounded && result.jobId) {
329
+ promotedJobId = result.jobId;
330
+ // Promotion detached the abort handler: a cancel that landed during
331
+ // the handoff reaches the promoted job here.
332
+ if (queuedAbort.signal.aborted) {
333
+ try {
334
+ killShellJob(promotedJobId);
335
+ } catch {}
336
+ }
337
+ return settleQueuedPromotion(promotedJobId);
338
+ }
321
339
  const output = [result.stdout, result.stderr].filter(Boolean).join('\n');
322
340
  if (result.exitCode !== 0) {
323
341
  throw new Error(`exit code ${result.exitCode ?? result.signal ?? 'unknown'}${output ? `\n${output}` : ''}`);
@@ -465,7 +483,27 @@ const promotable = (run, backgroundOnTimeout) =>
465
483
  run.child?.exitCode == null &&
466
484
  run.child?.signalCode == null;
467
485
 
468
- function armDeadlines(run, { timeoutMs, autoBackgroundMs, backgroundOnTimeout, abortSignal }, fireAutoBackground) {
486
+ // New user input or a queued task notification during the hold moves a
487
+ // still-running command to the background at once (never a kill): the call
488
+ // returns to the agent loop, which delivers it at the next boundary.
489
+ function armInputWake(run, wakeSignal, fireAutoBackground) {
490
+ if (!wakeSignal) return;
491
+ const onWake = () => {
492
+ const reason = wakeSignal.reason === 'notification' ? 'notification' : 'input';
493
+ if (promotable(run, true)) fireAutoBackground({ reason });
494
+ };
495
+ if (wakeSignal.aborted) {
496
+ onWake();
497
+ return;
498
+ }
499
+ wakeSignal.addEventListener('abort', onWake, { once: true });
500
+ }
501
+
502
+ function armDeadlines(
503
+ run,
504
+ { timeoutMs, autoBackgroundMs, autoBackgroundReason, backgroundOnTimeout, abortSignal },
505
+ fireAutoBackground
506
+ ) {
469
507
  if (timeoutMs > 0) {
470
508
  run.timer = setTimeout(() => {
471
509
  // Promote-on-timeout: if the caller allows backgrounding and the child
@@ -490,7 +528,7 @@ function armDeadlines(run, { timeoutMs, autoBackgroundMs, backgroundOnTimeout, a
490
528
  (timeoutMs <= 0 || autoBackgroundMs < timeoutMs)
491
529
  ) {
492
530
  run.autoBgTimer = setTimeout(() => {
493
- fireAutoBackground();
531
+ fireAutoBackground({ reason: autoBackgroundReason || 'threshold' });
494
532
  }, autoBackgroundMs);
495
533
  if (run.autoBgTimer.unref) run.autoBgTimer.unref();
496
534
  }
@@ -525,7 +563,11 @@ export function execShellCommand(options) {
525
563
  cwd,
526
564
  timeoutMs,
527
565
  abortSignal,
566
+ // Aborted when new user input should end the hold (task-wait-control).
567
+ wakeSignal = null,
528
568
  autoBackgroundMs,
569
+ // 'background' for an explicit background start; the hold otherwise.
570
+ autoBackgroundReason = 'threshold',
529
571
  onProgress,
530
572
  onOutputTail,
531
573
  clientHostPid,
@@ -547,60 +589,67 @@ export function execShellCommand(options) {
547
589
  // The user approved this call's elevation 'ask' decision (runtime-set).
548
590
  elevationApproved = false,
549
591
  } = options;
550
- return new Promise(async (resolve) => {
592
+ return new Promise((resolve) => {
551
593
  const run = createShellRun({ abortSignal, resolve, jobId });
552
- // An async executor's throw is NOT routed to this Promise — it becomes an
553
- // unhandled rejection of the executor's own promise while the awaiting
554
- // caller hangs forever. Every path below therefore has to settle the run
555
- // itself, including the unexpected one.
556
- try {
557
- const spawned = await admitAndSpawn(
558
- run,
559
- {
560
- admission,
561
- shell,
562
- shellArg,
563
- shellArgs,
594
+ // A throw inside this async body is NOT routed to the Promise — it becomes
595
+ // an unhandled rejection while the awaiting caller hangs forever. Every
596
+ // path below therefore has to settle the run itself, including the
597
+ // unexpected one.
598
+ void (async () => {
599
+ try {
600
+ const spawned = await admitAndSpawn(
601
+ run,
602
+ {
603
+ admission,
604
+ shell,
605
+ shellArg,
606
+ shellArgs,
607
+ command,
608
+ env,
609
+ cwd,
610
+ abortSignal,
611
+ directArgv,
612
+ execScript,
613
+ elevationApproved,
614
+ ownerSessionId,
615
+ clientHostPid,
616
+ },
617
+ {
618
+ admissionWaitMs,
619
+ onSaturated: (err) => backgroundOnTimeout && queueSaturatedAsTask(run, err, options),
620
+ }
621
+ );
622
+ if (!spawned) return;
623
+
624
+ // Pre-aborted signal: kill immediately if the abort already fired
625
+ // before spawn returned (synchronous reentry from a parent abort), so
626
+ // the child doesn't run for the full timeoutMs window.
627
+ if (abortSignal?.aborted) {
628
+ treeKillForceSettle(run, 'cancellation');
629
+ }
630
+ attachOutputCapture(run);
631
+ const releasePromotedCapture = createPromotedCaptureRelease(run);
632
+ run.settle = createSettle(run, releasePromotedCapture);
633
+ attachChildExit(run, releasePromotedCapture);
634
+ const fireAutoBackground = createAutoBackground({
635
+ run,
564
636
  command,
565
- env,
566
637
  cwd,
567
- abortSignal,
568
- directArgv,
569
- execScript,
570
- elevationApproved,
571
- ownerSessionId,
572
638
  clientHostPid,
573
- },
574
- {
575
- admissionWaitMs,
576
- onSaturated: (err) => backgroundOnTimeout && queueSaturatedAsTask(run, err, options),
577
- }
578
- );
579
- if (!spawned) return;
580
-
581
- // Pre-aborted signal: kill immediately if the abort already fired
582
- // before spawn returned (synchronous reentry from a parent abort), so
583
- // the child doesn't run for the full timeoutMs window.
584
- if (abortSignal?.aborted) {
585
- treeKillForceSettle(run, 'cancellation');
639
+ ownerSessionId,
640
+ promotedTimeoutMs,
641
+ backgroundDeadlineMs,
642
+ });
643
+ armDeadlines(
644
+ run,
645
+ { timeoutMs, autoBackgroundMs, autoBackgroundReason, backgroundOnTimeout, abortSignal },
646
+ fireAutoBackground
647
+ );
648
+ armInputWake(run, wakeSignal, fireAutoBackground);
649
+ armProgressTimers(run, { onProgress, onOutputTail });
650
+ } catch (err) {
651
+ settleSetupFailure(run, err);
586
652
  }
587
- attachOutputCapture(run);
588
- const releasePromotedCapture = createPromotedCaptureRelease(run);
589
- run.settle = createSettle(run, releasePromotedCapture);
590
- attachChildExit(run, releasePromotedCapture);
591
- const fireAutoBackground = createAutoBackground({
592
- run,
593
- command,
594
- cwd,
595
- clientHostPid,
596
- ownerSessionId,
597
- promotedTimeoutMs,
598
- backgroundDeadlineMs,
599
- });
600
- armDeadlines(run, { timeoutMs, autoBackgroundMs, backgroundOnTimeout, abortSignal }, fireAutoBackground);
601
- armProgressTimers(run, { onProgress, onOutputTail });
602
- } catch (err) {
603
- settleSetupFailure(run, err);
604
- }
653
+ })();
605
654
  });
606
655
  }
@@ -273,6 +273,8 @@ export function isBlockedCommand(command) {
273
273
  return decoded !== null && _blockedText(decoded);
274
274
  }
275
275
 
276
+ const WMIC_PROCESS_COMMAND_RE = /^\s*(?:&\s*)?(?:cmd(?:\.exe)?\s+\/c\s+["']?)?(?:\S*[\\/])?wmic(?:\.exe)?\s+process\b/i;
277
+
276
278
  const WMIC_PROCESS_DEFAULT_FIELDS = Object.freeze([
277
279
  'ProcessId',
278
280
  'Name',
@@ -336,8 +338,11 @@ export function maybeRewriteWmicProcessCommand(command) {
336
338
  // silently drop surrounding `cd`, pipes, `&&`/`;` segments. For composite
337
339
  // commands containing wmic, return null so the caller falls back to other
338
340
  // policy handling instead of dropping context.
339
- if (/[|&;]|\$\(|`/.test(text) && /\bwmic(?:\.exe)?\s+process\b/i.test(text)) return null;
340
- if (!/\bwmic(?:\.exe)?\s+process\b/i.test(text)) return null;
341
+ // Only a command that IS a wmic call is rewritten. The words `wmic process`
342
+ // inside a search pattern, a commit message or a file being written are text:
343
+ // replacing that whole command would discard it.
344
+ if (!WMIC_PROCESS_COMMAND_RE.test(text)) return null;
345
+ if (/[|&;]|\$\(|`/.test(text)) return null;
341
346
  if (!/\bget\b/i.test(text)) {
342
347
  return {
343
348
  error: