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
@@ -1,149 +0,0 @@
1
- import{a as xt,b as st,c as rt}from"./chunk-JTSE5VP6.js";import{c as G}from"./chunk-7SZRL6FY.js";var _=G(xt(),1);function ot(e,n,d){e.setAttribute("data-run-id",n),e.setAttribute("data-node-id",d.id);let l=d.webTerminal;if(l?.status==="live"&&l.webPort&&l.webPort>0){bt(e,l.webPort);return}if(d.hasPtyLog){yt(e,n,d.id,l?.status==="closed");return}Lt(e,l?.status==="live"?"\u7EC8\u7AEF\u6B63\u5728\u542F\u52A8\uFF0C\u7A0D\u540E\u5237\u65B0":"\u6682\u65E0\u7EC8\u7AEF\u8BB0\u5F55")}function bt(e,n){let d=Tt(n);e.innerHTML=`<div class="v3-terminal-panel">
2
- <div class="v3-terminal-head">
3
- <span class="v3-terminal-dot live"></span>
4
- <span>\u5B9E\u65F6\u7EC8\u7AEF\uFF08\u53EA\u8BFB\uFF09</span>
5
- <span class="muted">:${n}</span>
6
- <a class="btn-link" href="${W(d)}" target="_blank" rel="noopener">\u65B0\u7A97\u53E3\u6253\u5F00</a>
7
- </div>
8
- <iframe class="wf-terminal-frame v3-terminal-frame" src="${W(d)}" title="v3 live terminal" loading="lazy"></iframe>
9
- </div>`}function yt(e,n,d,l){let b=`/api/v3/runs/${encodeURIComponent(n)}/nodes/${encodeURIComponent(d)}/pty-log`,c=Mt(b,`${n} / ${d}`);e.innerHTML=`<div class="v3-terminal-panel">
10
- <div class="v3-terminal-head">
11
- <span class="v3-terminal-dot ${l?"closed":"replay"}"></span>
12
- <span>${l?"\u7EC8\u7AEF\u56DE\u653E":"\u7EC8\u7AEF\u8BB0\u5F55"}</span>
13
- <span class="muted">PTY log</span>
14
- <a class="btn-link" href="${W(b)}" target="_blank" rel="noopener">\u4E0B\u8F7D/\u6253\u5F00\u539F\u59CB\u65E5\u5FD7</a>
15
- </div>
16
- <iframe class="wf-terminal-frame v3-terminal-frame" srcdoc="${W(c)}" title="v3 terminal replay" loading="lazy"></iframe>
17
- </div>`}function Lt(e,n){e.innerHTML=`<div class="v3-terminal-empty muted">${Y(n)}</div>`}function Tt(e){return`http://${window.location.hostname||"127.0.0.1"}:${e}/`}function Mt(e,n){let d=JSON.stringify(e);return`<!doctype html>
18
- <html>
19
- <head>
20
- <meta charset="utf-8">
21
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.css">
22
- <style>
23
- html,body{margin:0;height:100%;background:#0d1117;color:#c9d1d9;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}
24
- #bar{height:31px;display:flex;align-items:center;gap:10px;padding:0 10px;background:#161b22;border-bottom:1px solid #30363d;box-sizing:border-box}
25
- #status{margin-left:auto;color:#8b949e;white-space:nowrap}
26
- #term{height:calc(100% - 31px);padding:4px;box-sizing:border-box;overflow:auto}
27
- a{color:#58a6ff;text-decoration:none}
28
- </style>
29
- </head>
30
- <body>
31
- <div id="bar"><span>${Y(n)}</span><span id="status">loading...</span></div>
32
- <div id="term"></div>
33
- <script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/lib/xterm.js"><\/script>
34
- <script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/lib/addon-fit.js"><\/script>
35
- <script>
36
- (function(){
37
- var endpoint=${d};
38
- // v3 ephemeral workers spawn their PTY at DEFAULT_RENDER_COLS (=160, see
39
- // worker.ts) and never adopt, so the captured stream's TUI / box-drawing
40
- // is exactly 160 cols wide. Fitting it into a narrower (or oddly-measured)
41
- // grid re-wraps those fixed-width lines into a stair-stepped mess and
42
- // wastes the panel. So we render at the capture width and let FitAddon
43
- // only size the ROW count to the iframe height (cols pinned back to 160).
44
- var COLS=160;
45
- var status=document.getElementById('status');
46
- var termEl=document.getElementById('term');
47
- if(!window.Terminal){status.textContent='xterm.js failed to load';return;}
48
- var term=new Terminal({
49
- cols:COLS,
50
- convertEol:false,
51
- scrollback:100000,
52
- fontSize:13,
53
- disableStdin:true,
54
- theme:{background:'#0d1117',foreground:'#c9d1d9',cursor:'#c9d1d9'}
55
- });
56
- var fit=null;
57
- if(window.FitAddon){fit=new window.FitAddon.FitAddon();term.loadAddon(fit);}
58
- term.open(termEl);
59
- function doFit(){
60
- try{if(fit)fit.fit()}catch(_){}
61
- if(term.cols!==COLS)term.resize(COLS,term.rows||24);
62
- }
63
- doFit(); window.addEventListener('resize',doFit);
64
- fetch(endpoint,{credentials:'include'}).then(function(res){
65
- if(!res.ok){
66
- if(res.status===401){status.textContent='\u9700\u8981\u767B\u5F55 dashboard \u540E\u67E5\u770B\u56DE\u653E';}
67
- else if(res.status===404){status.textContent='\u6CA1\u6709 PTY \u65E5\u5FD7';}
68
- else{status.textContent='\u52A0\u8F7D\u5931\u8D25 HTTP '+res.status;}
69
- return null;
70
- }
71
- var total=Number(res.headers.get('x-botmux-log-bytes')||0);
72
- var served=Number(res.headers.get('x-botmux-served-bytes')||0);
73
- var truncated=res.headers.get('x-botmux-truncated')==='1';
74
- status.textContent=truncated
75
- ? 'showing tail '+formatBytes(served)+' / '+formatBytes(total)
76
- : 'loaded '+formatBytes(total);
77
- return res.arrayBuffer();
78
- }).then(function(buf){
79
- if(!buf)return;
80
- term.write(new TextDecoder().decode(buf));
81
- setTimeout(doFit,0);
82
- }).catch(function(err){
83
- status.textContent='\u52A0\u8F7D\u5931\u8D25: '+(err&&err.message?err.message:String(err));
84
- });
85
- function formatBytes(n){
86
- if(!Number.isFinite(n)||n<=0)return '0 B';
87
- var u=['B','KiB','MiB','GiB'];var i=0;
88
- while(n>=1024&&i<u.length-1){n/=1024;i++;}
89
- return (i===0?String(n):n.toFixed(1))+' '+u[i];
90
- }
91
- })();
92
- <\/script>
93
- </body>
94
- </html>`}function Y(e){return e.replace(/[&<>"']/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[n])}function W(e){return Y(e).replace(/`/g,"&#96;")}function it(e,n){let d=n?`?${n}`:"";return`#/legacy-workflow/${encodeURIComponent(e)}${d}`}var ct=2e3;function at(e){return e==="succeeded"||e==="failed"}var D={pending:"\u5F85\u673A",gateWaiting:"\u7B49\u5BA1\u6279",running:"\u8FD0\u884C\u4E2D",done:"\u5B8C\u6210",skipped:"\u5DF2\u8DF3\u8FC7",cancelled:"\u5DF2\u53D6\u6D88",blocked:"\u53D7\u963B",superseded:"\u5DF2\u5237\u65B0",failed:"\u5931\u8D25"},kt={exit:"\u2713 \u901A\u8FC7",continue:"\u21BB \u7EE7\u7EED\u8FD4\u5DE5",exhausted:"\u26D4 \u8F6E\u6570\u8017\u5C3D"};function h(e){return e.replace(/[&<>"']/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[n])}function Nt(e){let n=e.webTerminal;return`${n?.status??"-"}|${n?.webPort??"-"}|${e.hasPtyLog?"1":"0"}`}function Z(e=location.hash){let n=e.match(/^#\/workflows\/([^?#]+)/);return n?decodeURIComponent(n[1]):null}function ut(e){let n=Z();return n?Ht(e,n):Rt(e)}function Rt(e){let n=e.querySelector("#v3-tbody"),d=e.querySelector("#v3-empty"),l=null,b=!1;async function c(){if(!(b||document.hidden))try{let H=await fetch("/api/v3/runs");if(b)return;let R=H.ok?await H.json():{runs:[]};if(b)return;let M=R.runs??[];d.hidden=M.length>0,n.innerHTML=M.map(S=>`<tr>
95
- <td><a class="v3r-runid" href="#/workflows/${encodeURIComponent(S.runId)}">${h(S.runId)}</a></td>
96
- <td><span class="v3r-pill rs-${h(S.runStatus)}">${h(S.runStatus)}</span></td>
97
- <td>${S.nodeCount}</td>
98
- </tr>`).join("")}catch{}}function T(){b||c().then(()=>{b||(l=window.setTimeout(T,ct))})}return T(),()=>{b=!0,l!==null&&window.clearTimeout(l)}}var O=168,K=48,z=70,lt=226,dt=30,q=26,St=8;function X(e){return e.isLoop?z:K}function Ht(e,n){let d=e.querySelector("#v3-graph"),l=e.querySelector("#v3-node-panel"),b=e.querySelector("#v3-runstatus"),c=null,T=!1,H=!1,R=null,M=null,S=null,I=null,A=null,B=!1;function pt(t){R=t,A=null,B=!1,M&&Q(M),U()}function mt(t){A=t,B=!0,U()}function ft(t){if(B&&A){let a=t.find($=>$.id===A);if(a)return a}let s=t.filter(a=>a.status==="running");return s[s.length-1]??t[t.length-1]??null}function vt(t,s,a){let f=new Map,k=v=>{if(f.has(v))return f.get(v);f.set(v,0);let p=t.find(N=>N.id===v)?.depends.filter(N=>t.some(V=>V.id===N))??[],g=p.length?1+Math.max(...p.map(k)):0;return f.set(v,g),g},i=new Map,r=new Map,u=0;for(let v of t){let p=k(v.id),g=i.get(p)??0;i.set(p,g+1),u=Math.max(u,g),r.set(v.id,{x:6+p*138,y:6+g*42})}let x=12+(f.size?Math.max(...f.values())*138+104:0),E=12+u*42+30,C=[];for(let v of t){let p=r.get(v.id);for(let g of v.depends){let N=r.get(g);if(!N)continue;let V=N.x+104,j=N.y+30/2,F=p.x,et=p.y+30/2,nt=(V+F)/2,wt=s.get(v.id)?.status==="running"?" live":"";C.push(`<path class="v3r-edge${wt}" d="M${V},${j} C${nt},${j} ${nt},${et} ${F},${et}" marker-end="url(#v3arrow-mini)"/>`)}}let P=t.map(v=>{let p=r.get(v.id),g=s.get(v.id),N=g?.status??"pending",V=g?"":" ghost",j=g&&g.id===a?" sel":"",F=g?` data-sel="${h(g.id)}"`:"";return`<g class="v3r-node v3r-mini st-${N}${j}${V}"${F}${g?' style="cursor:pointer"':""}>
99
- <rect class="v3r-box" x="${p.x}" y="${p.y}" width="104" height="30" rx="8"/>
100
- <circle class="v3r-mini-dot" cx="${p.x+13}" cy="${p.y+30/2}" r="3.4"/>
101
- <text class="v3r-nid" x="${p.x+24}" y="${p.y+30/2+4}">${h(J(v.id,12))}</text>
102
- </g>`});return`<svg class="v3r-mini-svg" width="${x}" height="${E}" viewBox="0 0 ${x} ${E}">
103
- <defs><marker id="v3arrow-mini" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
104
- <path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
105
- ${C.join("")}${P.join("")}
106
- </svg>`}function gt(t,s){let a=t.loopState;if(!a)return'<p class="muted">loop \u672A\u5F00\u59CB</p>';let $=a.maxIterations,m=$!==void 0?$+a.granted:void 0,L=new Map(a.decisions.map(r=>[r.iteration,r.decision])),y=(M?.nodes??[]).filter(r=>r.loop?.loopId===t.id),w=new Map;for(let r of y){let u=r.loop.iteration;(w.get(u)??w.set(u,[]).get(u)).push(r)}let f=[...w.entries()].sort((r,u)=>r[0]-u[0]).map(([r,u])=>{let x=L.get(r),E=r===a.iteration,C=$!==void 0&&r>$,P=x?`<span class="v3r-verdict vd-${x}">${kt[x]}</span>`:E&&t.status==="running"?'<span class="v3r-verdict vd-live">\u25B6 \u8FDB\u884C\u4E2D</span>':"",v=new Map(u.map(p=>[p.loop.bodyNodeId,p]));return`<div class="v3r-round${E?" cur":""}${x?` vd-${x}`:""}">
107
- <div class="v3r-round-head">
108
- <span class="rn">R${r}</span>
109
- ${C?'<span class="v3r-granted-tag">\u2795 \u8FFD\u52A0\u8F6E</span>':""}
110
- ${P}
111
- </div>
112
- ${vt(a.bodyTemplate,v,s)}
113
- </div>`}).join(""),k=`<div class="v3r-loop-meter">
114
- <span class="num">\u7B2C <b>${a.iteration}</b>${m!==void 0?` / <b>${m}</b>`:""} \u8F6E</span>
115
- ${a.granted>0?`<span class="v3r-granted-tag">\u542B\u4EBA\u5DE5\u8FFD\u52A0 +${a.granted}</span>`:""}
116
- ${a.lastDecision==="exit"?'<span class="v3r-verdict vd-exit">\u2713 \u5DF2\u6536\u655B</span>':""}
117
- </div>`,i=t.status==="blocked"?`<div class="v3r-cta">\u26A0 \u8F6E\u6570\u8017\u5C3D\uFF0C\u7B49\u4EBA\u8FFD\u52A0 \u2014 \u98DE\u4E66\u5361\u7247\u70B9\u300C\u2795 \u8FFD\u52A0 1 \u8F6E\u300D\uFF0C\u6216 <code>botmux workflow grant ${h(n)}</code></div>`:"";return`<div class="v3r-loop-sec">${k}<div class="v3r-rounds">${f}</div>${i}</div>`}function U(){let t=M?.nodes.find(w=>w.id===R)??null;if(!t){l.innerHTML='<p class="muted">\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF</p>',S=null,I=null;return}S!==t.id&&(l.innerHTML=`
118
- <div id="v3-node-meta"></div>
119
- <div id="v3-inst-strip"></div>
120
- <div id="v3-term-slot" class="v3r-term-slot"></div>`,S=t.id,I=null);let s=t,a=null;if(t.isLoop){let w=(M?.nodes??[]).filter(k=>k.loop?.loopId===t.id),f=ft(w);s=f,a=f?.id??null,A=a}let $=`<div class="v3r-panel-head">
121
- ${t.isLoop?'<span class="v3r-loop-mark">\u27F3</span>':""}
122
- <span class="v3r-nodeid">${h(t.id)}</span>
123
- <span class="v3r-pill st-${t.status}"><i class="dot"></i>${D[t.status]}</span>
124
- </div>`,m=t.errorClass?`<p class="v3r-err">\u539F\u56E0\uFF1A${h(t.errorClass)}${t.errorCode?` (${h(t.errorCode)})`:""}${t.status==="blocked"&&!t.isLoop?" \u2014 \u98DE\u4E66\u5361\u7247\u6216 <code>botmux workflow retry</code> \u53EF\u91CD\u8BD5":""}</p>`:"";l.querySelector("#v3-node-meta").innerHTML=`
125
- ${$}
126
- ${t.goal?`<p class="v3r-goal">${h(t.goal)}</p>`:""}
127
- ${t.depends.length?`<p class="v3r-deps">\u4F9D\u8D56 ${t.depends.map(w=>`<span class="v3r-dep">${h(w)}</span>`).join("")}</p>`:""}
128
- ${m}${t.isLoop?gt(t,a):""}`,l.querySelector("#v3-inst-strip").innerHTML=t.isLoop&&s?`<div class="v3r-inst-strip">
129
- <span class="lbl">\u5B9E\u4F8B\u7EC8\u7AEF</span>
130
- <span class="v3r-nodeid sm">${h(s.id)}</span>
131
- <span class="v3r-pill st-${s.status}"><i class="dot"></i>${D[s.status]}</span>
132
- <span class="muted">\u7B2C ${s.loop.iteration} \u8F6E \xB7 ${h(s.loop.bodyNodeId)}${B?"":" \xB7 \u81EA\u52A8\u8DDF\u968F"}</span>
133
- </div>`:"";for(let w of l.querySelectorAll("#v3-node-meta [data-sel]"))w.addEventListener("click",f=>{f.stopPropagation(),mt(w.getAttribute("data-sel"))});let L=l.querySelector("#v3-term-slot");if(!s){L.innerHTML="",I=null;return}let y=`${s.id}|${Nt(s)}`;y!==I&&(ot(L,n,s),I=y)}function ht(t,s,a,$){let m=t.loopState,L=m?.maxIterations,y=m&&L!==void 0?L+m.granted:void 0,w=m?`${D[t.status]} \xB7 \u7B2C${m.iteration}${y!==void 0?`/${y}`:""}\u8F6E`:`${D[t.status]} \xB7 loop`,f="";if(m&&y!==void 0&&y<=St){let k=a+z-13;for(let i=1;i<=y;i++){let r=s+14+(i-1)*15,u=i<m.iteration?"v3r-dot done":i===m.iteration?`v3r-dot cur${t.status==="running"?" live":""}`:"v3r-dot todo",x=L!==void 0&&i>L?" grant":"";f+=`<circle class="${u}${x}" cx="${r}" cy="${k}" r="3.6"/>`}m.lastDecision==="exit"?f+=`<text class="v3r-dots-verdict ok" x="${s+14+y*15+4}" y="${k+4}">\u2713</text>`:m.lastDecision==="exhausted"&&t.status==="blocked"&&(f+=`<text class="v3r-dots-verdict warn" x="${s+14+y*15+4}" y="${k+4}">\u26A0</text>`)}return`<g class="v3r-node v3r-loopnode st-${t.status}${$?" sel":""}" data-node="${h(t.id)}">
134
- <rect class="v3r-cap" x="${s-4}" y="${a-4}" width="${O+8}" height="${z+8}" rx="14"/>
135
- <rect class="v3r-box" x="${s}" y="${a}" width="${O}" height="${z}" rx="10"/>
136
- <text class="v3r-spin" x="${s+14}" y="${a+21}">\u27F3</text>
137
- <text class="v3r-nid" x="${s+30}" y="${a+21}">${h(J(t.id,16))}</text>
138
- <text class="v3r-nstatus" x="${s+14}" y="${a+39}">${h(w)}</text>
139
- ${f}
140
- </g>`}function Q(t){let s=t.nodes.filter(i=>!i.loop),a=Et(s),$=new Map;for(let i of s){let r=a.get(i.id)??0;($.get(r)??$.set(r,[]).get(r)).push(i)}let m=new Map,L=0;for(let[i,r]of $){let u=q;for(let x of r)m.set(x.id,{x:q+i*lt,y:u}),u+=X(x)+dt;L=Math.max(L,u-dt+q)}let y=q*2+($.size===0?0:Math.max(...$.keys())*lt+O),w=new Map(s.map(i=>[i.id,i])),f=[];for(let i of s){let r=m.get(i.id);if(r)for(let u of i.depends){let x=m.get(u),E=w.get(u);if(!x||!E)continue;let C=x.x+O,P=x.y+X(E)/2,v=r.x,p=r.y+X(i)/2,g=(C+v)/2,N=i.status==="running"?" live":"";f.push(`<path class="v3r-edge${N}" d="M${C},${P} C${g},${P} ${g},${p} ${v},${p}" marker-end="url(#v3arrow)"/>`)}}let k=s.map(i=>{let r=m.get(i.id),u=i.id===R;return i.isLoop?ht(i,r.x,r.y,u):`<g class="v3r-node st-${i.status}${u?" sel":""}" data-node="${h(i.id)}">
141
- <rect class="v3r-box" x="${r.x}" y="${r.y}" width="${O}" height="${K}" rx="10"/>
142
- <rect class="v3r-bar" x="${r.x}" y="${r.y+8}" width="3" height="${K-16}" rx="1.5"/>
143
- <text class="v3r-nid" x="${r.x+14}" y="${r.y+20}">${h(J(i.id,18))}</text>
144
- <text class="v3r-nstatus" x="${r.x+14}" y="${r.y+37}">${D[i.status]}</text>
145
- </g>`});d.innerHTML=`<svg width="${y}" height="${L}" viewBox="0 0 ${y} ${L}" style="display:block">
146
- <defs><marker id="v3arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
147
- <path d="M0,0 L10,5 L0,10 z" fill="var(--faint, #8b98aa)"/></marker></defs>
148
- ${f.join("")}${k.join("")}
149
- </svg>`;for(let i of d.querySelectorAll("[data-node]"))i.addEventListener("click",()=>pt(i.getAttribute("data-node")))}async function $t(){if(!(T||document.hidden))try{let t=await fetch(`/api/v3/runs/${encodeURIComponent(n)}`);if(T)return;if(!t.ok){if(t.status===404&&!H){H=!0;try{let a=await fetch(`/api/workflows/runs/${encodeURIComponent(n)}/snapshot`);if(T)return;if(a.ok){window.location.replace(it(n,location.hash.split("?")[1]));return}}catch{}}T||(b.textContent=t.status===404?"not found":`HTTP ${t.status}`);return}let s=await t.json();if(T)return;if(M=s,b.textContent=s.runStatus,b.className=`v3r-pill rs-${s.runStatus}`,R===null&&s.nodes.length&&(R=s.nodes[0].id),Q(s),U(),at(s.runStatus)){c!==null&&window.clearTimeout(c),c=null;return}}catch{}}function tt(){T||$t().then(()=>{!T&&!at(M?.runStatus)&&(c=window.setTimeout(tt,ct))})}return tt(),()=>{T=!0,c!==null&&window.clearTimeout(c)}}function Et(e){let n=new Map(e.map(c=>[c.id,c])),d=new Map,l=new Set;function b(c){if(d.has(c))return d.get(c);if(l.has(c))return 0;l.add(c);let H=(n.get(c)?.depends??[]).filter(M=>n.has(M)),R=H.length?1+Math.max(...H.map(b)):0;return l.delete(c),d.set(c,R),R}for(let c of e)b(c.id);return d}function J(e,n){return e.length>n?e.slice(0,n-1)+"\u2026":e}var o=G(rt(),1);function Ct(){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"page-head",children:[(0,o.jsx)("h1",{children:"\u5DE5\u4F5C\u6D41"}),(0,o.jsx)("p",{className:"muted",children:"LLM \u7F16\u6392\u7684 workflow \u8FD0\u884C \u2014 DAG \u56FE + \u6BCF\u8282\u70B9\u7EC8\u7AEF"})]}),(0,o.jsxs)("table",{className:"data-table",children:[(0,o.jsx)("thead",{children:(0,o.jsxs)("tr",{children:[(0,o.jsx)("th",{children:"Run"}),(0,o.jsx)("th",{children:"\u72B6\u6001"}),(0,o.jsx)("th",{children:"\u8282\u70B9\u6570"})]})}),(0,o.jsx)("tbody",{id:"v3-tbody"})]}),(0,o.jsxs)("div",{id:"v3-empty",className:"muted",hidden:!0,style:{padding:"1rem"},children:["\u6682\u65E0\u5DE5\u4F5C\u6D41\u8FD0\u884C\uFF08\u7528 ",(0,o.jsx)("code",{children:"/workflow new"})," \u53D1\u8D77\u4E00\u4E2A\uFF09"]})]})}function Pt(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"page-head",children:[(0,o.jsx)("a",{href:"#/workflows",className:"btn-link",children:"\u2190 \u5DE5\u4F5C\u6D41"}),(0,o.jsx)("h1",{className:"v3r-title",children:e.runId}),(0,o.jsx)("span",{id:"v3-runstatus",className:"v3r-pill"})]}),(0,o.jsxs)("div",{className:"v3r-wrap",children:[(0,o.jsxs)("div",{className:"v3r-graph-card",children:[(0,o.jsx)("div",{id:"v3-graph",className:"v3r-graph"}),(0,o.jsxs)("div",{className:"v3r-legend",children:[(0,o.jsx)("span",{className:"lg st-pending",children:"\u5F85\u673A"}),(0,o.jsx)("span",{className:"lg st-running",children:"\u8FD0\u884C\u4E2D"}),(0,o.jsx)("span",{className:"lg st-gateWaiting",children:"\u7B49\u5BA1\u6279"}),(0,o.jsx)("span",{className:"lg st-done",children:"\u5B8C\u6210"}),(0,o.jsx)("span",{className:"lg st-skipped",children:"\u5DF2\u8DF3\u8FC7"}),(0,o.jsx)("span",{className:"lg st-cancelled",children:"\u5DF2\u53D6\u6D88"}),(0,o.jsx)("span",{className:"lg st-blocked",children:"\u53D7\u963B"}),(0,o.jsx)("span",{className:"lg st-failed",children:"\u5931\u8D25"}),(0,o.jsx)("span",{className:"lg lg-loop",children:"\u27F3 \u5FAA\u73AF\u5BB9\u5668"})]})]}),(0,o.jsx)("div",{id:"v3-node-panel",className:"v3r-panel",children:(0,o.jsx)("p",{className:"muted",children:"\u70B9\u4E00\u4E2A\u8282\u70B9\u770B\u8BE6\u60C5\u4E0E\u7EC8\u7AEF"})})]})]})}function Vt(){let e=(0,_.useRef)(null),n=Z();return(0,_.useEffect)(()=>{if(e.current)return ut(e.current)},[]),(0,o.jsx)("section",{className:"page",ref:e,children:n?(0,o.jsx)(Pt,{runId:n}):(0,o.jsx)(Ct,{})})}function Wt(e){return st(e,(0,o.jsx)(Vt,{}))}export{Wt as renderV3RunsPage};
@@ -1 +0,0 @@
1
- import{a as z,b as I,c as M}from"./chunk-JTSE5VP6.js";import{c as y}from"./chunk-7SZRL6FY.js";var s=y(z(),1);var e=y(M(),1);function W(t){let a=Date.parse(t);if(!a)return t||"-";let r=Math.max(0,Math.floor((Date.now()-a)/1e3));if(r<60)return`${r}s ago`;let n=Math.floor(r/60);if(n<60)return`${n}m ago`;let o=Math.floor(n/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function j(t){return t.chatId?.trim()||"__local__"}function D(t,a){if(t==="__local__")return"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";let r=a.get(t);return r&&r!==t?`${r} (${t})`:t}function H(t,a){let r=new Map;for(let n of t){let o=j(n),c=r.get(o)??[];c.push(n),r.set(o,c)}return[...r.entries()].map(([n,o])=>({chatId:n,label:D(n,a),rows:[...o].sort((c,u)=>u.updatedAt.localeCompare(c.updatedAt))})).sort((n,o)=>n.label.localeCompare(o.label))}function _(t){return{display:"block",textDecoration:"none",color:"inherit",border:`1px solid ${t?"rgba(14,165,233,.75)":"var(--border)"}`,borderRadius:14,padding:"13px 14px",margin:"10px 0 10px 18px",background:t?"linear-gradient(135deg, rgba(14,165,233,.16), rgba(59,130,246,.08))":"var(--surface-raised)",boxShadow:t?"0 10px 24px rgba(14,165,233,.13)":"0 4px 14px rgba(15,23,42,.04)"}}function L(){return decodeURIComponent((location.hash.match(/^#\/whiteboards\/([^/]+)/)?.[1]??"").trim())}async function B(t,a){let r=await fetch(`/api/whiteboards/${encodeURIComponent(t)}`),n=await r.json().catch(()=>({}));if(r.ok)return{id:t,content:String(n.content??""),row:a.find(o=>o.id===t)}}async function F(t){let a=new Map;if(!t?.ok)return a;let r=await t.json().catch(()=>({})),n=Array.isArray(r.chats)?r.chats:[];for(let o of n)o.chatId&&a.set(String(o.chatId),String(o.name||o.chatId));return a}function U(t){let a=t.row;return(0,e.jsxs)("a",{className:`wb-item${t.active?" active":""}`,"data-whiteboard-id":a.id,href:`#/whiteboards/${encodeURIComponent(a.id)}`,style:_(t.active),onClick:r=>{r.preventDefault(),t.onSelect(a.id)},children:[(0,e.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"flex-start",justifyContent:"space-between"},children:[(0,e.jsxs)("div",{style:{minWidth:0},children:[(0,e.jsx)("strong",{style:{display:"block",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:a.title||a.id}),(0,e.jsx)("span",{style:{display:"inline-block",marginTop:4,fontSize:11,color:"var(--muted)",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace"},children:a.id})]}),(0,e.jsx)("span",{style:{fontSize:11,border:"1px solid var(--border)",borderRadius:999,padding:"2px 7px",color:"var(--muted)",whiteSpace:"nowrap"},children:a.scope})]}),(0,e.jsxs)("div",{style:{marginTop:9,display:"flex",gap:8,alignItems:"center",color:"var(--muted)",fontSize:12},children:[(0,e.jsx)("span",{children:W(a.updatedAt)}),(0,e.jsx)("span",{children:"\xB7"}),(0,e.jsxs)("span",{children:["log ",a.logCount]})]})]})}function f(t){return(0,e.jsxs)("div",{style:{border:"1px solid var(--border)",borderRadius:12,padding:"10px 12px",background:"var(--surface-raised)",minWidth:0},children:[(0,e.jsx)("div",{style:{fontSize:11,color:"var(--muted)",marginBottom:5},children:t.label}),(0,e.jsx)("div",{style:{fontSize:13,wordBreak:"break-all"},children:t.value||"-"})]})}function O(t){let a=t.selected;if(!a)return(0,e.jsx)("p",{className:"empty",children:"\u9009\u62E9\u5DE6\u4FA7\u767D\u677F\u67E5\u770B meta \u548C board.md\u3002"});let r=a.row,n=r?.chatId?D(r.chatId,t.groupNames):"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"flex-start",marginBottom:16},children:[(0,e.jsxs)("div",{style:{minWidth:0},children:[(0,e.jsx)("p",{className:"eyebrow",style:{margin:"0 0 6px"},children:"WHITEBOARD"}),(0,e.jsx)("h2",{style:{margin:0,fontSize:22,lineHeight:1.25},children:r?.title||a.id}),(0,e.jsx)("div",{style:{marginTop:8,color:"var(--muted)",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:12},children:a.id})]}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-whiteboard":!0,onClick:t.onDelete,children:"\u5220\u9664\u767D\u677F"})]}),(0,e.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(2,minmax(0,1fr))",gap:10,marginBottom:18},children:[(0,e.jsx)(f,{label:"\u6240\u5C5E\u7FA4",value:n}),(0,e.jsx)(f,{label:"\u8303\u56F4",value:r?.scope??"-"}),(0,e.jsx)(f,{label:"\u6700\u8FD1\u66F4\u65B0",value:r?.updatedAt?W(r.updatedAt):"-"}),(0,e.jsx)(f,{label:"\u6765\u6E90\u76EE\u5F55",value:r?.workingDir??"-"})]}),(0,e.jsxs)("details",{style:{marginBottom:18,color:"var(--muted)"},children:[(0,e.jsx)("summary",{style:{cursor:"pointer"},children:"\u7BA1\u7406\u4FE1\u606F / \u6587\u4EF6\u8DEF\u5F84"}),(0,e.jsx)("code",{style:{display:"block",marginTop:8,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:r?.path??""})]}),(0,e.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:14,background:"var(--surface-raised)",overflow:"hidden"},children:[(0,e.jsxs)("div",{style:{padding:"12px 14px",borderBottom:"1px solid var(--border)",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,e.jsx)("strong",{children:"\u5F53\u524D\u72B6\u6001 board.md"}),(0,e.jsx)("span",{style:{color:"var(--muted)",fontSize:12},children:"read / update"})]}),(0,e.jsx)("pre",{style:{whiteSpace:"pre-wrap",maxHeight:"70vh",overflow:"auto",margin:0,padding:16,lineHeight:1.65,background:"transparent"},children:a.content||"\uFF08\u6682\u65E0\u5185\u5BB9\uFF09"})]})]})}function q(t){let a=t.selected.row?.title||t.selected.id;return(0,e.jsx)("div",{className:"wb-delete-backdrop","data-delete-modal":!0,style:{position:"fixed",inset:0,background:"rgba(0,0,0,.48)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,padding:20},onClick:r=>{r.target===r.currentTarget&&t.onCancel()},children:(0,e.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"wb-delete-title",style:{width:"min(520px,92vw)",background:"var(--surface)",color:"var(--fg)",border:"1px solid var(--border)",borderRadius:16,boxShadow:"0 18px 60px rgba(0,0,0,.35)",padding:"22px 24px"},children:[(0,e.jsxs)("div",{style:{display:"flex",gap:14,alignItems:"flex-start"},children:[(0,e.jsx)("div",{"aria-hidden":"true",style:{width:36,height:36,borderRadius:"50%",display:"grid",placeItems:"center",background:"rgba(220,38,38,.14)",color:"#dc2626",fontWeight:800},children:"!"}),(0,e.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,e.jsx)("h3",{id:"wb-delete-title",style:{margin:"0 0 8px",fontSize:18},children:"\u5220\u9664\u767D\u677F\uFF1F"}),(0,e.jsxs)("p",{style:{margin:0,color:"var(--muted)",lineHeight:1.6},children:["\u5C06\u5220\u9664 ",(0,e.jsx)("strong",{children:a}),"\uFF08",(0,e.jsx)("code",{children:t.selected.id}),"\uFF09\u7684 board\u3001log\u3001meta\uFF0C\u5E76\u6E05\u7406\u9ED8\u8BA4\u7ED1\u5B9A\u548C\u4F1A\u8BDD\u5F15\u7528\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"]})]})]}),(0,e.jsxs)("div",{className:"actions",style:{display:"flex",justifyContent:"flex-end",gap:10,marginTop:22},children:[(0,e.jsx)("button",{type:"button","data-delete-cancel":!0,onClick:t.onCancel,disabled:t.deleting,children:"\u53D6\u6D88"}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-confirm":!0,onClick:t.onConfirm,disabled:t.deleting,children:t.deleting?"\u5220\u9664\u4E2D...":"\u786E\u8BA4\u5220\u9664"})]})]})})}function K(){let t=(0,s.useRef)(!1),a=(0,s.useRef)(0),[r,n]=(0,s.useState)(!1),[o,c]=(0,s.useState)([]),[u,T]=(0,s.useState)(()=>new Map),[g,b]=(0,s.useState)(),[$,v]=(0,s.useState)(!0),[x,S]=(0,s.useState)(null),[p,h]=(0,s.useState)(null),[P,R]=(0,s.useState)(!1),N=(0,s.useMemo)(()=>H(o,u),[o,u]);(0,s.useEffect)(()=>{t.current=!0;let i=L();async function l(){v(!0);try{let[d,w]=await Promise.all([fetch("/api/whiteboards"),fetch("/api/groups").catch(()=>null)]),m=await d.json().catch(()=>({}));if(!d.ok)throw new Error(m?.error??`HTTP ${d.status}`);let G=await F(w),k=Array.isArray(m.whiteboards)?m.whiteboards:[],C;if(i&&(C=await B(i,k)),!t.current)return;n(m.enabled===!0),c(k),T(G),b(C),S(null)}catch(d){t.current&&S(d instanceof Error?d.message:String(d))}finally{t.current&&v(!1)}}return l(),()=>{t.current=!1,a.current+=1}},[]);async function A(i){let l=a.current+1;a.current=l;let d=await B(i,o);!t.current||a.current!==l||!d||(b(d),window.history.replaceState(null,"",`#/whiteboards/${encodeURIComponent(i)}`))}async function E(){if(p){R(!0);try{let i=await fetch(`/api/whiteboards/${encodeURIComponent(p.id)}`,{method:"DELETE"}),l=await i.json().catch(()=>({}));if(!i.ok||l.ok===!1)throw new Error(l?.error??`HTTP ${i.status}`);if(!t.current)return;c(d=>d.filter(w=>w.id!==p.id)),g?.id===p.id&&(b(void 0),window.history.replaceState(null,"","#/whiteboards")),h(null)}catch(i){t.current&&window.alert(`\u5220\u9664\u5931\u8D25\uFF1A${i instanceof Error?i.message:String(i)}`)}finally{t.current&&R(!1)}}}return x?(0,e.jsx)("section",{className:"page",children:(0,e.jsxs)("p",{className:"hint-warn",children:["\u52A0\u8F7D\u767D\u677F\u5931\u8D25\uFF1A",x]})}):$?(0,e.jsx)("div",{"data-whiteboards-host":!0,children:(0,e.jsx)("p",{className:"empty",children:"Loading whiteboards..."})}):(0,e.jsxs)("section",{className:"page",children:[(0,e.jsxs)("div",{className:"page-heading",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:"Whiteboards"}),(0,e.jsx)("h1",{children:"\u672C\u5730\u767D\u677F"}),(0,e.jsx)("p",{children:"\u6309\u7FA4\u5171\u4EAB\u7684\u672C\u5730\u6700\u65B0\u72B6\u6001\u767D\u677F\u3002\u5F00\u5173\u5173\u95ED\u65F6\u4EC5\u53EA\u8BFB\u5C55\u793A\u5386\u53F2\u767D\u677F\uFF0C\u4E0D\u6CE8\u5165 prompt\u3001\u4E0D\u5141\u8BB8 agent CLI \u8BFB\u5199\u3002"})]}),(0,e.jsx)("span",{className:`pill ${r?"ok":"warn"}`,children:r?"Enabled":"Disabled"})]}),r?null:(0,e.jsx)("p",{className:"hint-warn",children:"\u767D\u677F\u80FD\u529B\u5F53\u524D\u5173\u95ED\uFF1A\u4E0D\u4F1A\u81EA\u52A8\u521B\u5EFA/\u7ED1\u5B9A\u767D\u677F\uFF0C\u4E5F\u4E0D\u4F1A\u6CE8\u5165\u5230 agent prompt\u3002\u5386\u53F2\u767D\u677F\u4EC5\u5728 dashboard \u4E2D\u53EA\u8BFB\u53EF\u89C1\uFF0C\u53EF\u5728\u6B64\u6E05\u7406\u3002"}),(0,e.jsxs)("div",{className:"wb-split",style:{display:"grid",gridTemplateColumns:"minmax(300px,400px) minmax(0,1fr)",gap:18,alignItems:"start"},children:[(0,e.jsxs)("article",{className:"bd-card settings-card",style:{padding:18},children:[(0,e.jsx)("h3",{className:"bd-section-title",style:{marginBottom:12},children:"\u7FA4\u7EC4 / \u767D\u677F"}),N.length===0?(0,e.jsx)("p",{className:"empty",children:"\u6682\u65E0\u767D\u677F\u3002\u6253\u5F00\u80FD\u529B\u540E\uFF0C\u6BCF\u4E2A\u7FA4\u9996\u6B21\u9700\u8981\u767D\u677F\u65F6\u624D\u4F1A\u521B\u5EFA\u9ED8\u8BA4\u767D\u677F\u3002"}):N.map(i=>(0,e.jsxs)("details",{className:"wb-group",open:!0,style:{marginBottom:14},children:[(0,e.jsxs)("summary",{style:{cursor:"pointer",fontWeight:700,margin:"12px 0 8px",display:"flex",justifyContent:"space-between",gap:8,alignItems:"center"},children:[(0,e.jsx)("span",{style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:i.label}),(0,e.jsx)("small",{style:{border:"1px solid var(--border)",borderRadius:999,padding:"1px 7px",color:"var(--muted)"},children:i.rows.length})]}),i.rows.map(l=>(0,e.jsx)(U,{row:l,active:g?.id===l.id,onSelect:d=>{A(d)}},l.id))]},i.chatId))]}),(0,e.jsx)("article",{className:"bd-card settings-card",id:"whiteboard-detail",style:{padding:"20px 22px"},children:(0,e.jsx)(O,{selected:g,groupNames:u,onDelete:()=>{g&&h(g)}})})]}),p?(0,e.jsx)(q,{selected:p,deleting:P,onCancel:()=>h(null),onConfirm:()=>{E()}}):null]})}function Q(t){return I(t,(0,e.jsx)(K,{}))}export{Q as renderWhiteboardsPage};
@@ -1,184 +0,0 @@
1
- import{o as i}from"./chunk-3UJYRR2Q.js";import"./chunk-7SZRL6FY.js";function Rt(){let t=[["",i("workflow.filter.nonTerminal")],["all",i("workflow.filter.all")],["pending",C("pending")],["running",C("running")],["waiting",C("waiting")],["succeeded",C("succeeded")],["failed",C("failed")],["cancelled",C("cancelled")]];return`
2
- <nav class="wf-subnav">
3
- <a href="#/legacy-workflow" class="active" data-i18n="workflow.subnav.runs">${r(i("workflow.subnav.runs"))}</a>
4
- <a href="#/workflows" data-i18n="workflow.subnav.v3">${r(i("workflow.subnav.v3"))}</a>
5
- </nav>
6
- <form id="wf-filters" class="filters">
7
- <input type="search" name="q" placeholder="${r(i("workflow.searchPlaceholder"))}" />
8
- <select name="status">
9
- ${t.map(([e,n])=>`<option value="${r(e)}">${r(n)}</option>`).join("")}
10
- </select>
11
- <span id="wf-last-load" class="muted"></span>
12
- </form>
13
- <table>
14
- <thead><tr>
15
- <th>${r(i("workflow.table.run"))}</th><th>${r(i("workflow.table.workflow"))}</th><th>${r(i("workflow.table.status"))}</th>
16
- <th>${r(i("workflow.table.lastSeq"))}</th><th>${r(i("workflow.table.dangling"))}</th><th>${r(i("workflow.table.updated"))}</th>
17
- <th>${r(i("workflow.table.chatApp"))}</th>
18
- </tr></thead>
19
- <tbody id="wf-tbody"></tbody>
20
- </table>
21
- `}var Ct=5e3,Ht=2e3,B=new Set(["succeeded","failed","cancelled"]);function r(t){return t.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function qt(t){let e=new Date(t),a=Date.now()-t;return a<6e4?i("time.secondsAgo",{value:Math.max(1,Math.floor(a/1e3))}):a<36e5?i("time.minutesAgo",{value:Math.floor(a/6e4)}):a<864e5?i("time.hoursAgo",{value:Math.floor(a/36e5)}):e.toISOString().slice(0,19).replace("T"," ")}function M(t){return`<span class="${B.has(t)?"wf-status terminal":"wf-status live"} wf-status-${r(t)}">${r(C(t))}</span>`}function C(t){let e=`workflow.status.${t}`,n=i(e);return n===e?t:n}function Te(t){let e=location.hash.match(/^#\/legacy-workflow\/([^?#]+)(?:\?([^#]*))?$/);if(e){let n=new URLSearchParams(e[2]??"");return Ot(t,decodeURIComponent(e[1]),{focusAttemptId:n.get("attempt")??void 0})}return Pt(t)}function Pt(t){t.innerHTML=Rt();let e=t.querySelector("#wf-tbody"),n=t.querySelector("#wf-filters"),a=t.querySelector("#wf-last-load"),o=[],s=null,d=!1,c=null,f=!1;function h($){let I=(new FormData(n).get("q")??"").trim().toLowerCase();return I?$.filter(g=>g.runId.toLowerCase().includes(I)||g.workflowId.toLowerCase().includes(I)||(g.chatId??"").toLowerCase().includes(I)):$}function v(){let $=h(o);if($.length===0){e.innerHTML=`<tr><td colspan="7" class="empty">${c?r(i("workflow.list.failedLoad",{error:c})):o.length===0?r(i("workflow.list.noRuns")):r(i("workflow.list.noFilterMatch"))}</td></tr>`;return}e.innerHTML=$.map(m=>{let I=`${m.dEf}/${m.dAct}/${m.dWait}`,g=m.dEf+m.dAct+m.dWait>0?"wf-dangling has":"wf-dangling none",b=[];m.chatId&&b.push(r(m.chatId)),m.larkAppId&&b.push(`<span class="muted">${r(m.larkAppId)}</span>`);let O=b.length>0?b.join("<br/>"):"\u2014",L=xt(m);return`<tr data-runid="${r(m.runId)}">
22
- <td><a href="#/legacy-workflow/${encodeURIComponent(m.runId)}"><code>${r(m.runId)}</code></a></td>
23
- <td>${r(m.workflowId)}</td>
24
- <td>${M(m.status)}${m.failedNodeId?` <span class="muted">(${r(m.failedNodeId)})</span>`:""}${L}</td>
25
- <td>${m.lastSeq}</td>
26
- <td class="${g}">${I}</td>
27
- <td title="${r(new Date(m.updatedAt).toISOString())}">${qt(m.updatedAt)}</td>
28
- <td>${O}</td>
29
- </tr>`}).join("")}function k(){c?(a.textContent=i("workflow.list.error",{error:c}),a.classList.add("error")):(a.textContent=i("workflow.list.loaded",{count:o.length,time:new Date().toLocaleTimeString()}),a.classList.remove("error"))}async function u(){if(!(f||d)&&!document.hidden){d=!0;try{let $=n.elements.namedItem("status")?.value??"",m=new URLSearchParams;$==="all"?m.set("all","1"):$&&m.set("status",$);let I="/api/workflows/runs"+(m.toString()?`?${m}`:""),g=await fetch(I);g.ok?(o=(await g.json()).runs??[],c=null):(c=`HTTP ${g.status}`,o=[])}catch($){c=$?.message??String($),o=[]}finally{d=!1,f||(v(),k())}}}function y(){s!==null&&window.clearTimeout(s),s=window.setTimeout(async()=>{await u(),f||y()},Ct)}function P(){document.hidden||u()}return n.addEventListener("input",()=>{v()}),n.addEventListener("change",$=>{$.target.getAttribute("name")==="status"&&u()}),document.addEventListener("visibilitychange",P),u().then(()=>{f||y()}),()=>{f=!0,s!==null&&window.clearTimeout(s),document.removeEventListener("visibilitychange",P)}}function Ot(t,e,n={}){t.innerHTML=`
30
- <div class="wf-detail-head">
31
- <a class="btn-link" href="#/legacy-workflow">${r(i("workflow.detail.back"))}</a>
32
- <div>
33
- <h2><code>${r(e)}</code></h2>
34
- <div id="wf-detail-subtitle" class="muted">${r(i("workflow.detail.loading"))}</div>
35
- </div>
36
- <button id="wf-cancel-run" type="button" class="contrast" hidden>${r(i("workflow.detail.cancel"))}</button>
37
- <span id="wf-detail-refresh" class="muted"></span>
38
- </div>
39
- <section id="wf-detail-error" class="hint-warn" hidden></section>
40
- <section id="wf-cancel-status" class="hint-ok" hidden></section>
41
- <section id="wf-summary" class="wf-summary-grid"></section>
42
- <section id="wf-dangling-panel"></section>
43
- <section class="wf-panel">
44
- <div class="wf-panel-title">
45
- <h3>${r(i("workflow.detail.parallel"))}</h3>
46
- <span id="wf-parallel-meta" class="muted"></span>
47
- </div>
48
- <div id="wf-parallel-view"></div>
49
- </section>
50
- <section class="wf-panel">
51
- <div class="wf-panel-title">
52
- <h3>${r(i("workflow.detail.nodes"))}</h3>
53
- </div>
54
- <div class="wf-table-scroll">
55
- <table>
56
- <thead><tr>
57
- <th>${r(i("workflow.detail.node"))}</th><th>${r(i("workflow.detail.nodeStatus"))}</th><th>${r(i("workflow.detail.activity"))}</th><th>${r(i("workflow.detail.activityStatus"))}</th>
58
- <th>${r(i("workflow.detail.attempts"))}</th><th>${r(i("workflow.detail.current"))}</th><th>${r(i("workflow.detail.detail"))}</th>
59
- </tr></thead>
60
- <tbody id="wf-node-tbody"></tbody>
61
- </table>
62
- </div>
63
- </section>
64
- <section class="wf-panel">
65
- <div class="wf-panel-title">
66
- <h3>${r(i("workflow.detail.nodeIO"))}</h3>
67
- </div>
68
- <div id="wf-io-list" class="wf-io-list"></div>
69
- </section>
70
- <section class="wf-panel">
71
- <div class="wf-panel-title">
72
- <h3>${r(i("workflow.detail.timeline"))}</h3>
73
- <button id="wf-load-older" type="button" hidden>${r(i("workflow.detail.loadOlder"))}</button>
74
- </div>
75
- <div class="wf-table-scroll wf-timeline-scroll">
76
- <table>
77
- <thead><tr>
78
- <th>${r(i("workflow.detail.seq"))}</th><th>${r(i("workflow.detail.event"))}</th><th>${r(i("workflow.detail.actor"))}</th><th>${r(i("workflow.detail.node"))}</th><th>${r(i("workflow.detail.activity"))}</th><th>${r(i("workflow.detail.error"))}</th><th>${r(i("workflow.detail.time"))}</th>
79
- </tr></thead>
80
- <tbody id="wf-event-tbody"></tbody>
81
- </table>
82
- </div>
83
- <div id="wf-event-meta" class="muted"></div>
84
- </section>
85
- `;let a=t.querySelector("#wf-detail-subtitle"),o=t.querySelector("#wf-detail-refresh"),s=t.querySelector("#wf-detail-error"),d=t.querySelector("#wf-cancel-status"),c=t.querySelector("#wf-summary"),f=t.querySelector("#wf-dangling-panel"),h=t.querySelector("#wf-parallel-view"),v=t.querySelector("#wf-parallel-meta"),k=t.querySelector("#wf-node-tbody"),u=t.querySelector("#wf-io-list"),y=t.querySelector(".wf-timeline-scroll"),P=t.querySelector("#wf-event-tbody"),$=t.querySelector("#wf-event-meta"),m=t.querySelector("#wf-cancel-run"),I=t.querySelector("#wf-load-older"),g=null,b=[],O=new Set,L=null,N=null,x=!1,U=0,H=null,j=!1,Z=!1,_=!1,St=new Set,$t=new Map,rt=new Map,F=new Map,K=new Set,V=new Map,q=new Set,D=new Map,bt=new Map,it=0,ot=n.focusAttemptId;function T(l){if(!l){s.hidden=!0,s.textContent="";return}s.hidden=!1,s.textContent=l}function at(l){if(!l){d.hidden=!0,d.textContent="";return}d.hidden=!1,d.textContent=l}async function st(){let l=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/snapshot`);if(l.status===404)throw new Error(i("workflow.detail.unknownRun"));if(!l.ok)throw new Error(i("workflow.detail.snapshotHttp",{status:l.status}));g=await l.json()}async function J(l){let S=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/events?${l}`);if(S.status===404)throw new Error(i("workflow.detail.unknownRun"));if(!S.ok)throw new Error(i("workflow.detail.eventsHttp",{status:S.status}));return await S.json()}function z(l,S){let p=l.filter(w=>O.has(w.eventId)?!1:(O.add(w.eventId),!0));p.length!==0&&(b=S==="prepend"?[...p,...b]:[...b,...p],b.sort((w,R)=>W(w.eventId)-W(R.eventId)))}async function It(){await st();let l=await J(new URLSearchParams({tail:"100"}));b=[],O=new Set,z(l.events,"append"),L=l.oldestSeq,N=l.newestSeq,x=l.hasOlder,U=l.totalCount,A()}async function G(){if(!(j||Z||document.hidden)){Z=!0;try{if(await st(),N!==null){let l=await J(new URLSearchParams({afterSeq:String(N),limit:"200"}));z(l.events,"append"),l.newestSeq!==null&&(N=l.newestSeq),L===null&&l.oldestSeq!==null&&(L=l.oldestSeq),U=l.totalCount}else{let l=await J(new URLSearchParams({tail:"1"}));z(l.events,"append"),L=l.oldestSeq,N=l.newestSeq,x=l.hasOlder,U=l.totalCount}T(null),A()}catch(l){T(l?.message??String(l))}finally{Z=!1}}}async function Tt(){if(!(L===null||!x)){I.disabled=!0;try{let l=await J(new URLSearchParams({beforeSeq:String(L),limit:"100"}));z(l.events,"prepend"),l.oldestSeq!==null&&(L=l.oldestSeq),x=l.hasOlder,U=l.totalCount,T(null),A()}catch(l){T(l?.message??String(l))}finally{I.disabled=!1}}}async function At(){if(!g||B.has(g.run.status)||_)return;if(!g.chatBinding?.larkAppId){T(i("workflow.detail.cancelUnavailable",{runId:e}));return}let l=Ut(g),S=i("workflow.detail.cancelConfirm",{runId:e,...l});if(window.confirm(S)){_=!0,m.disabled=!0;try{let p=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"cancelled via dashboard"})});if(p.status===401)throw new Error(i("workflow.detail.writeAccessCancel"));let w=await p.json().catch(()=>({}));if(!p.ok||!w.ok)throw new Error(w.hint??w.error??i("workflow.detail.cancelHttp",{status:p.status}));at(w.pending?i("workflow.detail.cancelPending"):null),T(null),await G()}catch(p){T(p?.message??String(p))}finally{_=!1,m.disabled=!1,A()}}}async function Et(l,S){if(!q.has(l)){q.add(l),D.delete(l),A();try{let p=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/attempts/${encodeURIComponent(S)}/${encodeURIComponent(l)}/resume`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})});if(p.status===401)throw new Error(i("workflow.detail.writeAccessResume"));let w=await p.json().catch(()=>({}));if(!p.ok||!w.ok||!w.resumeId||!w.url)throw new Error(w.hint??w.message??w.error??i("workflow.detail.resumeStartFailed",{status:p.status}));V.set(l,{resumeId:w.resumeId,url:w.url})}catch(p){let w=p?.message??String(p);D.set(l,w)}finally{q.delete(l),A()}}}async function Lt(l,S){if(!q.has(l)){q.add(l),D.delete(l),A();try{let p=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/attempts/${encodeURIComponent(S)}/${encodeURIComponent(l)}/resume/end`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"ended_by_dashboard"})});if(p.status===401)throw new Error(i("workflow.detail.writeAccessResume"));let w=await p.json().catch(()=>({}));if(!p.ok||!w.ok)if(w.error==="resume_not_running")V.delete(l);else throw new Error(w.hint??w.message??w.error??i("workflow.detail.resumeEndFailed",{status:p.status}));else V.delete(l)}catch(p){let w=p?.message??String(p);D.set(l,w)}finally{q.delete(l),A()}}}async function Mt(l,S){if(!K.has(l)){K.add(l),F.delete(l),A();try{let p=rt.get(l)?.trim()||void 0,w=await fetch(`/api/workflows/runs/${encodeURIComponent(e)}/${S}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({comment:p})});if(w.status===401)throw new Error(i("workflow.detail.writeAccessApproval"));let R=await w.json().catch(()=>({}));if(!w.ok||!R.ok)throw new Error(R.hint??R.message??R.error??i("workflow.detail.actionHttp",{action:S,status:w.status}));let et=S==="approve"?i("workflow.detail.approved"):i("workflow.detail.rejected");F.set(l,{kind:"ok",text:R.alreadyTerminal?i("workflow.detail.alreadyTerminal",{label:et}):R.pending?i("workflow.detail.workflowContinue",{label:et}):i("workflow.detail.workflowRefreshing",{label:et})}),T(null),await G()}catch(p){let w=p?.message??String(p);F.set(l,{kind:"error",text:w}),T(w)}finally{K.delete(l),A()}}}function A(){if(!g)return;it=y.scrollTop;let l=g.run;B.has(l.status)&&at(null),a.innerHTML=`${r(l.workflowId??"?")} \xB7 ${M(l.status)} \xB7 lastSeq ${g.lastSeq}`,o.textContent=i("workflow.detail.refreshed",{time:new Date().toLocaleTimeString()}),m.hidden=B.has(l.status),m.disabled=_||!g.chatBinding?.larkAppId,m.textContent=g.chatBinding?.larkAppId?i("workflow.detail.cancel"):i("workflow.detail.cliCancelOnly"),m.title=g.chatBinding?.larkAppId?i("workflow.detail.cancelTitle"):i("workflow.detail.cliCancelTitle",{runId:e}),Nt(c,g),jt(f,g),Dt(h,v,g,b),Vt(k,g),Jt(u,g,St,$t,{comments:rt,statuses:F,resolving:K,onResolve:Mt},{sessions:V,pending:q,errors:D,onStart:Et,onEnd:Lt},ot,bt)&&(ot=void 0),he(P,b),y.scrollTop=it,I.hidden=!x,$.textContent=i("workflow.detail.eventsLoaded",{loaded:b.length,total:U})}function tt(){if(H!==null&&window.clearTimeout(H),g&&B.has(g.run.status)){H=null;return}H=window.setTimeout(async()=>{await G(),j||tt()},Ht)}function lt(){document.hidden||G().then(()=>{!j&&H===null&&tt()})}return I.addEventListener("click",()=>{Tt()}),m.addEventListener("click",()=>{At()}),document.addEventListener("visibilitychange",lt),It().then(()=>{T(null),j||tt()}).catch(l=>{T(l?.message??String(l)),a.textContent=i("workflow.detail.loadFailed")}),()=>{j=!0,H!==null&&window.clearTimeout(H),document.removeEventListener("visibilitychange",lt)}}function Nt(t,e){let n=e.run,a=[[i("workflow.summary.workflow"),r(n.workflowId??"?")],[i("workflow.summary.status"),M(n.status)],[i("workflow.summary.lastSeq"),String(e.lastSeq)],[i("workflow.summary.updated"),r(new Date(e.updatedAt).toLocaleString())],[i("workflow.summary.revision"),r(Y(n.revisionId))],[i("workflow.summary.initiator"),r(n.initiator??"-")]];n.failedNodeId&&a.push([i("workflow.summary.failedNode"),r(n.failedNodeId)]),n.cancelOriginEventId&&a.push([i("workflow.summary.cancelOrigin"),r(n.cancelOriginEventId)]),e.chatBinding&&(a.push([i("workflow.summary.chat"),`<code>${r(e.chatBinding.chatId)}</code>`]),a.push([i("workflow.summary.app"),`<code>${r(e.chatBinding.larkAppId)}</code>`])),t.innerHTML=a.map(([o,s])=>`<div class="wf-summary-item"><span>${o}</span><strong>${s}</strong></div>`).join("")}function xt(t){if(!t.errorCode)return"";let e=t.errorMessage?` \u2014 ${be(t.errorMessage,96)}`:"";return`<div class="wf-run-error">
86
- <span class="muted error">${r(t.errorCode)}</span>${r(e)}
87
- </div>`}function Ut(t){let e=t.dangling;return{total:new Set([...e.activities,...e.effectAttempted,...e.waits,...e.cancels]).size,effects:e.effectAttempted.length,activities:e.activities.length,waits:e.waits.length,cancels:e.cancels.length}}function jt(t,e){let n=e.dangling,a=[[i("workflow.dangling.activities"),n.activities],[i("workflow.dangling.effects"),n.effectAttempted],[i("workflow.dangling.waits"),n.waits],[i("workflow.dangling.cancels"),n.cancels]],o=new Set(a.flatMap(([,s])=>s)).size;if(t.className=o>0?"wf-panel wf-dangling-panel has":"wf-panel wf-dangling-panel",o===0){t.innerHTML=`<div class="wf-panel-title"><h3>${r(i("workflow.detail.dangling"))}</h3></div><div class="muted">${r(i("workflow.detail.noDangling"))}</div>`;return}t.innerHTML=`<div class="wf-panel-title"><h3>${r(i("workflow.detail.dangling"))}</h3><span class="wf-dangling has">${o}</span></div>
88
- <div class="wf-dangling-grid">
89
- ${a.map(([s,d])=>`<div><strong>${s}</strong>${d.length===0?`<div class="muted">${r(i("workflow.detail.none"))}</div>`:`<ul>${d.map(c=>`<li><code>${r(c)}</code></li>`).join("")}</ul>`}</div>`).join("")}
90
- </div>`}function Dt(t,e,n,a){let o=Bt(a,n);if(o.length===0){e.textContent="",t.innerHTML=`<div class="empty">${r(i("workflow.detail.noParallelData"))}</div>`;return}let s=Date.now(),d=Math.min(...o.map(u=>u.startedAt)),c=Math.max(...o.map(u=>u.endedAt??s),d+1e3),f=Math.max(1,c-d),h=_t(o,s),v=o.filter(u=>!u.endedAt&&(u.status==="running"||u.status==="effectAttempting")).length;e.textContent=i("workflow.detail.parallelMeta",{count:o.length,max:h,running:v});let k=o.sort((u,y)=>u.startedAt-y.startedAt||u.activityId.localeCompare(y.activityId)).map(u=>Wt(u,d,f,s)).join("");t.innerHTML=`<div class="wf-parallel-axis">
91
- <span title="${r(new Date(d).toISOString())}">${r(X(d))}</span>
92
- <span title="${r(new Date(c).toISOString())}">${r(X(c))}</span>
93
- </div>
94
- <div class="wf-parallel-list">${k}</div>`}function Bt(t,e){let n=new Map,a=new Map(e.activities.map(o=>[o.activityId,o.ownerNodeId]));for(let o of[...t].sort((s,d)=>W(s.eventId)-W(d.eventId))){let s=$e(o);if(!s)continue;let d=typeof s.activityId=="string"?s.activityId:void 0,c=typeof s.attemptId=="string"?s.attemptId:void 0;if(!d||!c)continue;let f=n.get(c);if(o.type==="attemptCreated"){let h=typeof s.attemptNumber=="number"?s.attemptNumber:void 0;f={nodeId:typeof s.nodeId=="string"?s.nodeId:a.get(d),activityId:d,attemptId:c,attemptNumber:h,status:"pending",startedAt:o.timestamp},n.set(c,f);continue}f||(f={nodeId:a.get(d),activityId:d,attemptId:c,status:"pending",startedAt:o.timestamp},n.set(c,f)),o.type==="activityRunning"?(f.status="running",f.runningAt=o.timestamp):o.type==="effectAttempted"?f.status="effectAttempting":o.type==="activityWaiting"||o.type==="waitCreated"?f.status="waiting":Ft(o.type)&&(f.status=Kt(o.type),f.endedAt=o.timestamp,f.endType=o.type)}return[...n.values()]}function Wt(t,e,n,a){let o=t.endedAt??a,s=ut((t.startedAt-e)/n*100,0,100),d=ut((Math.max(o,t.startedAt+1)-t.startedAt)/n*100,.7,100-s),c=t.nodeId??t.activityId,f=t.attemptNumber!==void 0?`#${t.attemptNumber}`:Y(t.attemptId),h=[`${c} ${t.status}`,`${new Date(t.startedAt).toISOString()} \u2192 ${t.endedAt?new Date(t.endedAt).toISOString():i("workflow.detail.parallelNow")}`,t.endType?`end: ${t.endType}`:void 0].filter(Boolean).join(`
95
- `);return`<div class="wf-parallel-row">
96
- <div class="wf-parallel-label">
97
- <code>${r(c)}</code>
98
- <span class="muted">${r(t.activityId)} \xB7 ${r(f)}</span>
99
- </div>
100
- <div class="wf-parallel-track">
101
- <div class="wf-parallel-bar wf-parallel-${r(t.status)}" style="left:${s.toFixed(3)}%;width:${d.toFixed(3)}%;" title="${r(h)}">
102
- <span>${r(C(t.status))}</span>
103
- </div>
104
- </div>
105
- </div>`}function _t(t,e){let n=[];for(let s of t)n.push({time:s.startedAt,delta:1}),n.push({time:s.endedAt??e,delta:-1});n.sort((s,d)=>s.time-d.time||d.delta-s.delta);let a=0,o=0;for(let s of n)a+=s.delta,o=Math.max(o,a);return o}function Ft(t){return t==="activitySucceeded"||t==="activityFailed"||t==="activityTimedOut"||t==="activityCanceled"}function Kt(t){return t==="activitySucceeded"?"succeeded":t==="activityCanceled"?"cancelled":t==="activityTimedOut"?"timedOut":"failed"}function Vt(t,e){let n=new Map(e.activities.map(s=>[s.activityId,s])),a=new Set,o=[];for(let s of e.nodes){let d=(s.activityId?n.get(s.activityId):void 0)??e.activities.find(c=>c.ownerNodeId===s.nodeId);d&&a.add(d.activityId),o.push(dt(s,d))}for(let s of e.activities)a.has(s.activityId)||o.push(dt(void 0,s));t.innerHTML=o.length>0?o.join(""):`<tr><td colspan="7" class="empty">${r(i("workflow.detail.noNodes"))}</td></tr>`}function dt(t,e){let n=e?.attempts[e.attempts.length-1];return`<tr>
106
- <td>${t?`<code>${r(t.nodeId)}</code>`:'<span class="muted">-</span>'}</td>
107
- <td>${t?M(t.status):'<span class="muted">-</span>'}</td>
108
- <td>${e?`<code>${r(e.activityId)}</code>`:'<span class="muted">-</span>'}</td>
109
- <td>${e?M(e.status):'<span class="muted">-</span>'}</td>
110
- <td>${e?.attempts.length??0}</td>
111
- <td>${n?`<code>${r(n.attemptId)}</code>`:'<span class="muted">-</span>'}</td>
112
- <td>${n?ye(n):`<span class="muted">${r(i("workflow.detail.idle"))}</span>`}</td>
113
- </tr>`}function Jt(t,e,n,a,o,s,d,c){fe(t,n,a),le(t,o.comments);let f=!!(d&&e.attemptIO?.[d]?.terminal);f&&d&&n.add(nt(d,i("workflow.detail.liveTerminal")));let h=zt(e),v=new Set;if(c){for(let u of h){v.add(u.key);let y=c.get(u.key);y||(y=Gt(u.key),c.set(u.key,y),t.appendChild(y.article)),Qt(y,u,n,o,s,d)}for(let[u,y]of Array.from(c))v.has(u)||(y.article.remove(),c.delete(u));if(h.length===0){if(!t.querySelector(".wf-io-empty-placeholder")){let u=document.createElement("div");u.className="empty wf-io-empty-placeholder",u.textContent=i("workflow.detail.noNodeIO"),t.appendChild(u)}}else t.querySelector(".wf-io-empty-placeholder")?.remove()}else{let u=[];for(let y of h)u.push(ee(y,n,o,s,d));t.innerHTML=u.length>0?u.join(""):`<div class="empty">${r(i("workflow.detail.noNodeIO"))}</div>`}me(t,a);let k=ue(t,d);return we(t,n),pe(t,a),ce(t,o),kt(t,s),k&&f}function zt(t){let e=new Map(t.activities.map(o=>[o.activityId,o])),n=new Set,a=[];for(let o of t.nodes){let s=(o.activityId?e.get(o.activityId):void 0)??t.activities.find(d=>d.ownerNodeId===o.nodeId);if(!s){a.push({key:`node:${o.nodeId}`,node:o});continue}n.add(s.activityId),a.push({key:`activity:${s.activityId}`,node:o,activity:s,io:t.attemptIO?.[Q(s)?.attemptId??""]})}for(let o of t.activities)n.has(o.activityId)||a.push({key:`activity:${o.activityId}`,activity:o,io:t.attemptIO?.[Q(o)?.attemptId??""]});return a}function Gt(t){let e=document.createElement("article");e.className="wf-io-card",e.dataset.wfCardKey=t;let n=document.createElement("div");n.className="wf-io-card-head";let a=document.createElement("div");a.className="wf-io-terminal-slot";let o=document.createElement("div");return o.className="wf-io-grid",e.appendChild(n),e.appendChild(a),e.appendChild(o),{article:e,head:n,terminalSlot:a,grid:o,currentTerminalUrl:null}}function Qt(t,e,n,a,o,s){let d=Q(e.activity),c=e.node?.nodeId??e.activity?.ownerNodeId??e.activity?.activityId??"unknown",f=!!(d&&d.attemptId===s);t.article.classList.toggle("is-focused",f),d?t.article.dataset.wfAttemptCard=d.attemptId:delete t.article.dataset.wfAttemptCard;let h=ht(d,a);t.head.innerHTML=`
114
- <header>
115
- <div>
116
- <strong><code>${r(c)}</code></strong>
117
- <span class="muted">${e.activity?r(e.activity.activityId):r(i("workflow.detail.notDispatched"))}</span>
118
- </div>
119
- <div>${e.node?M(e.node.status):""} ${e.activity?M(e.activity.status):""}</div>
120
- </header>
121
- <div class="wf-io-meta">
122
- ${d?`${r(i("workflow.detail.attempt"))} <code>${r(d.attemptId)}</code>`:r(i("workflow.detail.noAttempt"))}
123
- </div>
124
- ${h}
125
- `;let v=ft(d,e.activity,e.io?.terminal,o),k=v?.url??null;if(k!==t.currentTerminalUrl)v===null?t.terminalSlot.innerHTML="":t.terminalSlot.innerHTML=wt(e.key,d,e.activity,e.io?.terminal,v,n,o),t.currentTerminalUrl=k;else if(v!==null&&e.io?.terminal){let y=t.terminalSlot.querySelector("details.wf-terminal-block > summary");if(y){let P=mt(v.kind);y.innerHTML=`${r(P)} ${yt(d,e.io.terminal)}`}d&&de(t.terminalSlot,d,e.activity,e.io.terminal,v,o)}let u=d?.attemptId??e.activity?.activityId??e.node?.nodeId??"unknown";t.grid.innerHTML=`
126
- ${E(u,i("workflow.detail.authoredInput"),e.io?.input,n)}
127
- ${E(u,i("workflow.detail.resolvedInput"),e.io?.resolvedInput,n)}
128
- ${E(u,i("workflow.detail.output"),e.io?.output,n)}
129
- ${E(u,i("workflow.detail.executionLog"),e.io?.log,n)}
130
- ${e.io?.waitPrompt?E(u,i("workflow.detail.waitPrompt"),e.io.waitPrompt,n):""}
131
- `}function ft(t,e,n,a){if(!n||n.error)return null;if(ne(t,n))return{kind:"live",url:ie(n)};if(!t||!e||!re(t,n))return null;let o=ae();if(!o)return null;let s=a?.sessions.get(t.attemptId);return s?{kind:"resume",url:s.url,resumeId:s.resumeId,downloadUrl:ct(o,e.activityId,t.attemptId)}:{kind:"replay",url:oe(o,e.activityId,t.attemptId,!!n.hasPtyLog),downloadUrl:ct(o,e.activityId,t.attemptId)}}function wt(t,e,n,a,o,s,d){if(!a)return"";let c=mt(o.kind),f=nt(t,c),h=yt(e,a),v=Xt(o.kind),k=o.kind==="replay"||o.kind==="resume"?`<a class="btn-link" href="${r(o.downloadUrl)}" download>${r(i("workflow.detail.downloadFullLog"))}</a>`:"",u=e?gt(e,n,a,o,d):"",y=e?vt(e.attemptId,d):"";return`<details class="wf-io-block wf-terminal-block" data-io-key="${r(f)}"${s.has(f)?" open":""}>
132
- <summary>${r(c)} ${h}</summary>
133
- <div class="wf-terminal-actions">
134
- <a class="btn-link" href="${r(o.url)}" target="_blank" rel="noreferrer">${r(v)}</a>
135
- ${k}
136
- ${u}
137
- </div>
138
- ${y}
139
- <iframe class="wf-terminal-frame" src="${r(o.url)}" title="${r(c)}" loading="lazy"></iframe>
140
- </details>`}function mt(t){return t==="live"?i("workflow.detail.liveTerminal"):t==="resume"?i("workflow.detail.terminalResume"):i("workflow.detail.terminalReplay")}function Xt(t){return t==="live"?i("workflow.detail.openTerminalNewTab"):t==="resume"?i("workflow.detail.openResumeNewTab"):i("workflow.detail.openReplayNewTab")}var pt=new Set(["antigravity","codex-app","cursor","mira"]),Yt=new Set(["aiden","coco","claude-code","seed","relay","codex","mtr","hermes","pi","mir"]);function Zt(t){return!!t&&(Yt.has(t)||pt.has(t))}function te(t){return!!t&&pt.has(t)}function gt(t,e,n,a,o){if(!o||a.kind==="live"||!e)return"";let s=a.kind==="resume",d=o.pending.has(t.attemptId),c=`data-wf-resume-attempt="${r(t.attemptId)}" data-wf-resume-activity="${r(e.activityId)}"`;return s?`<button type="button" class="btn-link" data-wf-resume-button="1" data-wf-resume-action="end" ${c}${d?" disabled":""}>${r(d?i("workflow.detail.resumeEnding"):i("workflow.detail.endResumeSession"))}</button>`:Zt(n.cliId)?te(n.cliId)&&!n.cliSessionId?`<button type="button" class="btn-link" data-wf-resume-button="1" disabled title="${r(i("workflow.detail.resumeMissingCliSession"))}">${r(i("workflow.detail.resumeSession"))}</button>`:`<button type="button" class="btn-link" data-wf-resume-button="1" data-wf-resume-action="start" ${c}${d?" disabled":""}>${r(d?i("workflow.detail.resumeStarting"):i("workflow.detail.resumeSession"))}</button>`:`<button type="button" class="btn-link" data-wf-resume-button="1" disabled title="${r(i("workflow.detail.resumeUnsupportedCli",{cliId:n.cliId??"?"}))}">${r(i("workflow.detail.resumeSession"))}</button>`}function vt(t,e){if(!e)return"";let n=e.errors.get(t);return n?`<div class="hint-warn wf-resume-status" data-wf-resume-status="${r(t)}">${r(n)}</div>`:""}function ee(t,e,n,a,o){let s=Q(t.activity),d=t.node?.nodeId??t.activity?.ownerNodeId??t.activity?.activityId??"unknown",c=s?.attemptId??t.activity?.activityId??t.node?.nodeId??"unknown",f=ht(s,n),h=s?.attemptId===o?" is-focused":"",v=s?` data-wf-attempt-card="${r(s.attemptId)}"`:"",k=ft(s,t.activity,t.io?.terminal,a),u=k?wt(c,s,t.activity,t.io?.terminal,k,e,a):"";return`<article class="wf-io-card${h}" data-wf-card-key="${r(t.key)}"${v}>
141
- <div class="wf-io-card-head">
142
- <header>
143
- <div>
144
- <strong><code>${r(d)}</code></strong>
145
- <span class="muted">${t.activity?r(t.activity.activityId):r(i("workflow.detail.notDispatched"))}</span>
146
- </div>
147
- <div>${t.node?M(t.node.status):""} ${t.activity?M(t.activity.status):""}</div>
148
- </header>
149
- <div class="wf-io-meta">
150
- ${s?`${r(i("workflow.detail.attempt"))} <code>${r(s.attemptId)}</code>`:r(i("workflow.detail.noAttempt"))}
151
- </div>
152
- ${f}
153
- </div>
154
- <div class="wf-io-terminal-slot">${u}</div>
155
- <div class="wf-io-grid">
156
- ${E(c,i("workflow.detail.authoredInput"),t.io?.input,e)}
157
- ${E(c,i("workflow.detail.resolvedInput"),t.io?.resolvedInput,e)}
158
- ${E(c,i("workflow.detail.output"),t.io?.output,e)}
159
- ${E(c,i("workflow.detail.executionLog"),t.io?.log,e)}
160
- ${t.io?.waitPrompt?E(c,i("workflow.detail.waitPrompt"),t.io.waitPrompt,e):""}
161
- </div>
162
- </article>`}function Q(t){return t?.attempts[t.attempts.length-1]}function yt(t,e){let n=[];return e.error?n.push(i("workflow.detail.error")):n.push(e.status==="live"?i("workflow.detail.terminalLive"):i("workflow.detail.terminalClosedShort")),t?.status&&n.push(t.status),e.webPort>0&&n.push(`:${e.webPort}`),`<span class="muted">${r(n.join(" \xB7 "))}</span>`}function ne(t,e){return e.status==="live"&&e.webPort>0&&(t?.status==="pending"||t?.status==="running"||t?.status==="effectAttempting")}function re(t,e){return t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"||t.status==="timedOut"?!!(e.sessionId||e.startedAt):!1}function ie(t){return`http://${window.location.hostname||"127.0.0.1"}:${t.webPort}`}function oe(t,e,n,a){let o=new URLSearchParams({runId:t,activityId:e,attemptId:n});return a&&o.set("hasPtyLog","1"),`/assets/terminal-replay.html?${o.toString()}`}function ct(t,e,n){return`/api/workflows/runs/${encodeURIComponent(t)}/attempts/${encodeURIComponent(e)}/${encodeURIComponent(n)}/terminal-log/raw?download=1`}function ae(){let t=window.location.hash.match(/^#\/legacy-workflow\/([^/?#]+)/);if(!t)return null;try{return decodeURIComponent(t[1])}catch{return null}}function ht(t,e){if(!se(t))return"";let n=t.attemptId,a=e.comments.get(n)??"",o=e.resolving.has(n),s=e.statuses.get(n),d=s?.kind==="error"?"hint-warn":"hint-ok";return`<div class="wf-approval-box" data-wf-approval="${r(n)}">
163
- <label>
164
- <span>${r(i("workflow.detail.approvalComment"))}</span>
165
- <textarea class="wf-approval-comment" data-wf-approval-comment="${r(n)}" rows="2" placeholder="${r(i("workflow.detail.optionalComment"))}"${o?" disabled":""}>${r(a)}</textarea>
166
- </label>
167
- <div class="wf-approval-actions">
168
- <button type="button" class="primary" data-wf-approval-action="approve" data-wf-attempt-id="${r(n)}"${o?" disabled":""}>${r(i("workflow.detail.approve"))}</button>
169
- <button type="button" data-wf-approval-action="reject" data-wf-attempt-id="${r(n)}"${o?" disabled":""}>${r(i("workflow.detail.reject"))}</button>
170
- ${o?`<span class="muted">${r(i("workflow.detail.submitting"))}</span>`:""}
171
- </div>
172
- ${s?`<div class="${d} wf-approval-status">${r(s.text)}</div>`:""}
173
- </div>`}function se(t){return!!t&&t.status==="waiting"&&t.wait?.waitKind==="human-gate"&&!t.wait.resolution}function le(t,e){t.querySelectorAll("textarea[data-wf-approval-comment]").forEach(n=>{let a=n.dataset.wfApprovalComment;a&&e.set(a,n.value)})}function kt(t,e){t.querySelectorAll("button[data-wf-resume-action][data-wf-resume-attempt][data-wf-resume-activity]").forEach(n=>{n.dataset.wfResumeBound!=="1"&&(n.dataset.wfResumeBound="1",n.addEventListener("click",()=>{let a=n.dataset.wfResumeAttempt,o=n.dataset.wfResumeActivity,s=n.dataset.wfResumeAction;!a||!o||(s==="start"?e.onStart(a,o):s==="end"&&e.onEnd(a,o))}))})}function de(t,e,n,a,o,s){let d=t.querySelector(".wf-terminal-actions");if(!d)return;let c=d.querySelector('button[data-wf-resume-button="1"]'),f=gt(e,n,a,o,s);c?c.outerHTML=f:f&&d.insertAdjacentHTML("beforeend",f);let h=t.querySelector("details.wf-terminal-block");if(h){let v=h.querySelector(".wf-resume-status"),k=vt(e.attemptId,s);v?v.outerHTML=k:k&&d.insertAdjacentHTML("afterend",k)}kt(t,s)}function ce(t,e){t.querySelectorAll("textarea[data-wf-approval-comment]").forEach(n=>{let a=n.dataset.wfApprovalComment;a&&n.addEventListener("input",()=>{e.comments.set(a,n.value)})}),t.querySelectorAll("button[data-wf-approval-action][data-wf-attempt-id]").forEach(n=>{n.addEventListener("click",()=>{let a=n.dataset.wfAttemptId,o=n.dataset.wfApprovalAction;!a||o!=="approve"&&o!=="reject"||e.onResolve(a,o)})})}function E(t,e,n,a){let o=nt(t,e);return`<details class="wf-io-block" data-io-key="${r(o)}"${a.has(o)?" open":""}>
174
- <summary>${r(e)} ${ge(n)}</summary>
175
- ${ve(n)}
176
- </details>`}function nt(t,e){return`${t}:${e}`}function ue(t,e){if(!e)return!1;for(let n of t.querySelectorAll("[data-wf-attempt-card]"))if(n.dataset.wfAttemptCard===e)return n.scrollIntoView({block:"center"}),!0;return!1}function fe(t,e,n){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(a=>{let o=a.dataset.ioKey;if(!o)return;a.open?e.add(o):e.delete(o);let s=a.querySelector(".wf-io-pre");s&&n.set(o,s.scrollTop)})}function we(t,e){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(n=>{n.dataset.ioToggleBound!=="1"&&(n.dataset.ioToggleBound="1",n.addEventListener("toggle",()=>{let a=n.dataset.ioKey;a&&(n.open?e.add(a):e.delete(a))}))})}function me(t,e){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(n=>{let a=n.dataset.ioKey;if(!a)return;let o=e.get(a);if(o===void 0)return;let s=n.querySelector(".wf-io-pre");s&&(s.scrollTop=o)})}function pe(t,e){t.querySelectorAll("details.wf-io-block[data-io-key]").forEach(n=>{let a=n.dataset.ioKey;if(!a)return;let o=n.querySelector(".wf-io-pre");o&&o.dataset.ioScrollBound!=="1"&&(o.dataset.ioScrollBound="1",o.addEventListener("scroll",()=>{e.set(a,o.scrollTop)}))})}function ge(t){if(!t)return`<span class="muted">${r(i("workflow.detail.empty"))}</span>`;let e=[];return t.outputBytes!==void 0&&e.push(`${t.outputBytes}B`),t.truncated&&e.push(i("workflow.detail.truncated")),t.error&&e.push(i("workflow.detail.error")),t.outputHash&&e.push(Y(t.outputHash)),e.length?`<span class="muted">${r(e.join(" \xB7 "))}</span>`:""}function ve(t){if(!t)return`<div class="muted wf-io-empty">${r(i("workflow.detail.noData"))}</div>`;let e=t.value!==void 0?JSON.stringify(t.value,null,2):t.text??"",n=t.error?`<div class="muted error">${r(t.error)}</div>`:"";return e?`${n}<pre class="wf-io-pre">${r(e)}</pre>`:`${n}<div class="muted wf-io-empty">${r(i("workflow.detail.noPreview"))}</div>`}function ye(t){let e=[];if(t.effectAttempted&&e.push(`${r(i("workflow.detail.effect"))} ${r(t.effectAttempted.provider)}`),t.wait){let n=t.wait.resolution?`${t.wait.resolution.kind}${t.wait.resolution.resolution?":"+t.wait.resolution.resolution:""}`:i("workflow.detail.open");e.push(`${r(i("workflow.detail.wait"))} ${r(t.wait.waitKind)} ${r(n)}`),t.wait.deadlineAt!==void 0&&e.push(`${r(i("workflow.detail.deadline"))} ${r(X(t.wait.deadlineAt))}`)}if(t.error){let n=`${t.error.errorCode}${t.error.errorClass?` \xB7 ${t.error.errorClass}`:""}`;e.push(`<span class="muted error">${r(n)}</span>`),t.error.errorMessage&&e.push(`<span class="error wf-error-msg">${r(t.error.errorMessage)}</span>`)}return t.output&&e.push(`${r(i("workflow.detail.output"))} ${r(Y(t.output.outputHash))}`),t.runningMs!==void 0&&e.push(`${t.runningMs}ms`),e.length>0?e.join("<br/>"):'<span class="muted">-</span>'}function he(t,e){t.innerHTML=e.length>0?e.map(ke).join(""):`<tr><td colspan="7" class="empty">${r(i("workflow.detail.noEvents"))}</td></tr>`}function ke(t){let e=Se(t.payload);return`<tr>
177
- <td>${W(t.eventId)}</td>
178
- <td><code>${r(t.type)}</code></td>
179
- <td>${r(t.actor)}</td>
180
- <td>${e.nodeId?`<code>${r(e.nodeId)}</code>`:"-"}</td>
181
- <td>${e.activityId?`<code>${r(e.activityId)}</code>`:"-"}</td>
182
- <td>${e.errorCode?`<span class="muted error">${r(e.errorCode)}</span>`:"-"}</td>
183
- <td title="${r(new Date(t.timestamp).toISOString())}">${r(X(t.timestamp))}</td>
184
- </tr>`}function W(t){let e=t.lastIndexOf("-");if(e<0)return 0;let n=Number(t.slice(e+1));return Number.isFinite(n)?n:0}function Se(t){if(!t||typeof t!="object"||"ref"in t)return{};let e=t,n={};typeof e.nodeId=="string"&&(n.nodeId=e.nodeId),typeof e.activityId=="string"&&(n.activityId=e.activityId),typeof e.failedNodeId=="string"&&(n.nodeId=e.failedNodeId);let a=e.error;return a&&typeof a=="object"&&"errorCode"in a&&(n.errorCode=String(a.errorCode)),n}function $e(t){return!t.payload||typeof t.payload!="object"||"ref"in t.payload?null:t.payload}function ut(t,e,n){return Math.min(n,Math.max(e,t))}function Y(t){return t?t.length>18?t.slice(0,10)+"..."+t.slice(-6):t:"-"}function be(t,e){return t.length>e?t.slice(0,e-1)+"\u2026":t}function X(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}export{Te as renderWorkflowsPage};
@@ -1,25 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.2 300" width="173.2" height="300" preserveAspectRatio="none">
2
- <!--
3
- ZZZ heatmap-pattern: pointy-top hex grid, side=100, fundamental tile = (s√3, 3s).
4
- Tile size 173.2×300 is a perfect lattice repeat unit — CSS background-image: repeat
5
- will line up with no seams. Drawn hexes at (0,0), (86.6,150) and the 4 corner copies
6
- so partials wrap correctly across the tile boundary.
7
- -->
8
- <rect width="173.2" height="300" fill="#0d0e1f"/>
9
- <g fill="none" stroke="#c5f541" stroke-width="2" opacity="0.16" stroke-linejoin="round">
10
- <polygon points="86.6,50 173.2,100 173.2,200 86.6,250 0,200 0,100"/>
11
- <polygon points="0,-100 86.6,-50 86.6,50 0,100 -86.6,50 -86.6,-50"/>
12
- <polygon points="173.2,-100 259.8,-50 259.8,50 173.2,100 86.6,50 86.6,-50"/>
13
- <polygon points="0,200 86.6,250 86.6,350 0,400 -86.6,350 -86.6,250"/>
14
- <polygon points="173.2,200 259.8,250 259.8,350 173.2,400 86.6,350 86.6,250"/>
15
- </g>
16
- <g fill="#ffd93d" opacity="0.4">
17
- <circle cx="0" cy="100" r="2.4"/>
18
- <circle cx="173.2" cy="100" r="2.4"/>
19
- <circle cx="86.6" cy="250" r="2.4"/>
20
- <circle cx="0" cy="-100" r="2.4"/>
21
- <circle cx="173.2" cy="-100" r="2.4"/>
22
- <circle cx="0" cy="400" r="2.4"/>
23
- <circle cx="173.2" cy="400" r="2.4"/>
24
- </g>
25
- </svg>