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
@@ -0,0 +1,55 @@
1
+ import { type IncomingHttpHeaders, type IncomingMessage, type OutgoingHttpHeaders, type ServerResponse } from 'node:http';
2
+ import type { Duplex } from 'node:stream';
3
+ import { TERMINAL_VIEW_FORWARD_HEADER } from '../core/terminal-control-grant.js';
4
+ import type { TerminalControlManager, TerminalDashboardActor } from './terminal-control.js';
5
+ export declare const TERMINAL_CONTROL_HEADER = "x-botmux-terminal-control";
6
+ export { TERMINAL_VIEW_FORWARD_HEADER };
7
+ /** Covers daemon wake-up (up to 10s) plus a bounded worker handshake. Cleared
8
+ * as soon as response/upgrade headers arrive, so live streams stay unbounded. */
9
+ export declare const TERMINAL_UPSTREAM_RESPONSE_TIMEOUT_MS = 30000;
10
+ /**
11
+ * P1-2:upgrade 请求收到非 101 回应 = 一次拒绝,不是长连接。清掉唯一那道计时器
12
+ * 之后,一个不结束 body 的上游能把上游 socket 与浏览器 socket 一起挂死,没有任
13
+ * 何东西会回收它们。所以这条路保留总时限 + idle 时限(只有 idle 时限时,每 N 秒
14
+ * 滴一个字节就能永久续命),并给拒绝体加一个上限——预览那一跳早就有了。
15
+ */
16
+ export declare const TERMINAL_UPGRADE_REJECTION_TIMEOUT_MS = 15000;
17
+ export declare const TERMINAL_UPGRADE_REJECTION_IDLE_TIMEOUT_MS = 10000;
18
+ export declare const MAX_TERMINAL_UPGRADE_REJECTION_BYTES: number;
19
+ export interface TerminalFrontProxyOptions {
20
+ resolvePort(sessionId: string): number | undefined;
21
+ resolveActor(req: IncomingMessage): TerminalDashboardActor | null;
22
+ control: TerminalControlManager;
23
+ /** P1-5: resolve which auth session a bound `?viewToken=` read capability
24
+ * belongs to (null for anything that is not a valid bound capability for
25
+ * this session). Lets the proxy refuse revoked capabilities and index the
26
+ * bridged socket for logout-time closing. */
27
+ viewCapabilityAuthSession?(sessionId: string, viewToken: string): string | null;
28
+ /** P1-5: liveness of the auth session behind a bound capability. `false`
29
+ * means logout/expiry already revoked it — the request is refused even
30
+ * though the worker's stateless check would still accept the signature. */
31
+ isAuthSessionLive?(authSessionId: string): boolean;
32
+ /** P1-5: countersign an accepted view capability for the loopback hop. Only
33
+ * emitted after liveness passed, so the header IS the statement "the
34
+ * component holding the revocation state let this one through". Without it
35
+ * the worker refuses the capability, which is what makes a raw view URL
36
+ * aimed at the worker port or the daemon's own `/s/` proxy fail closed. */
37
+ viewCapabilityForwardProof?(viewToken: string): string | undefined;
38
+ }
39
+ export declare function parseTerminalFrontPath(pathname: string): {
40
+ sessionId: string;
41
+ } | null;
42
+ /**
43
+ * Authenticated Dashboard requests are converted to one signed loopback grant.
44
+ * Client-supplied cookies/role/grant headers are removed first. Token/viewToken
45
+ * query capabilities remain supported for legacy direct links and are handled
46
+ * independently by the worker.
47
+ */
48
+ export declare function terminalForwardHeaders(headers: IncomingHttpHeaders, grant: string | undefined, options?: {
49
+ stripBrowserCredentials?: boolean;
50
+ }): OutgoingHttpHeaders;
51
+ export declare function createTerminalFrontProxy(options: TerminalFrontProxyOptions): {
52
+ handleHttp(req: IncomingMessage, res: ServerResponse, url: URL): boolean;
53
+ handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): boolean;
54
+ };
55
+ //# sourceMappingURL=terminal-front-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-front-proxy.d.ts","sourceRoot":"","sources":["../../src/dashboard/terminal-front-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EAEvB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,CAAC;AACxC;iFACiF;AACjF,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAC5D;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAC5D,eAAO,MAAM,0CAA0C,QAAS,CAAC;AACjE,eAAO,MAAM,oCAAoC,QAAY,CAAC;AAE9D,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,sBAAsB,GAAG,IAAI,CAAC;IAClE,OAAO,EAAE,sBAAsB,CAAC;IAChC;;;iDAG6C;IAC7C,yBAAyB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChF;;+EAE2E;IAC3E,iBAAiB,CAAC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IACnD;;;;+EAI2E;IAC3E,0BAA0B,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACpE;AAQD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKrF;AAaD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClD,mBAAmB,CAgBrB;AA6DD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG;IAC5E,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IACzE,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5E,CAwRA"}
@@ -0,0 +1,397 @@
1
+ import { requestLiteralLoopback } from '../core/loopback-target.js';
2
+ import { TERMINAL_VIEW_FORWARD_HEADER } from '../core/terminal-control-grant.js';
3
+ export const TERMINAL_CONTROL_HEADER = 'x-botmux-terminal-control';
4
+ export { TERMINAL_VIEW_FORWARD_HEADER };
5
+ /** Covers daemon wake-up (up to 10s) plus a bounded worker handshake. Cleared
6
+ * as soon as response/upgrade headers arrive, so live streams stay unbounded. */
7
+ export const TERMINAL_UPSTREAM_RESPONSE_TIMEOUT_MS = 30_000;
8
+ /**
9
+ * P1-2:upgrade 请求收到非 101 回应 = 一次拒绝,不是长连接。清掉唯一那道计时器
10
+ * 之后,一个不结束 body 的上游能把上游 socket 与浏览器 socket 一起挂死,没有任
11
+ * 何东西会回收它们。所以这条路保留总时限 + idle 时限(只有 idle 时限时,每 N 秒
12
+ * 滴一个字节就能永久续命),并给拒绝体加一个上限——预览那一跳早就有了。
13
+ */
14
+ export const TERMINAL_UPGRADE_REJECTION_TIMEOUT_MS = 15_000;
15
+ export const TERMINAL_UPGRADE_REJECTION_IDLE_TIMEOUT_MS = 10_000;
16
+ export const MAX_TERMINAL_UPGRADE_REJECTION_BYTES = 64 * 1024;
17
+ function safeDecodeSessionId(raw) {
18
+ let decoded;
19
+ try {
20
+ decoded = decodeURIComponent(raw);
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ return decoded && decoded.length <= 512 && !/[\\/\0]/.test(decoded) ? decoded : undefined;
26
+ }
27
+ export function parseTerminalFrontPath(pathname) {
28
+ if (!pathname.startsWith('/s/'))
29
+ return null;
30
+ const raw = pathname.slice(3).split('/')[0];
31
+ const sessionId = safeDecodeSessionId(raw);
32
+ return sessionId ? { sessionId } : null;
33
+ }
34
+ function sensitiveBrowserHeader(name) {
35
+ const lower = name.toLowerCase();
36
+ return lower === 'cookie'
37
+ || lower === 'authorization'
38
+ || lower === 'proxy-authorization'
39
+ || lower === 'referer'
40
+ || lower === 'forwarded'
41
+ || lower.startsWith('x-forwarded-')
42
+ || lower.startsWith('x-botmux-');
43
+ }
44
+ /**
45
+ * Authenticated Dashboard requests are converted to one signed loopback grant.
46
+ * Client-supplied cookies/role/grant headers are removed first. Token/viewToken
47
+ * query capabilities remain supported for legacy direct links and are handled
48
+ * independently by the worker.
49
+ */
50
+ export function terminalForwardHeaders(headers, grant, options = {}) {
51
+ if (!grant && !options.stripBrowserCredentials) {
52
+ // Legacy query capabilities and platform headers retain their historical
53
+ // behavior, but an unauthenticated browser may never supply/replay the new
54
+ // internal grant header itself.
55
+ const forwarded = { ...headers };
56
+ delete forwarded[TERMINAL_CONTROL_HEADER];
57
+ return forwarded;
58
+ }
59
+ const forwarded = {};
60
+ for (const [name, value] of Object.entries(headers)) {
61
+ if (value === undefined || sensitiveBrowserHeader(name))
62
+ continue;
63
+ forwarded[name] = value;
64
+ }
65
+ if (grant)
66
+ forwarded[TERMINAL_CONTROL_HEADER] = grant;
67
+ return forwarded;
68
+ }
69
+ function plainError(res, status, message) {
70
+ res.writeHead(status, {
71
+ 'content-type': 'text/plain; charset=utf-8',
72
+ 'cache-control': 'no-store',
73
+ 'referrer-policy': 'no-referrer',
74
+ });
75
+ res.end(message);
76
+ }
77
+ function socketError(socket, status, message) {
78
+ if (socket.destroyed)
79
+ return;
80
+ const body = message;
81
+ const reason = status === 403 ? 'Forbidden'
82
+ : status === 404 ? 'Not Found'
83
+ : status === 409 ? 'Conflict'
84
+ : 'Bad Gateway';
85
+ socket.end([
86
+ `HTTP/1.1 ${status} ${reason}`,
87
+ 'content-type: text/plain; charset=utf-8',
88
+ 'cache-control: no-store',
89
+ 'connection: close',
90
+ `content-length: ${Buffer.byteLength(body)}`,
91
+ '',
92
+ body,
93
+ ].join('\r\n'));
94
+ }
95
+ /**
96
+ * P1-4: the auth session this bridge belongs to, or `undefined` when the
97
+ * request is authorized by something other than a dashboard authentication.
98
+ *
99
+ * An explicit `?token=` / `?viewToken=` query capability that did NOT resolve
100
+ * to a bound view capability is deliberately excluded: P1-6 made that token the
101
+ * SOLE authorization basis, so the opener's ambient authentication must not
102
+ * decide its fate in either direction. Everything else — a bound view
103
+ * capability, an injected read grant, an injected write grant (leased or the
104
+ * platform owner's fixed one) — lives and dies with its auth session.
105
+ */
106
+ function bridgeAuthSession(prepared) {
107
+ return prepared.readAuthSessionId
108
+ ?? (prepared.proxyGrant ? prepared.actor?.authSessionId : undefined);
109
+ }
110
+ export function createTerminalFrontProxy(options) {
111
+ const prepare = (req, url) => {
112
+ const parsed = parseTerminalFrontPath(url.pathname);
113
+ if (!parsed)
114
+ return null;
115
+ const port = options.resolvePort(parsed.sessionId);
116
+ const actor = options.resolveActor(req);
117
+ // An explicit `?token=` / `?viewToken=` query capability — no matter who
118
+ // carries it, platform/H5 actors included — is the SOLE authorization basis
119
+ // for the request (P1-6). No internal grant is injected next to it: a
120
+ // platform teammate/guest opening a correct write link used to receive a
121
+ // read grant that silently outranked the token at the worker, turning the
122
+ // explicitly issued 「操作链接」 read-only. Ambient Cookie / X-Botmux-Role
123
+ // headers are stripped for the same reason in the other direction: a wrong
124
+ // token must not become writable by borrowing the opener's owner ambient.
125
+ const hasExplicitQueryCapability = url.searchParams.has('token')
126
+ || url.searchParams.has('viewToken');
127
+ // P1-5: a bound view capability names the auth session it was minted for.
128
+ // Refuse it once that authentication ended (logout/expiry) — the worker's
129
+ // stateless signature/expiry check alone would still accept it.
130
+ let readAuthSessionId;
131
+ let viewForwardProof;
132
+ if (hasExplicitQueryCapability) {
133
+ const viewToken = url.searchParams.get('viewToken');
134
+ const boundAuthSession = viewToken
135
+ ? options.viewCapabilityAuthSession?.(parsed.sessionId, viewToken) ?? null
136
+ : null;
137
+ if (boundAuthSession && viewToken) {
138
+ if (options.isAuthSessionLive?.(boundAuthSession) === false) {
139
+ return { ...parsed, port, revoked: true };
140
+ }
141
+ readAuthSessionId = boundAuthSession;
142
+ // Countersign only what this proxy just validated as live. The proof is
143
+ // bound to the exact capability string, so it can neither be moved onto
144
+ // a different grant nor be replayed by a browser that never sees it.
145
+ viewForwardProof = options.viewCapabilityForwardProof?.(viewToken);
146
+ }
147
+ }
148
+ const proxyGrant = actor && !hasExplicitQueryCapability
149
+ ? options.control.grantForProxy(actor, parsed.sessionId)
150
+ : undefined;
151
+ if (actor && proxyGrant?.scope === 'read')
152
+ readAuthSessionId = actor.authSessionId;
153
+ const headers = terminalForwardHeaders(req.headers, proxyGrant?.token, {
154
+ // Validate the explicit capability at the worker, but do not also send
155
+ // the legacy management cookie: a garbage `?token=` must not become a
156
+ // writable request merely because its opener is the owner Dashboard.
157
+ stripBrowserCredentials: hasExplicitQueryCapability,
158
+ });
159
+ // Set AFTER the header build, which drops every client-supplied `x-botmux-*`
160
+ // on this path: a browser can never smuggle its own forward proof through.
161
+ if (viewForwardProof)
162
+ headers[TERMINAL_VIEW_FORWARD_HEADER] = viewForwardProof;
163
+ return { ...parsed, port, revoked: false, actor, proxyGrant, readAuthSessionId, headers };
164
+ };
165
+ const handleHttp = (req, res, url) => {
166
+ if (!(url.pathname === '/s' || url.pathname.startsWith('/s/')))
167
+ return false;
168
+ const prepared = prepare(req, url);
169
+ if (!prepared?.port) {
170
+ plainError(res, 404, 'session terminal not available');
171
+ return true;
172
+ }
173
+ if (prepared.revoked) {
174
+ plainError(res, 403, 'view capability revoked');
175
+ return true;
176
+ }
177
+ const upstream = requestLiteralLoopback({ host: '127.0.0.1', port: prepared.port }, {
178
+ method: req.method,
179
+ path: req.url,
180
+ headers: prepared.headers,
181
+ }, up => {
182
+ upstream.setTimeout(0);
183
+ res.writeHead(up.statusCode ?? 502, up.headers);
184
+ // P1-2:浏览器提前断开时把上游一起收掉。`up.pipe(res)` 在 dest 关闭时只做
185
+ // unpipe,不会 destroy source;headers 一到又把 30s 的前置超时拆掉了,于是
186
+ // 这条上游没有任何东西会回收——终端这一跳同样有长响应(日志/流式输出)。
187
+ // `ClientRequest.destroy()` 可重入;响应已自然写完的情况不必多此一举。
188
+ res.on('close', () => { if (!res.writableEnded)
189
+ upstream.destroy(); });
190
+ up.pipe(res);
191
+ });
192
+ upstream.setTimeout(TERMINAL_UPSTREAM_RESPONSE_TIMEOUT_MS, () => upstream.destroy());
193
+ upstream.on('error', () => {
194
+ if (!res.headersSent)
195
+ plainError(res, 502, 'terminal proxy error');
196
+ else
197
+ res.end();
198
+ });
199
+ req.on('aborted', () => upstream.destroy());
200
+ req.pipe(upstream);
201
+ return true;
202
+ };
203
+ const handleUpgrade = (req, clientSocket, head) => {
204
+ let url;
205
+ try {
206
+ url = new URL(req.url ?? '/', 'http://localhost');
207
+ }
208
+ catch {
209
+ return false;
210
+ }
211
+ if (!(url.pathname === '/s' || url.pathname.startsWith('/s/')))
212
+ return false;
213
+ // Install this synchronously for every claimed upgrade path. Browser
214
+ // disconnects can race DNS/connect/401/404/502 handling; an EventEmitter
215
+ // `error` without a listener would otherwise terminate the Dashboard.
216
+ let upstreamRequest;
217
+ let bridgedSocket;
218
+ clientSocket.on('error', () => {
219
+ upstreamRequest?.destroy();
220
+ bridgedSocket?.destroy();
221
+ if (!clientSocket.destroyed)
222
+ clientSocket.destroy();
223
+ });
224
+ const prepared = prepare(req, url);
225
+ if (!prepared?.port) {
226
+ socketError(clientSocket, 404, 'session terminal not available');
227
+ return true;
228
+ }
229
+ if (prepared.revoked) {
230
+ socketError(clientSocket, 403, 'view capability revoked');
231
+ return true;
232
+ }
233
+ let responded = false;
234
+ const upstream = requestLiteralLoopback({ host: '127.0.0.1', port: prepared.port }, {
235
+ method: req.method,
236
+ path: req.url,
237
+ headers: prepared.headers,
238
+ });
239
+ upstreamRequest = upstream;
240
+ upstream.setTimeout(TERMINAL_UPSTREAM_RESPONSE_TIMEOUT_MS, () => upstream.destroy());
241
+ upstream.on('upgrade', (upRes, upstreamSocket, upstreamHead) => {
242
+ responded = true;
243
+ bridgedSocket = upstreamSocket;
244
+ upstream.setTimeout(0);
245
+ upstreamSocket.setTimeout(0);
246
+ // P1-4: the liveness check in `prepare` is a snapshot taken BEFORE the
247
+ // dial. Between it and this upstream 101 sits a real worker handshake
248
+ // (the response timeout alone allows 30s of daemon wake-up), and a
249
+ // logout / expiry / rotation / unbind landing inside that window revokes
250
+ // nothing here: the socket exists only as a local variable, so the
251
+ // revocation sweep walks the authSession→socket index and finds it
252
+ // absent. Registering it afterwards would file a live bridge under an
253
+ // already-dead auth session, where no future revocation reaches it
254
+ // either — it would survive until the worker's own read-capability
255
+ // expiry, up to ten more minutes.
256
+ //
257
+ // Re-check here, in the same synchronous tick that registers the socket.
258
+ // Revocation always deletes the session from the liveness authority
259
+ // BEFORE it sweeps the index (see DashboardSessionStore.endHash and
260
+ // dashboard.ts's endDashboardAuthSession), so the two possible orders are
261
+ // now: we register first and the sweep closes us, or the sweep already
262
+ // ran and this check refuses. There is no third order that leaks.
263
+ const authSessionId = bridgeAuthSession(prepared);
264
+ if (authSessionId !== undefined && options.isAuthSessionLive?.(authSessionId) === false) {
265
+ // Nothing is relayed: no 101, no registration, and the upstream socket
266
+ // dies so the worker does not keep a half-open bridge either.
267
+ upstreamSocket.destroy();
268
+ socketError(clientSocket, 403, 'authentication ended');
269
+ return;
270
+ }
271
+ let leaseMarker;
272
+ if (prepared.actor && prepared.proxyGrant?.scope === 'write' && prepared.proxyGrant.leaseMarker) {
273
+ const registered = options.control.registerWritableSocket(prepared.actor, prepared.sessionId, clientSocket, prepared.proxyGrant.leaseMarker);
274
+ leaseMarker = registered.leaseMarker;
275
+ if (!registered.registered) {
276
+ // The worker may have accepted a grant that was valid when the dial
277
+ // began but was released/expired/replaced during its async handshake.
278
+ // Never relay that 101: revoke the matching old lease (if any) and
279
+ // make the browser reconnect through the now-read-only path.
280
+ options.control.disconnect(prepared.actor, prepared.sessionId, prepared.proxyGrant.leaseMarker);
281
+ upstreamSocket.destroy();
282
+ socketError(clientSocket, 409, 'terminal control expired');
283
+ return;
284
+ }
285
+ }
286
+ // P1-5: index the stream under its auth session so logout/expiry closes
287
+ // it now rather than at the worker's grant-expiry timer. A leased write
288
+ // bridge is already carried by its lease's own socket set; everything
289
+ // else (bound view capability, injected read grant, and the platform
290
+ // owner's fixed write grant, which has no lease behind it) is indexed
291
+ // here — otherwise the liveness re-check above would only have moved the
292
+ // leak one tick later instead of closing it.
293
+ const deregisterBridgeSocket = authSessionId !== undefined && !leaseMarker
294
+ ? options.control.registerReadSocket(authSessionId, clientSocket)
295
+ : undefined;
296
+ const lines = [`HTTP/1.1 ${upRes.statusCode ?? 101} ${upRes.statusMessage ?? 'Switching Protocols'}`];
297
+ const raw = upRes.rawHeaders;
298
+ for (let i = 0; i + 1 < raw.length; i += 2)
299
+ lines.push(`${raw[i]}: ${raw[i + 1]}`);
300
+ lines.push('', '');
301
+ clientSocket.write(lines.join('\r\n'));
302
+ if (upstreamHead.length)
303
+ clientSocket.write(upstreamHead);
304
+ if (head.length)
305
+ upstreamSocket.write(head);
306
+ let disconnected = false;
307
+ const releaseOnDisconnect = () => {
308
+ if (disconnected)
309
+ return;
310
+ disconnected = true;
311
+ deregisterBridgeSocket?.();
312
+ if (prepared.actor && leaseMarker) {
313
+ options.control.disconnect(prepared.actor, prepared.sessionId, leaseMarker);
314
+ }
315
+ };
316
+ upstreamSocket.pipe(clientSocket);
317
+ clientSocket.pipe(upstreamSocket);
318
+ const cleanup = () => {
319
+ releaseOnDisconnect();
320
+ upstreamSocket.destroy();
321
+ clientSocket.destroy();
322
+ };
323
+ upstreamSocket.on('error', cleanup);
324
+ upstreamSocket.on('close', () => { releaseOnDisconnect(); clientSocket.destroy(); });
325
+ clientSocket.on('close', () => { releaseOnDisconnect(); upstreamSocket.destroy(); });
326
+ });
327
+ upstream.on('response', upRes => {
328
+ responded = true;
329
+ // P1-2:拒绝体必须在限期内读完,且有上限(见常量注释)。
330
+ let settled = false;
331
+ let totalTimer;
332
+ const disarm = () => {
333
+ settled = true;
334
+ if (totalTimer)
335
+ clearTimeout(totalTimer);
336
+ totalTimer = undefined;
337
+ };
338
+ const abandon = () => {
339
+ if (settled)
340
+ return;
341
+ disarm();
342
+ upRes.destroy();
343
+ upstream.destroy();
344
+ clientSocket.destroy();
345
+ };
346
+ upstream.setTimeout(TERMINAL_UPGRADE_REJECTION_IDLE_TIMEOUT_MS, abandon);
347
+ totalTimer = setTimeout(abandon, TERMINAL_UPGRADE_REJECTION_TIMEOUT_MS);
348
+ totalTimer.unref?.();
349
+ // 客户端先走时也要回收上游。升级请求的 socket 被 http server 摘掉 data 监听
350
+ // 后是暂停态,且 http server 建的 socket 是 allowHalfOpen——不 `resume()` 就
351
+ // 收不到 FIN,收到了也不会自动关。升级已被拒,客户端 FIN 即视为它走了。
352
+ clientSocket.on('close', abandon);
353
+ clientSocket.on('end', abandon);
354
+ clientSocket.resume();
355
+ const lines = [`HTTP/1.1 ${upRes.statusCode ?? 502} ${upRes.statusMessage ?? 'Bad Gateway'}`, 'connection: close'];
356
+ const raw = upRes.rawHeaders;
357
+ for (let i = 0; i + 1 < raw.length; i += 2) {
358
+ const name = raw[i].toLowerCase();
359
+ if (name === 'transfer-encoding' || name === 'content-length' || name === 'connection')
360
+ continue;
361
+ lines.push(`${raw[i]}: ${raw[i + 1]}`);
362
+ }
363
+ lines.push('', '');
364
+ clientSocket.write(lines.join('\r\n'));
365
+ let bodyBytes = 0;
366
+ upRes.on('data', chunk => {
367
+ if (settled)
368
+ return;
369
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
370
+ bodyBytes += buffer.byteLength;
371
+ if (bodyBytes > MAX_TERMINAL_UPGRADE_REJECTION_BYTES) {
372
+ abandon();
373
+ return;
374
+ }
375
+ clientSocket.write(buffer);
376
+ });
377
+ upRes.on('end', () => {
378
+ if (settled)
379
+ return;
380
+ disarm();
381
+ upstream.setTimeout(0);
382
+ clientSocket.end();
383
+ });
384
+ upRes.on('error', () => { disarm(); clientSocket.destroy(); });
385
+ });
386
+ upstream.on('error', () => {
387
+ if (!responded)
388
+ socketError(clientSocket, 502, 'terminal proxy error');
389
+ else
390
+ clientSocket.destroy();
391
+ });
392
+ upstream.end();
393
+ return true;
394
+ };
395
+ return { handleHttp, handleUpgrade };
396
+ }
397
+ //# sourceMappingURL=terminal-front-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-front-proxy.js","sourceRoot":"","sources":["../../src/dashboard/terminal-front-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Short-lived read capability for the `/api/sessions/:id/view-link` URL.
3
+ *
4
+ * The link used to embed the worker's STABLE view token — an irrevocable
5
+ * bearer capability: an H5 viewer who fetched it once could keep reading the
6
+ * terminal long after logout/expiry, and a worker restart re-derived the same
7
+ * value. The view-link URL now carries a signed read grant instead, bound to
8
+ * sessionId + authSessionId + expiresAt.
9
+ *
10
+ * That alone was still bypassable (P1-5, second round): the returned URL kept
11
+ * the DAEMON/WORKER origin, so a copied raw URL — or a direct dial to the
12
+ * worker port / the daemon's own network-bound `/s/` reverse proxy — reached a
13
+ * stateless verifier that knew nothing about logout. Central revocation was
14
+ * decoration on a road nobody had to drive. Two changes close it, and the
15
+ * capability now names both of them in its own claims:
16
+ *
17
+ * • CENTRAL-ONLY CONSUMPTION. `centralViewLinkPath` returns a same-origin
18
+ * path on the central dashboard (`/s/<id>/?viewToken=…`) — the daemon /
19
+ * worker origin never leaves this process. The capability is minted with
20
+ * `audience: 'central'`, and the front proxy countersigns each accepted
21
+ * capability with a forward proof the browser cannot compute. The worker
22
+ * demands both, so a raw URL pointed at any other entry point fails closed
23
+ * even though its signature and expiry are perfectly valid.
24
+ * • WORKER GENERATION PINNING. The capability carries the worker's per-boot
25
+ * generation (derived one-way from the boot view token the daemon already
26
+ * reports). A worker restart re-randomizes it, so grants issued to a dead
27
+ * boot die with it instead of surviving on the shared `.dashboard-secret`.
28
+ *
29
+ * Revocation therefore has two independent fences: the front proxy refuses a
30
+ * capability whose auth session ended (and closes its bridged sockets), and the
31
+ * worker refuses one that did not come through that proxy or that outlived the
32
+ * boot it was minted for.
33
+ *
34
+ * The TTL doubles as the periodic reconnect boundary for read sockets, so it
35
+ * is deliberately longer than the old 60s per-request read grants (which now
36
+ * share this constant) but still short enough that a copied URL dies quickly.
37
+ */
38
+ export declare const TERMINAL_VIEW_CAPABILITY_TTL_MS: number;
39
+ export interface TerminalViewCapabilityIdentity {
40
+ userId: string;
41
+ authSessionId: string;
42
+ /** Authentication expiry of the requesting identity; the minted capability
43
+ * never outlives it. */
44
+ expiresAt: number;
45
+ }
46
+ /** Mint the short-lived, identity-bound read capability for one session.
47
+ * `workerGeneration` pins the capability to the worker boot it was minted
48
+ * against — see `upstreamWorkerViewGeneration`. */
49
+ export declare function mintTerminalViewCapability(secret: string, sessionId: string, identity: TerminalViewCapabilityIdentity, workerGeneration: string, now?: number): {
50
+ token: string;
51
+ expiresAt: number;
52
+ } | null;
53
+ /**
54
+ * Read the worker boot generation out of the daemon-built view-link URL.
55
+ *
56
+ * That upstream URL still carries the worker's per-boot card token in
57
+ * `?viewToken=` — the one value that identifies the live worker generation and
58
+ * that this process must never pass through to a browser. We convert it to a
59
+ * one-way generation id here and drop the token itself.
60
+ *
61
+ * Fails closed (null) on a malformed URL, a non-http(s) scheme, a missing
62
+ * token, or an upstream that already handed us a signed grant: without a
63
+ * generation the caller must return an error rather than mint an unpinned
64
+ * capability.
65
+ */
66
+ export declare function upstreamWorkerViewGeneration(secret: string, upstreamUrl: unknown): string | null;
67
+ /**
68
+ * Build the browser-facing view link: a CENTRAL-ORIGIN RELATIVE path, never an
69
+ * absolute URL. The daemon's terminal-proxy port and the worker port are both
70
+ * reachable on the network and neither knows anything about auth-session
71
+ * liveness, so publishing either origin is the whole bypass — a relative path
72
+ * cannot name them, and cannot be repointed by a poisoned `Host` header the way
73
+ * a server-rebuilt absolute URL could.
74
+ *
75
+ * The path shape matches the front proxy's `/s/<sessionId>` route, which is
76
+ * also what the daemon's proxy and the worker accept after the loopback hops.
77
+ */
78
+ export declare function centralViewLinkPath(sessionId: string, token: string): string | null;
79
+ /**
80
+ * Resolve which auth session a bound `?viewToken=` capability belongs to, or
81
+ * null when the value is not a valid bound read capability for this session.
82
+ * Used by the front proxy to (a) refuse capabilities whose auth session was
83
+ * already revoked and (b) index the bridged socket for logout-time closing.
84
+ *
85
+ * A grant without `audience: 'central'` is an internal loopback credential that
86
+ * was never meant to travel in a URL; it resolves to null so the proxy neither
87
+ * blesses it nor countersigns it.
88
+ */
89
+ export declare function terminalViewCapabilityAuthSession(secret: string, sessionId: string, viewToken: string | null | undefined, now?: number): string | null;
90
+ /**
91
+ * Countersign one accepted view capability for the loopback hop. Only the front
92
+ * proxy calls this, and only after the capability's auth session was confirmed
93
+ * live — the proof is what tells the worker "this request came through the
94
+ * component that holds the revocation state".
95
+ */
96
+ export declare function terminalViewForwardProof(secret: string, viewToken: string): string | undefined;
97
+ //# sourceMappingURL=terminal-view-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-view-capability.d.ts","sourceRoot":"","sources":["../../src/dashboard/terminal-view-capability.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,+BAA+B,QAAc,CAAC;AAE3D,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB;6BACyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;oDAEoD;AACpD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,8BAA8B,EACxC,gBAAgB,EAAE,MAAM,EACxB,GAAG,SAAa,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuB7C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMhG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,GAAG,SAAa,GACf,MAAM,GAAG,IAAI,CAMf;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9F"}