botmux 3.14.0 → 3.16.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 (812) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/.runtime-build-id +1 -1
  4. package/dist/adapters/backend/destroy-result.d.ts +159 -0
  5. package/dist/adapters/backend/destroy-result.d.ts.map +1 -0
  6. package/dist/adapters/backend/destroy-result.js +223 -0
  7. package/dist/adapters/backend/destroy-result.js.map +1 -0
  8. package/dist/adapters/backend/herdr-backend.d.ts +4 -0
  9. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  10. package/dist/adapters/backend/herdr-backend.js +23 -1
  11. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  12. package/dist/adapters/backend/mojo-backend.d.ts +577 -0
  13. package/dist/adapters/backend/mojo-backend.d.ts.map +1 -0
  14. package/dist/adapters/backend/mojo-backend.js +2471 -0
  15. package/dist/adapters/backend/mojo-backend.js.map +1 -0
  16. package/dist/adapters/backend/mojo-budgets.d.ts +21 -0
  17. package/dist/adapters/backend/mojo-budgets.d.ts.map +1 -0
  18. package/dist/adapters/backend/mojo-budgets.js +22 -0
  19. package/dist/adapters/backend/mojo-budgets.js.map +1 -0
  20. package/dist/adapters/backend/mojo-isolated-workspace.d.ts +69 -0
  21. package/dist/adapters/backend/mojo-isolated-workspace.d.ts.map +1 -0
  22. package/dist/adapters/backend/mojo-isolated-workspace.js +213 -0
  23. package/dist/adapters/backend/mojo-isolated-workspace.js.map +1 -0
  24. package/dist/adapters/backend/mojo-process-tree.d.ts +292 -0
  25. package/dist/adapters/backend/mojo-process-tree.d.ts.map +1 -0
  26. package/dist/adapters/backend/mojo-process-tree.js +486 -0
  27. package/dist/adapters/backend/mojo-process-tree.js.map +1 -0
  28. package/dist/adapters/backend/mojo-types.d.ts +542 -0
  29. package/dist/adapters/backend/mojo-types.d.ts.map +1 -0
  30. package/dist/adapters/backend/mojo-types.js +682 -0
  31. package/dist/adapters/backend/mojo-types.js.map +1 -0
  32. package/dist/adapters/backend/reproduce-command.js +3 -3
  33. package/dist/adapters/backend/reproduce-command.js.map +1 -1
  34. package/dist/adapters/backend/riff-backend.js +1 -1
  35. package/dist/adapters/backend/riff-backend.js.map +1 -1
  36. package/dist/adapters/backend/sandbox.d.ts +44 -7
  37. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  38. package/dist/adapters/backend/sandbox.js +30 -7
  39. package/dist/adapters/backend/sandbox.js.map +1 -1
  40. package/dist/adapters/backend/session-backend-selector.d.ts +14 -1
  41. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  42. package/dist/adapters/backend/session-backend-selector.js +82 -10
  43. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  44. package/dist/adapters/backend/tmux-pipe-backend.d.ts +30 -0
  45. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  46. package/dist/adapters/backend/tmux-pipe-backend.js +60 -0
  47. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  48. package/dist/adapters/backend/types.d.ts +108 -6
  49. package/dist/adapters/backend/types.d.ts.map +1 -1
  50. package/dist/adapters/backend/types.js.map +1 -1
  51. package/dist/adapters/backend/zmx-backend.d.ts +11 -0
  52. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
  53. package/dist/adapters/backend/zmx-backend.js +16 -1
  54. package/dist/adapters/backend/zmx-backend.js.map +1 -1
  55. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  56. package/dist/adapters/cli/codex-app.js +2 -2
  57. package/dist/adapters/cli/codex-app.js.map +1 -1
  58. package/dist/adapters/cli/codex.d.ts.map +1 -1
  59. package/dist/adapters/cli/codex.js +7 -0
  60. package/dist/adapters/cli/codex.js.map +1 -1
  61. package/dist/adapters/cli/copilot.d.ts +3 -1
  62. package/dist/adapters/cli/copilot.d.ts.map +1 -1
  63. package/dist/adapters/cli/copilot.js +23 -5
  64. package/dist/adapters/cli/copilot.js.map +1 -1
  65. package/dist/adapters/cli/cursor.d.ts.map +1 -1
  66. package/dist/adapters/cli/cursor.js +26 -4
  67. package/dist/adapters/cli/cursor.js.map +1 -1
  68. package/dist/adapters/cli/dsh.d.ts.map +1 -1
  69. package/dist/adapters/cli/dsh.js +5 -1
  70. package/dist/adapters/cli/dsh.js.map +1 -1
  71. package/dist/adapters/cli/grok.d.ts.map +1 -1
  72. package/dist/adapters/cli/grok.js +24 -5
  73. package/dist/adapters/cli/grok.js.map +1 -1
  74. package/dist/adapters/cli/kimi.d.ts.map +1 -1
  75. package/dist/adapters/cli/kimi.js +19 -1
  76. package/dist/adapters/cli/kimi.js.map +1 -1
  77. package/dist/adapters/cli/mojo.d.ts +28 -0
  78. package/dist/adapters/cli/mojo.d.ts.map +1 -0
  79. package/dist/adapters/cli/mojo.js +58 -0
  80. package/dist/adapters/cli/mojo.js.map +1 -0
  81. package/dist/adapters/cli/pi.d.ts +20 -5
  82. package/dist/adapters/cli/pi.d.ts.map +1 -1
  83. package/dist/adapters/cli/pi.js +27 -5
  84. package/dist/adapters/cli/pi.js.map +1 -1
  85. package/dist/adapters/cli/read-isolation.d.ts +251 -1
  86. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  87. package/dist/adapters/cli/read-isolation.js +254 -1
  88. package/dist/adapters/cli/read-isolation.js.map +1 -1
  89. package/dist/adapters/cli/registry.d.ts +13 -1
  90. package/dist/adapters/cli/registry.d.ts.map +1 -1
  91. package/dist/adapters/cli/registry.js +19 -1
  92. package/dist/adapters/cli/registry.js.map +1 -1
  93. package/dist/adapters/cli/runner-input.d.ts +3 -3
  94. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  95. package/dist/adapters/cli/runner-input.js +4 -3
  96. package/dist/adapters/cli/runner-input.js.map +1 -1
  97. package/dist/adapters/cli/shared-hints.d.ts +3 -1
  98. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  99. package/dist/adapters/cli/shared-hints.js +51 -30
  100. package/dist/adapters/cli/shared-hints.js.map +1 -1
  101. package/dist/adapters/cli/types.d.ts +33 -4
  102. package/dist/adapters/cli/types.d.ts.map +1 -1
  103. package/dist/bot-registry.d.ts +42 -0
  104. package/dist/bot-registry.d.ts.map +1 -1
  105. package/dist/bot-registry.js +54 -4
  106. package/dist/bot-registry.js.map +1 -1
  107. package/dist/cli/arg-utils.d.ts +5 -0
  108. package/dist/cli/arg-utils.d.ts.map +1 -1
  109. package/dist/cli/arg-utils.js +7 -0
  110. package/dist/cli/arg-utils.js.map +1 -1
  111. package/dist/cli/bots-list-output.d.ts +130 -2
  112. package/dist/cli/bots-list-output.d.ts.map +1 -1
  113. package/dist/cli/bots-list-output.js +173 -27
  114. package/dist/cli/bots-list-output.js.map +1 -1
  115. package/dist/cli/daemon-lifecycle-env.d.ts +10 -3
  116. package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
  117. package/dist/cli/daemon-lifecycle-env.js +38 -11
  118. package/dist/cli/daemon-lifecycle-env.js.map +1 -1
  119. package/dist/cli/dashboard-command.d.ts +15 -0
  120. package/dist/cli/dashboard-command.d.ts.map +1 -1
  121. package/dist/cli/dashboard-command.js +22 -0
  122. package/dist/cli/dashboard-command.js.map +1 -1
  123. package/dist/cli/log-tail.d.ts +54 -0
  124. package/dist/cli/log-tail.d.ts.map +1 -0
  125. package/dist/cli/log-tail.js +167 -0
  126. package/dist/cli/log-tail.js.map +1 -0
  127. package/dist/cli/pm2-env.d.ts +16 -0
  128. package/dist/cli/pm2-env.d.ts.map +1 -0
  129. package/dist/cli/pm2-env.js +63 -0
  130. package/dist/cli/pm2-env.js.map +1 -0
  131. package/dist/cli/pm2-fleet-lock.d.ts +26 -0
  132. package/dist/cli/pm2-fleet-lock.d.ts.map +1 -0
  133. package/dist/cli/pm2-fleet-lock.js +50 -0
  134. package/dist/cli/pm2-fleet-lock.js.map +1 -0
  135. package/dist/cli/pm2-god-retirement.d.ts +59 -0
  136. package/dist/cli/pm2-god-retirement.d.ts.map +1 -0
  137. package/dist/cli/pm2-god-retirement.js +95 -0
  138. package/dist/cli/pm2-god-retirement.js.map +1 -0
  139. package/dist/cli/session-list-wake.d.ts +41 -0
  140. package/dist/cli/session-list-wake.d.ts.map +1 -0
  141. package/dist/cli/session-list-wake.js +102 -0
  142. package/dist/cli/session-list-wake.js.map +1 -0
  143. package/dist/cli/workflow.d.ts.map +1 -1
  144. package/dist/cli/workflow.js +26 -0
  145. package/dist/cli/workflow.js.map +1 -1
  146. package/dist/cli.d.ts.map +1 -1
  147. package/dist/cli.js +941 -118
  148. package/dist/cli.js.map +1 -1
  149. package/dist/codex-app-runner.js +261 -49
  150. package/dist/codex-app-runner.js.map +1 -1
  151. package/dist/core/cli-runtime-update.d.ts +8 -0
  152. package/dist/core/cli-runtime-update.d.ts.map +1 -1
  153. package/dist/core/cli-runtime-update.js +127 -8
  154. package/dist/core/cli-runtime-update.js.map +1 -1
  155. package/dist/core/close-residual.d.ts +64 -0
  156. package/dist/core/close-residual.d.ts.map +1 -0
  157. package/dist/core/close-residual.js +93 -0
  158. package/dist/core/close-residual.js.map +1 -0
  159. package/dist/core/closed-session-card.d.ts.map +1 -1
  160. package/dist/core/closed-session-card.js +11 -3
  161. package/dist/core/closed-session-card.js.map +1 -1
  162. package/dist/core/command-discovery.d.ts.map +1 -1
  163. package/dist/core/command-discovery.js +4 -1
  164. package/dist/core/command-discovery.js.map +1 -1
  165. package/dist/core/command-handler.d.ts.map +1 -1
  166. package/dist/core/command-handler.js +129 -27
  167. package/dist/core/command-handler.js.map +1 -1
  168. package/dist/core/cost-calculator.d.ts +3 -1
  169. package/dist/core/cost-calculator.d.ts.map +1 -1
  170. package/dist/core/cost-calculator.js +230 -1
  171. package/dist/core/cost-calculator.js.map +1 -1
  172. package/dist/core/daemon-background-close.d.ts +19 -0
  173. package/dist/core/daemon-background-close.d.ts.map +1 -0
  174. package/dist/core/daemon-background-close.js +39 -0
  175. package/dist/core/daemon-background-close.js.map +1 -0
  176. package/dist/core/dashboard-command/overview.d.ts +4 -0
  177. package/dist/core/dashboard-command/overview.d.ts.map +1 -1
  178. package/dist/core/dashboard-command/overview.js +8 -1
  179. package/dist/core/dashboard-command/overview.js.map +1 -1
  180. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  181. package/dist/core/dashboard-ipc-server.js +415 -42
  182. package/dist/core/dashboard-ipc-server.js.map +1 -1
  183. package/dist/core/dashboard-rows.d.ts +4 -0
  184. package/dist/core/dashboard-rows.d.ts.map +1 -1
  185. package/dist/core/dashboard-rows.js +3 -0
  186. package/dist/core/dashboard-rows.js.map +1 -1
  187. package/dist/core/dashboard-url.d.ts +37 -0
  188. package/dist/core/dashboard-url.d.ts.map +1 -1
  189. package/dist/core/dashboard-url.js +71 -0
  190. package/dist/core/dashboard-url.js.map +1 -1
  191. package/dist/core/deferred-schedule-settlement.d.ts +15 -1
  192. package/dist/core/deferred-schedule-settlement.d.ts.map +1 -1
  193. package/dist/core/deferred-schedule-settlement.js +4 -1
  194. package/dist/core/deferred-schedule-settlement.js.map +1 -1
  195. package/dist/core/device-isolation-daemon.d.ts +91 -1
  196. package/dist/core/device-isolation-daemon.d.ts.map +1 -1
  197. package/dist/core/device-isolation-daemon.js +346 -2
  198. package/dist/core/device-isolation-daemon.js.map +1 -1
  199. package/dist/core/local-terminal-opener.d.ts.map +1 -1
  200. package/dist/core/local-terminal-opener.js +5 -1
  201. package/dist/core/local-terminal-opener.js.map +1 -1
  202. package/dist/core/loopback-target.d.ts +14 -0
  203. package/dist/core/loopback-target.d.ts.map +1 -0
  204. package/dist/core/loopback-target.js +20 -0
  205. package/dist/core/loopback-target.js.map +1 -0
  206. package/dist/core/maintenance.d.ts.map +1 -1
  207. package/dist/core/maintenance.js +16 -2
  208. package/dist/core/maintenance.js.map +1 -1
  209. package/dist/core/mojo-containment-command.d.ts +20 -0
  210. package/dist/core/mojo-containment-command.d.ts.map +1 -0
  211. package/dist/core/mojo-containment-command.js +266 -0
  212. package/dist/core/mojo-containment-command.js.map +1 -0
  213. package/dist/core/mojo-containment.d.ts +575 -0
  214. package/dist/core/mojo-containment.d.ts.map +1 -0
  215. package/dist/core/mojo-containment.js +1158 -0
  216. package/dist/core/mojo-containment.js.map +1 -0
  217. package/dist/core/mojo-launcher-env-quarantine.d.ts +30 -0
  218. package/dist/core/mojo-launcher-env-quarantine.d.ts.map +1 -0
  219. package/dist/core/mojo-launcher-env-quarantine.js +175 -0
  220. package/dist/core/mojo-launcher-env-quarantine.js.map +1 -0
  221. package/dist/core/mojo-session-identity.d.ts +3 -0
  222. package/dist/core/mojo-session-identity.d.ts.map +1 -0
  223. package/dist/core/mojo-session-identity.js +126 -0
  224. package/dist/core/mojo-session-identity.js.map +1 -0
  225. package/dist/core/persistent-backend.d.ts +32 -8
  226. package/dist/core/persistent-backend.d.ts.map +1 -1
  227. package/dist/core/persistent-backend.js +55 -17
  228. package/dist/core/persistent-backend.js.map +1 -1
  229. package/dist/core/plugins/mcp/gateway.d.ts +14 -1
  230. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  231. package/dist/core/plugins/mcp/gateway.js +70 -3
  232. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  233. package/dist/core/plugins/mcp/host.d.ts +2 -0
  234. package/dist/core/plugins/mcp/host.d.ts.map +1 -1
  235. package/dist/core/plugins/mcp/host.js +2 -0
  236. package/dist/core/plugins/mcp/host.js.map +1 -1
  237. package/dist/core/plugins/pm2.d.ts.map +1 -1
  238. package/dist/core/plugins/pm2.js +16 -3
  239. package/dist/core/plugins/pm2.js.map +1 -1
  240. package/dist/core/plugins/service-manager.d.ts +9 -0
  241. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  242. package/dist/core/plugins/service-manager.js +33 -16
  243. package/dist/core/plugins/service-manager.js.map +1 -1
  244. package/dist/core/preview-port-owner.d.ts +109 -0
  245. package/dist/core/preview-port-owner.d.ts.map +1 -0
  246. package/dist/core/preview-port-owner.js +320 -0
  247. package/dist/core/preview-port-owner.js.map +1 -0
  248. package/dist/core/remote-cli-ids.d.ts +5 -0
  249. package/dist/core/remote-cli-ids.d.ts.map +1 -0
  250. package/dist/core/remote-cli-ids.js +24 -0
  251. package/dist/core/remote-cli-ids.js.map +1 -0
  252. package/dist/core/{riff-shutdown-detach.d.ts → remote-shutdown-detach.d.ts} +40 -39
  253. package/dist/core/remote-shutdown-detach.d.ts.map +1 -0
  254. package/dist/core/{riff-shutdown-detach.js → remote-shutdown-detach.js} +85 -83
  255. package/dist/core/remote-shutdown-detach.js.map +1 -0
  256. package/dist/core/{riff-worker-shutdown-readiness.d.ts → remote-worker-shutdown-readiness.d.ts} +5 -4
  257. package/dist/core/remote-worker-shutdown-readiness.d.ts.map +1 -0
  258. package/dist/core/{riff-worker-shutdown-readiness.js → remote-worker-shutdown-readiness.js} +4 -3
  259. package/dist/core/remote-worker-shutdown-readiness.js.map +1 -0
  260. package/dist/core/reply-target.d.ts +16 -1
  261. package/dist/core/reply-target.d.ts.map +1 -1
  262. package/dist/core/reply-target.js +61 -0
  263. package/dist/core/reply-target.js.map +1 -1
  264. package/dist/core/session-group-birth.d.ts +26 -0
  265. package/dist/core/session-group-birth.d.ts.map +1 -1
  266. package/dist/core/session-group-birth.js +81 -4
  267. package/dist/core/session-group-birth.js.map +1 -1
  268. package/dist/core/session-manager.d.ts +15 -2
  269. package/dist/core/session-manager.d.ts.map +1 -1
  270. package/dist/core/session-manager.js +259 -5
  271. package/dist/core/session-manager.js.map +1 -1
  272. package/dist/core/session-model.d.ts +46 -0
  273. package/dist/core/session-model.d.ts.map +1 -0
  274. package/dist/core/session-model.js +42 -0
  275. package/dist/core/session-model.js.map +1 -0
  276. package/dist/core/session-owner-reminder.d.ts +63 -0
  277. package/dist/core/session-owner-reminder.d.ts.map +1 -0
  278. package/dist/core/session-owner-reminder.js +196 -0
  279. package/dist/core/session-owner-reminder.js.map +1 -0
  280. package/dist/core/session-preview-registry.d.ts +53 -0
  281. package/dist/core/session-preview-registry.d.ts.map +1 -0
  282. package/dist/core/session-preview-registry.js +82 -0
  283. package/dist/core/session-preview-registry.js.map +1 -0
  284. package/dist/core/session-preview.d.ts +114 -0
  285. package/dist/core/session-preview.d.ts.map +1 -0
  286. package/dist/core/session-preview.js +184 -0
  287. package/dist/core/session-preview.js.map +1 -0
  288. package/dist/core/session-rename.d.ts.map +1 -1
  289. package/dist/core/session-rename.js +5 -3
  290. package/dist/core/session-rename.js.map +1 -1
  291. package/dist/core/session-wake-deadline.d.ts +5 -0
  292. package/dist/core/session-wake-deadline.d.ts.map +1 -0
  293. package/dist/core/session-wake-deadline.js +13 -0
  294. package/dist/core/session-wake-deadline.js.map +1 -0
  295. package/dist/core/shutdown-budgets.d.ts +7 -6
  296. package/dist/core/shutdown-budgets.d.ts.map +1 -1
  297. package/dist/core/shutdown-budgets.js +11 -10
  298. package/dist/core/shutdown-budgets.js.map +1 -1
  299. package/dist/core/skills/frontmatter.d.ts.map +1 -1
  300. package/dist/core/skills/frontmatter.js +6 -1
  301. package/dist/core/skills/frontmatter.js.map +1 -1
  302. package/dist/core/terminal-control-grant.d.ts +74 -0
  303. package/dist/core/terminal-control-grant.d.ts.map +1 -0
  304. package/dist/core/terminal-control-grant.js +183 -0
  305. package/dist/core/terminal-control-grant.js.map +1 -0
  306. package/dist/core/terminal-proxy.d.ts.map +1 -1
  307. package/dist/core/terminal-proxy.js +4 -5
  308. package/dist/core/terminal-proxy.js.map +1 -1
  309. package/dist/core/terminal-write-auth.d.ts +4 -11
  310. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  311. package/dist/core/terminal-write-auth.js +19 -16
  312. package/dist/core/terminal-write-auth.js.map +1 -1
  313. package/dist/core/trigger-session.d.ts.map +1 -1
  314. package/dist/core/trigger-session.js +36 -29
  315. package/dist/core/trigger-session.js.map +1 -1
  316. package/dist/core/types.d.ts +88 -10
  317. package/dist/core/types.d.ts.map +1 -1
  318. package/dist/core/types.js +9 -7
  319. package/dist/core/types.js.map +1 -1
  320. package/dist/core/workbench-link.d.ts +81 -0
  321. package/dist/core/workbench-link.d.ts.map +1 -0
  322. package/dist/core/workbench-link.js +109 -0
  323. package/dist/core/workbench-link.js.map +1 -0
  324. package/dist/core/worker-pool.d.ts +312 -11
  325. package/dist/core/worker-pool.d.ts.map +1 -1
  326. package/dist/core/worker-pool.js +2515 -217
  327. package/dist/core/worker-pool.js.map +1 -1
  328. package/dist/daemon.d.ts +6 -0
  329. package/dist/daemon.d.ts.map +1 -1
  330. package/dist/daemon.js +447 -116
  331. package/dist/daemon.js.map +1 -1
  332. package/dist/dashboard/aggregator.d.ts +33 -3
  333. package/dist/dashboard/aggregator.d.ts.map +1 -1
  334. package/dist/dashboard/aggregator.js +93 -17
  335. package/dist/dashboard/aggregator.js.map +1 -1
  336. package/dist/dashboard/auth-session-connections.d.ts +59 -0
  337. package/dist/dashboard/auth-session-connections.d.ts.map +1 -0
  338. package/dist/dashboard/auth-session-connections.js +109 -0
  339. package/dist/dashboard/auth-session-connections.js.map +1 -0
  340. package/dist/dashboard/auth.d.ts +99 -1
  341. package/dist/dashboard/auth.d.ts.map +1 -1
  342. package/dist/dashboard/auth.js +176 -64
  343. package/dist/dashboard/auth.js.map +1 -1
  344. package/dist/dashboard/bot-payload.d.ts +5 -0
  345. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  346. package/dist/dashboard/bot-payload.js +4 -0
  347. package/dist/dashboard/bot-payload.js.map +1 -1
  348. package/dist/dashboard/control-audit.d.ts +112 -0
  349. package/dist/dashboard/control-audit.d.ts.map +1 -0
  350. package/dist/dashboard/control-audit.js +195 -0
  351. package/dist/dashboard/control-audit.js.map +1 -0
  352. package/dist/dashboard/control-csrf.d.ts +123 -0
  353. package/dist/dashboard/control-csrf.d.ts.map +1 -0
  354. package/dist/dashboard/control-csrf.js +392 -0
  355. package/dist/dashboard/control-csrf.js.map +1 -0
  356. package/dist/dashboard/daemon-reconcile.d.ts +26 -0
  357. package/dist/dashboard/daemon-reconcile.d.ts.map +1 -0
  358. package/dist/dashboard/daemon-reconcile.js +46 -0
  359. package/dist/dashboard/daemon-reconcile.js.map +1 -0
  360. package/dist/dashboard/debug-terminal.d.ts.map +1 -1
  361. package/dist/dashboard/debug-terminal.js +18 -4
  362. package/dist/dashboard/debug-terminal.js.map +1 -1
  363. package/dist/dashboard/events-sse.d.ts +60 -0
  364. package/dist/dashboard/events-sse.d.ts.map +1 -0
  365. package/dist/dashboard/events-sse.js +63 -0
  366. package/dist/dashboard/events-sse.js.map +1 -0
  367. package/dist/dashboard/h5-auth.d.ts +256 -0
  368. package/dist/dashboard/h5-auth.d.ts.map +1 -0
  369. package/dist/dashboard/h5-auth.js +825 -0
  370. package/dist/dashboard/h5-auth.js.map +1 -0
  371. package/dist/dashboard/managed-spawn.d.ts +36 -0
  372. package/dist/dashboard/managed-spawn.d.ts.map +1 -0
  373. package/dist/dashboard/managed-spawn.js +169 -0
  374. package/dist/dashboard/managed-spawn.js.map +1 -0
  375. package/dist/dashboard/preview-content-capability.d.ts +41 -0
  376. package/dist/dashboard/preview-content-capability.d.ts.map +1 -0
  377. package/dist/dashboard/preview-content-capability.js +127 -0
  378. package/dist/dashboard/preview-content-capability.js.map +1 -0
  379. package/dist/dashboard/preview-contract.d.ts +85 -0
  380. package/dist/dashboard/preview-contract.d.ts.map +1 -0
  381. package/dist/dashboard/preview-contract.js +198 -0
  382. package/dist/dashboard/preview-contract.js.map +1 -0
  383. package/dist/dashboard/preview-guard-page.d.ts +52 -0
  384. package/dist/dashboard/preview-guard-page.d.ts.map +1 -0
  385. package/dist/dashboard/preview-guard-page.js +162 -0
  386. package/dist/dashboard/preview-guard-page.js.map +1 -0
  387. package/dist/dashboard/preview-interaction.d.ts +57 -0
  388. package/dist/dashboard/preview-interaction.d.ts.map +1 -0
  389. package/dist/dashboard/preview-interaction.js +198 -0
  390. package/dist/dashboard/preview-interaction.js.map +1 -0
  391. package/dist/dashboard/preview-proxy.d.ts +113 -0
  392. package/dist/dashboard/preview-proxy.d.ts.map +1 -0
  393. package/dist/dashboard/preview-proxy.js +543 -0
  394. package/dist/dashboard/preview-proxy.js.map +1 -0
  395. package/dist/dashboard/public-redact.d.ts +23 -0
  396. package/dist/dashboard/public-redact.d.ts.map +1 -1
  397. package/dist/dashboard/public-redact.js +90 -21
  398. package/dist/dashboard/public-redact.js.map +1 -1
  399. package/dist/dashboard/request-identity.d.ts +77 -0
  400. package/dist/dashboard/request-identity.d.ts.map +1 -0
  401. package/dist/dashboard/request-identity.js +72 -0
  402. package/dist/dashboard/request-identity.js.map +1 -0
  403. package/dist/dashboard/session-cleanup.d.ts +5 -0
  404. package/dist/dashboard/session-cleanup.d.ts.map +1 -1
  405. package/dist/dashboard/session-cleanup.js +4 -0
  406. package/dist/dashboard/session-cleanup.js.map +1 -1
  407. package/dist/dashboard/settings-write-applier.d.ts +5 -1
  408. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  409. package/dist/dashboard/settings-write-applier.js +14 -0
  410. package/dist/dashboard/settings-write-applier.js.map +1 -1
  411. package/dist/dashboard/standing-link.d.ts +76 -0
  412. package/dist/dashboard/standing-link.d.ts.map +1 -0
  413. package/dist/dashboard/standing-link.js +111 -0
  414. package/dist/dashboard/standing-link.js.map +1 -0
  415. package/dist/dashboard/terminal-control.d.ts +105 -0
  416. package/dist/dashboard/terminal-control.d.ts.map +1 -0
  417. package/dist/dashboard/terminal-control.js +296 -0
  418. package/dist/dashboard/terminal-control.js.map +1 -0
  419. package/dist/dashboard/terminal-front-proxy.d.ts +55 -0
  420. package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -0
  421. package/dist/dashboard/terminal-front-proxy.js +397 -0
  422. package/dist/dashboard/terminal-front-proxy.js.map +1 -0
  423. package/dist/dashboard/terminal-view-capability.d.ts +97 -0
  424. package/dist/dashboard/terminal-view-capability.d.ts.map +1 -0
  425. package/dist/dashboard/terminal-view-capability.js +145 -0
  426. package/dist/dashboard/terminal-view-capability.js.map +1 -0
  427. package/dist/dashboard/web/agent-workbench-api.d.ts +59 -0
  428. package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -0
  429. package/dist/dashboard/web/agent-workbench-api.js +227 -0
  430. package/dist/dashboard/web/agent-workbench-api.js.map +1 -0
  431. package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts +59 -0
  432. package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts.map +1 -0
  433. package/dist/dashboard/web/agent-workbench-appearance-menu.js +195 -0
  434. package/dist/dashboard/web/agent-workbench-appearance-menu.js.map +1 -0
  435. package/dist/dashboard/web/agent-workbench-appearance.d.ts +222 -0
  436. package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -0
  437. package/dist/dashboard/web/agent-workbench-appearance.js +499 -0
  438. package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -0
  439. package/dist/dashboard/web/agent-workbench-capabilities.d.ts +13 -0
  440. package/dist/dashboard/web/agent-workbench-capabilities.d.ts.map +1 -0
  441. package/dist/dashboard/web/agent-workbench-capabilities.js +24 -0
  442. package/dist/dashboard/web/agent-workbench-capabilities.js.map +1 -0
  443. package/dist/dashboard/web/agent-workbench-chat.d.ts +90 -0
  444. package/dist/dashboard/web/agent-workbench-chat.d.ts.map +1 -0
  445. package/dist/dashboard/web/agent-workbench-chat.js +168 -0
  446. package/dist/dashboard/web/agent-workbench-chat.js.map +1 -0
  447. package/dist/dashboard/web/agent-workbench-dock-page.d.ts +3 -0
  448. package/dist/dashboard/web/agent-workbench-dock-page.d.ts.map +1 -0
  449. package/dist/dashboard/web/agent-workbench-dock-page.js +23 -0
  450. package/dist/dashboard/web/agent-workbench-dock-page.js.map +1 -0
  451. package/dist/dashboard/web/agent-workbench-dock-view.d.ts +22 -0
  452. package/dist/dashboard/web/agent-workbench-dock-view.d.ts.map +1 -0
  453. package/dist/dashboard/web/agent-workbench-dock-view.js +76 -0
  454. package/dist/dashboard/web/agent-workbench-dock-view.js.map +1 -0
  455. package/dist/dashboard/web/agent-workbench-model.d.ts +196 -0
  456. package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -0
  457. package/dist/dashboard/web/agent-workbench-model.js +529 -0
  458. package/dist/dashboard/web/agent-workbench-model.js.map +1 -0
  459. package/dist/dashboard/web/agent-workbench-page.d.ts +3 -0
  460. package/dist/dashboard/web/agent-workbench-page.d.ts.map +1 -0
  461. package/dist/dashboard/web/agent-workbench-page.js +27 -0
  462. package/dist/dashboard/web/agent-workbench-page.js.map +1 -0
  463. package/dist/dashboard/web/agent-workbench-panes.d.ts +49 -0
  464. package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -0
  465. package/dist/dashboard/web/agent-workbench-panes.js +468 -0
  466. package/dist/dashboard/web/agent-workbench-panes.js.map +1 -0
  467. package/dist/dashboard/web/agent-workbench-session-list.d.ts +42 -0
  468. package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -0
  469. package/dist/dashboard/web/agent-workbench-session-list.js +353 -0
  470. package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -0
  471. package/dist/dashboard/web/agent-workbench-storage.d.ts +49 -0
  472. package/dist/dashboard/web/agent-workbench-storage.d.ts.map +1 -0
  473. package/dist/dashboard/web/agent-workbench-storage.js +197 -0
  474. package/dist/dashboard/web/agent-workbench-storage.js.map +1 -0
  475. package/dist/dashboard/web/agent-workbench-touch.d.ts +46 -0
  476. package/dist/dashboard/web/agent-workbench-touch.d.ts.map +1 -0
  477. package/dist/dashboard/web/agent-workbench-touch.js +96 -0
  478. package/dist/dashboard/web/agent-workbench-touch.js.map +1 -0
  479. package/dist/dashboard/web/agent-workbench-view.d.ts +34 -0
  480. package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -0
  481. package/dist/dashboard/web/agent-workbench-view.js +439 -0
  482. package/dist/dashboard/web/agent-workbench-view.js.map +1 -0
  483. package/dist/dashboard/web/app.d.ts.map +1 -1
  484. package/dist/dashboard/web/app.js +63 -2
  485. package/dist/dashboard/web/app.js.map +1 -1
  486. package/dist/dashboard/web/bot-defaults-page.d.ts +18 -0
  487. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  488. package/dist/dashboard/web/bot-defaults-page.js +362 -36
  489. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  490. package/dist/dashboard/web/bot-defaults.d.ts +8 -0
  491. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  492. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  493. package/dist/dashboard/web/control-csrf.d.ts +4 -0
  494. package/dist/dashboard/web/control-csrf.d.ts.map +1 -0
  495. package/dist/dashboard/web/control-csrf.js +26 -0
  496. package/dist/dashboard/web/control-csrf.js.map +1 -0
  497. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  498. package/dist/dashboard/web/dashboard-routes.js +2 -0
  499. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  500. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  501. package/dist/dashboard/web/groups-page.js +11 -2
  502. package/dist/dashboard/web/groups-page.js.map +1 -1
  503. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  504. package/dist/dashboard/web/i18n.js +140 -6
  505. package/dist/dashboard/web/i18n.js.map +1 -1
  506. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  507. package/dist/dashboard/web/overview-page.js +3 -2
  508. package/dist/dashboard/web/overview-page.js.map +1 -1
  509. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  510. package/dist/dashboard/web/sessions-page.js +41 -1
  511. package/dist/dashboard/web/sessions-page.js.map +1 -1
  512. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  513. package/dist/dashboard/web/sessions.js +5 -1
  514. package/dist/dashboard/web/sessions.js.map +1 -1
  515. package/dist/dashboard/web/settings-page.d.ts +3 -0
  516. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  517. package/dist/dashboard/web/settings-page.js +56 -10
  518. package/dist/dashboard/web/settings-page.js.map +1 -1
  519. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  520. package/dist/dashboard/web/skills-page.js +4 -2
  521. package/dist/dashboard/web/skills-page.js.map +1 -1
  522. package/dist/dashboard/web/store.d.ts +27 -2
  523. package/dist/dashboard/web/store.d.ts.map +1 -1
  524. package/dist/dashboard/web/store.js +43 -4
  525. package/dist/dashboard/web/store.js.map +1 -1
  526. package/dist/dashboard/web/ui.d.ts +3 -0
  527. package/dist/dashboard/web/ui.d.ts.map +1 -1
  528. package/dist/dashboard/web/ui.js +11 -0
  529. package/dist/dashboard/web/ui.js.map +1 -1
  530. package/dist/dashboard/web/update-action.d.ts +12 -0
  531. package/dist/dashboard/web/update-action.d.ts.map +1 -1
  532. package/dist/dashboard/web/update-action.js +11 -0
  533. package/dist/dashboard/web/update-action.js.map +1 -1
  534. package/dist/dashboard/workbench-doctor.d.ts +114 -0
  535. package/dist/dashboard/workbench-doctor.d.ts.map +1 -0
  536. package/dist/dashboard/workbench-doctor.js +620 -0
  537. package/dist/dashboard/workbench-doctor.js.map +1 -0
  538. package/dist/dashboard/workbench-ticket.d.ts +165 -0
  539. package/dist/dashboard/workbench-ticket.d.ts.map +1 -0
  540. package/dist/dashboard/workbench-ticket.js +495 -0
  541. package/dist/dashboard/workbench-ticket.js.map +1 -0
  542. package/dist/dashboard-web/app.js +1 -1
  543. package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +1 -0
  544. package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +1 -0
  545. package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +10 -0
  546. package/dist/dashboard-web/chunks/chunk-22WIADUT.js +2 -0
  547. package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +1 -0
  548. package/dist/dashboard-web/chunks/{chunk-6O7KXFD2.js → chunk-2W6SCN3M.js} +1 -1
  549. package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +1 -0
  550. package/dist/dashboard-web/chunks/{chunk-Q2MT4VWH.js → chunk-F6KNPF4R.js} +11 -9
  551. package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +1 -0
  552. package/dist/dashboard-web/chunks/chunk-G5ZS2YUS.js +1 -0
  553. package/dist/dashboard-web/chunks/chunk-KTQ7B6ZR.js +1 -0
  554. package/dist/dashboard-web/chunks/{chunk-U3ZFSO7E.js → chunk-NACP7BMR.js} +1 -1
  555. package/dist/dashboard-web/chunks/{connectors-page-2KZO5KSJ.js → connectors-page-VOISXXII.js} +1 -1
  556. package/dist/dashboard-web/chunks/{feedback-page-CLVTOLLO.js → feedback-page-RN6HRZMS.js} +1 -1
  557. package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +8 -0
  558. package/dist/dashboard-web/chunks/{insights-page-4RPU2CRU.js → insights-page-HJFDYR5N.js} +3 -3
  559. package/dist/dashboard-web/chunks/{monitor-room-OTKQ2CXK.js → monitor-room-V7PCP47V.js} +1 -1
  560. package/dist/dashboard-web/chunks/{monitoring-page-IJPUB6JT.js → monitoring-page-NKEKVQAP.js} +1 -1
  561. package/dist/dashboard-web/chunks/{office-page-QSR3J44Y.js → office-page-GVJF73XW.js} +1 -1
  562. package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +1 -0
  563. package/dist/dashboard-web/chunks/{plugin-page-VEGTCEAS.js → plugin-page-J3OF5IY4.js} +1 -1
  564. package/dist/dashboard-web/chunks/{roles-page-6NWJMOB5.js → roles-page-WQIRSOLZ.js} +1 -1
  565. package/dist/dashboard-web/chunks/{schedules-page-6I3LNXD4.js → schedules-page-J2DEY2X6.js} +1 -1
  566. package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +8 -0
  567. package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +2 -0
  568. package/dist/dashboard-web/chunks/{skills-page-M2Q6L5CB.js → skills-page-HGIFR3IU.js} +2 -2
  569. package/dist/dashboard-web/chunks/{team-federation-page-7I7FDE3B.js → team-federation-page-MR5ZPL4B.js} +1 -1
  570. package/dist/dashboard-web/chunks/{v3-page-HQXRL65L.js → v3-page-GBR5JWPE.js} +2 -2
  571. package/dist/dashboard-web/chunks/{whiteboards-page-LQKC4TAZ.js → whiteboards-page-QAZM4BN3.js} +1 -1
  572. package/dist/dashboard-web/index.html +8 -1
  573. package/dist/dashboard-web/style.css +2006 -10
  574. package/dist/dashboard.js +1017 -264
  575. package/dist/dashboard.js.map +1 -1
  576. package/dist/dsh-runner.js +8 -1
  577. package/dist/dsh-runner.js.map +1 -1
  578. package/dist/global-config.d.ts +30 -0
  579. package/dist/global-config.d.ts.map +1 -1
  580. package/dist/global-config.js +33 -0
  581. package/dist/global-config.js.map +1 -1
  582. package/dist/i18n/en.d.ts.map +1 -1
  583. package/dist/i18n/en.js +46 -27
  584. package/dist/i18n/en.js.map +1 -1
  585. package/dist/i18n/zh.d.ts.map +1 -1
  586. package/dist/i18n/zh.js +43 -27
  587. package/dist/i18n/zh.js.map +1 -1
  588. package/dist/im/lark/card-builder.d.ts +1 -1
  589. package/dist/im/lark/card-builder.d.ts.map +1 -1
  590. package/dist/im/lark/card-builder.js +22 -6
  591. package/dist/im/lark/card-builder.js.map +1 -1
  592. package/dist/im/lark/card-handler.d.ts.map +1 -1
  593. package/dist/im/lark/card-handler.js +118 -24
  594. package/dist/im/lark/card-handler.js.map +1 -1
  595. package/dist/im/lark/client.d.ts +15 -0
  596. package/dist/im/lark/client.d.ts.map +1 -1
  597. package/dist/im/lark/client.js +30 -0
  598. package/dist/im/lark/client.js.map +1 -1
  599. package/dist/im/lark/event-dispatcher.d.ts +48 -0
  600. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  601. package/dist/im/lark/event-dispatcher.js +138 -41
  602. package/dist/im/lark/event-dispatcher.js.map +1 -1
  603. package/dist/im/lark/identity-cache.d.ts +14 -6
  604. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  605. package/dist/im/lark/identity-cache.js +69 -26
  606. package/dist/im/lark/identity-cache.js.map +1 -1
  607. package/dist/im/lark/lark-hosts.d.ts +13 -0
  608. package/dist/im/lark/lark-hosts.d.ts.map +1 -1
  609. package/dist/im/lark/lark-hosts.js +16 -0
  610. package/dist/im/lark/lark-hosts.js.map +1 -1
  611. package/dist/im/lark/overview-card.d.ts +22 -0
  612. package/dist/im/lark/overview-card.d.ts.map +1 -1
  613. package/dist/im/lark/overview-card.js +53 -3
  614. package/dist/im/lark/overview-card.js.map +1 -1
  615. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  616. package/dist/im/lark/sessions-card.js +26 -3
  617. package/dist/im/lark/sessions-card.js.map +1 -1
  618. package/dist/im/lark/workflow-slash-command.d.ts +6 -0
  619. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  620. package/dist/im/lark/workflow-slash-command.js +7 -0
  621. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  622. package/dist/index-daemon.js +27 -4
  623. package/dist/index-daemon.js.map +1 -1
  624. package/dist/index-dashboard.d.ts +3 -0
  625. package/dist/index-dashboard.d.ts.map +1 -0
  626. package/dist/index-dashboard.js +94 -0
  627. package/dist/index-dashboard.js.map +1 -0
  628. package/dist/platform/team-agents-client.d.ts +199 -0
  629. package/dist/platform/team-agents-client.d.ts.map +1 -0
  630. package/dist/platform/team-agents-client.js +263 -0
  631. package/dist/platform/team-agents-client.js.map +1 -0
  632. package/dist/platform/tunnel-client.d.ts +6 -0
  633. package/dist/platform/tunnel-client.d.ts.map +1 -1
  634. package/dist/platform/tunnel-client.js.map +1 -1
  635. package/dist/services/async-trigger-state.d.ts +7 -3
  636. package/dist/services/async-trigger-state.d.ts.map +1 -1
  637. package/dist/services/async-trigger-state.js +28 -0
  638. package/dist/services/async-trigger-state.js.map +1 -1
  639. package/dist/services/async-trigger-store.d.ts +13 -4
  640. package/dist/services/async-trigger-store.d.ts.map +1 -1
  641. package/dist/services/async-trigger-store.js +55 -8
  642. package/dist/services/async-trigger-store.js.map +1 -1
  643. package/dist/services/bot-config-store.d.ts +1 -11
  644. package/dist/services/bot-config-store.d.ts.map +1 -1
  645. package/dist/services/bot-config-store.js +27 -3
  646. package/dist/services/bot-config-store.js.map +1 -1
  647. package/dist/services/bot-profile-store.d.ts +17 -2
  648. package/dist/services/bot-profile-store.d.ts.map +1 -1
  649. package/dist/services/bot-profile-store.js +93 -12
  650. package/dist/services/bot-profile-store.js.map +1 -1
  651. package/dist/services/bridge-fallback-gate.d.ts +15 -7
  652. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  653. package/dist/services/bridge-fallback-gate.js +43 -16
  654. package/dist/services/bridge-fallback-gate.js.map +1 -1
  655. package/dist/services/bridge-turn-queue.d.ts +10 -1
  656. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  657. package/dist/services/bridge-turn-queue.js +29 -9
  658. package/dist/services/bridge-turn-queue.js.map +1 -1
  659. package/dist/services/claude-transcript.d.ts +19 -0
  660. package/dist/services/claude-transcript.d.ts.map +1 -1
  661. package/dist/services/claude-transcript.js +57 -5
  662. package/dist/services/claude-transcript.js.map +1 -1
  663. package/dist/services/codex-app-threads.d.ts +2 -0
  664. package/dist/services/codex-app-threads.d.ts.map +1 -1
  665. package/dist/services/codex-app-threads.js +1 -1
  666. package/dist/services/codex-app-threads.js.map +1 -1
  667. package/dist/services/codex-reasoning-effort.d.ts +8 -0
  668. package/dist/services/codex-reasoning-effort.d.ts.map +1 -1
  669. package/dist/services/codex-reasoning-effort.js +24 -0
  670. package/dist/services/codex-reasoning-effort.js.map +1 -1
  671. package/dist/services/cursor-resume-policy.d.ts.map +1 -1
  672. package/dist/services/cursor-resume-policy.js +15 -3
  673. package/dist/services/cursor-resume-policy.js.map +1 -1
  674. package/dist/services/open-platform-rename.d.ts.map +1 -1
  675. package/dist/services/open-platform-rename.js +3 -2
  676. package/dist/services/open-platform-rename.js.map +1 -1
  677. package/dist/services/ordinary-turn-recovery.d.ts +76 -0
  678. package/dist/services/ordinary-turn-recovery.d.ts.map +1 -0
  679. package/dist/services/ordinary-turn-recovery.js +349 -0
  680. package/dist/services/ordinary-turn-recovery.js.map +1 -0
  681. package/dist/services/peer-cross-ref-store.d.ts +8 -0
  682. package/dist/services/peer-cross-ref-store.d.ts.map +1 -0
  683. package/dist/services/peer-cross-ref-store.js +95 -0
  684. package/dist/services/peer-cross-ref-store.js.map +1 -0
  685. package/dist/services/pi-transcript.d.ts.map +1 -1
  686. package/dist/services/pi-transcript.js +10 -6
  687. package/dist/services/pi-transcript.js.map +1 -1
  688. package/dist/services/resume-fresh-policy.d.ts +17 -0
  689. package/dist/services/resume-fresh-policy.d.ts.map +1 -0
  690. package/dist/services/resume-fresh-policy.js +24 -0
  691. package/dist/services/resume-fresh-policy.js.map +1 -0
  692. package/dist/services/session-group-title.d.ts +1 -0
  693. package/dist/services/session-group-title.d.ts.map +1 -1
  694. package/dist/services/session-group-title.js +16 -1
  695. package/dist/services/session-group-title.js.map +1 -1
  696. package/dist/services/session-groups-store.d.ts +30 -0
  697. package/dist/services/session-groups-store.d.ts.map +1 -1
  698. package/dist/services/session-groups-store.js +26 -4
  699. package/dist/services/session-groups-store.js.map +1 -1
  700. package/dist/services/session-owner-notification.d.ts +9 -0
  701. package/dist/services/session-owner-notification.d.ts.map +1 -0
  702. package/dist/services/session-owner-notification.js +10 -0
  703. package/dist/services/session-owner-notification.js.map +1 -0
  704. package/dist/services/session-owner-reminder-config-store.d.ts +9 -0
  705. package/dist/services/session-owner-reminder-config-store.d.ts.map +1 -0
  706. package/dist/services/session-owner-reminder-config-store.js +24 -0
  707. package/dist/services/session-owner-reminder-config-store.js.map +1 -0
  708. package/dist/services/session-owner-reminder-store.d.ts +5 -0
  709. package/dist/services/session-owner-reminder-store.d.ts.map +1 -0
  710. package/dist/services/session-owner-reminder-store.js +54 -0
  711. package/dist/services/session-owner-reminder-store.js.map +1 -0
  712. package/dist/services/session-store.d.ts +98 -21
  713. package/dist/services/session-store.d.ts.map +1 -1
  714. package/dist/services/session-store.js +406 -48
  715. package/dist/services/session-store.js.map +1 -1
  716. package/dist/services/structured-bridge-clis.d.ts +15 -2
  717. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  718. package/dist/services/structured-bridge-clis.js +16 -1
  719. package/dist/services/structured-bridge-clis.js.map +1 -1
  720. package/dist/services/transcript-resolver.d.ts +1 -1
  721. package/dist/services/transcript-resolver.d.ts.map +1 -1
  722. package/dist/services/transcript-resolver.js +6 -1
  723. package/dist/services/transcript-resolver.js.map +1 -1
  724. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  725. package/dist/setup/bot-config-editor.js +7 -2
  726. package/dist/setup/bot-config-editor.js.map +1 -1
  727. package/dist/setup/ensure-herdr-integrations.d.ts +13 -0
  728. package/dist/setup/ensure-herdr-integrations.d.ts.map +1 -1
  729. package/dist/setup/ensure-herdr-integrations.js +21 -3
  730. package/dist/setup/ensure-herdr-integrations.js.map +1 -1
  731. package/dist/setup/open-platform-automation.d.ts +1 -0
  732. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  733. package/dist/setup/open-platform-automation.js +107 -7
  734. package/dist/setup/open-platform-automation.js.map +1 -1
  735. package/dist/skills/definitions.d.ts +17 -0
  736. package/dist/skills/definitions.d.ts.map +1 -1
  737. package/dist/skills/definitions.js +78 -8
  738. package/dist/skills/definitions.js.map +1 -1
  739. package/dist/skills/injection-mode.d.ts +24 -3
  740. package/dist/skills/injection-mode.d.ts.map +1 -1
  741. package/dist/skills/injection-mode.js +64 -15
  742. package/dist/skills/injection-mode.js.map +1 -1
  743. package/dist/skills/installer.d.ts +18 -0
  744. package/dist/skills/installer.d.ts.map +1 -1
  745. package/dist/skills/installer.js +45 -1
  746. package/dist/skills/installer.js.map +1 -1
  747. package/dist/types.d.ts +222 -10
  748. package/dist/types.d.ts.map +1 -1
  749. package/dist/utils/bot-routing.d.ts +1 -1
  750. package/dist/utils/bot-routing.d.ts.map +1 -1
  751. package/dist/utils/bot-routing.js.map +1 -1
  752. package/dist/utils/child-env.d.ts +92 -2
  753. package/dist/utils/child-env.d.ts.map +1 -1
  754. package/dist/utils/child-env.js +195 -1
  755. package/dist/utils/child-env.js.map +1 -1
  756. package/dist/utils/cli-usage-limit.d.ts +25 -14
  757. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  758. package/dist/utils/cli-usage-limit.js +25 -15
  759. package/dist/utils/cli-usage-limit.js.map +1 -1
  760. package/dist/utils/daemon-rejection-guard.d.ts +35 -0
  761. package/dist/utils/daemon-rejection-guard.d.ts.map +1 -0
  762. package/dist/utils/daemon-rejection-guard.js +101 -0
  763. package/dist/utils/daemon-rejection-guard.js.map +1 -0
  764. package/dist/utils/dashboard-env.d.ts +53 -0
  765. package/dist/utils/dashboard-env.d.ts.map +1 -0
  766. package/dist/utils/dashboard-env.js +116 -0
  767. package/dist/utils/dashboard-env.js.map +1 -0
  768. package/dist/utils/global-install.d.ts.map +1 -1
  769. package/dist/utils/global-install.js +61 -5
  770. package/dist/utils/global-install.js.map +1 -1
  771. package/dist/utils/install-diagnostics.d.ts +14 -7
  772. package/dist/utils/install-diagnostics.d.ts.map +1 -1
  773. package/dist/utils/install-diagnostics.js +20 -11
  774. package/dist/utils/install-diagnostics.js.map +1 -1
  775. package/dist/utils/local-dev-update.d.ts +132 -0
  776. package/dist/utils/local-dev-update.d.ts.map +1 -0
  777. package/dist/utils/local-dev-update.js +176 -0
  778. package/dist/utils/local-dev-update.js.map +1 -0
  779. package/dist/utils/pending-input-queue.d.ts +12 -1
  780. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  781. package/dist/utils/pending-input-queue.js.map +1 -1
  782. package/dist/worker.js +1517 -236
  783. package/dist/worker.js.map +1 -1
  784. package/dist/workflows/definition.d.ts +68 -68
  785. package/dist/workflows/events/payloads.d.ts +14 -14
  786. package/dist/workflows/events/schema.d.ts +312 -312
  787. package/dist/workflows/migration/v2-run-archive-schema.d.ts +40 -40
  788. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  789. package/dist/workflows/v3/cli-run.js +7 -0
  790. package/dist/workflows/v3/cli-run.js.map +1 -1
  791. package/dist/workflows/v3/goal-cli.d.ts +3 -0
  792. package/dist/workflows/v3/goal-cli.d.ts.map +1 -1
  793. package/dist/workflows/v3/goal-cli.js +11 -0
  794. package/dist/workflows/v3/goal-cli.js.map +1 -1
  795. package/dist/workflows/v3/run-envelope.d.ts +144 -144
  796. package/package.json +7 -2
  797. package/dist/cli/pm2-god-admission.d.ts +0 -8
  798. package/dist/cli/pm2-god-admission.d.ts.map +0 -1
  799. package/dist/cli/pm2-god-admission.js +0 -25
  800. package/dist/cli/pm2-god-admission.js.map +0 -1
  801. package/dist/core/riff-shutdown-detach.d.ts.map +0 -1
  802. package/dist/core/riff-shutdown-detach.js.map +0 -1
  803. package/dist/core/riff-worker-shutdown-readiness.d.ts.map +0 -1
  804. package/dist/core/riff-worker-shutdown-readiness.js.map +0 -1
  805. package/dist/dashboard-web/chunks/bot-defaults-page-4RENHE7J.js +0 -10
  806. package/dist/dashboard-web/chunks/chunk-2WQDS65D.js +0 -1
  807. package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +0 -1
  808. package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +0 -1
  809. package/dist/dashboard-web/chunks/groups-page-HLASRTSY.js +0 -8
  810. package/dist/dashboard-web/chunks/overview-page-6OK63V4V.js +0 -1
  811. package/dist/dashboard-web/chunks/sessions-page-B2TXGJDO.js +0 -8
  812. package/dist/dashboard-web/chunks/settings-page-6KJADSC6.js +0 -2
@@ -1,32 +1,178 @@
1
- export function formatChatBotsForCli(chatBots, currentLarkAppId) {
2
- return chatBots.map((cb) => ({
3
- name: cb.displayName,
4
- openId: cb.openId,
5
- isSelf: cb.larkAppId === currentLarkAppId,
6
- source: cb.source,
7
- larkAppId: cb.larkAppId,
8
- workflowBot: cb.larkAppId || null,
9
- capability: cb.capability ?? null,
10
- hasTeamRole: cb.hasTeamRole,
11
- mentionable: cb.mentionable,
12
- mentionSource: cb.mentionSource,
13
- }));
1
+ export const collaborationHelp = {
2
+ general: 'unknown 表示当前命令没有足够证据,不等于不可用;群成员关系、本地配置和发送成功也不能单独证明目标在线或任务完成。',
3
+ fields: {
4
+ reachability: {
5
+ description: '当前 Bot 是否有足够证据被可靠寻址。',
6
+ values: {
7
+ ready: '已有当前群的可靠 @ 句柄,可以直接寻址;不代表目标运行时在线。',
8
+ 'needs-introduce': '已识别配置中的 Bot,但 @ 句柄不可靠;先完成 /introduce 再依赖 @ 派发。',
9
+ offline: '已有权威离线证据;恢复后再派发。',
10
+ unknown: '缺少当前群的可靠寻址证据;先刷新花名册或完成 /introduce,不能据此判定离线。',
11
+ },
12
+ },
13
+ 'workspace.requirement': {
14
+ description: '派发任务时是否需要指定仓库或工作区。',
15
+ values: {
16
+ required: '必须显式提供工作区;缺少仓库时不要派发。',
17
+ optional: '工作区可省略;代码任务仍应在需要时明确指定仓库。',
18
+ none: '该 Bot 的任务不需要工作区。',
19
+ unknown: '能力声明没有给出要求;派发前先确认,不能假定当前目录可用。',
20
+ },
21
+ },
22
+ 'workspace.source': {
23
+ description: '目标创建会话时可用的工作区配置候选来源;目录校验或会话继承可能改变最终 cwd。',
24
+ values: {
25
+ default: '已配置目标 Bot 的默认工作区候选;不代表最终 cwd。',
26
+ oncall: '当前群命中 OnCall 工作区候选;不代表最终 cwd。',
27
+ inherited: '继承既有会话或话题的工作区。',
28
+ explicit: '使用派发时显式指定的工作区。',
29
+ none: '不需要工作区。',
30
+ unknown: '当前输出没有 cwd 来源证据;不要猜测目标目录。',
31
+ },
32
+ },
33
+ 'authorization.talk': {
34
+ description: '是否具备普通 Bot 间对话所需的授权证据。',
35
+ values: {
36
+ ready: '已有对话授权,可以直接交互。',
37
+ 'preflight-required': '用稳定 --bot-app 派发;发送前会建立并回读 talk-only 授权。',
38
+ unknown: '没有足够对话授权证据;先确认稳定目标和对话信任链路。',
39
+ },
40
+ },
41
+ 'authorization.operate': {
42
+ description: '是否有执行 /repo、/restart 等管理动作的授权证据;与普通对话授权分开判断。',
43
+ values: {
44
+ true: '已有 operate 授权证据,可以执行管理动作。',
45
+ false: '本次 talk-only preflight 不授予 operate;/repo、/restart 等管理动作仍需单独授权。',
46
+ unknown: '当前命令没有 operate 授权证据;不要按 true 处理。',
47
+ },
48
+ },
49
+ 'session.mentionMode': {
50
+ description: '目标 Bot 在普通群中何时要求 @ 才会响应;不描述私聊或话题群策略。',
51
+ values: {
52
+ always: '普通群内始终需要 @ 目标 Bot,包括 shared 话题内的续话。',
53
+ topic: '普通群顶层需要 @;shared 话题内后续非 @ 消息可继续唤起。',
54
+ never: '普通群内不需要 @ 即可唤起。',
55
+ ambient: '普通群内可免 @ 观察消息,但消息明确指向其他成员时保持安静。',
56
+ unknown: '没有权威普通群配置;派发时保守地使用明确寻址。',
57
+ },
58
+ },
59
+ 'session.replyMode': {
60
+ description: '目标 Bot 在普通群中的回复会落在哪种会话或话题上下文;不描述私聊或话题群策略。',
61
+ values: {
62
+ chat: '普通群内复用群级会话,原生话题也折叠到同一会话。',
63
+ 'chat-topic': '普通群顶层复用 chat-scope session;群内原生话题各自使用独立会话。',
64
+ 'new-topic': '普通群顶层派发后新建独立话题,应在新话题跟进结果。',
65
+ shared: '普通群回复展示在话题中,但复用群级 chat-scope session 和 cwd。',
66
+ unknown: '没有权威普通群路由配置;不要假定回复位置或上下文会被继承。',
67
+ },
68
+ },
69
+ 'runtime.transport': {
70
+ description: '目标 Bot 的配置是否具备飞书 transport 能力;该字段不是在线健康状态。',
71
+ values: {
72
+ true: '配置允许飞书 transport;不证明 daemon 或连接在线。',
73
+ false: 'apiOnly 配置明确不具备飞书 transport。',
74
+ unknown: '当前进程读不到权威 BotConfig;群成员关系或 Lark API 成功不能替代配置证据。',
75
+ },
76
+ },
77
+ 'runtime.deployment': {
78
+ description: '目标 Bot 的部署归属;该字段不表示在线状态。',
79
+ values: {
80
+ local: '目标 App 在当前 botmux 主机有配置;仍需单独判断运行时健康。',
81
+ remote: '目标由远端部署管理;派发时需要保留远端回报和路径边界。',
82
+ unknown: '当前输出无法确定部署归属。',
83
+ },
84
+ },
85
+ 'runtime.stale': {
86
+ description: '已有运行时健康证据是否过期。',
87
+ values: {
88
+ true: '健康证据已过期;派发前刷新状态。',
89
+ false: '有近期权威健康证据。',
90
+ unknown: '没有健康时间戳或探针证据;不能据此判断在线或离线。',
91
+ },
92
+ },
93
+ },
94
+ };
95
+ function dispatchGuide(capability) {
96
+ const workspace = capability?.match(/\bworkspace\s*:\s*(required|optional|none)\b/i)?.[1]?.toLowerCase();
97
+ return {
98
+ trigger: 'mention',
99
+ workspace: workspace === 'required' || workspace === 'optional' || workspace === 'none'
100
+ ? workspace
101
+ : 'unknown',
102
+ };
14
103
  }
15
- export function formatBotInfoEntriesForCli(botEntries, currentLarkAppId) {
104
+ function collaborationGuide(row, live, facts) {
105
+ // A "stable peer" is a locally-configured bot we can preflight a talk-only
106
+ // grant against. Gate on source==='configured' explicitly, not just a
107
+ // non-empty larkAppId: today the sole producers guarantee introduce rows
108
+ // carry larkAppId='' (so non-empty ⇒ configured), but talk/operate promise a
109
+ // "--bot-app" dispatch that REQUIRES local config — so we encode that
110
+ // invariant here rather than relying on it. deployment already gates the same
111
+ // way; this keeps a future introduce producer carrying a remote app id from
112
+ // silently flipping talk to preflight-required.
113
+ const stablePeer = live && row.larkAppId !== '' && row.source === 'configured' && !row.isSelf;
114
+ return {
115
+ reachability: live
116
+ ? (row.mentionable ? 'ready' : row.source === 'configured' ? 'needs-introduce' : 'unknown')
117
+ : 'unknown',
118
+ workspace: {
119
+ requirement: row.dispatch.workspace,
120
+ source: row.dispatch.workspace === 'none' ? 'none' : facts?.workspaceSource ?? 'unknown',
121
+ },
122
+ authorization: {
123
+ talk: stablePeer ? 'preflight-required' : 'unknown',
124
+ operate: stablePeer ? false : 'unknown',
125
+ },
126
+ session: {
127
+ mentionMode: facts?.mentionMode ?? 'unknown',
128
+ replyMode: facts?.replyMode ?? 'unknown',
129
+ },
130
+ runtime: {
131
+ transport: facts?.transport ?? 'unknown',
132
+ deployment: row.larkAppId !== '' && ((live && row.source === 'configured') || facts !== undefined)
133
+ ? 'local'
134
+ : 'unknown',
135
+ stale: 'unknown',
136
+ },
137
+ };
138
+ }
139
+ export function formatChatBotsForCli(chatBots, currentLarkAppId, factsByAppId = {}) {
140
+ return chatBots.map((cb) => {
141
+ const row = {
142
+ name: cb.displayName,
143
+ openId: cb.openId,
144
+ isSelf: cb.larkAppId === currentLarkAppId,
145
+ source: cb.source,
146
+ larkAppId: cb.larkAppId,
147
+ workflowBot: cb.larkAppId || null,
148
+ capability: cb.capability ?? null,
149
+ hasTeamRole: cb.hasTeamRole,
150
+ mentionable: cb.mentionable,
151
+ mentionSource: cb.mentionSource,
152
+ dispatch: dispatchGuide(cb.capability),
153
+ };
154
+ return { ...row, collaboration: collaborationGuide(row, true, factsByAppId[row.larkAppId]) };
155
+ });
156
+ }
157
+ export function formatBotInfoEntriesForCli(botEntries, currentLarkAppId, factsByAppId = {}) {
16
158
  return botEntries
17
159
  .filter((b) => b.botOpenId)
18
- .map((b) => ({
19
- name: b.botName ?? b.cliId,
20
- openId: b.botOpenId,
21
- isSelf: b.larkAppId === currentLarkAppId,
22
- source: 'configured',
23
- larkAppId: b.larkAppId,
24
- workflowBot: b.larkAppId,
25
- // Local fallback path (no live chat query): we only know self reliably.
26
- capability: null,
27
- hasTeamRole: false,
28
- mentionable: b.larkAppId === currentLarkAppId,
29
- mentionSource: (b.larkAppId === currentLarkAppId ? 'self' : 'fallback'),
30
- }));
160
+ .map((b) => {
161
+ const row = {
162
+ name: b.botName ?? b.cliId,
163
+ openId: b.botOpenId,
164
+ isSelf: b.larkAppId === currentLarkAppId,
165
+ source: 'configured',
166
+ larkAppId: b.larkAppId,
167
+ workflowBot: b.larkAppId,
168
+ // Local fallback path (no live chat query): we only know self reliably.
169
+ capability: null,
170
+ hasTeamRole: false,
171
+ mentionable: b.larkAppId === currentLarkAppId,
172
+ mentionSource: (b.larkAppId === currentLarkAppId ? 'self' : 'fallback'),
173
+ dispatch: dispatchGuide(null),
174
+ };
175
+ return { ...row, collaboration: collaborationGuide(row, false, factsByAppId[row.larkAppId]) };
176
+ });
31
177
  }
32
178
  //# sourceMappingURL=bots-list-output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bots-list-output.js","sourceRoot":"","sources":["../../src/cli/bots-list-output.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,oBAAoB,CAClC,QAAyB,EACzB,gBAAwB;IAExB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,EAAE,CAAC,WAAW;QACpB,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,MAAM,EAAE,EAAE,CAAC,SAAS,KAAK,gBAAgB;QACzC,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,WAAW,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI;QACjC,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI;QACjC,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,aAAa,EAAE,EAAE,CAAC,aAAa;KAChC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,UAAiC,EACjC,gBAAwB;IAExB,OAAO,UAAU;SACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;QAC1B,MAAM,EAAE,CAAC,CAAC,SAAU;QACpB,MAAM,EAAE,CAAC,CAAC,SAAS,KAAK,gBAAgB;QACxC,MAAM,EAAE,YAAqB;QAC7B,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,WAAW,EAAE,CAAC,CAAC,SAAS;QACxB,wEAAwE;QACxE,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,CAAC,CAAC,SAAS,KAAK,gBAAgB;QAC7C,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAwB;KAC/F,CAAC,CAAC,CAAC;AACR,CAAC"}
1
+ {"version":3,"file":"bots-list-output.js","sourceRoot":"","sources":["../../src/cli/bots-list-output.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,16 @@
1
- declare const DAEMON_ENV_KEYS: readonly ["WEB_EXTERNAL_HOST", "BOTMUX_DASHBOARD_EXTERNAL_HOST", "BOTMUX_DASHBOARD_HOST", "BOTMUX_DASHBOARD_PORT", "BOTMUX_DAEMON_IPC_BASE_PORT", "BOTMUX_DASHBOARD_PUBLIC_READONLY", "BOTMUX_PUBLIC_URL"];
1
+ export declare const DAEMON_ENV_KEYS: readonly ["WEB_EXTERNAL_HOST", "BOTMUX_DASHBOARD_EXTERNAL_HOST", "BOTMUX_DASHBOARD_HOST", "BOTMUX_DASHBOARD_PORT", "BOTMUX_DAEMON_IPC_BASE_PORT", "BOTMUX_DASHBOARD_PUBLIC_READONLY", "BOTMUX_PUBLIC_URL", "BOTMUX_DASHBOARD_CONTROL_AUDIT_PATH", "BOTMUX_DASHBOARD_TERMINAL_CONTROL_TTL_MS"];
2
+ export type DaemonEnvKey = (typeof DAEMON_ENV_KEYS)[number];
2
3
  /**
3
4
  * Pin both PM2 apps to one deterministic ~/.botmux/.env snapshot. A restart
4
5
  * launched inside a botmux session inherited its values from the old daemon,
5
6
  * so only the persisted file is authoritative in that context.
7
+ *
8
+ * Every key resolves to a string, empty when neither source sets it. Each
9
+ * consumer treats the empty string as "unset" and applies its own default
10
+ * (h5-auth's ENABLED/BRAND/TTL/SECURE_COOKIE parsing, control-audit's path
11
+ * fallback, terminal-control's TTL validation), so a blank baked value is
12
+ * indistinguishable from an absent one — except for the dashboard bind host,
13
+ * whose historical default is applied here.
6
14
  */
7
- export declare function resolveDaemonEnv(inheritedEnv: NodeJS.ProcessEnv, envFileText?: string): Record<(typeof DAEMON_ENV_KEYS)[number], string>;
8
- export {};
15
+ export declare function resolveDaemonEnv(inheritedEnv: NodeJS.ProcessEnv, envFileText?: string): Record<DaemonEnvKey, string>;
9
16
  //# sourceMappingURL=daemon-lifecycle-env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-lifecycle-env.d.ts","sourceRoot":"","sources":["../../src/cli/daemon-lifecycle-env.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,eAAe,4MAaX,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,CAAC,UAAU,EAC/B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAiBlD"}
1
+ {"version":3,"file":"daemon-lifecycle-env.d.ts","sourceRoot":"","sources":["../../src/cli/daemon-lifecycle-env.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,eAAe,+RAuBlB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,CAAC,UAAU,EAC/B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAe9B"}
@@ -3,8 +3,22 @@ import { parse } from 'dotenv';
3
3
  // MUST stay mirrored by detachedRestartEnv() in src/core/maintenance.ts: any key
4
4
  // added here also has to be stripped there, or a detached restart (dashboard
5
5
  // update/restart, maintenance auto-update) reuses the stale baked value instead
6
- // of reloading it from ~/.botmux/.env.
7
- const DAEMON_ENV_KEYS = [
6
+ // of reloading it from ~/.botmux/.env. test/maintenance.test.ts pins that
7
+ // mirror by iterating this exported list.
8
+ //
9
+ // This baked block is SHARED: the same resolved values land in the env of the
10
+ // dashboard AND of every bot daemon, and they persist on disk in
11
+ // ~/.botmux/ecosystem.config.json. Only non-secret settings belong here.
12
+ //
13
+ // The Dashboard Feishu H5 login family (BOTMUX_DASHBOARD_FEISHU_H5_*, incl. the
14
+ // APP_SECRET credential) is DELIBERATELY absent: the dashboard receives it via
15
+ // its own entry point — index-dashboard.ts dotenv-loads ~/.botmux/.env, exactly
16
+ // like the bot daemons' index-daemon.ts — so the secret never enters the shared
17
+ // env block and never lands in ecosystem.config.json. Do not re-add those keys;
18
+ // test/daemon-lifecycle-env.test.ts pins the exclusion, and utils/child-env.ts
19
+ // (stripDashboardH5Env / redactChildEnv) keeps the family out of the daemon
20
+ // process and every CLI child.
21
+ export const DAEMON_ENV_KEYS = [
8
22
  'WEB_EXTERNAL_HOST',
9
23
  'BOTMUX_DASHBOARD_EXTERNAL_HOST',
10
24
  'BOTMUX_DASHBOARD_HOST',
@@ -17,11 +31,28 @@ const DAEMON_ENV_KEYS = [
17
31
  // from a bot session (whose pane wrapper unsets BOTMUX_*) silently demoted
18
32
  // all web-terminal links back to raw ip:port.
19
33
  'BOTMUX_PUBLIC_URL',
34
+ // Dashboard-only, non-secret settings: the control-audit destination
35
+ // (dashboard/control-audit.ts defaultControlAuditPath) and the terminal
36
+ // takeover lease TTL (dashboard/terminal-control.ts terminalControlTtlFromEnv).
37
+ // Documented in .env.example, but without a baked value an operator pointing
38
+ // the audit log at /var/lib/botmux kept writing to ~/.botmux/audit instead
39
+ // ("configured but never took effect"). Baked values also outrank the
40
+ // dashboard's own dotenv load (dotenv never overrides existing vars), which
41
+ // keeps them on the deterministic resolveDaemonEnv snapshot semantics.
42
+ 'BOTMUX_DASHBOARD_CONTROL_AUDIT_PATH',
43
+ 'BOTMUX_DASHBOARD_TERMINAL_CONTROL_TTL_MS',
20
44
  ];
21
45
  /**
22
46
  * Pin both PM2 apps to one deterministic ~/.botmux/.env snapshot. A restart
23
47
  * launched inside a botmux session inherited its values from the old daemon,
24
48
  * so only the persisted file is authoritative in that context.
49
+ *
50
+ * Every key resolves to a string, empty when neither source sets it. Each
51
+ * consumer treats the empty string as "unset" and applies its own default
52
+ * (h5-auth's ENABLED/BRAND/TTL/SECURE_COOKIE parsing, control-audit's path
53
+ * fallback, terminal-control's TTL validation), so a blank baked value is
54
+ * indistinguishable from an absent one — except for the dashboard bind host,
55
+ * whose historical default is applied here.
25
56
  */
26
57
  export function resolveDaemonEnv(inheritedEnv, envFileText) {
27
58
  const fileEnv = envFileText === undefined ? {} : parse(envFileText);
@@ -30,14 +61,10 @@ export function resolveDaemonEnv(inheritedEnv, envFileText) {
30
61
  const value = sessionOrigin ? fileEnv[key] : inheritedEnv[key] ?? fileEnv[key];
31
62
  return value?.trim() ?? '';
32
63
  };
33
- return {
34
- WEB_EXTERNAL_HOST: resolve('WEB_EXTERNAL_HOST'),
35
- BOTMUX_DASHBOARD_EXTERNAL_HOST: resolve('BOTMUX_DASHBOARD_EXTERNAL_HOST'),
36
- BOTMUX_DASHBOARD_HOST: resolve('BOTMUX_DASHBOARD_HOST') || '0.0.0.0',
37
- BOTMUX_DASHBOARD_PORT: resolve('BOTMUX_DASHBOARD_PORT'),
38
- BOTMUX_DAEMON_IPC_BASE_PORT: resolve('BOTMUX_DAEMON_IPC_BASE_PORT'),
39
- BOTMUX_DASHBOARD_PUBLIC_READONLY: resolve('BOTMUX_DASHBOARD_PUBLIC_READONLY'),
40
- BOTMUX_PUBLIC_URL: resolve('BOTMUX_PUBLIC_URL'),
41
- };
64
+ // Derived from DAEMON_ENV_KEYS rather than hand-listed: the previous literal
65
+ // return object was a second place to forget a key.
66
+ const resolved = Object.fromEntries(DAEMON_ENV_KEYS.map(key => [key, resolve(key)]));
67
+ resolved.BOTMUX_DASHBOARD_HOST ||= '0.0.0.0';
68
+ return resolved;
42
69
  }
43
70
  //# sourceMappingURL=daemon-lifecycle-env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-lifecycle-env.js","sourceRoot":"","sources":["../../src/cli/daemon-lifecycle-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,+EAA+E;AAC/E,iFAAiF;AACjF,6EAA6E;AAC7E,gFAAgF;AAChF,uCAAuC;AACvC,MAAM,eAAe,GAAG;IACtB,mBAAmB;IACnB,gCAAgC;IAChC,uBAAuB;IACvB,uBAAuB;IACvB,6BAA6B;IAC7B,kCAAkC;IAClC,8DAA8D;IAC9D,yEAAyE;IACzE,yEAAyE;IACzE,2EAA2E;IAC3E,8CAA8C;IAC9C,mBAAmB;CACX,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAA+B,EAC/B,WAAoB;IAEpB,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,CAAC,GAAqC,EAAU,EAAE;QAChE,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/E,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,OAAO;QACL,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC;QAC/C,8BAA8B,EAAE,OAAO,CAAC,gCAAgC,CAAC;QACzE,qBAAqB,EAAE,OAAO,CAAC,uBAAuB,CAAC,IAAI,SAAS;QACpE,qBAAqB,EAAE,OAAO,CAAC,uBAAuB,CAAC;QACvD,2BAA2B,EAAE,OAAO,CAAC,6BAA6B,CAAC;QACnE,gCAAgC,EAAE,OAAO,CAAC,kCAAkC,CAAC;QAC7E,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC;KAChD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"daemon-lifecycle-env.js","sourceRoot":"","sources":["../../src/cli/daemon-lifecycle-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,+EAA+E;AAC/E,iFAAiF;AACjF,6EAA6E;AAC7E,gFAAgF;AAChF,0EAA0E;AAC1E,0CAA0C;AAC1C,EAAE;AACF,8EAA8E;AAC9E,iEAAiE;AACjE,yEAAyE;AACzE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAC5E,+BAA+B;AAC/B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,mBAAmB;IACnB,gCAAgC;IAChC,uBAAuB;IACvB,uBAAuB;IACvB,6BAA6B;IAC7B,kCAAkC;IAClC,8DAA8D;IAC9D,yEAAyE;IACzE,yEAAyE;IACzE,2EAA2E;IAC3E,8CAA8C;IAC9C,mBAAmB;IACnB,qEAAqE;IACrE,wEAAwE;IACxE,gFAAgF;IAChF,6EAA6E;IAC7E,2EAA2E;IAC3E,sEAAsE;IACtE,4EAA4E;IAC5E,uEAAuE;IACvE,qCAAqC;IACrC,0CAA0C;CAClC,CAAC;AAIX;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAA+B,EAC/B,WAAoB;IAEpB,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAU,EAAE;QAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/E,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,6EAA6E;IAC7E,oDAAoD;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAChB,CAAC;IAClC,QAAQ,CAAC,qBAAqB,KAAK,SAAS,CAAC;IAC7C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -10,6 +10,21 @@ export type DashboardCommandExecution = {
10
10
  action: 'current' | 'rotate';
11
11
  result: DashboardResult;
12
12
  };
13
+ /**
14
+ * `botmux dashboard` 成功时要打印的每一行,按顺序。
15
+ *
16
+ * ⚠️ 契约:**第 0 行永远是且只是那条 URL**,不带任何前缀、标签或修饰。脚本和用户
17
+ * 都靠「取第一行」拿链接(`botmux dashboard | head -1`)。往后追加行可以,动第一行
18
+ * 不行。
19
+ *
20
+ * 第二行是工作台直达入口(`<base>/workbench?t=<token>`)——`/workbench` 是
21
+ * Dashboard 上一个无 fragment 的入口,会 302 到 `/?t=…#/agent-workbench`
22
+ * (见 dashboard.ts)。它和第一行同源同 token,所以第一行能用它就能用;拼不出来
23
+ * (URL 不可解析)时这一行整行省略,不打印半截链接。
24
+ */
25
+ export declare function formatDashboardSuccessLines(result: Extract<DashboardResult, {
26
+ ok: true;
27
+ }>): string[];
13
28
  export declare function formatDashboardFallbackFailure(action: 'current' | 'rotate', failure: Extract<DashboardResult, {
14
29
  ok: false;
15
30
  }>): string;
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-command.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAElF,eAAO,MAAM,uBAAuB,8cAGyB,CAAC;AAE9D,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAYhF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,OAAO,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,GAC/C,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,eAAe,CAAC,GAClE,OAAO,CAAC,yBAAyB,CAAC,CAwCpC"}
1
+ {"version":3,"file":"dashboard-command.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAElF,eAAO,MAAM,uBAAuB,8cAGyB,CAAC;AAE9D,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAYhF;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,CAMpG;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,OAAO,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,GAC/C,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,eAAe,CAAC,GAClE,OAAO,CAAC,yBAAyB,CAAC,CAwCpC"}
@@ -1,3 +1,4 @@
1
+ import { workbenchEntryUrl } from '../core/dashboard-url.js';
1
2
  export const DASHBOARD_COMMAND_USAGE = `用法:
2
3
  botmux dashboard 获取当前 Dashboard 登录 URL(没有则创建,不轮换已有 token)
3
4
  botmux dashboard current 获取当前 Dashboard 登录 URL(没有则创建,不轮换已有 token)
@@ -11,6 +12,27 @@ function legacyEnsureRouteMissing(result) {
11
12
  return result.reason === 'http-error'
12
13
  && result.detail?.startsWith(LEGACY_ENSURE_TOKEN_GATE_PREFIX) === true;
13
14
  }
15
+ /**
16
+ * `botmux dashboard` 成功时要打印的每一行,按顺序。
17
+ *
18
+ * ⚠️ 契约:**第 0 行永远是且只是那条 URL**,不带任何前缀、标签或修饰。脚本和用户
19
+ * 都靠「取第一行」拿链接(`botmux dashboard | head -1`)。往后追加行可以,动第一行
20
+ * 不行。
21
+ *
22
+ * 第二行是工作台直达入口(`<base>/workbench?t=<token>`)——`/workbench` 是
23
+ * Dashboard 上一个无 fragment 的入口,会 302 到 `/?t=…#/agent-workbench`
24
+ * (见 dashboard.ts)。它和第一行同源同 token,所以第一行能用它就能用;拼不出来
25
+ * (URL 不可解析)时这一行整行省略,不打印半截链接。
26
+ */
27
+ export function formatDashboardSuccessLines(result) {
28
+ const lines = [result.url];
29
+ const workbench = workbenchEntryUrl(result.url);
30
+ if (workbench)
31
+ lines.push(`工作台: ${workbench}`);
32
+ if (result.localUrl)
33
+ lines.push(`本地直连(平台异常时可用): ${result.localUrl}`);
34
+ return lines;
35
+ }
14
36
  export function formatDashboardFallbackFailure(action, failure) {
15
37
  const operation = action === 'current' ? 'Dashboard lookup' : 'Rotation';
16
38
  return `${operation} failed: ${failure.detail ?? failure.reason}`;
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-command.js","sourceRoot":"","sources":["../../src/cli/dashboard-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-command.js","sourceRoot":"","sources":["../../src/cli/dashboard-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * PM2-client-free log tailing for `botmux logs`.
3
+ *
4
+ * `pm2 logs` is a PM2 client, and any PM2 client invoked with no live God
5
+ * lazily births one (pm2 Client.start → pingDaemon false → launchDaemon).
6
+ * That made the read command a check/use race against `restart
7
+ * --include-pm2`: a God observed under the fleet lock could be retired after
8
+ * the lock released but before the spawned client connected, and the
9
+ * connecting client would then create a replacement God inside the
10
+ * kill→start window. Tailing the log FILES pm2 itself writes removes the PM2
11
+ * client entirely — no interleaving of this command can create a God, and
12
+ * logs keep working while the fleet is stopped.
13
+ */
14
+ export interface LogTailSource {
15
+ /** Display label, e.g. the PM2 process name. */
16
+ label: string;
17
+ stream: 'out' | 'err';
18
+ file: string;
19
+ }
20
+ export declare function formatLogLine(source: LogTailSource, line: string): string;
21
+ /** Last `n` complete lines of a text chunk (trailing newline ignored). */
22
+ export declare function lastLinesOfChunk(chunk: string, n: number): string[];
23
+ export interface LogFileFollowerOptions {
24
+ sources: readonly LogTailSource[];
25
+ writeLine: (formatted: string) => void;
26
+ pollIntervalMs?: number;
27
+ }
28
+ /**
29
+ * Print the last N lines of every existing source, then follow appends.
30
+ * Correctness boundaries this models explicitly:
31
+ * - An unterminated trailing line is NEVER emitted as a line; it is carried
32
+ * as `partial` (from the initial tail too) and emitted once completed, so
33
+ * "abc" + later "def\n" prints one "abcdef" line.
34
+ * - Atomic rotation (rename + recreate at the same path) is detected by
35
+ * dev+ino generation identity, not by size heuristics — a new file whose
36
+ * size already exceeds the old offset would otherwise be read mid-stream.
37
+ * (On filesystems reporting ino=0 this degrades to the size checks.)
38
+ * - In-place truncation (`pm2 flush`) resets to the top of the new content.
39
+ * - Files may appear later (fleet starts while tailing) or disappear.
40
+ */
41
+ export declare class LogFileFollower {
42
+ private readonly states;
43
+ private readonly writeLine;
44
+ private readonly pollIntervalMs;
45
+ private timer;
46
+ constructor(opts: LogFileFollowerOptions);
47
+ /** Emit the initial `--lines` window and position offsets at end-of-file. */
48
+ printInitialTail(lines: number): void;
49
+ start(): void;
50
+ stop(): void;
51
+ /** One poll pass; exposed so tests can drive it deterministically. */
52
+ pollOnce(): void;
53
+ }
54
+ //# sourceMappingURL=log-tail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tail.d.ts","sourceRoot":"","sources":["../../src/cli/log-tail.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAKnE;AAgDD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,KAAK,CAA6B;gBAE9B,IAAI,EAAE,sBAAsB;IAQxC,6EAA6E;IAC7E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAsBrC,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAKZ,sEAAsE;IACtE,QAAQ,IAAI,IAAI;CAyCjB"}
@@ -0,0 +1,167 @@
1
+ import { closeSync, existsSync, openSync, readSync, statSync } from 'node:fs';
2
+ export function formatLogLine(source, line) {
3
+ return `${source.label}${source.stream === 'err' ? ' (err)' : ''} | ${line}`;
4
+ }
5
+ /** Last `n` complete lines of a text chunk (trailing newline ignored). */
6
+ export function lastLinesOfChunk(chunk, n) {
7
+ if (n <= 0)
8
+ return [];
9
+ const all = chunk.split('\n');
10
+ if (all.length > 0 && all[all.length - 1] === '')
11
+ all.pop();
12
+ return all.slice(Math.max(0, all.length - n));
13
+ }
14
+ // Initial `--lines` window: start small and grow until the window holds
15
+ // enough complete lines (or the whole file / a hard cap), so a large N is
16
+ // honored instead of silently clipped by a fixed window.
17
+ const INITIAL_TAIL_WINDOW_BYTES = 64 * 1024;
18
+ const MAX_TAIL_WINDOW_BYTES = 8 * 1024 * 1024;
19
+ function readFileRange(file, start, end) {
20
+ const length = end - start;
21
+ if (length <= 0)
22
+ return '';
23
+ const fd = openSync(file, 'r');
24
+ try {
25
+ const buffer = Buffer.alloc(length);
26
+ const read = readSync(fd, buffer, 0, length, start);
27
+ return buffer.subarray(0, read).toString('utf8');
28
+ }
29
+ finally {
30
+ closeSync(fd);
31
+ }
32
+ }
33
+ /** Tail window ending at `size`, aligned to a line start (or BOF). */
34
+ function readAlignedTailWindow(file, size, wantLines) {
35
+ for (let window = INITIAL_TAIL_WINDOW_BYTES;; window *= 2) {
36
+ const start = Math.max(0, size - window);
37
+ const chunk = readFileRange(file, start, size);
38
+ if (start === 0)
39
+ return chunk;
40
+ const newlineCount = chunk.split('\n').length - 1;
41
+ // Need wantLines complete lines AFTER dropping the leading partial line a
42
+ // mid-file window start produces (plus a possible unterminated tail).
43
+ if (newlineCount > wantLines + 1 || window >= MAX_TAIL_WINDOW_BYTES) {
44
+ return chunk.slice(chunk.indexOf('\n') + 1);
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * Print the last N lines of every existing source, then follow appends.
50
+ * Correctness boundaries this models explicitly:
51
+ * - An unterminated trailing line is NEVER emitted as a line; it is carried
52
+ * as `partial` (from the initial tail too) and emitted once completed, so
53
+ * "abc" + later "def\n" prints one "abcdef" line.
54
+ * - Atomic rotation (rename + recreate at the same path) is detected by
55
+ * dev+ino generation identity, not by size heuristics — a new file whose
56
+ * size already exceeds the old offset would otherwise be read mid-stream.
57
+ * (On filesystems reporting ino=0 this degrades to the size checks.)
58
+ * - In-place truncation (`pm2 flush`) resets to the top of the new content.
59
+ * - Files may appear later (fleet starts while tailing) or disappear.
60
+ */
61
+ export class LogFileFollower {
62
+ states;
63
+ writeLine;
64
+ pollIntervalMs;
65
+ timer;
66
+ constructor(opts) {
67
+ this.states = opts.sources.map(source => ({
68
+ source, offset: undefined, partial: '', dev: undefined, ino: undefined,
69
+ }));
70
+ this.writeLine = opts.writeLine;
71
+ this.pollIntervalMs = opts.pollIntervalMs ?? 300;
72
+ }
73
+ /** Emit the initial `--lines` window and position offsets at end-of-file. */
74
+ printInitialTail(lines) {
75
+ for (const state of this.states) {
76
+ if (!existsSync(state.source.file))
77
+ continue;
78
+ let stats;
79
+ try {
80
+ stats = statSync(state.source.file);
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ let chunk;
86
+ try {
87
+ chunk = readAlignedTailWindow(state.source.file, stats.size, lines);
88
+ }
89
+ catch {
90
+ continue;
91
+ }
92
+ let complete = chunk;
93
+ if (chunk.length > 0 && !chunk.endsWith('\n')) {
94
+ const cut = chunk.lastIndexOf('\n');
95
+ state.partial = chunk.slice(cut + 1);
96
+ complete = cut >= 0 ? chunk.slice(0, cut + 1) : '';
97
+ }
98
+ for (const line of lastLinesOfChunk(complete, lines)) {
99
+ this.writeLine(formatLogLine(state.source, line));
100
+ }
101
+ state.offset = stats.size;
102
+ state.dev = stats.dev;
103
+ state.ino = stats.ino;
104
+ }
105
+ }
106
+ start() {
107
+ if (this.timer)
108
+ return;
109
+ this.timer = setInterval(() => this.pollOnce(), this.pollIntervalMs);
110
+ }
111
+ stop() {
112
+ if (this.timer)
113
+ clearInterval(this.timer);
114
+ this.timer = undefined;
115
+ }
116
+ /** One poll pass; exposed so tests can drive it deterministically. */
117
+ pollOnce() {
118
+ for (const state of this.states) {
119
+ let stats;
120
+ try {
121
+ stats = statSync(state.source.file);
122
+ }
123
+ catch {
124
+ // Absent (not yet created, or rotated away): forget position so the
125
+ // file is picked up from its start when it (re)appears.
126
+ state.offset = undefined;
127
+ state.partial = '';
128
+ state.dev = undefined;
129
+ state.ino = undefined;
130
+ continue;
131
+ }
132
+ const sameGeneration = state.dev === stats.dev && state.ino === stats.ino;
133
+ if (state.offset === undefined || !sameGeneration) {
134
+ // Newly appeared file, or an atomic replace under the same path:
135
+ // this is a different byte stream, so any carried position/partial
136
+ // belongs to the OLD generation and must be dropped unconditionally.
137
+ state.offset = 0;
138
+ state.partial = '';
139
+ }
140
+ else if (stats.size < state.offset) {
141
+ // Truncated in place (pm2 flush): restart from the top of the new
142
+ // content instead of replaying or reading past EOF.
143
+ state.offset = 0;
144
+ state.partial = '';
145
+ }
146
+ state.dev = stats.dev;
147
+ state.ino = stats.ino;
148
+ if (stats.size === state.offset)
149
+ continue;
150
+ let chunk;
151
+ try {
152
+ chunk = readFileRange(state.source.file, state.offset, stats.size);
153
+ }
154
+ catch {
155
+ continue;
156
+ }
157
+ state.offset = stats.size;
158
+ const combined = state.partial + chunk;
159
+ const parts = combined.split('\n');
160
+ state.partial = parts.pop() ?? '';
161
+ for (const line of parts) {
162
+ this.writeLine(formatLogLine(state.source, line));
163
+ }
164
+ }
165
+ }
166
+ }
167
+ //# sourceMappingURL=log-tail.js.map