botmux 3.7.1 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/capabilities.d.ts +17 -0
  3. package/dist/adapters/backend/capabilities.d.ts.map +1 -0
  4. package/dist/adapters/backend/capabilities.js +22 -0
  5. package/dist/adapters/backend/capabilities.js.map +1 -0
  6. package/dist/adapters/backend/critical-control-key.d.ts +19 -0
  7. package/dist/adapters/backend/critical-control-key.d.ts.map +1 -0
  8. package/dist/adapters/backend/critical-control-key.js +34 -0
  9. package/dist/adapters/backend/critical-control-key.js.map +1 -0
  10. package/dist/adapters/backend/herdr-backend.d.ts +9 -0
  11. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/herdr-backend.js +23 -4
  13. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  14. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  15. package/dist/adapters/backend/riff-backend.js +3 -2
  16. package/dist/adapters/backend/riff-backend.js.map +1 -1
  17. package/dist/adapters/backend/session-backend-selector.d.ts +61 -6
  18. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  19. package/dist/adapters/backend/session-backend-selector.js +173 -9
  20. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  21. package/dist/adapters/backend/tmux-backend.d.ts +10 -3
  22. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  23. package/dist/adapters/backend/tmux-backend.js +25 -8
  24. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  25. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  26. package/dist/adapters/backend/tmux-pipe-backend.js +3 -2
  27. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  28. package/dist/adapters/backend/types.d.ts +45 -4
  29. package/dist/adapters/backend/types.d.ts.map +1 -1
  30. package/dist/adapters/backend/types.js +11 -0
  31. package/dist/adapters/backend/types.js.map +1 -1
  32. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  33. package/dist/adapters/backend/zellij-backend.js +3 -2
  34. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  35. package/dist/adapters/backend/zmx-backend.d.ts +286 -0
  36. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -0
  37. package/dist/adapters/backend/zmx-backend.js +2396 -0
  38. package/dist/adapters/backend/zmx-backend.js.map +1 -0
  39. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  40. package/dist/adapters/cli/claude-code.js +3 -0
  41. package/dist/adapters/cli/claude-code.js.map +1 -1
  42. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  43. package/dist/adapters/cli/codex-app.js +5 -1
  44. package/dist/adapters/cli/codex-app.js.map +1 -1
  45. package/dist/adapters/cli/codex.d.ts.map +1 -1
  46. package/dist/adapters/cli/codex.js +26 -1
  47. package/dist/adapters/cli/codex.js.map +1 -1
  48. package/dist/adapters/cli/fs-policy.d.ts +79 -1
  49. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  50. package/dist/adapters/cli/fs-policy.js +290 -13
  51. package/dist/adapters/cli/fs-policy.js.map +1 -1
  52. package/dist/adapters/cli/grok.d.ts.map +1 -1
  53. package/dist/adapters/cli/grok.js +4 -1
  54. package/dist/adapters/cli/grok.js.map +1 -1
  55. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  56. package/dist/adapters/cli/oh-my-pi.js +5 -3
  57. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  58. package/dist/adapters/cli/shared-hints.d.ts +7 -4
  59. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  60. package/dist/adapters/cli/shared-hints.js +52 -35
  61. package/dist/adapters/cli/shared-hints.js.map +1 -1
  62. package/dist/adapters/cli/strict-input-handle.d.ts +13 -0
  63. package/dist/adapters/cli/strict-input-handle.d.ts.map +1 -0
  64. package/dist/adapters/cli/strict-input-handle.js +39 -0
  65. package/dist/adapters/cli/strict-input-handle.js.map +1 -0
  66. package/dist/adapters/cli/traex.d.ts.map +1 -1
  67. package/dist/adapters/cli/traex.js +6 -4
  68. package/dist/adapters/cli/traex.js.map +1 -1
  69. package/dist/adapters/cli/types.d.ts +16 -0
  70. package/dist/adapters/cli/types.d.ts.map +1 -1
  71. package/dist/bot-registry.d.ts +137 -8
  72. package/dist/bot-registry.d.ts.map +1 -1
  73. package/dist/bot-registry.js +298 -12
  74. package/dist/bot-registry.js.map +1 -1
  75. package/dist/cli/session-list-liveness.d.ts +1 -1
  76. package/dist/cli/session-list-liveness.js +1 -1
  77. package/dist/cli/zmx-managed-attach.d.ts +41 -0
  78. package/dist/cli/zmx-managed-attach.d.ts.map +1 -0
  79. package/dist/cli/zmx-managed-attach.js +72 -0
  80. package/dist/cli/zmx-managed-attach.js.map +1 -0
  81. package/dist/cli.d.ts.map +1 -1
  82. package/dist/cli.js +780 -131
  83. package/dist/cli.js.map +1 -1
  84. package/dist/codex-app-runner.js +90 -2
  85. package/dist/codex-app-runner.js.map +1 -1
  86. package/dist/codex-rpc-engine.d.ts.map +1 -1
  87. package/dist/codex-rpc-engine.js +22 -6
  88. package/dist/codex-rpc-engine.js.map +1 -1
  89. package/dist/config.d.ts +5 -0
  90. package/dist/config.d.ts.map +1 -1
  91. package/dist/config.js +29 -1
  92. package/dist/config.js.map +1 -1
  93. package/dist/core/ask-broker.d.ts +22 -1
  94. package/dist/core/ask-broker.d.ts.map +1 -1
  95. package/dist/core/ask-broker.js +12 -5
  96. package/dist/core/ask-broker.js.map +1 -1
  97. package/dist/core/botmux-wrapper.d.ts +18 -0
  98. package/dist/core/botmux-wrapper.d.ts.map +1 -1
  99. package/dist/core/botmux-wrapper.js +25 -1
  100. package/dist/core/botmux-wrapper.js.map +1 -1
  101. package/dist/core/chat-rename.d.ts +27 -0
  102. package/dist/core/chat-rename.d.ts.map +1 -0
  103. package/dist/core/chat-rename.js +53 -0
  104. package/dist/core/chat-rename.js.map +1 -0
  105. package/dist/core/command-handler.d.ts.map +1 -1
  106. package/dist/core/command-handler.js +160 -12
  107. package/dist/core/command-handler.js.map +1 -1
  108. package/dist/core/cost-calculator.d.ts +25 -1
  109. package/dist/core/cost-calculator.d.ts.map +1 -1
  110. package/dist/core/cost-calculator.js +102 -4
  111. package/dist/core/cost-calculator.js.map +1 -1
  112. package/dist/core/dashboard-ipc-server.d.ts +16 -2
  113. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  114. package/dist/core/dashboard-ipc-server.js +611 -62
  115. package/dist/core/dashboard-ipc-server.js.map +1 -1
  116. package/dist/core/dashboard-rows.d.ts +22 -1
  117. package/dist/core/dashboard-rows.d.ts.map +1 -1
  118. package/dist/core/dashboard-rows.js +61 -0
  119. package/dist/core/dashboard-rows.js.map +1 -1
  120. package/dist/core/dashboard-url.d.ts +6 -0
  121. package/dist/core/dashboard-url.d.ts.map +1 -1
  122. package/dist/core/dashboard-url.js +11 -1
  123. package/dist/core/dashboard-url.js.map +1 -1
  124. package/dist/core/device-isolation-daemon.d.ts +28 -6
  125. package/dist/core/device-isolation-daemon.d.ts.map +1 -1
  126. package/dist/core/device-isolation-daemon.js +96 -13
  127. package/dist/core/device-isolation-daemon.js.map +1 -1
  128. package/dist/core/host-overload-alert.d.ts +75 -0
  129. package/dist/core/host-overload-alert.d.ts.map +1 -1
  130. package/dist/core/host-overload-alert.js +103 -0
  131. package/dist/core/host-overload-alert.js.map +1 -1
  132. package/dist/core/idle-worker-sweeper.js +1 -1
  133. package/dist/core/idle-worker-sweeper.js.map +1 -1
  134. package/dist/core/inflight-input-tracker.d.ts +3 -0
  135. package/dist/core/inflight-input-tracker.d.ts.map +1 -1
  136. package/dist/core/inflight-input-tracker.js +9 -0
  137. package/dist/core/inflight-input-tracker.js.map +1 -1
  138. package/dist/core/passthrough-commands.d.ts.map +1 -1
  139. package/dist/core/passthrough-commands.js +10 -0
  140. package/dist/core/passthrough-commands.js.map +1 -1
  141. package/dist/core/persistent-backend.d.ts +32 -4
  142. package/dist/core/persistent-backend.d.ts.map +1 -1
  143. package/dist/core/persistent-backend.js +75 -6
  144. package/dist/core/persistent-backend.js.map +1 -1
  145. package/dist/core/plugins/mcp/gateway.js +2 -2
  146. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  147. package/dist/core/plugins/runtime.d.ts +3 -0
  148. package/dist/core/plugins/runtime.d.ts.map +1 -1
  149. package/dist/core/plugins/runtime.js.map +1 -1
  150. package/dist/core/plugins/service-manager.d.ts +4 -1
  151. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  152. package/dist/core/plugins/service-manager.js +11 -6
  153. package/dist/core/plugins/service-manager.js.map +1 -1
  154. package/dist/core/role-library.d.ts +48 -1
  155. package/dist/core/role-library.d.ts.map +1 -1
  156. package/dist/core/role-library.js +111 -3
  157. package/dist/core/role-library.js.map +1 -1
  158. package/dist/core/role-resolver.d.ts +14 -2
  159. package/dist/core/role-resolver.d.ts.map +1 -1
  160. package/dist/core/role-resolver.js +47 -4
  161. package/dist/core/role-resolver.js.map +1 -1
  162. package/dist/core/session-activity.d.ts +14 -0
  163. package/dist/core/session-activity.d.ts.map +1 -1
  164. package/dist/core/session-activity.js +46 -1
  165. package/dist/core/session-activity.js.map +1 -1
  166. package/dist/core/session-board.d.ts +5 -2
  167. package/dist/core/session-board.d.ts.map +1 -1
  168. package/dist/core/session-board.js +5 -2
  169. package/dist/core/session-board.js.map +1 -1
  170. package/dist/core/session-liveness.d.ts +6 -5
  171. package/dist/core/session-liveness.d.ts.map +1 -1
  172. package/dist/core/session-liveness.js +34 -13
  173. package/dist/core/session-liveness.js.map +1 -1
  174. package/dist/core/session-manager.d.ts +3 -2
  175. package/dist/core/session-manager.d.ts.map +1 -1
  176. package/dist/core/session-manager.js +397 -103
  177. package/dist/core/session-manager.js.map +1 -1
  178. package/dist/core/session-marker.d.ts +11 -2
  179. package/dist/core/session-marker.d.ts.map +1 -1
  180. package/dist/core/session-marker.js +50 -11
  181. package/dist/core/session-marker.js.map +1 -1
  182. package/dist/core/session-message-preview.d.ts +20 -0
  183. package/dist/core/session-message-preview.d.ts.map +1 -0
  184. package/dist/core/session-message-preview.js +188 -0
  185. package/dist/core/session-message-preview.js.map +1 -0
  186. package/dist/core/session-title.d.ts +5 -1
  187. package/dist/core/session-title.d.ts.map +1 -1
  188. package/dist/core/session-title.js +20 -3
  189. package/dist/core/session-title.js.map +1 -1
  190. package/dist/core/startup-commands.d.ts +1 -1
  191. package/dist/core/startup-commands.js +1 -1
  192. package/dist/core/terminal-url.d.ts.map +1 -1
  193. package/dist/core/terminal-url.js +3 -2
  194. package/dist/core/terminal-url.js.map +1 -1
  195. package/dist/core/trigger-session.d.ts.map +1 -1
  196. package/dist/core/trigger-session.js +75 -12
  197. package/dist/core/trigger-session.js.map +1 -1
  198. package/dist/core/types.d.ts +35 -0
  199. package/dist/core/types.d.ts.map +1 -1
  200. package/dist/core/types.js +23 -0
  201. package/dist/core/types.js.map +1 -1
  202. package/dist/core/worker-ipc.d.ts +11 -0
  203. package/dist/core/worker-ipc.d.ts.map +1 -0
  204. package/dist/core/worker-ipc.js +26 -0
  205. package/dist/core/worker-ipc.js.map +1 -0
  206. package/dist/core/worker-pool.d.ts +179 -29
  207. package/dist/core/worker-pool.d.ts.map +1 -1
  208. package/dist/core/worker-pool.js +2118 -331
  209. package/dist/core/worker-pool.js.map +1 -1
  210. package/dist/daemon.d.ts +132 -3
  211. package/dist/daemon.d.ts.map +1 -1
  212. package/dist/daemon.js +1327 -449
  213. package/dist/daemon.js.map +1 -1
  214. package/dist/dashboard/auth.d.ts +2 -0
  215. package/dist/dashboard/auth.d.ts.map +1 -1
  216. package/dist/dashboard/auth.js +9 -0
  217. package/dist/dashboard/auth.js.map +1 -1
  218. package/dist/dashboard/bot-payload.d.ts +4 -0
  219. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  220. package/dist/dashboard/bot-payload.js +5 -0
  221. package/dist/dashboard/bot-payload.js.map +1 -1
  222. package/dist/dashboard/federation-api.d.ts.map +1 -1
  223. package/dist/dashboard/federation-api.js +4 -0
  224. package/dist/dashboard/federation-api.js.map +1 -1
  225. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  226. package/dist/dashboard/federation-spoke-api.js +32 -5
  227. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  228. package/dist/dashboard/public-redact.d.ts +8 -2
  229. package/dist/dashboard/public-redact.d.ts.map +1 -1
  230. package/dist/dashboard/public-redact.js +34 -7
  231. package/dist/dashboard/public-redact.js.map +1 -1
  232. package/dist/dashboard/session-card-model.d.ts.map +1 -1
  233. package/dist/dashboard/session-card-model.js +10 -2
  234. package/dist/dashboard/session-card-model.js.map +1 -1
  235. package/dist/dashboard/settings-write-applier.d.ts +35 -1
  236. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  237. package/dist/dashboard/settings-write-applier.js +88 -1
  238. package/dist/dashboard/settings-write-applier.js.map +1 -1
  239. package/dist/dashboard/web/app.d.ts.map +1 -1
  240. package/dist/dashboard/web/app.js +0 -1
  241. package/dist/dashboard/web/app.js.map +1 -1
  242. package/dist/dashboard/web/bot-defaults-page.d.ts +15 -0
  243. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  244. package/dist/dashboard/web/bot-defaults-page.js +212 -58
  245. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  246. package/dist/dashboard/web/bot-defaults.d.ts +3 -0
  247. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  248. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  249. package/dist/dashboard/web/bot-onboarding.d.ts +2 -1
  250. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  251. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  252. package/dist/dashboard/web/clipboard.d.ts +2 -0
  253. package/dist/dashboard/web/clipboard.d.ts.map +1 -0
  254. package/dist/dashboard/web/clipboard.js +42 -0
  255. package/dist/dashboard/web/clipboard.js.map +1 -0
  256. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  257. package/dist/dashboard/web/connectors-page.js +12 -8
  258. package/dist/dashboard/web/connectors-page.js.map +1 -1
  259. package/dist/dashboard/web/dashboard-components.d.ts +17 -16
  260. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
  261. package/dist/dashboard/web/dashboard-components.js.map +1 -1
  262. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  263. package/dist/dashboard/web/groups-page.js +7 -3
  264. package/dist/dashboard/web/groups-page.js.map +1 -1
  265. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  266. package/dist/dashboard/web/i18n.js +205 -12
  267. package/dist/dashboard/web/i18n.js.map +1 -1
  268. package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -1
  269. package/dist/dashboard/web/icon-tooltip.js +16 -1
  270. package/dist/dashboard/web/icon-tooltip.js.map +1 -1
  271. package/dist/dashboard/web/listener-filters.d.ts +23 -0
  272. package/dist/dashboard/web/listener-filters.d.ts.map +1 -0
  273. package/dist/dashboard/web/listener-filters.js +36 -0
  274. package/dist/dashboard/web/listener-filters.js.map +1 -0
  275. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  276. package/dist/dashboard/web/overview-page.js.map +1 -1
  277. package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
  278. package/dist/dashboard/web/plugin-page.js.map +1 -1
  279. package/dist/dashboard/web/preview-markdown.d.ts +5 -0
  280. package/dist/dashboard/web/preview-markdown.d.ts.map +1 -0
  281. package/dist/dashboard/web/preview-markdown.js +52 -0
  282. package/dist/dashboard/web/preview-markdown.js.map +1 -0
  283. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  284. package/dist/dashboard/web/roles-page.js +535 -10
  285. package/dist/dashboard/web/roles-page.js.map +1 -1
  286. package/dist/dashboard/web/roles.d.ts +77 -0
  287. package/dist/dashboard/web/roles.d.ts.map +1 -1
  288. package/dist/dashboard/web/roles.js +98 -0
  289. package/dist/dashboard/web/roles.js.map +1 -1
  290. package/dist/dashboard/web/session-terminal.d.ts.map +1 -1
  291. package/dist/dashboard/web/session-terminal.js +6 -4
  292. package/dist/dashboard/web/session-terminal.js.map +1 -1
  293. package/dist/dashboard/web/sessions-kanban.d.ts +4 -1
  294. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  295. package/dist/dashboard/web/sessions-kanban.js +1 -1
  296. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  297. package/dist/dashboard/web/sessions-page.d.ts +3 -2
  298. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  299. package/dist/dashboard/web/sessions-page.js +163 -28
  300. package/dist/dashboard/web/sessions-page.js.map +1 -1
  301. package/dist/dashboard/web/sessions.d.ts +25 -0
  302. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  303. package/dist/dashboard/web/sessions.js +58 -7
  304. package/dist/dashboard/web/sessions.js.map +1 -1
  305. package/dist/dashboard/web/settings-page.d.ts +28 -3
  306. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  307. package/dist/dashboard/web/settings-page.js +61 -1
  308. package/dist/dashboard/web/settings-page.js.map +1 -1
  309. package/dist/dashboard/web/skills-page.d.ts +6 -5
  310. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  311. package/dist/dashboard/web/skills-page.js +2 -0
  312. package/dist/dashboard/web/skills-page.js.map +1 -1
  313. package/dist/dashboard/web/v3-components.d.ts +3 -2
  314. package/dist/dashboard/web/v3-components.d.ts.map +1 -1
  315. package/dist/dashboard/web/v3-components.js.map +1 -1
  316. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +12 -2
  317. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  318. package/dist/dashboard/web/vc-consumer-profiles-section.js +0 -9
  319. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  320. package/dist/dashboard/web/webhook-logs-page.d.ts +2 -1
  321. package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -1
  322. package/dist/dashboard/web/webhook-logs-page.js +4 -1
  323. package/dist/dashboard/web/webhook-logs-page.js.map +1 -1
  324. package/dist/dashboard-web/app.js +1 -1
  325. package/dist/dashboard-web/chunks/bot-defaults-page-FAPIMQV3.js +10 -0
  326. package/dist/dashboard-web/chunks/{chunk-QFMH6ITB.js → chunk-5CJMHTT4.js} +1 -1
  327. package/dist/dashboard-web/chunks/{chunk-KQB42ML5.js → chunk-DLZK52JU.js} +14 -12
  328. package/dist/dashboard-web/chunks/chunk-FDZ7WOBW.js +16 -0
  329. package/dist/dashboard-web/chunks/{chunk-3QAUJXAS.js → chunk-GTAJV5YC.js} +1 -1
  330. package/dist/dashboard-web/chunks/{chunk-FNPGOZMX.js → chunk-IHNG6KE6.js} +1 -1
  331. package/dist/dashboard-web/chunks/{chunk-FLGXZJTD.js → chunk-VA6QWSGQ.js} +1 -1
  332. package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
  333. package/dist/dashboard-web/chunks/chunk-ZJVTGU5X.js +1 -0
  334. package/dist/dashboard-web/chunks/connectors-page-LKWRT3GS.js +1 -0
  335. package/dist/dashboard-web/chunks/groups-page-V6654ICQ.js +8 -0
  336. package/dist/dashboard-web/chunks/insights-page-237RMFQ5.js +7 -0
  337. package/dist/dashboard-web/chunks/{monitor-room-7IVIS75W.js → monitor-room-OO5Y4FRQ.js} +1 -1
  338. package/dist/dashboard-web/chunks/{monitoring-page-5SSJRQZF.js → monitoring-page-OUEITM5P.js} +1 -1
  339. package/dist/dashboard-web/chunks/{office-page-EOND3L5D.js → office-page-4KNAHQ4Q.js} +1 -1
  340. package/dist/dashboard-web/chunks/{overview-page-NISBVBBJ.js → overview-page-QDP4YK2S.js} +1 -1
  341. package/dist/dashboard-web/chunks/{plugin-page-JXC5F5YV.js → plugin-page-VEGTCEAS.js} +1 -1
  342. package/dist/dashboard-web/chunks/roles-page-PGXNZZNP.js +1 -0
  343. package/dist/dashboard-web/chunks/{schedules-page-AVOOKLUH.js → schedules-page-BJNC5TID.js} +1 -1
  344. package/dist/dashboard-web/chunks/sessions-page-M2ZYYCMO.js +6 -0
  345. package/dist/dashboard-web/chunks/settings-page-IJFZKUUW.js +2 -0
  346. package/dist/dashboard-web/chunks/{skills-page-5MW54PCC.js → skills-page-YRAIRZOQ.js} +3 -3
  347. package/dist/dashboard-web/chunks/{team-federation-page-2SNIMVXI.js → team-federation-page-DEU27GRU.js} +1 -1
  348. package/dist/dashboard-web/chunks/{v3-page-W6SBXXQC.js → v3-page-6KHEW2YL.js} +5 -5
  349. package/dist/dashboard-web/chunks/{whiteboards-page-STC54KTP.js → whiteboards-page-VDECAALH.js} +1 -1
  350. package/dist/dashboard-web/style.css +12545 -11432
  351. package/dist/dashboard.js +215 -36
  352. package/dist/dashboard.js.map +1 -1
  353. package/dist/global-config.d.ts +41 -2
  354. package/dist/global-config.d.ts.map +1 -1
  355. package/dist/global-config.js +47 -0
  356. package/dist/global-config.js.map +1 -1
  357. package/dist/i18n/en.d.ts.map +1 -1
  358. package/dist/i18n/en.js +71 -19
  359. package/dist/i18n/en.js.map +1 -1
  360. package/dist/i18n/zh.d.ts.map +1 -1
  361. package/dist/i18n/zh.js +71 -19
  362. package/dist/i18n/zh.js.map +1 -1
  363. package/dist/im/lark/callback-button-marker.d.ts +34 -0
  364. package/dist/im/lark/callback-button-marker.d.ts.map +1 -0
  365. package/dist/im/lark/callback-button-marker.js +99 -0
  366. package/dist/im/lark/callback-button-marker.js.map +1 -0
  367. package/dist/im/lark/card-builder.d.ts +46 -10
  368. package/dist/im/lark/card-builder.d.ts.map +1 -1
  369. package/dist/im/lark/card-builder.js +299 -78
  370. package/dist/im/lark/card-builder.js.map +1 -1
  371. package/dist/im/lark/card-handler.d.ts +3 -4
  372. package/dist/im/lark/card-handler.d.ts.map +1 -1
  373. package/dist/im/lark/card-handler.js +380 -148
  374. package/dist/im/lark/card-handler.js.map +1 -1
  375. package/dist/im/lark/client.d.ts +24 -1
  376. package/dist/im/lark/client.d.ts.map +1 -1
  377. package/dist/im/lark/client.js +101 -8
  378. package/dist/im/lark/client.js.map +1 -1
  379. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  380. package/dist/im/lark/doc-comment.js +6 -1
  381. package/dist/im/lark/doc-comment.js.map +1 -1
  382. package/dist/im/lark/event-dispatcher.d.ts +115 -3
  383. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  384. package/dist/im/lark/event-dispatcher.js +534 -147
  385. package/dist/im/lark/event-dispatcher.js.map +1 -1
  386. package/dist/im/lark/grant-command.d.ts +16 -12
  387. package/dist/im/lark/grant-command.d.ts.map +1 -1
  388. package/dist/im/lark/grant-command.js +48 -151
  389. package/dist/im/lark/grant-command.js.map +1 -1
  390. package/dist/im/lark/grant-pending.d.ts +12 -4
  391. package/dist/im/lark/grant-pending.d.ts.map +1 -1
  392. package/dist/im/lark/grant-pending.js +31 -8
  393. package/dist/im/lark/grant-pending.js.map +1 -1
  394. package/dist/im/lark/invite-command.d.ts +20 -0
  395. package/dist/im/lark/invite-command.d.ts.map +1 -0
  396. package/dist/im/lark/invite-command.js +239 -0
  397. package/dist/im/lark/invite-command.js.map +1 -0
  398. package/dist/im/lark/md-card.d.ts +66 -4
  399. package/dist/im/lark/md-card.d.ts.map +1 -1
  400. package/dist/im/lark/md-card.js +201 -31
  401. package/dist/im/lark/md-card.js.map +1 -1
  402. package/dist/im/lark/mention-targets.d.ts +43 -0
  403. package/dist/im/lark/mention-targets.d.ts.map +1 -0
  404. package/dist/im/lark/mention-targets.js +190 -0
  405. package/dist/im/lark/mention-targets.js.map +1 -0
  406. package/dist/im/lark/message-parser.d.ts +31 -0
  407. package/dist/im/lark/message-parser.d.ts.map +1 -1
  408. package/dist/im/lark/message-parser.js +305 -32
  409. package/dist/im/lark/message-parser.js.map +1 -1
  410. package/dist/im/lark/reply-card-footer-signature.d.ts +7 -0
  411. package/dist/im/lark/reply-card-footer-signature.d.ts.map +1 -0
  412. package/dist/im/lark/reply-card-footer-signature.js +7 -0
  413. package/dist/im/lark/reply-card-footer-signature.js.map +1 -0
  414. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  415. package/dist/im/lark/sessions-card.js +4 -1
  416. package/dist/im/lark/sessions-card.js.map +1 -1
  417. package/dist/im/lark/substitute-command.d.ts.map +1 -1
  418. package/dist/im/lark/substitute-command.js +8 -0
  419. package/dist/im/lark/substitute-command.js.map +1 -1
  420. package/dist/im/lark/topic-root-context.d.ts +35 -0
  421. package/dist/im/lark/topic-root-context.d.ts.map +1 -0
  422. package/dist/im/lark/topic-root-context.js +37 -0
  423. package/dist/im/lark/topic-root-context.js.map +1 -0
  424. package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
  425. package/dist/im/lark/v3-blocked-card.js +2 -1
  426. package/dist/im/lark/v3-blocked-card.js.map +1 -1
  427. package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
  428. package/dist/im/lark/v3-gate-card.js +2 -1
  429. package/dist/im/lark/v3-gate-card.js.map +1 -1
  430. package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -1
  431. package/dist/im/lark/v3-loop-grant-card.js +2 -1
  432. package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
  433. package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
  434. package/dist/im/lark/v3-progress-card.js +2 -1
  435. package/dist/im/lark/v3-progress-card.js.map +1 -1
  436. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -1
  437. package/dist/im/lark/v3-revisit-grant-card.js +2 -1
  438. package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
  439. package/dist/index-core-only.d.ts +3 -0
  440. package/dist/index-core-only.d.ts.map +1 -0
  441. package/dist/index-core-only.js +107 -0
  442. package/dist/index-core-only.js.map +1 -0
  443. package/dist/services/async-trigger-state.d.ts +8 -0
  444. package/dist/services/async-trigger-state.d.ts.map +1 -1
  445. package/dist/services/async-trigger-state.js +3 -2
  446. package/dist/services/async-trigger-state.js.map +1 -1
  447. package/dist/services/async-trigger-store.d.ts +10 -2
  448. package/dist/services/async-trigger-store.d.ts.map +1 -1
  449. package/dist/services/async-trigger-store.js +3 -2
  450. package/dist/services/async-trigger-store.js.map +1 -1
  451. package/dist/services/backend-availability.d.ts +3 -1
  452. package/dist/services/backend-availability.d.ts.map +1 -1
  453. package/dist/services/backend-availability.js +14 -1
  454. package/dist/services/backend-availability.js.map +1 -1
  455. package/dist/services/backend-type-store.d.ts.map +1 -1
  456. package/dist/services/backend-type-store.js +1 -1
  457. package/dist/services/backend-type-store.js.map +1 -1
  458. package/dist/services/bot-config-store.d.ts.map +1 -1
  459. package/dist/services/bot-config-store.js +2 -1
  460. package/dist/services/bot-config-store.js.map +1 -1
  461. package/dist/services/bridge-fallback-gate.d.ts +14 -1
  462. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  463. package/dist/services/bridge-fallback-gate.js +65 -1
  464. package/dist/services/bridge-fallback-gate.js.map +1 -1
  465. package/dist/services/card-prefs-store.d.ts +7 -2
  466. package/dist/services/card-prefs-store.d.ts.map +1 -1
  467. package/dist/services/card-prefs-store.js +30 -4
  468. package/dist/services/card-prefs-store.js.map +1 -1
  469. package/dist/services/codex-app-runner-protocol.d.ts +9 -0
  470. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  471. package/dist/services/codex-app-runner-protocol.js +17 -0
  472. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  473. package/dist/services/codex-app-token-usage.d.ts +93 -0
  474. package/dist/services/codex-app-token-usage.d.ts.map +1 -0
  475. package/dist/services/codex-app-token-usage.js +190 -0
  476. package/dist/services/codex-app-token-usage.js.map +1 -0
  477. package/dist/services/codex-transcript.d.ts +6 -1
  478. package/dist/services/codex-transcript.d.ts.map +1 -1
  479. package/dist/services/codex-transcript.js +103 -32
  480. package/dist/services/codex-transcript.js.map +1 -1
  481. package/dist/services/federation-roster.d.ts +4 -0
  482. package/dist/services/federation-roster.d.ts.map +1 -1
  483. package/dist/services/federation-roster.js +3 -0
  484. package/dist/services/federation-roster.js.map +1 -1
  485. package/dist/services/federation-store.d.ts +6 -0
  486. package/dist/services/federation-store.d.ts.map +1 -1
  487. package/dist/services/federation-store.js.map +1 -1
  488. package/dist/services/grant-policy.d.ts +13 -0
  489. package/dist/services/grant-policy.d.ts.map +1 -0
  490. package/dist/services/grant-policy.js +40 -0
  491. package/dist/services/grant-policy.js.map +1 -0
  492. package/dist/services/grant-store.d.ts +24 -3
  493. package/dist/services/grant-store.d.ts.map +1 -1
  494. package/dist/services/grant-store.js +196 -12
  495. package/dist/services/grant-store.js.map +1 -1
  496. package/dist/services/groups-store.d.ts +36 -0
  497. package/dist/services/groups-store.d.ts.map +1 -1
  498. package/dist/services/groups-store.js +123 -1
  499. package/dist/services/groups-store.js.map +1 -1
  500. package/dist/services/jsonl-cursor.d.ts.map +1 -1
  501. package/dist/services/jsonl-cursor.js +8 -2
  502. package/dist/services/jsonl-cursor.js.map +1 -1
  503. package/dist/services/local-cli-opener.d.ts.map +1 -1
  504. package/dist/services/local-cli-opener.js +32 -0
  505. package/dist/services/local-cli-opener.js.map +1 -1
  506. package/dist/services/message-listener-run-preview-store.d.ts +43 -0
  507. package/dist/services/message-listener-run-preview-store.d.ts.map +1 -0
  508. package/dist/services/message-listener-run-preview-store.js +152 -0
  509. package/dist/services/message-listener-run-preview-store.js.map +1 -0
  510. package/dist/services/message-listener-store.d.ts +26 -0
  511. package/dist/services/message-listener-store.d.ts.map +1 -0
  512. package/dist/services/message-listener-store.js +138 -0
  513. package/dist/services/message-listener-store.js.map +1 -0
  514. package/dist/services/message-listener.d.ts +112 -0
  515. package/dist/services/message-listener.d.ts.map +1 -0
  516. package/dist/services/message-listener.js +391 -0
  517. package/dist/services/message-listener.js.map +1 -0
  518. package/dist/services/overload-alert-migration.d.ts +15 -0
  519. package/dist/services/overload-alert-migration.d.ts.map +1 -0
  520. package/dist/services/overload-alert-migration.js +115 -0
  521. package/dist/services/overload-alert-migration.js.map +1 -0
  522. package/dist/services/send-policy.d.ts +38 -0
  523. package/dist/services/send-policy.d.ts.map +1 -1
  524. package/dist/services/send-policy.js +34 -0
  525. package/dist/services/send-policy.js.map +1 -1
  526. package/dist/services/session-store.d.ts +12 -1
  527. package/dist/services/session-store.d.ts.map +1 -1
  528. package/dist/services/session-store.js +44 -2
  529. package/dist/services/session-store.js.map +1 -1
  530. package/dist/services/skill-registry-store.d.ts.map +1 -1
  531. package/dist/services/skill-registry-store.js +87 -12
  532. package/dist/services/skill-registry-store.js.map +1 -1
  533. package/dist/services/substitute-mode-normalize.d.ts +3 -0
  534. package/dist/services/substitute-mode-normalize.d.ts.map +1 -1
  535. package/dist/services/substitute-mode-normalize.js +8 -0
  536. package/dist/services/substitute-mode-normalize.js.map +1 -1
  537. package/dist/services/substitute-mode-store.d.ts.map +1 -1
  538. package/dist/services/substitute-mode-store.js +8 -1
  539. package/dist/services/substitute-mode-store.js.map +1 -1
  540. package/dist/services/transcript-resolver.d.ts +6 -1
  541. package/dist/services/transcript-resolver.d.ts.map +1 -1
  542. package/dist/services/transcript-resolver.js +145 -29
  543. package/dist/services/transcript-resolver.js.map +1 -1
  544. package/dist/services/trigger-types.d.ts +16 -0
  545. package/dist/services/trigger-types.d.ts.map +1 -1
  546. package/dist/services/trigger-types.js +6 -0
  547. package/dist/services/trigger-types.js.map +1 -1
  548. package/dist/setup/bot-config-editor.js +2 -2
  549. package/dist/setup/bot-config-editor.js.map +1 -1
  550. package/dist/setup/ensure-zmx.d.ts +31 -0
  551. package/dist/setup/ensure-zmx.d.ts.map +1 -0
  552. package/dist/setup/ensure-zmx.js +161 -0
  553. package/dist/setup/ensure-zmx.js.map +1 -0
  554. package/dist/setup/index.d.ts +1 -1
  555. package/dist/setup/index.js +1 -1
  556. package/dist/setup/open-platform-automation.d.ts +9 -0
  557. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  558. package/dist/setup/open-platform-automation.js +15 -2
  559. package/dist/setup/open-platform-automation.js.map +1 -1
  560. package/dist/setup/setup-args.d.ts +1 -1
  561. package/dist/setup/setup-args.d.ts.map +1 -1
  562. package/dist/setup/setup-args.js +1 -1
  563. package/dist/skills/definitions.d.ts.map +1 -1
  564. package/dist/skills/definitions.js +32 -0
  565. package/dist/skills/definitions.js.map +1 -1
  566. package/dist/skills/injection-mode.d.ts +6 -2
  567. package/dist/skills/injection-mode.d.ts.map +1 -1
  568. package/dist/skills/injection-mode.js +10 -5
  569. package/dist/skills/injection-mode.js.map +1 -1
  570. package/dist/types.d.ts +79 -3
  571. package/dist/types.d.ts.map +1 -1
  572. package/dist/utils/child-env.d.ts +1 -1
  573. package/dist/utils/child-env.d.ts.map +1 -1
  574. package/dist/utils/child-env.js +4 -0
  575. package/dist/utils/child-env.js.map +1 -1
  576. package/dist/utils/effort-confirm-dialog.d.ts +40 -0
  577. package/dist/utils/effort-confirm-dialog.d.ts.map +1 -0
  578. package/dist/utils/effort-confirm-dialog.js +74 -0
  579. package/dist/utils/effort-confirm-dialog.js.map +1 -0
  580. package/dist/utils/pending-input-queue.d.ts +56 -0
  581. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  582. package/dist/utils/pending-input-queue.js +80 -0
  583. package/dist/utils/pending-input-queue.js.map +1 -1
  584. package/dist/utils/render-dimensions.d.ts +8 -0
  585. package/dist/utils/render-dimensions.d.ts.map +1 -1
  586. package/dist/utils/render-dimensions.js +10 -0
  587. package/dist/utils/render-dimensions.js.map +1 -1
  588. package/dist/utils/stuck-key-guard.d.ts +3 -2
  589. package/dist/utils/stuck-key-guard.d.ts.map +1 -1
  590. package/dist/utils/stuck-key-guard.js +3 -3
  591. package/dist/utils/stuck-key-guard.js.map +1 -1
  592. package/dist/utils/terminal-renderer.d.ts +6 -0
  593. package/dist/utils/terminal-renderer.d.ts.map +1 -1
  594. package/dist/utils/terminal-renderer.js +15 -0
  595. package/dist/utils/terminal-renderer.js.map +1 -1
  596. package/dist/utils/tui-input-delivery.d.ts +32 -0
  597. package/dist/utils/tui-input-delivery.d.ts.map +1 -0
  598. package/dist/utils/tui-input-delivery.js +53 -0
  599. package/dist/utils/tui-input-delivery.js.map +1 -0
  600. package/dist/utils/xml.d.ts +19 -0
  601. package/dist/utils/xml.d.ts.map +1 -0
  602. package/dist/utils/xml.js +26 -0
  603. package/dist/utils/xml.js.map +1 -0
  604. package/dist/worker.js +1852 -374
  605. package/dist/worker.js.map +1 -1
  606. package/dist/workflows/definition.d.ts +8 -8
  607. package/dist/workflows/events/payloads.d.ts +8 -8
  608. package/dist/workflows/events/schema.d.ts +160 -160
  609. package/dist/workflows/v3/session-relay-client.js +1 -1
  610. package/dist/workflows/v3/session-relay-client.js.map +1 -1
  611. package/dist/workflows/v3/worker-fence.d.ts.map +1 -1
  612. package/dist/workflows/v3/worker-fence.js +15 -10
  613. package/dist/workflows/v3/worker-fence.js.map +1 -1
  614. package/package.json +1 -1
  615. package/dist/dashboard-web/chunks/bot-defaults-page-UKA7K4JV.js +0 -10
  616. package/dist/dashboard-web/chunks/chunk-DFLNXQNT.js +0 -1
  617. package/dist/dashboard-web/chunks/connectors-page-A77YAB5Y.js +0 -1
  618. package/dist/dashboard-web/chunks/groups-page-RUZNVXQB.js +0 -8
  619. package/dist/dashboard-web/chunks/insights-page-RF7U7RTA.js +0 -22
  620. package/dist/dashboard-web/chunks/roles-page-BUMKD7Y4.js +0 -1
  621. package/dist/dashboard-web/chunks/sessions-page-6HLSEAB7.js +0 -2
  622. package/dist/dashboard-web/chunks/settings-page-MJDZHQ4X.js +0 -2
@@ -1,7 +1,9 @@
1
1
  import { adoptTargetKey, adoptTargetLabel } from '../../core/session-discovery.js';
2
2
  import { t } from '../../i18n/index.js';
3
+ import { cardUsageFooterSegment } from './md-card.js';
3
4
  import { readGlobalConfig } from '../../global-config.js';
4
5
  import { isLocalCliOpenEnabled } from '../../services/local-cli-opener.js';
6
+ import { clampGrantQuotaForCard, DEFAULT_GRANT_DURATION_MS, DEFAULT_GRANT_QUOTA, GRANT_DURATION_OPTIONS, } from '../../services/grant-policy.js';
5
7
  /** select_static 里代表「清回默认 / 未设置」的哨兵值(model / lang 下拉用)。 */
6
8
  export const CONFIG_UNSET = '__unset__';
7
9
  /** 布尔字段按配置页的逻辑分组(与 dashboard 的 Bot Profiles 区块对应)。 */
@@ -255,24 +257,27 @@ export function buildSessionCard(sessionId, rootId, terminalUrl, title, cliId, s
255
257
  const cliName = getCliDisplayName(cliId ?? 'claude-code');
256
258
  const effectiveCliId = cliId ?? 'claude-code';
257
259
  const actionBase = { root_id: rootId, session_id: sessionId, cli_id: effectiveCliId };
258
- const actions = [
259
- {
260
+ const actions = [];
261
+ if (terminalUrl) {
262
+ actions.push({
260
263
  tag: 'button',
261
264
  text: { tag: 'plain_text', content: t(showManageButtons ? 'card.btn.open_writable_terminal' : 'card.btn.open_terminal', undefined, locale) },
262
265
  type: 'primary',
263
266
  multi_url: terminalMultiUrl(terminalUrl),
264
- },
265
- ];
267
+ });
268
+ }
266
269
  if (!showManageButtons) {
267
270
  const localBtn = cliId ? localCliButton(effectiveCliId, actionBase, locale, localCliReady) : undefined;
268
271
  if (localBtn)
269
272
  actions.push(localBtn);
270
- actions.push({
271
- tag: 'button',
272
- text: { tag: 'plain_text', content: t('card.btn.get_write_link', undefined, locale) },
273
- type: 'default',
274
- value: { action: 'get_write_link', ...actionBase },
275
- });
273
+ if (terminalUrl) {
274
+ actions.push({
275
+ tag: 'button',
276
+ text: { tag: 'plain_text', content: t('card.btn.get_write_link', undefined, locale) },
277
+ type: 'default',
278
+ value: { action: 'get_write_link', ...actionBase },
279
+ });
280
+ }
276
281
  }
277
282
  if (showManageButtons && !adoptMode) {
278
283
  actions.push({
@@ -576,7 +581,7 @@ function streamStatusLabel(status, usageLimit, locale) {
576
581
  /** Push the shared "output body" elements (usage-limit notice + screenshot) used
577
582
  * by both {@link buildStreamingCard} and {@link buildPrivateSnapshotCard}. */
578
583
  function pushStreamBody(elements, opts) {
579
- const { status, usageLimit, displayMode, imageKey, cliName, locale } = opts;
584
+ const { status, usageLimit, displayMode, imageKey, cliName, locale, usage } = opts;
580
585
  if (status === 'limited' && usageLimit) {
581
586
  elements.push({
582
587
  tag: 'markdown',
@@ -595,6 +600,17 @@ function pushStreamBody(elements, opts) {
595
600
  }
596
601
  elements.push({ tag: 'hr' });
597
602
  }
603
+ // Native Context / Token usage line (grey, small) when this bot displays usage
604
+ // on the streaming card. Missing metrics are omitted independently by
605
+ // cardUsageFooterSegment; a fully-empty snapshot renders nothing.
606
+ const usageSeg = usage ? cardUsageFooterSegment(usage, locale, 'streaming') : null;
607
+ if (usageSeg) {
608
+ elements.push({
609
+ tag: 'markdown',
610
+ text_size: 'notation_small_v2',
611
+ content: `<font color='grey'>${usageSeg}</font>`,
612
+ });
613
+ }
598
614
  }
599
615
  /**
600
616
  * Build a Feishu streaming card that shows live terminal output + controls.
@@ -607,14 +623,14 @@ function pushStreamBody(elements, opts) {
607
623
  * Quick-action buttons (Esc, ^C, Tab, Space, Enter, ←↑↓→, ½屏 ↑/↓) appear
608
624
  * whenever displayMode !== 'hidden'.
609
625
  */
610
- export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screenContent, status, cliId, displayMode = 'hidden', cardNonce, imageKey, adoptMode, showTakeover, locale, usageLimit, writableTerminalUrl, localCliReady = false) {
626
+ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screenContent, status, cliId, displayMode = 'hidden', cardNonce, imageKey, adoptMode, showTakeover, locale, usageLimit, writableTerminalUrl, localCliReady = false, usage) {
611
627
  const effectiveCliId = cliId ?? 'claude-code';
612
628
  const cliName = getCliDisplayName(effectiveCliId);
613
629
  const actionBase = { root_id: rootId, session_id: sessionId, cli_id: effectiveCliId, ...(cardNonce ? { card_nonce: cardNonce } : {}) };
614
630
  const displayStatus = status === 'limited' && usageLimit?.retryReady ? 'retry_ready' : status;
615
631
  const elements = [];
616
632
  // ── Output body (shared with the private snapshot card) ──────────────────
617
- pushStreamBody(elements, { status, usageLimit, displayMode, imageKey, cliName, locale });
633
+ pushStreamBody(elements, { status, usageLimit, displayMode, imageKey, cliName, locale, usage });
618
634
  // ── Main control row: display toggle, mode toggle, terminal, manage ─────
619
635
  const headerActions = [];
620
636
  headerActions.push({
@@ -639,12 +655,14 @@ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screen
639
655
  value: { action: 'refresh_screenshot', ...actionBase },
640
656
  });
641
657
  }
642
- headerActions.push({
643
- tag: 'button',
644
- text: { tag: 'plain_text', content: t('card.btn.open_terminal', undefined, locale) },
645
- type: 'primary',
646
- multi_url: terminalMultiUrl(terminalUrl),
647
- });
658
+ if (terminalUrl) {
659
+ headerActions.push({
660
+ tag: 'button',
661
+ text: { tag: 'plain_text', content: t('card.btn.open_terminal', undefined, locale) },
662
+ type: 'primary',
663
+ multi_url: terminalMultiUrl(terminalUrl),
664
+ });
665
+ }
648
666
  const localBtn = cliId ? localCliButton(effectiveCliId, actionBase, locale, localCliReady) : undefined;
649
667
  if (localBtn)
650
668
  headerActions.push(localBtn);
@@ -656,12 +674,14 @@ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screen
656
674
  value: { action: 'retry_last_task', ...actionBase },
657
675
  });
658
676
  }
659
- headerActions.push({
660
- tag: 'button',
661
- text: { tag: 'plain_text', content: t('card.btn.get_write_link', undefined, locale) },
662
- type: 'default',
663
- value: { action: 'get_write_link', ...actionBase },
664
- });
677
+ if (terminalUrl) {
678
+ headerActions.push({
679
+ tag: 'button',
680
+ text: { tag: 'plain_text', content: t('card.btn.get_write_link', undefined, locale) },
681
+ type: 'default',
682
+ value: { action: 'get_write_link', ...actionBase },
683
+ });
684
+ }
665
685
  if (adoptMode) {
666
686
  if (showTakeover) {
667
687
  headerActions.push({
@@ -744,9 +764,8 @@ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screen
744
764
  * Build a static "private snapshot" card for `/card` in private mode — sent via
745
765
  * the ephemeral API to one user at a time. Unlike {@link buildStreamingCard} it
746
766
  * is **never PATCH-updated** (ephemeral cards can't be), so it carries only a
747
- * one-shot snapshot of the terminal screenshot plus three buttons:
748
- * • read-only "open terminal" link (a plain URL button — no callback);
749
- * • "get write link", whose callback DMs the writable link to the clicker;
767
+ * one-shot snapshot of the terminal screenshot plus controls:
768
+ * • when available, a read-only "open terminal" link and "get write link";
750
769
  * • "close session", whose callback kills the session and (in private mode)
751
770
  * sends the "closed" card ephemeral to the owner audience too — so the
752
771
  * session title / CLI name / workingDir on it don't leak to the group.
@@ -789,32 +808,33 @@ export function buildPrivateSnapshotCard(terminalUrl, title, status, cliId, imag
789
808
  elements.push({ tag: 'hr' });
790
809
  }
791
810
  }
792
- elements.push({
793
- tag: 'action',
794
- actions: [
795
- {
796
- tag: 'button',
797
- text: { tag: 'plain_text', content: t('card.btn.open_terminal', undefined, locale) },
798
- type: 'primary',
799
- multi_url: terminalMultiUrl(terminalUrl),
800
- },
801
- {
802
- tag: 'button',
803
- text: { tag: 'plain_text', content: t('card.btn.get_write_link', undefined, locale) },
804
- type: 'default',
805
- value: { action: 'get_write_link', ...actionBase },
806
- },
807
- {
808
- tag: 'button',
809
- text: { tag: 'plain_text', content: t('card.btn.close_session', undefined, locale) },
810
- type: 'danger',
811
- value: { action: 'close', ...actionBase },
812
- },
813
- ],
811
+ const actions = [];
812
+ if (terminalUrl) {
813
+ actions.push({
814
+ tag: 'button',
815
+ text: { tag: 'plain_text', content: t('card.btn.open_terminal', undefined, locale) },
816
+ type: 'primary',
817
+ multi_url: terminalMultiUrl(terminalUrl),
818
+ }, {
819
+ tag: 'button',
820
+ text: { tag: 'plain_text', content: t('card.btn.get_write_link', undefined, locale) },
821
+ type: 'default',
822
+ value: { action: 'get_write_link', ...actionBase },
823
+ });
824
+ }
825
+ actions.push({
826
+ tag: 'button',
827
+ text: { tag: 'plain_text', content: t('card.btn.close_session', undefined, locale) },
828
+ type: 'danger',
829
+ value: { action: 'close', ...actionBase },
814
830
  });
831
+ elements.push({ tag: 'action', actions });
815
832
  elements.push({
816
833
  tag: 'note',
817
- elements: [{ tag: 'lark_md', content: t('card.private.snapshot_note', undefined, locale) }],
834
+ elements: [{
835
+ tag: 'lark_md',
836
+ content: t(terminalUrl ? 'card.private.snapshot_note' : 'card.private.snapshot_note_no_terminal', undefined, locale),
837
+ }],
818
838
  });
819
839
  const card = {
820
840
  config: { wide_screen_mode: true },
@@ -1086,8 +1106,7 @@ export function buildRepoSelectCard(projects, currentPath, rootMessageId, locale
1086
1106
  };
1087
1107
  return JSON.stringify(card);
1088
1108
  }
1089
- /** 授权卡片:正文 @owner,三枚按钮各带 action + 上下文 + nonce。
1090
- * 多目标共用一张卡,按钮 value 带 target_open_ids 数组,owner 点一次范围套用到全部。 */
1109
+ /** 授权卡片:有效期与消息额度并列展示,owner 一次提交两项限制。 */
1091
1110
  export function buildGrantCard(o, locale) {
1092
1111
  const names = o.targets.map(t => `**${escapeMd(t.name)}**`).join('、');
1093
1112
  const single = o.targets[0];
@@ -1096,27 +1115,129 @@ export function buildGrantCard(o, locale) {
1096
1115
  : o.targets.length > 1
1097
1116
  ? t('card.grant.body_owner_multi', { names, owner: o.ownerOpenId }, locale)
1098
1117
  : t('card.grant.body_owner', { name: escapeMd(single?.name ?? ''), owner: o.ownerOpenId }, locale);
1099
- // target_names target_open_ids 同序:授权成功后据此把目标登记进 observed 花名册
1100
- // (/grant @bot 成功后顺带「认识」对方,等价内部跑一次 /introduce)。
1101
- const v = { target_open_ids: o.targets.map(t => t.openId), target_names: o.targets.map(t => t.name), chat_id: o.chatId, nonce: o.nonce };
1102
- // 「全局授权对话」只在 owner 主动发卡时出现:owner 一眼明确要给全局;request 模式(成员
1103
- // 自助申请)只提供「本群」,避免成员把自己申请到全局。两个授权按钮都是 talk-only。
1118
+ const durationMs = o.durationMs ?? DEFAULT_GRANT_DURATION_MS;
1119
+ // 夹取到卡片可提交区间:历史 messageQuota.defaultLimit(parser 无上限)若 >MAX,
1120
+ // 直接透传会让初值超过 normalize 上限 owner 一点授权就报「参数无效」发不出。
1121
+ const quota = clampGrantQuotaForCard(o.quota ?? DEFAULT_GRANT_QUOTA);
1122
+ // target_names 与 target_open_ids 同序:授权成功后据此把目标登记进 observed 花名册。
1123
+ const v = {
1124
+ target_open_ids: o.targets.map(t => t.openId),
1125
+ target_names: o.targets.map(t => t.name),
1126
+ chat_id: o.chatId,
1127
+ nonce: o.nonce,
1128
+ mode: o.mode,
1129
+ };
1130
+ const button = (action, text, type) => ({
1131
+ tag: 'button',
1132
+ type,
1133
+ text: { tag: 'plain_text', content: text },
1134
+ name: action,
1135
+ // v2(schema 2.0)卡片的表单提交按钮用 action_type: 'form_submit'(与本文件其它 2.0 表单
1136
+ // 一致,也是本卡最初 live 验证过的写法)。曾一度改成 v2 的 form_action_type: 'submit'(见
1137
+ // 授权卡 UI 并排布局那次),实测点击授权按钮无任何反应——callback 不触发。故钉回 form_submit。
1138
+ action_type: 'form_submit',
1139
+ value: { action, ...v },
1140
+ });
1104
1141
  const grantButtons = [
1105
- { tag: 'button', type: 'primary', text: { tag: 'plain_text', content: t('card.grant.btn_chat', undefined, locale) }, value: { action: 'grant_chat', ...v } },
1142
+ button('grant_chat', t('card.grant.btn_chat', undefined, locale), 'primary'),
1106
1143
  ];
1107
1144
  if (o.mode === 'owner') {
1108
- grantButtons.push({ tag: 'button', type: 'default', text: { tag: 'plain_text', content: t('card.grant.btn_global', undefined, locale) }, value: { action: 'grant_global', ...v } });
1145
+ grantButtons.push(button('grant_global', t('card.grant.btn_global', undefined, locale), 'default'));
1109
1146
  }
1110
- grantButtons.push({ tag: 'button', type: 'danger', text: { tag: 'plain_text', content: t('card.grant.btn_deny', undefined, locale) }, value: { action: 'grant_deny', ...v } });
1147
+ grantButtons.push(button('grant_deny', t('card.grant.btn_deny', undefined, locale), 'danger'));
1111
1148
  const card = {
1112
- config: { wide_screen_mode: true },
1113
- header: { template: 'orange', title: { tag: 'plain_text', content: t('card.grant.title', undefined, locale) } },
1114
- elements: [
1115
- { tag: 'div', text: { tag: 'lark_md', content: body } },
1116
- { tag: 'hr' },
1117
- { tag: 'action', actions: grantButtons },
1118
- { tag: 'note', elements: [{ tag: 'lark_md', content: t('card.grant.note', undefined, locale) }] },
1119
- ],
1149
+ schema: '2.0',
1150
+ config: { update_multi: true, width_mode: 'default' },
1151
+ header: {
1152
+ template: 'orange',
1153
+ title: { tag: 'plain_text', content: t('card.grant.title', undefined, locale) },
1154
+ },
1155
+ body: {
1156
+ direction: 'vertical',
1157
+ padding: '12px 12px 20px 12px',
1158
+ vertical_spacing: 'medium',
1159
+ elements: [
1160
+ { tag: 'markdown', content: body },
1161
+ {
1162
+ tag: 'form',
1163
+ name: 'grant_limits_form',
1164
+ vertical_spacing: 'large',
1165
+ elements: [
1166
+ {
1167
+ tag: 'column_set',
1168
+ flex_mode: 'bisect',
1169
+ horizontal_spacing: 'medium',
1170
+ columns: [
1171
+ {
1172
+ tag: 'column',
1173
+ width: 'weighted',
1174
+ weight: 1,
1175
+ vertical_spacing: 'small',
1176
+ elements: [
1177
+ {
1178
+ tag: 'markdown',
1179
+ content: `**${t('card.grant.duration_label', undefined, locale)}**`,
1180
+ },
1181
+ {
1182
+ tag: 'select_static',
1183
+ name: 'grant_duration',
1184
+ width: 'fill',
1185
+ initial_option: String(durationMs),
1186
+ placeholder: { tag: 'plain_text', content: t('card.grant.duration_label', undefined, locale) },
1187
+ options: [
1188
+ ...GRANT_DURATION_OPTIONS.map(ms => ({
1189
+ text: { tag: 'plain_text', content: t(`card.grant.duration_${ms}`, undefined, locale) },
1190
+ value: String(ms),
1191
+ })),
1192
+ {
1193
+ text: { tag: 'plain_text', content: t('card.grant.duration_permanent', undefined, locale) },
1194
+ value: 'permanent',
1195
+ },
1196
+ ],
1197
+ },
1198
+ ],
1199
+ },
1200
+ {
1201
+ tag: 'column',
1202
+ width: 'weighted',
1203
+ weight: 1,
1204
+ vertical_spacing: 'small',
1205
+ elements: [
1206
+ {
1207
+ tag: 'markdown',
1208
+ content: `**${t('card.grant.quota_label', undefined, locale)}**`,
1209
+ },
1210
+ {
1211
+ tag: 'input',
1212
+ name: 'grant_quota',
1213
+ width: 'fill',
1214
+ default_value: quota === undefined ? '' : String(quota),
1215
+ placeholder: { tag: 'plain_text', content: t('card.grant.quota_placeholder', undefined, locale) },
1216
+ },
1217
+ ],
1218
+ },
1219
+ ],
1220
+ },
1221
+ {
1222
+ tag: 'column_set',
1223
+ flex_mode: 'none',
1224
+ horizontal_spacing: 'small',
1225
+ columns: grantButtons.map(action => ({
1226
+ tag: 'column',
1227
+ width: 'auto',
1228
+ vertical_align: 'center',
1229
+ elements: [action],
1230
+ })),
1231
+ },
1232
+ ],
1233
+ },
1234
+ {
1235
+ tag: 'markdown',
1236
+ text_size: 'notation',
1237
+ content: `<font color="grey">${t('card.grant.note', undefined, locale)}</font>`,
1238
+ },
1239
+ ],
1240
+ },
1120
1241
  };
1121
1242
  return JSON.stringify(card);
1122
1243
  }
@@ -1129,14 +1250,15 @@ export function buildGrantCard(o, locale) {
1129
1250
  * 能据 open_id 展示对方身份(远比裸 open_id 可读),代价是可能偶尔触发一次空会话(产品上可接受,
1130
1251
  * 且名字缺失是少数边角情况)。真人被 `<at>` 不会自动开会话。传 string/string[](无 isBot 信息)
1131
1252
  * 时按真人处理(@ 全部),保持旧调用方/单测兼容。 */
1132
- export function buildGrantNotifyCard(kind, target, locale, quota) {
1253
+ export function buildGrantNotifyCard(kind, target, locale, quota, expiresAt) {
1133
1254
  const entries = (Array.isArray(target) ? target : [target]).map(tt => typeof tt === 'string' ? { openId: tt, name: undefined, isBot: false } : tt);
1134
- const at = entries.map(e => e.isBot && e.name && e.name.length > 0
1135
- ? e.name // bot 有名字:纯文本,不 <at>(不唤醒对方)
1136
- : `<at id=${e.openId}></at>`).join(' ');
1255
+ const at = renderGrantAtMentions(entries);
1137
1256
  let content = t(kind === 'chat' ? 'card.grant.notify_chat' : 'card.grant.notify_global', { at }, locale);
1138
1257
  if (quota !== undefined && quota > 0)
1139
1258
  content += t('card.grant.notify_quota_suffix', { n: quota }, locale);
1259
+ if (expiresAt !== undefined) {
1260
+ content += t('card.grant.notify_expiry_suffix', { time: formatGrantExpiry(expiresAt, locale) }, locale);
1261
+ }
1140
1262
  const card = {
1141
1263
  config: { wide_screen_mode: true },
1142
1264
  elements: [{ tag: 'div', text: { tag: 'lark_md', content } }],
@@ -1153,13 +1275,83 @@ export function buildQuotaExhaustedCard(targetOpenId, limit, locale) {
1153
1275
  };
1154
1276
  return JSON.stringify(card);
1155
1277
  }
1156
- /** 授权处置后的终态卡(无按钮,防重复点击)。 */
1157
- export function buildGrantResultCard(kind, locale) {
1158
- const key = kind === 'chat' ? 'card.grant.result_chat' : kind === 'global' ? 'card.grant.result_global' : 'card.grant.result_deny';
1278
+ /**
1279
+ * Reject card for `/adopt` (and Codex App / resume import) attempted while the
1280
+ * session is still on the first-spawn repo-select gate (`pendingRepo`). Adopt
1281
+ * attaches to an already-running CLI, so it cannot double as a way to finish
1282
+ * that gate: the two states are mutually exclusive by design. Rather than fold
1283
+ * the buffered repo-card messages into the takeover (complex + leaks botmux
1284
+ * envelopes into the external CLI), we refuse and offer a one-tap "close
1285
+ * session" so the user can retire the pending session and re-issue `/adopt`
1286
+ * cleanly. The close button reuses the shared `action: 'close'` handler; the
1287
+ * resulting closed card honours privateCard on its own.
1288
+ */
1289
+ export function buildAdoptBlockedCard(rootId, sessionId, cliId, locale) {
1290
+ const actionBase = { root_id: rootId, session_id: sessionId, cli_id: cliId ?? 'claude-code' };
1159
1291
  const card = {
1160
1292
  config: { wide_screen_mode: true },
1293
+ header: {
1294
+ title: { tag: 'plain_text', content: t('card.adopt_blocked.title', undefined, locale) },
1295
+ template: 'orange',
1296
+ },
1297
+ elements: [
1298
+ { tag: 'markdown', content: t('card.adopt_blocked.body', undefined, locale) },
1299
+ {
1300
+ tag: 'action',
1301
+ actions: [
1302
+ {
1303
+ tag: 'button',
1304
+ text: { tag: 'plain_text', content: t('card.btn.close_session', undefined, locale) },
1305
+ type: 'danger',
1306
+ value: { action: 'close', ...actionBase },
1307
+ },
1308
+ ],
1309
+ },
1310
+ ],
1311
+ };
1312
+ return JSON.stringify(card);
1313
+ }
1314
+ /** 授权处置后的终态卡(无按钮,防重复点击)。 */
1315
+ function formatGrantExpiry(expiresAt, locale) {
1316
+ return new Date(expiresAt).toLocaleString(locale === 'en' ? 'en-US' : 'zh-CN', { hour12: false });
1317
+ }
1318
+ function renderGrantAtMentions(target) {
1319
+ const entries = (Array.isArray(target) ? target : [target]).map(tt => typeof tt === 'string' ? { openId: tt, name: undefined, isBot: false } : tt);
1320
+ return entries.map(e => e.isBot && e.name && e.name.length > 0
1321
+ ? e.name
1322
+ : `<at id=${e.openId}></at>`).join(' ');
1323
+ }
1324
+ /** 授权处置后的终态卡(无按钮,防重复点击)。授权成功(chat/global)时**就地 patch 原卡**即为
1325
+ * 此卡:正文直接 @ 被授权人 + 额度/有效期,一张卡既是结果态又 ping 到 ta,无需再单独发通知卡或
1326
+ * 撤回原卡(见申晗 2026-07-31 反馈)。deny 或无 targets 时回落到不带 @ 的简单状态文案。 */
1327
+ export function buildGrantResultCard(kind, locale, quota, expiresAt, targets) {
1328
+ let content;
1329
+ const at = targets !== undefined ? renderGrantAtMentions(targets) : '';
1330
+ if (kind !== 'deny' && at) {
1331
+ // 授权成功且有被授权人:复用 notify 文案({at} 已获授权,发消息 @ 我即可 + 额度/有效期后缀),
1332
+ // 让就地 patch 的原卡直接把授权成功通知 + @ping 合为一张。
1333
+ content = t(kind === 'chat' ? 'card.grant.notify_chat' : 'card.grant.notify_global', { at }, locale);
1334
+ if (quota !== undefined && quota > 0)
1335
+ content += t('card.grant.notify_quota_suffix', { n: quota }, locale);
1336
+ if (expiresAt !== undefined)
1337
+ content += t('card.grant.notify_expiry_suffix', { time: formatGrantExpiry(expiresAt, locale) }, locale);
1338
+ }
1339
+ else {
1340
+ // deny / 无 targets 回落:简单状态态(无 @)。
1341
+ const key = kind === 'chat' ? 'card.grant.result_chat' : kind === 'global' ? 'card.grant.result_global' : 'card.grant.result_deny';
1342
+ content = t(key, undefined, locale);
1343
+ if (kind !== 'deny') {
1344
+ if (expiresAt !== undefined)
1345
+ content += `\n${t('card.grant.result_expiry', { time: formatGrantExpiry(expiresAt, locale) }, locale)}`;
1346
+ if (quota !== undefined)
1347
+ content += `\n${t('card.grant.result_quota', { n: quota }, locale)}`;
1348
+ }
1349
+ }
1350
+ const card = {
1351
+ schema: '2.0',
1352
+ config: { update_multi: true, width_mode: 'default' },
1161
1353
  header: { template: kind === 'deny' ? 'grey' : 'green', title: { tag: 'plain_text', content: t('card.grant.title', undefined, locale) } },
1162
- elements: [{ tag: 'div', text: { tag: 'lark_md', content: t(key, undefined, locale) } }],
1354
+ body: { elements: [{ tag: 'markdown', content }] },
1163
1355
  };
1164
1356
  return JSON.stringify(card);
1165
1357
  }
@@ -1296,6 +1488,23 @@ export function buildTuiPromptResolvedCard(selectedText, locale) {
1296
1488
  };
1297
1489
  return JSON.stringify(card);
1298
1490
  }
1491
+ /** Build a terminal failure state when worker/backend input was not confirmed. */
1492
+ export function buildTuiPromptFailedCard(message, locale) {
1493
+ const card = {
1494
+ config: { wide_screen_mode: true },
1495
+ header: {
1496
+ title: { tag: 'plain_text', content: t('card.status.failed', undefined, locale) },
1497
+ template: 'red',
1498
+ },
1499
+ elements: [
1500
+ {
1501
+ tag: 'div',
1502
+ text: { tag: 'lark_md', content: escapeMd(message) },
1503
+ },
1504
+ ],
1505
+ };
1506
+ return JSON.stringify(card);
1507
+ }
1299
1508
  // ─── Adopt cards ─────────────────────────────────────────────────────────────
1300
1509
  function formatDuration(ms) {
1301
1510
  const s = Math.floor(ms / 1000);
@@ -1385,7 +1594,18 @@ targetScope = 'chat',
1385
1594
  * to p2p, or post-relay inbound routing misclassifies it as a group).
1386
1595
  * Authoritative from the /relay command's session chatType. Default 'group'
1387
1596
  * covers legacy cards rendered before this field existed. */
1388
- targetChatType = 'group') {
1597
+ targetChatType = 'group',
1598
+ /** When 'private', the card is (or will be) delivered as an ephemeral card
1599
+ * visible only to the invoker — so the session title / source-chat name never
1600
+ * leak to other group members. Baked into every button value as `visibility`
1601
+ * so the re-render handlers (select / page / search) know they must delete +
1602
+ * resend an ephemeral card instead of returning a body for Lark to patch in
1603
+ * place (ephemeral cards can't be PATCH-updated). Default 'public' preserves
1604
+ * the legacy visible-to-all picker. Only ever set 'private' for flat chat-
1605
+ * scope 普通群 targets: ephemeral has no thread anchor, so command-handler
1606
+ * gates it on `targetScope === 'chat'` (thread-scope 话题群/话题 stay public
1607
+ * in-thread — see the gate comment there). p2p never goes ephemeral. */
1608
+ visibility = 'public') {
1389
1609
  const searchQuery = state?.searchQuery ?? '';
1390
1610
  const requestedPage = state?.page ?? 0;
1391
1611
  const selectedSessionId = state?.selectedSessionId;
@@ -1407,6 +1627,7 @@ targetChatType = 'group') {
1407
1627
  target_scope: targetScope,
1408
1628
  target_chat_type: targetChatType,
1409
1629
  invoker_open_id: invokerOpenId,
1630
+ visibility,
1410
1631
  search: searchQuery,
1411
1632
  page,
1412
1633
  selected: selectedSessionId ?? '',