botmux 3.7.1 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/capabilities.d.ts +17 -0
  3. package/dist/adapters/backend/capabilities.d.ts.map +1 -0
  4. package/dist/adapters/backend/capabilities.js +22 -0
  5. package/dist/adapters/backend/capabilities.js.map +1 -0
  6. package/dist/adapters/backend/critical-control-key.d.ts +19 -0
  7. package/dist/adapters/backend/critical-control-key.d.ts.map +1 -0
  8. package/dist/adapters/backend/critical-control-key.js +34 -0
  9. package/dist/adapters/backend/critical-control-key.js.map +1 -0
  10. package/dist/adapters/backend/herdr-backend.d.ts +9 -0
  11. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/herdr-backend.js +23 -4
  13. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  14. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  15. package/dist/adapters/backend/riff-backend.js +3 -2
  16. package/dist/adapters/backend/riff-backend.js.map +1 -1
  17. package/dist/adapters/backend/session-backend-selector.d.ts +61 -6
  18. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  19. package/dist/adapters/backend/session-backend-selector.js +173 -9
  20. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  21. package/dist/adapters/backend/tmux-backend.d.ts +10 -3
  22. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  23. package/dist/adapters/backend/tmux-backend.js +25 -8
  24. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  25. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  26. package/dist/adapters/backend/tmux-pipe-backend.js +3 -2
  27. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  28. package/dist/adapters/backend/types.d.ts +45 -4
  29. package/dist/adapters/backend/types.d.ts.map +1 -1
  30. package/dist/adapters/backend/types.js +11 -0
  31. package/dist/adapters/backend/types.js.map +1 -1
  32. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  33. package/dist/adapters/backend/zellij-backend.js +3 -2
  34. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  35. package/dist/adapters/backend/zmx-backend.d.ts +286 -0
  36. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -0
  37. package/dist/adapters/backend/zmx-backend.js +2396 -0
  38. package/dist/adapters/backend/zmx-backend.js.map +1 -0
  39. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  40. package/dist/adapters/cli/claude-code.js +3 -0
  41. package/dist/adapters/cli/claude-code.js.map +1 -1
  42. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  43. package/dist/adapters/cli/codex-app.js +5 -1
  44. package/dist/adapters/cli/codex-app.js.map +1 -1
  45. package/dist/adapters/cli/codex.d.ts.map +1 -1
  46. package/dist/adapters/cli/codex.js +26 -1
  47. package/dist/adapters/cli/codex.js.map +1 -1
  48. package/dist/adapters/cli/fs-policy.d.ts +79 -1
  49. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  50. package/dist/adapters/cli/fs-policy.js +290 -13
  51. package/dist/adapters/cli/fs-policy.js.map +1 -1
  52. package/dist/adapters/cli/grok.d.ts.map +1 -1
  53. package/dist/adapters/cli/grok.js +4 -1
  54. package/dist/adapters/cli/grok.js.map +1 -1
  55. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  56. package/dist/adapters/cli/oh-my-pi.js +5 -3
  57. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  58. package/dist/adapters/cli/shared-hints.d.ts +7 -4
  59. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  60. package/dist/adapters/cli/shared-hints.js +52 -35
  61. package/dist/adapters/cli/shared-hints.js.map +1 -1
  62. package/dist/adapters/cli/strict-input-handle.d.ts +13 -0
  63. package/dist/adapters/cli/strict-input-handle.d.ts.map +1 -0
  64. package/dist/adapters/cli/strict-input-handle.js +39 -0
  65. package/dist/adapters/cli/strict-input-handle.js.map +1 -0
  66. package/dist/adapters/cli/traex.d.ts.map +1 -1
  67. package/dist/adapters/cli/traex.js +6 -4
  68. package/dist/adapters/cli/traex.js.map +1 -1
  69. package/dist/adapters/cli/types.d.ts +16 -0
  70. package/dist/adapters/cli/types.d.ts.map +1 -1
  71. package/dist/bot-registry.d.ts +137 -8
  72. package/dist/bot-registry.d.ts.map +1 -1
  73. package/dist/bot-registry.js +298 -12
  74. package/dist/bot-registry.js.map +1 -1
  75. package/dist/cli/session-list-liveness.d.ts +1 -1
  76. package/dist/cli/session-list-liveness.js +1 -1
  77. package/dist/cli/zmx-managed-attach.d.ts +41 -0
  78. package/dist/cli/zmx-managed-attach.d.ts.map +1 -0
  79. package/dist/cli/zmx-managed-attach.js +72 -0
  80. package/dist/cli/zmx-managed-attach.js.map +1 -0
  81. package/dist/cli.d.ts.map +1 -1
  82. package/dist/cli.js +780 -131
  83. package/dist/cli.js.map +1 -1
  84. package/dist/codex-app-runner.js +90 -2
  85. package/dist/codex-app-runner.js.map +1 -1
  86. package/dist/codex-rpc-engine.d.ts.map +1 -1
  87. package/dist/codex-rpc-engine.js +22 -6
  88. package/dist/codex-rpc-engine.js.map +1 -1
  89. package/dist/config.d.ts +5 -0
  90. package/dist/config.d.ts.map +1 -1
  91. package/dist/config.js +29 -1
  92. package/dist/config.js.map +1 -1
  93. package/dist/core/ask-broker.d.ts +22 -1
  94. package/dist/core/ask-broker.d.ts.map +1 -1
  95. package/dist/core/ask-broker.js +12 -5
  96. package/dist/core/ask-broker.js.map +1 -1
  97. package/dist/core/botmux-wrapper.d.ts +18 -0
  98. package/dist/core/botmux-wrapper.d.ts.map +1 -1
  99. package/dist/core/botmux-wrapper.js +25 -1
  100. package/dist/core/botmux-wrapper.js.map +1 -1
  101. package/dist/core/chat-rename.d.ts +27 -0
  102. package/dist/core/chat-rename.d.ts.map +1 -0
  103. package/dist/core/chat-rename.js +53 -0
  104. package/dist/core/chat-rename.js.map +1 -0
  105. package/dist/core/command-handler.d.ts.map +1 -1
  106. package/dist/core/command-handler.js +160 -12
  107. package/dist/core/command-handler.js.map +1 -1
  108. package/dist/core/cost-calculator.d.ts +25 -1
  109. package/dist/core/cost-calculator.d.ts.map +1 -1
  110. package/dist/core/cost-calculator.js +102 -4
  111. package/dist/core/cost-calculator.js.map +1 -1
  112. package/dist/core/dashboard-ipc-server.d.ts +16 -2
  113. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  114. package/dist/core/dashboard-ipc-server.js +611 -62
  115. package/dist/core/dashboard-ipc-server.js.map +1 -1
  116. package/dist/core/dashboard-rows.d.ts +22 -1
  117. package/dist/core/dashboard-rows.d.ts.map +1 -1
  118. package/dist/core/dashboard-rows.js +61 -0
  119. package/dist/core/dashboard-rows.js.map +1 -1
  120. package/dist/core/dashboard-url.d.ts +6 -0
  121. package/dist/core/dashboard-url.d.ts.map +1 -1
  122. package/dist/core/dashboard-url.js +11 -1
  123. package/dist/core/dashboard-url.js.map +1 -1
  124. package/dist/core/device-isolation-daemon.d.ts +28 -6
  125. package/dist/core/device-isolation-daemon.d.ts.map +1 -1
  126. package/dist/core/device-isolation-daemon.js +96 -13
  127. package/dist/core/device-isolation-daemon.js.map +1 -1
  128. package/dist/core/host-overload-alert.d.ts +75 -0
  129. package/dist/core/host-overload-alert.d.ts.map +1 -1
  130. package/dist/core/host-overload-alert.js +103 -0
  131. package/dist/core/host-overload-alert.js.map +1 -1
  132. package/dist/core/idle-worker-sweeper.js +1 -1
  133. package/dist/core/idle-worker-sweeper.js.map +1 -1
  134. package/dist/core/inflight-input-tracker.d.ts +3 -0
  135. package/dist/core/inflight-input-tracker.d.ts.map +1 -1
  136. package/dist/core/inflight-input-tracker.js +9 -0
  137. package/dist/core/inflight-input-tracker.js.map +1 -1
  138. package/dist/core/passthrough-commands.d.ts.map +1 -1
  139. package/dist/core/passthrough-commands.js +10 -0
  140. package/dist/core/passthrough-commands.js.map +1 -1
  141. package/dist/core/persistent-backend.d.ts +32 -4
  142. package/dist/core/persistent-backend.d.ts.map +1 -1
  143. package/dist/core/persistent-backend.js +75 -6
  144. package/dist/core/persistent-backend.js.map +1 -1
  145. package/dist/core/plugins/mcp/gateway.js +2 -2
  146. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  147. package/dist/core/plugins/runtime.d.ts +3 -0
  148. package/dist/core/plugins/runtime.d.ts.map +1 -1
  149. package/dist/core/plugins/runtime.js.map +1 -1
  150. package/dist/core/plugins/service-manager.d.ts +4 -1
  151. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  152. package/dist/core/plugins/service-manager.js +11 -6
  153. package/dist/core/plugins/service-manager.js.map +1 -1
  154. package/dist/core/role-library.d.ts +48 -1
  155. package/dist/core/role-library.d.ts.map +1 -1
  156. package/dist/core/role-library.js +111 -3
  157. package/dist/core/role-library.js.map +1 -1
  158. package/dist/core/role-resolver.d.ts +14 -2
  159. package/dist/core/role-resolver.d.ts.map +1 -1
  160. package/dist/core/role-resolver.js +47 -4
  161. package/dist/core/role-resolver.js.map +1 -1
  162. package/dist/core/session-activity.d.ts +14 -0
  163. package/dist/core/session-activity.d.ts.map +1 -1
  164. package/dist/core/session-activity.js +46 -1
  165. package/dist/core/session-activity.js.map +1 -1
  166. package/dist/core/session-board.d.ts +5 -2
  167. package/dist/core/session-board.d.ts.map +1 -1
  168. package/dist/core/session-board.js +5 -2
  169. package/dist/core/session-board.js.map +1 -1
  170. package/dist/core/session-liveness.d.ts +6 -5
  171. package/dist/core/session-liveness.d.ts.map +1 -1
  172. package/dist/core/session-liveness.js +34 -13
  173. package/dist/core/session-liveness.js.map +1 -1
  174. package/dist/core/session-manager.d.ts +3 -2
  175. package/dist/core/session-manager.d.ts.map +1 -1
  176. package/dist/core/session-manager.js +397 -103
  177. package/dist/core/session-manager.js.map +1 -1
  178. package/dist/core/session-marker.d.ts +11 -2
  179. package/dist/core/session-marker.d.ts.map +1 -1
  180. package/dist/core/session-marker.js +50 -11
  181. package/dist/core/session-marker.js.map +1 -1
  182. package/dist/core/session-message-preview.d.ts +20 -0
  183. package/dist/core/session-message-preview.d.ts.map +1 -0
  184. package/dist/core/session-message-preview.js +188 -0
  185. package/dist/core/session-message-preview.js.map +1 -0
  186. package/dist/core/session-title.d.ts +5 -1
  187. package/dist/core/session-title.d.ts.map +1 -1
  188. package/dist/core/session-title.js +20 -3
  189. package/dist/core/session-title.js.map +1 -1
  190. package/dist/core/startup-commands.d.ts +1 -1
  191. package/dist/core/startup-commands.js +1 -1
  192. package/dist/core/terminal-url.d.ts.map +1 -1
  193. package/dist/core/terminal-url.js +3 -2
  194. package/dist/core/terminal-url.js.map +1 -1
  195. package/dist/core/trigger-session.d.ts.map +1 -1
  196. package/dist/core/trigger-session.js +75 -12
  197. package/dist/core/trigger-session.js.map +1 -1
  198. package/dist/core/types.d.ts +35 -0
  199. package/dist/core/types.d.ts.map +1 -1
  200. package/dist/core/types.js +23 -0
  201. package/dist/core/types.js.map +1 -1
  202. package/dist/core/worker-ipc.d.ts +11 -0
  203. package/dist/core/worker-ipc.d.ts.map +1 -0
  204. package/dist/core/worker-ipc.js +26 -0
  205. package/dist/core/worker-ipc.js.map +1 -0
  206. package/dist/core/worker-pool.d.ts +179 -29
  207. package/dist/core/worker-pool.d.ts.map +1 -1
  208. package/dist/core/worker-pool.js +2118 -331
  209. package/dist/core/worker-pool.js.map +1 -1
  210. package/dist/daemon.d.ts +132 -3
  211. package/dist/daemon.d.ts.map +1 -1
  212. package/dist/daemon.js +1327 -449
  213. package/dist/daemon.js.map +1 -1
  214. package/dist/dashboard/auth.d.ts +2 -0
  215. package/dist/dashboard/auth.d.ts.map +1 -1
  216. package/dist/dashboard/auth.js +9 -0
  217. package/dist/dashboard/auth.js.map +1 -1
  218. package/dist/dashboard/bot-payload.d.ts +4 -0
  219. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  220. package/dist/dashboard/bot-payload.js +5 -0
  221. package/dist/dashboard/bot-payload.js.map +1 -1
  222. package/dist/dashboard/federation-api.d.ts.map +1 -1
  223. package/dist/dashboard/federation-api.js +4 -0
  224. package/dist/dashboard/federation-api.js.map +1 -1
  225. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  226. package/dist/dashboard/federation-spoke-api.js +32 -5
  227. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  228. package/dist/dashboard/public-redact.d.ts +8 -2
  229. package/dist/dashboard/public-redact.d.ts.map +1 -1
  230. package/dist/dashboard/public-redact.js +34 -7
  231. package/dist/dashboard/public-redact.js.map +1 -1
  232. package/dist/dashboard/session-card-model.d.ts.map +1 -1
  233. package/dist/dashboard/session-card-model.js +10 -2
  234. package/dist/dashboard/session-card-model.js.map +1 -1
  235. package/dist/dashboard/settings-write-applier.d.ts +35 -1
  236. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  237. package/dist/dashboard/settings-write-applier.js +88 -1
  238. package/dist/dashboard/settings-write-applier.js.map +1 -1
  239. package/dist/dashboard/web/app.d.ts.map +1 -1
  240. package/dist/dashboard/web/app.js +0 -1
  241. package/dist/dashboard/web/app.js.map +1 -1
  242. package/dist/dashboard/web/bot-defaults-page.d.ts +15 -0
  243. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  244. package/dist/dashboard/web/bot-defaults-page.js +212 -58
  245. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  246. package/dist/dashboard/web/bot-defaults.d.ts +3 -0
  247. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  248. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  249. package/dist/dashboard/web/bot-onboarding.d.ts +2 -1
  250. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  251. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  252. package/dist/dashboard/web/clipboard.d.ts +2 -0
  253. package/dist/dashboard/web/clipboard.d.ts.map +1 -0
  254. package/dist/dashboard/web/clipboard.js +42 -0
  255. package/dist/dashboard/web/clipboard.js.map +1 -0
  256. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  257. package/dist/dashboard/web/connectors-page.js +12 -8
  258. package/dist/dashboard/web/connectors-page.js.map +1 -1
  259. package/dist/dashboard/web/dashboard-components.d.ts +17 -16
  260. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
  261. package/dist/dashboard/web/dashboard-components.js.map +1 -1
  262. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  263. package/dist/dashboard/web/groups-page.js +7 -3
  264. package/dist/dashboard/web/groups-page.js.map +1 -1
  265. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  266. package/dist/dashboard/web/i18n.js +205 -12
  267. package/dist/dashboard/web/i18n.js.map +1 -1
  268. package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -1
  269. package/dist/dashboard/web/icon-tooltip.js +16 -1
  270. package/dist/dashboard/web/icon-tooltip.js.map +1 -1
  271. package/dist/dashboard/web/listener-filters.d.ts +23 -0
  272. package/dist/dashboard/web/listener-filters.d.ts.map +1 -0
  273. package/dist/dashboard/web/listener-filters.js +36 -0
  274. package/dist/dashboard/web/listener-filters.js.map +1 -0
  275. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  276. package/dist/dashboard/web/overview-page.js.map +1 -1
  277. package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
  278. package/dist/dashboard/web/plugin-page.js.map +1 -1
  279. package/dist/dashboard/web/preview-markdown.d.ts +5 -0
  280. package/dist/dashboard/web/preview-markdown.d.ts.map +1 -0
  281. package/dist/dashboard/web/preview-markdown.js +52 -0
  282. package/dist/dashboard/web/preview-markdown.js.map +1 -0
  283. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  284. package/dist/dashboard/web/roles-page.js +535 -10
  285. package/dist/dashboard/web/roles-page.js.map +1 -1
  286. package/dist/dashboard/web/roles.d.ts +77 -0
  287. package/dist/dashboard/web/roles.d.ts.map +1 -1
  288. package/dist/dashboard/web/roles.js +98 -0
  289. package/dist/dashboard/web/roles.js.map +1 -1
  290. package/dist/dashboard/web/session-terminal.d.ts.map +1 -1
  291. package/dist/dashboard/web/session-terminal.js +6 -4
  292. package/dist/dashboard/web/session-terminal.js.map +1 -1
  293. package/dist/dashboard/web/sessions-kanban.d.ts +4 -1
  294. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  295. package/dist/dashboard/web/sessions-kanban.js +1 -1
  296. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  297. package/dist/dashboard/web/sessions-page.d.ts +3 -2
  298. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  299. package/dist/dashboard/web/sessions-page.js +163 -28
  300. package/dist/dashboard/web/sessions-page.js.map +1 -1
  301. package/dist/dashboard/web/sessions.d.ts +25 -0
  302. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  303. package/dist/dashboard/web/sessions.js +58 -7
  304. package/dist/dashboard/web/sessions.js.map +1 -1
  305. package/dist/dashboard/web/settings-page.d.ts +28 -3
  306. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  307. package/dist/dashboard/web/settings-page.js +61 -1
  308. package/dist/dashboard/web/settings-page.js.map +1 -1
  309. package/dist/dashboard/web/skills-page.d.ts +6 -5
  310. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  311. package/dist/dashboard/web/skills-page.js +2 -0
  312. package/dist/dashboard/web/skills-page.js.map +1 -1
  313. package/dist/dashboard/web/v3-components.d.ts +3 -2
  314. package/dist/dashboard/web/v3-components.d.ts.map +1 -1
  315. package/dist/dashboard/web/v3-components.js.map +1 -1
  316. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +12 -2
  317. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  318. package/dist/dashboard/web/vc-consumer-profiles-section.js +0 -9
  319. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  320. package/dist/dashboard/web/webhook-logs-page.d.ts +2 -1
  321. package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -1
  322. package/dist/dashboard/web/webhook-logs-page.js +4 -1
  323. package/dist/dashboard/web/webhook-logs-page.js.map +1 -1
  324. package/dist/dashboard-web/app.js +1 -1
  325. package/dist/dashboard-web/chunks/bot-defaults-page-FAPIMQV3.js +10 -0
  326. package/dist/dashboard-web/chunks/{chunk-QFMH6ITB.js → chunk-5CJMHTT4.js} +1 -1
  327. package/dist/dashboard-web/chunks/{chunk-KQB42ML5.js → chunk-DLZK52JU.js} +14 -12
  328. package/dist/dashboard-web/chunks/chunk-FDZ7WOBW.js +16 -0
  329. package/dist/dashboard-web/chunks/{chunk-3QAUJXAS.js → chunk-GTAJV5YC.js} +1 -1
  330. package/dist/dashboard-web/chunks/{chunk-FNPGOZMX.js → chunk-IHNG6KE6.js} +1 -1
  331. package/dist/dashboard-web/chunks/{chunk-FLGXZJTD.js → chunk-VA6QWSGQ.js} +1 -1
  332. package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
  333. package/dist/dashboard-web/chunks/chunk-ZJVTGU5X.js +1 -0
  334. package/dist/dashboard-web/chunks/connectors-page-LKWRT3GS.js +1 -0
  335. package/dist/dashboard-web/chunks/groups-page-V6654ICQ.js +8 -0
  336. package/dist/dashboard-web/chunks/insights-page-237RMFQ5.js +7 -0
  337. package/dist/dashboard-web/chunks/{monitor-room-7IVIS75W.js → monitor-room-OO5Y4FRQ.js} +1 -1
  338. package/dist/dashboard-web/chunks/{monitoring-page-5SSJRQZF.js → monitoring-page-OUEITM5P.js} +1 -1
  339. package/dist/dashboard-web/chunks/{office-page-EOND3L5D.js → office-page-4KNAHQ4Q.js} +1 -1
  340. package/dist/dashboard-web/chunks/{overview-page-NISBVBBJ.js → overview-page-QDP4YK2S.js} +1 -1
  341. package/dist/dashboard-web/chunks/{plugin-page-JXC5F5YV.js → plugin-page-VEGTCEAS.js} +1 -1
  342. package/dist/dashboard-web/chunks/roles-page-PGXNZZNP.js +1 -0
  343. package/dist/dashboard-web/chunks/{schedules-page-AVOOKLUH.js → schedules-page-BJNC5TID.js} +1 -1
  344. package/dist/dashboard-web/chunks/sessions-page-M2ZYYCMO.js +6 -0
  345. package/dist/dashboard-web/chunks/settings-page-IJFZKUUW.js +2 -0
  346. package/dist/dashboard-web/chunks/{skills-page-5MW54PCC.js → skills-page-YRAIRZOQ.js} +3 -3
  347. package/dist/dashboard-web/chunks/{team-federation-page-2SNIMVXI.js → team-federation-page-DEU27GRU.js} +1 -1
  348. package/dist/dashboard-web/chunks/{v3-page-W6SBXXQC.js → v3-page-6KHEW2YL.js} +5 -5
  349. package/dist/dashboard-web/chunks/{whiteboards-page-STC54KTP.js → whiteboards-page-VDECAALH.js} +1 -1
  350. package/dist/dashboard-web/style.css +12545 -11432
  351. package/dist/dashboard.js +215 -36
  352. package/dist/dashboard.js.map +1 -1
  353. package/dist/global-config.d.ts +41 -2
  354. package/dist/global-config.d.ts.map +1 -1
  355. package/dist/global-config.js +47 -0
  356. package/dist/global-config.js.map +1 -1
  357. package/dist/i18n/en.d.ts.map +1 -1
  358. package/dist/i18n/en.js +71 -19
  359. package/dist/i18n/en.js.map +1 -1
  360. package/dist/i18n/zh.d.ts.map +1 -1
  361. package/dist/i18n/zh.js +71 -19
  362. package/dist/i18n/zh.js.map +1 -1
  363. package/dist/im/lark/callback-button-marker.d.ts +34 -0
  364. package/dist/im/lark/callback-button-marker.d.ts.map +1 -0
  365. package/dist/im/lark/callback-button-marker.js +99 -0
  366. package/dist/im/lark/callback-button-marker.js.map +1 -0
  367. package/dist/im/lark/card-builder.d.ts +46 -10
  368. package/dist/im/lark/card-builder.d.ts.map +1 -1
  369. package/dist/im/lark/card-builder.js +299 -78
  370. package/dist/im/lark/card-builder.js.map +1 -1
  371. package/dist/im/lark/card-handler.d.ts +3 -4
  372. package/dist/im/lark/card-handler.d.ts.map +1 -1
  373. package/dist/im/lark/card-handler.js +380 -148
  374. package/dist/im/lark/card-handler.js.map +1 -1
  375. package/dist/im/lark/client.d.ts +24 -1
  376. package/dist/im/lark/client.d.ts.map +1 -1
  377. package/dist/im/lark/client.js +101 -8
  378. package/dist/im/lark/client.js.map +1 -1
  379. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  380. package/dist/im/lark/doc-comment.js +6 -1
  381. package/dist/im/lark/doc-comment.js.map +1 -1
  382. package/dist/im/lark/event-dispatcher.d.ts +115 -3
  383. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  384. package/dist/im/lark/event-dispatcher.js +534 -147
  385. package/dist/im/lark/event-dispatcher.js.map +1 -1
  386. package/dist/im/lark/grant-command.d.ts +16 -12
  387. package/dist/im/lark/grant-command.d.ts.map +1 -1
  388. package/dist/im/lark/grant-command.js +48 -151
  389. package/dist/im/lark/grant-command.js.map +1 -1
  390. package/dist/im/lark/grant-pending.d.ts +12 -4
  391. package/dist/im/lark/grant-pending.d.ts.map +1 -1
  392. package/dist/im/lark/grant-pending.js +31 -8
  393. package/dist/im/lark/grant-pending.js.map +1 -1
  394. package/dist/im/lark/invite-command.d.ts +20 -0
  395. package/dist/im/lark/invite-command.d.ts.map +1 -0
  396. package/dist/im/lark/invite-command.js +239 -0
  397. package/dist/im/lark/invite-command.js.map +1 -0
  398. package/dist/im/lark/md-card.d.ts +66 -4
  399. package/dist/im/lark/md-card.d.ts.map +1 -1
  400. package/dist/im/lark/md-card.js +201 -31
  401. package/dist/im/lark/md-card.js.map +1 -1
  402. package/dist/im/lark/mention-targets.d.ts +43 -0
  403. package/dist/im/lark/mention-targets.d.ts.map +1 -0
  404. package/dist/im/lark/mention-targets.js +190 -0
  405. package/dist/im/lark/mention-targets.js.map +1 -0
  406. package/dist/im/lark/message-parser.d.ts +31 -0
  407. package/dist/im/lark/message-parser.d.ts.map +1 -1
  408. package/dist/im/lark/message-parser.js +305 -32
  409. package/dist/im/lark/message-parser.js.map +1 -1
  410. package/dist/im/lark/reply-card-footer-signature.d.ts +7 -0
  411. package/dist/im/lark/reply-card-footer-signature.d.ts.map +1 -0
  412. package/dist/im/lark/reply-card-footer-signature.js +7 -0
  413. package/dist/im/lark/reply-card-footer-signature.js.map +1 -0
  414. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  415. package/dist/im/lark/sessions-card.js +4 -1
  416. package/dist/im/lark/sessions-card.js.map +1 -1
  417. package/dist/im/lark/substitute-command.d.ts.map +1 -1
  418. package/dist/im/lark/substitute-command.js +8 -0
  419. package/dist/im/lark/substitute-command.js.map +1 -1
  420. package/dist/im/lark/topic-root-context.d.ts +35 -0
  421. package/dist/im/lark/topic-root-context.d.ts.map +1 -0
  422. package/dist/im/lark/topic-root-context.js +37 -0
  423. package/dist/im/lark/topic-root-context.js.map +1 -0
  424. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
  425. package/dist/im/lark/v3-blocked-card.js +2 -1
  426. package/dist/im/lark/v3-blocked-card.js.map +1 -1
  427. package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
  428. package/dist/im/lark/v3-gate-card.js +2 -1
  429. package/dist/im/lark/v3-gate-card.js.map +1 -1
  430. package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -1
  431. package/dist/im/lark/v3-loop-grant-card.js +2 -1
  432. package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
  433. package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
  434. package/dist/im/lark/v3-progress-card.js +2 -1
  435. package/dist/im/lark/v3-progress-card.js.map +1 -1
  436. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -1
  437. package/dist/im/lark/v3-revisit-grant-card.js +2 -1
  438. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
  439. package/dist/index-core-only.d.ts +3 -0
  440. package/dist/index-core-only.d.ts.map +1 -0
  441. package/dist/index-core-only.js +107 -0
  442. package/dist/index-core-only.js.map +1 -0
  443. package/dist/services/async-trigger-state.d.ts +8 -0
  444. package/dist/services/async-trigger-state.d.ts.map +1 -1
  445. package/dist/services/async-trigger-state.js +3 -2
  446. package/dist/services/async-trigger-state.js.map +1 -1
  447. package/dist/services/async-trigger-store.d.ts +10 -2
  448. package/dist/services/async-trigger-store.d.ts.map +1 -1
  449. package/dist/services/async-trigger-store.js +3 -2
  450. package/dist/services/async-trigger-store.js.map +1 -1
  451. package/dist/services/backend-availability.d.ts +3 -1
  452. package/dist/services/backend-availability.d.ts.map +1 -1
  453. package/dist/services/backend-availability.js +14 -1
  454. package/dist/services/backend-availability.js.map +1 -1
  455. package/dist/services/backend-type-store.d.ts.map +1 -1
  456. package/dist/services/backend-type-store.js +1 -1
  457. package/dist/services/backend-type-store.js.map +1 -1
  458. package/dist/services/bot-config-store.d.ts.map +1 -1
  459. package/dist/services/bot-config-store.js +2 -1
  460. package/dist/services/bot-config-store.js.map +1 -1
  461. package/dist/services/bridge-fallback-gate.d.ts +14 -1
  462. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  463. package/dist/services/bridge-fallback-gate.js +65 -1
  464. package/dist/services/bridge-fallback-gate.js.map +1 -1
  465. package/dist/services/card-prefs-store.d.ts +7 -2
  466. package/dist/services/card-prefs-store.d.ts.map +1 -1
  467. package/dist/services/card-prefs-store.js +30 -4
  468. package/dist/services/card-prefs-store.js.map +1 -1
  469. package/dist/services/codex-app-runner-protocol.d.ts +9 -0
  470. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  471. package/dist/services/codex-app-runner-protocol.js +17 -0
  472. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  473. package/dist/services/codex-app-token-usage.d.ts +93 -0
  474. package/dist/services/codex-app-token-usage.d.ts.map +1 -0
  475. package/dist/services/codex-app-token-usage.js +190 -0
  476. package/dist/services/codex-app-token-usage.js.map +1 -0
  477. package/dist/services/codex-transcript.d.ts +6 -1
  478. package/dist/services/codex-transcript.d.ts.map +1 -1
  479. package/dist/services/codex-transcript.js +103 -32
  480. package/dist/services/codex-transcript.js.map +1 -1
  481. package/dist/services/federation-roster.d.ts +4 -0
  482. package/dist/services/federation-roster.d.ts.map +1 -1
  483. package/dist/services/federation-roster.js +3 -0
  484. package/dist/services/federation-roster.js.map +1 -1
  485. package/dist/services/federation-store.d.ts +6 -0
  486. package/dist/services/federation-store.d.ts.map +1 -1
  487. package/dist/services/federation-store.js.map +1 -1
  488. package/dist/services/grant-policy.d.ts +13 -0
  489. package/dist/services/grant-policy.d.ts.map +1 -0
  490. package/dist/services/grant-policy.js +40 -0
  491. package/dist/services/grant-policy.js.map +1 -0
  492. package/dist/services/grant-store.d.ts +24 -3
  493. package/dist/services/grant-store.d.ts.map +1 -1
  494. package/dist/services/grant-store.js +196 -12
  495. package/dist/services/grant-store.js.map +1 -1
  496. package/dist/services/groups-store.d.ts +36 -0
  497. package/dist/services/groups-store.d.ts.map +1 -1
  498. package/dist/services/groups-store.js +123 -1
  499. package/dist/services/groups-store.js.map +1 -1
  500. package/dist/services/jsonl-cursor.d.ts.map +1 -1
  501. package/dist/services/jsonl-cursor.js +8 -2
  502. package/dist/services/jsonl-cursor.js.map +1 -1
  503. package/dist/services/local-cli-opener.d.ts.map +1 -1
  504. package/dist/services/local-cli-opener.js +32 -0
  505. package/dist/services/local-cli-opener.js.map +1 -1
  506. package/dist/services/message-listener-run-preview-store.d.ts +43 -0
  507. package/dist/services/message-listener-run-preview-store.d.ts.map +1 -0
  508. package/dist/services/message-listener-run-preview-store.js +152 -0
  509. package/dist/services/message-listener-run-preview-store.js.map +1 -0
  510. package/dist/services/message-listener-store.d.ts +26 -0
  511. package/dist/services/message-listener-store.d.ts.map +1 -0
  512. package/dist/services/message-listener-store.js +138 -0
  513. package/dist/services/message-listener-store.js.map +1 -0
  514. package/dist/services/message-listener.d.ts +112 -0
  515. package/dist/services/message-listener.d.ts.map +1 -0
  516. package/dist/services/message-listener.js +391 -0
  517. package/dist/services/message-listener.js.map +1 -0
  518. package/dist/services/overload-alert-migration.d.ts +15 -0
  519. package/dist/services/overload-alert-migration.d.ts.map +1 -0
  520. package/dist/services/overload-alert-migration.js +115 -0
  521. package/dist/services/overload-alert-migration.js.map +1 -0
  522. package/dist/services/send-policy.d.ts +38 -0
  523. package/dist/services/send-policy.d.ts.map +1 -1
  524. package/dist/services/send-policy.js +34 -0
  525. package/dist/services/send-policy.js.map +1 -1
  526. package/dist/services/session-store.d.ts +12 -1
  527. package/dist/services/session-store.d.ts.map +1 -1
  528. package/dist/services/session-store.js +44 -2
  529. package/dist/services/session-store.js.map +1 -1
  530. package/dist/services/skill-registry-store.d.ts.map +1 -1
  531. package/dist/services/skill-registry-store.js +87 -12
  532. package/dist/services/skill-registry-store.js.map +1 -1
  533. package/dist/services/substitute-mode-normalize.d.ts +3 -0
  534. package/dist/services/substitute-mode-normalize.d.ts.map +1 -1
  535. package/dist/services/substitute-mode-normalize.js +8 -0
  536. package/dist/services/substitute-mode-normalize.js.map +1 -1
  537. package/dist/services/substitute-mode-store.d.ts.map +1 -1
  538. package/dist/services/substitute-mode-store.js +8 -1
  539. package/dist/services/substitute-mode-store.js.map +1 -1
  540. package/dist/services/transcript-resolver.d.ts +6 -1
  541. package/dist/services/transcript-resolver.d.ts.map +1 -1
  542. package/dist/services/transcript-resolver.js +145 -29
  543. package/dist/services/transcript-resolver.js.map +1 -1
  544. package/dist/services/trigger-types.d.ts +16 -0
  545. package/dist/services/trigger-types.d.ts.map +1 -1
  546. package/dist/services/trigger-types.js +6 -0
  547. package/dist/services/trigger-types.js.map +1 -1
  548. package/dist/setup/bot-config-editor.js +2 -2
  549. package/dist/setup/bot-config-editor.js.map +1 -1
  550. package/dist/setup/ensure-zmx.d.ts +31 -0
  551. package/dist/setup/ensure-zmx.d.ts.map +1 -0
  552. package/dist/setup/ensure-zmx.js +161 -0
  553. package/dist/setup/ensure-zmx.js.map +1 -0
  554. package/dist/setup/index.d.ts +1 -1
  555. package/dist/setup/index.js +1 -1
  556. package/dist/setup/open-platform-automation.d.ts +9 -0
  557. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  558. package/dist/setup/open-platform-automation.js +15 -2
  559. package/dist/setup/open-platform-automation.js.map +1 -1
  560. package/dist/setup/setup-args.d.ts +1 -1
  561. package/dist/setup/setup-args.d.ts.map +1 -1
  562. package/dist/setup/setup-args.js +1 -1
  563. package/dist/skills/definitions.d.ts.map +1 -1
  564. package/dist/skills/definitions.js +32 -0
  565. package/dist/skills/definitions.js.map +1 -1
  566. package/dist/skills/injection-mode.d.ts +6 -2
  567. package/dist/skills/injection-mode.d.ts.map +1 -1
  568. package/dist/skills/injection-mode.js +10 -5
  569. package/dist/skills/injection-mode.js.map +1 -1
  570. package/dist/types.d.ts +79 -3
  571. package/dist/types.d.ts.map +1 -1
  572. package/dist/utils/child-env.d.ts +1 -1
  573. package/dist/utils/child-env.d.ts.map +1 -1
  574. package/dist/utils/child-env.js +4 -0
  575. package/dist/utils/child-env.js.map +1 -1
  576. package/dist/utils/effort-confirm-dialog.d.ts +40 -0
  577. package/dist/utils/effort-confirm-dialog.d.ts.map +1 -0
  578. package/dist/utils/effort-confirm-dialog.js +74 -0
  579. package/dist/utils/effort-confirm-dialog.js.map +1 -0
  580. package/dist/utils/pending-input-queue.d.ts +56 -0
  581. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  582. package/dist/utils/pending-input-queue.js +80 -0
  583. package/dist/utils/pending-input-queue.js.map +1 -1
  584. package/dist/utils/render-dimensions.d.ts +8 -0
  585. package/dist/utils/render-dimensions.d.ts.map +1 -1
  586. package/dist/utils/render-dimensions.js +10 -0
  587. package/dist/utils/render-dimensions.js.map +1 -1
  588. package/dist/utils/stuck-key-guard.d.ts +3 -2
  589. package/dist/utils/stuck-key-guard.d.ts.map +1 -1
  590. package/dist/utils/stuck-key-guard.js +3 -3
  591. package/dist/utils/stuck-key-guard.js.map +1 -1
  592. package/dist/utils/terminal-renderer.d.ts +6 -0
  593. package/dist/utils/terminal-renderer.d.ts.map +1 -1
  594. package/dist/utils/terminal-renderer.js +15 -0
  595. package/dist/utils/terminal-renderer.js.map +1 -1
  596. package/dist/utils/tui-input-delivery.d.ts +32 -0
  597. package/dist/utils/tui-input-delivery.d.ts.map +1 -0
  598. package/dist/utils/tui-input-delivery.js +53 -0
  599. package/dist/utils/tui-input-delivery.js.map +1 -0
  600. package/dist/utils/xml.d.ts +19 -0
  601. package/dist/utils/xml.d.ts.map +1 -0
  602. package/dist/utils/xml.js +26 -0
  603. package/dist/utils/xml.js.map +1 -0
  604. package/dist/worker.js +1852 -374
  605. package/dist/worker.js.map +1 -1
  606. package/dist/workflows/definition.d.ts +8 -8
  607. package/dist/workflows/events/payloads.d.ts +8 -8
  608. package/dist/workflows/events/schema.d.ts +160 -160
  609. package/dist/workflows/v3/session-relay-client.js +1 -1
  610. package/dist/workflows/v3/session-relay-client.js.map +1 -1
  611. package/dist/workflows/v3/worker-fence.d.ts.map +1 -1
  612. package/dist/workflows/v3/worker-fence.js +15 -10
  613. package/dist/workflows/v3/worker-fence.js.map +1 -1
  614. package/package.json +1 -1
  615. package/dist/dashboard-web/chunks/bot-defaults-page-UKA7K4JV.js +0 -10
  616. package/dist/dashboard-web/chunks/chunk-DFLNXQNT.js +0 -1
  617. package/dist/dashboard-web/chunks/connectors-page-A77YAB5Y.js +0 -1
  618. package/dist/dashboard-web/chunks/groups-page-RUZNVXQB.js +0 -8
  619. package/dist/dashboard-web/chunks/insights-page-RF7U7RTA.js +0 -22
  620. package/dist/dashboard-web/chunks/roles-page-BUMKD7Y4.js +0 -1
  621. package/dist/dashboard-web/chunks/sessions-page-6HLSEAB7.js +0 -2
  622. package/dist/dashboard-web/chunks/settings-page-MJDZHQ4X.js +0 -2
@@ -3,7 +3,8 @@ import type { Session, StreamStatus } from '../types.js';
3
3
  import type { CliId } from '../adapters/cli/types.js';
4
4
  import { type Brand } from '../im/lark/lark-hosts.js';
5
5
  import { type SessionTokenUsage } from './cost-calculator.js';
6
- export interface SessionRow {
6
+ import { type SessionMessagePreview } from './session-message-preview.js';
7
+ export interface SessionRow extends SessionMessagePreview {
7
8
  sessionId: string;
8
9
  larkAppId: string;
9
10
  botName: string;
@@ -30,6 +31,13 @@ export interface SessionRow {
30
31
  * Absent on rows from older daemons → callers keep the locate behavior. */
31
32
  scope?: 'thread' | 'chat';
32
33
  title?: string;
34
+ titleUpdatedAt?: string;
35
+ /** Informational only; callers must not treat it as authenticated identity. */
36
+ titleSource?: Session['titleSource'];
37
+ /** Backend stamped at spawn time. Exposed so external surfaces can filter zmx/tmux/etc. */
38
+ backendType?: Session['backendType'];
39
+ /** Persisted backing multiplexer host name, not proof the target is currently live. */
40
+ backendSessionName?: string;
33
41
  /** 看板视图的手动放置(列 id / 列内排序位置),用户拖拽后持久化在 Session 上。
34
42
  * 未设置时前端按运行状态推导默认列。 */
35
43
  kanbanColumn?: string;
@@ -69,6 +77,10 @@ export interface SessionRow {
69
77
  tokenUsage?: SessionTokenUsage | null;
70
78
  /** Worker process PID, active rows only. Used by dashboard resource attribution. */
71
79
  workerPid?: number;
80
+ /** Persisted row intentionally kept active but detached from daemon routing
81
+ * because exact backing teardown could not be proven. It is rendered as
82
+ * dormant (never closed) and remains explicitly closeable for a retry. */
83
+ quarantined?: boolean;
72
84
  /** Adopted external CLI PID, active rows only when the source backend exposed it. */
73
85
  adoptCliPid?: number;
74
86
  /** Riff AIO Sandbox web terminal link. When set, the dashboard "Web终端"
@@ -89,4 +101,13 @@ export declare function getBotName(): string;
89
101
  export declare function sessionLastActivityAtMs(s: Session): number;
90
102
  export declare function composeRowFromActive(ds: DaemonSession): SessionRow;
91
103
  export declare function composeRowFromClosed(s: Session): SessionRow;
104
+ /**
105
+ * Project a persisted active row that currently has no DaemonSession runtime.
106
+ *
107
+ * This is deliberately not composeRowFromClosed(): `status='active'` remains
108
+ * the ownership truth when a persistent-backend kill was inconclusive. The
109
+ * dashboard presents it as dormant, with no terminal port, so operators can
110
+ * see and explicitly retry closing it without an unsafe resume affordance.
111
+ */
112
+ export declare function composeRowFromPersistedActive(s: Session): SessionRow;
92
113
  //# sourceMappingURL=dashboard-rows.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-rows.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-rows.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ import { getBotBrand } from '../bot-registry.js';
3
3
  import { chatAppLink } from '../im/lark/lark-hosts.js';
4
4
  import { getSessionTokenUsage } from './cost-calculator.js';
5
5
  import { getIdentity } from '../im/lark/identity-cache.js';
6
+ import { buildSessionMessagePreview, } from './session-message-preview.js';
7
+ import { isSuspendableBackendType, resolvePersistentBackendTarget } from './persistent-backend.js';
6
8
  export function feishuChatLink(chatId, brand = 'feishu') {
7
9
  return chatAppLink(chatId, brand);
8
10
  }
@@ -48,6 +50,12 @@ function directChatDisplayName(s, larkAppId) {
48
50
  }
49
51
  return undefined;
50
52
  }
53
+ function backendSessionNameForRow(s) {
54
+ const backendType = s.backendType;
55
+ if (s.adoptedFrom || !isSuspendableBackendType(backendType))
56
+ return undefined;
57
+ return resolvePersistentBackendTarget(backendType, s.sessionId, s.persistentBackendTarget).sessionName;
58
+ }
51
59
  export function composeRowFromActive(ds) {
52
60
  return {
53
61
  sessionId: ds.session.sessionId,
@@ -73,6 +81,10 @@ export function composeRowFromActive(ds) {
73
81
  lastInputFromBot: ds.session.quoteTargetSenderIsBot === true,
74
82
  scope: ds.session.scope,
75
83
  title: ds.session.title,
84
+ titleUpdatedAt: ds.session.titleUpdatedAt,
85
+ titleSource: ds.session.titleSource,
86
+ backendType: ds.session.backendType,
87
+ backendSessionName: backendSessionNameForRow(ds.session),
76
88
  kanbanColumn: ds.session.kanbanColumn,
77
89
  kanbanPosition: ds.session.kanbanPosition,
78
90
  locked: !!ds.session.locked,
@@ -97,6 +109,7 @@ export function composeRowFromActive(ds) {
97
109
  tokenUsage: sessionTokenUsage(ds.session, ds.workingDir),
98
110
  ...(ds.worker?.pid !== undefined ? { workerPid: ds.worker.pid } : {}),
99
111
  ...(ds.adoptedFrom?.originalCliPid !== undefined ? { adoptCliPid: ds.adoptedFrom.originalCliPid } : {}),
112
+ ...buildSessionMessagePreview(ds.session),
100
113
  };
101
114
  }
102
115
  export function composeRowFromClosed(s) {
@@ -118,6 +131,10 @@ export function composeRowFromClosed(s) {
118
131
  lastInputFromBot: s.quoteTargetSenderIsBot === true,
119
132
  scope: s.scope,
120
133
  title: s.title,
134
+ titleUpdatedAt: s.titleUpdatedAt,
135
+ titleSource: s.titleSource,
136
+ backendType: s.backendType,
137
+ backendSessionName: backendSessionNameForRow(s),
121
138
  kanbanColumn: s.kanbanColumn,
122
139
  kanbanPosition: s.kanbanPosition,
123
140
  locked: !!s.locked,
@@ -125,6 +142,50 @@ export function composeRowFromClosed(s) {
125
142
  webPort: s.webPort ?? null,
126
143
  feishuChatLink: feishuChatLink(s.chatId, getBotBrand(s.larkAppId ?? '')),
127
144
  tokenUsage: sessionTokenUsage(s),
145
+ ...buildSessionMessagePreview(s),
146
+ };
147
+ }
148
+ /**
149
+ * Project a persisted active row that currently has no DaemonSession runtime.
150
+ *
151
+ * This is deliberately not composeRowFromClosed(): `status='active'` remains
152
+ * the ownership truth when a persistent-backend kill was inconclusive. The
153
+ * dashboard presents it as dormant, with no terminal port, so operators can
154
+ * see and explicitly retry closing it without an unsafe resume affordance.
155
+ */
156
+ export function composeRowFromPersistedActive(s) {
157
+ return {
158
+ sessionId: s.sessionId,
159
+ larkAppId: s.larkAppId ?? '',
160
+ botName: cachedBotName,
161
+ cliId: s.cliId ?? 'unknown',
162
+ status: s.queued ? 'idle' : 'dormant',
163
+ adopt: !!s.adoptedFrom,
164
+ spawnedAt: sessionCreatedAtMs(s),
165
+ lastMessageAt: sessionLastActivityAtMs(s),
166
+ workingDir: s.workingDir,
167
+ chatId: s.chatId,
168
+ chatType: s.chatType,
169
+ chatDisplayName: directChatDisplayName(s, s.larkAppId),
170
+ rootMessageId: s.rootMessageId,
171
+ lastInputFromBot: s.quoteTargetSenderIsBot === true,
172
+ scope: s.scope,
173
+ title: s.title,
174
+ titleUpdatedAt: s.titleUpdatedAt,
175
+ titleSource: s.titleSource,
176
+ backendType: s.backendType,
177
+ backendSessionName: backendSessionNameForRow(s),
178
+ kanbanColumn: s.kanbanColumn,
179
+ kanbanPosition: s.kanbanPosition,
180
+ locked: !!s.locked,
181
+ ownerOpenId: s.ownerOpenId,
182
+ webPort: null,
183
+ feishuChatLink: feishuChatLink(s.chatId, getBotBrand(s.larkAppId ?? '')),
184
+ queued: !!s.queued,
185
+ hasHistory: !!(s.cliId || s.lastCliInput || s.backendType || s.adoptedFrom),
186
+ quarantined: !!s.restoreQuarantinedAt,
187
+ tokenUsage: sessionTokenUsage(s),
188
+ ...buildSessionMessagePreview(s),
128
189
  };
129
190
  }
130
191
  //# sourceMappingURL=dashboard-rows.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-rows.js","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-rows.js","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,12 @@ export interface DashboardUrls {
12
12
  */
13
13
  localUrl?: string;
14
14
  }
15
+ /**
16
+ * Format a host for use inside a URL. An IPv6 literal (contains ':', e.g. `::1`)
17
+ * must be wrapped in brackets or `http://::1:7891/` is an invalid URL. IPv4,
18
+ * hostnames, and already-bracketed literals pass through unchanged.
19
+ */
20
+ export declare function formatUrlHost(host: string): string;
15
21
  /**
16
22
  * Builds the dashboard URL(s) for a token.
17
23
  *
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-url.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAW/G;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEvG"}
1
+ {"version":3,"file":"dashboard-url.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAW/G;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEvG"}
@@ -1,5 +1,15 @@
1
1
  import { platformMachineBaseUrl, publicReverseProxyBaseUrl } from '../platform/binding.js';
2
2
  import { isRemoteAccessEnabled } from '../global-config.js';
3
+ /**
4
+ * Format a host for use inside a URL. An IPv6 literal (contains ':', e.g. `::1`)
5
+ * must be wrapped in brackets or `http://::1:7891/` is an invalid URL. IPv4,
6
+ * hostnames, and already-bracketed literals pass through unchanged.
7
+ */
8
+ export function formatUrlHost(host) {
9
+ if (host.includes(':') && !host.startsWith('['))
10
+ return `[${host}]`;
11
+ return host;
12
+ }
3
13
  /**
4
14
  * Builds the dashboard URL(s) for a token.
5
15
  *
@@ -21,7 +31,7 @@ import { isRemoteAccessEnabled } from '../global-config.js';
21
31
  * dashboard link being the one place that always stays local.
22
32
  */
23
33
  export function buildDashboardUrls(opts) {
24
- const localOrigin = `http://${opts.host}:${opts.port}`;
34
+ const localOrigin = `http://${formatUrlHost(String(opts.host))}:${opts.port}`;
25
35
  // 对外基址:中心平台优先(远程访问开 + 已绑定),否则自建反代基址 BOTMUX_PUBLIC_URL。
26
36
  const platformBase = isRemoteAccessEnabled() ? platformMachineBaseUrl() : null;
27
37
  const remoteBase = platformBase ?? publicReverseProxyBaseUrl();
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-url.js","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAiB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA6D;IAC9F,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACvD,uDAAuD;IACvD,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,UAAU,GAAG,YAAY,IAAI,yBAAyB,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,UAAU,IAAI,WAAW,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,OAAO;QACL,GAAG,EAAE,GAAG,aAAa,GAAG,MAAM,EAAE;QAChC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,IAA6D;IAC7F,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"dashboard-url.js","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAiB5D;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,IAAI,GAAG,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA6D;IAC9F,MAAM,WAAW,GAAG,UAAU,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9E,uDAAuD;IACvD,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,UAAU,GAAG,YAAY,IAAI,yBAAyB,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,UAAU,IAAI,WAAW,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,OAAO;QACL,GAAG,EAAE,GAAG,aAAa,GAAG,MAAM,EAAE;QAChC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,IAA6D;IAC7F,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC"}
@@ -1,9 +1,9 @@
1
- import type { BackendType, SessionProbe } from '../adapters/backend/types.js';
1
+ import type { BackendType, PersistentBackendTarget, SessionProbe } from '../adapters/backend/types.js';
2
+ import type { Session } from '../types.js';
2
3
  import type { DaemonSession } from './types.js';
3
4
  export declare const DEVICE_ISOLATION_PREPARE_PATH = "/api/device-isolation/activation/prepare";
4
5
  export declare const DEVICE_ISOLATION_COMMIT_PATH = "/api/device-isolation/activation/commit";
5
6
  export declare const DEVICE_ISOLATION_RELEASE_PATH = "/api/device-isolation/activation/release";
6
- type LocalPersistentBackend = 'tmux' | 'herdr' | 'zellij';
7
7
  type InventoryBackend = BackendType | 'unknown';
8
8
  type ProcessIdentity = {
9
9
  pid: number;
@@ -15,6 +15,13 @@ export interface DeviceIsolationRuntimeSession {
15
15
  adopted: boolean;
16
16
  /** Backend stamped by daemon-owned state, if this session predates no stamp. */
17
17
  frozenBackend?: BackendType;
18
+ /** Exact worker-selected persistent resource. Shared Herdr carries both the
19
+ * host session and the one Botmux-owned agent inside it. */
20
+ persistentBackendTarget?: PersistentBackendTarget;
21
+ /** PID carried only by an unregistered persisted row. It has no process-start
22
+ * identity or worker-generation attestation, so a still-live/reused PID must
23
+ * block activation instead of being mistaken for a quiescent PTY session. */
24
+ unregisteredPid?: number;
18
25
  workerPresent: boolean;
19
26
  workerGeneration?: number;
20
27
  worker?: ProcessIdentity;
@@ -36,8 +43,7 @@ export interface DeviceIsolationInventoryEntry {
36
43
  cli?: ProcessIdentity;
37
44
  workerGeneration?: number;
38
45
  persistent?: {
39
- backendType: LocalPersistentBackend;
40
- name: string;
46
+ target: PersistentBackendTarget;
41
47
  probe: SessionProbe;
42
48
  };
43
49
  blocker?: DeviceIsolationBlocker;
@@ -60,8 +66,10 @@ export interface DeviceIsolationDaemonDependencies {
60
66
  processStart: (pid: number) => string | undefined;
61
67
  processExists: (pid: number) => boolean;
62
68
  signalProcess: (pid: number, signal: NodeJS.Signals) => void;
63
- probePersistent: (backendType: LocalPersistentBackend, name: string) => SessionProbe;
64
- killPersistent: (backendType: LocalPersistentBackend, name: string) => void;
69
+ probePersistent: (target: PersistentBackendTarget) => SessionProbe;
70
+ /** Full sessionId is mandatory so prefix-addressed backends such as ZMX can
71
+ * re-verify ownership before destructive teardown. */
72
+ killPersistent: (target: PersistentBackendTarget, sessionId: string) => void;
65
73
  closeWorker: (session: DeviceIsolationRuntimeSession) => void;
66
74
  readMarker: () => string | null;
67
75
  sleep: (ms: number) => Promise<void>;
@@ -71,6 +79,20 @@ export type DeviceIsolationDaemonResult = {
71
79
  status: 200 | 409 | 423 | 503;
72
80
  body: Record<string, unknown>;
73
81
  };
82
+ /**
83
+ * Add durable, persisted local-resource rows that startup restore intentionally
84
+ * kept active but could not safely register. Device isolation must see those
85
+ * ownership records even when the routing registry cannot: otherwise an
86
+ * inconclusive teardown could disappear from the activation inventory.
87
+ *
88
+ * Runtime state wins by complete session id because it carries the current
89
+ * worker generation and attestation. Queued rows and command scratches have no
90
+ * running local resource. Legacy rows with a CLI/PID/target marker are still
91
+ * evidence of a possibly-live local resource even when backendType was never
92
+ * stamped; include them as `unknown_backend` blockers instead of silently
93
+ * excluding them from a credential-isolation transaction.
94
+ */
95
+ export declare function mergePersistedDeviceIsolationSessions(runtimeSessions: readonly DeviceIsolationRuntimeSession[], persistedSessions: readonly Session[]): DeviceIsolationRuntimeSession[];
74
96
  export declare function buildDeviceIsolationInventory(): DeviceIsolationInventory;
75
97
  export declare function setDeviceIsolationDaemonIdentity(identity: DeviceIsolationDaemonIdentity | null): void;
76
98
  export declare function prepareDeviceIsolationActivation(body: unknown): DeviceIsolationDaemonResult;
@@ -1 +1 @@
1
- {"version":3,"file":"device-isolation-daemon.d.ts","sourceRoot":"","sources":["../../src/core/device-isolation-daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device-isolation-daemon.d.ts","sourceRoot":"","sources":["../../src/core/device-isolation-daemon.ts"],"names":[],"mappings":"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"}
@@ -11,9 +11,10 @@ import { homedir } from 'node:os';
11
11
  import { deviceCredentialIsolationMarkerPath } from '../adapters/cli/read-isolation.js';
12
12
  import { config } from '../config.js';
13
13
  import { readSecureHostFileSync } from '../platform/secure-host-file.js';
14
+ import * as sessionStore from '../services/session-store.js';
14
15
  import { logger } from '../utils/logger.js';
15
16
  import { acquireDeviceIsolationFreeze, bindDeviceIsolationFreezeInventoryGeneration, DEVICE_ISOLATION_ACTIVATION_VERSION, releaseDeviceIsolationFreeze, requireDeviceIsolationFreeze, } from './device-isolation-activation.js';
16
- import { killPersistentSession, persistentSessionName, probePersistentSession, } from './persistent-backend.js';
17
+ import { killPersistentBackendTarget, probePersistentBackendTarget, resolvePersistentBackendTarget, } from './persistent-backend.js';
17
18
  import { readProcessStartIdentity } from './session-marker.js';
18
19
  import { killWorker, listActiveSessions } from './worker-pool.js';
19
20
  export const DEVICE_ISOLATION_PREPARE_PATH = '/api/device-isolation/activation/prepare';
@@ -22,7 +23,7 @@ export const DEVICE_ISOLATION_RELEASE_PATH = '/api/device-isolation/activation/r
22
23
  let daemonIdentity = null;
23
24
  let transaction = null;
24
25
  function isPersistentBackend(value) {
25
- return value === 'tmux' || value === 'herdr' || value === 'zellij';
26
+ return value === 'tmux' || value === 'herdr' || value === 'zellij' || value === 'zmx';
26
27
  }
27
28
  function isLocalBackend(value) {
28
29
  return value === 'pty' || isPersistentBackend(value);
@@ -36,8 +37,54 @@ function safeProcessExists(pid) {
36
37
  return error.code !== 'ESRCH';
37
38
  }
38
39
  }
40
+ /**
41
+ * Add durable, persisted local-resource rows that startup restore intentionally
42
+ * kept active but could not safely register. Device isolation must see those
43
+ * ownership records even when the routing registry cannot: otherwise an
44
+ * inconclusive teardown could disappear from the activation inventory.
45
+ *
46
+ * Runtime state wins by complete session id because it carries the current
47
+ * worker generation and attestation. Queued rows and command scratches have no
48
+ * running local resource. Legacy rows with a CLI/PID/target marker are still
49
+ * evidence of a possibly-live local resource even when backendType was never
50
+ * stamped; include them as `unknown_backend` blockers instead of silently
51
+ * excluding them from a credential-isolation transaction.
52
+ */
53
+ export function mergePersistedDeviceIsolationSessions(runtimeSessions, persistedSessions) {
54
+ const merged = [...runtimeSessions];
55
+ const runtimeIds = new Set(runtimeSessions.map(session => session.sessionId));
56
+ for (const session of persistedSessions) {
57
+ if (runtimeIds.has(session.sessionId)
58
+ || session.status !== 'active'
59
+ || session.queued)
60
+ continue;
61
+ const adopted = !!session.adoptedFrom;
62
+ const frozenBackend = session.backendType ?? session.persistentBackendTarget?.backendType;
63
+ const hasDurableLocalEvidence = adopted
64
+ || !!session.persistentBackendTarget
65
+ || isPersistentBackend(frozenBackend ?? 'unknown')
66
+ || (typeof session.pid === 'number' && session.pid > 0)
67
+ || !!session.cliSessionId;
68
+ if (!hasDurableLocalEvidence)
69
+ continue;
70
+ merged.push({
71
+ sessionId: session.sessionId,
72
+ adopted,
73
+ ...(frozenBackend ? { frozenBackend } : {}),
74
+ ...(session.persistentBackendTarget
75
+ ? { persistentBackendTarget: session.persistentBackendTarget }
76
+ : {}),
77
+ ...(typeof session.pid === 'number' && session.pid > 0
78
+ ? { unregisteredPid: session.pid }
79
+ : {}),
80
+ workerPresent: false,
81
+ });
82
+ runtimeIds.add(session.sessionId);
83
+ }
84
+ return merged;
85
+ }
39
86
  function defaultRuntimeSessions() {
40
- return listActiveSessions().map((ds) => {
87
+ const runtime = listActiveSessions().map((ds) => {
41
88
  const workerPresent = !!ds.worker && !ds.worker.killed;
42
89
  const workerPid = workerPresent ? ds.worker?.pid : undefined;
43
90
  const workerStart = workerPid ? readProcessStartIdentity(workerPid) : undefined;
@@ -45,10 +92,12 @@ function defaultRuntimeSessions() {
45
92
  const cli = attestation?.cliPid && attestation.cliProcStart
46
93
  ? { pid: attestation.cliPid, procStart: attestation.cliProcStart }
47
94
  : undefined;
95
+ const persistentBackendTarget = ds.session.persistentBackendTarget ?? ds.initConfig?.persistentBackendTarget;
48
96
  return {
49
97
  sessionId: ds.session.sessionId,
50
98
  adopted: !!(ds.adoptedFrom || ds.initConfig?.adoptMode || ds.session.adoptedFrom),
51
99
  frozenBackend: ds.initConfig?.backendType ?? ds.session.backendType,
100
+ ...(persistentBackendTarget ? { persistentBackendTarget } : {}),
52
101
  workerPresent,
53
102
  ...(ds.workerGeneration !== undefined ? { workerGeneration: ds.workerGeneration } : {}),
54
103
  ...(workerPid && workerStart ? { worker: { pid: workerPid, procStart: workerStart } } : {}),
@@ -65,6 +114,9 @@ function defaultRuntimeSessions() {
65
114
  source: ds,
66
115
  };
67
116
  });
117
+ // sessionStore is initialized for this daemon's own bot partition. Do not
118
+ // scan sibling files: every daemon proves only the local resources it owns.
119
+ return mergePersistedDeviceIsolationSessions(runtime, sessionStore.listSessions());
68
120
  }
69
121
  const defaultDependencies = {
70
122
  now: () => Date.now(),
@@ -72,8 +124,8 @@ const defaultDependencies = {
72
124
  processStart: readProcessStartIdentity,
73
125
  processExists: safeProcessExists,
74
126
  signalProcess: (pid, signal) => { process.kill(pid, signal); },
75
- probePersistent: probePersistentSession,
76
- killPersistent: killPersistentSession,
127
+ probePersistent: probePersistentBackendTarget,
128
+ killPersistent: killPersistentBackendTarget,
77
129
  closeWorker: (session) => {
78
130
  if (!session.source)
79
131
  throw new Error('missing daemon session handle');
@@ -111,6 +163,19 @@ function classifySession(session) {
111
163
  && session.frozenBackend !== session.attestation.backendType) {
112
164
  return blockerEntry(session, backendType, 'backend_inconsistent');
113
165
  }
166
+ if (session.unregisteredPid !== undefined) {
167
+ let processMayStillExist = true;
168
+ try {
169
+ processMayStillExist = dependencies.processExists(session.unregisteredPid);
170
+ }
171
+ catch {
172
+ // Process inspection is itself part of the safety proof. An unavailable
173
+ // probe cannot authorize activation around an unregistered local PID.
174
+ }
175
+ if (processMayStillExist) {
176
+ return blockerEntry(session, backendType, 'process_identity_unavailable');
177
+ }
178
+ }
114
179
  if (backendType === 'riff') {
115
180
  return {
116
181
  sessionId: session.sessionId,
@@ -121,11 +186,13 @@ function classifySession(session) {
121
186
  : {}),
122
187
  };
123
188
  }
124
- const persistent = isPersistentBackend(backendType)
189
+ const persistentTarget = isPersistentBackend(backendType)
190
+ ? resolvePersistentBackendTarget(backendType, session.sessionId, session.persistentBackendTarget)
191
+ : undefined;
192
+ const persistent = persistentTarget
125
193
  ? {
126
- backendType,
127
- name: persistentSessionName(backendType, session.sessionId),
128
- probe: dependencies.probePersistent(backendType, persistentSessionName(backendType, session.sessionId)),
194
+ target: persistentTarget,
195
+ probe: dependencies.probePersistent(persistentTarget),
129
196
  }
130
197
  : undefined;
131
198
  if (!session.workerPresent) {
@@ -140,6 +207,21 @@ function classifySession(session) {
140
207
  if (persistent.probe === 'unknown') {
141
208
  return { ...blockerEntry(session, backendType, 'backend_probe_unknown'), persistent };
142
209
  }
210
+ // A persisted shared-Herdr agent is an exact Botmux-owned resource even
211
+ // after its worker/viewer is gone. Keep it in the teardown inventory so
212
+ // activation closes only that agent and verifies its disappearance; never
213
+ // mistake a missing derived bmx-* host for quiescence while the real agent
214
+ // is still running inside a shared host session.
215
+ if (persistent.target.backendType === 'herdr'
216
+ && persistent.target.agentName) {
217
+ return {
218
+ sessionId: session.sessionId,
219
+ backendType,
220
+ disposition: 'owned_local',
221
+ credentialIsolated: false,
222
+ persistent,
223
+ };
224
+ }
143
225
  // A detached pane may still be executing a legacy unconfined CLI, but the
144
226
  // daemon no longer has a private-IPC attestation for its exact process.
145
227
  return { ...blockerEntry(session, backendType, 'unattested_worker'), persistent };
@@ -315,9 +397,10 @@ async function quiesceOwnedSessions(prepared, lease) {
315
397
  const session = sessions.get(target.sessionId);
316
398
  if (!session)
317
399
  return 'teardown_failed';
318
- dependencies.closeWorker(session);
400
+ if (session.workerPresent)
401
+ dependencies.closeWorker(session);
319
402
  if (target.persistent) {
320
- dependencies.killPersistent(target.persistent.backendType, target.persistent.name);
403
+ dependencies.killPersistent(target.persistent.target, target.sessionId);
321
404
  }
322
405
  }
323
406
  }
@@ -344,13 +427,13 @@ async function quiesceOwnedSessions(prepared, lease) {
344
427
  unknown = true;
345
428
  }
346
429
  if (target.persistent) {
347
- const probe = dependencies.probePersistent(target.persistent.backendType, target.persistent.name);
430
+ const probe = dependencies.probePersistent(target.persistent.target);
348
431
  if (probe === 'unknown')
349
432
  unknown = true;
350
433
  if (probe === 'exists') {
351
434
  clean = false;
352
435
  try {
353
- dependencies.killPersistent(target.persistent.backendType, target.persistent.name);
436
+ dependencies.killPersistent(target.persistent.target, target.sessionId);
354
437
  }
355
438
  catch { /* verified by the next probe */ }
356
439
  }