mixdog 1.3.0 → 1.3.2

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 (423) hide show
  1. package/NOTICE.md +52 -9
  2. package/README.md +8 -4
  3. package/package.json +2 -2
  4. package/scripts/native-release-status.mjs +238 -0
  5. package/src/defaults/shipped-history.json +8 -1
  6. package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
  7. package/src/defaults/skills/setup/SKILL.md +23 -1
  8. package/src/defaults/skills/setup/references/actions.md +54 -4
  9. package/src/defaults/skills/setup/references/surfaces.md +23 -3
  10. package/src/defaults/skills/setup-guide/SKILL.md +17 -10
  11. package/src/defaults/skills/visualize/SKILL.md +9 -6
  12. package/src/defaults/skills/visualize/references/craft.md +8 -1
  13. package/src/help.mjs +1 -1
  14. package/src/lib/keychain-cjs.cjs +4 -1
  15. package/src/lib/rules-builder.cjs +14 -7
  16. package/src/output-styles/common.md +13 -8
  17. package/src/rules/agent-mode/AGENT_MODE.md +9 -6
  18. package/src/rules/agent-mode/MIXY.md +11 -6
  19. package/src/rules/lead/LEAD.md +2 -2
  20. package/src/rules/shared/10-tool-workflow.md +4 -0
  21. package/src/rules/shared/20-research.md +2 -0
  22. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
  23. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
  24. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
  25. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
  26. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
  28. package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
  29. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
  30. package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
  31. package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
  32. package/src/runtime/agent/orchestrator/config.mjs +11 -0
  33. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +81 -16
  34. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -4
  35. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
  36. package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
  37. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +80 -31
  38. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
  39. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  40. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +67 -38
  41. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
  42. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +7 -2
  43. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
  44. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +34 -16
  45. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
  46. package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
  47. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
  48. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
  49. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +19 -1
  50. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
  51. package/src/runtime/agent/orchestrator/providers/lib/tool-call-wire-ids.mjs +65 -0
  52. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
  53. package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
  54. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
  55. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
  56. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
  57. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
  58. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +8 -2
  59. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +10 -2
  60. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
  61. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
  62. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
  64. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
  65. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +14 -2
  66. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -0
  67. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +17 -0
  68. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
  69. package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
  70. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
  71. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
  72. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
  73. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +5 -5
  74. package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
  75. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
  76. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +12 -1
  77. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +17 -6
  78. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +41 -10
  79. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +6 -4
  80. package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
  81. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +2 -0
  82. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
  83. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
  84. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
  85. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +21 -2
  86. package/src/runtime/agent/orchestrator/session/agent-room.mjs +149 -45
  87. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
  88. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  89. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +14 -11
  90. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
  91. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +68 -18
  92. package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
  93. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
  94. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
  95. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +5 -1
  96. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +1 -1
  97. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
  99. package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +230 -0
  100. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +156 -25
  101. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
  102. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +21 -9
  103. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
  104. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
  105. package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
  106. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
  107. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +189 -105
  108. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +9 -0
  109. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
  110. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +111 -9
  111. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +11 -14
  112. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
  113. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +38 -5
  114. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +21 -0
  115. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
  116. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
  117. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
  118. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +46 -4
  119. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
  120. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +18 -8
  121. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +4 -0
  122. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  123. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  124. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
  125. package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +99 -0
  126. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
  127. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
  128. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
  129. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
  130. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +50 -0
  131. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
  132. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
  133. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
  134. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +62 -47
  135. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +6 -8
  136. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +12 -1
  137. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
  138. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +7 -1
  139. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
  140. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +1 -1
  141. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
  142. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +5 -2
  143. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +42 -10
  144. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
  145. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +35 -4
  146. package/src/runtime/agent/orchestrator/session/routine-result.mjs +179 -16
  147. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -1
  148. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
  149. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
  150. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
  151. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
  152. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
  153. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +8 -3
  154. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +36 -1
  155. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -1
  156. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
  157. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
  158. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
  159. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
  160. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
  161. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +49 -14
  162. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +134 -17
  163. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +35 -13
  164. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
  165. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -3
  166. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
  167. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
  168. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
  169. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
  170. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +6 -14
  171. package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
  172. package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
  173. package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
  174. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
  175. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
  176. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +34 -21
  177. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
  178. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
  179. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
  180. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
  181. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
  182. package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
  183. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
  184. package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
  185. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
  186. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
  187. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
  188. package/src/runtime/attachments/attachment-reference.mjs +155 -0
  189. package/src/runtime/attachments/limits.mjs +5 -1
  190. package/src/runtime/attachments/office-extract.mjs +3 -6
  191. package/src/runtime/attachments/pdf-extract.mjs +84 -10
  192. package/src/runtime/attachments/store.mjs +55 -30
  193. package/src/runtime/browser-bridge/client.mjs +73 -20
  194. package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
  195. package/src/runtime/channels/lib/scheduler.mjs +14 -7
  196. package/src/runtime/channels/lib/state-file.mjs +15 -15
  197. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
  198. package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
  199. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
  200. package/src/runtime/channels/lib/worker-main.mjs +3 -2
  201. package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
  202. package/src/runtime/effort-judge/judge-client.mjs +6 -3
  203. package/src/runtime/effort-judge/model-install.mjs +16 -8
  204. package/src/runtime/effort-judge/model-manifest.json +7 -7
  205. package/src/runtime/local-provider/asset-installer.mjs +10 -4
  206. package/src/runtime/local-provider/catalog.mjs +5 -2
  207. package/src/runtime/local-provider/registered-models.mjs +64 -27
  208. package/src/runtime/local-provider/server.mjs +2 -3
  209. package/src/runtime/media/adapters/image-api.mjs +89 -0
  210. package/src/runtime/media/auth.mjs +64 -1
  211. package/src/runtime/media/catalog.mjs +66 -4
  212. package/src/runtime/media/jobs.mjs +4 -0
  213. package/src/runtime/media/lanes.mjs +46 -5
  214. package/src/runtime/media/media-usage.mjs +17 -0
  215. package/src/runtime/media/renditions.mjs +15 -15
  216. package/src/runtime/media/store.mjs +36 -35
  217. package/src/runtime/media/tool.mjs +8 -1
  218. package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
  219. package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
  220. package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
  221. package/src/runtime/memory/lib/pg/process.mjs +8 -4
  222. package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
  223. package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
  224. package/src/runtime/office/core/journal.mjs +7 -14
  225. package/src/runtime/office/design/library/design-library-core.mjs +4 -16
  226. package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
  227. package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
  228. package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
  229. package/src/runtime/office/pdf/pdf-render.mjs +30 -18
  230. package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
  231. package/src/runtime/office/portable/portable-soffice.mjs +4 -0
  232. package/src/runtime/shared/agent-kind-migration.mjs +200 -0
  233. package/src/runtime/shared/agent-kind.mjs +152 -0
  234. package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
  235. package/src/runtime/shared/agent-message-envelope.mjs +44 -0
  236. package/src/runtime/shared/agent-reap-state.d.mts +4 -0
  237. package/src/runtime/shared/agent-route-config.d.mts +1 -0
  238. package/src/runtime/shared/agent-route-config.mjs +22 -8
  239. package/src/runtime/shared/agent-store.mjs +149 -0
  240. package/src/runtime/shared/agent-task-starts.mjs +27 -0
  241. package/src/runtime/shared/atomic-file.d.mts +50 -0
  242. package/src/runtime/shared/atomic-file.mjs +394 -132
  243. package/src/runtime/shared/background-tasks.mjs +7 -4
  244. package/src/runtime/shared/bot-hops.mjs +30 -0
  245. package/src/runtime/shared/bot-split-migration.mjs +457 -0
  246. package/src/runtime/shared/bounded-download.mjs +4 -2
  247. package/src/runtime/shared/config-patch.mjs +20 -1
  248. package/src/runtime/shared/config.mjs +39 -9
  249. package/src/runtime/shared/connector-catalog.d.mts +1 -2
  250. package/src/runtime/shared/connector-catalog.mjs +2 -4
  251. package/src/runtime/shared/connector-triggers.mjs +2 -0
  252. package/src/runtime/shared/defaults-separation.mjs +6 -2
  253. package/src/runtime/shared/delegated-approval-host.mjs +74 -0
  254. package/src/runtime/shared/err-text.mjs +7 -1
  255. package/src/runtime/shared/error-presentation.mjs +113 -10
  256. package/src/runtime/shared/file-has-data.mjs +28 -0
  257. package/src/runtime/shared/handoff-artifacts.d.mts +20 -0
  258. package/src/runtime/shared/handoff-artifacts.mjs +61 -0
  259. package/src/runtime/shared/llm/provider-model-identities.mjs +6 -1
  260. package/src/runtime/shared/llm/usage-accounting.mjs +7 -1
  261. package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
  262. package/src/runtime/shared/model-route-fallback.mjs +79 -7
  263. package/src/runtime/shared/pending-agent-work.mjs +54 -0
  264. package/src/runtime/shared/plain-preview.mjs +22 -17
  265. package/src/runtime/shared/process-lifecycle.mjs +8 -12
  266. package/src/runtime/shared/projects.mjs +50 -41
  267. package/src/runtime/shared/provider-accounts.mjs +17 -12
  268. package/src/runtime/shared/routine-trigger.d.mts +6 -1
  269. package/src/runtime/shared/routine-trigger.mjs +14 -6
  270. package/src/runtime/shared/run-child.d.mts +3 -0
  271. package/src/runtime/shared/run-child.mjs +24 -3
  272. package/src/runtime/shared/sensitive-path-rules.d.mts +15 -0
  273. package/src/runtime/shared/sensitive-path-rules.mjs +256 -0
  274. package/src/runtime/shared/session-baseline-store.mjs +8 -2
  275. package/src/runtime/shared/singleton-owner.mjs +7 -6
  276. package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
  277. package/src/runtime/shared/staged-update.mjs +4 -2
  278. package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
  279. package/src/runtime/shared/tool-execution-contract.mjs +6 -0
  280. package/src/runtime/shared/transcript-metadata.mjs +28 -3
  281. package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
  282. package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
  283. package/src/runtime/shared/turn-snapshot.mjs +44 -2
  284. package/src/runtime/shared/usage-readout-totals.mjs +15 -13
  285. package/src/runtime/shared/user-cwd.mjs +9 -4
  286. package/src/runtime/shared/user-data-guard.mjs +46 -44
  287. package/src/runtime/shared/utf8-cut.mjs +10 -0
  288. package/src/runtime/shared/worktrees/activity-gate.mjs +269 -61
  289. package/src/runtime/shared/worktrees/registry.mjs +26 -26
  290. package/src/runtime/tidy/core-install.mjs +26 -4
  291. package/src/runtime/tidy/install.mjs +91 -23
  292. package/src/runtime/web-search/lib/config.mjs +4 -16
  293. package/src/session-runtime/agent-home-delivery.mjs +859 -136
  294. package/src/session-runtime/agent-room-delivery.mjs +167 -19
  295. package/src/session-runtime/agent-task-sessions.mjs +831 -69
  296. package/src/session-runtime/agent-tool-routing.mjs +1 -0
  297. package/src/session-runtime/boot/apis.mjs +58 -24
  298. package/src/session-runtime/boot/config.mjs +1 -0
  299. package/src/session-runtime/boot/facade.mjs +11 -1
  300. package/src/session-runtime/boot/infrastructure.mjs +14 -2
  301. package/src/session-runtime/boot/providers.mjs +16 -6
  302. package/src/session-runtime/boot/shared.mjs +12 -6
  303. package/src/session-runtime/boot/tools.mjs +2 -2
  304. package/src/session-runtime/bot-status.mjs +432 -0
  305. package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
  306. package/src/session-runtime/config-lifecycle.mjs +78 -32
  307. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
  308. package/src/session-runtime/handoff-attachments.mjs +593 -0
  309. package/src/session-runtime/held-requests.mjs +36 -33
  310. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
  311. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
  312. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +45 -6
  313. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  314. package/src/session-runtime/lifecycle/teardown.mjs +11 -3
  315. package/src/session-runtime/mcp-glue/connect.mjs +100 -186
  316. package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
  317. package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
  318. package/src/session-runtime/media-api.mjs +5 -2
  319. package/src/session-runtime/model-route/route-persist.mjs +2 -2
  320. package/src/session-runtime/model-route/route-tuning.mjs +11 -2
  321. package/src/session-runtime/model-route/set-route.mjs +82 -2
  322. package/src/session-runtime/native-web-search.mjs +2 -2
  323. package/src/session-runtime/new-session-config.mjs +6 -1
  324. package/src/session-runtime/owned-automation-run.mjs +8 -1
  325. package/src/session-runtime/room-member-gate.mjs +16 -3
  326. package/src/session-runtime/route-resolution.mjs +21 -19
  327. package/src/session-runtime/route-state.mjs +1 -59
  328. package/src/session-runtime/routine-home-turn.mjs +5 -3
  329. package/src/session-runtime/runtime-bootstrap.mjs +5 -3
  330. package/src/session-runtime/runtime-paths.mjs +11 -5
  331. package/src/session-runtime/runtime-tunables.mjs +6 -0
  332. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
  333. package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
  334. package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
  335. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
  336. package/src/session-runtime/services/agent-tool/helpers.mjs +24 -5
  337. package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
  338. package/src/session-runtime/services/agent-tool/send-flow.mjs +36 -24
  339. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -0
  340. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
  341. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +12 -6
  342. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +5 -8
  343. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  344. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
  345. package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
  346. package/src/session-runtime/services/agent-tool.mjs +6 -0
  347. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
  348. package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
  349. package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
  350. package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
  351. package/src/session-runtime/services/plugin-admin.mjs +26 -26
  352. package/src/session-runtime/services/provider-admin.mjs +14 -4
  353. package/src/session-runtime/services/schedule-access.mjs +33 -4
  354. package/src/session-runtime/services/seeds.mjs +4 -3
  355. package/src/session-runtime/services/usage-dashboard.mjs +1 -1
  356. package/src/session-runtime/services/usage-stats-model.mjs +2 -1
  357. package/src/session-runtime/session-create/materialize.mjs +2 -3
  358. package/src/session-runtime/session-create/session-options.mjs +15 -2
  359. package/src/session-runtime/settings-builtin-tools-api.mjs +63 -1
  360. package/src/session-runtime/settings-compaction-api.mjs +86 -39
  361. package/src/session-runtime/setup-tool/executor.mjs +20 -3
  362. package/src/session-runtime/setup-tool/extended-actions.mjs +19 -7
  363. package/src/session-runtime/setup-tool/settings-contract.mjs +37 -1
  364. package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
  365. package/src/session-runtime/skills-api.mjs +12 -5
  366. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +265 -0
  367. package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
  368. package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
  369. package/src/session-runtime/tool-policy/policy-stage.mjs +165 -0
  370. package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
  371. package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
  372. package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
  373. package/src/session-runtime/tool-policy-refresh.mjs +47 -358
  374. package/src/session-runtime/tool-surface.mjs +5 -3
  375. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +99 -81
  376. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  377. package/src/session-runtime/turn/turn-run.mjs +2 -1
  378. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
  379. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +578 -301
  380. package/src/session-runtime/workflow-agents-api/agent-route.mjs +113 -53
  381. package/src/session-runtime/workflow-agents-api/onboarding.mjs +11 -4
  382. package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
  383. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
  384. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
  385. package/src/session-runtime/workspace/workspace-state.mjs +7 -6
  386. package/src/standalone/daemon-agent-control.mjs +4 -1
  387. package/src/standalone/daemon-session-control.mjs +60 -11
  388. package/src/standalone/daemon.mjs +34 -4
  389. package/src/standalone/local-session-runtime.mjs +22 -14
  390. package/src/standalone/session-client.mjs +7 -2
  391. package/src/standalone/session-protocol.mjs +7 -0
  392. package/src/standalone/session-service/agent-tree/agent-turns.mjs +46 -3
  393. package/src/standalone/session-service/agent-tree.mjs +4 -3
  394. package/src/standalone/session-service/session-calls/session-turns.mjs +19 -0
  395. package/src/standalone/session-service.mjs +11 -0
  396. package/src/standalone/session-state-projection.mjs +19 -9
  397. package/src/standalone/session-tool-output.mjs +35 -9
  398. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
  399. package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
  400. package/src/tui/app/slash-commands.mjs +1 -1
  401. package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
  402. package/src/tui/dist/index.mjs +599 -342
  403. package/src/tui/prompt-history-store.mjs +16 -21
  404. package/src/tui/session/context-state.mjs +4 -0
  405. package/src/tui/session/notice-surface.mjs +3 -4
  406. package/src/tui/session/session-api/intake/abort.mjs +19 -1
  407. package/src/tui/session/session-api/media.mjs +2 -1
  408. package/src/tui/session/session-api/routes-agent-definitions.mjs +75 -0
  409. package/src/tui/session/session-api/routes-write.mjs +203 -0
  410. package/src/tui/session/session-api/routes.mjs +23 -236
  411. package/src/tui/session/session-api/settings.mjs +14 -1
  412. package/src/tui/session/session-flow/drain.mjs +28 -3
  413. package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
  414. package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
  415. package/src/tui/session/session-flow/steering.mjs +8 -3
  416. package/src/tui/session/tool-approval.mjs +185 -20
  417. package/src/tui/session/transcript-intake.mjs +4 -0
  418. package/src/tui/session/turn-live-call.mjs +11 -3
  419. package/src/tui/session/turn.mjs +36 -17
  420. package/src/tui/transcript-tool-failures.mjs +8 -2
  421. package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
  422. package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
  423. package/src/rules/agent-mode/ROUTINE.md +0 -6
@@ -1,12 +1,14 @@
1
1
  /**
2
- * Held requests: unattended runs never auto-approve. In a schedule, webhook or
3
- * group-room-member run, an approval-needing call is HELD instead of shown as
2
+ * Unattended runs. A schedule or webhook run never asks (its saved routine is
3
+ * the user's grant; human-gate/run-policy.mjs), so only group-room members
4
+ * still use held requests: an approval-needing call is HELD instead of shown as
4
5
  * a card: the run pauses on it, a structured held-request row lands in the
5
6
  * owning agent's home thread (agent-home-delivery.mjs queue), a phone push
6
7
  * says only "<agent>가 승인을 기다립니다" (no tool, arguments or text), and the
7
- * request expires after HELD_REQUEST_EXPIRY_MS into a deny, so the run goes
8
- * on with the denial. The user answers from the home thread through the
9
- * ordinary approval call with the held id (runtime/shared/held-request-host.mjs).
8
+ * request waits, like any approval, until the user answers it (Approve/Deny,
9
+ * through the ordinary approval call with the held id,
10
+ * runtime/shared/held-request-host.mjs) or the run is cancelled (Stop, abort,
11
+ * app quit), which denies it. It never expires on a timer.
10
12
  *
11
13
  * Importing this module installs the unattended port of human-gate/gate.mjs.
12
14
  * Rooms: a room member session counts as unattended by its id; a surface that
@@ -23,20 +25,13 @@ import {
23
25
  } from '../runtime/agent/orchestrator/session/human-gate/gate.mjs';
24
26
  import { normalizeHumanResponse } from '../runtime/agent/orchestrator/session/human-gate/requests.mjs';
25
27
  import { normalizeHeldRequest } from '../runtime/agent/orchestrator/session/human-gate/held-message.mjs';
28
+ import { delegationOf } from '../runtime/agent/orchestrator/session/human-gate/delegation.mjs';
26
29
  import {
27
30
  notifyHeldRequest,
28
31
  recordRunOwner,
29
32
  registerHeldRequestResolver,
30
33
  } from '../runtime/shared/held-request-host.mjs';
31
34
 
32
- /** Default expiry; MIXDOG_HELD_REQUEST_EXPIRY_MS overrides it. */
33
- export const HELD_REQUEST_EXPIRY_MS = 5 * 60_000;
34
-
35
- function configuredExpiryMs() {
36
- const value = Number(process.env.MIXDOG_HELD_REQUEST_EXPIRY_MS);
37
- return Number.isFinite(value) && value > 0 ? value : HELD_REQUEST_EXPIRY_MS;
38
- }
39
-
40
35
  const runs = new Map(); // sessionId → { kind, agentId, name }
41
36
 
42
37
  /** Mark `sessionId` as an unattended schedule/webhook run of `agentId`. */
@@ -54,12 +49,28 @@ export function markUnattendedRun(sessionId, { kind, agentId, name = '' }) {
54
49
  };
55
50
  }
56
51
 
57
- /** The unattended run `sessionId` belongs to, or null for an attended session. */
52
+ /** The unattended run `sessionId` belongs to, or null for an attended session.
53
+ * Work delegated from a run or a room (a sub-agent at any depth, a task
54
+ * session the bot created) belongs to it by the origin recorded on its own
55
+ * session record when it was created (human-gate/delegation.mjs) — however
56
+ * long ago that run ended, across restarts: its approvals are held like the
57
+ * run's own. */
58
58
  export function unattendedRunOf(sessionId) {
59
59
  const run = runs.get(sessionId);
60
60
  if (run) return run;
61
61
  const member = roomMemberOfSession(sessionId);
62
- return member ? { kind: 'room', agentId: member.agentId, name: member.roomId } : null;
62
+ if (member) return { kind: 'room', agentId: member.agentId, name: member.roomId };
63
+ const delegation = delegationOf(sessionId);
64
+ if (delegation.state !== 'resolved') return null;
65
+ if (delegation.via === 'run') {
66
+ return {
67
+ kind: delegation.run.kind === 'webhook' ? 'webhook' : 'schedule',
68
+ agentId: delegation.rootAgentId,
69
+ name: String(delegation.run.name || ''),
70
+ };
71
+ }
72
+ const root = delegation.via === 'room' ? roomMemberOfSession(delegation.rootSessionId) : null;
73
+ return root ? { kind: 'room', agentId: root.agentId, name: root.roomId } : null;
63
74
  }
64
75
 
65
76
  /**
@@ -98,9 +109,7 @@ export function createHeldRequests({
98
109
  push = notifyHeldRequest,
99
110
  record = recordHumanDecision,
100
111
  agentName = defaultAgentName,
101
- expiryMs = configuredExpiryMs,
102
112
  runOf = unattendedRunOf,
103
- now = Date.now,
104
113
  log = (line) => process.stderr.write(`mixdog held-requests: ${line}\n`),
105
114
  }) {
106
115
  const pending = new Map();
@@ -113,7 +122,6 @@ export function createHeldRequests({
113
122
  const entry = pending.get(id);
114
123
  if (!entry) return false;
115
124
  pending.delete(id);
116
- clearTimeout(entry.timer);
117
125
  entry.release();
118
126
  void post(entry.agentId, { ...entry.held, status, ...(approval.device ? { device: approval.device } : {}) });
119
127
  void Promise.resolve()
@@ -123,11 +131,10 @@ export function createHeldRequests({
123
131
  return true;
124
132
  }
125
133
 
126
- /** Hold `request` (the approval hook's payload) until answered or expired. */
134
+ /** Hold `request` (the approval hook's payload) until answered or the run is cancelled. */
127
135
  function hold(request = {}, { signal } = {}) {
128
136
  const run = runOf(request.sessionId) || { kind: 'schedule', agentId: MIXY_AGENT_ID, name: '' };
129
137
  const id = `held_${randomUUID()}`;
130
- const ms = typeof expiryMs === 'function' ? expiryMs() : expiryMs;
131
138
  const held = normalizeHeldRequest({
132
139
  id,
133
140
  status: 'pending',
@@ -145,12 +152,13 @@ export function createHeldRequests({
145
152
  details: request.outbound?.details,
146
153
  }
147
154
  : {}),
148
- remember: request.remember || ['once'],
155
+ // An unattended run never remembers: its held row offers once only.
156
+ remember: ['once'],
149
157
  run: { kind: run.kind, name: run.name, sessionId: request.sessionId },
150
- expiresAt: now() + ms,
151
158
  });
152
- const shape = { kind: held.kind, outbound: request.outbound, remember: request.remember || ['once'] };
159
+ const shape = { kind: held.kind, outbound: request.outbound, remember: ['once'] };
153
160
  const gate = {
161
+ remember: ['once'],
154
162
  agentId: run.agentId,
155
163
  kind: held.kind,
156
164
  ...(held.action ? { action: held.action } : {}),
@@ -167,17 +175,7 @@ export function createHeldRequests({
167
175
  agentId: run.agentId,
168
176
  resolve,
169
177
  release: () => signal?.removeEventListener?.('abort', onAbort),
170
- timer: setTimeout(
171
- () =>
172
- settle(
173
- id,
174
- { ...normalizeHumanResponse(shape, false), reason: 'held request expired', timedOut: true },
175
- 'expired'
176
- ),
177
- ms
178
- ),
179
178
  };
180
- entry.timer.unref?.();
181
179
  pending.set(id, entry);
182
180
  void post(run.agentId, held);
183
181
  try {
@@ -219,6 +217,11 @@ function heldRequests() {
219
217
  return processHeld;
220
218
  }
221
219
 
220
+ /** The held requests still waiting for an answer (session bots reads them). */
221
+ export function pendingHeldRequests() {
222
+ return processHeld ? processHeld.pending() : [];
223
+ }
224
+
222
225
  /** Hold one request for its session's agent (rooms call this from their own hook). */
223
226
  export function holdApprovalRequest(request, options) {
224
227
  return heldRequests().hold(request, options);
@@ -6,6 +6,8 @@ import { executeTerminalTool } from '../../runtime/terminal-bridge/client.mjs';
6
6
  import { executeVisualizeTool } from '../../runtime/visualize-bridge/client.mjs';
7
7
  import { featureEnvOverride, moduleEnabled } from '../../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
8
8
  import { createCallerContextResolvers } from './caller-context.mjs';
9
+ import { unattendedApprovalPort } from '../../runtime/agent/orchestrator/session/human-gate/unattended-port.mjs';
10
+ import { isGrantedRun } from '../../runtime/agent/orchestrator/session/human-gate/run-policy.mjs';
9
11
 
10
12
  export function createBridgeToolHandlers({ rt }) {
11
13
  const { sessionIdFor, signalFor } = createCallerContextResolvers(rt);
@@ -19,9 +21,16 @@ export function createBridgeToolHandlers({ rt }) {
19
21
  if (environmentDisabled(callerCtx, 'MIXDOG_FEATURE_BROWSER')) {
20
22
  throw new Error('the browser tool is disabled in this environment');
21
23
  }
24
+ const sessionId = sessionIdFor(callerCtx);
25
+ const run = unattendedApprovalPort()?.runOf?.(sessionId);
22
26
  return await executeBrowserTool(args, {
23
27
  tool: name,
24
- sessionId: sessionIdFor(callerCtx),
28
+ sessionId,
29
+ // A schedule/webhook run never asks for form submits, posts or uploads;
30
+ // the bot that owns the run comes from the run's record, so its `block`
31
+ // applies whatever the display metadata says.
32
+ unattendedRun: isGrantedRun(run),
33
+ unattendedAgent: run?.agentId || '',
25
34
  turnId: callerCtx?.turnId || rt.session?.usageMetricsTurnId,
26
35
  signal: signalFor(callerCtx),
27
36
  });
@@ -1,6 +1,6 @@
1
1
  // Optional feature tools gated by settings for model-initiated calls: office,
2
2
  // media and tidy (each loaded on first use), and the setup tool.
3
- import { STANDALONE_DATA_DIR } from '../runtime-paths.mjs';
3
+ import { standaloneDataDir } from '../runtime-paths.mjs';
4
4
  import { createCallerContextResolvers } from './caller-context.mjs';
5
5
 
6
6
  export function createFeatureToolHandlers({ rt, setupTool, officeToolsEnabled, mediaToolEnabled, tidyToolEnabled }) {
@@ -17,7 +17,7 @@ export function createFeatureToolHandlers({ rt, setupTool, officeToolsEnabled, m
17
17
  const { executeOfficeTool } = await import('../../runtime/office/index.mjs');
18
18
  return await executeOfficeTool(args, {
19
19
  cwd: callerCwd,
20
- dataDir: STANDALONE_DATA_DIR,
20
+ dataDir: standaloneDataDir(),
21
21
  requestApproval: callerCtx?.toolApprovalHook,
22
22
  sessionId: callerCtx?.sessionId,
23
23
  toolCallId: callerCtx?.toolCallId,
@@ -7,17 +7,31 @@ import { applySessionSidebarChange } from '../../runtime/shared/session-sidebar-
7
7
  import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
8
8
  import { AGENT_MODE, resolveSessionMode } from '../../runtime/agent/orchestrator/session/agent-mode.mjs';
9
9
  import { agentIdOfHomeSession } from '../../runtime/agent/orchestrator/session/agent-home.mjs';
10
+ import { turnHopOf } from '../../runtime/shared/bot-hops.mjs';
10
11
  import { scheduleCallerScope } from '../services/schedule-access.mjs';
12
+ import { resolveHandoffAttachments, sessionRoots } from '../handoff-attachments.mjs';
11
13
 
12
14
  const USER_TITLE_ERROR = 'session: the user already titled this session; the title was not changed';
13
15
 
14
- /** The agent an attended agent conversation (an agent's home thread) acts as;
16
+ /** The agent an attended agent conversation (an agent's home thread, or its
17
+ * member session in a group room, where the user is present too) acts as;
15
18
  * '' for every other caller: delegated workers, coding sessions (task
16
19
  * sessions included) and unattended schedule/webhook runs. */
17
20
  function attendedAgentOf(session) {
18
21
  const { mode, agentId } = resolveSessionMode({ session });
19
22
  const { kind } = scheduleCallerScope(session);
20
- return mode === AGENT_MODE && (kind === 'human' || kind === 'agent') ? agentId : '';
23
+ return mode === AGENT_MODE && (kind === 'human' || kind === 'agent' || kind === 'room-member') ? agentId : '';
24
+ }
25
+
26
+ /** The caller's `attachments` as stored prompt parts, resolved against its own
27
+ * conversation and folders (handoff-attachments.mjs). */
28
+ function callerAttachmentParts(rt, args, callerCwd, surface) {
29
+ return resolveHandoffAttachments(args?.attachments, {
30
+ messages: rt.session?.messages,
31
+ roots: sessionRoots(rt.session, callerCwd),
32
+ cwd: callerCwd,
33
+ surface,
34
+ }).parts;
21
35
  }
22
36
 
23
37
  export function createWorkspaceToolHandlers({
@@ -77,12 +91,15 @@ export function createWorkspaceToolHandlers({
77
91
  const session = async (args, { callerCtx, callerCwd }) => {
78
92
  const action = clean(args?.action || (args?.path ? 'set-project' : 'status')).toLowerCase();
79
93
  const target = clean(args?.session_id);
80
- if (['list', 'read', 'send', 'cancel', 'delete', 'create'].includes(action) || (action === 'status' && target)) {
94
+ if (
95
+ ['list', 'bots', 'read', 'send', 'cancel', 'delete', 'create'].includes(action) ||
96
+ (action === 'status' && target)
97
+ ) {
81
98
  const callerSessionId = assertLead(action, callerCtx);
82
99
  const callerAgentId = attendedAgentOf(rt.session);
83
100
  if (action === 'create' && !callerAgentId) {
84
101
  throw new Error(
85
- 'session: create belongs to an agent conversation; delegated workers, coding task sessions and schedule/webhook runs cannot create task sessions'
102
+ 'session: create belongs to a bot conversation; delegated workers, agent task sessions and schedule/webhook runs cannot create agent task sessions'
86
103
  );
87
104
  }
88
105
  // A task session reaches its agent only through its reported result.
@@ -97,8 +114,24 @@ export function createWorkspaceToolHandlers({
97
114
  if (typeof executeSessionControl !== 'function') {
98
115
  throw new Error('session: cross-session control is unavailable in this runtime');
99
116
  }
117
+ const { attachments, ...rest } = args || {};
118
+ if (attachments !== undefined && action !== 'send' && action !== 'create') {
119
+ throw new Error(`session: attachments apply to send and create, not action=${action}`);
120
+ }
121
+ const attachmentParts = callerAttachmentParts(rt, args, callerCwd, 'session');
100
122
  return JSON.stringify(
101
- await executeSessionControl({ ...args, action }, { callerSessionId, callerAgentId, callerCwd })
123
+ await executeSessionControl(
124
+ { ...rest, action },
125
+ {
126
+ callerSessionId,
127
+ callerAgentId,
128
+ callerCwd,
129
+ ...(action === 'send' || action === 'create' ? { callerHop: turnHopOf(rt.session) } : {}),
130
+ // Which bots and sessions it may see (bot-status.mjs).
131
+ ...(action === 'bots' || action === 'list' ? { callerScope: scheduleCallerScope(rt.session) } : {}),
132
+ ...(attachmentParts.length ? { attachmentParts } : {}),
133
+ }
134
+ )
102
135
  );
103
136
  }
104
137
  if (target && target !== assertLead(action, callerCtx)) {
@@ -221,13 +254,19 @@ export function createWorkspaceToolHandlers({
221
254
  }),
222
255
  agent: async (args, { callerCtx, callerCwd }) => {
223
256
  const callerSessionId = callerCtx?.callerSessionId || rt.session?.id || null;
224
- return await agentTool.execute(args, {
257
+ // `attachmentParts` is never the model's to set: only the resolved
258
+ // `attachments` reach the agent's turn.
259
+ const { attachments, attachmentParts: _ignored, ...rest } = args || {};
260
+ const attachmentParts = callerAttachmentParts(rt, { attachments }, callerCwd, 'agent');
261
+ return await agentTool.execute(attachmentParts.length ? { ...rest, attachmentParts } : rest, {
225
262
  callerCwd,
226
263
  invocationSource: 'model-tool',
227
264
  callerSessionId,
228
265
  clientHostPid: callerCtx?.clientHostPid || rt.session?.clientHostPid || process.pid,
229
266
  signal: callerCtx?.signal,
230
267
  notifyFn: notifyFnForSession(callerSessionId),
268
+ // The jobs this call starts are recorded under it (agent-task-starts.mjs).
269
+ ...(callerCtx?.toolCallId ? { toolCallId: callerCtx.toolCallId } : {}),
231
270
  });
232
271
  },
233
272
  };
@@ -16,6 +16,10 @@ import {
16
16
  clean,
17
17
  } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
18
18
 
19
+ import {
20
+ incomingTailOf,
21
+ wantsIncomingTail,
22
+ } from '../../runtime/agent/orchestrator/session/store-summary-last-message.mjs';
19
23
  import { isRealTurnMessage } from '../../runtime/agent/orchestrator/session/compact/user-message-kind.mjs';
20
24
  import { realTurnCount as realTurnCountOf } from '../../runtime/agent/orchestrator/session/store-summary-fields.mjs';
21
25
 
@@ -44,6 +48,7 @@ function previewOf(s) {
44
48
  let preview = isSessionPreviewNoise(rawPreview) ? '' : cleanSessionPreview(rawPreview);
45
49
  let messageCount = Math.max(0, Number(s.messageCount) || 0);
46
50
  let realTurnCount = realTurnCountOf(s);
51
+ let incomingTail = Array.isArray(s.incomingTail) ? s.incomingTail : null;
47
52
  if (!preview && Array.isArray(s.messages)) {
48
53
  realTurnCount = s.messages.filter(isRealTurnMessage).length;
49
54
  const msgs = s.messages;
@@ -55,8 +60,9 @@ function previewOf(s) {
55
60
  .filter(Boolean);
56
61
  preview = userPreviews[0] || '';
57
62
  messageCount = msgs.filter((m) => m && (m.role === 'user' || m.role === 'assistant')).length;
63
+ if (wantsIncomingTail(s.id)) incomingTail = incomingTailOf(msgs);
58
64
  }
59
- return { preview, messageCount, realTurnCount };
65
+ return { preview, messageCount, realTurnCount, incomingTail };
60
66
  }
61
67
 
62
68
  /** `working`: this session's turn is running in the daemon right now. */
@@ -70,7 +76,7 @@ export function leadSessionRow(s, working = false) {
70
76
  // One-shot `mixdog exec` runs are never resumable conversations.
71
77
  if (sourceType === 'exec') return null;
72
78
  if (!agentSession && !isLeadShaped(s, owner, sourceType)) return null;
73
- const { preview, messageCount, realTurnCount } = previewOf(s);
79
+ const { preview, messageCount, realTurnCount, incomingTail } = previewOf(s);
74
80
  if (!preview && messageCount === 0) return null;
75
81
  const lastMessageRoutine = normalizeRoutineProvenance(s.lastMessageRoutine);
76
82
  return {
@@ -95,6 +101,10 @@ export function leadSessionRow(s, working = false) {
95
101
  model: s.model,
96
102
  provider: s.provider,
97
103
  messageCount,
104
+ // Where the messages that arrived (not the user's own, not tool calls)
105
+ // sit among the counted ones: a bot row's unread pill counts those past
106
+ // the read cursor. Absent when unknown; clients then show one.
107
+ ...(incomingTail ? { incomingTail } : {}),
98
108
  title: cleanSessionPreview(s.title || '', 100),
99
109
  preview,
100
110
  // The latest user or assistant line (an agent contact's row shows it).
@@ -8,6 +8,7 @@
8
8
  import { SessionClosedError } from '../../runtime/agent/orchestrator/session/manager/session-errors.mjs';
9
9
  import { forgetSessionSaveBaseline } from '../../runtime/agent/orchestrator/session/store/save-worker.mjs';
10
10
  import { flushAllIndexWrites } from '../services/agent-tool/index-write-queue.mjs';
11
+ import { PROCESS_RESTART_FAILURE } from '../services/agent-tool/worker-index/row-liveness.mjs';
11
12
  import { unregisterLiveSession } from '../../runtime/shared/staged-update.mjs';
12
13
  import { abortRuntime, closeCanonicalSession, closeOwnSession, dispatchSessionEnd } from './teardown/session-close.mjs';
13
14
  import { settleAll, settleDetached, startRuntimeStops, startWorkStops } from './teardown/runtime-stops.mjs';
@@ -111,11 +112,14 @@ export function createTeardown(deps, { ingestSessionIntoMemory, closeSurfaceSess
111
112
  function reapWork(reason, scope) {
112
113
  if (!scope.teardownReapsWork) return;
113
114
  try {
114
- // A task that dies for a reason its owner never asked for must still be reported.
115
+ // A task that dies for a reason its owner never asked for must still be
116
+ // reported: now for a scoped close; for a process exit (its owner is
117
+ // closing too) by the next process, which tells the owner of each agent
118
+ // turn the exit cut off (agent-tool restart-notify).
115
119
  cancelBackgroundTasks(
116
120
  scope.scopedTeardown
117
121
  ? { reason, notify: true, executionSessionId: scope.closingSessionId }
118
- : { reason, notify: false }
122
+ : { reason, notify: false, terminalReason: PROCESS_RESTART_FAILURE }
119
123
  );
120
124
  } catch {}
121
125
  }
@@ -204,7 +208,11 @@ export function createTeardown(deps, { ingestSessionIntoMemory, closeSurfaceSess
204
208
  const settled = () => {
205
209
  outstandingCloses.delete(closing);
206
210
  };
207
- closing = new Promise((resolve) => resolve(agentTool.closeAll(reason, {}))).then(settled, settled);
211
+ // processExit: the workers close, their rows stay for the next process.
212
+ closing = new Promise((resolve) => resolve(agentTool.closeAll(reason, { processExit: true }))).then(
213
+ settled,
214
+ settled
215
+ );
208
216
  outstandingCloses.add(closing);
209
217
  try {
210
218
  await withTeardownDeadline(closing, CLOSE_ALL_DEADLINE_MS, false);