@bastani/atomic 0.9.13-alpha.2 → 0.9.13-alpha.4

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 (317) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -1
  3. package/dist/builtin/i-have-adhd/package.json +1 -1
  4. package/dist/builtin/intercom/CHANGELOG.md +14 -0
  5. package/dist/builtin/intercom/README.md +12 -12
  6. package/dist/builtin/intercom/incoming-message-delivery.ts +1 -1
  7. package/dist/builtin/intercom/index.ts +1 -1
  8. package/dist/builtin/intercom/intercom-tool.ts +1 -1
  9. package/dist/builtin/intercom/intercom-utils.ts +3 -6
  10. package/dist/builtin/intercom/package.json +1 -1
  11. package/dist/builtin/intercom/result-renderers.ts +1 -1
  12. package/dist/builtin/intercom/session-target.ts +1 -15
  13. package/dist/builtin/intercom/skills/intercom/SKILL.md +6 -6
  14. package/dist/builtin/intercom/terminal-ordering-barrier.ts +2 -2
  15. package/dist/builtin/intercom/ui/inline-message.ts +7 -5
  16. package/dist/builtin/intercom/ui/session-list.ts +23 -10
  17. package/dist/builtin/mcp/package.json +1 -1
  18. package/dist/builtin/subagents/CHANGELOG.md +19 -0
  19. package/dist/builtin/subagents/README.md +29 -73
  20. package/dist/builtin/subagents/package.json +2 -2
  21. package/dist/builtin/subagents/prompts/parallel-cleanup.md +1 -1
  22. package/dist/builtin/subagents/prompts/parallel-review.md +1 -1
  23. package/dist/builtin/subagents/prompts/review-loop.md +2 -2
  24. package/dist/builtin/subagents/skills/subagent/SKILL.md +23 -59
  25. package/dist/builtin/subagents/skills/tmux/SKILL.md +1 -1
  26. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -3
  27. package/dist/builtin/subagents/src/extension/doctor.ts +2 -14
  28. package/dist/builtin/subagents/src/extension/fanout-child.ts +1 -17
  29. package/dist/builtin/subagents/src/extension/index.ts +9 -70
  30. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  31. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +2 -2
  32. package/dist/builtin/subagents/src/extension/schemas.ts +2 -8
  33. package/dist/builtin/subagents/src/extension/tool-description.ts +2 -3
  34. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +1 -1
  35. package/dist/builtin/subagents/src/intercom/result-intercom.ts +5 -46
  36. package/dist/builtin/subagents/src/runs/{background → foreground}/completion-notification.ts +2 -2
  37. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +25 -88
  38. package/dist/builtin/subagents/src/runs/{background → foreground}/notify.ts +5 -5
  39. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -28
  40. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +3 -0
  41. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +2 -0
  42. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +0 -5
  43. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +30 -20
  44. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +4 -4
  45. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +0 -13
  46. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +104 -48
  47. package/dist/builtin/subagents/src/runs/inprocess/index.ts +1 -1
  48. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +5 -5
  49. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +0 -7
  50. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +0 -10
  51. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +3 -108
  52. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +0 -4
  53. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  54. package/dist/builtin/subagents/src/shared/formatters.ts +3 -5
  55. package/dist/builtin/subagents/src/shared/model-resolution.ts +78 -0
  56. package/dist/builtin/subagents/src/shared/status-format.ts +4 -11
  57. package/dist/builtin/subagents/src/shared/types-config.ts +10 -9
  58. package/dist/builtin/subagents/src/shared/types-nested.ts +127 -0
  59. package/dist/builtin/subagents/src/shared/types-results.ts +2 -8
  60. package/dist/builtin/subagents/src/shared/types-runtime.ts +0 -9
  61. package/dist/builtin/subagents/src/shared/types.ts +1 -1
  62. package/dist/builtin/subagents/src/shared/utils.ts +1 -109
  63. package/dist/builtin/subagents/src/slash/slash-commands.ts +7 -17
  64. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -252
  65. package/dist/builtin/subagents/src/tui/render-layout.ts +4 -4
  66. package/dist/builtin/subagents/src/tui/render-result.ts +0 -9
  67. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -34
  68. package/dist/builtin/subagents/src/tui/render.ts +0 -2
  69. package/dist/builtin/web-access/package.json +1 -1
  70. package/dist/builtin/workflows/CHANGELOG.md +23 -0
  71. package/dist/builtin/workflows/README.md +3 -3
  72. package/dist/builtin/workflows/package.json +1 -1
  73. package/dist/builtin/workflows/src/durable/backend.ts +11 -0
  74. package/dist/builtin/workflows/src/durable/completed-catalog-stage-groups.ts +63 -25
  75. package/dist/builtin/workflows/src/durable/completed-catalog.ts +166 -25
  76. package/dist/builtin/workflows/src/durable/dbos-backend.ts +42 -24
  77. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +2 -1
  78. package/dist/builtin/workflows/src/durable/run-timing.ts +28 -7
  79. package/dist/builtin/workflows/src/durable/scoped-backend.ts +4 -0
  80. package/dist/builtin/workflows/src/durable/targeted-inspection.ts +110 -0
  81. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +2 -2
  82. package/dist/builtin/workflows/src/engine/runtime.ts +19 -2
  83. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +3 -0
  84. package/dist/builtin/workflows/src/extension/index.bundle.mjs +750 -168
  85. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +6 -0
  86. package/dist/builtin/workflows/src/extension/ui-surface.ts +4 -0
  87. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +6 -1
  88. package/dist/builtin/workflows/src/extension/workflow-targets.ts +18 -10
  89. package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +31 -16
  90. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +75 -3
  91. package/dist/builtin/workflows/src/extension/workflow-tool.ts +53 -6
  92. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +5 -1
  93. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +94 -60
  94. package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +1 -1
  95. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +7 -7
  96. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +25 -4
  97. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
  98. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +2 -0
  99. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +142 -4
  100. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +2 -0
  101. package/dist/builtin/workflows/src/runs/foreground/stage-session-heartbeat.ts +88 -0
  102. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +1 -0
  103. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +1 -0
  104. package/dist/builtin/workflows/src/tui/run-detail.ts +25 -12
  105. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +27 -8
  106. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +17 -1
  107. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +20 -3
  108. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +10 -1
  109. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +1 -0
  110. package/dist/core/agent-session-events.d.ts.map +1 -1
  111. package/dist/core/agent-session-events.js +22 -5
  112. package/dist/core/agent-session-events.js.map +1 -1
  113. package/dist/core/agent-session-export.d.ts.map +1 -1
  114. package/dist/core/agent-session-export.js +2 -1
  115. package/dist/core/agent-session-export.js.map +1 -1
  116. package/dist/core/agent-session-methods.d.ts +10 -4
  117. package/dist/core/agent-session-methods.d.ts.map +1 -1
  118. package/dist/core/agent-session-methods.js.map +1 -1
  119. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  120. package/dist/core/agent-session-prompt.js +68 -0
  121. package/dist/core/agent-session-prompt.js.map +1 -1
  122. package/dist/core/agent-session-queue-pause.d.ts.map +1 -1
  123. package/dist/core/agent-session-queue-pause.js +6 -0
  124. package/dist/core/agent-session-queue-pause.js.map +1 -1
  125. package/dist/core/agent-session-summary.d.ts +21 -0
  126. package/dist/core/agent-session-summary.d.ts.map +1 -0
  127. package/dist/core/agent-session-summary.js +156 -0
  128. package/dist/core/agent-session-summary.js.map +1 -0
  129. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  130. package/dist/core/agent-session-tool-registry.js +0 -4
  131. package/dist/core/agent-session-tool-registry.js.map +1 -1
  132. package/dist/core/agent-session-transfer.d.ts.map +1 -1
  133. package/dist/core/agent-session-transfer.js +0 -2
  134. package/dist/core/agent-session-transfer.js.map +1 -1
  135. package/dist/core/agent-session-tree.d.ts.map +1 -1
  136. package/dist/core/agent-session-tree.js +6 -0
  137. package/dist/core/agent-session-tree.js.map +1 -1
  138. package/dist/core/agent-session.d.ts +21 -3
  139. package/dist/core/agent-session.d.ts.map +1 -1
  140. package/dist/core/agent-session.js +22 -5
  141. package/dist/core/agent-session.js.map +1 -1
  142. package/dist/core/atomic-guide-command.js +2 -2
  143. package/dist/core/atomic-guide-command.js.map +1 -1
  144. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  145. package/dist/core/compaction/branch-summarization.js +1 -0
  146. package/dist/core/compaction/branch-summarization.js.map +1 -1
  147. package/dist/core/compaction/index.d.ts +1 -0
  148. package/dist/core/compaction/index.d.ts.map +1 -1
  149. package/dist/core/compaction/index.js +1 -0
  150. package/dist/core/compaction/index.js.map +1 -1
  151. package/dist/core/compaction/session-summarization.d.ts +41 -0
  152. package/dist/core/compaction/session-summarization.d.ts.map +1 -0
  153. package/dist/core/compaction/session-summarization.js +97 -0
  154. package/dist/core/compaction/session-summarization.js.map +1 -0
  155. package/dist/core/extensions/ui-types.d.ts +4 -0
  156. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  157. package/dist/core/extensions/ui-types.js.map +1 -1
  158. package/dist/core/keybindings.d.ts +0 -5
  159. package/dist/core/keybindings.d.ts.map +1 -1
  160. package/dist/core/keybindings.js +0 -2
  161. package/dist/core/keybindings.js.map +1 -1
  162. package/dist/core/session-manager-core.d.ts +3 -1
  163. package/dist/core/session-manager-core.d.ts.map +1 -1
  164. package/dist/core/session-manager-core.js +9 -1
  165. package/dist/core/session-manager-core.js.map +1 -1
  166. package/dist/core/session-manager-entries.d.ts +24 -1
  167. package/dist/core/session-manager-entries.d.ts.map +1 -1
  168. package/dist/core/session-manager-entries.js +48 -0
  169. package/dist/core/session-manager-entries.js.map +1 -1
  170. package/dist/core/session-manager-list.d.ts.map +1 -1
  171. package/dist/core/session-manager-list.js +10 -0
  172. package/dist/core/session-manager-list.js.map +1 -1
  173. package/dist/core/session-manager-types.d.ts +10 -1
  174. package/dist/core/session-manager-types.d.ts.map +1 -1
  175. package/dist/core/session-manager-types.js.map +1 -1
  176. package/dist/core/settings-manager-basic-accessors.d.ts +3 -0
  177. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  178. package/dist/core/settings-manager-basic-accessors.js +5 -0
  179. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +1 -1
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js.map +1 -1
  183. package/dist/core/settings-types.d.ts +4 -0
  184. package/dist/core/settings-types.d.ts.map +1 -1
  185. package/dist/core/settings-types.js.map +1 -1
  186. package/dist/core/slash-commands.js +2 -2
  187. package/dist/core/slash-commands.js.map +1 -1
  188. package/dist/core/tools/bash.d.ts +0 -15
  189. package/dist/core/tools/bash.d.ts.map +1 -1
  190. package/dist/core/tools/bash.js +3 -81
  191. package/dist/core/tools/bash.js.map +1 -1
  192. package/dist/core/tools/fetch-url.d.ts +12 -0
  193. package/dist/core/tools/fetch-url.d.ts.map +1 -1
  194. package/dist/core/tools/fetch-url.js +76 -10
  195. package/dist/core/tools/fetch-url.js.map +1 -1
  196. package/dist/core/tools/index.js +4 -4
  197. package/dist/core/tools/index.js.map +1 -1
  198. package/dist/core/tools/session-temp-dir.d.ts +2 -2
  199. package/dist/core/tools/session-temp-dir.d.ts.map +1 -1
  200. package/dist/core/tools/session-temp-dir.js +6 -7
  201. package/dist/core/tools/session-temp-dir.js.map +1 -1
  202. package/dist/core/usage-totals.js +1 -1
  203. package/dist/core/usage-totals.js.map +1 -1
  204. package/dist/index.d.ts +1 -1
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +1 -1
  207. package/dist/index.js.map +1 -1
  208. package/dist/modes/interactive/components/footer.js +1 -1
  209. package/dist/modes/interactive/components/footer.js.map +1 -1
  210. package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/host-session-picker.js +1 -0
  212. package/dist/modes/interactive/components/host-session-picker.js.map +1 -1
  213. package/dist/modes/interactive/components/index.d.ts +1 -0
  214. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/index.js +1 -0
  216. package/dist/modes/interactive/components/index.js.map +1 -1
  217. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
  218. package/dist/modes/interactive/components/session-selector-list.js +29 -4
  219. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  220. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  221. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  222. package/dist/modes/interactive/components/transcript-follow-indicator.d.ts +14 -0
  223. package/dist/modes/interactive/components/transcript-follow-indicator.d.ts.map +1 -0
  224. package/dist/modes/interactive/components/transcript-follow-indicator.js +36 -0
  225. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -0
  226. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  227. package/dist/modes/interactive/components/tree-selector-content.js +6 -0
  228. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  229. package/dist/modes/interactive/interactive-extension-custom-ui.js +3 -0
  230. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  231. package/dist/modes/interactive/interactive-input-handling.js +0 -3
  232. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  233. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  234. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  235. package/dist/modes/interactive/interactive-mode-base.js +7 -1
  236. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  237. package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -3
  238. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  239. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  240. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  241. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  242. package/dist/modes/interactive/interactive-mode.js +1 -0
  243. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  244. package/dist/modes/interactive/interactive-slash-commands.js +2 -5
  245. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  246. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  247. package/dist/modes/interactive/interactive-startup.js +6 -0
  248. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  249. package/dist/modes/interactive/interactive-transcript-follow.d.ts +2 -0
  250. package/dist/modes/interactive/interactive-transcript-follow.d.ts.map +1 -0
  251. package/dist/modes/interactive/interactive-transcript-follow.js +6 -0
  252. package/dist/modes/interactive/interactive-transcript-follow.js.map +1 -0
  253. package/dist/modes/interactive/interactive-tui.d.ts +13 -1
  254. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  255. package/dist/modes/interactive/interactive-tui.js +59 -1
  256. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  257. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
  258. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  259. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  260. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  261. package/dist/modes/interactive-engine/protocol.d.ts +1 -0
  262. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  263. package/dist/modes/interactive-engine/protocol.js +5 -1
  264. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  265. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  266. package/dist/modes/interactive-engine/remote-component.js +21 -9
  267. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  268. package/docs/environment-variables.md +1 -1
  269. package/docs/intercom.md +20 -21
  270. package/docs/keybindings.md +2 -5
  271. package/docs/quickstart.md +5 -1
  272. package/docs/sdk.md +1 -1
  273. package/docs/session-format.md +15 -0
  274. package/docs/sessions.md +8 -0
  275. package/docs/settings.md +6 -0
  276. package/docs/subagents.md +19 -31
  277. package/docs/tools.md +3 -5
  278. package/docs/usage.md +3 -1
  279. package/docs/windows.md +1 -1
  280. package/docs/workflows.md +60 -32
  281. package/npm-shrinkwrap.json +29 -29
  282. package/package.json +2 -2
  283. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +0 -331
  284. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +0 -161
  285. package/dist/builtin/subagents/src/runs/inprocess/background-single.ts +0 -195
  286. package/dist/builtin/subagents/src/runs/inprocess/background.ts +0 -90
  287. package/dist/builtin/subagents/src/shared/types-async.ts +0 -247
  288. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +0 -217
  289. package/dist/builtin/subagents/src/tui/render-widget.ts +0 -366
  290. package/dist/core/async/format.d.ts +0 -3
  291. package/dist/core/async/format.d.ts.map +0 -1
  292. package/dist/core/async/format.js +0 -52
  293. package/dist/core/async/format.js.map +0 -1
  294. package/dist/core/async/job-manager.d.ts +0 -40
  295. package/dist/core/async/job-manager.d.ts.map +0 -1
  296. package/dist/core/async/job-manager.js +0 -293
  297. package/dist/core/async/job-manager.js.map +0 -1
  298. package/dist/core/async/session-manager.d.ts +0 -16
  299. package/dist/core/async/session-manager.d.ts.map +0 -1
  300. package/dist/core/async/session-manager.js +0 -34
  301. package/dist/core/async/session-manager.js.map +0 -1
  302. package/dist/core/async/types.d.ts +0 -23
  303. package/dist/core/async/types.d.ts.map +0 -1
  304. package/dist/core/async/types.js +0 -2
  305. package/dist/core/async/types.js.map +0 -1
  306. package/dist/core/tools/bash-async-execution.d.ts +0 -27
  307. package/dist/core/tools/bash-async-execution.d.ts.map +0 -1
  308. package/dist/core/tools/bash-async-execution.js +0 -81
  309. package/dist/core/tools/bash-async-execution.js.map +0 -1
  310. package/dist/core/tools/bash-async-jobs.d.ts +0 -30
  311. package/dist/core/tools/bash-async-jobs.d.ts.map +0 -1
  312. package/dist/core/tools/bash-async-jobs.js +0 -87
  313. package/dist/core/tools/bash-async-jobs.js.map +0 -1
  314. package/dist/core/tools/bash-async-output.d.ts +0 -13
  315. package/dist/core/tools/bash-async-output.d.ts.map +0 -1
  316. package/dist/core/tools/bash-async-output.js +0 -122
  317. package/dist/core/tools/bash-async-output.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,36 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.13-alpha.4] - 2026-08-13
6
+
7
+ ### Added
8
+
9
+ - Added a clickable, centered jump-to-bottom indicator above the fullscreen input dock when the transcript is scrolled away from the live end; it displays the live `tui.altScreen.bottom` key binding and supports mouse activation ([#2361](https://github.com/bastani-inc/atomic/issues/2361)).
10
+
11
+ ### Removed
12
+
13
+ - Removed the Ctrl+X shortcut for copying the last agent message; the `/copy` slash command still copies the last agent message to the clipboard and confirms in the status line.
14
+
15
+ ### Fixed
16
+
17
+ - Fixed a stall where a message queued during a turn was shown in the transcript but never answered, leaving the session idle until you typed another message. Escape and Ctrl+C hold queued work by pausing the agent's own steering and follow-up queues, but a message the agent loop has already polled is no longer in either queue: it is written straight into the transcript, so the interrupt cancelled its reply and nothing scheduled a new one. This was most visible after answering an `ask_user_question` questionnaire, which admits the queued message and immediately opens the request the interrupt then cancels. An admitted message whose reply was cancelled before it produced any output now receives that reply, and a message you send while that reply is still streaming is delivered as soon as it finishes. Queued messages that are still held are unchanged: Escape still restores them to the editor and leaves the session paused, and a reply that had already streamed some output is never restarted ([#2362](https://github.com/bastani-inc/atomic/issues/2362)).
18
+ - Fixed isolated overlay components such as workflow stage chat failing to re-render after a terminal height change, which could clip the composer and footer after a vertical resize.
19
+ - Fixed OSC-8 jump-to-bottom activation to let the focused workflow overlay claim its own transcript jump before falling back to the host transcript ([#2370](https://github.com/bastani-inc/atomic/issues/2370)).
20
+
21
+ ## [0.9.13-alpha.3] - 2026-08-13
22
+
23
+ ### Breaking Changes
24
+
25
+ - The `bash` tool no longer accepts its `async` parameter, and the `__atomic_bash_job` and `__atomic_bash_job_cancel` polling and cancellation commands have been removed. Drop `async` from bash calls; run long-lived commands in a separate shell or process manager instead.
26
+
27
+ ### Added
28
+
29
+ - Added generated session summaries to the resume picker, so `/resume` and `atomic -r` show what a conversation was about in a dedicated summary column beside the session name or first message. Atomic writes a one-line summary once the agent goes idle, reusing the session's existing model, credentials, stream function, and retry policy with a dedicated one-line prompt and no reasoning request; the stored line has its whitespace collapsed and length clamped so a long response cannot break picker layout. Each summary is persisted as a `session_summary` session entry anchored to the last user/assistant message it describes, and the picker shows it only while that message is still the newest one — a later message, or a later branch summary, retires it and the summary column shows "No summary available." instead, exactly as it does when a summary has not been generated, has failed, or is still in flight; the session name and first message are never displaced. Summaries are matched by picker search, and their token usage is counted toward session usage totals and the footer. Generation is best-effort and invisible: it is skipped for very short sessions, workflow stage sessions, and `--print`/JSON modes, it never blocks or delays a turn, it is cancelled when the next prompt starts or the session shuts down, and a slow request that outlives the conversation discards its own result rather than persisting a stale summary. Set `sessionSummary.enabled` to `false` to disable it ([#1033](https://github.com/bastani-inc/atomic/issues/1033)).
30
+
31
+ ### Removed
32
+
33
+ - Removed background bash jobs and the `async` parameter from the `bash` tool. Bash commands now always run in the foreground; use a separate shell or process manager when a command must outlive the tool call. Polling and cancellation commands and automatic completion follow-ups are no longer available.
34
+
5
35
  ## [0.9.13-alpha.2] - 2026-08-12
6
36
 
7
37
  ### Breaking Changes
package/README.md CHANGED
@@ -483,7 +483,7 @@ Atomic is aggressively extensible so it does not have to dictate your workflow.
483
483
 
484
484
  **Composable planning and task tracking.** Use the bundled workflow/subagent/todo capabilities, write plans to files, or install a package that matches your team's process.
485
485
 
486
- **No hidden background bash.** Use tmux or explicit extensions for background work. Full observability, direct interaction.
486
+ **Foreground bash only.** Use tmux or explicit extensions for background work. Full observability, direct interaction.
487
487
 
488
488
  Upstream Pi's minimal-core rationale is documented in the [original blog post](https://mariozechner.at/posts/2025-11-30-pi-coding-agent/); Atomic preserves the extensibility model while also bundling first-party capabilities for common workflows.
489
489
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/i-have-adhd",
3
- "version": "0.9.13-alpha.2",
3
+ "version": "0.9.13-alpha.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension that shapes responses for readers with ADHD. Fork of: https://github.com/ayghri/i-have-adhd",
6
6
  "contributors": [
@@ -4,6 +4,20 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.13-alpha.3] - 2026-08-13
8
+
9
+ ### Breaking Changes
10
+
11
+ - Removed unique-ID-prefix targeting. `send`, `ask`, and `reply` now accept only an exact full session ID or an exact case-insensitive session name.
12
+
13
+ ### Changed
14
+
15
+ - Intercom now displays full session and message IDs everywhere: list rows, the session-list overlay, inbound message headers, reply-to lines, message-id result badges, and unnamed-session `subagent-chat-<id>` aliases.
16
+
17
+ ### Fixed
18
+
19
+ - Fixed the session-list overlay clipping full session IDs at narrow terminal widths by wrapping IDs onto dim rows and marking unavoidable truncation with a visible ellipsis; inline sender and reply-to IDs now also signal overflow.
20
+
7
21
  ## [0.9.13-alpha.2] - 2026-08-12
8
22
 
9
23
  ### Changed
@@ -58,7 +58,7 @@ A session becomes intercom-connected when all of these are true:
58
58
 
59
59
  The session list only shows intercom-connected sessions, not every open Pi process on the machine.
60
60
 
61
- If a session is unnamed, intercom exposes a runtime-only fallback alias like `subagent-chat-1a2b3c4d` so other sessions can still target it. That alias is not persisted as the session title, so resume pickers can keep showing the transcript snippet instead of a generic `session-...` name.
61
+ If a session is unnamed, intercom exposes a runtime-only fallback alias like `subagent-chat-1a2b3c4d-1111-4222-8333-123456789abc` so other sessions can still target it. That alias is not persisted as the session title, so resume pickers can keep showing the transcript snippet instead of a generic `session-...` name.
62
62
 
63
63
  ## Quick Start
64
64
 
@@ -78,9 +78,9 @@ The agent can list sessions and send messages using the `intercom` tool. Tool ca
78
78
  // List active sessions
79
79
  intercom({ action: "list" })
80
80
  // → **Current session:**
81
- // → • executor (20d43841) — ~/projects/api (claude-sonnet-4) [self, idle]
81
+ // → • executor (20d43841-1111-4222-8333-123456789abc) — ~/projects/api (claude-sonnet-4) [self, idle]
82
82
  // → **Other sessions:**
83
- // → • research (6332faab) — ~/projects/api (claude-sonnet-4) [same cwd, thinking]
83
+ // → • research (6332faab-1111-4222-8333-123456789abc) — ~/projects/api (claude-sonnet-4) [same cwd, thinking]
84
84
 
85
85
  // Join a named group (it is created if no session is there yet)
86
86
  intercom({ action: "join", group: "api-review" })
@@ -94,12 +94,12 @@ intercom({ action: "leave" })
94
94
  intercom({ action: "send", to: "research", message: "Check if UserService.validate() handles null" })
95
95
  // → Message sent to research
96
96
 
97
- // The short ID printed by list is also a valid target
98
- intercom({ action: "ask", to: "6332faab", message: "Which validation path should I use?" })
97
+ // The full session ID printed by list is also a valid target
98
+ intercom({ action: "ask", to: "6332faab-1111-4222-8333-123456789abc", message: "Which validation path should I use?" })
99
99
 
100
100
  // Check connection status
101
101
  intercom({ action: "status" })
102
- // → Connected: Yes, Session ID: abc123, Active sessions: 3
102
+ // → Connected: Yes, Session ID: abc12345-1111-4222-8333-123456789abc, Active sessions: 3
103
103
 
104
104
  // Send with attachments (code snippets, files, or context)
105
105
  intercom({
@@ -134,7 +134,7 @@ When a blocking `intercom.ask` targets a workflow stage that has already complet
134
134
 
135
135
  When a blocking ask reaches a sibling workflow stage during an active model/tool turn, the target reserves it synchronously in the open stage generation before any asynchronous foreground-owner detach handshake. Queue insertion waits inside that reservation, and stage finalization drains it before publishing the terminal snapshot. This prevents a structured-output or other terminal tool call from overtaking a mid-turn ask. If destination-side admission genuinely cannot complete, the asker receives an exact-thread actionable error instead of consuming the full 10-minute timeout.
136
136
 
137
- For delegated background children, queued messages and terminal lifecycle notices are ordered per child. Intercom claims the terminal child’s pre-terminal ordinary entries in FIFO order and atomically admits that prelude together with the paused, completed, or failed notice. A process-local companion bridge covers lazily loaded extensions whose event buses are distinct, while exact terminal-identity deduplication prevents double admission even when the successful terminal dispatch has no queued prelude. Failed dispatches remain retryable, and pause/resume/completion identities remain distinct. Other children’s entries remain independently queued, messages are not discarded, terminal admission does not wait for a separate model turn, and correlated ask replies still bypass unrelated queued sends.
137
+ For delegated children, queued messages and terminal lifecycle notices are ordered per child. Intercom claims the terminal child’s pre-terminal ordinary entries in FIFO order and atomically admits that prelude together with the paused, completed, or failed notice. A process-local companion bridge covers lazily loaded extensions whose event buses are distinct, while exact terminal-identity deduplication prevents double admission even when the successful terminal dispatch has no queued prelude. Failed dispatches remain retryable, and pause/resume/completion identities remain distinct. Other children’s entries remain independently queued, messages are not discarded, terminal admission does not wait for a separate model turn, and correlated ask replies still bypass unrelated queued sends.
138
138
 
139
139
  ## Workflow: Planner-Worker Coordination
140
140
 
@@ -244,7 +244,7 @@ This workflow uses Atomic's in-process subagent admission. When the runtime admi
244
244
 
245
245
  `contact_supervisor` is registered from the typed admission record. The record binds the supervisor target, canonical child identity, child index, session name, and broker-issued capability to the child session; these values are not inherited from environment variables. If the parent does not grant supervisor coordination, the session falls back to the regular `intercom` tool.
246
246
 
247
- The child identity remains stable across foreground continuation, `async: true`, interruption, and cold resume. Intercom detach uses the same in-process continuation as async work, so the jobs widget and terminal envelope retain one canonical path.
247
+ The child identity remains stable across foreground continuation, interruption, and cold resume. Intercom detach uses the same in-process continuation as foreground coordination, so the terminal envelope retains one canonical path.
248
248
 
249
249
  ### Three Reasons
250
250
 
@@ -334,7 +334,7 @@ The supervisor can reply with plain JSON or a fenced `json` block. If the reply
334
334
  | Parameter | Type | Description |
335
335
  |-----------|------|-------------|
336
336
  | `action` | string | `"list"`, `"join"`, `"leave"`, `"send"`, `"ask"`, `"reply"`, `"pending"`, or `"status"` |
337
- | `to` | string | Exact session name, exact full ID, or unique ID prefix (for send/ask, or to disambiguate reply) |
337
+ | `to` | string | Exact session name or exact full session ID (for send/ask, or targeted reply) |
338
338
  | `message` | string | Message text (for send/ask/reply) |
339
339
  | `attachments` | array | Optional `file`, `snippet`, or `context` attachments |
340
340
  | `replyTo` | string | Optional message ID for threading or replying to an `ask` |
@@ -362,15 +362,15 @@ Only registered in sessions where `pi-subagents` supplied the required child bri
362
362
 
363
363
  **`leave`** — Moves this session back to the resolved home group from session startup. It takes no `group` parameter.
364
364
 
365
- **`list`** — Returns the current session plus other active intercom-connected sessions with name, short ID, working directory, model, and live status. Every displayed short ID can be passed directly to `send`, `ask`, or targeted `reply`.
365
+ **`list`** — Returns the current session plus other active intercom-connected sessions with name, full session ID, working directory, model, and live status. Every displayed full session ID can be passed directly to `send`, `ask`, or targeted `reply`.
366
366
 
367
- Target lookup preserves exact full IDs and exact case-insensitive names, then accepts a unique session-ID prefix. If a prefix matches multiple sessions, Intercom reports every match and asks for a longer ID or exact name instead of guessing. Resolving a prefix to the current session still triggers the normal self-target rejection.
367
+ Target lookup accepts only an exact full session ID or an exact case-insensitive session name. Targeting is also **group-scoped** see [Groups](#groups) below.
368
368
 
369
369
  **`send`** — Sends a message to the specified session. By default it sends immediately, including in interactive sessions. Set `confirmSend: true` in config if you want a confirmation dialog for non-reply sends. Replies that include `replyTo` skip confirmation. Returns delivery confirmation.
370
370
 
371
371
  **`ask`** — Sends a message and waits for the recipient to reply (10-minute timeout). The reply is returned as the tool result. No confirmation dialog. Only one pending `ask` is allowed per session at a time; if several blocking requests race (parallel `ask` calls, or `ask` alongside `contact_supervisor`), one wins the reservation and each other call returns a normal "Already waiting for a reply" tool error without disturbing the pending ask. Use this when the agent needs the answer to continue working.
372
372
 
373
- **`reply`** — Replies to the current intercom-triggered message if there is one. Otherwise it falls back to the single unresolved inbound ask. If multiple asks are pending, pass an exact name, exact full ID, or unique ID prefix in `to`, or inspect them with `pending` first. Under the hood this is still a normal `send` with the exact `replyTo` value.
373
+ **`reply`** — Replies to the current intercom-triggered message if there is one. Otherwise it falls back to the single unresolved inbound ask. If multiple asks are pending, pass an exact name or exact full session ID in `to`, or inspect them with `pending` first. Under the hood this is still a normal `send` with the exact `replyTo` value.
374
374
 
375
375
  **`pending`** — Lists unresolved inbound asks with sender, message ID, elapsed time, and a short preview. Useful when replying after the original triggered turn.
376
376
 
@@ -38,7 +38,7 @@ export function createIncomingMessageSender(input: {
38
38
  }
39
39
 
40
40
  export function buildIncomingCustomMessage(entry: InboundMessageEntry) {
41
- const senderDisplay = entry.from.name || entry.from.id.slice(0, 8);
41
+ const senderDisplay = entry.from.name || entry.from.id;
42
42
  const replyInstruction = entry.replyCommand ? `\n\nTo reply, use the intercom tool: ${entry.replyCommand}` : "";
43
43
  return {
44
44
  customType: "intercom_message" as const,
@@ -424,7 +424,7 @@ Usage:
424
424
  promptSnippet: "Use to coordinate with other local agent sessions in your intercom group: list peers, send updates, ask for help, or check intercom connectivity. Groups are isolated; you can only message sessions in your own group.",
425
425
  parameters: Type.Object({
426
426
  action: Type.String({ description: "Action: 'list', 'join', 'leave', 'send', 'ask', 'reply', 'pending', or 'status'" }),
427
- to: Type.Optional(Type.String({ description: "Target session name or ID (for 'send', 'ask', or disambiguating 'reply')" })),
427
+ to: Type.Optional(Type.String({ description: "Exact session name or exact full session ID (for 'send', 'ask', or targeted 'reply')" })),
428
428
  message: Type.Optional(Type.String({ description: "Message to send (for 'send', 'ask', or 'reply' action)" })),
429
429
  attachments: Type.Optional(Type.Array(Type.Object({
430
430
  type: Type.Union([Type.Literal("file"), Type.Literal("snippet"), Type.Literal("context")]),
@@ -71,7 +71,7 @@ does not grant cross-group access: contact_supervisor is the only cross-group pa
71
71
  description: "Action: 'list', 'join', 'leave', 'send', 'ask', 'reply', 'pending', or 'status'",
72
72
  }),
73
73
  to: Type.Optional(Type.String({
74
- description: "Target session name or ID (for 'send', 'ask', or disambiguating 'reply')",
74
+ description: "Exact session name or exact full session ID (for 'send', 'ask', or targeted 'reply')",
75
75
  })),
76
76
  message: Type.Optional(Type.String({
77
77
  description: "Message to send (for 'send', 'ask', or 'reply' action)",
@@ -345,9 +345,6 @@ export function duplicateSessionNames(sessions: SessionInfo[]): Set<string> {
345
345
  .filter((name, index, names) => names.indexOf(name) !== index)
346
346
  );
347
347
  }
348
- function shortSessionId(sessionId: string): string {
349
- return sessionId.slice(0, 8);
350
- }
351
348
  export function parseSubagentIntercomPayload(payload: unknown): { to: string; message: string; requestId?: string } | null {
352
349
  if (typeof payload !== "object" || payload === null) {
353
350
  return null;
@@ -394,7 +391,7 @@ export function resolveIntercomPresenceName(sessionName: string | undefined, ses
394
391
  return trimmedName;
395
392
  }
396
393
  const normalizedSessionId = sessionId.startsWith("session-") ? sessionId.slice("session-".length) : sessionId;
397
- return `${DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX}-${normalizedSessionId.slice(0, 8)}`;
394
+ return `${DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX}-${normalizedSessionId}`;
398
395
  }
399
396
  export function buildPresenceIdentity(pi: ExtensionAPI, sessionId: string): { name: string } {
400
397
  return {
@@ -406,7 +403,7 @@ export function formatSessionLabel(session: SessionInfo, duplicates: Set<string>
406
403
  return session.id;
407
404
  }
408
405
  return duplicates.has(session.name.toLowerCase())
409
- ? `${session.name} (${shortSessionId(session.id)})`
406
+ ? `${session.name} (${session.id})`
410
407
  : session.name;
411
408
  }
412
409
  export function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean): string {
@@ -416,7 +413,7 @@ export function formatSessionListRow(session: SessionInfo, currentCwd: string, i
416
413
  const tags = [isSelf ? "self" : session.cwd === currentCwd ? "same cwd" : undefined, session.status, groupTag]
417
414
  .filter((tag): tag is string => Boolean(tag));
418
415
  const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
419
- return `• ${name} (${shortSessionId(session.id)}) — ${session.cwd} (${session.model})${suffix}`;
416
+ return `• ${name} (${session.id}) — ${session.cwd} (${session.model})${suffix}`;
420
417
  }
421
418
  export function previewText(value: unknown, maxLength = 72): string | undefined {
422
419
  if (typeof value !== "string") {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.13-alpha.2",
3
+ "version": "0.9.13-alpha.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
6
6
  "contributors": [
@@ -55,7 +55,7 @@ export const renderIntercomResult: ToolResultRenderer = (result, { isPartial },
55
55
  let text = failed ? theme.fg("error", "✗ ") : theme.fg("success", "✓ ");
56
56
  text += theme.fg(failed ? "error" : "text", firstTextContent(result));
57
57
  if (details?.messageId && !context.expanded) {
58
- text += theme.fg("dim", ` (${details.messageId.slice(0, 8)})`);
58
+ text += theme.fg("dim", ` (${details.messageId})`);
59
59
  }
60
60
  if (details?.reason && context.expanded) {
61
61
  text += "\n" + theme.fg("dim", `Reason: ${details.reason}`);
@@ -3,10 +3,9 @@ import type { SessionInfo } from "./types.js";
3
3
  export type SessionTargetResolution =
4
4
  | { kind: "resolved"; session: SessionInfo }
5
5
  | { kind: "ambiguous_name"; matches: readonly SessionInfo[] }
6
- | { kind: "ambiguous_prefix"; matches: readonly SessionInfo[] }
7
6
  | { kind: "not_found" };
8
7
 
9
- /** Resolve an Intercom session by exact ID, exact case-insensitive name, or unique ID prefix. */
8
+ /** Resolve an Intercom session by exact ID or exact case-insensitive name. */
10
9
  export function resolveSessionTarget(
11
10
  sessions: readonly SessionInfo[],
12
11
  nameOrId: string,
@@ -26,13 +25,6 @@ export function resolveSessionTarget(
26
25
  return { kind: "ambiguous_name", matches: exactNames };
27
26
  }
28
27
 
29
- const prefixedIds = sessions.filter((session) => session.id.startsWith(target));
30
- if (prefixedIds.length === 1) {
31
- return { kind: "resolved", session: prefixedIds[0]! };
32
- }
33
- if (prefixedIds.length > 1) {
34
- return { kind: "ambiguous_prefix", matches: prefixedIds };
35
- }
36
28
  return { kind: "not_found" };
37
29
  }
38
30
 
@@ -43,12 +35,6 @@ export function sessionTargetFailureReason(
43
35
  if (resolution.kind === "ambiguous_name") {
44
36
  return `Multiple sessions named "${target}" are connected. Use the session ID instead.`;
45
37
  }
46
- if (resolution.kind === "ambiguous_prefix") {
47
- const labels = resolution.matches
48
- .map((session) => `${session.name ?? "Unnamed session"} (${session.id})`)
49
- .join(", ");
50
- return `Ambiguous session ID prefix "${target}" matches: ${labels}. Use a longer ID or an exact session name.`;
51
- }
52
38
  return "Session not found";
53
39
  }
54
40
 
@@ -67,15 +67,15 @@ intercom({
67
67
 
68
68
  ### Pattern 2: Quick Status Check
69
69
 
70
- Before sending, verify who's connected. The short ID printed by `list` is directly usable by `send`, `ask`, and targeted `reply`:
70
+ Before sending, verify who's connected. The full session ID printed by `list` is directly usable by `send`, `ask`, and targeted `reply`:
71
71
 
72
72
  ```typescript
73
73
  intercom({ action: "list" })
74
- // → • planner (6332faab) — /workspace (model) [idle]
75
- intercom({ action: "ask", to: "6332faab", message: "Which option should I use?" })
74
+ // → • planner (6332faab-1111-4222-8333-123456789abc) — /workspace (model) [idle]
75
+ intercom({ action: "ask", to: "6332faab-1111-4222-8333-123456789abc", message: "Which option should I use?" })
76
76
  ```
77
77
 
78
- Intercom resolves exact full IDs first, exact case-insensitive names second, and unique ID prefixes last. A colliding prefix returns an ambiguity error; use a longer displayed ID or an exact name rather than guessing.
78
+ Intercom accepts only an exact full session ID or an exact case-insensitive session name. Use the full ID printed by `list` or the session's exact name.
79
79
 
80
80
  ### Runtime named groups
81
81
 
@@ -230,9 +230,9 @@ In Atomic workflows, each invocation has its own Intercom group, and parallel st
230
230
  | `leave` | Returns to the resolved home group | Restore the session's startup group |
231
231
  | `send` | Fire-and-forget | You don't need a response |
232
232
  | `ask` | Blocks until reply (10 min timeout) | You need an answer to continue |
233
- | `reply` | Responds to the active or pending inbound ask; `to` accepts a displayed short ID | You were asked something and need to answer naturally |
233
+ | `reply` | Responds to the active or pending inbound ask; `to` accepts an exact full session ID or exact session name | You were asked something and need to answer naturally |
234
234
  | `pending` | Lists unresolved inbound asks | You need to see who is waiting before replying |
235
- | `list` | Returns all sessions in the current group with actionable short IDs and live status | You need to discover targets or choose an idle peer |
235
+ | `list` | Returns all sessions in the current group with full session IDs and live status | You need to discover targets or choose an idle peer |
236
236
  | `status` | Returns your connection state and current group | Troubleshooting |
237
237
 
238
238
  Inside workflows, `ask` may target a sibling stage that has already completed. If that stage retains a valid conversation, Atomic automatically schedules a post-mortem turn there and preserves the exact child-to-child reply thread; do not send a separate workflow follow-up. Missing, deleted, non-resumable, or failed-to-reopen completed targets return an actionable error. A parent or unrelated session cannot satisfy the pending ask.
@@ -20,7 +20,7 @@ export interface TerminalOrderingBarrier {
20
20
  runId: string;
21
21
  terminalId: string;
22
22
  terminalAt: number;
23
- source: "background-notify" | "result-relay";
23
+ source: "detached-notify" | "result-relay";
24
24
  owner?: object;
25
25
  sourceSessionTargets: string[];
26
26
  dispatch?(prefix: OrderedTerminalPreludeMessage[]): unknown;
@@ -39,7 +39,7 @@ function parseBarrier(value: unknown): TerminalOrderingBarrier | null {
39
39
  const record = value as Record<string, unknown>;
40
40
  if (typeof record.runId !== "string" || !record.runId) return null;
41
41
  if (typeof record.terminalAt !== "number" || !Number.isFinite(record.terminalAt)) return null;
42
- if (record.source !== "background-notify" && record.source !== "result-relay") return null;
42
+ if (record.source !== "detached-notify" && record.source !== "result-relay") return null;
43
43
  if (!Array.isArray(record.sourceSessionTargets)) return null;
44
44
  const sourceSessionTargets = record.sourceSessionTargets
45
45
  .filter((target): target is string => typeof target === "string")
@@ -24,13 +24,14 @@ export class InlineMessageComponent implements Component {
24
24
  const lines: string[] = [];
25
25
  const borderChar = "─";
26
26
  if (width < 3) {
27
- return [truncateToWidth(`From ${this.from.name || this.from.id.slice(0, 8)}`, width)];
27
+ return [truncateToWidth(`From ${this.from.name || this.from.id}`, width)];
28
28
  }
29
29
  const bodyWidth = Math.max(1, width - 2);
30
30
 
31
- const senderName = this.from.name || this.from.id.slice(0, 8);
31
+ const senderName = this.from.name || this.from.id;
32
32
  const header = ` 📨 From: ${senderName} (${this.from.cwd}) `;
33
- const headerText = truncateToWidth(header, bodyWidth, "");
33
+ // An empty ellipsis silently clips full sender IDs; keep header overflow visible.
34
+ const headerText = truncateToWidth(header, bodyWidth, "…");
34
35
  const headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));
35
36
  lines.push(this.theme.fg("accent", `╭${headerText}${borderChar.repeat(headerPadding)}╮`));
36
37
 
@@ -63,8 +64,9 @@ export class InlineMessageComponent implements Component {
63
64
 
64
65
  if (this.message.replyTo && !this.message.expectsReply) {
65
66
  lines.push(this.theme.fg("accent", `│${" ".repeat(bodyWidth)}│`));
66
- const reply = this.theme.fg("dim", ` Reply to ${this.message.replyTo.slice(0, 8)}`);
67
- const text = truncateToWidth(reply, bodyWidth, "");
67
+ // An empty ellipsis silently clips full reply-to IDs; keep overflow visible.
68
+ const reply = this.theme.fg("dim", ` ↳ Reply to ${this.message.replyTo}`);
69
+ const text = truncateToWidth(reply, bodyWidth, "…");
68
70
  const padding = Math.max(0, bodyWidth - visibleWidth(text));
69
71
  lines.push(this.theme.fg("accent", `│${text}${" ".repeat(padding)}│`));
70
72
  }
@@ -46,17 +46,23 @@ function middleTruncate(text: string, maxWidth: number): string {
46
46
 
47
47
  return truncateToWidth(`${left}…${right}`, maxWidth, "");
48
48
  }
49
-
50
- function shortSessionId(sessionId: string): string {
51
- return sessionId.slice(0, 8);
52
- }
53
-
54
- function sessionTitle(session: SessionInfo, options?: { self?: boolean; sameCwd?: boolean }): string {
49
+ function sessionTitleLines(
50
+ session: SessionInfo,
51
+ availableWidth: number,
52
+ options?: { self?: boolean; sameCwd?: boolean },
53
+ ): string[] {
55
54
  const name = session.name || "Unnamed session";
56
55
  const tags = [options?.self ? "self" : undefined, options?.sameCwd ? "same cwd" : undefined]
57
56
  .filter((tag): tag is string => Boolean(tag));
58
57
  const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
59
- return `${name} (${shortSessionId(session.id)})${suffix}`;
58
+ const title = `${name} (${session.id})${suffix}`;
59
+ if (visibleWidth(title) <= availableWidth) {
60
+ return [title];
61
+ }
62
+
63
+ const label = middleTruncate(`${name}${suffix}`, availableWidth);
64
+ const id = truncateToWidth(session.id, availableWidth, "…");
65
+ return [label, id];
60
66
  }
61
67
 
62
68
  export class SessionListOverlay implements Component {
@@ -135,7 +141,11 @@ export class SessionListOverlay implements Component {
135
141
  lines.push(row(this.theme.bold(" Current Session")));
136
142
  lines.push(border(`├${"─".repeat(contentWidth)}┤`));
137
143
  lines.push(row());
138
- lines.push(row(` ${this.theme.fg("dim", sessionTitle(this.currentSession, { self: true }))}`));
144
+ const currentTitleLines = sessionTitleLines(this.currentSession, Math.max(1, contentWidth - 2), { self: true });
145
+ lines.push(row(` ${this.theme.fg("dim", currentTitleLines[0])}`));
146
+ for (const idLine of currentTitleLines.slice(1)) {
147
+ lines.push(row(` ${this.theme.fg("dim", idLine)}`));
148
+ }
139
149
  lines.push(row(` ${this.theme.fg("dim", `${middleTruncate(this.currentSession.cwd, Math.max(8, contentWidth - 4))} • ${this.currentSession.model}`)}`));
140
150
  lines.push(row());
141
151
  lines.push(border(`├${"─".repeat(contentWidth)}┤`));
@@ -156,10 +166,13 @@ export class SessionListOverlay implements Component {
156
166
  const isSelected = index === this.selectedIndex;
157
167
  const sameCwd = session.cwd === this.currentSession.cwd;
158
168
  const prefix = isSelected ? this.theme.fg("accent", "→ ") : " ";
159
- const title = sessionTitle(session, { sameCwd });
169
+ const titleLines = sessionTitleLines(session, Math.max(1, contentWidth - 2), { sameCwd });
160
170
  const pathText = `${middleTruncate(session.cwd, Math.max(8, contentWidth - 4))} • ${session.model}`;
161
171
 
162
- lines.push(row(`${prefix}${isSelected ? this.theme.fg("accent", title) : title}`));
172
+ lines.push(row(`${prefix}${isSelected ? this.theme.fg("accent", titleLines[0]) : titleLines[0]}`));
173
+ for (const idLine of titleLines.slice(1)) {
174
+ lines.push(row(` ${this.theme.fg("dim", idLine)}`));
175
+ }
163
176
  lines.push(row(` ${this.theme.fg("dim", pathText)}`));
164
177
  if (index < endIndex - 1) {
165
178
  lines.push(row());
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.13-alpha.2",
3
+ "version": "0.9.13-alpha.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [
@@ -2,6 +2,25 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.13-alpha.3] - 2026-08-13
6
+
7
+ ### Breaking Changes
8
+
9
+ - The `subagent` tool no longer accepts `async: true`, `/run --bg` and related background slash flags are gone, and the `asyncByDefault` and `forceTopLevelAsync` settings have been removed. Remove those settings keys from user configuration; subagent calls now run in the foreground.
10
+
11
+ ### Changed
12
+
13
+ - Unnamed subagent sessions now expose runtime-only `subagent-chat-<full-id>` Intercom aliases so supervisor targeting uses the full session ID.
14
+
15
+ ### Fixed
16
+
17
+ - Fixed a fork-context subagent ignoring its agent's configured model. The selected model candidate was only ever a `provider/model[:thinking]` string, so nothing was handed to the child session's `model` argument and the session fell back to the model persisted in the session file — which, for a fork, is the parent's. A child declaring `openai-codex/gpt-5.6-luna:max` therefore ran every turn on the parent's model, and an explicit `model:` override lost its first attempt the same way. The selected candidate is now resolved against the model registry and applied to the child session, together with the thinking level carried in the candidate's suffix, for both fresh and fork contexts and across single, parallel, and resume paths. A candidate that names no usable model still starts the run instead of failing it.
18
+ - Fixed subagent progress and status lines stripping the provider prefix from the model name, so a child rendered as `claude-fable-5` where the main chat shows `anthropic/claude-fable-5`. The full model id is now displayed, including every segment of a routed id such as `openrouter/anthropic/claude-fable-5`; known thinking suffixes are still split off into the `thinking <level>` label.
19
+
20
+ ### Removed
21
+
22
+ - Removed subagent async/background execution and its process-era job, widget, schema, configuration, and slash-command surfaces. `subagent` calls and `/run` or `/parallel` now execute in the foreground and return their results directly; foreground Intercom coordination and resumable interrupt/resume controls remain available.
23
+
5
24
  ## [0.9.13-alpha.2] - 2026-08-12
6
25
 
7
26
  ### Breaking Changes