botmux 2.107.0 → 2.108.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 (515) hide show
  1. package/README.en.md +17 -14
  2. package/README.md +19 -14
  3. package/dist/adapters/backend/sandbox.d.ts +3 -1
  4. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  5. package/dist/adapters/backend/sandbox.js +19 -3
  6. package/dist/adapters/backend/sandbox.js.map +1 -1
  7. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  8. package/dist/adapters/backend/tmux-backend.js +16 -1
  9. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  10. package/dist/adapters/backend/tmux-pipe-backend.d.ts +24 -15
  11. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/tmux-pipe-backend.js +75 -43
  13. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  14. package/dist/adapters/cli/genius.d.ts.map +1 -1
  15. package/dist/adapters/cli/genius.js +9 -15
  16. package/dist/adapters/cli/genius.js.map +1 -1
  17. package/dist/adapters/cli/grok.d.ts +73 -0
  18. package/dist/adapters/cli/grok.d.ts.map +1 -0
  19. package/dist/adapters/cli/grok.js +298 -0
  20. package/dist/adapters/cli/grok.js.map +1 -0
  21. package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
  22. package/dist/adapters/cli/oh-my-pi.js +133 -12
  23. package/dist/adapters/cli/oh-my-pi.js.map +1 -1
  24. package/dist/adapters/cli/registry.d.ts +2 -1
  25. package/dist/adapters/cli/registry.d.ts.map +1 -1
  26. package/dist/adapters/cli/registry.js +3 -1
  27. package/dist/adapters/cli/registry.js.map +1 -1
  28. package/dist/adapters/cli/shared-hints.d.ts +8 -4
  29. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  30. package/dist/adapters/cli/shared-hints.js +8 -4
  31. package/dist/adapters/cli/shared-hints.js.map +1 -1
  32. package/dist/adapters/cli/types.d.ts +18 -16
  33. package/dist/adapters/cli/types.d.ts.map +1 -1
  34. package/dist/adapters/hook-installer.d.ts +5 -4
  35. package/dist/adapters/hook-installer.d.ts.map +1 -1
  36. package/dist/adapters/hook-installer.js +42 -0
  37. package/dist/adapters/hook-installer.js.map +1 -1
  38. package/dist/cli/send-dispatch.d.ts +21 -0
  39. package/dist/cli/send-dispatch.d.ts.map +1 -1
  40. package/dist/cli/send-dispatch.js +159 -0
  41. package/dist/cli/send-dispatch.js.map +1 -1
  42. package/dist/cli/session-list-liveness.d.ts +22 -0
  43. package/dist/cli/session-list-liveness.d.ts.map +1 -0
  44. package/dist/cli/session-list-liveness.js +22 -0
  45. package/dist/cli/session-list-liveness.js.map +1 -0
  46. package/dist/cli.d.ts.map +1 -1
  47. package/dist/cli.js +182 -33
  48. package/dist/cli.js.map +1 -1
  49. package/dist/core/ask-types.d.ts +4 -0
  50. package/dist/core/ask-types.d.ts.map +1 -1
  51. package/dist/core/ask-types.js +10 -0
  52. package/dist/core/ask-types.js.map +1 -1
  53. package/dist/core/cost-calculator.d.ts.map +1 -1
  54. package/dist/core/cost-calculator.js +35 -13
  55. package/dist/core/cost-calculator.js.map +1 -1
  56. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  57. package/dist/core/dashboard-ipc-server.js +89 -16
  58. package/dist/core/dashboard-ipc-server.js.map +1 -1
  59. package/dist/core/dashboard-rows.d.ts.map +1 -1
  60. package/dist/core/dashboard-rows.js +6 -2
  61. package/dist/core/dashboard-rows.js.map +1 -1
  62. package/dist/core/dashboard-url.d.ts +6 -5
  63. package/dist/core/dashboard-url.d.ts.map +1 -1
  64. package/dist/core/dashboard-url.js +11 -8
  65. package/dist/core/dashboard-url.js.map +1 -1
  66. package/dist/core/maintenance.d.ts +11 -8
  67. package/dist/core/maintenance.d.ts.map +1 -1
  68. package/dist/core/maintenance.js +45 -20
  69. package/dist/core/maintenance.js.map +1 -1
  70. package/dist/core/per-bot-env.d.ts.map +1 -1
  71. package/dist/core/per-bot-env.js +4 -0
  72. package/dist/core/per-bot-env.js.map +1 -1
  73. package/dist/core/session-discovery.d.ts.map +1 -1
  74. package/dist/core/session-discovery.js +4 -0
  75. package/dist/core/session-discovery.js.map +1 -1
  76. package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
  77. package/dist/core/skills/cli-admin-command.js +8 -2
  78. package/dist/core/skills/cli-admin-command.js.map +1 -1
  79. package/dist/core/skills/im-command.d.ts.map +1 -1
  80. package/dist/core/skills/im-command.js +3 -1
  81. package/dist/core/skills/im-command.js.map +1 -1
  82. package/dist/core/skills/sources.d.ts +33 -1
  83. package/dist/core/skills/sources.d.ts.map +1 -1
  84. package/dist/core/skills/sources.js +97 -0
  85. package/dist/core/skills/sources.js.map +1 -1
  86. package/dist/core/skills/types.d.ts +8 -0
  87. package/dist/core/skills/types.d.ts.map +1 -1
  88. package/dist/core/terminal-url.d.ts.map +1 -1
  89. package/dist/core/terminal-url.js +12 -2
  90. package/dist/core/terminal-url.js.map +1 -1
  91. package/dist/core/terminal-write-auth.d.ts +34 -0
  92. package/dist/core/terminal-write-auth.d.ts.map +1 -0
  93. package/dist/core/terminal-write-auth.js +76 -0
  94. package/dist/core/terminal-write-auth.js.map +1 -0
  95. package/dist/core/tmux-recovery.d.ts +11 -0
  96. package/dist/core/tmux-recovery.d.ts.map +1 -0
  97. package/dist/core/tmux-recovery.js +19 -0
  98. package/dist/core/tmux-recovery.js.map +1 -0
  99. package/dist/core/types.d.ts +10 -4
  100. package/dist/core/types.d.ts.map +1 -1
  101. package/dist/core/types.js.map +1 -1
  102. package/dist/core/update-check.d.ts +2 -2
  103. package/dist/core/update-check.js +2 -2
  104. package/dist/core/worker-pool.d.ts +3 -0
  105. package/dist/core/worker-pool.d.ts.map +1 -1
  106. package/dist/core/worker-pool.js +70 -3
  107. package/dist/core/worker-pool.js.map +1 -1
  108. package/dist/daemon.d.ts.map +1 -1
  109. package/dist/daemon.js +15 -8
  110. package/dist/daemon.js.map +1 -1
  111. package/dist/dashboard/auth.d.ts +1 -1
  112. package/dist/dashboard/auth.d.ts.map +1 -1
  113. package/dist/dashboard/auth.js +7 -2
  114. package/dist/dashboard/auth.js.map +1 -1
  115. package/dist/dashboard/bot-payload.d.ts +3 -0
  116. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  117. package/dist/dashboard/bot-payload.js +3 -0
  118. package/dist/dashboard/bot-payload.js.map +1 -1
  119. package/dist/dashboard/connector-api.d.ts.map +1 -1
  120. package/dist/dashboard/connector-api.js +39 -13
  121. package/dist/dashboard/connector-api.js.map +1 -1
  122. package/dist/dashboard/history-senders.d.ts +37 -0
  123. package/dist/dashboard/history-senders.d.ts.map +1 -0
  124. package/dist/dashboard/history-senders.js +60 -0
  125. package/dist/dashboard/history-senders.js.map +1 -0
  126. package/dist/dashboard/roles-batch.d.ts +31 -0
  127. package/dist/dashboard/roles-batch.d.ts.map +1 -0
  128. package/dist/dashboard/roles-batch.js +87 -0
  129. package/dist/dashboard/roles-batch.js.map +1 -0
  130. package/dist/dashboard/settings-card-model.d.ts +4 -2
  131. package/dist/dashboard/settings-card-model.d.ts.map +1 -1
  132. package/dist/dashboard/settings-card-model.js +13 -5
  133. package/dist/dashboard/settings-card-model.js.map +1 -1
  134. package/dist/dashboard/settings-write-applier.d.ts +4 -1
  135. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  136. package/dist/dashboard/settings-write-applier.js +6 -1
  137. package/dist/dashboard/settings-write-applier.js.map +1 -1
  138. package/dist/dashboard/skill-install-request.d.ts +4 -0
  139. package/dist/dashboard/skill-install-request.d.ts.map +1 -1
  140. package/dist/dashboard/skill-install-request.js +11 -1
  141. package/dist/dashboard/skill-install-request.js.map +1 -1
  142. package/dist/dashboard/trigger-api.d.ts +9 -1
  143. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  144. package/dist/dashboard/trigger-api.js +48 -10
  145. package/dist/dashboard/trigger-api.js.map +1 -1
  146. package/dist/dashboard/web/app.d.ts.map +1 -1
  147. package/dist/dashboard/web/app.js +286 -271
  148. package/dist/dashboard/web/app.js.map +1 -1
  149. package/dist/dashboard/web/bot-defaults-page.d.ts +26 -0
  150. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  151. package/dist/dashboard/web/bot-defaults-page.js +1408 -12
  152. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  153. package/dist/dashboard/web/bot-defaults.d.ts +91 -4
  154. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  155. package/dist/dashboard/web/bot-defaults.js +43 -2141
  156. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  157. package/dist/dashboard/web/bot-onboarding.d.ts +6 -1
  158. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  159. package/dist/dashboard/web/bot-onboarding.js +261 -306
  160. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  161. package/dist/dashboard/web/connectors-page.d.ts +4 -0
  162. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  163. package/dist/dashboard/web/connectors-page.js +228 -48
  164. package/dist/dashboard/web/connectors-page.js.map +1 -1
  165. package/dist/dashboard/web/dashboard-api.d.ts +9 -0
  166. package/dist/dashboard/web/dashboard-api.d.ts.map +1 -0
  167. package/dist/dashboard/web/dashboard-api.js +18 -0
  168. package/dist/dashboard/web/dashboard-api.js.map +1 -0
  169. package/dist/dashboard/web/dashboard-components.d.ts +92 -0
  170. package/dist/dashboard/web/dashboard-components.d.ts.map +1 -0
  171. package/dist/dashboard/web/dashboard-components.js +250 -0
  172. package/dist/dashboard/web/dashboard-components.js.map +1 -0
  173. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  174. package/dist/dashboard/web/dashboard-routes.js +30 -183
  175. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  176. package/dist/dashboard/web/floating-scrollbars.d.ts +2 -0
  177. package/dist/dashboard/web/floating-scrollbars.d.ts.map +1 -0
  178. package/dist/dashboard/web/floating-scrollbars.js +264 -0
  179. package/dist/dashboard/web/floating-scrollbars.js.map +1 -0
  180. package/dist/dashboard/web/groups-api.d.ts +36 -0
  181. package/dist/dashboard/web/groups-api.d.ts.map +1 -0
  182. package/dist/dashboard/web/groups-api.js +44 -0
  183. package/dist/dashboard/web/groups-api.js.map +1 -0
  184. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  185. package/dist/dashboard/web/groups-page.js +746 -15
  186. package/dist/dashboard/web/groups-page.js.map +1 -1
  187. package/dist/dashboard/web/groups.d.ts +51 -18
  188. package/dist/dashboard/web/groups.d.ts.map +1 -1
  189. package/dist/dashboard/web/groups.js +145 -1096
  190. package/dist/dashboard/web/groups.js.map +1 -1
  191. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  192. package/dist/dashboard/web/i18n.js +545 -255
  193. package/dist/dashboard/web/i18n.js.map +1 -1
  194. package/dist/dashboard/web/insights-page.d.ts.map +1 -1
  195. package/dist/dashboard/web/insights-page.js +1047 -14
  196. package/dist/dashboard/web/insights-page.js.map +1 -1
  197. package/dist/dashboard/web/insights.d.ts +177 -7
  198. package/dist/dashboard/web/insights.d.ts.map +1 -1
  199. package/dist/dashboard/web/insights.js +187 -1926
  200. package/dist/dashboard/web/insights.js.map +1 -1
  201. package/dist/dashboard/web/legacy-workflow-page.d.ts +3 -0
  202. package/dist/dashboard/web/legacy-workflow-page.d.ts.map +1 -0
  203. package/dist/dashboard/web/legacy-workflow-page.js +717 -0
  204. package/dist/dashboard/web/legacy-workflow-page.js.map +1 -0
  205. package/dist/dashboard/web/monitor-room.d.ts.map +1 -1
  206. package/dist/dashboard/web/monitor-room.js +10 -8
  207. package/dist/dashboard/web/monitor-room.js.map +1 -1
  208. package/dist/dashboard/web/monitoring-page.d.ts.map +1 -1
  209. package/dist/dashboard/web/monitoring-page.js +188 -14
  210. package/dist/dashboard/web/monitoring-page.js.map +1 -1
  211. package/dist/dashboard/web/office-page.d.ts.map +1 -1
  212. package/dist/dashboard/web/office-page.js +11 -23
  213. package/dist/dashboard/web/office-page.js.map +1 -1
  214. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  215. package/dist/dashboard/web/overview-page.js +141 -147
  216. package/dist/dashboard/web/overview-page.js.map +1 -1
  217. package/dist/dashboard/web/overview.d.ts +0 -1
  218. package/dist/dashboard/web/overview.d.ts.map +1 -1
  219. package/dist/dashboard/web/overview.js +3 -275
  220. package/dist/dashboard/web/overview.js.map +1 -1
  221. package/dist/dashboard/web/preferences.d.ts +1 -6
  222. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  223. package/dist/dashboard/web/preferences.js +0 -21
  224. package/dist/dashboard/web/preferences.js.map +1 -1
  225. package/dist/dashboard/web/role-batch.d.ts +9 -0
  226. package/dist/dashboard/web/role-batch.d.ts.map +1 -0
  227. package/dist/dashboard/web/role-batch.js +42 -0
  228. package/dist/dashboard/web/role-batch.js.map +1 -0
  229. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  230. package/dist/dashboard/web/roles-page.js +538 -13
  231. package/dist/dashboard/web/roles-page.js.map +1 -1
  232. package/dist/dashboard/web/roles.d.ts +98 -1
  233. package/dist/dashboard/web/roles.d.ts.map +1 -1
  234. package/dist/dashboard/web/roles.js +117 -903
  235. package/dist/dashboard/web/roles.js.map +1 -1
  236. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  237. package/dist/dashboard/web/schedules-page.js +82 -24
  238. package/dist/dashboard/web/schedules-page.js.map +1 -1
  239. package/dist/dashboard/web/sessions-kanban.d.ts +67 -0
  240. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -0
  241. package/dist/dashboard/web/sessions-kanban.js +481 -0
  242. package/dist/dashboard/web/sessions-kanban.js.map +1 -0
  243. package/dist/dashboard/web/sessions-page.d.ts +4 -0
  244. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  245. package/dist/dashboard/web/sessions-page.js +1633 -18
  246. package/dist/dashboard/web/sessions-page.js.map +1 -1
  247. package/dist/dashboard/web/sessions.d.ts +45 -4
  248. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  249. package/dist/dashboard/web/sessions.js +53 -2535
  250. package/dist/dashboard/web/sessions.js.map +1 -1
  251. package/dist/dashboard/web/settings-page.d.ts +0 -2
  252. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  253. package/dist/dashboard/web/settings-page.js +127 -117
  254. package/dist/dashboard/web/settings-page.js.map +1 -1
  255. package/dist/dashboard/web/skills-page.d.ts +10 -1
  256. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  257. package/dist/dashboard/web/skills-page.js +235 -93
  258. package/dist/dashboard/web/skills-page.js.map +1 -1
  259. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  260. package/dist/dashboard/web/team-federation-page.js +446 -28
  261. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  262. package/dist/dashboard/web/team-federation.d.ts +91 -2
  263. package/dist/dashboard/web/team-federation.d.ts.map +1 -1
  264. package/dist/dashboard/web/team-federation.js +87 -474
  265. package/dist/dashboard/web/team-federation.js.map +1 -1
  266. package/dist/dashboard/web/theme-menu.d.ts +1 -0
  267. package/dist/dashboard/web/theme-menu.d.ts.map +1 -1
  268. package/dist/dashboard/web/theme-menu.js +79 -20
  269. package/dist/dashboard/web/theme-menu.js.map +1 -1
  270. package/dist/dashboard/web/ui.d.ts +1 -2
  271. package/dist/dashboard/web/ui.d.ts.map +1 -1
  272. package/dist/dashboard/web/ui.js +8 -20
  273. package/dist/dashboard/web/ui.js.map +1 -1
  274. package/dist/dashboard/web/v3-api.d.ts +16 -0
  275. package/dist/dashboard/web/v3-api.d.ts.map +1 -0
  276. package/dist/dashboard/web/v3-api.js +21 -0
  277. package/dist/dashboard/web/v3-api.js.map +1 -0
  278. package/dist/dashboard/web/v3-components.d.ts +2 -0
  279. package/dist/dashboard/web/v3-components.d.ts.map +1 -0
  280. package/dist/dashboard/web/v3-components.js +290 -0
  281. package/dist/dashboard/web/v3-components.js.map +1 -0
  282. package/dist/dashboard/web/v3-model.d.ts +80 -0
  283. package/dist/dashboard/web/v3-model.d.ts.map +1 -0
  284. package/dist/dashboard/web/v3-model.js +240 -0
  285. package/dist/dashboard/web/v3-model.js.map +1 -0
  286. package/dist/dashboard/web/v3-page.d.ts.map +1 -1
  287. package/dist/dashboard/web/v3-page.js +2 -22
  288. package/dist/dashboard/web/v3-page.js.map +1 -1
  289. package/dist/dashboard/web/v3-terminal.d.ts +14 -0
  290. package/dist/dashboard/web/v3-terminal.d.ts.map +1 -1
  291. package/dist/dashboard/web/v3-terminal.js +31 -19
  292. package/dist/dashboard/web/v3-terminal.js.map +1 -1
  293. package/dist/dashboard/web/webhook-logs-page.d.ts +16 -0
  294. package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -0
  295. package/dist/dashboard/web/webhook-logs-page.js +195 -0
  296. package/dist/dashboard/web/webhook-logs-page.js.map +1 -0
  297. package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -1
  298. package/dist/dashboard/web/whiteboards-page.js +18 -23
  299. package/dist/dashboard/web/whiteboards-page.js.map +1 -1
  300. package/dist/dashboard/web/workflow-version-switch.d.ts +8 -0
  301. package/dist/dashboard/web/workflow-version-switch.d.ts.map +1 -0
  302. package/dist/dashboard/web/workflow-version-switch.js +9 -0
  303. package/dist/dashboard/web/workflow-version-switch.js.map +1 -0
  304. package/dist/dashboard/web/workflows.d.ts +272 -1
  305. package/dist/dashboard/web/workflows.d.ts.map +1 -1
  306. package/dist/dashboard/web/workflows.js +211 -1397
  307. package/dist/dashboard/web/workflows.js.map +1 -1
  308. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  309. package/dist/dashboard/webhook-routes.js +92 -39
  310. package/dist/dashboard/webhook-routes.js.map +1 -1
  311. package/dist/dashboard-web/app.js +1 -65
  312. package/dist/dashboard-web/brand-logo.png +0 -0
  313. package/dist/dashboard-web/chunks/bot-defaults-page-HSQ6HR3R.js +1 -0
  314. package/dist/dashboard-web/chunks/chunk-6TPODDDC.js +1 -0
  315. package/dist/dashboard-web/chunks/chunk-73EJP2MO.js +1 -0
  316. package/dist/dashboard-web/chunks/chunk-BRTZFELS.js +1 -0
  317. package/dist/dashboard-web/chunks/chunk-EVK77ASG.js +1 -0
  318. package/dist/dashboard-web/chunks/chunk-R3FXBFQH.js +1 -0
  319. package/dist/dashboard-web/chunks/chunk-VRLL7SNU.js +1 -0
  320. package/dist/dashboard-web/chunks/chunk-XCPSHD3G.js +37 -0
  321. package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
  322. package/dist/dashboard-web/chunks/chunk-YVRWYGXR.js +1 -0
  323. package/dist/dashboard-web/chunks/chunk-ZJING6FY.js +66 -0
  324. package/dist/dashboard-web/chunks/connectors-page-ODUA5UCW.js +1 -0
  325. package/dist/dashboard-web/chunks/groups-page-OYX5M6NK.js +8 -0
  326. package/dist/dashboard-web/chunks/insights-page-YCQO6OCR.js +22 -0
  327. package/dist/dashboard-web/chunks/legacy-workflow-page-XJAUNONP.js +2 -0
  328. package/dist/dashboard-web/chunks/{monitor-room-RFX4HPS5.js → monitor-room-WTZNYAFV.js} +17 -15
  329. package/dist/dashboard-web/chunks/monitoring-page-R6LJUK7G.js +2 -0
  330. package/dist/dashboard-web/chunks/office-page-4OXK3GNR.js +1 -0
  331. package/dist/dashboard-web/chunks/overview-page-4MVEJY6U.js +1 -0
  332. package/dist/dashboard-web/chunks/roles-page-NQDW27VV.js +1 -0
  333. package/dist/dashboard-web/chunks/schedules-page-JRNKYHOX.js +1 -0
  334. package/dist/dashboard-web/chunks/sessions-page-LF7UVI7B.js +3 -0
  335. package/dist/dashboard-web/chunks/settings-page-WGW7KQQS.js +2 -0
  336. package/dist/dashboard-web/chunks/skills-page-AMD4XP3T.js +3 -0
  337. package/dist/dashboard-web/chunks/team-federation-page-SYG3K4GG.js +1 -0
  338. package/dist/dashboard-web/chunks/v3-page-6NFFWNUK.js +94 -0
  339. package/dist/dashboard-web/chunks/whiteboards-page-FBRUK2AS.js +1 -0
  340. package/dist/dashboard-web/favicon.png +0 -0
  341. package/dist/dashboard-web/index.html +5 -69
  342. package/dist/dashboard-web/style.css +18835 -7211
  343. package/dist/dashboard.js +150 -32
  344. package/dist/dashboard.js.map +1 -1
  345. package/dist/global-config.d.ts +2 -2
  346. package/dist/global-config.d.ts.map +1 -1
  347. package/dist/i18n/en.d.ts.map +1 -1
  348. package/dist/i18n/en.js +3 -0
  349. package/dist/i18n/en.js.map +1 -1
  350. package/dist/i18n/zh.d.ts.map +1 -1
  351. package/dist/i18n/zh.js +3 -0
  352. package/dist/i18n/zh.js.map +1 -1
  353. package/dist/im/lark/card-builder.d.ts +7 -5
  354. package/dist/im/lark/card-builder.d.ts.map +1 -1
  355. package/dist/im/lark/card-builder.js +10 -7
  356. package/dist/im/lark/card-builder.js.map +1 -1
  357. package/dist/im/lark/card-handler.d.ts.map +1 -1
  358. package/dist/im/lark/card-handler.js +25 -1
  359. package/dist/im/lark/card-handler.js.map +1 -1
  360. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  361. package/dist/im/lark/event-dispatcher.js +84 -0
  362. package/dist/im/lark/event-dispatcher.js.map +1 -1
  363. package/dist/platform/binding.d.ts +9 -0
  364. package/dist/platform/binding.d.ts.map +1 -1
  365. package/dist/platform/binding.js +14 -0
  366. package/dist/platform/binding.js.map +1 -1
  367. package/dist/platform/tunnel-client.d.ts.map +1 -1
  368. package/dist/platform/tunnel-client.js +9 -0
  369. package/dist/platform/tunnel-client.js.map +1 -1
  370. package/dist/services/bot-config-store.d.ts +1 -1
  371. package/dist/services/bot-config-store.d.ts.map +1 -1
  372. package/dist/services/bot-config-store.js +11 -5
  373. package/dist/services/bot-config-store.js.map +1 -1
  374. package/dist/services/file-bridge-path.d.ts +8 -0
  375. package/dist/services/file-bridge-path.d.ts.map +1 -0
  376. package/dist/services/file-bridge-path.js +75 -0
  377. package/dist/services/file-bridge-path.js.map +1 -0
  378. package/dist/services/grok-paths.d.ts +27 -0
  379. package/dist/services/grok-paths.d.ts.map +1 -0
  380. package/dist/services/grok-paths.js +106 -0
  381. package/dist/services/grok-paths.js.map +1 -0
  382. package/dist/services/grok-transcript.d.ts +67 -0
  383. package/dist/services/grok-transcript.d.ts.map +1 -0
  384. package/dist/services/grok-transcript.js +630 -0
  385. package/dist/services/grok-transcript.js.map +1 -0
  386. package/dist/services/hermes-session-filter.d.ts +28 -0
  387. package/dist/services/hermes-session-filter.d.ts.map +1 -0
  388. package/dist/services/hermes-session-filter.js +53 -0
  389. package/dist/services/hermes-session-filter.js.map +1 -0
  390. package/dist/services/hermes-transcript.d.ts +3 -0
  391. package/dist/services/hermes-transcript.d.ts.map +1 -1
  392. package/dist/services/hermes-transcript.js +20 -2
  393. package/dist/services/hermes-transcript.js.map +1 -1
  394. package/dist/services/resumable-session-discovery.d.ts +3 -0
  395. package/dist/services/resumable-session-discovery.d.ts.map +1 -1
  396. package/dist/services/resumable-session-discovery.js +6 -1
  397. package/dist/services/resumable-session-discovery.js.map +1 -1
  398. package/dist/services/skill-registry-store.d.ts +9 -0
  399. package/dist/services/skill-registry-store.d.ts.map +1 -1
  400. package/dist/services/skill-registry-store.js +304 -1
  401. package/dist/services/skill-registry-store.js.map +1 -1
  402. package/dist/services/structured-bridge-clis.d.ts +29 -0
  403. package/dist/services/structured-bridge-clis.d.ts.map +1 -0
  404. package/dist/services/structured-bridge-clis.js +76 -0
  405. package/dist/services/structured-bridge-clis.js.map +1 -0
  406. package/dist/services/trigger-log-store.d.ts +59 -0
  407. package/dist/services/trigger-log-store.d.ts.map +1 -1
  408. package/dist/services/trigger-log-store.js +81 -10
  409. package/dist/services/trigger-log-store.js.map +1 -1
  410. package/dist/services/usage-ledger.d.ts +4 -1
  411. package/dist/services/usage-ledger.d.ts.map +1 -1
  412. package/dist/services/usage-ledger.js +48 -10
  413. package/dist/services/usage-ledger.js.map +1 -1
  414. package/dist/services/webhook-audit.d.ts +10 -0
  415. package/dist/services/webhook-audit.d.ts.map +1 -0
  416. package/dist/services/webhook-audit.js +116 -0
  417. package/dist/services/webhook-audit.js.map +1 -0
  418. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  419. package/dist/setup/bot-config-editor.js +2 -0
  420. package/dist/setup/bot-config-editor.js.map +1 -1
  421. package/dist/setup/ensure-tmux.d.ts +26 -12
  422. package/dist/setup/ensure-tmux.d.ts.map +1 -1
  423. package/dist/setup/ensure-tmux.js +85 -18
  424. package/dist/setup/ensure-tmux.js.map +1 -1
  425. package/dist/skills/definitions.d.ts.map +1 -1
  426. package/dist/skills/definitions.js +14 -1
  427. package/dist/skills/definitions.js.map +1 -1
  428. package/dist/skills/injection-mode.d.ts +16 -0
  429. package/dist/skills/injection-mode.d.ts.map +1 -1
  430. package/dist/skills/injection-mode.js +25 -0
  431. package/dist/skills/injection-mode.js.map +1 -1
  432. package/dist/types.d.ts +9 -0
  433. package/dist/types.d.ts.map +1 -1
  434. package/dist/utils/global-install.d.ts +22 -0
  435. package/dist/utils/global-install.d.ts.map +1 -0
  436. package/dist/utils/global-install.js +106 -0
  437. package/dist/utils/global-install.js.map +1 -0
  438. package/dist/utils/install-diagnostics.d.ts +1 -1
  439. package/dist/utils/install-diagnostics.d.ts.map +1 -1
  440. package/dist/utils/install-diagnostics.js +6 -4
  441. package/dist/utils/install-diagnostics.js.map +1 -1
  442. package/dist/utils/install-info.d.ts +2 -0
  443. package/dist/utils/install-info.d.ts.map +1 -1
  444. package/dist/utils/install-info.js +10 -4
  445. package/dist/utils/install-info.js.map +1 -1
  446. package/dist/worker.js +293 -172
  447. package/dist/worker.js.map +1 -1
  448. package/dist/workflows/events/payloads.d.ts +10 -10
  449. package/dist/workflows/events/schema.d.ts +28 -28
  450. package/package.json +8 -7
  451. package/dist/dashboard/web/connectors.d.ts +0 -2
  452. package/dist/dashboard/web/connectors.d.ts.map +0 -1
  453. package/dist/dashboard/web/connectors.js +0 -2
  454. package/dist/dashboard/web/connectors.js.map +0 -1
  455. package/dist/dashboard/web/office.d.ts +0 -2
  456. package/dist/dashboard/web/office.d.ts.map +0 -1
  457. package/dist/dashboard/web/office.js +0 -2
  458. package/dist/dashboard/web/office.js.map +0 -1
  459. package/dist/dashboard/web/schedules.d.ts +0 -2
  460. package/dist/dashboard/web/schedules.d.ts.map +0 -1
  461. package/dist/dashboard/web/schedules.js +0 -2
  462. package/dist/dashboard/web/schedules.js.map +0 -1
  463. package/dist/dashboard/web/settings.d.ts +0 -2
  464. package/dist/dashboard/web/settings.d.ts.map +0 -1
  465. package/dist/dashboard/web/settings.js +0 -2
  466. package/dist/dashboard/web/settings.js.map +0 -1
  467. package/dist/dashboard/web/skills.d.ts +0 -2
  468. package/dist/dashboard/web/skills.d.ts.map +0 -1
  469. package/dist/dashboard/web/skills.js +0 -2
  470. package/dist/dashboard/web/skills.js.map +0 -1
  471. package/dist/dashboard/web/skin-intro.d.ts +0 -4
  472. package/dist/dashboard/web/skin-intro.d.ts.map +0 -1
  473. package/dist/dashboard/web/skin-intro.js +0 -49
  474. package/dist/dashboard/web/skin-intro.js.map +0 -1
  475. package/dist/dashboard/web/v3.d.ts +0 -3
  476. package/dist/dashboard/web/v3.d.ts.map +0 -1
  477. package/dist/dashboard/web/v3.js +0 -539
  478. package/dist/dashboard/web/v3.js.map +0 -1
  479. package/dist/dashboard/web/whiteboards.d.ts +0 -2
  480. package/dist/dashboard/web/whiteboards.d.ts.map +0 -1
  481. package/dist/dashboard/web/whiteboards.js +0 -2
  482. package/dist/dashboard/web/whiteboards.js.map +0 -1
  483. package/dist/dashboard-web/chunks/bot-defaults-page-OCIHPGEU.js +0 -438
  484. package/dist/dashboard-web/chunks/chunk-3N2PPQVD.js +0 -1
  485. package/dist/dashboard-web/chunks/chunk-3UJYRR2Q.js +0 -37
  486. package/dist/dashboard-web/chunks/chunk-5E3MJJL4.js +0 -1
  487. package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
  488. package/dist/dashboard-web/chunks/chunk-JTSE5VP6.js +0 -54
  489. package/dist/dashboard-web/chunks/chunk-LXIK7OUJ.js +0 -1
  490. package/dist/dashboard-web/chunks/chunk-PE6W3C2C.js +0 -1
  491. package/dist/dashboard-web/chunks/chunk-QW54DWU3.js +0 -325
  492. package/dist/dashboard-web/chunks/connectors-IGETYWCP.js +0 -1
  493. package/dist/dashboard-web/chunks/groups-page-MYBS4ZYJ.js +0 -207
  494. package/dist/dashboard-web/chunks/insights-page-UPA32V2S.js +0 -309
  495. package/dist/dashboard-web/chunks/monitoring-page-7T3BESZ2.js +0 -1
  496. package/dist/dashboard-web/chunks/office-page-6DXYOG55.js +0 -1
  497. package/dist/dashboard-web/chunks/overview-page-LJSBCQW4.js +0 -1
  498. package/dist/dashboard-web/chunks/roles-page-ESURTVQH.js +0 -98
  499. package/dist/dashboard-web/chunks/schedules-LML2ISOT.js +0 -1
  500. package/dist/dashboard-web/chunks/sessions-YB73XOTU.js +0 -1
  501. package/dist/dashboard-web/chunks/sessions-page-MCO5QR7Z.js +0 -1
  502. package/dist/dashboard-web/chunks/settings-page-OSDKNVS3.js +0 -2
  503. package/dist/dashboard-web/chunks/skills-page-PXBZJ6P6.js +0 -2
  504. package/dist/dashboard-web/chunks/team-federation-page-TTPVHFPX.js +0 -10
  505. package/dist/dashboard-web/chunks/v3-page-FVPUL665.js +0 -149
  506. package/dist/dashboard-web/chunks/whiteboards-page-HLCTYSSV.js +0 -1
  507. package/dist/dashboard-web/chunks/workflows-FCPM4S4D.js +0 -184
  508. package/dist/dashboard-web/skins/bluearchive-hero.webp +0 -0
  509. package/dist/dashboard-web/skins/dragonball-goku.webp +0 -0
  510. package/dist/dashboard-web/skins/dragonball-wukong.webp +0 -0
  511. package/dist/dashboard-web/skins/genshin-breeze.webp +0 -0
  512. package/dist/dashboard-web/skins/ikun-hero.webp +0 -0
  513. package/dist/dashboard-web/skins/prts-priestess.webp +0 -0
  514. package/dist/dashboard-web/skins/zzz-hero.webp +0 -0
  515. package/dist/dashboard-web/skins/zzz-pattern.svg +0 -25
@@ -0,0 +1,2 @@
1
+ import{a as Y}from"./chunk-73EJP2MO.js";import{a as wt,c as y}from"./chunk-BRTZFELS.js";import{c as mt,p as ft}from"./chunk-6TPODDDC.js";import{a as oe,d as ut}from"./chunk-ZJING6FY.js";import{c as V,t as p}from"./chunk-XCPSHD3G.js";var i=V(oe(),1);var pt=5e3,gt=2e3,se=new Set(["succeeded","failed","cancelled"]),vt=new Set(["antigravity","codex-app","cursor","mira"]),ie=new Set(["aiden","coco","claude-code","seed","relay","codex","mtr","hermes","pi","mir"]);function yt(t){let n=t.match(/^#\/legacy-workflow\/([^?#]+)(?:\?([^#]*))?$/);if(!n)return{kind:"list"};let a=new URLSearchParams(n[2]??"");return{kind:"detail",runId:decodeURIComponent(n[1]),focusAttemptId:a.get("attempt")??void 0}}function kt(){return[{value:"",label:p("workflow.filter.nonTerminal")},{value:"all",label:p("workflow.filter.all")},{value:"pending",label:S("pending")},{value:"running",label:S("running")},{value:"waiting",label:S("waiting")},{value:"succeeded",label:S("succeeded")},{value:"failed",label:S("failed")},{value:"cancelled",label:S("cancelled")}]}async function ht(t,n=fetch){let a=new URLSearchParams;t==="all"?a.set("all","1"):t&&a.set("status",t);let r=await n("/api/workflows/runs"+(a.toString()?`?${a}`:""));if(!r.ok)throw new Error(`HTTP ${r.status}`);return(await r.json()).runs??[]}async function z(t,n=fetch){let a=await n(`/api/workflows/runs/${encodeURIComponent(t)}/snapshot`);if(a.status===404)throw new Error(p("workflow.detail.unknownRun"));if(!a.ok)throw new Error(p("workflow.detail.snapshotHttp",{status:a.status}));return await a.json()}async function M(t,n,a=fetch){let r=await a(`/api/workflows/runs/${encodeURIComponent(t)}/events?${n}`);if(r.status===404)throw new Error(p("workflow.detail.unknownRun"));if(!r.ok)throw new Error(p("workflow.detail.eventsHttp",{status:r.status}));return await r.json()}async function St(t,n=fetch){let a=await n(`/api/workflows/runs/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"cancelled via dashboard"})});if(a.status===401)throw new Error(p("workflow.detail.writeAccessCancel"));let r=await a.json().catch(()=>({}));if(!a.ok||!r.ok)throw new Error(r.hint??r.error??p("workflow.detail.cancelHttp",{status:a.status}));return r}async function bt(t,n,a,r=fetch){let o=await r(`/api/workflows/runs/${encodeURIComponent(t)}/${n}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({comment:a})});if(o.status===401)throw new Error(p("workflow.detail.writeAccessApproval"));let s=await o.json().catch(()=>({}));if(!o.ok||!s.ok)throw new Error(s.hint??s.message??s.error??p("workflow.detail.actionHttp",{action:n,status:o.status}));return s}async function It(t,n,a,r=fetch){let o=await r(`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(n)}/${encodeURIComponent(a)}/resume`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})});if(o.status===401)throw new Error(p("workflow.detail.writeAccessResume"));let s=await o.json().catch(()=>({}));if(!o.ok||!s.ok||!s.resumeId||!s.url)throw new Error(s.hint??s.message??s.error??p("workflow.detail.resumeStartFailed",{status:o.status}));return{resumeId:s.resumeId,url:s.url}}async function Rt(t,n,a,r=fetch){let o=await r(`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(n)}/${encodeURIComponent(a)}/resume/end`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"ended_by_dashboard"})});if(o.status===401)throw new Error(p("workflow.detail.writeAccessResume"));let s=await o.json().catch(()=>({}));if(!o.ok||!s.ok){if(s.error==="resume_not_running")return{ended:!1,resumeNotRunning:!0};throw new Error(s.hint??s.message??s.error??p("workflow.detail.resumeEndFailed",{status:o.status}))}return{ended:!0,resumeNotRunning:!1}}function L(t){return se.has(t)}function S(t){let n=`workflow.status.${t}`,a=p(n);return a===n?t:a}function At(t){let n=new Date(t),a=Date.now()-t;return a<6e4?p("time.secondsAgo",{value:Math.max(1,Math.floor(a/1e3))}):a<36e5?p("time.minutesAgo",{value:Math.floor(a/6e4)}):a<864e5?p("time.hoursAgo",{value:Math.floor(a/36e5)}):n.toISOString().slice(0,19).replace("T"," ")}function Nt(t){let n=t.dangling;return{total:new Set([...n.activities,...n.effectAttempted,...n.waits,...n.cancels]).size,effects:n.effectAttempted.length,activities:n.activities.length,waits:n.waits.length,cancels:n.cancels.length}}function Ct(t,n){let a=new Map,r=new Map(n.activities.map(o=>[o.activityId,o.ownerNodeId]));for(let o of[...t].sort((s,d)=>T(s.eventId)-T(d.eventId))){let s=fe(o);if(!s)continue;let d=typeof s.activityId=="string"?s.activityId:void 0,m=typeof s.attemptId=="string"?s.attemptId:void 0;if(!d||!m)continue;let w=a.get(m);if(o.type==="attemptCreated"){let f=typeof s.attemptNumber=="number"?s.attemptNumber:void 0;w={nodeId:typeof s.nodeId=="string"?s.nodeId:r.get(d),activityId:d,attemptId:m,attemptNumber:f,status:"pending",startedAt:o.timestamp},a.set(m,w);continue}w||(w={nodeId:r.get(d),activityId:d,attemptId:m,status:"pending",startedAt:o.timestamp},a.set(m,w)),o.type==="activityRunning"?(w.status="running",w.runningAt=o.timestamp):o.type==="effectAttempted"?w.status="effectAttempting":o.type==="activityWaiting"||o.type==="waitCreated"?w.status="waiting":we(o.type)&&(w.status=pe(o.type),w.endedAt=o.timestamp,w.endType=o.type)}return[...a.values()]}function Et(t,n){let a=[];for(let s of t)a.push({time:s.startedAt,delta:1}),a.push({time:s.endedAt??n,delta:-1});a.sort((s,d)=>s.time-d.time||d.delta-s.delta);let r=0,o=0;for(let s of a)r+=s.delta,o=Math.max(o,r);return o}function xt(t){let n=new Map(t.activities.map(o=>[o.activityId,o])),a=new Set,r=[];for(let o of t.nodes){let s=(o.activityId?n.get(o.activityId):void 0)??t.activities.find(d=>d.ownerNodeId===o.nodeId);if(!s){r.push({key:`node:${o.nodeId}`,node:o});continue}a.add(s.activityId),r.push({key:`activity:${s.activityId}`,node:o,activity:s,io:t.attemptIO?.[O(s)?.attemptId??""]})}for(let o of t.activities)a.has(o.activityId)||r.push({key:`activity:${o.activityId}`,activity:o,io:t.attemptIO?.[O(o)?.attemptId??""]});return r}function O(t){return t?.attempts[t.attempts.length-1]}function Tt(t){return!!t&&t.status==="waiting"&&t.wait?.waitKind==="human-gate"&&!t.wait.resolution}function Lt(t){let{activity:n,attempt:a,resumeSession:r,runId:o,terminal:s}=t;if(!s||s.error)return null;if(le(a,s))return{kind:"live",url:ce(s,t.host)};if(!a||!n||!de(a,s))return null;let d=me(o,n.activityId,a.attemptId);return r?{kind:"resume",url:r.url,resumeId:r.resumeId,downloadUrl:d}:{kind:"replay",url:ue(o,n.activityId,a.attemptId,!!s.hasPtyLog),downloadUrl:d}}function Q(t){return t==="live"?p("workflow.detail.liveTerminal"):t==="resume"?p("workflow.detail.terminalResume"):p("workflow.detail.terminalReplay")}function Pt(t){return t==="live"?p("workflow.detail.openTerminalNewTab"):t==="resume"?p("workflow.detail.openResumeNewTab"):p("workflow.detail.openReplayNewTab")}function Ot(t,n){let a=[];return n.error?a.push(p("workflow.detail.error")):a.push(n.status==="live"?p("workflow.detail.terminalLive"):p("workflow.detail.terminalClosedShort")),t?.status&&a.push(t.status),n.webPort>0&&a.push(`:${n.webPort}`),a}function Mt(t){return!!t&&(ie.has(t)||vt.has(t))}function Wt(t){return!!t&&vt.has(t)}function le(t,n){return n.status==="live"&&n.webPort>0&&(t?.status==="pending"||t?.status==="running"||t?.status==="effectAttempting")}function de(t,n){return t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"||t.status==="timedOut"?!!(n.sessionId||n.startedAt):!1}function ce(t,n){return`http://${(n??(typeof window<"u"?window.location.hostname:""))||"127.0.0.1"}:${t.webPort}`}function ue(t,n,a,r){let o=new URLSearchParams({runId:t,activityId:n,attemptId:a});return r&&o.set("hasPtyLog","1"),`/assets/terminal-replay.html?${o.toString()}`}function me(t,n,a){return`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(n)}/${encodeURIComponent(a)}/terminal-log/raw?download=1`}function $t(t){if(!t)return[p("workflow.detail.empty")];let n=[];return t.outputBytes!==void 0&&n.push(`${t.outputBytes}B`),t.truncated&&n.push(p("workflow.detail.truncated")),t.error&&n.push(p("workflow.detail.error")),t.outputHash&&n.push(W(t.outputHash)),n}function Bt(t){return t?t.value!==void 0?JSON.stringify(t.value,null,2):t.text??"":""}function T(t){let n=t.lastIndexOf("-");if(n<0)return 0;let a=Number(t.slice(n+1));return Number.isFinite(a)?a:0}function qt(t){if(!t||typeof t!="object"||"ref"in t)return{};let n=t,a={};typeof n.nodeId=="string"&&(a.nodeId=n.nodeId),typeof n.activityId=="string"&&(a.activityId=n.activityId),typeof n.failedNodeId=="string"&&(a.nodeId=n.failedNodeId);let r=n.error;return r&&typeof r=="object"&&"errorCode"in r&&(a.errorCode=String(r.errorCode)),a}function Z(t,n,a){return Math.min(a,Math.max(n,t))}function W(t){return t?t.length>18?t.slice(0,10)+"..."+t.slice(-6):t:"-"}function Dt(t,n){return t.length>n?t.slice(0,n-1)+"\u2026":t}function $(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function fe(t){return!t.payload||typeof t.payload!="object"||"ref"in t.payload?null:t.payload}function we(t){return t==="activitySucceeded"||t==="activityFailed"||t==="activityTimedOut"||t==="activityCanceled"}function pe(t){return t==="activitySucceeded"?"succeeded":t==="activityCanceled"?"cancelled":t==="activityTimedOut"?"timedOut":"failed"}var e=V(ut(),1),tt={events:[],oldestSeq:null,newestSeq:null,hasOlder:!1,totalCount:0};function Ft(){return typeof document<"u"&&document.hidden}function _t(t){return t.replace(/[^A-Za-z0-9_-]/g,"-")}function I(t){return t instanceof Error?t.message:String(t)}function et(t,n){return`${t}:${n}`}function C(t){let n=L(t.status)?" terminal":" live";return(0,e.jsx)("span",{className:`wf-status${n} wf-status-${_t(t.status)}`,children:S(t.status)})}function ge(t){let[n,a]=(0,i.useState)([]),[r,o]=(0,i.useState)(null),[s,d]=(0,i.useState)(null);return(0,i.useEffect)(()=>{let m=!1,w=!1,f=null;async function h(){if(!(m||w||Ft())){w=!0;try{let v=await ht(t);if(m)return;a(v),o(null),d(new Date)}catch(v){if(m)return;a([]),o(I(v)),d(new Date)}finally{w=!1}}}function R(){f!==null&&window.clearTimeout(f),f=window.setTimeout(async()=>{await h(),m||R()},pt)}function b(){document.hidden||h()}return document.addEventListener("visibilitychange",b),h().then(()=>{m||R()}),()=>{m=!0,f!==null&&window.clearTimeout(f),document.removeEventListener("visibilitychange",b)}},[t]),{rows:n,lastErr:r,lastLoadedAt:s}}function ve(){let t=y(),[n,a]=(0,i.useState)(""),[r,o]=(0,i.useState)(""),{rows:s,lastErr:d,lastLoadedAt:m}=ge(r),w=kt(),f=w.find(v=>v.value===r)?.label??r,h=(0,i.useMemo)(()=>{let v=n.trim().toLowerCase();return v?s.filter(E=>E.runId.toLowerCase().includes(v)||E.workflowId.toLowerCase().includes(v)||(E.chatId??"").toLowerCase().includes(v)):s},[n,s]),R=d?t("workflow.list.error",{error:d}):m?t("workflow.list.loaded",{count:s.length,time:m.toLocaleTimeString()}):"",b=d?t("workflow.list.failedLoad",{error:d}):s.length===0?t("workflow.list.noRuns"):t("workflow.list.noFilterMatch");return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.workflows")}),(0,e.jsx)("h1",{children:t("nav.workflows")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:(0,e.jsx)(Y,{active:"legacy"})})]}),(0,e.jsxs)("form",{className:"filters dashboard-toolbar",onSubmit:v=>v.preventDefault(),children:[(0,e.jsx)("input",{type:"search",name:"q",value:n,placeholder:t("workflow.searchPlaceholder"),onChange:v=>a(v.currentTarget.value)}),(0,e.jsx)(ft,{id:"legacy-workflow-status",className:"legacy-workflow-status-menu",ariaLabel:t("workflow.table.status"),label:f,value:r,options:w,onChange:o}),(0,e.jsx)("span",{className:`toolbar-status${d?" error":""}`,children:R})]}),(0,e.jsx)("div",{className:"workflow-runs-table-wrap",children:(0,e.jsxs)("table",{className:"data-table workflow-runs-table",children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{children:t("workflow.table.run")}),(0,e.jsx)("th",{children:t("workflow.table.workflow")}),(0,e.jsx)("th",{children:t("workflow.table.status")}),(0,e.jsx)("th",{children:t("workflow.table.lastSeq")}),(0,e.jsx)("th",{children:t("workflow.table.dangling")}),(0,e.jsx)("th",{children:t("workflow.table.updated")}),(0,e.jsx)("th",{children:t("workflow.table.chatApp")})]})}),(0,e.jsx)("tbody",{children:h.length>0?h.map(v=>(0,e.jsx)(ye,{row:v},v.runId)):(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:7,className:"empty",children:b})})})]})})]})}function ye(t){let n=t.row,a=`${n.dEf}/${n.dAct}/${n.dWait}`,r=n.dEf+n.dAct+n.dWait>0?"wf-dangling has":"wf-dangling none";return(0,e.jsxs)("tr",{"data-runid":n.runId,children:[(0,e.jsx)("td",{children:(0,e.jsx)("a",{href:`#/legacy-workflow/${encodeURIComponent(n.runId)}`,children:(0,e.jsx)("code",{children:n.runId})})}),(0,e.jsx)("td",{children:n.workflowId}),(0,e.jsxs)("td",{children:[(0,e.jsx)(C,{status:n.status}),n.failedNodeId?(0,e.jsxs)("span",{className:"muted",children:[" (",n.failedNodeId,")"]}):null,(0,e.jsx)(ke,{row:n})]}),(0,e.jsx)("td",{children:n.lastSeq}),(0,e.jsx)("td",{className:r,children:a}),(0,e.jsx)("td",{title:new Date(n.updatedAt).toISOString(),children:At(n.updatedAt)}),(0,e.jsxs)("td",{children:[n.chatId?n.chatId:null,n.chatId&&n.larkAppId?(0,e.jsx)("br",{}):null,n.larkAppId?(0,e.jsx)("span",{className:"muted",children:n.larkAppId}):null,!n.chatId&&!n.larkAppId?"\u2014":null]})]})}function ke(t){let{row:n}=t;if(!n.errorCode)return null;let a=n.errorMessage?` - ${Dt(n.errorMessage,96)}`:"";return(0,e.jsxs)("div",{className:"wf-run-error",children:[(0,e.jsx)("span",{className:"muted error",children:n.errorCode}),a]})}function he(t,n,a){let r=a==="reset"?[]:t.events,o=new Set(r.map(m=>m.eventId)),s=n.events.filter(m=>o.has(m.eventId)?!1:(o.add(m.eventId),!0)),d=(a==="prepend"?[...s,...r]:[...r,...s]).sort((m,w)=>T(m.eventId)-T(w.eventId));return a==="reset"?{events:d,oldestSeq:n.oldestSeq,newestSeq:n.newestSeq,hasOlder:n.hasOlder,totalCount:n.totalCount}:a==="prepend"?{events:d,oldestSeq:n.oldestSeq??t.oldestSeq,newestSeq:t.newestSeq,hasOlder:n.hasOlder,totalCount:n.totalCount}:{events:d,oldestSeq:t.oldestSeq??n.oldestSeq,newestSeq:n.newestSeq??t.newestSeq,hasOlder:t.hasOlder,totalCount:n.totalCount}}function Se(t){let n=y(),[a,r]=(0,i.useState)(null),o=(0,i.useRef)(null),[s,d]=(0,i.useState)(tt),m=(0,i.useRef)(tt),[w,f]=(0,i.useState)(null),[h,R]=(0,i.useState)(null),[b,v]=(0,i.useState)(!1),[E,J]=(0,i.useState)(!1),[X,nt]=(0,i.useState)(!1),[Ut,jt]=(0,i.useState)(t.focusAttemptId),[q,Ht]=(0,i.useState)(()=>new Map),[at,K]=(0,i.useState)(()=>new Map),[D,rt]=(0,i.useState)(()=>new Set),[ot,st]=(0,i.useState)(()=>new Map),[x,F]=(0,i.useState)(()=>new Set),[it,_]=(0,i.useState)(()=>new Map),[lt,Jt]=(0,i.useState)(()=>new Set),dt=(0,i.useRef)(new Map),k=(0,i.useRef)(!1),U=(0,i.useRef)(!1),A=(0,i.useCallback)((l,g)=>{let u=he(m.current,l,g);m.current=u,d(u)},[]),j=(0,i.useCallback)(l=>{o.current=l,r(l)},[]),N=(0,i.useCallback)(async(l={})=>{if(!(k.current||U.current)&&!(!l.allowHidden&&Ft())){U.current=!0;try{let g=await z(t.runId);if(k.current)return;j(g);let u=m.current;if(u.newestSeq!==null){let c=await M(t.runId,new URLSearchParams({afterSeq:String(u.newestSeq),limit:"200"}));k.current||A(c,"append")}else{let c=await M(t.runId,new URLSearchParams({tail:"1"}));k.current||A(c,"reset")}k.current||(f(null),J(!1))}catch(g){k.current||f(I(g))}finally{U.current=!1}}},[A,t.runId,j]),ct=(0,i.useCallback)(async()=>{let l=await z(t.runId);if(k.current)return;j(l);let g=await M(t.runId,new URLSearchParams({tail:"100"}));k.current||A(g,"reset")},[A,t.runId,j]);(0,i.useEffect)(()=>{k.current=!1,U.current=!1,o.current=null,m.current=tt;let l=null;function g(){if(l!==null&&window.clearTimeout(l),o.current&&L(o.current.run.status)){l=null;return}l=window.setTimeout(async()=>{await N(),k.current||g()},gt)}function u(){document.hidden||N({allowHidden:!0}).then(()=>{!k.current&&l===null&&g()})}return document.addEventListener("visibilitychange",u),ct().then(()=>{k.current||(f(null),J(!1),g())}).catch(c=>{k.current||(f(I(c)),J(!0))}),()=>{k.current=!0,l!==null&&window.clearTimeout(l),document.removeEventListener("visibilitychange",u)}},[ct,N]),(0,i.useEffect)(()=>{a&&L(a.run.status)&&R(null)},[a]);let Xt=(0,i.useCallback)(async()=>{let l=m.current;if(!(l.oldestSeq===null||!l.hasOlder||X)){nt(!0);try{let g=await M(t.runId,new URLSearchParams({beforeSeq:String(l.oldestSeq),limit:"100"}));k.current||(A(g,"prepend"),f(null))}catch(g){k.current||f(I(g))}finally{k.current||nt(!1)}}},[A,X,t.runId]),Kt=(0,i.useCallback)(async()=>{let l=o.current;if(!l||L(l.run.status)||b)return;if(!l.chatBinding?.larkAppId){f(n("workflow.detail.cancelUnavailable",{runId:t.runId}));return}let g=Nt(l),u=n("workflow.detail.cancelConfirm",{runId:t.runId,...g});if(window.confirm(u)){v(!0);try{let c=await St(t.runId);R(c.pending?n("workflow.detail.cancelPending"):null),f(null),await N({allowHidden:!0})}catch(c){f(I(c))}finally{v(!1)}}},[b,N,t.runId,n]),Gt=(0,i.useCallback)(async(l,g)=>{if(!D.has(l)){rt(u=>new Set(u).add(l)),K(u=>{let c=new Map(u);return c.delete(l),c});try{let u=q.get(l)?.trim()||void 0,c=await bt(t.runId,g,u),P=n(g==="approve"?"workflow.detail.approved":"workflow.detail.rejected"),ae=c.alreadyTerminal?n("workflow.detail.alreadyTerminal",{label:P}):c.pending?n("workflow.detail.workflowContinue",{label:P}):n("workflow.detail.workflowRefreshing",{label:P});K(re=>new Map(re).set(l,{kind:"ok",text:ae})),f(null),await N({allowHidden:!0})}catch(u){let c=I(u);K(P=>new Map(P).set(l,{kind:"error",text:c})),f(c)}finally{rt(u=>{let c=new Set(u);return c.delete(l),c})}}},[q,N,t.runId,D,n]),Vt=(0,i.useCallback)(async(l,g)=>{if(!x.has(l)){F(u=>new Set(u).add(l)),_(u=>{let c=new Map(u);return c.delete(l),c});try{let u=await It(t.runId,g,l);st(c=>new Map(c).set(l,u))}catch(u){_(c=>new Map(c).set(l,I(u)))}finally{F(u=>{let c=new Set(u);return c.delete(l),c})}}},[t.runId,x]),Yt=(0,i.useCallback)(async(l,g)=>{if(!x.has(l)){F(u=>new Set(u).add(l)),_(u=>{let c=new Map(u);return c.delete(l),c});try{await Rt(t.runId,g,l),st(u=>{let c=new Map(u);return c.delete(l),c})}catch(u){_(c=>new Map(c).set(l,I(u)))}finally{F(u=>{let c=new Set(u);return c.delete(l),c})}}},[t.runId,x]),zt=(0,i.useMemo)(()=>({openBlocks:lt,scrollTops:dt.current,setBlockOpen:(l,g)=>{Jt(u=>{let c=new Set(u);return g?c.add(l):c.delete(l),c})},setBlockScrollTop:(l,g)=>{dt.current.set(l,g)}}),[lt]),Qt=(0,i.useMemo)(()=>({comments:q,statuses:at,resolving:D}),[q,at,D]),Zt=(0,i.useMemo)(()=>({sessions:ot,pending:x,errors:it}),[it,x,ot]),H=a?.run,te=H?L(H.status):!1,G=!!a?.chatBinding?.larkAppId,ee=n(G?"workflow.detail.cancel":"workflow.detail.cliCancelOnly"),ne=G?n("workflow.detail.cancelTitle"):n("workflow.detail.cliCancelTitle",{runId:t.runId});return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"page-heading wf-detail-head",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:n("nav.workflows")}),(0,e.jsx)("h1",{children:(0,e.jsx)("code",{children:t.runId})}),(0,e.jsx)("p",{className:"muted",children:a?(0,e.jsxs)(e.Fragment,{children:[H?.workflowId??"?"," \xB7 ",(0,e.jsx)(C,{status:H?.status??"unknown"})," \xB7 lastSeq ",a.lastSeq]}):n(E?"workflow.detail.loadFailed":"workflow.detail.loading")})]}),(0,e.jsxs)("div",{className:"page-heading-actions",children:[(0,e.jsx)("span",{className:"toolbar-status",children:a?n("workflow.detail.refreshed",{time:new Date().toLocaleTimeString()}):""}),(0,e.jsx)("button",{type:"button",className:"contrast",hidden:!a||te,disabled:b||!G,title:ne,onClick:()=>{Kt()},children:ee}),(0,e.jsx)("a",{className:"btn-link",href:"#/legacy-workflow",children:n("workflow.detail.back")}),(0,e.jsx)(Y,{active:"legacy"})]})]}),w?(0,e.jsx)("section",{className:"hint-warn",children:w}):null,h?(0,e.jsx)("section",{className:"hint-ok",children:h}):null,!a&&!E&&!w?(0,e.jsx)(mt,{label:n("workflow.detail.loading")}):null,a?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(be,{snapshot:a}),(0,e.jsx)(Ie,{snapshot:a}),(0,e.jsx)(Re,{snapshot:a,events:s.events}),(0,e.jsx)(Ne,{snapshot:a}),(0,e.jsx)(Te,{runId:t.runId,snapshot:a,approval:Qt,resume:Zt,blockState:zt,focusAttemptId:Ut,onCommentChange:(l,g)=>{Ht(u=>new Map(u).set(l,g))},onResolve:Gt,onResumeStart:Vt,onResumeEnd:Yt,onFocusConsumed:()=>jt(void 0)}),(0,e.jsx)($e,{events:s.events,totalCount:s.totalCount,hasOlder:s.hasOlder,loadingOlder:X,onLoadOlder:Xt})]}):null]})}function be(t){let n=y(),a=t.snapshot,r=a.run,o=[{label:n("workflow.summary.workflow"),value:r.workflowId??"?"},{label:n("workflow.summary.status"),value:(0,e.jsx)(C,{status:r.status})},{label:n("workflow.summary.lastSeq"),value:a.lastSeq},{label:n("workflow.summary.updated"),value:new Date(a.updatedAt).toLocaleString()},{label:n("workflow.summary.revision"),value:W(r.revisionId)},{label:n("workflow.summary.initiator"),value:r.initiator??"-"}];return r.failedNodeId&&o.push({label:n("workflow.summary.failedNode"),value:r.failedNodeId}),r.cancelOriginEventId&&o.push({label:n("workflow.summary.cancelOrigin"),value:r.cancelOriginEventId}),a.chatBinding&&(o.push({label:n("workflow.summary.chat"),value:(0,e.jsx)("code",{children:a.chatBinding.chatId})}),o.push({label:n("workflow.summary.app"),value:(0,e.jsx)("code",{children:a.chatBinding.larkAppId})})),(0,e.jsx)("section",{className:"wf-summary-grid",children:o.map(s=>(0,e.jsxs)("div",{className:"wf-summary-item",children:[(0,e.jsx)("span",{children:s.label}),(0,e.jsx)("strong",{children:s.value})]},s.label))})}function Ie(t){let n=y(),a=t.snapshot.dangling,r=[[n("workflow.dangling.activities"),a.activities],[n("workflow.dangling.effects"),a.effectAttempted],[n("workflow.dangling.waits"),a.waits],[n("workflow.dangling.cancels"),a.cancels]],o=new Set(r.flatMap(([,s])=>s)).size;return(0,e.jsxs)("section",{className:`wf-panel wf-dangling-panel${o>0?" has":""}`,children:[(0,e.jsxs)("div",{className:"wf-panel-title",children:[(0,e.jsx)("h3",{children:n("workflow.detail.dangling")}),o>0?(0,e.jsx)("span",{className:"wf-dangling has",children:o}):null]}),o===0?(0,e.jsx)("div",{className:"muted",children:n("workflow.detail.noDangling")}):(0,e.jsx)("div",{className:"wf-dangling-grid",children:r.map(([s,d])=>(0,e.jsxs)("div",{children:[(0,e.jsx)("strong",{children:s}),d.length===0?(0,e.jsx)("div",{className:"muted",children:n("workflow.detail.none")}):(0,e.jsx)("ul",{children:d.map(m=>(0,e.jsx)("li",{children:(0,e.jsx)("code",{children:m})},m))})]},s))})]})}function Re(t){let n=y(),a=(0,i.useMemo)(()=>Ct(t.events,t.snapshot),[t.events,t.snapshot]),r=Date.now();if(a.length===0)return(0,e.jsxs)("section",{className:"wf-panel",children:[(0,e.jsxs)("div",{className:"wf-panel-title",children:[(0,e.jsx)("h3",{children:n("workflow.detail.parallel")}),(0,e.jsx)("span",{className:"muted"})]}),(0,e.jsx)("div",{className:"empty",children:n("workflow.detail.noParallelData")})]});let o=Math.min(...a.map(f=>f.startedAt)),s=Math.max(...a.map(f=>f.endedAt??r),o+1e3),d=Math.max(1,s-o),m=a.filter(f=>!f.endedAt&&(f.status==="running"||f.status==="effectAttempting")).length,w=n("workflow.detail.parallelMeta",{count:a.length,max:Et(a,r),running:m});return(0,e.jsxs)("section",{className:"wf-panel",children:[(0,e.jsxs)("div",{className:"wf-panel-title",children:[(0,e.jsx)("h3",{children:n("workflow.detail.parallel")}),(0,e.jsx)("span",{className:"muted",children:w})]}),(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"wf-parallel-axis",children:[(0,e.jsx)("span",{title:new Date(o).toISOString(),children:$(o)}),(0,e.jsx)("span",{title:new Date(s).toISOString(),children:$(s)})]}),(0,e.jsx)("div",{className:"wf-parallel-list",children:[...a].sort((f,h)=>f.startedAt-h.startedAt||f.activityId.localeCompare(h.activityId)).map(f=>(0,e.jsx)(Ae,{item:f,start:o,duration:d,now:r},f.attemptId))})]})]})}function Ae(t){let n=y(),{item:a}=t,r=a.endedAt??t.now,o=Z((a.startedAt-t.start)/t.duration*100,0,100),s=Z((Math.max(r,a.startedAt+1)-a.startedAt)/t.duration*100,.7,100-o),d=a.nodeId??a.activityId,m=a.attemptNumber!==void 0?`#${a.attemptNumber}`:W(a.attemptId),w=[`${d} ${a.status}`,`${new Date(a.startedAt).toISOString()} -> ${a.endedAt?new Date(a.endedAt).toISOString():n("workflow.detail.parallelNow")}`,a.endType?`end: ${a.endType}`:void 0].filter(Boolean).join(`
2
+ `);return(0,e.jsxs)("div",{className:"wf-parallel-row",children:[(0,e.jsxs)("div",{className:"wf-parallel-label",children:[(0,e.jsx)("code",{children:d}),(0,e.jsxs)("span",{className:"muted",children:[a.activityId," \xB7 ",m]})]}),(0,e.jsx)("div",{className:"wf-parallel-track",children:(0,e.jsx)("div",{className:`wf-parallel-bar wf-parallel-${_t(a.status)}`,style:{left:`${o.toFixed(3)}%`,width:`${s.toFixed(3)}%`},title:w,children:(0,e.jsx)("span",{children:S(a.status)})})})]})}function Ne(t){let n=y(),a=(0,i.useMemo)(()=>Ce(t.snapshot),[t.snapshot]);return(0,e.jsxs)("section",{className:"wf-panel",children:[(0,e.jsx)("div",{className:"wf-panel-title",children:(0,e.jsx)("h3",{children:n("workflow.detail.nodes")})}),(0,e.jsx)("div",{className:"wf-table-scroll",children:(0,e.jsxs)("table",{children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{children:n("workflow.detail.node")}),(0,e.jsx)("th",{children:n("workflow.detail.nodeStatus")}),(0,e.jsx)("th",{children:n("workflow.detail.activity")}),(0,e.jsx)("th",{children:n("workflow.detail.activityStatus")}),(0,e.jsx)("th",{children:n("workflow.detail.attempts")}),(0,e.jsx)("th",{children:n("workflow.detail.current")}),(0,e.jsx)("th",{children:n("workflow.detail.detail")})]})}),(0,e.jsx)("tbody",{children:a.length>0?a.map(r=>(0,e.jsx)(Ee,{...r},`${r.node?.nodeId??"activity"}:${r.activity?.activityId??"idle"}`)):(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:7,className:"empty",children:n("workflow.detail.noNodes")})})})]})})]})}function Ce(t){let n=new Map(t.activities.map(o=>[o.activityId,o])),a=new Set,r=[];for(let o of t.nodes){let s=(o.activityId?n.get(o.activityId):void 0)??t.activities.find(d=>d.ownerNodeId===o.nodeId);s&&a.add(s.activityId),r.push({node:o,activity:s})}for(let o of t.activities)a.has(o.activityId)||r.push({activity:o});return r}function Ee(t){let n=y(),a=O(t.activity);return(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{children:t.node?(0,e.jsx)("code",{children:t.node.nodeId}):(0,e.jsx)("span",{className:"muted",children:"-"})}),(0,e.jsx)("td",{children:t.node?(0,e.jsx)(C,{status:t.node.status}):(0,e.jsx)("span",{className:"muted",children:"-"})}),(0,e.jsx)("td",{children:t.activity?(0,e.jsx)("code",{children:t.activity.activityId}):(0,e.jsx)("span",{className:"muted",children:"-"})}),(0,e.jsx)("td",{children:t.activity?(0,e.jsx)(C,{status:t.activity.status}):(0,e.jsx)("span",{className:"muted",children:"-"})}),(0,e.jsx)("td",{children:t.activity?.attempts.length??0}),(0,e.jsx)("td",{children:a?(0,e.jsx)("code",{children:a.attemptId}):(0,e.jsx)("span",{className:"muted",children:"-"})}),(0,e.jsx)("td",{children:a?(0,e.jsx)(xe,{attempt:a}):(0,e.jsx)("span",{className:"muted",children:n("workflow.detail.idle")})})]})}function xe(t){let n=y(),a=[],r=t.attempt;if(r.effectAttempted&&a.push((0,e.jsxs)(i.Fragment,{children:[n("workflow.detail.effect")," ",r.effectAttempted.provider]},"effect")),r.wait){let o=r.wait.resolution?`${r.wait.resolution.kind}${r.wait.resolution.resolution?":"+r.wait.resolution.resolution:""}`:n("workflow.detail.open");a.push((0,e.jsxs)(i.Fragment,{children:[n("workflow.detail.wait")," ",r.wait.waitKind," ",o]},"wait")),r.wait.deadlineAt!==void 0&&a.push((0,e.jsxs)(i.Fragment,{children:[n("workflow.detail.deadline")," ",$(r.wait.deadlineAt)]},"deadline"))}if(r.error){let o=`${r.error.errorCode}${r.error.errorClass?` \xB7 ${r.error.errorClass}`:""}`;a.push((0,e.jsx)("span",{className:"muted error",children:o},"error-tag")),r.error.errorMessage&&a.push((0,e.jsx)("span",{className:"error wf-error-msg",children:r.error.errorMessage},"error-message"))}return r.output&&a.push((0,e.jsxs)(i.Fragment,{children:[n("workflow.detail.output")," ",W(r.output.outputHash)]},"output")),r.runningMs!==void 0&&a.push((0,e.jsxs)(i.Fragment,{children:[r.runningMs,"ms"]},"running")),a.length===0?(0,e.jsx)("span",{className:"muted",children:"-"}):(0,e.jsx)(e.Fragment,{children:a.map((o,s)=>(0,e.jsxs)(i.Fragment,{children:[s>0?(0,e.jsx)("br",{}):null,o]},s))})}function Te(t){let n=y(),a=(0,i.useMemo)(()=>xt(t.snapshot),[t.snapshot]);return(0,e.jsxs)("section",{className:"wf-panel",children:[(0,e.jsx)("div",{className:"wf-panel-title",children:(0,e.jsx)("h3",{children:n("workflow.detail.nodeIO")})}),(0,e.jsx)("div",{className:"wf-io-list",children:a.length>0?a.map(r=>(0,e.jsx)(Le,{desc:r,...t},r.key)):(0,e.jsx)("div",{className:"empty",children:n("workflow.detail.noNodeIO")})})]})}function Le(t){let n=y(),a=(0,i.useRef)(null),r=O(t.desc.activity),o=t.desc.node?.nodeId??t.desc.activity?.ownerNodeId??t.desc.activity?.activityId??"unknown",s=r?.attemptId??t.desc.activity?.activityId??t.desc.node?.nodeId??"unknown",d=!!r&&r.attemptId===t.focusAttemptId,m=Lt({runId:t.runId,activity:t.desc.activity,attempt:r,terminal:t.desc.io?.terminal,resumeSession:r?t.resume.sessions.get(r.attemptId):void 0}),w=m?et(s,Q(m.kind)):null,f=(0,i.useRef)(!1);return(0,i.useEffect)(()=>{if(!d){f.current=!1;return}f.current||(f.current=!0,a.current?.scrollIntoView({block:"center"})),m&&w&&(t.blockState.setBlockOpen(w,!0),t.onFocusConsumed())},[d,t,w,m]),(0,e.jsxs)("article",{ref:a,className:`wf-io-card${d?" is-focused":""}`,"data-wf-card-key":t.desc.key,"data-wf-attempt-card":r?.attemptId,children:[(0,e.jsxs)("div",{className:"wf-io-card-head",children:[(0,e.jsxs)("header",{children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("strong",{children:(0,e.jsx)("code",{children:o})}),(0,e.jsx)("span",{className:"muted",children:t.desc.activity?t.desc.activity.activityId:n("workflow.detail.notDispatched")})]}),(0,e.jsxs)("div",{children:[t.desc.node?(0,e.jsx)(C,{status:t.desc.node.status}):null,t.desc.node&&t.desc.activity?" ":null,t.desc.activity?(0,e.jsx)(C,{status:t.desc.activity.status}):null]})]}),(0,e.jsx)("div",{className:"wf-io-meta",children:r?(0,e.jsxs)(e.Fragment,{children:[n("workflow.detail.attempt")," ",(0,e.jsx)("code",{children:r.attemptId})]}):n("workflow.detail.noAttempt")}),(0,e.jsx)(Pe,{attempt:r,approval:t.approval,onCommentChange:t.onCommentChange,onResolve:t.onResolve})]}),(0,e.jsx)("div",{className:"wf-io-terminal-slot",children:m&&t.desc.io?.terminal?(0,e.jsx)(Oe,{runId:t.runId,keyPrefix:s,attempt:r,activity:t.desc.activity,terminal:t.desc.io.terminal,surface:m,resume:t.resume,blockState:t.blockState,onResumeStart:t.onResumeStart,onResumeEnd:t.onResumeEnd}):null}),(0,e.jsxs)("div",{className:"wf-io-grid",children:[(0,e.jsx)(B,{keyPrefix:s,label:n("workflow.detail.authoredInput"),preview:t.desc.io?.input,blockState:t.blockState}),(0,e.jsx)(B,{keyPrefix:s,label:n("workflow.detail.resolvedInput"),preview:t.desc.io?.resolvedInput,blockState:t.blockState}),(0,e.jsx)(B,{keyPrefix:s,label:n("workflow.detail.output"),preview:t.desc.io?.output,blockState:t.blockState}),(0,e.jsx)(B,{keyPrefix:s,label:n("workflow.detail.executionLog"),preview:t.desc.io?.log,blockState:t.blockState}),t.desc.io?.waitPrompt?(0,e.jsx)(B,{keyPrefix:s,label:n("workflow.detail.waitPrompt"),preview:t.desc.io.waitPrompt,blockState:t.blockState}):null]})]})}function Pe(t){let n=y(),a=t.attempt;if(!Tt(a))return null;let r=t.approval.comments.get(a.attemptId)??"",o=t.approval.resolving.has(a.attemptId),s=t.approval.statuses.get(a.attemptId);return(0,e.jsxs)("div",{className:"wf-approval-box","data-wf-approval":a.attemptId,children:[(0,e.jsxs)("label",{children:[(0,e.jsx)("span",{children:n("workflow.detail.approvalComment")}),(0,e.jsx)("textarea",{className:"wf-approval-comment",rows:2,value:r,placeholder:n("workflow.detail.optionalComment"),disabled:o,onChange:d=>t.onCommentChange(a.attemptId,d.currentTarget.value)})]}),(0,e.jsxs)("div",{className:"wf-approval-actions",children:[(0,e.jsx)("button",{type:"button",className:"primary",disabled:o,onClick:()=>{t.onResolve(a.attemptId,"approve")},children:n("workflow.detail.approve")}),(0,e.jsx)("button",{type:"button",disabled:o,onClick:()=>{t.onResolve(a.attemptId,"reject")},children:n("workflow.detail.reject")}),o?(0,e.jsx)("span",{className:"muted",children:n("workflow.detail.submitting")}):null]}),s?(0,e.jsx)("div",{className:`${s.kind==="error"?"hint-warn":"hint-ok"} wf-approval-status`,children:s.text}):null]})}function Oe(t){let n=y(),a=Q(t.surface.kind),r=et(t.keyPrefix,a),o=t.blockState.openBlocks.has(r),s=Ot(t.attempt,t.terminal).join(" \xB7 ");return(0,e.jsxs)("details",{className:"wf-io-block wf-terminal-block","data-io-key":r,open:o,onToggle:d=>t.blockState.setBlockOpen(r,d.currentTarget.open),children:[(0,e.jsxs)("summary",{children:[a," ",(0,e.jsx)("span",{className:"muted",children:s})]}),(0,e.jsxs)("div",{className:"wf-terminal-actions",children:[(0,e.jsx)("a",{className:"btn-link",href:t.surface.url,target:"_blank",rel:"noreferrer",children:Pt(t.surface.kind)}),t.surface.kind==="replay"||t.surface.kind==="resume"?(0,e.jsx)("a",{className:"btn-link",href:t.surface.downloadUrl,download:!0,children:n("workflow.detail.downloadFullLog")}):null,(0,e.jsx)(Me,{...t})]}),t.attempt&&t.resume.errors.has(t.attempt.attemptId)?(0,e.jsx)("div",{className:"hint-warn wf-resume-status",children:t.resume.errors.get(t.attempt.attemptId)}):null,(0,e.jsx)("iframe",{className:"wf-terminal-frame",src:t.surface.url,title:a,loading:"lazy"})]})}function Me(t){let n=y(),{activity:a,attempt:r,surface:o,terminal:s}=t;if(!r||!a||o.kind==="live")return null;let d=t.resume.pending.has(r.attemptId);return o.kind==="resume"?(0,e.jsx)("button",{type:"button",className:"btn-link",disabled:d,onClick:()=>{t.onResumeEnd(r.attemptId,a.activityId)},children:n(d?"workflow.detail.resumeEnding":"workflow.detail.endResumeSession")}):Mt(s.cliId)?Wt(s.cliId)&&!s.cliSessionId?(0,e.jsx)("button",{type:"button",className:"btn-link",disabled:!0,title:n("workflow.detail.resumeMissingCliSession"),children:n("workflow.detail.resumeSession")}):(0,e.jsx)("button",{type:"button",className:"btn-link",disabled:d,onClick:()=>{t.onResumeStart(r.attemptId,a.activityId)},children:n(d?"workflow.detail.resumeStarting":"workflow.detail.resumeSession")}):(0,e.jsx)("button",{type:"button",className:"btn-link",disabled:!0,title:n("workflow.detail.resumeUnsupportedCli",{cliId:s.cliId??"?"}),children:n("workflow.detail.resumeSession")})}function B(t){let n=et(t.keyPrefix,t.label),a=t.blockState.openBlocks.has(n),r=$t(t.preview).join(" \xB7 ");return(0,e.jsxs)("details",{className:"wf-io-block","data-io-key":n,open:a,onToggle:o=>t.blockState.setBlockOpen(n,o.currentTarget.open),children:[(0,e.jsxs)("summary",{children:[t.label," ",(0,e.jsx)("span",{className:"muted",children:r})]}),(0,e.jsx)(We,{preview:t.preview,blockKey:n,blockState:t.blockState})]})}function We(t){let n=y(),a=(0,i.useRef)(null),r=Bt(t.preview);return(0,i.useEffect)(()=>{let o=t.blockState.scrollTops.get(t.blockKey);o!==void 0&&a.current&&(a.current.scrollTop=o)}),t.preview?(0,e.jsxs)(e.Fragment,{children:[t.preview.error?(0,e.jsx)("div",{className:"muted error",children:t.preview.error}):null,r?(0,e.jsx)("pre",{ref:a,className:"wf-io-pre",onScroll:o=>t.blockState.setBlockScrollTop(t.blockKey,o.currentTarget.scrollTop),children:r}):(0,e.jsx)("div",{className:"muted wf-io-empty",children:n("workflow.detail.noPreview")})]}):(0,e.jsx)("div",{className:"muted wf-io-empty",children:n("workflow.detail.noData")})}function $e(t){let n=y(),a=(0,i.useRef)(null),r=(0,i.useRef)(0);return(0,i.useEffect)(()=>{a.current&&(a.current.scrollTop=r.current)},[t.events]),(0,e.jsxs)("section",{className:"wf-panel",children:[(0,e.jsxs)("div",{className:"wf-panel-title",children:[(0,e.jsx)("h3",{children:n("workflow.detail.timeline")}),(0,e.jsx)("button",{type:"button",hidden:!t.hasOlder,disabled:t.loadingOlder,onClick:()=>{t.onLoadOlder()},children:n("workflow.detail.loadOlder")})]}),(0,e.jsx)("div",{ref:a,className:"wf-table-scroll wf-timeline-scroll",onScroll:o=>{r.current=o.currentTarget.scrollTop},children:(0,e.jsxs)("table",{children:[(0,e.jsx)("thead",{children:(0,e.jsxs)("tr",{children:[(0,e.jsx)("th",{children:n("workflow.detail.seq")}),(0,e.jsx)("th",{children:n("workflow.detail.event")}),(0,e.jsx)("th",{children:n("workflow.detail.actor")}),(0,e.jsx)("th",{children:n("workflow.detail.node")}),(0,e.jsx)("th",{children:n("workflow.detail.activity")}),(0,e.jsx)("th",{children:n("workflow.detail.error")}),(0,e.jsx)("th",{children:n("workflow.detail.time")})]})}),(0,e.jsx)("tbody",{children:t.events.length>0?t.events.map(o=>(0,e.jsx)(Be,{event:o},o.eventId)):(0,e.jsx)("tr",{children:(0,e.jsx)("td",{colSpan:7,className:"empty",children:n("workflow.detail.noEvents")})})})]})}),(0,e.jsx)("div",{className:"muted",children:n("workflow.detail.eventsLoaded",{loaded:t.events.length,total:t.totalCount})})]})}function Be(t){let n=qt(t.event.payload);return(0,e.jsxs)("tr",{children:[(0,e.jsx)("td",{children:T(t.event.eventId)}),(0,e.jsx)("td",{children:(0,e.jsx)("code",{children:t.event.type})}),(0,e.jsx)("td",{children:t.event.actor}),(0,e.jsx)("td",{children:n.nodeId?(0,e.jsx)("code",{children:n.nodeId}):"-"}),(0,e.jsx)("td",{children:n.activityId?(0,e.jsx)("code",{children:n.activityId}):"-"}),(0,e.jsx)("td",{children:n.errorCode?(0,e.jsx)("span",{className:"muted error",children:n.errorCode}):"-"}),(0,e.jsx)("td",{title:new Date(t.event.timestamp).toISOString(),children:$(t.event.timestamp)})]})}function qe(){y();let t=yt(location.hash);return(0,e.jsx)("section",{className:"page workflows-page legacy-workflow-page",children:t.kind==="detail"?(0,e.jsx)(Se,{runId:t.runId,focusAttemptId:t.focusAttemptId}):(0,e.jsx)(ve,{})})}function Xe(t){return wt(t,(0,e.jsx)(qe,{}))}export{Xe as renderLegacyWorkflowPage};
@@ -1,8 +1,8 @@
1
- import{a as B,c as I,d as N,e as P,f as _,h as $}from"./chunk-3N2PPQVD.js";import{a as E}from"./chunk-LXIK7OUJ.js";import{o as r,p as n,q as C,r as S,t as O,v as k,x as W}from"./chunk-3UJYRR2Q.js";import"./chunk-7SZRL6FY.js";function z(t){let o=String(t??"unknown"),e=`sessions.status.${o}`,i=r(e);return i===e?o:i}function F(t){return String(t??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function D(t){let o=String(t??"unknown");return`<span class="status status-${n(F(o))}">${n(z(o))}</span>`}function q(t){return W(t?.title)||String(t?.sessionId??"")}var A=14,G=49,K=18;function U(){let t=[...E.sessions.values()].filter(o=>typeof o?.sessionId=="string"&&o.sessionId&&o.status!=="closed").sort((o,e)=>Number(e.lastMessageAt??0)-Number(o.lastMessageAt??0));return[...new Set(t.map(o=>String(o.sessionId)))]}function j(t,o,e){let i=Math.max(0,Math.floor(e)),s=Math.max(1,t.width),m=Math.max(1,t.height),a=s/m,l=Math.max(1,o.width),p=Math.max(180,m-Math.max(0,o.top)-K);if(i<=0)return{columns:1,rows:0,frameWidth:Math.floor(l),frameHeight:Math.floor(l/a),ratio:a};let d=null;for(let u=1;u<=i;u+=1){let b=Math.ceil(i/u),g=(l-A*(u-1))/u,L=(p-A*(b-1)-G*b)/b;if(g<=0||L<=0)continue;let h=Math.max(1,Math.min(g,L*a)),M=h/a,c=h*M;(!d||c>d.score)&&(d={columns:u,rows:b,frameWidth:h,frameHeight:M,score:c})}if(!d){let u=Math.min(i,Math.max(1,Math.floor(l/220))),b=Math.ceil(i/u),g=Math.max(1,(l-A*(u-1))/u);return{columns:u,rows:b,frameWidth:Math.floor(g),frameHeight:Math.floor(g/a),ratio:a}}return{columns:d.columns,rows:d.rows,frameWidth:Math.floor(d.frameWidth),frameHeight:Math.floor(d.frameHeight),ratio:a}}function J(t,o){let e=Math.max(1,Math.floor(t.width)),i=Math.max(1,Math.floor(t.height)),s=Math.max(1,o.width),m=Math.max(1,o.height),a=Math.min(1,s/e,m/i);return{width:e,height:i,scale:a}}function Q(t,o){return t?`frame:${$(t,o)??"none"}`:"missing"}function V(t,o){let e=E.sessions.get(t),i=o?et(t):"";if(!e)return`<div class="monitor-room-card-title">
1
+ import{a as T,b as B,d as I,e as N,f as P,g as _}from"./chunk-XJ7BGPJH.js";import{A as O,C as S,E as W,d as E,t as r,u as n,v as C,x}from"./chunk-XCPSHD3G.js";function z(t){let o=String(t??"unknown"),e=`sessions.status.${o}`,i=r(e);return i===e?o:i}function F(t){return String(t??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function D(t){let o=String(t??"unknown");return`<span class="status status-${n(F(o))}">${n(z(o))}</span>`}function q(t){return W(t?.title)||String(t?.sessionId??"")}var A=14,G=49,K=18;function U(){let t=[...E.sessions.values()].filter(o=>typeof o?.sessionId=="string"&&o.sessionId&&o.status!=="closed").sort((o,e)=>Number(e.lastMessageAt??0)-Number(o.lastMessageAt??0));return[...new Set(t.map(o=>String(o.sessionId)))]}function j(t,o,e){let i=Math.max(0,Math.floor(e)),s=Math.max(1,t.width),m=Math.max(1,t.height),a=s/m,l=Math.max(1,o.width),p=Math.max(180,m-Math.max(0,o.top)-K);if(i<=0)return{columns:1,rows:0,frameWidth:Math.floor(l),frameHeight:Math.floor(l/a),ratio:a};let d=null;for(let u=1;u<=i;u+=1){let b=Math.ceil(i/u),f=(l-A*(u-1))/u,L=(p-A*(b-1)-G*b)/b;if(f<=0||L<=0)continue;let h=Math.max(1,Math.min(f,L*a)),M=h/a,c=h*M;(!d||c>d.score)&&(d={columns:u,rows:b,frameWidth:h,frameHeight:M,score:c})}if(!d){let u=Math.min(i,Math.max(1,Math.floor(l/220))),b=Math.ceil(i/u),f=Math.max(1,(l-A*(u-1))/u);return{columns:u,rows:b,frameWidth:Math.floor(f),frameHeight:Math.floor(f/a),ratio:a}}return{columns:d.columns,rows:d.rows,frameWidth:Math.floor(d.frameWidth),frameHeight:Math.floor(d.frameHeight),ratio:a}}function J(t,o){let e=Math.max(1,Math.floor(t.width)),i=Math.max(1,Math.floor(t.height)),s=Math.max(1,o.width),m=Math.max(1,o.height),a=Math.min(1,s/e,m/i);return{width:e,height:i,scale:a}}function Q(t,o){return t?`frame:${T(t,o)??"none"}`:"missing"}function V(t,o){let e=E.sessions.get(t),i=o?et(t):"";if(!e)return`<div class="monitor-room-card-title">
2
2
  <strong>${n(t)}</strong>
3
3
  <span>${n(r("monitorRoom.missing"))}</span>
4
- </div>${i}`;let s=q(e),m=$(e),a=k(e),l=m?nt(t):"";return`<div class="monitor-room-card-title">
5
- ${S({name:a,larkAppId:e.larkAppId,size:"sm"})}
4
+ </div>${i}`;let s=q(e),m=T(e),a=S(e),l=m?nt(t):"";return`<div class="monitor-room-card-title">
5
+ ${x({name:a,larkAppId:e.larkAppId,size:"sm"})}
6
6
  <span class="monitor-room-card-meta">
7
7
  <strong title="${n(String(e.title??s))}">${n(s)}</strong>
8
8
  <small>${n(a)} \xB7 ${D(e.status)} \xB7 ${n(r("monitorRoom.updated",{time:C(e.lastMessageAt)}))}</small>
@@ -11,34 +11,36 @@ import{a as B,c as I,d as N,e as P,f as _,h as $}from"./chunk-3N2PPQVD.js";impor
11
11
  <div class="monitor-room-card-actions">
12
12
  ${l}
13
13
  ${i}
14
- </div>`}function X(t){let o=E.sessions.get(t);if(!o)return`<div class="monitor-room-placeholder">${n(r("monitorRoom.missingHelp"))}</div>`;let e=$(o);return e?`<iframe class="monitor-room-frame" src="${n(e)}" allow="clipboard-read; clipboard-write"></iframe>`:`<div class="monitor-room-placeholder">
14
+ </div>`}function X(t){let o=E.sessions.get(t);if(!o)return`<div class="monitor-room-placeholder">${n(r("monitorRoom.missingHelp"))}</div>`;let e=T(o);return e?`<iframe class="monitor-room-frame" src="${n(e)}" allow="clipboard-read; clipboard-write"></iframe>`:`<div class="monitor-room-placeholder">
15
15
  <b>${n(r("monitorRoom.terminalUnavailable"))}</b>
16
16
  <span>${n(r("monitorRoom.terminalUnavailableHelp"))}</span>
17
17
  </div>`}function Y(t,o,e){let i=t.get(e);if(i)return i;let s=document.createElement("article");s.className="monitor-room-card",s.dataset.id=e;let m=document.createElement("header");m.className="monitor-room-card-head";let a=document.createElement("div");a.className="monitor-room-frame-wrap",s.appendChild(m),s.appendChild(a),o.appendChild(s);let l={article:s,head:m,frameWrap:a,bodyKey:""};return t.set(e,l),l}function Z(t,o,e){t.bodyKey!==e&&(t.frameWrap.innerHTML=X(o),t.bodyKey=e)}function tt(t){return`<h2>${n(r(t?"monitorRoom.autoEmptyTitle":"monitorRoom.emptyTitle"))}</h2>
18
18
  <p>${n(r(t?"monitorRoom.autoEmptyHelp":"monitorRoom.emptyHelp"))}</p>
19
19
  <a class="btn-link" href="#/sessions">${n(r("monitorRoom.openSessions"))}</a>`}function ot(t,o){let e={width:window.innerWidth,height:window.innerHeight},i=o.getBoundingClientRect(),s=Number(o.dataset.count||"0"),m=j(e,{width:i.width,top:i.top},s);t.style.setProperty("--monitor-room-viewport-ratio",`${e.width} / ${e.height}`),s>0?o.style.gridTemplateColumns=`repeat(${m.columns}, minmax(0, ${m.frameWidth}px))`:o.style.gridTemplateColumns="",t.querySelectorAll(".monitor-room-frame-wrap").forEach(a=>{let l=a.querySelector(".monitor-room-frame");if(!l)return;let p=a.getBoundingClientRect(),d=J(e,{width:p.width,height:p.height});l.style.width=`${d.width}px`,l.style.height=`${d.height}px`,l.style.transform=`scale(${d.scale})`})}function et(t){return`<button type="button" class="card-act" data-remove="${n(t)}" title="${n(r("monitorRoom.remove"))}" aria-label="${n(r("monitorRoom.remove"))}">\xD7</button>`}function nt(t){return`<button type="button" class="card-act" data-popout="${n(t)}" title="${n(r("monitorRoom.openTerminal"))}" aria-label="${n(r("monitorRoom.openTerminal"))}">\u2197</button>`}function rt(){return`<section class="page monitor-room-page">
20
20
  <div class="page-heading">
21
- <div>
21
+ <div class="monitor-room-heading-main">
22
22
  <p class="eyebrow">${n(r("monitorRoom.eyebrow"))}</p>
23
- <h1>${n(r("monitorRoom.title"))}</h1>
24
- <p>${n(r("monitorRoom.subtitle"))}</p>
23
+ <div class="monitor-room-title-row">
24
+ <a class="btn-link monitor-room-back" href="#/sessions">\u2190 ${n(r("monitorRoom.backToSessions"))}</a>
25
+ <h1>${n(r("monitorRoom.title"))}</h1>
26
+ <span id="monitor-room-summary" class="monitor-room-summary"></span>
27
+ </div>
25
28
  </div>
26
- <div class="monitor-room-actions">
27
- <label class="monitor-room-toggle" title="${n(r("monitorRoom.autoActiveHelp"))}">
29
+ <div class="monitor-room-actions dashboard-toolbar">
30
+ <label class="monitor-room-toggle filter-toggle" title="${n(r("monitorRoom.autoActiveHelp"))}">
28
31
  <input type="checkbox" id="monitor-room-auto-active">
29
- <span>${n(r("monitorRoom.autoActive"))}</span>
32
+ <span class="filter-toggle-label">${n(r("monitorRoom.autoActive"))}</span>
33
+ <span class="filter-toggle-switch" aria-hidden="true"></span>
30
34
  </label>
31
- <a class="btn-link" href="#/sessions">${n(r("monitorRoom.backToSessions"))}</a>
32
35
  <button type="button" id="monitor-room-clear" class="contrast">${n(r("monitorRoom.clear"))}</button>
33
36
  </div>
34
37
  </div>
35
- <div id="monitor-room-summary" class="monitor-room-summary"></div>
36
38
  <div id="monitor-room-grid" class="monitor-room-grid"></div>
37
- </section>`}function it(t,o){let e=E.sessions.get(t),i=e?q(e):t,s=e?k(e):"";return`<div class="monitor-room-popover-backdrop">
39
+ </section>`}function it(t,o){let e=E.sessions.get(t),i=e?q(e):t,s=e?S(e):"";return`<div class="monitor-room-popover-backdrop">
38
40
  <section class="monitor-room-popover" role="dialog" tabindex="-1" aria-label="${n(r("monitorRoom.openTerminal"))}">
39
41
  <header class="monitor-room-popover-head">
40
42
  <div class="monitor-room-card-title">
41
- ${e?S({name:s,larkAppId:e.larkAppId,size:"sm"}):""}
43
+ ${e?x({name:s,larkAppId:e.larkAppId,size:"sm"}):""}
42
44
  <span class="monitor-room-card-meta">
43
45
  <strong title="${n(i)}">${n(i)}</strong>
44
46
  <small>${n(s||t)}</small>
@@ -48,4 +50,4 @@ import{a as B,c as I,d as N,e as P,f as _,h as $}from"./chunk-3N2PPQVD.js";impor
48
50
  </header>
49
51
  <iframe class="monitor-room-popover-frame" src="${n(o)}" allow="clipboard-read; clipboard-write"></iframe>
50
52
  </section>
51
- </div>`}function ct(t){t.innerHTML=rt();let o=t.querySelector("#monitor-room-grid"),e=t.querySelector("#monitor-room-summary"),i=t.querySelector("#monitor-room-clear"),s=t.querySelector("#monitor-room-auto-active"),m=null;function a(h){let M=$(E.sessions.get(h));if(!M)return;m?.(),t.insertAdjacentHTML("beforeend",it(h,M));let c=t.querySelector(".monitor-room-popover-backdrop"),f=c.querySelector(".monitor-room-popover"),x=c.querySelector("[data-popover-close]"),T=!1,y=()=>{T||(T=!0,window.removeEventListener("keydown",v),c.removeEventListener("pointerdown",H),c.removeEventListener("focusout",R),x.removeEventListener("click",y),c.remove(),m===y&&(m=null))},v=w=>{w.key==="Escape"&&(w.preventDefault(),y())},H=w=>{f.contains(w.target)||y()},R=()=>{window.setTimeout(()=>{let w=document.activeElement;(!w||!c.contains(w))&&y()},0)};m=y,window.addEventListener("keydown",v),c.addEventListener("pointerdown",H),c.addEventListener("focusout",R),x.addEventListener("click",y),f.focus()}let l=new Map,p=null,d=0,u=null;function b(){d||(d=requestAnimationFrame(()=>{d=0,ot(t,o)}))}function g(){let h=B(),M=P(),c=h.length===0&&M,f=c?U():h,x=!c,T=f.filter(v=>!!$(E.sessions.get(v))).length;s.checked=M,e.textContent=c&&f.length?r("monitorRoom.autoSummary",{count:f.length,live:T}):f.length?r("monitorRoom.summary",{count:f.length,live:T}):r("monitorRoom.emptySummary"),i.disabled=h.length===0,o.dataset.count=String(f.length),f.length>0&&p&&(p.remove(),p=null);let y=new Set(f);for(let[v,H]of l)y.has(v)||(H.article.remove(),l.delete(v));f.length===0?(p||(p=document.createElement("div"),p.className="monitor-room-empty",o.appendChild(p)),p.innerHTML=tt(c)):f.forEach((v,H)=>{let R=Y(l,o,v);R.article.style.order=String(H),R.head.innerHTML=V(v,x);let w=Q(E.sessions.get(v));Z(R,v,w)}),b()}o.addEventListener("click",h=>{let M=h.target.closest("button[data-popout]");if(M?.dataset.popout){a(M.dataset.popout);return}let c=h.target.closest("button[data-remove]");c?.dataset.remove&&(I(c.dataset.remove),g())}),i.addEventListener("click",()=>{confirm(r("monitorRoom.clearConfirm"))&&(N(),g())}),s.addEventListener("change",()=>{_(s.checked),g()});let L=E.on(g);return window.addEventListener("resize",b),typeof ResizeObserver<"u"&&(u=new ResizeObserver(b),u.observe(t),u.observe(o)),g(),O().then(g),()=>{m?.(),window.removeEventListener("resize",b),u&&u.disconnect(),d&&cancelAnimationFrame(d),L()}}export{J as monitorRoomFrameGeometry,j as monitorRoomGridGeometry,Q as monitorRoomPanelBodyKey,ct as renderMonitorRoomPage};
53
+ </div>`}function ct(t){t.innerHTML=rt();let o=t.querySelector("#monitor-room-grid"),e=t.querySelector("#monitor-room-summary"),i=t.querySelector("#monitor-room-clear"),s=t.querySelector("#monitor-room-auto-active"),m=null;function a(h){let M=T(E.sessions.get(h));if(!M)return;m?.(),t.insertAdjacentHTML("beforeend",it(h,M));let c=t.querySelector(".monitor-room-popover-backdrop"),g=c.querySelector(".monitor-room-popover"),k=c.querySelector("[data-popover-close]"),$=!1,y=()=>{$||($=!0,window.removeEventListener("keydown",v),c.removeEventListener("pointerdown",H),c.removeEventListener("focusout",R),k.removeEventListener("click",y),c.remove(),m===y&&(m=null))},v=w=>{w.key==="Escape"&&(w.preventDefault(),y())},H=w=>{g.contains(w.target)||y()},R=()=>{window.setTimeout(()=>{let w=document.activeElement;(!w||!c.contains(w))&&y()},0)};m=y,window.addEventListener("keydown",v),c.addEventListener("pointerdown",H),c.addEventListener("focusout",R),k.addEventListener("click",y),g.focus()}let l=new Map,p=null,d=0,u=null;function b(){d||(d=requestAnimationFrame(()=>{d=0,ot(t,o)}))}function f(){let h=B(),M=P(),c=h.length===0&&M,g=c?U():h,k=!c,$=g.filter(v=>!!T(E.sessions.get(v))).length;s.checked=M,e.textContent=c&&g.length?r("monitorRoom.autoSummary",{count:g.length,live:$}):g.length?r("monitorRoom.summary",{count:g.length,live:$}):r("monitorRoom.emptySummary"),i.disabled=h.length===0,o.dataset.count=String(g.length),g.length>0&&p&&(p.remove(),p=null);let y=new Set(g);for(let[v,H]of l)y.has(v)||(H.article.remove(),l.delete(v));g.length===0?(p||(p=document.createElement("div"),p.className="monitor-room-empty",o.appendChild(p)),p.innerHTML=tt(c)):g.forEach((v,H)=>{let R=Y(l,o,v);R.article.style.order=String(H),R.head.innerHTML=V(v,k);let w=Q(E.sessions.get(v));Z(R,v,w)}),b()}o.addEventListener("click",h=>{let M=h.target.closest("button[data-popout]");if(M?.dataset.popout){a(M.dataset.popout);return}let c=h.target.closest("button[data-remove]");c?.dataset.remove&&(I(c.dataset.remove),f())}),i.addEventListener("click",()=>{confirm(r("monitorRoom.clearConfirm"))&&(N(),f())}),s.addEventListener("change",()=>{_(s.checked),f()});let L=E.on(f);return window.addEventListener("resize",b),typeof ResizeObserver<"u"&&(u=new ResizeObserver(b),u.observe(t),u.observe(o)),f(),O().then(f),()=>{m?.(),window.removeEventListener("resize",b),u&&u.disconnect(),d&&cancelAnimationFrame(d),L()}}export{J as monitorRoomFrameGeometry,j as monitorRoomGridGeometry,Q as monitorRoomPanelBodyKey,ct as renderMonitorRoomPage};
@@ -0,0 +1,2 @@
1
+ import{a as _,c as k}from"./chunk-BRTZFELS.js";import{c as K,d as f,i as G,l as H,m as T,n as D,o as A}from"./chunk-6TPODDDC.js";import{a as Y,d as U}from"./chunk-ZJING6FY.js";import{c as $}from"./chunk-XCPSHD3G.js";var g=$(Y(),1);var e=$(U(),1);function b(n){let s=Number(n);return!Number.isFinite(s)||s<=0?"-":s>=1024**3?`${(s/1024**3).toFixed(1)} GiB`:s>=1024**2?`${(s/1024**2).toFixed(0)} MiB`:`${Math.max(1,Math.round(s/1024))} KiB`}function N(n){let s=Number(n);return Number.isFinite(s)?`${s.toFixed(1)}%`:"-"}function S(n,s){return s?N(n):"-"}function q(n){return n?.cpuReady!==!1}function d(n){let s=Number(n);return Number.isFinite(s)?String(s):"-"}function E(n){let s=Number(n);if(!Number.isFinite(s)||s<0)return"-";if(s===0)return"0s";if(s<6e4)return`${Math.max(1,Math.floor(s/1e3))}s`;let r=Math.floor(s/6e4);if(r<60)return`${Math.max(1,r)}m`;let t=Math.floor(r/60),o=r%60;return o?`${t}h ${o}m`:`${t}h`}function Z(n){return n==="fresh"||n==="stale"||n==="unsupported"?n:"unknown"}function j(n){return n?`${n.botName||"-"} \xB7 ${n.title||n.sessionId}`:"-"}function W(n,s){return s==="cpu"?Number(n.current?.cpu1mPct??n.current?.cpuPct??0):s==="rss"?Number(n.current?.rssBytes??0):s==="growth"?Number(n.current?.rssGrowth5mBytes??0):s==="bot"?n.botName??"":n.status??""}function ee(n,s){return[...n].sort((r,t)=>{let o=W(r,s),u=W(t,s);return typeof o=="number"&&typeof u=="number"?u-o||r.sessionId.localeCompare(t.sessionId):String(o).localeCompare(String(u))||r.sessionId.localeCompare(t.sessionId)})}function V(n,s){return s==="bytes"?b(n):N(n)}function F(n,s,r){let t=(n??[]).filter(Number.isFinite);if(t.length<2)return r("monitoring.chartNoData");let o=t[0],u=Number.isFinite(s)?Number(s):Date.now(),a=Math.max(0,u-o),m=Math.max(1,Math.round(a/6e4));if(m<60)return r("monitoring.chartMinutesAgo",{value:m});let p=Math.round(m/60);return p<48?r("monitoring.chartHoursAgo",{value:p}):r("monitoring.chartDaysAgo",{value:Math.round(p/24)})}function C(n){let s=(n??[]).filter(Number.isFinite);return s.length?s[s.length-1]:void 0}function R({values:n,timestamps:s,unit:r="pct",startLabel:t,endLabel:o,emptyLabel:u,className:a}){let m=(n??[]).filter(Number.isFinite),p=m.length?Math.min(...m):0,x=m.length?Math.max(...m):0,w=x-p,c=m.length>1?m.map((L,i)=>{let l=i/(m.length-1)*100,h=w>0?100-(L-p)/w*100:50;return`${l},${h}`}).join(" "):"",P=c?`0,100 ${c} 100,100`:"",B=c?c.split(" "):[],v=B.length?B[B.length-1].split(",").map(Number):null;return(0,e.jsxs)("div",{className:["resource-chart",a].filter(Boolean).join(" "),children:[(0,e.jsxs)("div",{className:"resource-chart-y","aria-hidden":"true",children:[(0,e.jsx)("span",{children:m.length?V(x,r):"-"}),(0,e.jsx)("span",{children:m.length?V(p,r):"-"})]}),(0,e.jsxs)("div",{className:"resource-chart-plot",children:[(0,e.jsxs)("div",{className:"resource-spark-wrap",children:[(0,e.jsxs)("svg",{className:"resource-spark",viewBox:"0 0 100 100",preserveAspectRatio:"none","aria-label":m.length>1?void 0:u,children:[(0,e.jsx)("line",{x1:"0",y1:"12",x2:"100",y2:"12",className:"resource-grid-line"}),(0,e.jsx)("line",{x1:"0",y1:"50",x2:"100",y2:"50",className:"resource-grid-line"}),(0,e.jsx)("line",{x1:"0",y1:"88",x2:"100",y2:"88",className:"resource-grid-line"}),P?(0,e.jsx)("polygon",{className:"resource-spark-area",points:P}):null,c?(0,e.jsx)("polyline",{points:c}):null]}),v&&Number.isFinite(v[0])&&Number.isFinite(v[1])?(0,e.jsx)("span",{className:"resource-spark-dot","aria-hidden":"true",style:{left:`${v[0]}%`,top:`${v[1]}%`}}):null]}),(0,e.jsxs)("div",{className:"resource-chart-x","aria-hidden":"true",children:[(0,e.jsx)("span",{children:m.length>1?t:u}),(0,e.jsx)("span",{children:m.length>1?o:""})]})]})]})}function I(n){let s=r=>r instanceof Element&&!!r.closest(".ui-info-tip");return(0,e.jsx)("section",{className:"metric-card","data-resource-expandable":"",role:"button",tabIndex:0,"aria-label":n.label,onClick:r=>{s(r.target)||n.onOpen()},onKeyDown:r=>{s(r.target)||r.key!=="Enter"&&r.key!==" "||(r.preventDefault(),n.onOpen())},children:n.children})}function M(n){return(0,e.jsx)("article",{className:"resource-trend-cell","data-resource-expandable":"",role:"button",tabIndex:0,"aria-label":n.label,onClick:n.onOpen,onKeyDown:s=>{s.key!=="Enter"&&s.key!==" "||(s.preventDefault(),n.onOpen())},children:n.children})}function te(n){let s=k(),r=(0,g.useRef)(null);return(0,g.useEffect)(()=>{let t=r.current;if(t)if(n.detail){if(!t.open)try{t.showModal()}catch{}}else t.open&&t.close()},[n.detail]),(0,g.useEffect)(()=>()=>{let t=r.current;t?.open&&t.close()},[]),(0,e.jsx)("dialog",{ref:r,className:"resource-detail-modal",onCancel:t=>{t.preventDefault(),n.onClose()},onClose:n.onClose,onClick:t=>{t.target===t.currentTarget&&n.onClose()},children:n.detail?(0,e.jsxs)("article",{className:"resource-detail-modal-card",children:[(0,e.jsxs)("header",{className:"resource-detail-modal-head",children:[(0,e.jsx)("h3",{children:n.detail.title}),(0,e.jsx)("button",{type:"button",className:"resource-detail-modal-close","aria-label":s("monitoring.modalClose"),title:s("monitoring.modalClose"),onClick:n.onClose})]}),(0,e.jsxs)("div",{className:"resource-detail-modal-body",children:[(0,e.jsxs)("section",{className:"resource-detail-summary",children:[(0,e.jsx)("strong",{children:n.detail.value}),(0,e.jsx)("p",{children:n.detail.detail})]}),n.detail.chart?(0,e.jsx)(R,{className:"resource-detail-chart",values:n.detail.chart.values,timestamps:n.detail.chart.timestamps,unit:n.detail.chart.unit,startLabel:n.detail.chart.startLabel,endLabel:n.detail.chart.endLabel,emptyLabel:n.detail.chart.emptyLabel}):(0,e.jsx)("p",{className:"resource-detail-empty",children:n.detail.emptyText})]})]}):null})}function ne({reasons:n}){return(0,e.jsx)("span",{className:"resource-reasons",children:(n??[]).join(", ")||"-"})}function y({label:n,value:s,tone:r}){return(0,e.jsxs)("span",{className:`resource-pill${r?` ${r}`:""}`,children:[(0,e.jsx)("span",{children:n}),(0,e.jsx)("b",{children:s})]})}function se({bots:n,cpuReady:s=!0}){let r=k();return(0,e.jsx)("div",{className:"resource-list-shell",children:(0,e.jsx)(H,{className:"resource-runtime-list",children:n.length?n.map(t=>{let o=t.runtime?.sessions,u=t.runtime?.daemonStatus??t.daemonStatus??"unknown",a=u==="online"?"ok":u==="offline"?"off":"warn";return(0,e.jsxs)(T,{className:"resource-list-item resource-bot-item",children:[(0,e.jsxs)(D,{children:[(0,e.jsx)("strong",{title:t.botName,children:t.botName}),(0,e.jsxs)("span",{children:[r("monitoring.sessionsCount")," ",d(o?.total??t.sessions?.count)]})]}),(0,e.jsx)(A,{children:(0,e.jsxs)("div",{className:"resource-pill-group",children:[(0,e.jsx)(y,{label:r("monitoring.daemon"),value:u,tone:a}),(0,e.jsx)(y,{label:r("monitoring.working"),value:d(o?.working),tone:"accent"}),(0,e.jsx)(y,{label:r("monitoring.starting"),value:d(o?.starting)}),(0,e.jsx)(y,{label:r("monitoring.cpu"),value:S(t.total?.cpuPct,s)}),(0,e.jsx)(y,{label:r("monitoring.rss"),value:b(t.total?.rssBytes)})]})})]},t.larkAppId)}):(0,e.jsx)("li",{className:"empty",children:r("overview.noSessions")})})})}function re({sessions:n,cpuReady:s=!0}){let r=k();return(0,e.jsx)("div",{className:"resource-list-shell resource-session-shell",children:(0,e.jsx)(H,{className:"resource-runtime-list resource-session-list",children:n.length?n.map(t=>(0,e.jsxs)(T,{className:`resource-list-item resource-session-item${t.tracked?" is-tracked":""}`,children:[(0,e.jsxs)(D,{children:[(0,e.jsx)("strong",{title:t.title||t.sessionId,children:t.title||t.sessionId}),(0,e.jsxs)("span",{title:t.sessionId,children:[t.botName," \xB7 ",t.sessionId]})]}),(0,e.jsx)(A,{children:(0,e.jsxs)("div",{className:"resource-pill-group",children:[(0,e.jsx)(y,{label:r("monitoring.cpu"),value:S(t.current?.cpu1mPct??t.current?.cpuPct,s),tone:"accent"}),(0,e.jsx)(y,{label:r("monitoring.rss"),value:b(t.current?.rssBytes)}),(0,e.jsx)(y,{label:r("monitoring.growth"),value:b(t.current?.rssGrowth5mBytes)}),(0,e.jsx)(y,{label:r("monitoring.confidence"),value:t.confidence??"unknown",tone:t.tracked?"ok":void 0}),(0,e.jsxs)("span",{className:"resource-pill resource-rank-pill",children:[(0,e.jsx)("span",{children:r("monitoring.rank")}),(0,e.jsx)(ne,{reasons:t.rankReasons})]})]})})]},t.sessionId)):(0,e.jsx)("li",{className:"empty",children:r("overview.noSessions")})})})}function oe({current:n}){let s=k(),r=n.runtime,t=q(n),o=Z(r?.sampleHealth?.status),u=r?.daemons?.total,a=r?.daemons?.online,m=r?.daemons?.offline??(Number.isFinite(Number(u))&&Number.isFinite(Number(a))?Math.max(0,Number(u)-Number(a)):void 0),p=r?.sessions?.total,x=r?.sessions?.working,w=r?.sessions?.starting;return(0,e.jsxs)("section",{className:"overview-block resource-block",children:[(0,e.jsx)(f,{title:s("monitoring.runtimeHealth")}),(0,e.jsx)("section",{className:"panel runtime-health-panel",children:(0,e.jsxs)("div",{className:"runtime-health-grid",children:[(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:s("monitoring.sampleHealth")}),(0,e.jsx)("strong",{children:(0,e.jsx)("span",{className:`runtime-status-pill ${o}`,children:s(`monitoring.sample.${o}`)})}),(0,e.jsxs)("small",{children:[s("monitoring.sampleAge")," ",E(r?.sampleHealth?.ageMs)]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:s("monitoring.daemonHealth")}),(0,e.jsxs)("strong",{children:[d(a),"/",d(u)]}),(0,e.jsxs)("small",{children:[d(m)," ",s("monitoring.offline")]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:s("monitoring.sessionHealth")}),(0,e.jsx)("strong",{children:d(p)}),(0,e.jsxs)("small",{children:[s("monitoring.working")," ",d(x)," \xB7 ",s("monitoring.starting")," ",d(w)]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-health-card",children:[(0,e.jsx)("span",{children:s("monitoring.resourcePressure")}),(0,e.jsx)("strong",{children:S(n.host?.cpuPct,t)}),(0,e.jsxs)("small",{children:[s("monitoring.hostMemory")," ",N(n.host?.memUsedPct)," \xB7 RSS ",b(n.botmux?.rssBytes)]})]})]})})]})}function ae({runtime:n}){let s=k(),r=n?.sessions,t=r?.longestRunning,o=r?.longestWaiting;return(0,e.jsxs)("section",{className:"overview-block resource-block",children:[(0,e.jsx)(f,{title:s("monitoring.sessionPressure")}),(0,e.jsx)("section",{className:"panel runtime-session-pressure",children:(0,e.jsxs)("div",{className:"runtime-session-grid",children:[(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:s("monitoring.statusDistribution")}),(0,e.jsx)("strong",{children:d(r?.total)}),(0,e.jsxs)("small",{children:[s("monitoring.working")," ",d(r?.working)," \xB7 ",s("monitoring.starting")," ",d(r?.starting)," \xB7 ",s("monitoring.waiting")," ",d(r?.waiting)," \xB7 ",s("monitoring.idle")," ",d(r?.idle)," \xB7 ",s("monitoring.unknown")," ",d(r?.unknown)]})]}),(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:s("monitoring.longestRunning")}),(0,e.jsx)("strong",{children:j(t)}),(0,e.jsx)("small",{children:E(t?.durationMs)})]}),(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:s("monitoring.longestWaiting")}),(0,e.jsx)("strong",{children:j(o)}),(0,e.jsx)("small",{children:E(o?.durationMs)})]}),(0,e.jsxs)("section",{className:"metric-card runtime-session-card",children:[(0,e.jsx)("span",{children:s("monitoring.unattributedSessions")}),(0,e.jsx)("strong",{children:d(r?.unattributed)}),(0,e.jsx)("small",{children:s("monitoring.unattributedHint")})]})]})})]})}function ie({initialCurrent:n=null,initialHistory:s=null,poll:r=!0}={}){let t=k(),[o,u]=(0,g.useState)(n),[a,m]=(0,g.useState)(s),[p,x]=(0,g.useState)("cpu"),[w,c]=(0,g.useState)(null);(0,g.useEffect)(()=>{if(!r)return;let l=!1;async function h(){try{let[z,J]=await Promise.all([fetch("/api/resources/current",{cache:"no-store"}),fetch("/api/resources/history?range=3h",{cache:"no-store"})]),[Q,X]=await Promise.all([z.json(),J.json()]);l||(u(Q),m(X))}catch{l||(u({supported:!1,reason:"fetch_failed",bots:[],sessions:[]}),m({supported:!1,bots:[],sessions:[]}))}}h();let O=window.setInterval(()=>{h()},1e4);return()=>{l=!0,window.clearInterval(O)}},[r]);let P=o!==null&&a!==null,B=(0,g.useMemo)(()=>ee(o?.sessions??[],p),[o?.sessions,p]),v=o?.supported!==!1,L=q(o),i={hostStartLabel:F(a?.host?.timestamps,o?.sampledAt,t),botmuxStartLabel:F(a?.botmux?.timestamps,o?.sampledAt,t),endLabel:t("monitoring.chartNow"),emptyLabel:t("monitoring.chartNoData")};return(0,e.jsxs)("section",{className:"page resource-page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("monitoring.eyebrow")}),(0,e.jsx)("h1",{children:t("monitoring.runtimeTitle")})]})}),P?null:(0,e.jsx)(K,{label:t("common.loading")}),P?(0,e.jsxs)(e.Fragment,{children:[o?(0,e.jsx)(oe,{current:o}):null,v?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("section",{className:"overview-block resource-block resource-pressure-block",children:[(0,e.jsx)(f,{title:t("monitoring.resourcePressure")}),(0,e.jsx)("section",{className:"panel resource-pressure",children:(0,e.jsxs)("div",{className:"resource-metrics runtime-pressure-grid",children:[(0,e.jsxs)(I,{label:t("monitoring.hostCpu"),onOpen:()=>c({title:t("monitoring.hostCpu"),value:S(o?.host?.cpuPct,L),detail:`load ${Number(o?.host?.load1??0).toFixed(2)}`,chart:{values:a?.host?.cpuPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:i.hostStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("span",{children:t("monitoring.hostCpu")}),(0,e.jsx)("strong",{children:S(o?.host?.cpuPct,L)}),(0,e.jsxs)("small",{children:["load ",Number(o?.host?.load1??0).toFixed(2)]})]}),(0,e.jsxs)(I,{label:t("monitoring.hostMemory"),onOpen:()=>c({title:t("monitoring.hostMemory"),value:N(o?.host?.memUsedPct),detail:t("monitoring.memoryOnly"),chart:{values:a?.host?.memUsedPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:i.hostStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("span",{children:t("monitoring.hostMemory")}),(0,e.jsx)("strong",{children:N(o?.host?.memUsedPct)}),(0,e.jsx)("small",{children:t("monitoring.memoryOnly")})]}),(0,e.jsxs)(I,{label:t("monitoring.botmuxRss"),onOpen:()=>c({title:t("monitoring.botmuxRss"),value:b(o?.botmux?.rssBytes),detail:o?.botmuxBreakdown?`${t("monitoring.botmuxSelf")} ${b((o.botmuxBreakdown.daemon.rssBytes??0)+(o.botmuxBreakdown.worker.rssBytes??0))}
2
+ ${t("monitoring.botmuxCli")} ${b(o.botmuxBreakdown.cli.rssBytes)}`:S(o?.botmux?.cpuPct,L),chart:{values:a?.botmux?.rssBytes,timestamps:a?.botmux?.timestamps,unit:"bytes",startLabel:i.botmuxStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsxs)("div",{className:"metric-label-with-help",children:[(0,e.jsx)("span",{children:t("monitoring.botmuxRss")}),(0,e.jsx)(G,{label:t("monitoring.rssHelpLabel"),children:t("monitoring.rssHelp")})]}),(0,e.jsx)("strong",{children:b(o?.botmux?.rssBytes)}),o?.botmuxBreakdown&&(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("small",{className:"metric-breakdown",children:[t("monitoring.botmuxSelf")," ",b((o.botmuxBreakdown.daemon.rssBytes??0)+(o.botmuxBreakdown.worker.rssBytes??0)),(0,e.jsxs)("span",{className:"metric-breakdown-detail",children:[" (",t("monitoring.botmuxDaemon")," ",b(o.botmuxBreakdown.daemon.rssBytes)," \xB7 ",t("monitoring.botmuxWorker")," ",b(o.botmuxBreakdown.worker.rssBytes),")"]})]}),(0,e.jsxs)("small",{className:"metric-breakdown",children:[t("monitoring.botmuxCli")," ",b(o.botmuxBreakdown.cli.rssBytes)]})]})]}),(0,e.jsxs)(I,{label:t("monitoring.trackedSessions"),onOpen:()=>c({title:t("monitoring.trackedSessions"),value:d(o?.rankings?.tracked?.length),detail:`${t("monitoring.currentSessions")} ${(o?.sessions??[]).length}`,emptyText:t("monitoring.trackedSessionHint")}),children:[(0,e.jsx)("span",{children:t("monitoring.trackedSessions")}),(0,e.jsx)("strong",{children:o?.rankings?.tracked?.length??0}),(0,e.jsxs)("small",{children:[t("monitoring.currentSessions")," ",(o?.sessions??[]).length]})]})]})})]}),(0,e.jsxs)("section",{className:"overview-block resource-block",children:[(0,e.jsx)(f,{title:t("monitoring.trends")}),(0,e.jsx)("section",{className:"panel resource-trends",children:(0,e.jsxs)("div",{className:"resource-trend-grid",children:[(0,e.jsxs)(M,{label:t("monitoring.trendHostCpu"),onOpen:()=>c({title:t("monitoring.trendHostCpu"),value:N(C(a?.host?.cpuPct)),detail:`load ${Number(o?.host?.load1??0).toFixed(2)}`,chart:{values:a?.host?.cpuPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:i.hostStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("b",{children:t("monitoring.trendHostCpu")}),(0,e.jsx)(R,{values:a?.host?.cpuPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:i.hostStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel})]}),(0,e.jsxs)(M,{label:t("monitoring.trendHostMemory"),onOpen:()=>c({title:t("monitoring.trendHostMemory"),value:N(C(a?.host?.memUsedPct)),detail:t("monitoring.memoryOnly"),chart:{values:a?.host?.memUsedPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:i.hostStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("b",{children:t("monitoring.trendHostMemory")}),(0,e.jsx)(R,{values:a?.host?.memUsedPct,timestamps:a?.host?.timestamps,unit:"pct",startLabel:i.hostStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel})]}),(0,e.jsxs)(M,{label:t("monitoring.trendBotmuxCpu"),onOpen:()=>c({title:t("monitoring.trendBotmuxCpu"),value:N(C(a?.botmux?.cpuPct)),detail:t("monitoring.botRuntime"),chart:{values:a?.botmux?.cpuPct,timestamps:a?.botmux?.timestamps,unit:"pct",startLabel:i.botmuxStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("b",{children:t("monitoring.trendBotmuxCpu")}),(0,e.jsx)(R,{values:a?.botmux?.cpuPct,timestamps:a?.botmux?.timestamps,unit:"pct",startLabel:i.botmuxStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel})]}),(0,e.jsxs)(M,{label:t("monitoring.botmuxRss"),onOpen:()=>c({title:t("monitoring.botmuxRss"),value:b(C(a?.botmux?.rssBytes)),detail:t("monitoring.memoryOnly"),chart:{values:a?.botmux?.rssBytes,timestamps:a?.botmux?.timestamps,unit:"bytes",startLabel:i.botmuxStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("b",{children:t("monitoring.botmuxRss")}),(0,e.jsx)(R,{values:a?.botmux?.rssBytes,timestamps:a?.botmux?.timestamps,unit:"bytes",startLabel:i.botmuxStartLabel,endLabel:i.endLabel,emptyLabel:i.emptyLabel})]})]})})]})]}):(0,e.jsx)("section",{className:"panel resource-unavailable",children:(0,e.jsxs)("div",{className:"resource-unavailable-card",children:[(0,e.jsx)("span",{className:"resource-unavailable-status","aria-hidden":"true"}),(0,e.jsxs)("div",{className:"resource-unavailable-copy",children:[(0,e.jsx)("span",{children:t("monitoring.unsupportedKicker")}),(0,e.jsx)("h2",{children:t("monitoring.unsupportedTitle")}),(0,e.jsx)("p",{children:t("monitoring.unsupportedHint")})]}),(0,e.jsxs)("div",{className:"resource-unavailable-tags","aria-label":t("monitoring.unsupported"),children:[(0,e.jsx)("span",{children:t("monitoring.unsupportedRuntimeOk")}),(0,e.jsx)("span",{children:t("monitoring.unsupportedResourceOnly")})]})]})}),o?(0,e.jsx)(ae,{runtime:o.runtime}):null,v?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("section",{className:"overview-block resource-block",children:[(0,e.jsx)(f,{title:t("monitoring.botRuntime")}),(0,e.jsx)("section",{className:"panel",children:(0,e.jsx)(se,{bots:o?.bots??[],cpuReady:L})})]}),(0,e.jsxs)("section",{className:"overview-block resource-block",children:[(0,e.jsx)(f,{title:t("monitoring.sessions"),children:(0,e.jsx)("div",{className:"resource-sortbar resource-sortbar-inline dashboard-toolbar",role:"group","aria-label":t("monitoring.sort"),children:(0,e.jsx)("div",{className:"segmented resource-sort-switch",children:["cpu","rss","growth","bot","status"].map(l=>(0,e.jsx)("button",{type:"button",className:p===l?"active":void 0,"aria-pressed":p===l,onClick:()=>x(l),children:t(`monitoring.sort.${l}`)},l))})})}),(0,e.jsx)("section",{className:"panel",children:(0,e.jsx)(re,{sessions:B,cpuReady:L})})]}),(0,e.jsxs)("section",{className:"overview-block resource-block",children:[(0,e.jsx)(f,{title:t("monitoring.trackedSessionTrends")}),(0,e.jsx)("section",{className:"panel",children:(0,e.jsxs)("div",{className:"resource-trend-grid",children:[(a?.sessions??[]).map(l=>{let h=`${l.botName} \xB7 ${l.title||l.sessionId}`,O=F(l.series?.timestamps,o?.sampledAt,t);return(0,e.jsxs)(M,{label:h,onOpen:()=>c({title:h,value:b(C(l.series?.rssBytes)),detail:l.sessionId,chart:{values:l.series?.rssBytes,timestamps:l.series?.timestamps,unit:"bytes",startLabel:O,endLabel:i.endLabel,emptyLabel:i.emptyLabel}}),children:[(0,e.jsx)("b",{title:h,children:h}),(0,e.jsx)(R,{values:l.series?.rssBytes,timestamps:l.series?.timestamps,unit:"bytes",startLabel:O,endLabel:i.endLabel,emptyLabel:i.emptyLabel})]},l.sessionId)}),(a?.sessions??[]).length?null:(0,e.jsx)("div",{className:"empty",children:t("monitoring.noTrackedHistory")})]})})]})]}):null]}):null,(0,e.jsx)(te,{detail:w,onClose:()=>c(null)})]})}function ce(n){return _(n,(0,e.jsx)(ie,{}))}export{ie as MonitoringPage,re as SessionResourceTable,ce as renderMonitoringPage};
@@ -0,0 +1 @@
1
+ import{a as x,c as w}from"./chunk-BRTZFELS.js";import{a as S,d as p}from"./chunk-ZJING6FY.js";import{c as g}from"./chunk-XCPSHD3G.js";var n=g(S(),1);var e=g(p(),1),u=78222186;function y(t){return(t/1048576).toFixed(0)}function T(){let t=w(),[i,a]=(0,n.useState)(null),[c,l]=(0,n.useState)(""),[m,h]=(0,n.useState)(!1),d=(0,n.useRef)(null),r=(0,n.useRef)(!1),v=()=>{d.current&&(clearTimeout(d.current),d.current=null)};async function f(){if(!r.current)try{let s=await fetch("/api/game/status");if(r.current)return;if(!s.ok){a({state:"absent",received:0,total:u});return}let o=await s.json();if(r.current)return;a(o),typeof o.proxy=="string"&&l(o.proxy),o.state==="downloading"&&(d.current=setTimeout(()=>{f()},700))}catch{r.current||(d.current=setTimeout(()=>{f()},1500))}}(0,n.useEffect)(()=>(r.current=!1,f(),()=>{r.current=!0,v()}),[]);async function b(){v(),h(!0),a({state:"downloading",received:0,total:u});try{let s=await fetch("/api/game/download",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({proxy:c.trim()})});if(r.current)return;if(!s.ok)throw new Error(`HTTP ${s.status}`);let o=await s.json();if(r.current)return;a(o),typeof o.proxy=="string"&&l(o.proxy),o.state==="downloading"&&(d.current=setTimeout(()=>{f()},700))}catch(s){if(r.current)return;a({state:"error",received:0,total:u,error:s instanceof Error?s.message:String(s)})}finally{r.current||h(!1)}}return i?.state==="ready"?(0,e.jsx)("div",{className:"office-frame-shell",children:(0,e.jsx)("iframe",{className:"office-game-frame",src:"/game/index.html",title:"HD2D Office",allow:"autoplay"})}):(0,e.jsx)(P,{status:i??{state:"absent",received:0,total:u},title:t("nav.office"),proxy:c,starting:m,onProxyChange:l,onStart:()=>{b()}})}function P(t){let i=t.status.total||u,a=(0,n.useMemo)(()=>i?Math.min(100,Math.round(t.status.received/i*100)):0,[t.status.received,i]),c=t.status.state==="downloading",l=t.status.state==="error";return(0,e.jsxs)("div",{style:{margin:"auto",textAlign:"center",maxWidth:440,padding:32,color:"var(--fg,#e6e6e6)"},children:[(0,e.jsx)("h1",{style:{fontSize:18,fontWeight:600,lineHeight:1.2,margin:"0 0 8px"},children:t.title}),(0,e.jsxs)("div",{style:{fontSize:13,opacity:.7,lineHeight:1.7,marginBottom:20},children:["\u628A\u6BCF\u4E2A\u4F1A\u8BDD\u53D8\u6210\u529E\u516C\u5BA4\u91CC\u7684\u4E00\u4E2A\u673A\u5668\u4EBA\uFF0C\u5B9E\u65F6\u6620\u5C04\u5C4F\u5E55\u72B6\u6001\u3002",(0,e.jsx)("br",{}),"\u9996\u6B21\u8FDB\u5165\u9700\u4E0B\u8F7D\u7EA6 ",y(i)," MB \u6E38\u620F\u8D44\u6E90\uFF08\u4EC5\u4E00\u6B21\uFF0C\u4E4B\u540E\u672C\u5730\u7F13\u5B58\uFF09\u3002"]}),l?(0,e.jsxs)("div",{style:{color:"#e06c75",fontSize:12,marginBottom:14},children:["\u4E0A\u6B21\u4E0B\u8F7D\u5931\u8D25\uFF1A",t.status.error??"\u672A\u77E5\u9519\u8BEF",(0,e.jsx)("br",{}),(0,e.jsx)("span",{style:{opacity:.7},children:"\u586B\u4EE3\u7406\u540E\u70B9\u91CD\u8BD5"})]}):null,c?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("div",{style:{background:"var(--surface-muted)",borderRadius:"var(--radius-lg)",height:10,overflow:"hidden",marginBottom:10},children:(0,e.jsx)("div",{style:{height:"100%",width:`${a}%`,background:"var(--accent)",transition:"width .3s"}})}),(0,e.jsxs)("div",{style:{fontSize:12,opacity:.7},children:["\u4E0B\u8F7D\u4E2D... ",y(t.status.received)," / ",y(i)," MB\uFF08",a,"%\uFF09"]})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("input",{id:"hd2d-proxy",className:"office-proxy-input",type:"text",value:t.proxy,onChange:m=>t.onProxyChange(m.currentTarget.value),placeholder:"HTTP \u4EE3\u7406\uFF08\u53EF\u9009\uFF0C\u5982 http://127.0.0.1:7890\uFF09"}),(0,e.jsx)("div",{style:{fontSize:11,opacity:.5,marginBottom:14,textAlign:"left"},children:"\u8FDE\u4E0D\u4E0A GitHub \u65F6\u586B\u4EE3\u7406\uFF08\u4EC5\u7528\u4E8E\u4E0B\u8F7D\u672C\u8D44\u6E90\uFF0C\u4F1A\u8BB0\u4F4F\uFF09\u3002\u7559\u7A7A\u8D70\u76F4\u8FDE/\u7CFB\u7EDF\u4EE3\u7406\u73AF\u5883\u53D8\u91CF\u3002"}),(0,e.jsxs)("button",{id:"hd2d-load",type:"button",className:"page-primary-action office-load-button",disabled:t.starting,onClick:t.onStart,children:[l?"\u91CD\u8BD5":"\u52A0\u8F7D\u529E\u516C\u5BA4","\uFF08\u7EA6 ",y(i)," MB\uFF09"]})]})]})}function B(t){let i={maxWidth:t.style.maxWidth,padding:t.style.padding,flex:t.style.flex,minHeight:t.style.minHeight,minWidth:t.style.minWidth,display:t.style.display,overflow:t.style.overflow};t.style.maxWidth="none",t.style.padding="0",t.style.flex="1 1 auto",t.style.minHeight="0",t.style.minWidth="0",t.style.display="flex",t.style.overflow="hidden";let a=x(t,(0,e.jsx)(T,{}));return()=>{a(),t.style.maxWidth=i.maxWidth,t.style.padding=i.padding,t.style.flex=i.flex,t.style.minHeight=i.minHeight,t.style.minWidth=i.minWidth,t.style.display=i.display,t.style.overflow=i.overflow}}export{B as renderOfficePage};
@@ -0,0 +1 @@
1
+ import{a as Q,b as j}from"./chunk-VRLL7SNU.js";import{a as G,b as J,c as A}from"./chunk-BRTZFELS.js";import{b as H,d as M,e as T,f as O,j as K,l as x,m as I,n as P,o as W,q as X}from"./chunk-6TPODDDC.js";import{a as ae,d as V}from"./chunk-ZJING6FY.js";import{A as $,C,D as q,E as y,F as f,G as h,c as R,v as L,x as k}from"./chunk-XCPSHD3G.js";var r=R(ae(),1);var t=R(V(),1),re=new Set(["working","analyzing","active","starting"]),le=new Set(["idle","dormant"]),ee="botmux.overview.teamExpanded",te="botmux.overview.activeSort",_=5,z=1,ce=260;function ve(){try{return window.localStorage.getItem(ee)==="1"}catch{return!1}}function de(e){try{window.localStorage.setItem(ee,e?"1":"0")}catch{}}function me(e){return e==="attention"?"attention":"time"}function ue(){try{return me(window.localStorage.getItem(te))}catch{return"time"}}function we(e){try{window.localStorage.setItem(te,e)}catch{}}function pe(e,s){let o=(i,a)=>Number(a.lastMessageAt??0)-Number(i.lastMessageAt??0);return s==="attention"?[...e].sort((i,a)=>{let m=f(i)?0:1,l=f(a)?0:1;if(m!==l)return m-l;if(m===0){let p=h(i)-h(a);if(p!==0)return p}return o(i,a)}):[...e].sort(o)}function fe(e){return String(e??"unknown").toLowerCase().replace(/[^a-z0-9_-]/g,"-")}function ge(e,s){let o=String(e??"unknown"),i=`sessions.status.${o}`,a=s(i);return a===i?o:a}function Se(e){if(!e)return z*_;let s=window.getComputedStyle(e).gridTemplateColumns.split(/\s+/).filter(i=>Number.parseFloat(i)>0);return Math.max(1,s.length||_)*z}function be(e,s){if(!e)return;let o=document.querySelector(".sidebar");if(!o||window.matchMedia("(max-width: 980px)").matches){e.style.removeProperty(s);return}let i=o.getBoundingClientRect().bottom,a=e.getBoundingClientRect().top,l=`${Math.max(ce,Math.round(i-a))}px`;e.style.getPropertyValue(s)!==l&&e.style.setProperty(s,l)}function he({card:e}){let s=A(),o=!e.online&&e.active.length===0,i=e.attention.length>0,a=e.busy.length>0,m=i?"warn":a?"busy":o?"off":"ok",l;if(i){let v=[...e.attention].sort((g,S)=>h(g)-h(S))[0];l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("b",{children:(y(v.title)||v.sessionId).slice(0,60)})," \xB7 ",f(v)??""]})}else if(a){let v=[...e.busy].sort((g,S)=>Number(S.lastMessageAt??0)-Number(g.lastMessageAt??0))[0];l=(0,t.jsx)("b",{children:(y(v.title)||v.sessionId).slice(0,60)})}else o?l=s("overview.botOffline"):l=s("overview.botIdle");let p=i?(0,t.jsx)("span",{className:"tag tag-warn",children:s("overview.botNeedsYou")}):a?(0,t.jsx)("span",{className:"tag tag-run",children:s("overview.botBusy",{count:e.busy.length})}):o?(0,t.jsx)("span",{className:"tag tag-off",children:s("overview.botOff")}):(0,t.jsx)("span",{className:"tag tag-ok",children:s("overview.botReady")});return(0,t.jsxs)("article",{className:`mate${i?" mate-attn":""}${o?" mate-off":""}`,children:[(0,t.jsxs)("div",{className:"mate-top",children:[(0,t.jsx)(H,{html:k({name:e.botName,larkAppId:e.larkAppId,avatarUrl:e.botAvatarUrl,dot:m})}),(0,t.jsxs)("div",{className:"mate-id",children:[(0,t.jsx)("b",{children:e.botName}),(0,t.jsx)("span",{className:"mate-role",children:e.cliId})]})]}),(0,t.jsx)("div",{className:"mate-task",children:l}),(0,t.jsxs)("div",{className:"mate-foot",children:[p,(0,t.jsx)("span",{children:e.lastActiveAt?s("overview.lastActive",{time:L(e.lastActiveAt)}):s("common.never")})]})]})}function Ae({session:e}){let s=A(),o=C(e),i=String(e.status??"unknown"),a=f(e);return(0,t.jsxs)(I,{kind:"session",children:[(0,t.jsx)(H,{html:k({name:o,larkAppId:e.larkAppId,size:"sm"})}),(0,t.jsxs)(P,{children:[(0,t.jsx)("b",{children:(y(e.title)||e.sessionId).slice(0,64)}),(0,t.jsxs)("span",{children:[o," \xB7 ",q(e)??e.cliId??"unknown"," \xB7 ",L(e.lastMessageAt)]})]}),(0,t.jsx)(W,{children:a?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("a",{className:"overview-list-action",href:"#/sessions",children:s("strip.handle")}),(0,t.jsx)("span",{className:"status overview-list-status status-attention",children:a})]}):(0,t.jsx)("span",{className:`status overview-list-status status-${fe(i)}`,children:ge(i,s)})})]})}function Ne({schedule:e,timeZone:s}){let o=e.nextRunAt?new Date(e.nextRunAt).toLocaleString(void 0,s?{timeZone:s,timeZoneName:"short"}:void 0):"-";return(0,t.jsxs)(I,{kind:"schedule",children:[(0,t.jsxs)(P,{children:[(0,t.jsx)("strong",{children:e.name??e.id}),(0,t.jsxs)("span",{children:[C(e)," \xB7 ",e.parsed?.display??""]})]}),(0,t.jsx)("span",{className:"overview-list-meta",children:(0,t.jsx)(K,{text:o,showPopover:!1,durationMs:2600})})]})}function ye({mode:e,onModeChange:s}){let o=A(),i=o(e==="attention"?"overview.sortAttentionFirst":"overview.sortByTime");return(0,t.jsx)(X,{className:"overview-active-sort-menu",label:i,value:e,options:[{value:"time",label:o("overview.sortByTime")},{value:"attention",label:o("overview.sortAttentionFirst")}],onChange:s})}function Me(){let e=A(),s=(0,r.useRef)(null),o=(0,r.useRef)(null),i=(0,r.useRef)(null),[a,m]=(0,r.useState)(ve),[l,p]=(0,r.useState)(ue),[v,g]=(0,r.useState)(z*_),[S,D]=(0,r.useState)(0),{sessions:N,schedules:B,scheduleTimeZone:ne}=J(n=>({sessions:[...n.sessions.values()],schedules:[...n.schedules.values()],scheduleTimeZone:n.scheduleTimeZone}));(0,r.useEffect)(()=>{let n=0,d=()=>{window.cancelAnimationFrame(n),n=window.requestAnimationFrame(()=>{let w=Se(s.current);g(c=>c===w?c:w)})};d();let u=typeof ResizeObserver>"u"||!s.current?null:new ResizeObserver(d);return u&&s.current&&u.observe(s.current),window.addEventListener("resize",d),()=>{window.cancelAnimationFrame(n),u?.disconnect(),window.removeEventListener("resize",d)}},[]),(0,r.useEffect)(()=>{Q().then(()=>D(n=>n+1)),$().then(()=>D(n=>n+1))},[]);let F=(0,r.useMemo)(()=>N.filter(n=>n.status!=="closed"),[N]),b=(0,r.useMemo)(()=>j(N),[N,S]),U=a?b:b.slice(0,v),Y=(0,r.useMemo)(()=>pe(F.filter(n=>f(n)||re.has(n.status)||le.has(n.status)),l).slice(0,7),[F,l]),E=(0,r.useMemo)(()=>B.filter(n=>n.nextRunAt).sort((n,d)=>Date.parse(n.nextRunAt)-Date.parse(d.nextRunAt)).slice(0,5),[B]);(0,r.useEffect)(()=>{let n=[{el:o.current,propertyName:"--active-sessions-min-height"},{el:i.current,propertyName:"--schedules-panel-min-height"}].filter(c=>!!c.el);if(!n.length)return;let d=0,u=()=>{window.cancelAnimationFrame(d),d=window.requestAnimationFrame(()=>{for(let c of n)be(c.el,c.propertyName)})};u();let w=typeof ResizeObserver>"u"?null:new ResizeObserver(u);if(w){for(let ie of n)w.observe(ie.el);let c=document.querySelector(".sidebar"),Z=n[0].el.closest(".page");c&&w.observe(c),Z&&w.observe(Z)}return window.addEventListener("resize",u),()=>{window.cancelAnimationFrame(d),w?.disconnect(),window.removeEventListener("resize",u);for(let c of n)c.el.style.removeProperty(c.propertyName)}},[a,v,b.length,E.length]);let se=()=>{m(n=>(de(!n),!n))},oe=n=>{p(n),we(n)};return(0,t.jsxs)("section",{className:"page hero-page",children:[(0,t.jsx)("div",{className:"page-heading",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"eyebrow",children:e("app.subtitle")}),(0,t.jsx)("h1",{children:e("overview.title")})]})}),(0,t.jsxs)("div",{className:"overview-layout",children:[(0,t.jsxs)("div",{className:"overview-main",children:[(0,t.jsxs)("section",{className:"overview-block team-section",children:[(0,t.jsx)(M,{title:e("overview.team"),count:e("overview.teamCount",{count:b.length}),hint:e("overview.teamHint"),children:(0,t.jsx)(O,{children:(0,t.jsx)(T,{href:"#/bot-defaults",children:e("overview.viewAllPlain")})})}),(0,t.jsx)("div",{className:"team-grid",id:"team-grid",ref:s,children:U.length?U.map(n=>(0,t.jsx)(he,{card:n},n.larkAppId??n.botName)):(0,t.jsx)("div",{className:"empty",children:e("overview.noSessions")})}),b.length>v?(0,t.jsx)("button",{type:"button",className:"team-toggle",id:"team-toggle",onClick:se,children:e(a?"overview.teamCollapse":"overview.teamExpand")}):null]}),(0,t.jsxs)("section",{className:"overview-block",children:[(0,t.jsx)(M,{title:e("overview.activeSessions"),children:(0,t.jsxs)(O,{children:[(0,t.jsx)(ye,{mode:l,onModeChange:oe}),(0,t.jsx)(T,{href:"#/sessions",children:e("overview.viewAllPlain")})]})}),(0,t.jsx)("section",{className:"panel active-sessions-panel",ref:o,children:(0,t.jsx)(x,{id:"recent-sessions",children:Y.length?Y.map(n=>(0,t.jsx)(Ae,{session:n},n.sessionId)):(0,t.jsx)("li",{className:"empty",children:e("overview.noSessions")})})})]})]}),(0,t.jsx)("aside",{className:"overview-side",children:(0,t.jsxs)("section",{className:"overview-block",children:[(0,t.jsx)(M,{title:e("overview.nextSchedules"),children:(0,t.jsx)(T,{href:"#/schedules",children:e("overview.viewAllPlain")})}),(0,t.jsx)("section",{className:"panel schedules-panel",ref:i,children:(0,t.jsx)(x,{id:"next-schedules",children:E.length?E.map(n=>(0,t.jsx)(Ne,{schedule:n,timeZone:ne},n.id)):(0,t.jsx)("li",{className:"empty",children:e("overview.noSchedules")})})})]})})]})]})}function Ce(e){e.classList.add("overview-root");let s=G(e,(0,t.jsx)(Me,{}));return()=>{s(),e.classList.remove("overview-root")}}export{Ce as renderOverviewPage};
@@ -0,0 +1 @@
1
+ import{a as Oe,b as He,c as Ve,d as _e}from"./chunk-R3FXBFQH.js";import{a as se,c as Ue}from"./chunk-BRTZFELS.js";import{b as Fe,c as re,h as ne,p as le}from"./chunk-6TPODDDC.js";import{a as Jt,d as De}from"./chunk-ZJING6FY.js";import{A as $e,c as oe,x as je}from"./chunk-XCPSHD3G.js";var l=oe(Jt(),1);var w=32768,Je=Math.floor(w*.95),Kt=/^[A-Za-z0-9._-]{1,64}$/;function ae(n){return Kt.test(n)&&n!=="."&&n!==".."}function Ke(n=location.hash){let[,t=""]=n.split("?");return new URLSearchParams(t).get("chatId")?.trim()||null}function ie(n,t){return Ve(n,t)}function de(n){return new TextEncoder().encode(n).length}function ce(n){return n.memberBots.filter(t=>t.inChat&&t.hasRole).length}function We(n){return n.memberBots.filter(t=>t.inChat).length}function D(n,t){return t?n.find(o=>o.larkAppId===t):void 0}function qe(n,t){let o=t.toLowerCase();return o?n.filter(i=>{let d=i.chatId.toLowerCase().includes(o)||(i.name??"").toLowerCase().includes(o),y=i.memberBots.some(p=>p.larkAppId.toLowerCase().includes(o)||(p.botName??"").toLowerCase().includes(o));return d||y}):n}function Ye(n,t){let o=t.toLowerCase();return n.filter(i=>!o||i.profileId.toLowerCase().includes(o))}async function C(n){return n.json().catch(()=>({}))}async function ze(){let n=await fetch("/api/groups"),t=await C(n);return{bots:(t.bots??[]).map(o=>({larkAppId:o.larkAppId,botName:o.botName??o.larkAppId,botAvatarUrl:o.botAvatarUrl})),groups:(t.chats??[]).map(o=>({chatId:o.chatId,name:o.name??o.chatId,memberBots:(o.memberBots??[]).map(i=>({larkAppId:i.larkAppId,botName:i.botName??i.larkAppId,inChat:i.inChat??!1,hasRole:i.hasRole??!1,oncallChat:i.oncallChat??null}))}))}}async function Xe(){let n=await fetch("/api/role-profiles");return(await C(n)).profiles??[]}async function x(n){let t=await fetch(`/api/role-profiles/${encodeURIComponent(n)}`);return(await C(t)).entries??[]}async function pe(n,t){let o=await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`);return C(o)}async function Ze(n,t,o,i){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,injectMode:i})})).ok}async function Qe(n,t,o){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({injectMode:o})})).ok}async function et(n,t){return(await fetch(`/api/roles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function tt(n,t){let o=await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`);return C(o)}async function ot(n,t,o){return(await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:o,allowEmpty:!0})})).ok}async function rt(n,t){return(await fetch(`/api/role-profiles/${encodeURIComponent(n)}/${encodeURIComponent(t)}`,{method:"DELETE"})).ok}async function nt(n,t){let o=await Promise.all(t.map(async p=>{try{let c=await fetch(`/api/role-profiles/${encodeURIComponent(p.profileId)}`),f=await C(c);return[p.profileId,Array.isArray(f.entries)?f.entries:[]]}catch{return[p.profileId,[]]}})),i=new Set,d=[];for(let p of n)for(let c of p.memberBots){if(!c.inChat||!c.hasRole)continue;let f=ie(c.larkAppId,p.chatId);i.has(f)||(i.add(f),d.push({larkAppId:c.larkAppId,chatId:p.chatId}))}let y=await _e(d);return{entriesByProfile:new Map(o),effectiveRolesByBot:y}}async function lt(n){let t=await fetch(`/api/role-profiles/${encodeURIComponent(n.profileId)}/apply`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({chatId:n.chatId,larkAppId:n.larkAppId,force:n.force,preview:n.preview})}),o=await C(t);return{larkAppId:n.larkAppId,ok:t.ok&&o.ok!==!1,status:t.status,error:o.error,wouldRefuse:o.wouldRefuse}}var e=oe(De(),1);function Wt(){let n=(0,l.useRef)(!0);return(0,l.useEffect)(()=>(n.current=!0,()=>{n.current=!1}),[]),n}function qt(){let n=(0,l.useRef)(new Set);return(0,l.useEffect)(()=>()=>{for(let t of n.current)window.clearTimeout(t);n.current.clear()},[]),(0,l.useCallback)((t,o)=>{let i=window.setTimeout(()=>{n.current.delete(i),t()},o);return n.current.add(i),i},[])}function it(n){return(0,e.jsx)(Fe,{html:je({name:n.bot.botName,larkAppId:n.bot.larkAppId,avatarUrl:n.bot.botAvatarUrl,size:"sm"})})}function dt(n){let t=Ue(),o=Wt(),i=qt(),[d,y]=(0,l.useState)([]),[p,c]=(0,l.useState)([]),[f,P]=(0,l.useState)([]),[ct,ue]=(0,l.useState)({entriesByProfile:new Map,effectiveRolesByBot:new Map}),[pt,F]=(0,l.useState)(!1),[ft,J]=(0,l.useState)(!0),[ut,K]=(0,l.useState)(!0),[W,mt]=(0,l.useState)(""),[q,vt]=(0,l.useState)(""),[ht,me]=(0,l.useState)(()=>new Set),[v,ve]=(0,l.useState)(null),[h,he]=(0,l.useState)(null),[yt,U]=(0,l.useState)(null),[R,O]=(0,l.useState)(""),[S,E]=(0,l.useState)("every"),[ye,ge]=(0,l.useState)(!1),[Ie,be]=(0,l.useState)(!1),[gt,Pe]=(0,l.useState)(!1),[It,Y]=(0,l.useState)(null),[bt,Re]=(0,l.useState)(null),[m,Pt]=(0,l.useState)(null),[I,ke]=(0,l.useState)(null),[B,M]=(0,l.useState)([]),[L,H]=(0,l.useState)(""),[k,G]=(0,l.useState)(null),[Ne,Rt]=(0,l.useState)(!1),[we,Ce]=(0,l.useState)(()=>new Set),[Ae,xe]=(0,l.useState)(!1),[Se,Ee]=(0,l.useState)(!1),[kt,z]=(0,l.useState)(null),[Nt,T]=(0,l.useState)({kind:"idle"}),Be=(0,l.useRef)(0),j=(0,l.useRef)(0),Me=(0,l.useRef)(null),X=v?d.find(r=>r.chatId===v):void 0,wt=X&&h?X.memberBots.find(r=>r.larkAppId===h):void 0,Z=I?p.find(r=>r.larkAppId===I):void 0,Ct=D(B,I),Q=k?d.find(r=>r.chatId===k):void 0,V=Q?.memberBots.filter(r=>r.inChat)??[],At=V.map(r=>r.larkAppId).join("\0"),xt=B.map(r=>r.larkAppId).sort().join("\0"),St=(0,l.useMemo)(()=>qe(d,W),[d,W]),Et=(0,l.useMemo)(()=>Ye(f,q),[f,q]),ee=de(R),te=de(L),_=(0,l.useCallback)((r,s,a=!1)=>{let u=Date.now()+Math.random();r({text:s,isError:a,id:u}),i(()=>{r(g=>g?.id===u?null:g)},a?3e3:2e3)},[i]),b=(0,l.useCallback)(async(r,s)=>{try{let a=await nt(r,s);if(!o.current)return;ue(a),F(!0)}catch{if(!o.current)return;ue({entriesByProfile:new Map,effectiveRolesByBot:new Map}),F(!0)}},[o]),N=(0,l.useCallback)(async()=>{let r=await ze();return o.current&&(y(r.groups),c(r.bots)),r},[o]),$=(0,l.useCallback)(async()=>{let r=await Xe();return o.current&&P(r),r},[o]),Le=(0,l.useCallback)(async()=>{J(!0),K(!0),F(!1);try{let r=await N();if(!o.current)return;let s=await $();if(!o.current||(await $e(),!o.current))return;if(me(new Set(r.groups.filter(a=>ce(a)>0).map(a=>a.chatId))),n.tab==="profiles"){let a=Ke();G(u=>u||(a&&r.groups.some(g=>g.chatId===a)?a:r.groups[0]?.chatId??null))}else G(a=>a??r.groups[0]?.chatId??null);J(!1),K(!1),b(r.groups,s)}catch{if(!o.current)return;J(!1),K(!1),F(!0)}},[o,n.tab,N,$,b]);(0,l.useEffect)(()=>{Le()},[Le]),(0,l.useEffect)(()=>{k||d.length===0||G(d[0].chatId)},[d,k]),(0,l.useEffect)(()=>{let r=new Set(V.filter(s=>!!D(B,s.larkAppId)).map(s=>s.larkAppId));Ce(r),T({kind:"idle"})},[xt,At]);async function Bt(r,s){let a=++Be.current;ve(r),he(s);let u=await pe(s,r);!o.current||a!==Be.current||(U(u),O(u.content??""),E(u.injectMode==="once"?"once":"every"),Y(null),Re(null))}async function Mt(){let r=await N();if(o.current&&(b(r.groups,f),v&&h)){let s=await pe(h,v);if(!o.current)return;U(s),O(s.content??""),E(s.injectMode==="once"?"once":"every")}}async function Lt(){if(!(!v||!h)){ge(!0);try{let r=await Ze(h,v,R,S);if(!o.current)return;if(r){let s=await N();if(!o.current)return;U(a=>a&&{...a,content:R,hasRole:!0,injectMode:S}),b(s.groups,f),_(Y,t("roles.saved"))}else _(Y,R.trim().length===0?t("roles.emptyError"):t("roles.saveFailed"),!0)}finally{o.current&&ge(!1)}}}async function Gt(){if(!(!v||!h)&&confirm(t("roles.confirmDelete"))){be(!0);try{let r=await et(h,v);if(!o.current)return;if(r){let s=await N();if(!o.current)return;ve(null),he(null),U(null),O(""),E("every"),b(s.groups,f)}}finally{o.current&&be(!1)}}}async function Tt(r){if(!v||!h)return;let s=S;E(r),Pe(!0);try{let a=await Qe(h,v,r);if(!o.current)return;a||E(s),_(Re,t(a?"roles.saved":"roles.saveFailed"),!a)}finally{o.current&&Pe(!1)}}async function Ge(r){let s=r.trim();if(!ae(s))return;let a=++j.current;Pt(s),ke(null),H(""),T({kind:"idle"}),G(g=>g??d[0]?.chatId??null);let u=await x(s);!o.current||a!==j.current||(M(u),z(null))}async function jt(r){if(!m)return;let s=++j.current;ke(r);let a=await tt(m,r);if(!o.current||s!==j.current)return;H(a.content??"");let u=await x(m);!o.current||s!==j.current||(M(u),z(null))}async function $t(){let r=await N();if(!o.current)return;let s=await $();if(o.current){if(m){let a=await x(m);if(!o.current)return;M(a)}b(r.groups,s)}}async function Dt(){let r=Me.current,s=r?.value.trim()??"";if(s){if(!ae(s)){r?.setCustomValidity(t("roles.profileIdInvalid")),r?.reportValidity();return}r?.setCustomValidity(""),await Ge(s),o.current&&(location.hash.startsWith("#/roles/profile")||(location.hash="#/roles/profile"))}}async function Ft(){if(!(!m||!I)){xe(!0);try{let r=await ot(m,I,L);if(!o.current)return;let s=await $();if(!o.current)return;let a=await x(m);if(!o.current)return;M(a),b(d,s),_(z,t(r?"roles.saved":"roles.saveFailed"),!r)}finally{o.current&&xe(!1)}}}async function Ut(){if(!(!m||!I)&&confirm(t("roles.confirmDeleteProfileEntry"))){Ee(!0);try{if(await rt(m,I),!o.current)return;H("");let r=await $();if(!o.current)return;let s=await x(m);if(!o.current)return;M(s),b(d,r)}finally{o.current&&Ee(!1)}}}function Ot(r,s){Ce(a=>{let u=new Set(a);return s?u.add(r):u.delete(r),u})}async function Te(r){if(!m)return;let s=k??d[0]?.chatId;if(!s)return;let a=[...we];if(a.length===0){T({kind:"text",text:t("roles.applyPickBots")});return}T({kind:"text",text:"..."});let u=await Promise.all(a.map(g=>lt({profileId:m,chatId:s,larkAppId:g,force:Ne,preview:r})));if(o.current&&(T({kind:"results",preview:r,results:u}),!r)){let g=await N();if(!o.current)return;b(g.groups,f)}}let Ht=ye||ee>w||R.trim().length===0,Vt=Ae||te>w||L.trim().length===0,A=n.tab==="profiles",_t=(0,e.jsxs)("nav",{className:"roles-subnav insight-tabs",role:"tablist","aria-label":t("roles.title"),children:[(0,e.jsx)("a",{href:"#/roles",className:`itab${A?"":" on"}`,role:"tab","aria-selected":!A,children:t("roles.tabGroups")}),(0,e.jsx)("a",{href:"#/roles/profile",className:`itab${A?" on":""}`,role:"tab","aria-selected":A,children:t("roles.tabProfiles")})]});return(0,e.jsxs)("section",{className:"page roles-page",children:[(0,e.jsxs)("div",{className:"page-heading roles-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.roles")}),(0,e.jsx)("h1",{children:t("roles.title")})]}),(0,e.jsx)("div",{className:"page-heading-actions",children:_t})]}),(0,e.jsxs)("div",{id:"roles-by-group-view",className:"roles-layout",hidden:A,children:[(0,e.jsxs)("div",{className:"roles-tree-panel",children:[(0,e.jsxs)("div",{className:"roles-tree-header dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",id:"roles-search",placeholder:t("roles.search"),value:W,onChange:r=>mt(r.target.value)}),(0,e.jsx)(ne,{id:"roles-refresh",label:t("roles.refresh"),onClick:()=>{Mt()}})]}),(0,e.jsx)("div",{id:"roles-tree",className:"roles-tree",children:ft?(0,e.jsx)(re,{label:t("common.loading")}):(0,e.jsx)(zt,{groups:St,profiles:f,context:ct,contextLoaded:pt,expandedGroups:ht,selectedGroupId:v,selectedBotId:h,tr:t,onToggleGroup:r=>me(s=>Yt(s,r)),onSelectBot:(r,s)=>{Bt(r,s)}})})]}),(0,e.jsx)("div",{className:"roles-editor-panel",children:!v||!h?(0,e.jsx)("div",{id:"roles-editor-empty",className:"roles-editor-empty",children:t("roles.selectHint")}):(0,e.jsxs)("div",{id:"roles-editor-form",className:"roles-editor-form",children:[(0,e.jsxs)("div",{className:"roles-editor-head",children:[(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,e.jsx)("span",{id:"roles-editor-group-name",children:X?.name??v}),(0,e.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,e.jsx)("span",{id:"roles-editor-bot-name",children:wt?.botName??h})]}),(0,e.jsx)("div",{className:"roles-editor-meta",children:(0,e.jsxs)("span",{id:"roles-editor-chat-id",className:"roles-editor-meta-line",children:[v," \xB7 ",h]})})]}),(0,e.jsxs)("div",{className:"roles-editor-actions roles-editor-head-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-delete",className:"danger",style:{display:yt?.hasRole?"":"none"},disabled:Ie,onClick:()=>{Gt()},children:Ie?"...":t("roles.delete")}),(0,e.jsx)("button",{type:"button",id:"roles-save",className:"primary",disabled:Ht,onClick:()=>{Lt()},children:ye?"...":t("roles.save")})]})]}),(0,e.jsxs)("div",{className:"roles-editor-inject",children:[(0,e.jsx)("span",{className:"roles-field-label",children:t("roles.injectModeLabel")}),(0,e.jsx)(le,{id:"roles-editor-inject-mode",className:"roles-inline-menu",ariaLabel:t("roles.injectModeLabel"),disabled:gt,label:t(S==="once"?"roles.injectModeOnce":"roles.injectModeEvery"),value:S,options:[{value:"every",label:t("roles.injectModeEvery")},{value:"once",label:t("roles.injectModeOnce")}],onChange:r=>{Tt(r==="once"?"once":"every")}}),(0,e.jsx)("span",{className:"roles-editor-inject-hint",children:t("roles.injectModeHint")}),(0,e.jsx)(fe,{flash:bt})]}),(0,e.jsx)("textarea",{id:"roles-editor-textarea",placeholder:t("roles.editorPlaceholder"),rows:14,value:R,onChange:r=>O(r.target.value)}),(0,e.jsxs)("div",{className:"roles-editor-footer",children:[(0,e.jsxs)("span",{id:"roles-editor-bytecount",className:st(ee),children:[ee," / ",w," bytes"]}),(0,e.jsx)(fe,{flash:It})]}),(0,e.jsx)(at,{content:R,tr:t,id:"roles-preview"})]})})]}),(0,e.jsxs)("div",{id:"roles-profiles-view",className:"roles-layout roles-profiles-layout",hidden:!A,children:[(0,e.jsxs)("div",{className:"roles-tree-panel",children:[(0,e.jsxs)("div",{className:"roles-tree-header roles-profile-create dashboard-toolbar",children:[(0,e.jsx)("input",{type:"text",id:"roles-profile-id",placeholder:t("roles.profileIdPlaceholder"),maxLength:64,ref:Me,onChange:r=>r.currentTarget.setCustomValidity("")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-select",onClick:()=>{Dt()},children:t("roles.openProfile")})]}),(0,e.jsxs)("div",{className:"roles-tree-header dashboard-toolbar",children:[(0,e.jsx)("input",{type:"search",id:"roles-profile-search",placeholder:t("roles.profileSearch"),value:q,onChange:r=>vt(r.target.value)}),(0,e.jsx)(ne,{id:"roles-profile-refresh",label:t("roles.refresh"),onClick:()=>{$t()}})]}),(0,e.jsx)("div",{id:"roles-profile-list",className:"roles-tree",children:ut?(0,e.jsx)(re,{label:t("common.loading")}):(0,e.jsx)(Zt,{profiles:Et,selectedProfileId:m,tr:t,onSelect:r=>{Ge(r)}})})]}),(0,e.jsx)("div",{className:"roles-editor-panel",children:m?(0,e.jsxs)("div",{id:"roles-profile-detail",className:"roles-editor-form roles-profile-detail",children:[(0,e.jsx)("div",{className:"roles-profile-title",children:(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"roles-editor-breadcrumb",children:[(0,e.jsx)("span",{children:m}),Z?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("span",{className:"roles-breadcrumb-sep",children:"\u203A"}),(0,e.jsx)("span",{children:Z.botName??Z.larkAppId})]}):null]}),(0,e.jsx)("div",{className:"roles-editor-meta-line",children:t("roles.profileRuntimeHint")})]})}),(0,e.jsxs)("div",{className:"roles-profile-grid",children:[(0,e.jsxs)("div",{className:"roles-profile-bots",children:[(0,e.jsx)("div",{className:"roles-profile-section-title",children:t("roles.profileBots")}),(0,e.jsx)("div",{className:"roles-profile-bot-list",children:p.map(r=>{let s=!!D(B,r.larkAppId),a=I===r.larkAppId;return(0,e.jsxs)("div",{className:`roles-bot-row roles-profile-bot-row ${a?"selected":""}`,"data-profile-bot-id":r.larkAppId,onClick:()=>{jt(r.larkAppId)},children:[(0,e.jsx)(it,{bot:r}),(0,e.jsxs)("div",{className:"roles-bot-info",children:[(0,e.jsx)("div",{className:"roles-bot-name",children:r.botName??r.larkAppId}),(0,e.jsx)("div",{className:"roles-bot-id",children:r.larkAppId})]}),(0,e.jsx)("span",{className:`roles-badge ${s?"has-role":"no-role"}`,children:t(s?"roles.configured":"roles.unconfigured")})]},r.larkAppId)})})]}),(0,e.jsx)("div",{className:"roles-profile-editor",children:I?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"roles-profile-editor-head",children:[(0,e.jsxs)("span",{id:"roles-profile-bytecount",className:st(te),children:[te," / ",w," bytes"]}),(0,e.jsxs)("div",{className:"roles-editor-actions roles-editor-head-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-profile-delete",className:"danger",style:{display:Ct?"":"none"},disabled:Se,onClick:()=>{Ut()},children:Se?"...":t("roles.delete")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-save",className:"primary",disabled:Vt,onClick:()=>{Ft()},children:Ae?"...":t("roles.saveEntry")})]})]}),(0,e.jsx)("textarea",{id:"roles-profile-textarea",placeholder:t("roles.profileEditorPlaceholder"),rows:12,value:L,onChange:r=>H(r.target.value)}),(0,e.jsx)("div",{className:"roles-editor-footer",children:(0,e.jsx)(fe,{flash:kt})}),(0,e.jsx)(at,{content:L,tr:t,id:"roles-profile-preview"})]}):(0,e.jsx)("div",{className:"roles-editor-empty roles-profile-inline-empty",children:t("roles.profileBotSelectHint")})})]}),(0,e.jsxs)("div",{className:"roles-profile-apply",children:[(0,e.jsx)("div",{className:"roles-profile-section-title",children:t("roles.applyToGroup")}),(0,e.jsxs)("div",{className:"roles-profile-apply-controls",children:[(0,e.jsx)(le,{id:"roles-profile-apply-group",className:"roles-apply-group-menu",ariaLabel:t("roles.applyToGroup"),disabled:d.length===0,label:Q?.name??k??t("roles.noChats"),value:k??"",options:d.map(r=>({value:r.chatId,label:r.name??r.chatId})),onChange:r=>G(r)}),(0,e.jsxs)("label",{className:"roles-profile-force",children:[(0,e.jsx)("input",{type:"checkbox",id:"roles-profile-apply-force",checked:Ne,onChange:r=>Rt(r.target.checked)})," ",t("roles.applyForce")]})]}),(0,e.jsx)("div",{id:"roles-profile-apply-bots",children:!Q||V.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.noChats")}):V.map(r=>{let s=!!D(B,r.larkAppId);return(0,e.jsxs)("label",{className:"checkbox-row roles-profile-apply-bot",children:[(0,e.jsx)("input",{type:"checkbox",name:"profile-apply-bot",value:r.larkAppId,checked:we.has(r.larkAppId),onChange:a=>Ot(r.larkAppId,a.target.checked)}),(0,e.jsx)("span",{children:r.botName??r.larkAppId}),(0,e.jsx)("small",{children:t(s?"roles.configured":"roles.profileMissing")})]},r.larkAppId)})}),(0,e.jsxs)("div",{className:"roles-editor-actions",children:[(0,e.jsx)("button",{type:"button",id:"roles-profile-preview-apply",onClick:()=>{Te(!0)},children:t("roles.previewApply")}),(0,e.jsx)("button",{type:"button",id:"roles-profile-apply",className:"primary",onClick:()=>{Te(!1)},children:t("roles.applyProfile")})]}),(0,e.jsx)("div",{id:"roles-profile-apply-status",className:"roles-profile-status",children:(0,e.jsx)(Qt,{status:Nt,bots:p,tr:t})})]})]}):(0,e.jsx)("div",{id:"roles-profile-empty",className:"roles-editor-empty",children:t("roles.profileSelectHint")})})]})]})}function Yt(n,t){let o=new Set(n);return o.has(t)?o.delete(t):o.add(t),o}function st(n){return`roles-bytecount ${n>Je?"warn":""} ${n>w?"over":""}`}function fe(n){return n.flash?(0,e.jsxs)("span",{className:`roles-saved-flash ${n.flash.isError?"roles-save-error":""}`,children:[" ",n.flash.text]}):null}function zt(n){let{tr:t}=n;return n.groups.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.noChats")}):(0,e.jsx)(e.Fragment,{children:n.groups.map(o=>{let i=n.expandedGroups.has(o.chatId),d=o.memberBots.filter(c=>c.inChat),y=ce(o),p=We(o);return(0,e.jsxs)("div",{className:"roles-group-section",children:[(0,e.jsxs)("div",{className:`roles-group-row ${i?"expanded":""} ${n.selectedGroupId===o.chatId&&!n.selectedBotId?"selected":""}`,"data-group-id":o.chatId,onClick:()=>n.onToggleGroup(o.chatId),children:[(0,e.jsx)("span",{className:"roles-group-arrow",children:i?"\u25BE":"\u25B8"}),(0,e.jsx)("span",{className:"roles-group-icon","aria-hidden":"true",children:(0,e.jsxs)("svg",{viewBox:"0 0 16 16",children:[(0,e.jsx)("circle",{cx:"5.6",cy:"5.8",r:"2.4"}),(0,e.jsx)("path",{d:"M1.8 13.2c.5-2.4 2-3.6 3.8-3.6s3.3 1.2 3.8 3.6"}),(0,e.jsx)("circle",{cx:"11",cy:"6.8",r:"1.9"}),(0,e.jsx)("path",{d:"M9.8 12.6c.4-1.7 1.5-2.6 2.8-2.6 1 0 1.9.5 2.4 1.6"})]})}),(0,e.jsxs)("div",{className:"roles-group-info",children:[(0,e.jsx)("div",{className:"roles-group-name",children:o.name??o.chatId}),(0,e.jsxs)("div",{className:"roles-group-meta",children:[y,"/",p," ",t("roles.botsWithRoles")]}),(0,e.jsx)(Xt,{group:o,profiles:n.profiles,context:n.context,loaded:n.contextLoaded,tr:t})]}),(0,e.jsx)("span",{className:"roles-group-chevron"})]}),(0,e.jsx)("div",{className:"roles-bot-list",children:i?d.map(c=>{let f=n.selectedGroupId===o.chatId&&n.selectedBotId===c.larkAppId;return(0,e.jsxs)("div",{className:`roles-bot-row ${f?"selected":""}`,"data-group-id":o.chatId,"data-bot-id":c.larkAppId,onClick:P=>{P.stopPropagation(),n.onSelectBot(o.chatId,c.larkAppId)},children:[(0,e.jsx)("span",{className:"roles-bot-indent"}),(0,e.jsx)(it,{bot:c}),(0,e.jsxs)("div",{className:"roles-bot-info",children:[(0,e.jsx)("div",{className:"roles-bot-name",children:c.botName}),(0,e.jsx)("div",{className:"roles-bot-id",children:c.larkAppId})]}),(0,e.jsx)("span",{className:`roles-badge ${c.hasRole?"has-role":"no-role"}`,children:c.hasRole?t("roles.configured"):t("roles.unconfigured")})]},c.larkAppId)}):null})]},o.chatId)})})}function Xt(n){let{group:t,profiles:o,context:i,loaded:d,tr:y}=n;if(!o.length||!d)return null;let p=new Map;for(let P of t.memberBots)P.inChat&&p.set(P.larkAppId,i.effectiveRolesByBot.get(ie(P.larkAppId,t.chatId))??null);if(!Oe(p))return null;let c=He(t.memberBots,o,i.entriesByProfile,p)[0];if(!c)return(0,e.jsx)("div",{className:"roles-profile-match muted",children:y("groups.profileStatusUnmatched")});let f=c.kind==="full"?"groups.profileStatusFullChat":"groups.profileStatusPartial";return(0,e.jsx)("div",{className:`roles-profile-match ${c.kind}`,children:y(f,{name:c.profileId,matched:c.matched,total:c.total,chat:c.chatMatched})})}function at(n){return(0,e.jsx)("div",{id:n.id,className:"roles-preview",children:n.content.trim()?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("strong",{children:n.tr("roles.preview")}),(0,e.jsx)("pre",{children:n.content})]}):(0,e.jsx)("small",{children:n.tr("roles.previewEmpty")})})}function Zt(n){let{tr:t}=n;return n.profiles.length===0?(0,e.jsx)("div",{className:"roles-empty",children:t("roles.profileEmpty")}):(0,e.jsx)(e.Fragment,{children:n.profiles.map(o=>{let i=n.selectedProfileId===o.profileId,d=(o.botEntries??[]).some(y=>y.hasEntry);return(0,e.jsxs)("div",{className:`roles-profile-row ${i?"selected":""}`,"data-profile-id":o.profileId,onClick:()=>n.onSelect(o.profileId),children:[(0,e.jsxs)("div",{className:"roles-profile-row-main",children:[(0,e.jsx)("div",{className:"roles-profile-name",children:o.profileId}),(0,e.jsxs)("div",{className:"roles-group-meta",children:[o.entryCount," ",t("roles.profileEntries")]})]}),(0,e.jsx)("span",{className:`roles-badge ${d?"has-role":"no-role"}`,children:t(d?"roles.configured":"roles.profileMissing")})]},o.profileId)})})}function Qt(n){let{status:t,bots:o,tr:i}=n;return t.kind==="idle"?null:t.kind==="text"?(0,e.jsx)(e.Fragment,{children:t.text}):(0,e.jsx)(e.Fragment,{children:t.results.map(d=>{let p=o.find(f=>f.larkAppId===d.larkAppId)?.botName??d.larkAppId,c=d.ok?t.preview?d.wouldRefuse?i("roles.applyWouldRefuse"):i("roles.applyPreviewOk"):i("roles.applyOk"):`${i("roles.applyFailed")}: ${String(d.error??`HTTP ${d.status}`)}`;return(0,e.jsxs)("div",{children:[p,": ",c]},d.larkAppId)})})}function io(n){return se(n,(0,e.jsx)(dt,{tab:"groups"}))}function co(n){return se(n,(0,e.jsx)(dt,{tab:"profiles"}))}export{co as renderRoleProfilesPage,io as renderRolesPage};
@@ -0,0 +1 @@
1
+ import{a as $,b as C,c as w}from"./chunk-BRTZFELS.js";import{l as S,m as A,n as T,o as R,p as O}from"./chunk-6TPODDDC.js";import{a as D,d as N}from"./chunk-ZJING6FY.js";import{c as k}from"./chunk-XCPSHD3G.js";var o=k(D(),1);var s=k(N(),1),I=1e3;function L(e,n){if(!e)return"\u2014";try{return new Date(e).toLocaleString(void 0,n?{timeZone:n,timeZoneName:"short"}:void 0)}catch{return e}}function M(e,n){let d=n.q.toLowerCase();return e.filter(t=>!n.kind||t.parsed?.kind===n.kind).filter(t=>!n.enabledOnly||t.enabled).filter(t=>!d||JSON.stringify(t).toLowerCase().includes(d)).sort((t,i)=>{if(t.enabled!==i.enabled)return t.enabled?-1:1;let h=t.nextRunAt?Date.parse(t.nextRunAt):1/0,u=i.nextRunAt?Date.parse(i.nextRunAt):1/0;return h-u})}function q(e,n){return e.deliver==="new-topic"?n("schedules.deliveryNewTopic"):e.deliver==="local"?n("schedules.deliveryLocal"):n("schedules.deliveryOrigin")}function E(e){return e.repeat?`${e.repeat.completed}/${e.repeat.times??"\u221E"}`:"\u2014"}function K(e){return new Promise(n=>window.setTimeout(n,e))}function Z(e){let{schedule:n,scheduleTimeZone:d,tr:t}=e,i=String(n.parsed?.kind??"unknown"),h=n.enabled?"pause":"resume",u=`${n.id}:${h}`,g=`${n.id}:run`,f=`${n.id}:delivery`;return(0,s.jsxs)(A,{kind:"schedule",className:"schedule-list-row","data-id":n.id,children:[(0,s.jsxs)(T,{children:[(0,s.jsxs)("div",{className:"schedule-row-head",children:[(0,s.jsx)("b",{children:n.name??n.id}),(0,s.jsx)("span",{className:`schedule-state ${n.enabled?"enabled":"paused"}`,children:n.enabled?t("schedules.enabled"):t("schedules.paused")})]}),(0,s.jsxs)("div",{className:"schedule-row-meta",children:[(0,s.jsx)("span",{children:n.botName??n.larkAppId??"-"}),(0,s.jsx)("span",{children:"\xB7"}),(0,s.jsx)("code",{children:n.parsed?.display??"?"})]}),(0,s.jsxs)("div",{className:"schedule-chip-strip",children:[(0,s.jsx)("span",{children:i}),(0,s.jsxs)("span",{children:[t("schedules.delivery"),": ",q(n,t)]}),(0,s.jsxs)("span",{children:[t("schedules.next"),": ",L(n.nextRunAt,d)]}),(0,s.jsxs)("span",{children:[t("schedules.last"),": ",L(n.lastRunAt,d),n.lastStatus==="error"?" \xB7 error":""]}),(0,s.jsxs)("span",{children:[t("schedules.repeat"),": ",E(n)]})]})]}),(0,s.jsx)(R,{children:(0,s.jsxs)("div",{className:"schedule-actions",children:[(0,s.jsx)(F,{op:"run",label:t("schedules.runNow"),pending:e.pending===g,feedback:e.feedback[g]??null,onClick:()=>e.onAction(n.id,"run")}),(0,s.jsx)(U,{checked:!!n.enabled,pending:e.pending===u,feedback:e.feedback[u]??null,tr:t,onClick:()=>e.onAction(n.id,h)}),n.deliver==="local"?null:(0,s.jsx)(F,{op:"delivery",label:n.deliver==="new-topic"?t("schedules.useOrigin"):t("schedules.useNewTopic"),pending:e.pending===f,feedback:e.feedback[f]??null,onClick:()=>e.onAction(n.id,"delivery")})]})})]})}function _(){let e=w(),{scheduleRows:n,scheduleTimeZone:d}=C(c=>({scheduleRows:[...c.schedules.values()],scheduleTimeZone:c.scheduleTimeZone})),[t,i]=(0,o.useState)({q:"",kind:"",enabledOnly:!1}),[h,u]=(0,o.useState)(null),[g,f]=(0,o.useState)({}),m=(0,o.useRef)(new Map),v=(0,o.useMemo)(()=>M(n,t),[n,t]);(0,o.useEffect)(()=>()=>{m.current.forEach(c=>window.clearTimeout(c)),m.current.clear()},[]);function x(c,l){f(b=>({...b,[c]:l}));let r=m.current.get(c);r&&window.clearTimeout(r);let p=window.setTimeout(()=>{f(b=>{let a={...b};return delete a[c],a}),m.current.delete(c)},l==="success"?1600:2200);m.current.set(c,p)}async function P(c,l){let r=`${c}:${l}`,p=performance.now(),b="success";u(r);try{let a=await fetch(`/api/schedules/${encodeURIComponent(c)}/${l}`,{method:"POST"}),y=await a.json().catch(()=>({}));if(!a.ok||y.ok===!1)throw new Error(`Failed: ${a.status} ${y?.error??""}`.trim())}catch{b="error"}finally{if(l==="run"){let a=I-(performance.now()-p);a>0&&await K(a)}x(r,b),u(a=>a===r?null:a)}}return(0,s.jsxs)("section",{className:"page schedules-page",children:[(0,s.jsx)("div",{className:"page-heading",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"eyebrow",children:e("nav.schedules")}),(0,s.jsx)("h1",{children:e("schedules.title")})]})}),(0,s.jsxs)("form",{id:"sched-filters",className:"filters dashboard-toolbar",children:[(0,s.jsx)("input",{type:"search",name:"q",placeholder:e("schedules.search"),value:t.q,onChange:c=>{let l=c.currentTarget.value;i(r=>({...r,q:l}))}}),(0,s.jsx)(O,{id:"sched-kind-menu",ariaLabel:e("schedules.anyKind"),label:t.kind||e("schedules.anyKind"),value:t.kind,options:[{value:"",label:e("schedules.anyKind")},{value:"cron",label:"cron"},{value:"interval",label:"interval"},{value:"once",label:"once"}],onChange:c=>i(l=>({...l,kind:c}))}),(0,s.jsxs)("label",{className:"filter-toggle",children:[(0,s.jsx)("input",{type:"checkbox",name:"enabled",checked:t.enabledOnly,onChange:c=>i(l=>({...l,enabledOnly:c.currentTarget.checked}))}),(0,s.jsx)("span",{className:"filter-toggle-label",children:e("schedules.enabledOnly")}),(0,s.jsx)("span",{className:"filter-toggle-switch","aria-hidden":"true"})]}),(0,s.jsx)("span",{className:"schedules-toolbar-spacer","aria-hidden":"true"}),(0,s.jsxs)("span",{className:"schedules-toolbar-count",children:[v.length,"/",n.length]})]}),(0,s.jsx)("section",{className:"overview-block schedules-list-section",children:(0,s.jsx)("div",{className:"schedules-list-wrap",children:v.length===0?(0,s.jsx)("div",{id:"schedules-tbody",className:"empty schedules-list-empty",children:e("schedules.empty")}):(0,s.jsx)(S,{id:"schedules-tbody",className:"schedules-list",children:v.map(c=>(0,s.jsx)(Z,{schedule:c,scheduleTimeZone:d,pending:h,feedback:g,tr:e,onAction:(l,r)=>{P(l,r)}},c.id))})})})]})}function B(e,n,d,t,i){return d?i(e==="run"?"schedules.running":"schedules.saving"):t==="success"?i(e==="run"?"schedules.runDone":"schedules.saved"):t==="error"?i("schedules.failed"):n}function F(e){let n=w(),d=e.feedback?` is-${e.feedback}`:"";return(0,s.jsx)("button",{type:"button",className:`schedule-action-button${e.pending?" is-pending":""}${d}`,"data-op":e.op,disabled:e.pending,onClick:e.onClick,children:(0,s.jsx)("span",{className:"schedule-action-label",children:B(e.op,e.label,e.pending,e.feedback,n)})})}function U(e){let n=e.feedback==="error"?e.tr("schedules.failed"):e.checked?e.tr("schedules.enabled"):e.tr("schedules.paused");return(0,s.jsxs)("button",{type:"button",className:`schedule-enabled-switch${e.checked?" is-on":""}${e.pending?" is-pending":""}${e.feedback?` is-${e.feedback}`:""}`,"aria-pressed":e.checked,disabled:e.pending,onClick:e.onClick,children:[(0,s.jsx)("span",{className:"schedule-enabled-switch-label",children:n}),(0,s.jsx)("span",{className:"schedule-enabled-switch-track","aria-hidden":"true",children:(0,s.jsx)("span",{})})]})}function j(e){return $(e,(0,s.jsx)(_,{}))}export{M as filterSchedules,L as fmtScheduleDate,j as renderSchedulesPage};