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
@@ -4,11 +4,12 @@ import { findMainRepo } from "../worktree.js";
4
4
  import { getStatePath } from "../paths.js";
5
5
  import { wrapCommandWithShellIntegration, wrapInteractiveShellWithIntegration } from "../shell-hooks.js";
6
6
  import { markLastUsed } from "../last-used.js";
7
+ import { removeTopologyService, upsertTopologyService, } from "../runtime-core/topology-services.js";
7
8
  export function generateServiceId() {
8
9
  return `service-${randomUUID().slice(0, 8)}`;
9
10
  }
10
11
  export function getServiceLaunchCommandLine(metadata) {
11
- return metadata.command === "shell" ? "" : metadata.args?.[0] === "-lc" ? (metadata.args[1] ?? "") : "";
12
+ return metadata.args?.[0] === "-lc" ? (metadata.args[1] ?? "") : "";
12
13
  }
13
14
  function shellQuote(value) {
14
15
  return `'${value.replace(/'/g, `'\\''`)}'`;
@@ -29,13 +30,14 @@ function buildServiceLaunchScript(commandLine, shellPath) {
29
30
  ].join("; ");
30
31
  }
31
32
  export function buildServiceStateFromMetadata(serviceId, metadata, opts = {}) {
33
+ const launchCommandLine = metadata.launchCommandLine?.trim() || getServiceLaunchCommandLine(metadata);
32
34
  return {
33
35
  id: serviceId,
34
36
  createdAt: metadata.createdAt,
35
37
  worktreePath: metadata.worktreePath,
36
38
  cwd: opts.cwd,
37
39
  label: metadata.label,
38
- launchCommandLine: getServiceLaunchCommandLine(metadata),
40
+ launchCommandLine,
39
41
  tmuxTarget: opts.tmuxTarget,
40
42
  retained: opts.retained,
41
43
  };
@@ -55,6 +57,30 @@ function markServiceUsed(host, serviceId) {
55
57
  }
56
58
  catch { }
57
59
  }
60
+ function serviceMetadataToTopologyState(serviceId, metadata, opts = {}) {
61
+ return {
62
+ id: serviceId,
63
+ command: metadata.command,
64
+ args: metadata.args ?? [],
65
+ createdAt: metadata.createdAt?.trim() || undefined,
66
+ worktreePath: metadata.worktreePath,
67
+ cwd: opts.cwd,
68
+ label: metadata.label,
69
+ launchCommandLine: metadata.launchCommandLine?.trim() || getServiceLaunchCommandLine(metadata),
70
+ tmuxTarget: opts.tmuxTarget,
71
+ };
72
+ }
73
+ function serviceStateToTopologyState(service) {
74
+ return {
75
+ id: service.id,
76
+ createdAt: service.createdAt?.trim() || undefined,
77
+ worktreePath: service.worktreePath,
78
+ cwd: service.cwd,
79
+ label: service.label,
80
+ launchCommandLine: service.launchCommandLine,
81
+ tmuxTarget: service.tmuxTarget,
82
+ };
83
+ }
58
84
  export function serviceLabelForCommand(commandLine) {
59
85
  const trimmed = commandLine.trim();
60
86
  if (!trimmed)
@@ -96,7 +122,7 @@ export function createService(host, commandLine, worktreePath, opts) {
96
122
  const tmuxSession = host.tmuxRuntimeManager.ensureProjectSession(process.cwd());
97
123
  const shouldRenderPending = host.startedInDashboard && host.mode === "dashboard";
98
124
  if (shouldRenderPending) {
99
- host.setPendingDashboardSessionAction(serviceId, "creating", {
125
+ host.setPendingDashboardServiceAction(serviceId, "creating", {
100
126
  serviceSeed: {
101
127
  id: serviceId,
102
128
  command: trimmed ? shell : "shell",
@@ -123,19 +149,30 @@ export function createService(host, commandLine, worktreePath, opts) {
123
149
  createdAt: new Date().toISOString(),
124
150
  worktreePath,
125
151
  label,
152
+ launchCommandLine: trimmed,
126
153
  });
154
+ upsertTopologyService({
155
+ id: serviceId,
156
+ command: trimmed ? shell : "shell",
157
+ args: trimmed ? ["-lc", trimmed] : ["-l"],
158
+ launchCommandLine: trimmed,
159
+ worktreePath,
160
+ cwd,
161
+ label,
162
+ tmuxTarget: target,
163
+ }, "running");
127
164
  host.tmuxRuntimeManager.applyManagedAgentWindowPolicy(target, "service");
128
165
  host.saveState();
129
166
  host.invalidateDesktopStateSnapshot();
130
167
  host.refreshLocalDashboardModel();
131
168
  host.updateWorktreeSessions();
132
169
  host.preferDashboardEntrySelection("service", serviceId, worktreePath);
133
- host.settleDashboardCreatePending(serviceId);
170
+ host.settleDashboardCreatePending(serviceId, "service");
134
171
  return { serviceId };
135
172
  }
136
173
  catch (error) {
137
174
  if (shouldRenderPending) {
138
- host.setPendingDashboardSessionAction(serviceId, null);
175
+ host.setPendingDashboardServiceAction(serviceId, null);
139
176
  }
140
177
  throw error;
141
178
  }
@@ -159,6 +196,10 @@ export function stopService(host, serviceId) {
159
196
  retained: true,
160
197
  }),
161
198
  ];
199
+ upsertTopologyService(serviceMetadataToTopologyState(serviceId, match.metadata, {
200
+ cwd,
201
+ tmuxTarget: match.target,
202
+ }), "stopped");
162
203
  host.tmuxRuntimeManager.sendKey(match.target, "C-c");
163
204
  host.tmuxRuntimeManager.setWindowMetadata(match.target, {
164
205
  ...match.metadata,
@@ -190,6 +231,7 @@ export function removeOfflineService(host, serviceId) {
190
231
  catch { }
191
232
  }
192
233
  host.offlineServices = host.offlineServices.filter((service) => service.id !== serviceId);
234
+ removeTopologyService(serviceId);
193
235
  const statePath = getStatePath();
194
236
  if (existsSync(statePath)) {
195
237
  try {
@@ -274,11 +316,19 @@ export function resumeOfflineService(host, service) {
274
316
  sessionId: service.id,
275
317
  command: launchCommandLine ? shell : "shell",
276
318
  args: launchCommandLine ? ["-lc", launchCommandLine] : ["-l"],
319
+ launchCommandLine,
277
320
  toolConfigKey: "service",
278
321
  createdAt: service.createdAt ?? new Date().toISOString(),
279
322
  worktreePath: service.worktreePath,
280
323
  label,
281
324
  });
325
+ upsertTopologyService({
326
+ ...serviceStateToTopologyState(service),
327
+ command: launchCommandLine ? shell : "shell",
328
+ args: launchCommandLine ? ["-lc", launchCommandLine] : ["-l"],
329
+ label,
330
+ tmuxTarget: target,
331
+ }, "running");
282
332
  host.tmuxRuntimeManager.applyManagedAgentWindowPolicy(target, "service");
283
333
  host.offlineServices = host.offlineServices.filter((entry) => entry.id !== service.id);
284
334
  markServiceUsed(host, service.id);
@@ -306,4 +356,3 @@ export function resumeOfflineServiceById(host, serviceId) {
306
356
  const restored = buildServiceStateFromMetadata(serviceId, existing.metadata);
307
357
  return resumeOfflineService(host, restored);
308
358
  }
309
- //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ export declare function extractCodexBackendSessionIdFromArgs(args: string[]): string | undefined;
@@ -0,0 +1,23 @@
1
+ export function extractCodexBackendSessionIdFromArgs(args) {
2
+ for (let i = 0; i < args.length; i += 1) {
3
+ const arg = args[i];
4
+ if (arg === "resume") {
5
+ const next = args[i + 1]?.trim();
6
+ if (next && !next.startsWith("-"))
7
+ return next;
8
+ continue;
9
+ }
10
+ if (arg === "--resume") {
11
+ const next = args[i + 1]?.trim();
12
+ if (next && !next.startsWith("-"))
13
+ return next;
14
+ continue;
15
+ }
16
+ if (arg.startsWith("--resume=")) {
17
+ const value = arg.slice("--resume=".length).trim();
18
+ if (value)
19
+ return value;
20
+ }
21
+ }
22
+ return undefined;
23
+ }
@@ -1,4 +1,7 @@
1
+ import type { SessionTeamMetadata } from "../team.js";
1
2
  type SessionLaunchHost = any;
3
+ export declare function summarizeLaunchArgs(args: string[]): string[];
4
+ export declare function injectCodexDeveloperInstructions(args: string[], key: string, instructions: string): string[];
2
5
  export declare function run(host: SessionLaunchHost, opts: {
3
6
  command: string;
4
7
  args: string[];
@@ -7,7 +10,7 @@ export declare function runDashboard(host: SessionLaunchHost): Promise<number>;
7
10
  export declare function runProjectService(host: SessionLaunchHost): Promise<number>;
8
11
  export declare function resumeSessions(host: SessionLaunchHost, toolFilter?: string): Promise<number>;
9
12
  export declare function restoreSessions(host: SessionLaunchHost, toolFilter?: string): Promise<number>;
10
- export declare function createSession(host: SessionLaunchHost, command: string, args: string[], preambleFlag?: string[], toolConfigKey?: string, extraPreamble?: string, sessionIdFlag?: string[], worktreePath?: string, backendSessionIdOverride?: string, sessionIdOverride?: string, detachedInTmux?: boolean, suppressStartupPreamble?: boolean): any;
13
+ export declare function createSession(host: SessionLaunchHost, command: string, args: string[], preambleFlag?: string[], toolConfigKey?: string, extraPreamble?: string, sessionIdFlag?: string[], worktreePath?: string, backendSessionIdOverride?: string, sessionIdOverride?: string, detachedInTmux?: boolean, suppressStartupPreamble?: boolean, team?: SessionTeamMetadata): any;
11
14
  export declare function migrateAgent(host: SessionLaunchHost, sessionId: string, targetWorktreePath: string): Promise<void>;
12
15
  export declare function getSessionWorktreePath(host: SessionLaunchHost, sessionId: string): string | undefined;
13
16
  export declare function getSessionsByWorktree(host: SessionLaunchHost): Map<string | undefined, any[]>;
@@ -4,19 +4,108 @@ import { buildContextPreamble } from "../context/context-bridge.js";
4
4
  import { readHistory } from "../context/history.js";
5
5
  import { findMainRepo } from "../worktree.js";
6
6
  import { TmuxSessionTransport } from "../tmux/session-transport.js";
7
- import { injectClaudeHookArgs, shouldSkipClaudeSessionIdInjection } from "../claude-hooks.js";
7
+ import { extractClaudeBackendSessionIdFromArgs, injectClaudeHookArgs, shouldSkipClaudeSessionIdInjection, } from "../claude-hooks.js";
8
8
  import { wrapCommandWithManagedLaunchEnv } from "../managed-launch-env.js";
9
9
  import { wrapCommandWithShellIntegration } from "../shell-hooks.js";
10
- import { debug } from "../debug.js";
10
+ import { debug, log } from "../debug.js";
11
11
  import { updateNotificationContext } from "../notification-context.js";
12
12
  import { markNotificationsRead } from "../notifications.js";
13
+ import { clearSessionTranscriptPath } from "../metadata-store.js";
14
+ import { extractCodexBackendSessionIdFromArgs } from "./session-capture.js";
15
+ import { listTopologySessionStates } from "../runtime-core/topology-sessions.js";
16
+ function listLaunchableTopologySessions(toolFilter) {
17
+ const sessions = listTopologySessionStates({ statuses: ["offline"] });
18
+ return toolFilter ? sessions.filter((s) => s.tool === toolFilter || s.toolConfigKey === toolFilter) : sessions;
19
+ }
20
+ function reconcileLaunchableTopology(host) {
21
+ host.syncSessionsFromTopology?.();
22
+ host.saveState?.();
23
+ }
24
+ const CODEX_OPTIONS_WITH_VALUE = new Set([
25
+ "-a",
26
+ "--add-dir",
27
+ "--ask-for-approval",
28
+ "-c",
29
+ "--cd",
30
+ "--config",
31
+ "-i",
32
+ "--image",
33
+ "--local-provider",
34
+ "-m",
35
+ "--model",
36
+ "-p",
37
+ "--profile",
38
+ "--remote",
39
+ "--remote-auth-token-env",
40
+ "-s",
41
+ "--sandbox",
42
+ ]);
43
+ const SENSITIVE_ENV_ARG_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASS|KEY|CREDENTIAL|AUTH)[A-Za-z0-9_]*=/i;
44
+ const SENSITIVE_OPTION_ARG_PATTERN = /^--?[A-Za-z0-9-]*(?:token|secret|password|pass|key|credential|auth)[A-Za-z0-9-]*(?:=.*)?$/i;
45
+ const SENSITIVE_OPTION_ASSIGNMENT_PATTERN = /^(--?[A-Za-z0-9-]*(?:token|secret|password|pass|key|credential|auth)[A-Za-z0-9-]*=).+/i;
46
+ function summarizeLaunchArg(arg) {
47
+ const sensitiveOptionAssignment = arg.match(SENSITIVE_OPTION_ASSIGNMENT_PATTERN);
48
+ if (sensitiveOptionAssignment) {
49
+ return `${sensitiveOptionAssignment[1]}<redacted>`;
50
+ }
51
+ if (SENSITIVE_ENV_ARG_PATTERN.test(arg)) {
52
+ return `${arg.slice(0, arg.indexOf("=") + 1)}<redacted>`;
53
+ }
54
+ return arg.length > 100 ? `${arg.slice(0, 100)}...` : arg;
55
+ }
56
+ export function summarizeLaunchArgs(args) {
57
+ let redactNext = false;
58
+ return args.map((arg) => {
59
+ if (redactNext) {
60
+ redactNext = false;
61
+ return "<redacted>";
62
+ }
63
+ const summarized = summarizeLaunchArg(arg);
64
+ redactNext = SENSITIVE_OPTION_ARG_PATTERN.test(arg) && !arg.includes("=");
65
+ return summarized;
66
+ });
67
+ }
68
+ function firstCodexPositionalArgIndex(args) {
69
+ let skipNext = false;
70
+ for (let i = 0; i < args.length; i += 1) {
71
+ const arg = args[i];
72
+ if (skipNext) {
73
+ skipNext = false;
74
+ continue;
75
+ }
76
+ if (arg === "--") {
77
+ return i;
78
+ }
79
+ if (arg.startsWith("--")) {
80
+ const [name, value] = arg.split("=", 2);
81
+ if (CODEX_OPTIONS_WITH_VALUE.has(name) && value === undefined) {
82
+ skipNext = true;
83
+ }
84
+ continue;
85
+ }
86
+ if (arg.startsWith("-")) {
87
+ if (CODEX_OPTIONS_WITH_VALUE.has(arg)) {
88
+ skipNext = true;
89
+ }
90
+ continue;
91
+ }
92
+ return i;
93
+ }
94
+ return args.length;
95
+ }
96
+ function codexConfigArg(key, value) {
97
+ return `${key}=${JSON.stringify(value)}`;
98
+ }
99
+ export function injectCodexDeveloperInstructions(args, key, instructions) {
100
+ if (!key.trim() || !instructions.trim())
101
+ return [...args];
102
+ const insertionIndex = firstCodexPositionalArgIndex(args);
103
+ return [...args.slice(0, insertionIndex), "-c", codexConfigArg(key, instructions), ...args.slice(insertionIndex)];
104
+ }
13
105
  export async function run(host, opts) {
14
106
  initProject();
15
- await host.instanceDirectory.registerInstance(host.instanceId, process.cwd());
16
107
  host.startHeartbeat();
17
- host.syncSessionsFromState();
18
- host.taskDispatcher = host.createTaskDispatcher();
19
- host.orchestrationDispatcher = host.createOrchestrationDispatcher();
108
+ host.syncSessionsFromTopology();
20
109
  host.defaultCommand = opts.command;
21
110
  host.defaultArgs = opts.args;
22
111
  const config = loadConfig();
@@ -30,11 +119,10 @@ export async function run(host, opts) {
30
119
  }
31
120
  export async function runDashboard(host) {
32
121
  initProject();
33
- await host.instanceDirectory.registerInstance(host.instanceId, process.cwd());
34
122
  host.startHeartbeat();
35
123
  host.startedInDashboard = true;
36
124
  host.mode = "dashboard";
37
- host.syncSessionsFromState();
125
+ host.syncSessionsFromTopology();
38
126
  const config = loadConfig();
39
127
  const defaultTool = config.tools[config.defaultTool];
40
128
  if (defaultTool) {
@@ -130,9 +218,7 @@ export async function runDashboard(host) {
130
218
  export async function runProjectService(host) {
131
219
  initProject();
132
220
  host.mode = "project-service";
133
- host.syncSessionsFromState();
134
- host.taskDispatcher = host.createTaskDispatcher();
135
- host.orchestrationDispatcher = host.createOrchestrationDispatcher();
221
+ host.syncSessionsFromTopology();
136
222
  host.writeInstructionFiles();
137
223
  await host.startProjectServices();
138
224
  host.startStatusRefresh();
@@ -146,60 +232,50 @@ export async function runProjectService(host) {
146
232
  }
147
233
  export async function resumeSessions(host, toolFilter) {
148
234
  initProject();
149
- await host.instanceDirectory.registerInstance(host.instanceId, process.cwd());
150
235
  host.startHeartbeat();
151
- const state = host.constructor.loadState();
152
- if (!state || state.sessions.length === 0) {
236
+ reconcileLaunchableTopology(host);
237
+ const sessionsToResume = listLaunchableTopologySessions(toolFilter);
238
+ if (sessionsToResume.length === 0) {
153
239
  console.error("No saved session state found (or state is stale). Starting fresh.");
154
240
  return host.runDashboard();
155
241
  }
156
242
  const config = loadConfig();
157
- const sessionsToResume = toolFilter
158
- ? state.sessions.filter((s) => s.tool === toolFilter || s.toolConfigKey === toolFilter)
159
- : state.sessions;
160
- if (sessionsToResume.length === 0) {
161
- console.error(`No saved sessions found for tool "${toolFilter}". Starting fresh.`);
162
- return host.runDashboard();
163
- }
164
- const ownedByOthers = host.getRemoteOwnedSessionKeys();
243
+ log.info("resuming saved sessions", "session", {
244
+ requestedTool: toolFilter,
245
+ count: sessionsToResume.length,
246
+ });
165
247
  for (const saved of sessionsToResume) {
166
- if (ownedByOthers.has(saved.id) || (saved.backendSessionId && ownedByOthers.has(saved.backendSessionId))) {
167
- debug(`skipping resume of ${saved.id} — owned by another instance`, "session");
168
- continue;
169
- }
248
+ const backendSessionId = saved.backendSessionId;
170
249
  const toolCfg = config.tools[saved.toolConfigKey];
171
250
  if (!toolCfg)
172
251
  continue;
173
- const bsid = saved.backendSessionId;
174
- let resumeArgs;
175
- if (host.sessionBootstrap.canResumeWithBackendSessionId(toolCfg, bsid)) {
176
- resumeArgs = toolCfg.resumeArgs.map((a) => a.replace("{sessionId}", bsid));
177
- }
178
- else {
179
- resumeArgs = toolCfg.resumeFallback ?? [];
252
+ if (!backendSessionId || !host.sessionBootstrap.canResumeWithBackendSessionId(toolCfg, backendSessionId)) {
253
+ console.error(`Skipping saved session "${saved.id}" because "${saved.toolConfigKey}" has no exact resumable backend session id.`);
254
+ continue;
180
255
  }
256
+ const resumeArgs = toolCfg.resumeArgs.map((a) => a.replace("{sessionId}", backendSessionId));
181
257
  const args = host.sessionBootstrap.composeToolArgs(toolCfg, resumeArgs, saved.args);
182
- debug(`resuming ${saved.command} with backendSessionId=${bsid ?? "none (fallback)"}`, "session");
183
- host.createSession(saved.command, args, toolCfg.preambleFlag, saved.toolConfigKey, undefined, undefined, saved.worktreePath, saved.backendSessionId, undefined, false, true);
258
+ log.info("resuming session", "session", {
259
+ sessionId: saved.id,
260
+ command: saved.command,
261
+ backendSessionId,
262
+ toolConfigKey: saved.toolConfigKey,
263
+ worktreePath: saved.worktreePath,
264
+ });
265
+ host.createSession(saved.command, args, toolCfg.preambleFlag, saved.toolConfigKey, undefined, undefined, saved.worktreePath, backendSessionId, saved.id, false, true, saved.team);
184
266
  }
185
267
  host.openTmuxDashboardTarget();
186
268
  return 0;
187
269
  }
188
270
  export async function restoreSessions(host, toolFilter) {
189
271
  initProject();
190
- const state = host.constructor.loadState();
191
- if (!state || state.sessions.length === 0) {
272
+ reconcileLaunchableTopology(host);
273
+ const sessionsToRestore = listLaunchableTopologySessions(toolFilter);
274
+ if (sessionsToRestore.length === 0) {
192
275
  console.error("No saved session state found (or state is stale). Starting fresh.");
193
276
  return host.runDashboard();
194
277
  }
195
278
  const config = loadConfig();
196
- const sessionsToRestore = toolFilter
197
- ? state.sessions.filter((s) => s.tool === toolFilter || s.toolConfigKey === toolFilter)
198
- : state.sessions;
199
- if (sessionsToRestore.length === 0) {
200
- console.error(`No saved sessions found for tool "${toolFilter}". Starting fresh.`);
201
- return host.runDashboard();
202
- }
203
279
  for (const saved of sessionsToRestore) {
204
280
  const toolCfg = config.tools[saved.toolConfigKey];
205
281
  if (!toolCfg)
@@ -225,12 +301,12 @@ export async function restoreSessions(host, toolFilter) {
225
301
  }
226
302
  const liveContext = buildContextPreamble(sessionsToRestore.filter((s) => s.id !== saved.id).map((s) => s.id));
227
303
  const extraPreamble = historyContext + (liveContext ? "\n" + liveContext : "");
228
- host.createSession(saved.command, saved.args, toolCfg.preambleFlag, saved.toolConfigKey, extraPreamble.trim() || undefined, undefined, saved.worktreePath);
304
+ host.createSession(saved.command, saved.args, toolCfg.preambleFlag, saved.toolConfigKey, extraPreamble.trim() || undefined, undefined, saved.worktreePath, undefined, saved.id, false, false, saved.team);
229
305
  }
230
306
  host.openTmuxDashboardTarget();
231
307
  return 0;
232
308
  }
233
- export function createSession(host, command, args, preambleFlag, toolConfigKey, extraPreamble, sessionIdFlag, worktreePath, backendSessionIdOverride, sessionIdOverride, detachedInTmux = false, suppressStartupPreamble = false) {
309
+ export function createSession(host, command, args, preambleFlag, toolConfigKey, extraPreamble, sessionIdFlag, worktreePath, backendSessionIdOverride, sessionIdOverride, detachedInTmux = false, suppressStartupPreamble = false, team) {
234
310
  const cols = process.stdout.columns ?? 80;
235
311
  const sessionId = sessionIdOverride ?? `${command}-${Math.random().toString(36).slice(2, 8)}`;
236
312
  if (host.sessions.some((session) => session.id === sessionId)) {
@@ -240,9 +316,18 @@ export function createSession(host, command, args, preambleFlag, toolConfigKey,
240
316
  const toolCfg = toolConfigKey ? config.tools[toolConfigKey] : undefined;
241
317
  const isClaudeResumeStyleLaunch = Boolean(toolCfg && toolConfigKey === "claude" && toolCfg.command === command) &&
242
318
  shouldSkipClaudeSessionIdInjection(args);
243
- const effectiveSuppressStartupPreamble = suppressStartupPreamble || isClaudeResumeStyleLaunch;
319
+ const explicitClaudeBackendSessionId = toolCfg && toolConfigKey === "claude" && toolCfg.command === command
320
+ ? extractClaudeBackendSessionIdFromArgs(args)
321
+ : undefined;
322
+ const explicitCodexBackendSessionId = toolCfg && toolConfigKey === "codex" && toolCfg.command === command
323
+ ? extractCodexBackendSessionIdFromArgs(args)
324
+ : undefined;
325
+ const effectiveSuppressStartupPreamble = suppressStartupPreamble;
244
326
  const effectiveSessionIdFlag = isClaudeResumeStyleLaunch ? undefined : sessionIdFlag;
245
- const backendSessionId = backendSessionIdOverride ?? (effectiveSessionIdFlag ? randomUUID() : undefined);
327
+ const backendSessionId = backendSessionIdOverride ??
328
+ explicitClaudeBackendSessionId ??
329
+ explicitCodexBackendSessionId ??
330
+ (effectiveSessionIdFlag ? randomUUID() : undefined);
246
331
  const automaticPreambleEnabled = config.runtime.agentPreambleEnabled !== false;
247
332
  const preamble = effectiveSuppressStartupPreamble
248
333
  ? ""
@@ -252,10 +337,19 @@ export function createSession(host, command, args, preambleFlag, toolConfigKey,
252
337
  worktreePath,
253
338
  extraPreamble,
254
339
  includeAimuxPreamble: automaticPreambleEnabled,
340
+ team,
255
341
  });
256
342
  const shouldInjectLaunchPreamble = Boolean(!effectiveSuppressStartupPreamble && preambleFlag && preamble.trim());
343
+ const shouldInjectCodexDeveloperInstructions = Boolean(!effectiveSuppressStartupPreamble &&
344
+ toolCfg?.command === command &&
345
+ command === "codex" &&
346
+ toolCfg.developerInstructionsConfigKey &&
347
+ preamble.trim());
257
348
  host.sessionBootstrap.ensurePlanFile(sessionId, command, worktreePath);
258
349
  let finalArgs = shouldInjectLaunchPreamble ? [...args, ...preambleFlag, preamble] : [...args];
350
+ if (shouldInjectCodexDeveloperInstructions) {
351
+ finalArgs = injectCodexDeveloperInstructions(finalArgs, toolCfg.developerInstructionsConfigKey, preamble);
352
+ }
259
353
  let launchCommand = command;
260
354
  if (effectiveSessionIdFlag && backendSessionId) {
261
355
  const expandedFlag = effectiveSessionIdFlag.map((a) => a.replace("{sessionId}", backendSessionId));
@@ -268,6 +362,8 @@ export function createSession(host, command, args, preambleFlag, toolConfigKey,
268
362
  catch {
269
363
  projectRoot = process.cwd();
270
364
  }
365
+ clearSessionTranscriptPath(sessionId);
366
+ clearSessionTranscriptPath(sessionId, projectRoot);
271
367
  if (toolCfg && toolConfigKey === "claude" && toolCfg.command === command && toolCfg.wrapperEnabled !== false) {
272
368
  finalArgs = injectClaudeHookArgs(finalArgs, {
273
369
  sessionId,
@@ -301,18 +397,19 @@ export function createSession(host, command, args, preambleFlag, toolConfigKey,
301
397
  host.sessionBootstrap.finalizePreamble(command, preamble);
302
398
  }
303
399
  debug(`creating session: ${command} (configKey=${toolConfigKey ?? "cli"}, backendId=${backendSessionId ?? "none"}, cwd=${worktreePath ?? process.cwd()}, args=${finalArgs.length})`, "session");
304
- debug(`spawn args: ${JSON.stringify(finalArgs.map((a) => (a.length > 100 ? a.slice(0, 100) + "..." : a)))}`, "session");
400
+ debug(`spawn args: ${JSON.stringify(summarizeLaunchArgs(finalArgs))}`, "session");
305
401
  const sessionStartTime = Date.now();
306
402
  const tmuxSession = host.tmuxRuntimeManager.ensureProjectSession(process.cwd());
307
403
  const target = host.tmuxRuntimeManager.createWindow(tmuxSession.sessionName, host.getSessionLabel(sessionId) ?? command, worktreePath ?? process.cwd(), launchCommand, finalArgs, { detached: detachedInTmux });
308
404
  const tmuxTransport = new TmuxSessionTransport(sessionId, command, target, host.tmuxRuntimeManager, cols, process.stdout.rows ?? 24);
309
405
  host.sessionTmuxTargets.set(sessionId, target);
310
406
  const session = tmuxTransport;
311
- host.registerManagedSession(tmuxTransport, args, toolConfigKey, worktreePath, undefined, sessionStartTime);
407
+ host.registerManagedSession(tmuxTransport, args, toolConfigKey, worktreePath, undefined, sessionStartTime, team);
312
408
  session.backendSessionId = backendSessionId;
313
409
  if (session instanceof TmuxSessionTransport) {
314
410
  host.syncTmuxWindowMetadata(sessionId);
315
411
  }
412
+ void projectRoot;
316
413
  host.activeIndex = host.sessions.length - 1;
317
414
  if (host.startedInDashboard && host.mode === "dashboard") {
318
415
  host.invalidateDesktopStateSnapshot();
@@ -322,14 +419,6 @@ export function createSession(host, command, args, preambleFlag, toolConfigKey,
322
419
  host.renderDashboard();
323
420
  }
324
421
  host.saveState();
325
- if (!effectiveSuppressStartupPreamble &&
326
- !preambleFlag &&
327
- !extraPreamble &&
328
- automaticPreambleEnabled &&
329
- preamble.trim()) {
330
- const kickoff = host.sessionBootstrap.buildInitialKickoffPrompt(sessionId, preamble);
331
- void host.sessionBootstrap.deliverDetachedCodexKickoffPrompt(sessionId, kickoff, 1800);
332
- }
333
422
  return session;
334
423
  }
335
424
  export async function migrateAgent(host, sessionId, targetWorktreePath) {
@@ -382,12 +471,11 @@ export async function migrateAgent(host, sessionId, targetWorktreePath) {
382
471
  session.kill();
383
472
  await waitForExit().catch(() => { });
384
473
  if (!toolCfg?.preambleFlag) {
385
- createSession(host, session.command, originalArgs, undefined, toolConfigKey, undefined, undefined, effectiveTarget, backendSessionId, sessionId, true, true);
386
- const kickoff = host.sessionBootstrap.buildCodexMigrationKickoffPrompt(sessionId, sourceCwd, targetWorktreePath, sourceSnapshot);
387
- await host.sessionBootstrap.deliverDetachedCodexKickoffPrompt(sessionId, kickoff, 1800);
474
+ const continuityPreamble = host.sessionBootstrap.buildCodexMigrationContinuityPreamble(sessionId, sourceCwd, targetWorktreePath, sourceSnapshot);
475
+ createSession(host, session.command, migrateArgs, undefined, toolConfigKey, continuityPreamble, undefined, effectiveTarget, useBackendResume ? backendSessionId : undefined, sessionId, true, false, session.team);
388
476
  return;
389
477
  }
390
- createSession(host, session.command, migrateArgs, useBackendResume ? undefined : toolCfg?.preambleFlag, toolConfigKey, historyContext.trim() || undefined, useBackendResume ? undefined : toolCfg?.sessionIdFlag, effectiveTarget, backendSessionId, sessionId);
478
+ createSession(host, session.command, migrateArgs, useBackendResume ? undefined : toolCfg?.preambleFlag, toolConfigKey, historyContext.trim() || undefined, useBackendResume ? undefined : toolCfg?.sessionIdFlag, effectiveTarget, useBackendResume ? backendSessionId : undefined, sessionId, false, false, session.team);
391
479
  }
392
480
  export function getSessionWorktreePath(host, sessionId) {
393
481
  return host.sessionWorktreePaths.get(sessionId);
@@ -415,6 +503,7 @@ export function focusSession(host, index) {
415
503
  host.agentTracker.markSeen(sid);
416
504
  updateNotificationContext("tui", {
417
505
  focused: true,
506
+ screen: "agent",
418
507
  sessionId: sid,
419
508
  panelOpen: false,
420
509
  });
@@ -497,8 +586,7 @@ export function handleAction(host, action) {
497
586
  host.showWorktreeList();
498
587
  break;
499
588
  case "review":
500
- host.handleReviewRequest();
589
+ void host.handleReviewRequest();
501
590
  break;
502
591
  }
503
592
  }
504
- //# sourceMappingURL=session-launch.js.map
@@ -1,6 +1,4 @@
1
- import { TmuxSessionTransport } from "../tmux/session-transport.js";
2
- import { readSessionMessages } from "../session-message-history.js";
3
- import { type SessionInputOperationRecord } from "../session-input-operations.js";
1
+ import type { SessionTeamMetadata } from "../team.js";
4
2
  type SessionRuntimeHost = any;
5
3
  export declare function getSessionLabel(host: SessionRuntimeHost, sessionId: string): string | undefined;
6
4
  export declare function applySessionLabel(host: SessionRuntimeHost, sessionId: string, label?: string): void;
@@ -10,24 +8,12 @@ export declare function readStatusHeadline(_host: SessionRuntimeHost, sessionId:
10
8
  export declare function deriveHeadline(host: SessionRuntimeHost, sessionId: string): string | undefined;
11
9
  export declare function resolveRunningSession(host: SessionRuntimeHost, sessionId: string): any;
12
10
  export declare function resolveLiveSessionTmuxTarget(host: SessionRuntimeHost, sessionId: string, fallback?: any): any;
13
- export declare function writeTmuxAgentInput(host: SessionRuntimeHost, sessionId: string, transport: TmuxSessionTransport, data: string): void;
14
- export declare function normalizeAgentInput(host: SessionRuntimeHost, data: string, submit: boolean, sessionId?: string): string;
15
- export declare function paneStillContainsAgentDraft(host: SessionRuntimeHost, target: any, draft: string): boolean;
16
- export declare function scheduleTmuxAgentSubmit(host: SessionRuntimeHost, sessionId: string, target: any, draft: string): void;
17
- export declare function writeAgentInput(host: SessionRuntimeHost, sessionId: string, data?: string, parts?: any[], clientMessageId?: string, submit?: boolean): Promise<{
18
- sessionId: string;
19
- accepted: boolean;
20
- operation: SessionInputOperationRecord;
21
- messageId?: string;
22
- error?: string;
23
- }>;
24
- export declare function readAgentHistory(host: SessionRuntimeHost, sessionId: string, lastN?: number): Promise<{
11
+ export declare function interruptAgent(host: SessionRuntimeHost, sessionId: string): Promise<{
25
12
  sessionId: string;
26
- messages: ReturnType<typeof readSessionMessages>;
27
- lastN?: number;
28
13
  }>;
29
- export declare function interruptAgent(host: SessionRuntimeHost, sessionId: string): Promise<{
14
+ export declare function sendAgentInput(host: SessionRuntimeHost, sessionId: string, text: string): Promise<{
30
15
  sessionId: string;
16
+ accepted: true;
31
17
  }>;
32
18
  export declare function readAgentOutput(host: SessionRuntimeHost, sessionId: string, startLine?: number): Promise<{
33
19
  sessionId: string;
@@ -35,9 +21,11 @@ export declare function readAgentOutput(host: SessionRuntimeHost, sessionId: str
35
21
  startLine?: number;
36
22
  parsed: any;
37
23
  }>;
38
- export declare function registerManagedSession(host: SessionRuntimeHost, session: any, args: string[], toolConfigKey?: string, worktreePath?: string, role?: string, startTime?: number): any;
24
+ export declare function registerManagedSession(host: SessionRuntimeHost, session: any, args: string[], toolConfigKey?: string, worktreePath?: string, role?: string, startTime?: number, team?: SessionTeamMetadata): any;
39
25
  export declare function handleSessionRuntimeEvent(host: SessionRuntimeHost, runtime: any, event: any): void;
40
- export declare function buildTmuxWindowMetadata(host: SessionRuntimeHost, sessionId: string, command: string): any;
26
+ export declare function buildTmuxWindowMetadata(host: SessionRuntimeHost, sessionId: string, command: string, existing?: {
27
+ team?: SessionTeamMetadata;
28
+ } | null): any;
41
29
  export declare function syncTmuxWindowMetadata(host: SessionRuntimeHost, sessionId: string): void;
42
30
  export declare function updateContextWatcherSessions(host: SessionRuntimeHost): void;
43
31
  export {};