aimux-cli 0.1.16 → 0.1.19

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 (357) hide show
  1. package/README.md +184 -67
  2. package/bin/aimux-dev +10 -0
  3. package/dist/agent-events.js +0 -1
  4. package/dist/agent-output-parser.js +0 -1
  5. package/dist/agent-prompt-delivery.js +0 -1
  6. package/dist/agent-tracker.js +0 -1
  7. package/dist/agent-watcher.js +0 -1
  8. package/dist/alert-display.d.ts +21 -0
  9. package/dist/alert-display.js +85 -0
  10. package/dist/atomic-write.js +0 -1
  11. package/dist/attachment-store.d.ts +0 -7
  12. package/dist/attachment-store.js +2 -87
  13. package/dist/builtin-metadata-watchers.js +4 -5
  14. package/dist/claude-hooks.d.ts +1 -0
  15. package/dist/claude-hooks.js +25 -1
  16. package/dist/config.d.ts +19 -13
  17. package/dist/config.js +28 -15
  18. package/dist/connection-targets.d.ts +8 -0
  19. package/dist/connection-targets.js +27 -0
  20. package/dist/context/compactor.js +0 -1
  21. package/dist/context/context-bridge.js +0 -1
  22. package/dist/context/context-file.js +0 -1
  23. package/dist/context/history.js +0 -1
  24. package/dist/credentials.d.ts +12 -0
  25. package/dist/credentials.js +48 -0
  26. package/dist/daemon.d.ts +23 -0
  27. package/dist/daemon.js +391 -67
  28. package/dist/dashboard/command-spec.js +0 -1
  29. package/dist/dashboard/feedback.js +0 -1
  30. package/dist/dashboard/index.d.ts +13 -10
  31. package/dist/dashboard/index.js +3 -27
  32. package/dist/dashboard/operation-failures.js +0 -1
  33. package/dist/dashboard/order.d.ts +22 -0
  34. package/dist/dashboard/order.js +54 -0
  35. package/dist/dashboard/pending-actions.d.ts +39 -10
  36. package/dist/dashboard/pending-actions.js +166 -37
  37. package/dist/dashboard/quick-jump.d.ts +2 -1
  38. package/dist/dashboard/quick-jump.js +7 -5
  39. package/dist/dashboard/runtime-evidence.js +0 -1
  40. package/dist/dashboard/session-actions.d.ts +4 -4
  41. package/dist/dashboard/session-actions.js +1 -2
  42. package/dist/dashboard/session-registry.d.ts +4 -3
  43. package/dist/dashboard/session-registry.js +16 -51
  44. package/dist/dashboard/sort.js +0 -1
  45. package/dist/dashboard/state.d.ts +1 -1
  46. package/dist/dashboard/state.js +0 -1
  47. package/dist/dashboard/targets.js +0 -1
  48. package/dist/dashboard/ui-state-store.d.ts +16 -1
  49. package/dist/dashboard/ui-state-store.js +73 -3
  50. package/dist/debug-state.d.ts +97 -0
  51. package/dist/debug-state.js +540 -0
  52. package/dist/debug.d.ts +38 -0
  53. package/dist/debug.js +219 -16
  54. package/dist/default-plugins/gh-pr-context.d.ts +2 -1
  55. package/dist/default-plugins/gh-pr-context.js +17 -12
  56. package/dist/default-plugins/transcript-length.js +15 -3
  57. package/dist/fast-control.js +37 -20
  58. package/dist/hotkeys.js +0 -1
  59. package/dist/http-client.js +31 -3
  60. package/dist/key-parser.js +0 -1
  61. package/dist/last-used.js +0 -1
  62. package/dist/local-ui-server.d.ts +22 -0
  63. package/dist/local-ui-server.js +185 -0
  64. package/dist/login-flow.d.ts +7 -0
  65. package/dist/login-flow.js +119 -0
  66. package/dist/main.js +821 -152
  67. package/dist/managed-launch-env.js +14 -1
  68. package/dist/metadata-server.d.ts +36 -36
  69. package/dist/metadata-server.js +638 -138
  70. package/dist/metadata-store.d.ts +4 -1
  71. package/dist/metadata-store.js +30 -3
  72. package/dist/multiplexer/agent-io-methods.d.ts +2 -10
  73. package/dist/multiplexer/agent-io-methods.js +12 -44
  74. package/dist/multiplexer/archives.js +8 -10
  75. package/dist/multiplexer/dashboard-actions-methods.js +0 -1
  76. package/dist/multiplexer/dashboard-control.js +45 -14
  77. package/dist/multiplexer/dashboard-interaction.d.ts +8 -2
  78. package/dist/multiplexer/dashboard-interaction.js +187 -29
  79. package/dist/multiplexer/dashboard-model.d.ts +10 -3
  80. package/dist/multiplexer/dashboard-model.js +417 -36
  81. package/dist/multiplexer/dashboard-ops.d.ts +9 -7
  82. package/dist/multiplexer/dashboard-ops.js +178 -69
  83. package/dist/multiplexer/dashboard-state-methods.d.ts +2 -1
  84. package/dist/multiplexer/dashboard-state-methods.js +3 -3
  85. package/dist/multiplexer/dashboard-tail-methods.d.ts +22 -10
  86. package/dist/multiplexer/dashboard-tail-methods.js +164 -48
  87. package/dist/multiplexer/dashboard-view-methods.d.ts +1 -1
  88. package/dist/multiplexer/dashboard-view-methods.js +23 -9
  89. package/dist/multiplexer/graveyard-view-model.d.ts +9 -1
  90. package/dist/multiplexer/graveyard-view-model.js +39 -1
  91. package/dist/multiplexer/index.d.ts +15 -12
  92. package/dist/multiplexer/index.js +64 -44
  93. package/dist/multiplexer/navigation.js +0 -1
  94. package/dist/multiplexer/notifications.js +107 -25
  95. package/dist/multiplexer/persistence-methods.d.ts +31 -4
  96. package/dist/multiplexer/persistence-methods.js +304 -309
  97. package/dist/multiplexer/runtime-lifecycle-methods.d.ts +8 -10
  98. package/dist/multiplexer/runtime-lifecycle-methods.js +104 -87
  99. package/dist/multiplexer/runtime-state.d.ts +8 -10
  100. package/dist/multiplexer/runtime-state.js +82 -146
  101. package/dist/multiplexer/runtime-sync.d.ts +2 -10
  102. package/dist/multiplexer/runtime-sync.js +3 -19
  103. package/dist/multiplexer/service-state-snapshot.d.ts +2 -4
  104. package/dist/multiplexer/service-state-snapshot.js +4 -52
  105. package/dist/multiplexer/services.d.ts +1 -0
  106. package/dist/multiplexer/services.js +55 -6
  107. package/dist/multiplexer/session-capture.d.ts +1 -0
  108. package/dist/multiplexer/session-capture.js +23 -0
  109. package/dist/multiplexer/session-launch.d.ts +4 -1
  110. package/dist/multiplexer/session-launch.js +152 -64
  111. package/dist/multiplexer/session-runtime-core.d.ts +8 -20
  112. package/dist/multiplexer/session-runtime-core.js +40 -136
  113. package/dist/multiplexer/subscreens.js +10 -4
  114. package/dist/multiplexer/tool-picker.js +0 -1
  115. package/dist/multiplexer/worktree-graveyard.d.ts +0 -1
  116. package/dist/multiplexer/worktree-graveyard.js +15 -17
  117. package/dist/multiplexer/worktrees.js +96 -41
  118. package/dist/notification-context.js +8 -5
  119. package/dist/notifications.js +163 -102
  120. package/dist/notify.d.ts +4 -0
  121. package/dist/notify.js +14 -1
  122. package/dist/orchestration-actions.js +0 -1
  123. package/dist/orchestration-routing.js +0 -1
  124. package/dist/orchestration.js +0 -1
  125. package/dist/osc-notifications.js +0 -1
  126. package/dist/paths.d.ts +32 -7
  127. package/dist/paths.js +82 -59
  128. package/dist/pending-actions.d.ts +5 -0
  129. package/dist/pending-actions.js +13 -0
  130. package/dist/plugin-runtime.js +9 -3
  131. package/dist/project-events.d.ts +1 -10
  132. package/dist/project-events.js +0 -11
  133. package/dist/project-scanner.d.ts +2 -3
  134. package/dist/project-scanner.js +58 -130
  135. package/dist/project-service-manifest.d.ts +1 -3
  136. package/dist/project-service-manifest.js +1 -4
  137. package/dist/recency.js +0 -1
  138. package/dist/recorder.js +0 -1
  139. package/dist/relay-client.d.ts +30 -0
  140. package/dist/relay-client.js +190 -0
  141. package/dist/remote-access.d.ts +16 -0
  142. package/dist/remote-access.js +90 -0
  143. package/dist/runtime-core/exchange-derived.d.ts +2 -0
  144. package/dist/runtime-core/exchange-derived.js +153 -0
  145. package/dist/runtime-core/exchange-import.d.ts +24 -0
  146. package/dist/runtime-core/exchange-import.js +317 -0
  147. package/dist/runtime-core/exchange-store.d.ts +157 -0
  148. package/dist/runtime-core/exchange-store.js +452 -0
  149. package/dist/runtime-core/topology-services.d.ts +38 -0
  150. package/dist/runtime-core/topology-services.js +170 -0
  151. package/dist/runtime-core/topology-sessions.d.ts +52 -0
  152. package/dist/runtime-core/topology-sessions.js +238 -0
  153. package/dist/runtime-core/topology-store.d.ts +171 -0
  154. package/dist/runtime-core/topology-store.js +419 -0
  155. package/dist/runtime-core/topology-worktrees.d.ts +60 -0
  156. package/dist/runtime-core/topology-worktrees.js +199 -0
  157. package/dist/runtime-migration.d.ts +69 -0
  158. package/dist/runtime-migration.js +398 -0
  159. package/dist/session-bootstrap.d.ts +8 -6
  160. package/dist/session-bootstrap.js +51 -159
  161. package/dist/session-runtime.d.ts +2 -0
  162. package/dist/session-runtime.js +1 -1
  163. package/dist/session-semantics.d.ts +12 -4
  164. package/dist/session-semantics.js +14 -1
  165. package/dist/shell-args.js +0 -1
  166. package/dist/shell-hooks.js +32 -11
  167. package/dist/shell-state.d.ts +2 -0
  168. package/dist/shell-state.js +26 -2
  169. package/dist/status-detector.js +0 -1
  170. package/dist/statusline-model.d.ts +10 -2
  171. package/dist/statusline-model.js +106 -31
  172. package/dist/task-workflow.d.ts +6 -9
  173. package/dist/task-workflow.js +37 -85
  174. package/dist/tasks.d.ts +6 -33
  175. package/dist/tasks.js +46 -89
  176. package/dist/team.d.ts +29 -0
  177. package/dist/team.js +40 -1
  178. package/dist/terminal-host.js +0 -1
  179. package/dist/threads.d.ts +6 -35
  180. package/dist/threads.js +89 -99
  181. package/dist/tmux/doctor.js +0 -1
  182. package/dist/tmux/inbox-popup.js +37 -16
  183. package/dist/tmux/runtime-manager.d.ts +3 -0
  184. package/dist/tmux/runtime-manager.js +21 -5
  185. package/dist/tmux/session-transport.js +0 -1
  186. package/dist/tmux/statusline-cache.js +0 -1
  187. package/dist/tmux/statusline.js +49 -10
  188. package/dist/tmux/switcher.js +0 -1
  189. package/dist/tmux/window-open.js +1 -3
  190. package/dist/tool-output-watchers.d.ts +0 -18
  191. package/dist/tool-output-watchers.js +0 -323
  192. package/dist/tui/render/box.js +0 -1
  193. package/dist/tui/render/text.js +0 -1
  194. package/dist/tui/screens/dashboard-renderers.js +37 -26
  195. package/dist/tui/screens/overlay-renderers.d.ts +2 -0
  196. package/dist/tui/screens/overlay-renderers.js +37 -2
  197. package/dist/tui/screens/subscreen-renderers.js +7 -1
  198. package/dist/workflow.js +0 -1
  199. package/dist/worktree.js +17 -1
  200. package/dist-ui/_expo/static/css/web-30453ede1678c16acb08b97e83e8646d.css +1 -0
  201. package/dist-ui/_expo/static/js/web/entry-477c745b2adc79367a4380ecf07d9ff6.js +14620 -0
  202. package/dist-ui/assets/assets/images/icon.a5413dcd2e811c9f2317d01a28118d8a.png +0 -0
  203. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  204. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  205. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  206. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  207. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  208. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  209. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  210. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  211. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  212. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  213. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  214. package/dist-ui/assets/node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  215. package/dist-ui/assets/node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  216. package/dist-ui/assets/node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  217. package/dist-ui/assets/node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  218. package/dist-ui/assets/node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  219. package/dist-ui/assets/node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  220. package/dist-ui/assets/node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  221. package/dist-ui/favicon.ico +0 -0
  222. package/dist-ui/index.html +38 -0
  223. package/dist-ui/metadata.json +1 -0
  224. package/package.json +29 -12
  225. package/dist/agent-events.js.map +0 -1
  226. package/dist/agent-message-parts.d.ts +0 -17
  227. package/dist/agent-message-parts.js +0 -31
  228. package/dist/agent-message-parts.js.map +0 -1
  229. package/dist/agent-output-parser.js.map +0 -1
  230. package/dist/agent-prompt-delivery.js.map +0 -1
  231. package/dist/agent-tracker.js.map +0 -1
  232. package/dist/agent-watcher.js.map +0 -1
  233. package/dist/atomic-write.js.map +0 -1
  234. package/dist/attachment-store.js.map +0 -1
  235. package/dist/builtin-metadata-watchers.js.map +0 -1
  236. package/dist/claude-hooks.js.map +0 -1
  237. package/dist/config.js.map +0 -1
  238. package/dist/context/compactor.js.map +0 -1
  239. package/dist/context/context-bridge.js.map +0 -1
  240. package/dist/context/context-file.js.map +0 -1
  241. package/dist/context/history.js.map +0 -1
  242. package/dist/daemon.js.map +0 -1
  243. package/dist/dashboard/command-spec.js.map +0 -1
  244. package/dist/dashboard/feedback.js.map +0 -1
  245. package/dist/dashboard/index.js.map +0 -1
  246. package/dist/dashboard/operation-failures.js.map +0 -1
  247. package/dist/dashboard/pending-actions.js.map +0 -1
  248. package/dist/dashboard/quick-jump.js.map +0 -1
  249. package/dist/dashboard/runtime-evidence.js.map +0 -1
  250. package/dist/dashboard/session-actions.js.map +0 -1
  251. package/dist/dashboard/session-registry.js.map +0 -1
  252. package/dist/dashboard/sort.js.map +0 -1
  253. package/dist/dashboard/state.js.map +0 -1
  254. package/dist/dashboard/targets.js.map +0 -1
  255. package/dist/dashboard/ui-state-store.js.map +0 -1
  256. package/dist/debug.js.map +0 -1
  257. package/dist/default-plugins/gh-pr-context.js.map +0 -1
  258. package/dist/default-plugins/transcript-length.js.map +0 -1
  259. package/dist/fast-control.js.map +0 -1
  260. package/dist/hotkeys.js.map +0 -1
  261. package/dist/http-client.js.map +0 -1
  262. package/dist/instance-directory.d.ts +0 -32
  263. package/dist/instance-directory.js +0 -82
  264. package/dist/instance-directory.js.map +0 -1
  265. package/dist/instance-registry.d.ts +0 -39
  266. package/dist/instance-registry.js +0 -208
  267. package/dist/instance-registry.js.map +0 -1
  268. package/dist/key-parser.js.map +0 -1
  269. package/dist/last-used.js.map +0 -1
  270. package/dist/main.js.map +0 -1
  271. package/dist/managed-launch-env.js.map +0 -1
  272. package/dist/metadata-server.js.map +0 -1
  273. package/dist/metadata-store.js.map +0 -1
  274. package/dist/multiplexer/agent-io-methods.js.map +0 -1
  275. package/dist/multiplexer/archives.js.map +0 -1
  276. package/dist/multiplexer/dashboard-actions-methods.js.map +0 -1
  277. package/dist/multiplexer/dashboard-control.js.map +0 -1
  278. package/dist/multiplexer/dashboard-interaction.js.map +0 -1
  279. package/dist/multiplexer/dashboard-model.js.map +0 -1
  280. package/dist/multiplexer/dashboard-ops.js.map +0 -1
  281. package/dist/multiplexer/dashboard-state-methods.js.map +0 -1
  282. package/dist/multiplexer/dashboard-tail-methods.js.map +0 -1
  283. package/dist/multiplexer/dashboard-view-methods.js.map +0 -1
  284. package/dist/multiplexer/graveyard-view-model.js.map +0 -1
  285. package/dist/multiplexer/index.js.map +0 -1
  286. package/dist/multiplexer/navigation.js.map +0 -1
  287. package/dist/multiplexer/notifications.js.map +0 -1
  288. package/dist/multiplexer/persistence-methods.js.map +0 -1
  289. package/dist/multiplexer/runtime-lifecycle-methods.js.map +0 -1
  290. package/dist/multiplexer/runtime-state.js.map +0 -1
  291. package/dist/multiplexer/runtime-sync.js.map +0 -1
  292. package/dist/multiplexer/service-state-snapshot.js.map +0 -1
  293. package/dist/multiplexer/services.js.map +0 -1
  294. package/dist/multiplexer/session-actions.d.ts +0 -40
  295. package/dist/multiplexer/session-actions.js +0 -110
  296. package/dist/multiplexer/session-actions.js.map +0 -1
  297. package/dist/multiplexer/session-launch.js.map +0 -1
  298. package/dist/multiplexer/session-runtime-core.js.map +0 -1
  299. package/dist/multiplexer/subscreens.js.map +0 -1
  300. package/dist/multiplexer/tool-picker.js.map +0 -1
  301. package/dist/multiplexer/worktree-graveyard.js.map +0 -1
  302. package/dist/multiplexer/worktrees.js.map +0 -1
  303. package/dist/notification-context.js.map +0 -1
  304. package/dist/notifications.js.map +0 -1
  305. package/dist/notify.js.map +0 -1
  306. package/dist/orchestration-actions.js.map +0 -1
  307. package/dist/orchestration-dispatcher.d.ts +0 -25
  308. package/dist/orchestration-dispatcher.js +0 -59
  309. package/dist/orchestration-dispatcher.js.map +0 -1
  310. package/dist/orchestration-routing.js.map +0 -1
  311. package/dist/orchestration.js.map +0 -1
  312. package/dist/osc-notifications.js.map +0 -1
  313. package/dist/paths.js.map +0 -1
  314. package/dist/plugin-runtime.js.map +0 -1
  315. package/dist/project-events.js.map +0 -1
  316. package/dist/project-scanner.js.map +0 -1
  317. package/dist/project-service-manifest.js.map +0 -1
  318. package/dist/recency.js.map +0 -1
  319. package/dist/recorder.js.map +0 -1
  320. package/dist/session-bootstrap.js.map +0 -1
  321. package/dist/session-input-operations.d.ts +0 -19
  322. package/dist/session-input-operations.js +0 -46
  323. package/dist/session-input-operations.js.map +0 -1
  324. package/dist/session-message-history.d.ts +0 -27
  325. package/dist/session-message-history.js +0 -105
  326. package/dist/session-message-history.js.map +0 -1
  327. package/dist/session-runtime.js.map +0 -1
  328. package/dist/session-semantics.js.map +0 -1
  329. package/dist/shell-args.js.map +0 -1
  330. package/dist/shell-hooks.js.map +0 -1
  331. package/dist/shell-state.js.map +0 -1
  332. package/dist/status-detector.js.map +0 -1
  333. package/dist/statusline-model.js.map +0 -1
  334. package/dist/task-dispatcher.d.ts +0 -64
  335. package/dist/task-dispatcher.js +0 -213
  336. package/dist/task-dispatcher.js.map +0 -1
  337. package/dist/task-workflow.js.map +0 -1
  338. package/dist/tasks.js.map +0 -1
  339. package/dist/team.js.map +0 -1
  340. package/dist/terminal-host.js.map +0 -1
  341. package/dist/threads.js.map +0 -1
  342. package/dist/tmux/doctor.js.map +0 -1
  343. package/dist/tmux/inbox-popup.js.map +0 -1
  344. package/dist/tmux/runtime-manager.js.map +0 -1
  345. package/dist/tmux/session-transport.js.map +0 -1
  346. package/dist/tmux/statusline-cache.js.map +0 -1
  347. package/dist/tmux/statusline.js.map +0 -1
  348. package/dist/tmux/switcher.js.map +0 -1
  349. package/dist/tmux/window-open.js.map +0 -1
  350. package/dist/tool-output-watchers.js.map +0 -1
  351. package/dist/tui/render/box.js.map +0 -1
  352. package/dist/tui/render/text.js.map +0 -1
  353. package/dist/tui/screens/dashboard-renderers.js.map +0 -1
  354. package/dist/tui/screens/overlay-renderers.js.map +0 -1
  355. package/dist/tui/screens/subscreen-renderers.js.map +0 -1
  356. package/dist/workflow.js.map +0 -1
  357. package/dist/worktree.js.map +0 -1
@@ -1,20 +1,17 @@
1
- import { randomUUID } from "node:crypto";
2
1
  import { HotkeyHandler } from "../hotkeys.js";
3
2
  import { Dashboard } from "../dashboard/index.js";
4
3
  import { DashboardOverlayState, DashboardState } from "../dashboard/state.js";
5
4
  import { ContextWatcher } from "../context/context-bridge.js";
6
5
  import { loadConfig } from "../config.js";
7
6
  import { findMainRepo } from "../worktree.js";
8
- import { TaskDispatcher } from "../task-dispatcher.js";
9
7
  import { TerminalHost } from "../terminal-host.js";
10
8
  import { AgentTracker } from "../agent-tracker.js";
11
- import { InstanceDirectory } from "../instance-directory.js";
12
9
  import { TmuxRuntimeManager } from "../tmux/runtime-manager.js";
13
10
  import { loadMetadataState } from "../metadata-store.js";
14
11
  import { SessionBootstrapService } from "../session-bootstrap.js";
15
12
  import { createThread, appendMessage, updateThread } from "../threads.js";
16
- import { OrchestrationDispatcher } from "../orchestration-dispatcher.js";
17
13
  import { ProjectEventBus } from "../project-events.js";
14
+ import { contextualizeAlertInput, mergeDisplayContext, metadataDisplayContext, } from "../alert-display.js";
18
15
  import { deriveSessionSemantics } from "../session-semantics.js";
19
16
  import { listNotifications } from "../notifications.js";
20
17
  import { DashboardUiStateStore } from "../dashboard/ui-state-store.js";
@@ -91,12 +88,19 @@ export class Multiplexer {
91
88
  planEntries = [];
92
89
  planIndex = 0;
93
90
  notificationPanelState = null;
91
+ teammatePickerState = null;
94
92
  dashboardPendingActions = new DashboardPendingActions(() => {
95
93
  if (this.mode === "dashboard") {
94
+ void this.refreshDashboardModelFromService(true).then(() => {
95
+ if (this.mode === "dashboard") {
96
+ this.renderCurrentDashboardView();
97
+ }
98
+ });
96
99
  this.renderCurrentDashboardView();
97
100
  }
98
101
  });
99
102
  stoppingSessionIds = new Set();
103
+ unpreservedExitedSessionIds = new Set();
100
104
  graveyardAfterStopSessionIds = new Set();
101
105
  dashboardQuickJumpTimeout = null;
102
106
  /** Quick switcher overlay state */
@@ -105,7 +109,6 @@ export class Multiplexer {
105
109
  /** MRU order of session IDs (most recent first) */
106
110
  sessionMRU = [];
107
111
  /** Sessions confirmed registered in the instance registry (for claim detection) */
108
- confirmedRegistered = new Set();
109
112
  /** The focused worktree path on the dashboard (undefined = main repo) */
110
113
  dashboardState = new DashboardState();
111
114
  dashboardUiStateStore = new DashboardUiStateStore();
@@ -117,11 +120,8 @@ export class Multiplexer {
117
120
  dashboardPendingExpandedViewportCount = 0;
118
121
  dashboardModelVersion = 0;
119
122
  agentTracker = new AgentTracker();
120
- instanceId = randomUUID();
121
123
  contextWatcher = new ContextWatcher((target) => this.tmuxRuntimeManager.captureTarget(target, { startLine: -120 }));
122
- taskDispatcher = null;
123
- orchestrationDispatcher = null;
124
- /** Maps session ID → toolConfigKey for state saving */
124
+ /** Maps session ID → toolConfigKey for topology persistence */
125
125
  sessionToolKeys = new Map();
126
126
  /** Maps session ID → original args (before preamble injection) */
127
127
  sessionOriginalArgs = new Map();
@@ -131,10 +131,9 @@ export class Multiplexer {
131
131
  sessionRoles = new Map();
132
132
  /** Maps session ID → user-provided stable label */
133
133
  sessionLabels = new Map();
134
- /** Offline sessions from previous runs (loaded from state.json) */
134
+ /** Offline sessions from previous runs (loaded from runtime topology) */
135
135
  offlineSessions = [];
136
136
  /** Cross-instance discovery and claim/heartbeat ownership */
137
- instanceDirectory = new InstanceDirectory();
138
137
  tmuxRuntimeManager = new TmuxRuntimeManager();
139
138
  sessionBootstrap = new SessionBootstrapService({
140
139
  tmuxRuntimeManager: this.tmuxRuntimeManager,
@@ -153,7 +152,9 @@ export class Multiplexer {
153
152
  lastStatuslineSnapshotKey = null;
154
153
  desktopStateSnapshot = null;
155
154
  dashboardSessionsCache = [];
155
+ dashboardTeammatesCache = [];
156
156
  dashboardServicesCache = [];
157
+ dashboardRawWorktreeGroupsCache = [];
157
158
  dashboardWorktreeGroupsCache = [];
158
159
  dashboardOperationFailuresCache = [];
159
160
  dashboardMainCheckoutInfoCache = { name: "Main Checkout", branch: "" };
@@ -176,20 +177,12 @@ export class Multiplexer {
176
177
  this.hotkeys = new HotkeyHandler((action) => this.handleAction(action));
177
178
  this.dashboard = new Dashboard();
178
179
  this.runtimeSync = new MultiplexerRuntimeSync({
179
- instanceDirectory: this.instanceDirectory,
180
- instanceId: this.instanceId,
181
180
  cwd: process.cwd(),
182
181
  getMode: () => this.mode,
183
- getConfirmedRegistered: () => this.confirmedRegistered,
184
- setConfirmedRegistered: (value) => {
185
- this.confirmedRegistered = value;
186
- },
187
- getInstanceSessionRefs: () => this.getInstanceSessionRefs(),
188
- syncSessionsFromState: () => this.syncSessionsFromState(),
189
- loadOfflineSessions: () => this.loadOfflineSessions(),
182
+ syncSessionsFromTopology: () => this.syncSessionsFromTopology(),
183
+ loadOfflineTopologySessions: () => this.loadOfflineTopologySessions(),
190
184
  renderCurrentDashboardView: () => this.renderCurrentDashboardView(),
191
185
  renderDashboard: () => this.renderDashboard(),
192
- handleSessionClaimed: (sessionId) => this.handleSessionClaimed(sessionId),
193
186
  writeStatuslineFile: () => this.writeStatuslineFile(),
194
187
  });
195
188
  this.eventBus.subscribe((event) => {
@@ -232,7 +225,42 @@ export class Multiplexer {
232
225
  return this.sessions[this.activeIndex] ?? null;
233
226
  }
234
227
  publishAlert(input) {
235
- this.eventBus.publishAlert(input);
228
+ const displayContext = this.resolveSessionAlertDisplayContext(input.sessionId, input.worktreePath);
229
+ this.eventBus.publishAlert(contextualizeAlertInput(input, displayContext));
230
+ }
231
+ resolveSessionAlertDisplayContext(sessionId, worktreePath) {
232
+ if (!sessionId)
233
+ return worktreePath ? { worktreePath } : undefined;
234
+ let context = {};
235
+ try {
236
+ context = metadataDisplayContext(loadMetadataState().sessions[sessionId]);
237
+ }
238
+ catch { }
239
+ const session = this.dashboardSessionsCache.find((entry) => entry.id === sessionId) ??
240
+ this.sessions.find((entry) => entry.id === sessionId) ??
241
+ this.offlineSessions.find((entry) => entry.id === sessionId);
242
+ const service = this.dashboardServicesCache.find((entry) => entry.id === sessionId) ??
243
+ this.offlineServices?.find?.((entry) => entry.id === sessionId);
244
+ const sessionAny = session;
245
+ const serviceAny = service;
246
+ const resolvedWorktreePath = worktreePath ?? this.sessionWorktreePaths.get(sessionId) ?? sessionAny?.worktreePath ?? serviceAny?.worktreePath;
247
+ const group = resolvedWorktreePath
248
+ ? this.dashboardWorktreeGroupsCache.find((entry) => entry.path === resolvedWorktreePath)
249
+ : this.dashboardWorktreeGroupsCache.find((entry) => !entry.path);
250
+ const serviceCommand = serviceAny?.launchCommandLine ?? serviceAny?.command ?? "";
251
+ const liveContext = {
252
+ label: this.getSessionLabel(sessionId) ??
253
+ sessionAny?.label ??
254
+ serviceAny?.label ??
255
+ (serviceCommand ? this.serviceLabelForCommand?.(serviceCommand) : undefined) ??
256
+ sessionAny?.command,
257
+ command: sessionAny?.command ?? serviceAny?.command ?? serviceAny?.launchCommandLine,
258
+ worktreePath: resolvedWorktreePath,
259
+ worktreeName: sessionAny?.worktreeName ?? serviceAny?.worktreeName ?? group?.name,
260
+ branch: sessionAny?.worktreeBranch ?? serviceAny?.worktreeBranch ?? group?.branch,
261
+ };
262
+ context = mergeDisplayContext(context, liveContext);
263
+ return Object.values(context).some((value) => value !== undefined) ? context : undefined;
236
264
  }
237
265
  deriveSessionSemanticState(sessionId, status) {
238
266
  const derived = loadMetadataState().sessions[sessionId]?.derived;
@@ -245,11 +273,11 @@ export class Multiplexer {
245
273
  unseenCount: derived?.unseenCount,
246
274
  notificationUnreadCount: unreadNotifications.length,
247
275
  latestNotification,
248
- hasActiveTask: Boolean(this.taskDispatcher?.getSessionTask(sessionId)),
276
+ hasActiveTask: false,
249
277
  });
250
278
  }
251
- registerManagedSession(session, args, toolConfigKey, worktreePath, role, startTime) {
252
- return registerManagedSessionImpl(this, session, args, toolConfigKey, worktreePath, role, startTime);
279
+ registerManagedSession(session, args, toolConfigKey, worktreePath, role, startTime, team) {
280
+ return registerManagedSessionImpl(this, session, args, toolConfigKey, worktreePath, role, startTime, team);
253
281
  }
254
282
  handleSessionRuntimeEvent(runtime, event) {
255
283
  handleSessionRuntimeEventImpl(this, runtime, event);
@@ -263,16 +291,6 @@ export class Multiplexer {
263
291
  updateContextWatcherSessions() {
264
292
  updateContextWatcherSessionsImpl(this);
265
293
  }
266
- createTaskDispatcher() {
267
- return new TaskDispatcher((id) => this.sessions.find((s) => s.id === id), (id) => this.sessionToolKeys.get(id), (id) => this.sessionRoles.get(id), (id) => this.deriveSessionSemanticState(id).runtime.canReceiveInput, (session, prompt) => {
268
- void this.writeAgentInput(session.id, prompt, undefined, undefined, true);
269
- });
270
- }
271
- createOrchestrationDispatcher() {
272
- return new OrchestrationDispatcher((id) => this.sessions.find((s) => s.id === id), (id) => this.deriveSessionSemanticState(id).runtime.canReceiveInput, (session, prompt) => {
273
- void this.writeAgentInput(session.id, prompt, undefined, undefined, true);
274
- });
275
- }
276
294
  selectLinkedOrOpenTarget(target) {
277
295
  selectLinkedOrOpenTarget(this.tmuxRuntimeManager, target);
278
296
  }
@@ -287,7 +305,7 @@ export class Multiplexer {
287
305
  }
288
306
  /**
289
307
  * Resume previous sessions using each tool's native resume mechanism.
290
- * Reads state.json and spawns sessions with resumeArgs instead of normal args.
308
+ * Reads runtime topology and spawns sessions with resumeArgs instead of normal args.
291
309
  */
292
310
  async resumeSessions(toolFilter) {
293
311
  return resumeSessionsImpl(this, toolFilter);
@@ -299,8 +317,11 @@ export class Multiplexer {
299
317
  async restoreSessions(toolFilter) {
300
318
  return restoreSessionsImpl(this, toolFilter);
301
319
  }
302
- createSession(command, args, preambleFlag, toolConfigKey, extraPreamble, sessionIdFlag, worktreePath, backendSessionIdOverride, sessionIdOverride, detachedInTmux = false, suppressStartupPreamble = false) {
303
- return createSessionImpl(this, command, args, preambleFlag, toolConfigKey, extraPreamble, sessionIdFlag, worktreePath, backendSessionIdOverride, sessionIdOverride, detachedInTmux, suppressStartupPreamble);
320
+ createSession(command, args, preambleFlag, toolConfigKey, extraPreamble, sessionIdFlag, worktreePath, backendSessionIdOverride, sessionIdOverride, detachedInTmux = false, suppressStartupPreamble = false, team) {
321
+ return createSessionImpl(this, command, args, preambleFlag, toolConfigKey, extraPreamble, sessionIdFlag, worktreePath, backendSessionIdOverride, sessionIdOverride, detachedInTmux, suppressStartupPreamble, team);
322
+ }
323
+ recordSessionBackendSessionId(sessionId, backendSessionId) {
324
+ return runtimeLifecycleMethods.recordSessionBackendSessionId.call(this, sessionId, backendSessionId);
304
325
  }
305
326
  /**
306
327
  * Migrate an agent from its current worktree to a target worktree.
@@ -371,17 +392,17 @@ export class Multiplexer {
371
392
  await this.contextWatcher.syncNow(sourceSessionId).catch(() => { });
372
393
  const sourceSnapshot = this.sessionBootstrap.readForkSourceSnapshot(sourceSessionId);
373
394
  this.sessionBootstrap.seedForkArtifacts(sourceSessionId, targetSessionId, targetToolConfigKey);
395
+ const codexContinuityPreamble = !toolCfg.preambleFlag
396
+ ? this.sessionBootstrap.buildCodexForkContinuityPreamble(sourceSessionId, targetSessionId, sourceSnapshot, instruction)
397
+ : undefined;
374
398
  const extraPreamble = [
375
399
  this.sessionBootstrap.buildForkPreamble(sourceSessionId, targetSessionId),
376
- instruction?.trim(),
400
+ codexContinuityPreamble ? undefined : instruction?.trim(),
401
+ codexContinuityPreamble,
377
402
  ]
378
403
  .filter(Boolean)
379
404
  .join("\n\n");
380
405
  const transport = this.createSession(toolCfg.command, [...toolCfg.args, ...extraArgs], toolCfg.preambleFlag, targetToolConfigKey, extraPreamble, toolCfg.sessionIdFlag, targetWorktree, undefined, targetSessionId, !toolCfg.preambleFlag);
381
- if (!toolCfg.preambleFlag) {
382
- const kickoff = this.sessionBootstrap.buildCodexForkKickoffPrompt(sourceSessionId, targetSessionId, sourceSnapshot, instruction);
383
- await this.sessionBootstrap.deliverDetachedCodexKickoffPrompt(targetSessionId, kickoff, 1800);
384
- }
385
406
  this.agentTracker.emit(sourceSessionId, {
386
407
  kind: "status",
387
408
  message: `Forked ${targetSessionId} from this session`,
@@ -439,4 +460,3 @@ export class Multiplexer {
439
460
  }
440
461
  }
441
462
  Object.assign(Multiplexer.prototype, dashboardInteractionMethods, dashboardViewMethods, dashboardActionMethods, dashboardTailMethods, persistenceMethods, dashboardStateMethods, agentIoMethods, runtimeLifecycleMethods);
442
- //# sourceMappingURL=index.js.map
@@ -225,4 +225,3 @@ export function handleMigratePickerKey(host, data) {
225
225
  host.focusSession(host.activeIndex);
226
226
  }
227
227
  }
228
- //# sourceMappingURL=navigation.js.map
@@ -1,8 +1,9 @@
1
- import { clearNotifications, listNotifications, markNotificationsRead } from "../notifications.js";
2
1
  import { parseKeys } from "../key-parser.js";
3
2
  import { renderNotificationsScreen } from "../tui/screens/subscreen-renderers.js";
3
+ import { createRuntimeExchangeStore } from "../runtime-core/exchange-store.js";
4
+ import { markThreadSeen } from "../threads.js";
4
5
  export function showNotificationPanel(host) {
5
- const entries = listNotifications({ includeCleared: false }).slice(0, 40);
6
+ const entries = loadNotificationEntries(host).slice(0, 40);
6
7
  host.notificationPanelState = {
7
8
  entries,
8
9
  index: entries.length > 0 ? 0 : -1,
@@ -50,8 +51,8 @@ export function handleNotificationPanelKey(host, data) {
50
51
  const selected = panel.entries[panel.index];
51
52
  if (!selected)
52
53
  return;
53
- markNotificationsRead({ id: selected.id });
54
- panel.entries = listNotifications({ includeCleared: false }).slice(0, 40);
54
+ markRuntimeInboxEntriesDone({ id: selected.id });
55
+ panel.entries = loadNotificationEntries(host).slice(0, 40);
55
56
  if (panel.index >= panel.entries.length)
56
57
  panel.index = panel.entries.length - 1;
57
58
  host.renderDashboard();
@@ -61,25 +62,98 @@ export function handleNotificationPanelKey(host, data) {
61
62
  const selected = panel.entries[panel.index];
62
63
  if (!selected)
63
64
  return;
64
- clearNotifications({ id: selected.id });
65
- panel.entries = listNotifications({ includeCleared: false }).slice(0, 40);
65
+ markRuntimeInboxEntriesDone({ id: selected.id });
66
+ panel.entries = loadNotificationEntries(host).slice(0, 40);
66
67
  if (panel.index >= panel.entries.length)
67
68
  panel.index = panel.entries.length - 1;
68
69
  host.renderDashboard();
69
70
  return;
70
71
  }
71
72
  if (key === "C") {
72
- clearNotifications();
73
+ markRuntimeInboxEntriesDone();
73
74
  panel.entries = [];
74
75
  panel.index = -1;
75
76
  host.renderDashboard();
76
77
  }
77
78
  }
78
- function loadNotificationEntries() {
79
- return listNotifications({ includeCleared: false }).slice(0, 200);
79
+ function hasNotificationTarget(host, participantId) {
80
+ return Boolean(findNotificationSessionTarget(host, participantId) ?? findNotificationServiceTarget(host, participantId));
81
+ }
82
+ function notificationTargetSessionId(host, participantId) {
83
+ return hasNotificationTarget(host, participantId) ? participantId : undefined;
84
+ }
85
+ function loadNotificationEntries(host) {
86
+ const exchange = createRuntimeExchangeStore().read();
87
+ const threadById = new Map(exchange.threads.map((thread) => [thread.id, thread]));
88
+ const taskById = new Map(exchange.tasks.map((task) => [task.id, task]));
89
+ const latestMessageByThread = new Map();
90
+ for (const message of exchange.messages) {
91
+ const existing = latestMessageByThread.get(message.threadId);
92
+ if (!existing || existing.ts < message.ts)
93
+ latestMessageByThread.set(message.threadId, message);
94
+ }
95
+ return exchange.inbox
96
+ .filter((entry) => entry.state !== "done")
97
+ .map((entry) => {
98
+ if (entry.subjectKind === "thread" || entry.subjectKind === "handoff" || entry.subjectKind === "message") {
99
+ const thread = threadById.get(entry.subjectId);
100
+ if (!thread)
101
+ return undefined;
102
+ const message = latestMessageByThread.get(thread.id);
103
+ return {
104
+ id: entry.id,
105
+ title: thread.title,
106
+ subtitle: `${thread.kind} · ${thread.status}`,
107
+ body: message?.body ?? thread.title,
108
+ sessionId: notificationTargetSessionId(host, entry.participantId),
109
+ targetKind: notificationTargetSessionId(host, entry.participantId)
110
+ ? "session"
111
+ : "generic",
112
+ kind: entry.subjectKind,
113
+ unread: true,
114
+ cleared: false,
115
+ createdAt: entry.updatedAt,
116
+ updatedAt: entry.updatedAt,
117
+ };
118
+ }
119
+ const task = taskById.get(entry.subjectId);
120
+ if (!task)
121
+ return undefined;
122
+ return {
123
+ id: entry.id,
124
+ title: task.description,
125
+ subtitle: `${task.type ?? "task"} · ${task.status}`,
126
+ body: task.result ?? task.error ?? task.prompt,
127
+ sessionId: notificationTargetSessionId(host, entry.participantId),
128
+ targetKind: notificationTargetSessionId(host, entry.participantId)
129
+ ? "session"
130
+ : "generic",
131
+ kind: entry.subjectKind,
132
+ unread: true,
133
+ cleared: false,
134
+ createdAt: entry.updatedAt,
135
+ updatedAt: entry.updatedAt,
136
+ };
137
+ })
138
+ .filter((entry) => Boolean(entry))
139
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt))
140
+ .slice(0, 200);
141
+ }
142
+ function markRuntimeInboxEntriesDone(input = {}) {
143
+ const store = createRuntimeExchangeStore();
144
+ const entries = store.read().inbox.filter((entry) => !input.id || entry.id === input.id);
145
+ for (const entry of entries) {
146
+ if (entry.subjectKind === "thread" || entry.subjectKind === "handoff" || entry.subjectKind === "message") {
147
+ markThreadSeen(entry.subjectId, entry.participantId);
148
+ }
149
+ }
150
+ store.update((exchange) => ({
151
+ ...exchange,
152
+ inbox: exchange.inbox.map((entry) => (!input.id || entry.id === input.id ? { ...entry, state: "done" } : entry)),
153
+ }));
80
154
  }
81
155
  function refreshNotificationEntries(host) {
82
- host.notificationEntries = loadNotificationEntries();
156
+ host.notificationEntries = loadNotificationEntries(host);
83
157
  if (host.notificationIndex >= host.notificationEntries.length) {
84
158
  host.notificationIndex = Math.max(0, host.notificationEntries.length - 1);
85
159
  }
@@ -98,6 +172,13 @@ function ensureNotificationState(host) {
98
172
  host.notificationIndex = host.notificationEntries.length > 0 ? 0 : -1;
99
173
  }
100
174
  }
175
+ function findNotificationSessionTarget(host, sessionId) {
176
+ return (host.getDashboardSessions?.().find((entry) => entry.id === sessionId) ??
177
+ (host.dashboardTeammatesCache ?? []).find((entry) => entry.id === sessionId));
178
+ }
179
+ function findNotificationServiceTarget(host, sessionId) {
180
+ return host.getDashboardServices?.().find((entry) => entry.id === sessionId);
181
+ }
101
182
  export function showNotifications(host) {
102
183
  host.clearDashboardSubscreens();
103
184
  refreshNotificationEntries(host);
@@ -114,11 +195,11 @@ export function renderNotifications(host) {
114
195
  export function notificationTargetLabel(host, sessionId) {
115
196
  if (!sessionId)
116
197
  return null;
117
- const session = host.getDashboardSessions().find((entry) => entry.id === sessionId);
198
+ const session = findNotificationSessionTarget(host, sessionId);
118
199
  if (session) {
119
200
  return `${session.label ?? session.command}${session.worktreeName ? ` · ${session.worktreeName}` : ""}`;
120
201
  }
121
- const service = host.getDashboardServices().find((entry) => entry.id === sessionId);
202
+ const service = findNotificationServiceTarget(host, sessionId);
122
203
  if (service) {
123
204
  return `${service.label ?? service.command} [service]${service.worktreeName ? ` · ${service.worktreeName}` : ""}`;
124
205
  }
@@ -127,11 +208,11 @@ export function notificationTargetLabel(host, sessionId) {
127
208
  export function notificationTargetState(host, sessionId) {
128
209
  if (!sessionId)
129
210
  return "none";
130
- const session = host.getDashboardSessions().find((entry) => entry.id === sessionId);
211
+ const session = findNotificationSessionTarget(host, sessionId);
131
212
  if (session) {
132
213
  return session.status === "offline" ? "offline" : "live";
133
214
  }
134
- const service = host.getDashboardServices().find((entry) => entry.id === sessionId);
215
+ const service = findNotificationServiceTarget(host, sessionId);
135
216
  if (service) {
136
217
  return service.status === "running" ? "live" : "offline";
137
218
  }
@@ -143,7 +224,7 @@ async function openSelectedNotification(host) {
143
224
  return;
144
225
  if (!entry.sessionId) {
145
226
  if (entry.unread) {
146
- markNotificationsRead({ id: entry.id });
227
+ markRuntimeInboxEntriesDone({ id: entry.id });
147
228
  refreshNotificationEntries(host);
148
229
  }
149
230
  renderNotifications(host);
@@ -156,10 +237,12 @@ async function openSelectedNotification(host) {
156
237
  renderNotifications(host);
157
238
  return;
158
239
  }
159
- const session = host.getDashboardSessions().find((candidate) => candidate.id === entry.sessionId);
240
+ const session = findNotificationSessionTarget(host, entry.sessionId);
160
241
  if (session) {
161
242
  try {
162
- await host.activateDashboardEntry(session);
243
+ await host.activateDashboardEntry(session, {
244
+ preserveDashboardSelection: Boolean(session.team),
245
+ });
163
246
  }
164
247
  catch {
165
248
  host.footerFlash = "Failed to open notification target";
@@ -168,12 +251,12 @@ async function openSelectedNotification(host) {
168
251
  return;
169
252
  }
170
253
  if (entry.unread) {
171
- markNotificationsRead({ id: entry.id });
254
+ markRuntimeInboxEntriesDone({ id: entry.id });
172
255
  refreshNotificationEntries(host);
173
256
  }
174
257
  return;
175
258
  }
176
- const service = host.getDashboardServices().find((candidate) => candidate.id === entry.sessionId);
259
+ const service = findNotificationServiceTarget(host, entry.sessionId);
177
260
  if (!service) {
178
261
  host.footerFlash = "Notification target is no longer available";
179
262
  host.footerFlashTicks = 3;
@@ -190,7 +273,7 @@ async function openSelectedNotification(host) {
190
273
  return;
191
274
  }
192
275
  if (entry.unread) {
193
- markNotificationsRead({ id: entry.id });
276
+ markRuntimeInboxEntriesDone({ id: entry.id });
194
277
  refreshNotificationEntries(host);
195
278
  }
196
279
  }
@@ -248,13 +331,13 @@ export function handleNotificationsKey(host, data) {
248
331
  const entry = host.notificationEntries[host.notificationIndex];
249
332
  if (!entry)
250
333
  return;
251
- markNotificationsRead({ id: entry.id });
334
+ markRuntimeInboxEntriesDone({ id: entry.id });
252
335
  refreshNotificationEntries(host);
253
336
  renderNotifications(host);
254
337
  return;
255
338
  }
256
339
  if (key === "R") {
257
- markNotificationsRead();
340
+ markRuntimeInboxEntriesDone();
258
341
  refreshNotificationEntries(host);
259
342
  renderNotifications(host);
260
343
  return;
@@ -263,13 +346,13 @@ export function handleNotificationsKey(host, data) {
263
346
  const entry = host.notificationEntries[host.notificationIndex];
264
347
  if (!entry)
265
348
  return;
266
- clearNotifications({ id: entry.id });
349
+ markRuntimeInboxEntriesDone({ id: entry.id });
267
350
  refreshNotificationEntries(host);
268
351
  renderNotifications(host);
269
352
  return;
270
353
  }
271
354
  if (key === "C") {
272
- clearNotifications();
355
+ markRuntimeInboxEntriesDone();
273
356
  refreshNotificationEntries(host);
274
357
  renderNotifications(host);
275
358
  return;
@@ -278,4 +361,3 @@ export function handleNotificationsKey(host, data) {
278
361
  void openSelectedNotification(host);
279
362
  }
280
363
  }
281
- //# sourceMappingURL=notifications.js.map
@@ -1,9 +1,9 @@
1
+ import type { PendingWorktreeActionKind } from "../pending-actions.js";
1
2
  import { type DashboardOperationFailure } from "../dashboard/operation-failures.js";
2
3
  import { type DashboardScreen } from "../dashboard/state.js";
3
4
  import { type DashboardService, type DashboardSession } from "../dashboard/index.js";
4
5
  import { loadMetadataState } from "../metadata-store.js";
5
6
  export declare const persistenceMethods: {
6
- writeSessionsFile(this: any): void;
7
7
  writeStatuslineFile(this: any, input?: {
8
8
  force?: boolean;
9
9
  }): void;
@@ -34,6 +34,22 @@ export declare const persistenceMethods: {
34
34
  role?: string;
35
35
  active: boolean;
36
36
  worktreePath?: string;
37
+ launchCommandLine?: string;
38
+ }>;
39
+ teammates: Array<{
40
+ id: string;
41
+ kind?: "agent" | "service";
42
+ tool: string;
43
+ label?: string;
44
+ tmuxWindowId?: string;
45
+ tmuxWindowIndex?: number;
46
+ windowName: string;
47
+ headline?: string;
48
+ status: string;
49
+ role?: string;
50
+ active: boolean;
51
+ worktreePath?: string;
52
+ team?: DashboardSession["team"];
37
53
  }>;
38
54
  tasks: {
39
55
  pending: number;
@@ -49,6 +65,7 @@ export declare const persistenceMethods: {
49
65
  };
50
66
  buildDesktopState(this: any): {
51
67
  sessions: DashboardSession[];
68
+ teammates: DashboardSession[];
52
69
  services: DashboardService[];
53
70
  statusline: ReturnType<any["buildStatuslineSnapshot"]>;
54
71
  worktrees: Array<{
@@ -73,7 +90,18 @@ export declare const persistenceMethods: {
73
90
  createdAt?: string;
74
91
  pending?: boolean;
75
92
  removing?: boolean;
76
- pendingAction?: "creating";
93
+ pendingAction?: Extract<PendingWorktreeActionKind, "creating">;
94
+ operationFailure?: DashboardOperationFailure;
95
+ }>;
96
+ listProjectedDesktopWorktrees(this: any): Array<{
97
+ name: string;
98
+ path: string;
99
+ branch: string;
100
+ isBare: boolean;
101
+ createdAt?: string;
102
+ pending?: boolean;
103
+ removing?: boolean;
104
+ pendingAction?: Extract<PendingWorktreeActionKind, "creating" | "removing" | "graveyarding">;
77
105
  operationFailure?: DashboardOperationFailure;
78
106
  }>;
79
107
  listWorktreeGraveyardEntries(this: any): any[];
@@ -83,7 +111,7 @@ export declare const persistenceMethods: {
83
111
  }>;
84
112
  resurrectGraveyardWorktree(this: any, path: string): Promise<{
85
113
  path: string;
86
- status: "offline";
114
+ status: "active";
87
115
  }>;
88
116
  deleteGraveyardWorktree(this: any, path: string): Promise<{
89
117
  path: string;
@@ -102,7 +130,6 @@ export declare const persistenceMethods: {
102
130
  sessionId: string;
103
131
  status: "offline";
104
132
  }>;
105
- removeSessionsFile(this: any): void;
106
133
  stripAnsi(this: any, text: string): string;
107
134
  centerInWidth(this: any, text: string, width: number): string;
108
135
  renderCurrentDashboardView(this: any): void;