@hotmeshio/long-tail 0.1.5 → 0.1.7

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 (431) hide show
  1. package/README.md +78 -8
  2. package/build/api/auth.d.ts +5 -0
  3. package/build/api/auth.js +42 -0
  4. package/build/api/bot-accounts.d.ts +50 -0
  5. package/build/api/bot-accounts.js +215 -0
  6. package/build/api/controlplane.d.ts +20 -0
  7. package/build/api/controlplane.js +110 -0
  8. package/build/api/dba.d.ts +15 -0
  9. package/build/api/dba.js +68 -0
  10. package/build/api/escalations.d.ts +70 -0
  11. package/build/api/escalations.js +656 -0
  12. package/build/api/exports.d.ts +32 -0
  13. package/build/api/exports.js +146 -0
  14. package/build/api/index.d.ts +18 -0
  15. package/build/api/index.js +54 -0
  16. package/build/api/insight.d.ts +29 -0
  17. package/build/api/insight.js +90 -0
  18. package/build/api/maintenance.d.ts +7 -0
  19. package/build/api/maintenance.js +28 -0
  20. package/build/api/mcp-runs.d.ts +16 -0
  21. package/build/api/mcp-runs.js +62 -0
  22. package/build/api/mcp.d.ts +52 -0
  23. package/build/api/mcp.js +212 -0
  24. package/build/api/namespaces.d.ts +7 -0
  25. package/build/{routes/escalations/helpers.js → api/namespaces.js} +24 -12
  26. package/build/api/roles.d.ts +25 -0
  27. package/build/api/roles.js +159 -0
  28. package/build/api/settings.d.ts +2 -0
  29. package/build/api/settings.js +35 -0
  30. package/build/api/tasks.d.ts +27 -0
  31. package/build/api/tasks.js +96 -0
  32. package/build/api/users.d.ts +44 -0
  33. package/build/api/users.js +162 -0
  34. package/build/api/workflow-sets.d.ts +26 -0
  35. package/build/api/workflow-sets.js +119 -0
  36. package/build/api/workflows.d.ts +48 -0
  37. package/build/api/workflows.js +298 -0
  38. package/build/api/yaml-workflows.d.ts +87 -0
  39. package/build/api/yaml-workflows.js +556 -0
  40. package/build/index.d.ts +4 -0
  41. package/build/index.js +6 -1
  42. package/build/lib/db/migrate.js +3 -6
  43. package/{lib → build/lib}/db/schemas/001_schema.sql +3 -0
  44. package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
  45. package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
  46. package/{lib → build/lib}/db/schemas/011_system_workflow_configs.sql +14 -0
  47. package/build/lib/db/schemas/016_streamable_http.sql +7 -0
  48. package/build/lib/events/callback.d.ts +41 -0
  49. package/build/lib/events/callback.js +98 -0
  50. package/build/modules/config.js +1 -1
  51. package/build/routes/auth.js +37 -36
  52. package/build/routes/bot-accounts.js +34 -164
  53. package/build/routes/controlplane.js +20 -60
  54. package/build/routes/dba.js +18 -28
  55. package/build/routes/docs.js +25 -7
  56. package/build/routes/escalations/bulk.js +17 -192
  57. package/build/routes/escalations/list.js +29 -75
  58. package/build/routes/escalations/resolve.js +3 -193
  59. package/build/routes/escalations/single.js +13 -122
  60. package/build/routes/exports.js +44 -95
  61. package/build/routes/index.js +2 -0
  62. package/build/routes/insight.js +61 -40
  63. package/build/routes/maintenance.js +41 -17
  64. package/build/routes/mcp-runs.js +52 -60
  65. package/build/routes/mcp.js +55 -161
  66. package/build/routes/namespaces.js +9 -20
  67. package/build/routes/roles.js +23 -97
  68. package/build/routes/settings.js +37 -25
  69. package/build/routes/tasks.js +28 -64
  70. package/build/routes/users.js +24 -113
  71. package/build/routes/workflow-sets.d.ts +2 -0
  72. package/build/routes/workflow-sets.js +98 -0
  73. package/build/routes/workflows/config.js +23 -57
  74. package/build/routes/workflows/discovery.js +11 -85
  75. package/build/routes/workflows/invocation.js +16 -84
  76. package/build/routes/yaml-workflows/cron.d.ts +2 -0
  77. package/build/routes/yaml-workflows/cron.js +68 -0
  78. package/build/routes/yaml-workflows/crud.js +38 -193
  79. package/build/routes/yaml-workflows/deployment.js +15 -140
  80. package/build/routes/yaml-workflows/index.js +4 -1
  81. package/build/routes/yaml-workflows/versions.js +20 -58
  82. package/build/sdk/index.d.ts +327 -0
  83. package/build/sdk/index.js +298 -0
  84. package/build/services/controlplane/index.d.ts +1 -2
  85. package/build/services/controlplane/index.js +3 -3
  86. package/build/services/controlplane/sql.d.ts +2 -2
  87. package/build/services/controlplane/sql.js +4 -5
  88. package/build/services/controlplane/types.d.ts +1 -0
  89. package/build/services/cron/index.d.ts +17 -0
  90. package/build/services/cron/index.js +94 -1
  91. package/build/services/export/index.js +6 -1
  92. package/build/services/hotmesh-utils.js +2 -4
  93. package/build/services/insight/index.d.ts +18 -0
  94. package/build/services/insight/index.js +60 -0
  95. package/build/services/mcp/client/connection.d.ts +9 -0
  96. package/build/services/mcp/client/connection.js +49 -1
  97. package/build/services/mcp/client/tools.js +13 -1
  98. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  99. package/build/services/mcp/db.d.ts +1 -1
  100. package/build/services/mcp/db.js +10 -0
  101. package/build/services/mcp/playwright-server/schemas.d.ts +4 -4
  102. package/build/services/mcp/sql.d.ts +1 -1
  103. package/build/services/mcp/sql.js +2 -2
  104. package/build/services/mcp/types.d.ts +3 -1
  105. package/build/services/mcp-runs/sql.js +1 -1
  106. package/build/services/workflow-sets/db.d.ts +16 -0
  107. package/build/services/workflow-sets/db.js +78 -0
  108. package/build/services/workflow-sets/index.d.ts +1 -0
  109. package/build/services/workflow-sets/index.js +11 -0
  110. package/build/services/workflow-sets/sql.d.ts +6 -0
  111. package/build/services/workflow-sets/sql.js +24 -0
  112. package/build/services/yaml-workflow/db-utils.d.ts +1 -0
  113. package/build/services/yaml-workflow/db-utils.js +4 -0
  114. package/build/services/yaml-workflow/db.d.ts +8 -0
  115. package/build/services/yaml-workflow/db.js +41 -0
  116. package/build/services/yaml-workflow/invoke.d.ts +19 -0
  117. package/build/services/yaml-workflow/invoke.js +80 -0
  118. package/build/services/yaml-workflow/pipeline/build/dag.js +1 -1
  119. package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +1 -1
  120. package/build/services/yaml-workflow/pipeline/build/wiring.js +102 -2
  121. package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
  122. package/build/services/yaml-workflow/pipeline/prompts.js +44 -1
  123. package/build/services/yaml-workflow/sql.d.ts +5 -1
  124. package/build/services/yaml-workflow/sql.js +23 -3
  125. package/build/services/yaml-workflow/types.d.ts +16 -1
  126. package/build/services/yaml-workflow/workers/callbacks.js +16 -2
  127. package/build/services/yaml-workflow/workers/register.js +36 -1
  128. package/build/start/adapters.js +4 -0
  129. package/build/system/index.js +12 -0
  130. package/build/system/mcp-servers/admin/schemas.d.ts +12 -12
  131. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  132. package/build/system/mcp-servers/knowledge.js +1 -1
  133. package/build/system/mcp-servers/playwright/schemas.d.ts +18 -18
  134. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +34 -34
  135. package/build/system/mcp-servers/playwright-cli/tools-capture.js +5 -1
  136. package/build/system/mcp-servers/vision.js +54 -17
  137. package/build/system/seed/server-definitions.d.ts +7 -0
  138. package/build/system/seed/server-definitions.js +6 -2
  139. package/build/system/seed/tool-manifests-workflows.d.ts +7 -0
  140. package/build/system/seed/tool-manifests-workflows.js +10 -3
  141. package/build/system/workflows/mcp-workflow-builder/activities/caches.d.ts +5 -0
  142. package/build/system/workflows/mcp-workflow-builder/activities/caches.js +8 -0
  143. package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +2 -0
  144. package/build/system/workflows/mcp-workflow-builder/activities/index.js +8 -0
  145. package/build/system/workflows/mcp-workflow-builder/activities/llm.d.ts +2 -0
  146. package/build/system/workflows/mcp-workflow-builder/activities/llm.js +25 -0
  147. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +11 -0
  148. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +34 -0
  149. package/build/system/workflows/mcp-workflow-builder/index.d.ts +16 -0
  150. package/build/system/workflows/mcp-workflow-builder/index.js +253 -0
  151. package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +8 -0
  152. package/build/system/workflows/mcp-workflow-builder/prompts.js +316 -0
  153. package/build/system/workflows/mcp-workflow-planner/activities/analyze.d.ts +11 -0
  154. package/build/system/workflows/mcp-workflow-planner/activities/analyze.js +36 -0
  155. package/build/system/workflows/mcp-workflow-planner/activities/index.d.ts +3 -0
  156. package/build/system/workflows/mcp-workflow-planner/activities/index.js +12 -0
  157. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +19 -0
  158. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +55 -0
  159. package/build/system/workflows/mcp-workflow-planner/activities/plan.d.ts +10 -0
  160. package/build/system/workflows/mcp-workflow-planner/activities/plan.js +43 -0
  161. package/build/system/workflows/mcp-workflow-planner/index.d.ts +7 -0
  162. package/build/system/workflows/mcp-workflow-planner/index.js +152 -0
  163. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +7 -0
  164. package/build/system/workflows/mcp-workflow-planner/prompts.js +77 -0
  165. package/build/system/workflows/shared/tool-loader.js +3 -0
  166. package/build/tsconfig.tsbuildinfo +1 -1
  167. package/build/types/index.d.ts +1 -0
  168. package/build/types/mcp.d.ts +4 -3
  169. package/build/types/sdk.d.ts +27 -0
  170. package/build/types/sdk.js +2 -0
  171. package/build/types/workflow-set.d.ts +44 -0
  172. package/build/types/workflow-set.js +5 -0
  173. package/build/types/yaml-workflow.d.ts +6 -2
  174. package/dashboard/dist/assets/AdminDashboard-DRjkRSjJ.js +2 -0
  175. package/dashboard/dist/assets/{AdminDashboard-CTyAMUJR.js.map → AdminDashboard-DRjkRSjJ.js.map} +1 -1
  176. package/dashboard/dist/assets/AvailableEscalationsPage-CnivX4Tz.js +2 -0
  177. package/dashboard/dist/assets/AvailableEscalationsPage-CnivX4Tz.js.map +1 -0
  178. package/dashboard/dist/assets/BotPicker-DwwaBhTH.js +2 -0
  179. package/dashboard/dist/assets/{BotPicker-C51nKFEu.js.map → BotPicker-DwwaBhTH.js.map} +1 -1
  180. package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js → CollapsibleSection-DQpaVA0M.js} +2 -2
  181. package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js.map → CollapsibleSection-DQpaVA0M.js.map} +1 -1
  182. package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js → ConfirmDeleteModal-B7JoDNvt.js} +2 -2
  183. package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js.map → ConfirmDeleteModal-B7JoDNvt.js.map} +1 -1
  184. package/dashboard/dist/assets/{CopyableId-dGlewBCS.js → CopyableId-AqoZayBG.js} +2 -2
  185. package/dashboard/dist/assets/{CopyableId-dGlewBCS.js.map → CopyableId-AqoZayBG.js.map} +1 -1
  186. package/dashboard/dist/assets/CredentialsPage-qGw1kQzi.js +2 -0
  187. package/dashboard/dist/assets/CredentialsPage-qGw1kQzi.js.map +1 -0
  188. package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js → CustomDurationPicker-D1HUQcd0.js} +2 -2
  189. package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js.map → CustomDurationPicker-D1HUQcd0.js.map} +1 -1
  190. package/dashboard/dist/assets/{DataTable-B3uf5CCo.js → DataTable-DKvSKoVG.js} +2 -2
  191. package/dashboard/dist/assets/{DataTable-B3uf5CCo.js.map → DataTable-DKvSKoVG.js.map} +1 -1
  192. package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js → ElapsedCell-B0yrReGQ.js} +2 -2
  193. package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js.map → ElapsedCell-B0yrReGQ.js.map} +1 -1
  194. package/dashboard/dist/assets/{EmptyState-BChBJNGS.js → EmptyState-X0fIzYID.js} +2 -2
  195. package/dashboard/dist/assets/{EmptyState-BChBJNGS.js.map → EmptyState-X0fIzYID.js.map} +1 -1
  196. package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js → EscalationsOverview-BQAT9W7r.js} +2 -2
  197. package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js.map → EscalationsOverview-BQAT9W7r.js.map} +1 -1
  198. package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js → EventTable-CX1KNLhZ.js} +2 -2
  199. package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js.map → EventTable-CX1KNLhZ.js.map} +1 -1
  200. package/dashboard/dist/assets/{FilterBar-CShf0oe7.js → FilterBar-DMTvuQy-.js} +2 -2
  201. package/dashboard/dist/assets/{FilterBar-CShf0oe7.js.map → FilterBar-DMTvuQy-.js.map} +1 -1
  202. package/dashboard/dist/assets/ListToolbar-DTOSxoEy.js +2 -0
  203. package/dashboard/dist/assets/ListToolbar-DTOSxoEy.js.map +1 -0
  204. package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js → McpOverview-BaKTIWrG.js} +2 -2
  205. package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js.map → McpOverview-BaKTIWrG.js.map} +1 -1
  206. package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js +5 -0
  207. package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js.map +1 -0
  208. package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js +2 -0
  209. package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js.map +1 -0
  210. package/dashboard/dist/assets/McpRunDetailPage-CKs1RWeV.js +2 -0
  211. package/dashboard/dist/assets/McpRunDetailPage-CKs1RWeV.js.map +1 -0
  212. package/dashboard/dist/assets/McpRunsPage-CcPD_tY1.js +2 -0
  213. package/dashboard/dist/assets/McpRunsPage-CcPD_tY1.js.map +1 -0
  214. package/dashboard/dist/assets/{Modal-CI5RBPOQ.js → Modal-_2AbWxJT.js} +2 -2
  215. package/dashboard/dist/assets/{Modal-CI5RBPOQ.js.map → Modal-_2AbWxJT.js.map} +1 -1
  216. package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js +2 -0
  217. package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js.map +1 -0
  218. package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js → PageHeader-DVr5Qyzm.js} +2 -2
  219. package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js.map → PageHeader-DVr5Qyzm.js.map} +1 -1
  220. package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js → PageHeaderWithStats-D0KRASML.js} +2 -2
  221. package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js.map → PageHeaderWithStats-D0KRASML.js.map} +1 -1
  222. package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js → PriorityBadge-Bx2559OU.js} +2 -2
  223. package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js.map → PriorityBadge-Bx2559OU.js.map} +1 -1
  224. package/dashboard/dist/assets/ProcessDetailPage-69I--sry.js +2 -0
  225. package/dashboard/dist/assets/ProcessDetailPage-69I--sry.js.map +1 -0
  226. package/dashboard/dist/assets/ProcessesListPage-BDpUbua2.js +2 -0
  227. package/dashboard/dist/assets/ProcessesListPage-BDpUbua2.js.map +1 -0
  228. package/dashboard/dist/assets/{RolePill-Crj4TH5p.js → RolePill-CcAqEaSt.js} +2 -2
  229. package/dashboard/dist/assets/{RolePill-Crj4TH5p.js.map → RolePill-CcAqEaSt.js.map} +1 -1
  230. package/dashboard/dist/assets/{RolesPage-C_RInUwS.js → RolesPage-Cl23Hjet.js} +2 -2
  231. package/dashboard/dist/assets/{RolesPage-C_RInUwS.js.map → RolesPage-Cl23Hjet.js.map} +1 -1
  232. package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js → RowActions-B4mqIt3Z.js} +2 -2
  233. package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js.map → RowActions-B4mqIt3Z.js.map} +1 -1
  234. package/dashboard/dist/assets/{StatCard-BKZLSgNV.js → StatCard-Cz_2OjAZ.js} +2 -2
  235. package/dashboard/dist/assets/{StatCard-BKZLSgNV.js.map → StatCard-Cz_2OjAZ.js.map} +1 -1
  236. package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js → StatusBadge-Wi2FJZsn.js} +2 -2
  237. package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js.map → StatusBadge-Wi2FJZsn.js.map} +1 -1
  238. package/dashboard/dist/assets/StepIndicator-PW5NRDMb.js +2 -0
  239. package/dashboard/dist/assets/StepIndicator-PW5NRDMb.js.map +1 -0
  240. package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js → StickyPagination-Bl2Uzz65.js} +2 -2
  241. package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js.map → StickyPagination-Bl2Uzz65.js.map} +1 -1
  242. package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js → SwimlaneTimeline-CUPqMd0z.js} +2 -2
  243. package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js.map → SwimlaneTimeline-CUPqMd0z.js.map} +1 -1
  244. package/dashboard/dist/assets/TagInput-BLtf86Ly.js +2 -0
  245. package/dashboard/dist/assets/TagInput-BLtf86Ly.js.map +1 -0
  246. package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js → TaskDetailPage-BXJFX74D.js} +2 -2
  247. package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js.map → TaskDetailPage-BXJFX74D.js.map} +1 -1
  248. package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js → TaskQueuePill-CWYj3xKe.js} +2 -2
  249. package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js.map → TaskQueuePill-CWYj3xKe.js.map} +1 -1
  250. package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js → TasksListPage-C3cX94Mw.js} +2 -2
  251. package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js.map → TasksListPage-C3cX94Mw.js.map} +1 -1
  252. package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js → TimeAgo-B_5yDDHV.js} +2 -2
  253. package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js.map → TimeAgo-B_5yDDHV.js.map} +1 -1
  254. package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js → TimestampCell-DRX724uU.js} +2 -2
  255. package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js.map → TimestampCell-DRX724uU.js.map} +1 -1
  256. package/dashboard/dist/assets/{UserName-DU9qeg13.js → UserName-Ca8FA469.js} +2 -2
  257. package/dashboard/dist/assets/{UserName-DU9qeg13.js.map → UserName-Ca8FA469.js.map} +1 -1
  258. package/dashboard/dist/assets/WorkflowExecutionPage-BBYWEV2P.js +2 -0
  259. package/dashboard/dist/assets/WorkflowExecutionPage-BBYWEV2P.js.map +1 -0
  260. package/dashboard/dist/assets/WorkflowPill-BXifAuLi.js +2 -0
  261. package/dashboard/dist/assets/{WorkflowPill-Diw8iWBP.js.map → WorkflowPill-BXifAuLi.js.map} +1 -1
  262. package/dashboard/dist/assets/WorkflowsDashboard-Drl3juz9.js +2 -0
  263. package/dashboard/dist/assets/WorkflowsDashboard-Drl3juz9.js.map +1 -0
  264. package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js → WorkflowsOverview-03IRrDLg.js} +2 -2
  265. package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js.map → WorkflowsOverview-03IRrDLg.js.map} +1 -1
  266. package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js +2 -0
  267. package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js.map +1 -0
  268. package/dashboard/dist/assets/{bots-BPiZXf2h.js → bots-DZEXcgiJ.js} +2 -2
  269. package/dashboard/dist/assets/{bots-BPiZXf2h.js.map → bots-DZEXcgiJ.js.map} +1 -1
  270. package/dashboard/dist/assets/{escalation-DTY_OKRh.js → escalation-Cw48lNaF.js} +2 -2
  271. package/dashboard/dist/assets/{escalation-DTY_OKRh.js.map → escalation-Cw48lNaF.js.map} +1 -1
  272. package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js → escalation-columns-NINpo3qf.js} +2 -2
  273. package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js.map → escalation-columns-NINpo3qf.js.map} +1 -1
  274. package/dashboard/dist/assets/helpers-Cuu3xKfr.js +2 -0
  275. package/dashboard/dist/assets/helpers-Cuu3xKfr.js.map +1 -0
  276. package/dashboard/dist/assets/helpers-fk_qr729.js +2 -0
  277. package/dashboard/dist/assets/helpers-fk_qr729.js.map +1 -0
  278. package/dashboard/dist/assets/index-B98ipWxE.js +2 -0
  279. package/dashboard/dist/assets/{index-CDWOfCmi.js.map → index-B98ipWxE.js.map} +1 -1
  280. package/dashboard/dist/assets/{index-D_qEAYrg.js → index-BIG3KooI.js} +2 -2
  281. package/dashboard/dist/assets/{index-D_qEAYrg.js.map → index-BIG3KooI.js.map} +1 -1
  282. package/dashboard/dist/assets/{index-DSzSoku1.js → index-BwN3KP_L.js} +91 -93
  283. package/dashboard/dist/assets/index-BwN3KP_L.js.map +1 -0
  284. package/dashboard/dist/assets/index-Bxe8h1x4.js +17 -0
  285. package/dashboard/dist/assets/index-Bxe8h1x4.js.map +1 -0
  286. package/dashboard/dist/assets/index-CNI7k7oB.js +6 -0
  287. package/dashboard/dist/assets/index-CNI7k7oB.js.map +1 -0
  288. package/dashboard/dist/assets/index-CORHB0WC.js +2 -0
  289. package/dashboard/dist/assets/index-CORHB0WC.js.map +1 -0
  290. package/dashboard/dist/assets/index-DcIKW-cZ.css +1 -0
  291. package/dashboard/dist/assets/index-Dj-z-x8M.js +2 -0
  292. package/dashboard/dist/assets/index-Dj-z-x8M.js.map +1 -0
  293. package/dashboard/dist/assets/index-DwRytW9O.js +5 -0
  294. package/dashboard/dist/assets/index-DwRytW9O.js.map +1 -0
  295. package/dashboard/dist/assets/index-aRvL-dXp.js +2 -0
  296. package/dashboard/dist/assets/index-aRvL-dXp.js.map +1 -0
  297. package/dashboard/dist/assets/index-b03HlbnH.js +2 -0
  298. package/dashboard/dist/assets/{index-BtOwLI0K.js.map → index-b03HlbnH.js.map} +1 -1
  299. package/dashboard/dist/assets/mcp-BZoFryNc.js +2 -0
  300. package/dashboard/dist/assets/mcp-BZoFryNc.js.map +1 -0
  301. package/dashboard/dist/assets/mcp-query-wiw1kwm8.js +2 -0
  302. package/dashboard/dist/assets/mcp-query-wiw1kwm8.js.map +1 -0
  303. package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js → mcp-runs-BaEKnf5v.js} +2 -2
  304. package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js.map → mcp-runs-BaEKnf5v.js.map} +1 -1
  305. package/dashboard/dist/assets/{namespaces-DoGa7jc7.js → namespaces-BwnZI4_A.js} +2 -2
  306. package/dashboard/dist/assets/{namespaces-DoGa7jc7.js.map → namespaces-BwnZI4_A.js.map} +1 -1
  307. package/dashboard/dist/assets/{roles-wCdQ2Z7k.js → roles-Bgn1K8zU.js} +2 -2
  308. package/dashboard/dist/assets/{roles-wCdQ2Z7k.js.map → roles-Bgn1K8zU.js.map} +1 -1
  309. package/dashboard/dist/assets/{settings-DDe_L7JT.js → settings-CizYiutL.js} +2 -2
  310. package/dashboard/dist/assets/{settings-DDe_L7JT.js.map → settings-CizYiutL.js.map} +1 -1
  311. package/dashboard/dist/assets/{tasks-3Hih8Bt7.js → tasks-Bmte_hc4.js} +2 -2
  312. package/dashboard/dist/assets/{tasks-3Hih8Bt7.js.map → tasks-Bmte_hc4.js.map} +1 -1
  313. package/dashboard/dist/assets/useEventHooks-CUCxpiI2.js +2 -0
  314. package/dashboard/dist/assets/useEventHooks-CUCxpiI2.js.map +1 -0
  315. package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js +2 -0
  316. package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js.map +1 -0
  317. package/dashboard/dist/assets/{useYamlActivityEvents-B5dHec6Y.js → useYamlActivityEvents-Cum02Ej9.js} +2 -2
  318. package/dashboard/dist/assets/useYamlActivityEvents-Cum02Ej9.js.map +1 -0
  319. package/dashboard/dist/assets/{users-BTagPmGW.js → users-NSDgTt-z.js} +2 -2
  320. package/dashboard/dist/assets/{users-BTagPmGW.js.map → users-NSDgTt-z.js.map} +1 -1
  321. package/dashboard/dist/assets/{vendor-icons-DCLlGYO9.js → vendor-icons-D1DdudfH.js} +141 -66
  322. package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
  323. package/dashboard/dist/assets/{workflows-B20dR3NE.js → workflows-k0XRdGXx.js} +2 -2
  324. package/dashboard/dist/assets/{workflows-B20dR3NE.js.map → workflows-k0XRdGXx.js.map} +1 -1
  325. package/dashboard/dist/assets/yaml-workflows-DAre8I78.js +2 -0
  326. package/dashboard/dist/assets/yaml-workflows-DAre8I78.js.map +1 -0
  327. package/dashboard/dist/index.html +3 -3
  328. package/docs/api/mcp-servers.md +60 -2
  329. package/docs/architecture.md +3 -3
  330. package/docs/dashboard.md +1 -1
  331. package/docs/epic-integration.md +224 -0
  332. package/docs/escalation-strategies.md +2 -3
  333. package/docs/events.md +28 -0
  334. package/docs/mcp.md +301 -31
  335. package/docs/sdk.md +177 -0
  336. package/docs/story.md +157 -0
  337. package/docs/workflow-builder.md +371 -0
  338. package/package.json +5 -4
  339. package/build/routes/escalations/helpers.d.ts +0 -5
  340. package/build/routes/resolve.d.ts +0 -9
  341. package/build/routes/resolve.js +0 -19
  342. package/build/routes/yaml-workflows/helpers.d.ts +0 -2
  343. package/build/routes/yaml-workflows/helpers.js +0 -8
  344. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +0 -2
  345. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +0 -2
  346. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +0 -1
  347. package/dashboard/dist/assets/BotPicker-C51nKFEu.js +0 -2
  348. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +0 -2
  349. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js.map +0 -1
  350. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +0 -5
  351. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +0 -1
  352. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +0 -2
  353. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +0 -1
  354. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +0 -2
  355. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +0 -1
  356. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +0 -2
  357. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +0 -1
  358. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +0 -2
  359. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +0 -1
  360. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +0 -2
  361. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +0 -1
  362. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +0 -2
  363. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +0 -1
  364. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +0 -2
  365. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +0 -1
  366. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +0 -2
  367. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +0 -1
  368. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +0 -2
  369. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +0 -1
  370. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +0 -2
  371. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +0 -2
  372. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +0 -1
  373. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +0 -2
  374. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +0 -1
  375. package/dashboard/dist/assets/helpers-DBUZ9pnG.js +0 -2
  376. package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +0 -1
  377. package/dashboard/dist/assets/index-BOeA-gfK.js +0 -17
  378. package/dashboard/dist/assets/index-BOeA-gfK.js.map +0 -1
  379. package/dashboard/dist/assets/index-BZ6K_kmL.js +0 -3
  380. package/dashboard/dist/assets/index-BZ6K_kmL.js.map +0 -1
  381. package/dashboard/dist/assets/index-Bpm0yeoi.js +0 -2
  382. package/dashboard/dist/assets/index-Bpm0yeoi.js.map +0 -1
  383. package/dashboard/dist/assets/index-BtOwLI0K.js +0 -2
  384. package/dashboard/dist/assets/index-CBF3ZvRZ.js +0 -6
  385. package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +0 -1
  386. package/dashboard/dist/assets/index-CDWOfCmi.js +0 -2
  387. package/dashboard/dist/assets/index-Ce6sL__n.js +0 -2
  388. package/dashboard/dist/assets/index-Ce6sL__n.js.map +0 -1
  389. package/dashboard/dist/assets/index-DSzSoku1.js.map +0 -1
  390. package/dashboard/dist/assets/index-gCy9XX3W.css +0 -1
  391. package/dashboard/dist/assets/mcp-BzVpaaKF.js +0 -2
  392. package/dashboard/dist/assets/mcp-BzVpaaKF.js.map +0 -1
  393. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +0 -2
  394. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +0 -1
  395. package/dashboard/dist/assets/useNatsEvents-DeGKHFTX.js +0 -2
  396. package/dashboard/dist/assets/useNatsEvents-DeGKHFTX.js.map +0 -1
  397. package/dashboard/dist/assets/useYamlActivityEvents-B5dHec6Y.js.map +0 -1
  398. package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +0 -1
  399. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +0 -2
  400. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +0 -1
  401. package/docs/img/01-login.png +0 -0
  402. package/docs/img/02-dashboard-home.png +0 -0
  403. package/docs/img/03-processes-list.png +0 -0
  404. package/docs/img/04-escalations-list.png +0 -0
  405. package/docs/img/05-mcp-servers.png +0 -0
  406. package/docs/img/06-mcp-pipelines.png +0 -0
  407. package/docs/img/07-workflows-list.png +0 -0
  408. package/docs/img/compilation/01-query-submit.png +0 -0
  409. package/docs/img/compilation/02-mcp-servers.png +0 -0
  410. package/docs/img/compilation/03-query-completed.png +0 -0
  411. package/docs/img/compilation/04-wizard-original.png +0 -0
  412. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  413. package/docs/img/compilation/06-wizard-profile.png +0 -0
  414. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  415. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  416. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  417. package/docs/img/compilation/10-wizard-verify.png +0 -0
  418. package/lib/db/README.md +0 -8
  419. /package/{lib → build/lib}/db/schemas/002_seed.sql +0 -0
  420. /package/{lib → build/lib}/db/schemas/003_workflow_discovery.sql +0 -0
  421. /package/{lib → build/lib}/db/schemas/004_query_router.sql +0 -0
  422. /package/{lib → build/lib}/db/schemas/005_triage_router.sql +0 -0
  423. /package/{lib → build/lib}/db/schemas/006_oauth.sql +0 -0
  424. /package/{lib → build/lib}/db/schemas/007_security.sql +0 -0
  425. /package/{lib → build/lib}/db/schemas/008_bot_accounts.sql +0 -0
  426. /package/{lib → build/lib}/db/schemas/009_audit_trail.sql +0 -0
  427. /package/{lib → build/lib}/db/schemas/010_credential_providers.sql +0 -0
  428. /package/{lib → build/lib}/db/schemas/012_drop_modality.sql +0 -0
  429. /package/{lib → build/lib}/db/schemas/013_execute_as.sql +0 -0
  430. /package/{lib → build/lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
  431. /package/{lib → build/lib}/db/schemas/015_knowledge.sql +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Bpm0yeoi.js","sources":["../../src/api/controlplane.ts","../../src/pages/admin/controlplane/helpers.ts","../../src/pages/admin/controlplane/columns.tsx","../../src/pages/admin/controlplane/useMeshSelection.ts","../../src/pages/admin/controlplane/ThrottleModal.tsx","../../src/pages/admin/controlplane/StreamVolumeChart.tsx","../../src/pages/admin/controlplane/QuorumFeed.tsx","../../src/pages/admin/controlplane/QueueCard.tsx","../../src/pages/admin/controlplane/EmergencyControls.tsx","../../src/pages/admin/controlplane/ControlPlanePage.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface ControlPlaneApp {\n appId: string;\n}\n\nexport interface QuorumProfile {\n namespace: string;\n app_id: string;\n engine_id: string;\n entity?: string;\n worker_topic?: string;\n stream?: string;\n stream_depth?: number;\n counts?: Record<string, number>;\n inited?: string;\n timestamp?: string;\n throttle?: number;\n reclaimDelay?: number;\n reclaimCount?: number;\n system?: {\n TotalMemoryGB: string;\n FreeMemoryGB: string;\n UsedMemoryGB: string;\n CPULoad: Array<Record<string, string>>;\n NetworkStats: Array<Record<string, unknown>>;\n };\n signature?: string;\n}\n\n// ── API functions ───────────────────────────────────────────────────────────\n\nfunction fetchApps() {\n return apiFetch<{ apps: ControlPlaneApp[] }>('/controlplane/apps');\n}\n\nfunction fetchRollCall(appId: string) {\n return apiFetch<{ profiles: QuorumProfile[] }>(`/controlplane/rollcall?app_id=${encodeURIComponent(appId)}`);\n}\n\nfunction postThrottle(body: { appId: string; throttle: number; topic?: string; guid?: string }) {\n return apiFetch<{ success: boolean }>('/controlplane/throttle', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nfunction postSubscribe(body: { appId: string }) {\n return apiFetch<{ subscribed: boolean; appId: string }>('/controlplane/subscribe', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport interface StreamStats {\n pending: number;\n processed: number;\n byStream: Array<{ stream_type: 'engine' | 'worker'; stream_name: string; count: number }>;\n}\n\nfunction fetchStreamStats(appId: string, duration: string, stream?: string) {\n let url = `/controlplane/streams?app_id=${encodeURIComponent(appId)}&duration=${encodeURIComponent(duration)}`;\n if (stream) url += `&stream=${encodeURIComponent(stream)}`;\n return apiFetch<StreamStats>(url);\n}\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\nexport function useControlPlaneApps() {\n return useQuery({\n queryKey: ['controlplane', 'apps'],\n queryFn: fetchApps,\n staleTime: 60_000,\n });\n}\n\nexport function useRollCall(appId: string, refetchInterval?: number | false) {\n return useQuery({\n queryKey: ['controlplane', 'rollcall', appId],\n queryFn: () => fetchRollCall(appId),\n enabled: !!appId,\n refetchInterval: refetchInterval ?? false,\n });\n}\n\nexport function useThrottle() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: postThrottle,\n onSuccess: () => {\n // Delay refetch so mesh members have time to process the throttle message\n setTimeout(() => {\n qc.invalidateQueries({ queryKey: ['controlplane', 'rollcall'] });\n }, 1500);\n },\n });\n}\n\nexport function useStreamStats(appId: string, duration: string, stream?: string, refetchInterval?: number | false) {\n return useQuery({\n queryKey: ['controlplane', 'streams', appId, duration, stream ?? ''],\n queryFn: () => fetchStreamStats(appId, duration, stream),\n enabled: !!appId,\n staleTime: 15_000,\n refetchInterval: refetchInterval ?? false,\n });\n}\n\nexport function useSubscribeMesh() {\n return useMutation({\n mutationFn: postSubscribe,\n });\n}\n","import type { QuorumProfile } from '../../../api/controlplane';\n\nexport const DURATIONS = [\n { label: '15m', value: '15m' },\n { label: '30m', value: '30m' },\n { label: '1h', value: '1h' },\n { label: '1d', value: '1d' },\n { label: '7d', value: '7d' },\n] as const;\n\nexport type Duration = (typeof DURATIONS)[number]['value'];\n\nexport interface QuorumEvent {\n id: number;\n type: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\nexport const EVENT_TYPE_COLORS: Record<string, string> = {\n pong: 'text-status-success',\n ping: 'text-accent',\n throttle: 'text-status-warning',\n job: 'text-purple-400',\n work: 'text-text-secondary',\n activate: 'text-status-error',\n cron: 'text-text-tertiary',\n user: 'text-text-secondary',\n};\n\nexport const MAX_EVENTS = 250;\n\nexport function isWorker(p: QuorumProfile): boolean {\n return !!p.worker_topic;\n}\n\nexport function isThrottled(p: QuorumProfile): boolean {\n return typeof p.throttle === 'number' && p.throttle !== 0;\n}\n\nexport function formatThrottleHuman(ms?: number): string {\n if (ms === undefined || ms === 0) return 'Normal';\n if (ms === -1) return 'Paused';\n if (ms >= 86_400_000) return `${(ms / 86_400_000).toFixed(0)}d`;\n if (ms >= 3_600_000) return `${(ms / 3_600_000).toFixed(1)}h`;\n if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`;\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nexport function formatMemory(total?: string, free?: string): string {\n if (!total || !free) return '—';\n const t = parseFloat(total);\n const f = parseFloat(free);\n if (isNaN(t) || isNaN(f)) return '—';\n return `${(t - f).toFixed(1)} / ${t.toFixed(1)} GB`;\n}\n\nexport function stripStreamPrefix(name: string): string {\n return name.replace(/^hmsh:[^:]+:x:/, '') || '(engine)';\n}\n\n/** Engine streams have no suffix after hmsh:{app}:x: */\nexport function isEngineStream(streamName: string): boolean {\n return stripStreamPrefix(streamName) === '(engine)';\n}\n\nexport type NodeFilter = 'all' | 'workers' | 'engines';\n\n/** Known quorum message types published via the bridge. */\nexport const QUORUM_CHANNELS = [\n { key: 'pong', label: 'Pong', description: 'Roll call responses' },\n { key: 'ping', label: 'Ping', description: 'Roll call broadcasts' },\n { key: 'throttle', label: 'Throttle', description: 'Throttle commands' },\n { key: 'job', label: 'Job', description: 'Job lifecycle events' },\n { key: 'work', label: 'Work', description: 'Worker dispatch events' },\n { key: 'activate', label: 'Activate', description: 'Worker activation' },\n { key: 'cron', label: 'Cron', description: 'Cron schedule triggers' },\n { key: 'user', label: 'User', description: 'User-defined messages' },\n] as const;\n\n/** Typed throttle target with display label and API params. */\nexport interface ThrottleTarget {\n label: string;\n /** API param: topic-based throttle (queues, all engines) */\n topic?: string;\n /** API param: guid-based throttle (single engine/worker) */\n guid?: string;\n}\n\nexport const NODE_FILTER_OPTIONS = [\n { value: 'all', label: 'All Nodes' },\n { value: 'workers', label: 'Workers' },\n { value: 'engines', label: 'Engines' },\n] as const;\n\nexport function rowKey(p: QuorumProfile): string {\n return `${p.engine_id}-${p.worker_topic || 'engine'}`;\n}\n\n// ── Queue-level helpers ────────────────────────────────────────────────\n\n/** Group worker profiles by `worker_topic` (engines excluded). */\nexport function groupByQueue(profiles: QuorumProfile[]): Map<string, QuorumProfile[]> {\n const map = new Map<string, QuorumProfile[]>();\n for (const p of profiles) {\n if (!p.worker_topic) continue;\n const q = p.worker_topic;\n if (!map.has(q)) map.set(q, []);\n map.get(q)!.push(p);\n }\n return map;\n}\n\n/** Aggregate `counts` across profiles: 200 = success, 500 = error, all = total. */\nexport function sumCounts(profiles: QuorumProfile[]): { total: number; success: number; errors: number } {\n let total = 0;\n let success = 0;\n let errors = 0;\n for (const p of profiles) {\n if (!p.counts) continue;\n for (const [code, n] of Object.entries(p.counts)) {\n total += n;\n if (code === '200') success += n;\n else if (code === '500') errors += n;\n }\n }\n return { total, success, errors };\n}\n\n/** Sum `stream_depth` across profiles. */\nexport function totalPending(profiles: QuorumProfile[]): number {\n let sum = 0;\n for (const p of profiles) {\n if (typeof p.stream_depth === 'number') sum += p.stream_depth;\n }\n return sum;\n}\n\n/** Derive queue health from member profiles. */\nexport function queueHealth(profiles: QuorumProfile[]): 'healthy' | 'degraded' | 'paused' {\n if (profiles.length === 0) return 'healthy';\n const allPaused = profiles.every((p) => p.throttle === -1);\n if (allPaused) return 'paused';\n const { errors } = sumCounts(profiles);\n if (errors > 0 || profiles.some(isThrottled)) return 'degraded';\n return 'healthy';\n}\n","import { Gauge, CirclePlay } from 'lucide-react';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { isThrottled, formatThrottleHuman, formatMemory, rowKey, sumCounts } from './helpers';\n\ninterface ColumnOptions {\n profiles: QuorumProfile[];\n selectedIds: Set<string>;\n toggleAll: () => void;\n toggleCheckbox: (profile: QuorumProfile) => void;\n onRowThrottle: (profile: QuorumProfile) => void;\n onResumeThrottle: (profile: QuorumProfile) => void;\n onBulkThrottle?: () => void;\n}\n\nfunction throttleColumn(): Column<QuorumProfile> {\n return {\n key: 'throttle',\n label: 'Throttle',\n render: (row) => {\n const t = row.throttle;\n if (t === -1) return <span className=\"text-xs text-status-error font-medium\">Paused</span>;\n if (t && t > 0) return <span className=\"text-xs text-status-warning font-medium\">{formatThrottleHuman(t)}</span>;\n return <span className=\"text-xs text-text-tertiary\">0</span>;\n },\n className: 'w-24',\n };\n}\n\nfunction memoryColumn(): Column<QuorumProfile> {\n return {\n key: 'memory',\n label: 'Memory',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {formatMemory(row.system?.TotalMemoryGB, row.system?.FreeMemoryGB)}\n </span>\n ),\n className: 'w-36',\n };\n}\n\nfunction actionColumn(\n onRowThrottle: (p: QuorumProfile) => void,\n onResumeThrottle: (p: QuorumProfile) => void,\n): Column<QuorumProfile> {\n return {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {isThrottled(row) && (\n <RowAction\n icon={CirclePlay}\n title=\"Resume (remove throttle)\"\n onClick={() => onResumeThrottle(row)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n <RowAction icon={Gauge} title=\"Adjust throttle\" onClick={() => onRowThrottle(row)} />\n </RowActionGroup>\n ),\n className: 'w-16',\n };\n}\n\n/** Columns for the Engines section DataTable. */\nexport function getEngineColumns(opts: ColumnOptions): Column<QuorumProfile>[] {\n const hasSelection = opts.profiles.some((p) => opts.selectedIds.has(rowKey(p)));\n return [\n {\n key: 'select',\n label: (\n <span className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={opts.profiles.length > 0 && opts.profiles.every((p) => opts.selectedIds.has(rowKey(p)))}\n onChange={opts.toggleAll}\n className=\"rounded\"\n />\n {hasSelection && opts.onBulkThrottle && (\n <Gauge\n className=\"w-[14px] h-[14px] text-text-tertiary hover:text-accent cursor-pointer\"\n strokeWidth={1.5}\n onClick={(e) => { e.stopPropagation(); opts.onBulkThrottle!(); }}\n />\n )}\n </span>\n ) as any,\n render: (row) => (\n <input\n type=\"checkbox\"\n checked={opts.selectedIds.has(rowKey(row))}\n onChange={(e) => { e.stopPropagation(); opts.toggleCheckbox(row); }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-16',\n },\n {\n key: 'engine_id',\n label: 'Engine ID',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">{row.engine_id}</span>\n ),\n className: 'w-48',\n },\n throttleColumn(),\n {\n key: 'processed',\n label: 'Processed',\n render: (row) => {\n const c = sumCounts([row]);\n return <span className=\"text-xs font-mono text-text-tertiary\">{c.total.toLocaleString()}</span>;\n },\n className: 'w-24',\n },\n memoryColumn(),\n actionColumn(opts.onRowThrottle, opts.onResumeThrottle),\n ];\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\n\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { useThrottle } from '../../../api/controlplane';\nimport { isWorker, rowKey, type ThrottleTarget } from './helpers';\n\ninterface UseMeshSelectionOptions {\n activeAppId: string;\n allProfiles: QuorumProfile[];\n profiles: QuorumProfile[];\n}\n\nexport function useMeshSelection({\n activeAppId,\n allProfiles,\n profiles,\n}: UseMeshSelectionOptions) {\n const throttleMutation = useThrottle();\n\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [throttleModalOpen, setThrottleModalOpen] = useState(false);\n const [throttleTargets, setThrottleTargets] = useState<ThrottleTarget[]>([]);\n\n useEffect(() => { setSelectedIds(new Set()); }, [activeAppId]);\n\n const toggleCheckbox = useCallback((profile: QuorumProfile) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n const key = rowKey(profile);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }, []);\n\n const toggleAll = useCallback(() => {\n if (selectedIds.size === profiles.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(profiles.map(rowKey)));\n }\n }, [profiles, selectedIds.size]);\n\n /**\n * Build throttle targets from checkbox selection.\n *\n * Smart grouping:\n * - All nodes selected -> no topic/guid (entire mesh)\n * - All engines selected -> topic = engine stream (all engines)\n * - All workers on a queue selected -> topic = queue (all workers on queue)\n * - Subset of a group -> individual guid targets\n */\n const selectedThrottleTargets = useMemo((): ThrottleTarget[] => {\n const selected = profiles.filter((p) => selectedIds.has(rowKey(p)));\n if (selected.length === 0) return [];\n\n // All nodes -> entire mesh\n if (selected.length === allProfiles.length) {\n return [{ label: 'Entire Mesh' }];\n }\n\n const engines = selected.filter((p) => !isWorker(p));\n const workers = selected.filter(isWorker);\n const targets: ThrottleTarget[] = [];\n\n // Engines — always guid-per-engine (each engine subscribes to its own guid channel)\n for (const e of engines) {\n targets.push({ label: `Engine ${e.engine_id}`, guid: e.engine_id });\n }\n\n // Workers — topic targets the queue; guid targets a single instance\n const queues = new Map<string, QuorumProfile[]>();\n for (const w of workers) {\n const q = w.worker_topic!;\n if (!queues.has(q)) queues.set(q, []);\n queues.get(q)!.push(w);\n }\n for (const [queue, members] of queues) {\n const allOnQueue = allProfiles.filter((p) => p.worker_topic === queue);\n if (members.length === allOnQueue.length) {\n targets.push({ label: queue, topic: queue });\n } else {\n for (const w of members) {\n targets.push({ label: `${queue} ${w.engine_id}`, guid: w.engine_id });\n }\n }\n }\n\n return targets;\n }, [profiles, allProfiles, selectedIds]);\n\n // ── Throttle handlers ─────────────────────────────────────────\n const handleBulkThrottle = (ms: number) => {\n const targets = throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets;\n for (const t of targets) {\n throttleMutation.mutate({\n appId: activeAppId,\n throttle: ms,\n ...(t.topic ? { topic: t.topic } : {}),\n ...(t.guid ? { guid: t.guid } : {}),\n });\n }\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n const handleRowClick = (profile: QuorumProfile) => {\n const label = isWorker(profile)\n ? `${profile.worker_topic} ${profile.engine_id}`\n : `Engine ${profile.engine_id}`;\n // guid-only: workers and engines both subscribe to their own guid channel\n setThrottleTargets([{ label, guid: profile.engine_id }]);\n setThrottleModalOpen(true);\n };\n\n const handleBulkThrottleOpen = () => {\n setThrottleTargets(selectedThrottleTargets);\n setThrottleModalOpen(true);\n };\n\n const handleResumeThrottle = (profile: QuorumProfile) => {\n // guid-only: both engines and workers subscribe to their own guid channel\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, guid: profile.engine_id });\n };\n\n const handleResumeQueue = (queueName: string) => {\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, topic: queueName });\n };\n\n const handleQueueThrottle = (queueName: string) => {\n setThrottleTargets([{ label: queueName, topic: queueName }]);\n setThrottleModalOpen(true);\n };\n\n const closeThrottleModal = () => {\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n return {\n selectedIds,\n setSelectedIds,\n toggleCheckbox,\n toggleAll,\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleBulkThrottleOpen,\n handleResumeThrottle,\n handleResumeQueue,\n handleQueueThrottle,\n closeThrottleModal,\n };\n}\n","import { useState } from 'react';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { ThrottleTarget } from './helpers';\n\ninterface ThrottleModalProps {\n open: boolean;\n onClose: () => void;\n targets: ThrottleTarget[];\n onApply: (ms: number) => void;\n isPending: boolean;\n}\n\nconst PRESETS = [\n { label: 'Resume', ms: 0 },\n { label: '0.5s', ms: 500 },\n { label: '1s', ms: 1000 },\n { label: '5s', ms: 5000 },\n { label: '30s', ms: 30000 },\n { label: 'Pause', ms: -1 },\n];\n\nfunction TargetPill({ target }: { target: ThrottleTarget }) {\n const isMesh = target.label === 'Entire Mesh';\n const isEngine = target.label === 'All Engines' || target.label.startsWith('Engine ');\n const color = isMesh\n ? 'bg-status-error/10 text-status-error'\n : isEngine\n ? 'bg-blue-500/10 text-blue-500'\n : 'bg-accent/[0.06] text-text-secondary';\n const scope = target.guid ? 'guid' : target.topic ? 'topic' : 'mesh';\n\n return (\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-[10px] font-medium rounded-lg ${color}`}>\n {target.label}\n <span className=\"text-[8px] opacity-50\">{scope}</span>\n </span>\n );\n}\n\nexport function ThrottleModal({ open, onClose, targets, onApply, isPending }: ThrottleModalProps) {\n const [seconds, setSeconds] = useState('0');\n\n return (\n <Modal open={open} onClose={onClose} title=\"Adjust Throttle\">\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Targets</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t, i) => (\n <TargetPill key={t.guid || t.topic || i} target={t} />\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Presets</p>\n <div className=\"flex flex-wrap gap-2\">\n {PRESETS.map((p) => (\n <button\n key={p.label}\n onClick={() => { setSeconds(p.ms === -1 ? '-1' : String(p.ms / 1000)); onApply(p.ms); }}\n disabled={isPending}\n className={`px-3 py-1.5 text-xs rounded transition-colors ${\n p.ms === -1\n ? 'bg-status-error/10 text-status-error hover:bg-status-error/20'\n : p.ms === 0\n ? 'bg-status-success/10 text-status-success hover:bg-status-success/20'\n : 'bg-surface-sunken text-text-secondary hover:bg-surface-hover'\n } disabled:opacity-50`}\n >\n {p.label}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Custom (seconds between messages)\n </p>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"-1\"\n value={seconds}\n onChange={(e) => setSeconds(e.target.value)}\n className=\"input text-xs py-1.5 px-3 w-28\"\n />\n <button\n onClick={() => {\n const s = parseFloat(seconds);\n if (isNaN(s)) return;\n onApply(s === -1 ? -1 : Math.round(s * 1000));\n }}\n disabled={isPending}\n className=\"btn-primary text-xs py-1.5 px-4 disabled:opacity-50\"\n >\n Apply\n </button>\n </div>\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n 0 = resume, -1 = pause indefinitely\n </p>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { stripStreamPrefix, type NodeFilter } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface StreamVolumeChartProps {\n byStream: StreamEntry[];\n onNodeFilter?: (filter: NodeFilter) => void;\n onQueueFilter?: (queue: string) => void;\n}\n\nexport function StreamVolumeChart({ byStream, onNodeFilter }: StreamVolumeChartProps) {\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n setAnimated(false);\n const raf = requestAnimationFrame(() => setAnimated(true));\n return () => cancelAnimationFrame(raf);\n }, [byStream]);\n\n if (byStream.length === 0) {\n return <p className=\"text-xs text-text-tertiary py-4 text-center\">No activity in this period</p>;\n }\n\n const engineStreams = byStream.filter((s) => s.stream_type === 'engine');\n const workerStreams = byStream.filter((s) => s.stream_type === 'worker');\n const maxCount = Math.max(...byStream.map((s) => s.count));\n\n const renderBar = (s: StreamEntry) => {\n const pct = maxCount > 0 ? (s.count / maxCount) * 100 : 0;\n const isEngine = s.stream_type === 'engine';\n const label = isEngine ? '(all engines)' : stripStreamPrefix(s.stream_name);\n const barColor = isEngine ? 'bg-blue-500/70' : 'bg-accent/60';\n const labelColor = isEngine ? 'text-blue-500' : 'text-text-tertiary';\n return (\n <div key={`${s.stream_type}-${s.stream_name}`} className=\"flex items-center gap-3\">\n <span\n className={`text-[9px] font-mono ${labelColor} w-36 truncate text-right shrink-0`}\n title={s.stream_name}\n >\n {label}\n </span>\n <div className=\"flex-1 h-4 bg-surface-sunken rounded overflow-hidden\">\n <div\n className={`h-full ${barColor} rounded transition-all duration-500 ease-out`}\n style={{ width: animated ? `${pct}%` : '0%' }}\n />\n </div>\n <span className=\"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0\">\n {s.count.toLocaleString()}\n </span>\n </div>\n );\n };\n\n const labelCls = 'text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline';\n\n return (\n <div className=\"space-y-1.5\">\n {engineStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-blue-500/70 hover:text-blue-500`}\n onClick={() => onNodeFilter?.('engines')}\n >\n Engine Message Volume\n </p>\n {engineStreams.map(renderBar)}\n {workerStreams.length > 0 && <div className=\"h-2\" />}\n </>\n )}\n {workerStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-accent/70 hover:text-accent`}\n onClick={() => onNodeFilter?.('workers')}\n >\n Worker Message Volume\n </p>\n {workerStreams.map(renderBar)}\n </>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { Radio, Settings, Eraser, Code } from 'lucide-react';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { useEventSubscription } from '../../../hooks/useEventContext';\nimport {\n EVENT_TYPE_COLORS,\n QUORUM_CHANNELS,\n MAX_EVENTS,\n formatThrottleHuman,\n type QuorumEvent,\n} from './helpers';\n\nlet eventCounter = 0;\n\n// ── Event row ───────────────────────────────────────────────────────────────\n\nfunction QuorumEventRow({ event }: { event: QuorumEvent }) {\n const [expanded, setExpanded] = useState(false);\n\n return (\n <div className=\"border-b border-surface-border/50 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors\"\n >\n <span className=\"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0\">\n {new Date(event.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n <span className={`text-[9px] font-medium px-1 py-0.5 rounded ${EVENT_TYPE_COLORS[event.type] || 'text-text-tertiary'} bg-surface-sunken whitespace-nowrap shrink-0`}>\n {event.type}\n </span>\n <span className=\"text-[9px] text-text-tertiary font-mono flex-1 min-w-0 break-all\">\n {event.data?.guid ? String(event.data.guid) : ''}\n {event.data?.topic ? ` ${String(event.data.topic)}` : ''}\n {event.type === 'throttle' ? ` → ${formatThrottleHuman(event.data?.throttle as number)}` : ''}\n </span>\n <svg\n className={`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${expanded ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <Collapsible open={expanded}>\n <div className=\"pb-2\">\n <JsonViewer data={event.data} />\n </div>\n </Collapsible>\n </div>\n );\n}\n\n// ── Config panel ────────────────────────────────────────────────────────────\n\ninterface ConfigPanelProps {\n channels: Set<string>;\n onToggle: (key: string) => void;\n customFilter: string;\n onCustomFilterChange: (v: string) => void;\n}\n\nfunction ConfigPanel({ channels, onToggle, customFilter, onCustomFilterChange }: ConfigPanelProps) {\n return (\n <div className=\"space-y-3 pb-3 border-b border-surface-border mb-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Channels\n </p>\n <p className=\"text-[9px] text-text-tertiary\">\n Unchecked channels are dropped before buffering\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {QUORUM_CHANNELS.map((ch) => (\n <label key={ch.key} className=\"flex items-center gap-2 cursor-pointer py-0.5\">\n <input\n type=\"checkbox\"\n checked={channels.has(ch.key)}\n onChange={() => onToggle(ch.key)}\n className=\"w-3 h-3 rounded border-border accent-accent\"\n />\n <span className=\"text-[10px] text-text-secondary\" title={ch.description}>\n {ch.label}\n </span>\n </label>\n ))}\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Text Filter\n </p>\n <input\n type=\"text\"\n value={customFilter}\n onChange={(e) => onCustomFilterChange(e.target.value)}\n placeholder=\"pong\"\n className=\"input text-[10px] font-mono py-1 px-2 w-full\"\n />\n <p className=\"text-[9px] text-text-tertiary mt-1\">\n Filter by event type, e.g. <span className=\"font-mono\">pong</span>, <span className=\"font-mono\">throttle</span>, or any text in the event data.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Feed panel ──────────────────────────────────────────────────────────────\n\ninterface QuorumFeedProps {\n bridgeActive: boolean;\n}\n\nexport function QuorumFeed({ bridgeActive }: QuorumFeedProps) {\n const [showConfig, setShowConfig] = useState(false);\n const [showRaw, setShowRaw] = useState(false);\n const [events, setEvents] = useState<QuorumEvent[]>([]);\n const [channels, setChannels] = useState<Set<string>>(\n () => new Set(QUORUM_CHANNELS.map((c) => c.key)),\n );\n const [customFilter, setCustomFilter] = useState('');\n\n // Keep a ref to channels so the NATS callback reads the latest without re-subscribing\n const channelsRef = useRef(channels);\n useEffect(() => { channelsRef.current = channels; }, [channels]);\n const customFilterRef = useRef(customFilter);\n useEffect(() => { customFilterRef.current = customFilter; }, [customFilter]);\n\n const toggleChannel = (key: string) => {\n setChannels((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n // Subscribe to NATS and filter on intake (before buffer)\n useEventSubscription('lt.events.mesh.>', useCallback((raw: any) => {\n const type = raw.type?.replace('mesh.', '') || 'unknown';\n\n // Channel filter: drop events for unchecked channels at intake\n if (!channelsRef.current.has(type)) return;\n\n // Text filter: if set, match against type or stringified data\n const cf = customFilterRef.current;\n if (cf) {\n const haystack = `${type} ${JSON.stringify(raw.data || raw)}`.toLowerCase();\n if (!haystack.includes(cf.toLowerCase())) return;\n }\n\n setEvents((prev) => {\n const next = [{\n id: ++eventCounter,\n type,\n timestamp: raw.timestamp || new Date().toISOString(),\n data: raw.data || raw,\n }, ...prev];\n return next.slice(0, MAX_EVENTS);\n });\n }, []));\n\n const handleClear = () => setEvents([]);\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] sticky top-14 self-start max-h-[calc(100vh-8rem)] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Event Stream\n </p>\n <Radio className={`w-3 h-3 ${bridgeActive ? 'text-status-success animate-pulse' : 'text-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {bridgeActive ? 'Live' : '...'}\n </span>\n\n <span className=\"ml-auto flex items-center gap-1\">\n <button\n onClick={() => { setShowConfig((v) => !v); setShowRaw(false); }}\n className={`p-1 rounded transition-colors ${showConfig ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"Configure channels\"\n >\n <Settings className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => { setShowRaw((v) => !v); setShowConfig(false); }}\n className={`p-1 rounded transition-colors ${showRaw ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"View raw JSON\"\n >\n <Code className=\"w-3.5 h-3.5\" />\n </button>\n {events.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Clear events\"\n >\n <Eraser className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </span>\n </div>\n\n {/* Config panel (animated) */}\n <Collapsible open={showConfig}>\n <ConfigPanel\n channels={channels}\n onToggle={toggleChannel}\n customFilter={customFilter}\n onCustomFilterChange={setCustomFilter}\n />\n </Collapsible>\n\n {/* Raw JSON view */}\n <Collapsible open={showRaw}>\n <div className=\"pb-3 border-b border-surface-border mb-3\">\n <pre className=\"text-[9px] font-mono text-text-tertiary bg-surface-sunken rounded-lg p-3 max-h-[50vh] overflow-auto whitespace-pre-wrap\">\n {JSON.stringify(events.slice(0, 50), null, 2)}\n </pre>\n </div>\n </Collapsible>\n\n {/* Event count */}\n {events.length > 0 && (\n <p className=\"text-[9px] text-text-tertiary mb-2\">\n {events.length} events\n </p>\n )}\n\n {/* Event list */}\n <div className=\"flex-1 overflow-y-auto\">\n {events.length === 0 ? (\n <p className=\"text-xs text-text-tertiary py-6 text-center\">\n {bridgeActive ? 'Waiting for events...' : 'Subscribing...'}\n </p>\n ) : (\n events.map((evt) => (\n <QuorumEventRow key={evt.id} event={evt} />\n ))\n )}\n </div>\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { ChevronRight, Gauge, CirclePlay, Activity, Clock } from 'lucide-react';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { isThrottled, formatThrottleHuman, formatMemory, rowKey, stripStreamPrefix } from './helpers';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport type { Duration } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface QueueCardProps {\n queue: string;\n workers: QuorumProfile[];\n expanded: boolean;\n onToggle: (queue: string) => void;\n onWorkerClick: (p: QuorumProfile) => void;\n onResumeThrottle: (p: QuorumProfile) => void;\n onQueueThrottle: (queue: string) => void;\n onResumeQueue: (queue: string) => void;\n byStream: StreamEntry[];\n activeDuration: Duration;\n}\n\nexport function QueueCard({\n queue,\n workers,\n expanded,\n onToggle,\n onWorkerClick,\n onResumeThrottle,\n onQueueThrottle,\n onResumeQueue,\n byStream,\n activeDuration,\n}: QueueCardProps) {\n const streamCount = useMemo(() => {\n const match = byStream.find(\n (s) => s.stream_type === 'worker' && stripStreamPrefix(s.stream_name) === queue,\n );\n return match?.count ?? 0;\n }, [byStream, queue]);\n\n const columns = useMemo((): Column<QuorumProfile>[] => [\n {\n key: 'engine_id',\n label: 'Worker ID',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {row.engine_id}\n </span>\n ),\n className: 'w-48',\n },\n {\n key: 'throttle',\n label: 'Throttle',\n render: (row) => {\n const t = row.throttle;\n if (t === -1) return <span className=\"text-xs text-status-error font-medium\">Paused</span>;\n if (t && t > 0) return <span className=\"text-xs text-status-warning font-medium\">{formatThrottleHuman(t)}</span>;\n return <span className=\"text-xs text-text-tertiary\">0</span>;\n },\n className: 'w-24',\n },\n {\n key: 'memory',\n label: 'Memory',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {formatMemory(row.system?.TotalMemoryGB, row.system?.FreeMemoryGB)}\n </span>\n ),\n className: 'w-36',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {isThrottled(row) && (\n <RowAction\n icon={CirclePlay}\n title=\"Resume (remove throttle)\"\n onClick={() => onResumeThrottle(row)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n <RowAction\n icon={Gauge}\n title=\"Adjust throttle\"\n onClick={() => onWorkerClick(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16',\n },\n ], [onWorkerClick, onResumeThrottle]);\n\n return (\n <div>\n <button\n onClick={() => onToggle(queue)}\n className=\"group/row relative flex items-center gap-3 w-full py-2 hover:bg-surface-hover transition-colors text-left rounded\"\n >\n <ChevronRight\n className={`w-3.5 h-3.5 text-text-tertiary/50 transition-transform duration-200 ${expanded ? 'rotate-90' : ''}`}\n strokeWidth={2}\n />\n <TaskQueuePill queue={queue} size=\"sm\" />\n\n <span className=\"flex-1\" />\n\n <span className={`flex items-center gap-1 text-xs w-24 ${workers.some(isThrottled) ? 'text-status-warning' : 'text-text-tertiary'}`}>\n <Activity className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n <span className=\"font-mono tabular-nums\">{workers.length}</span>\n <span>workers</span>\n </span>\n\n <span className=\"flex items-center gap-1 text-xs font-mono text-text-tertiary w-28 justify-end mr-16\">\n {streamCount > 0 ? (\n <>\n <Clock className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n {streamCount.toLocaleString()} in {activeDuration}\n </>\n ) : (\n <span className=\"text-text-tertiary/40\">—</span>\n )}\n </span>\n\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-0 group-hover/row:opacity-100 transition-opacity flex items-center gap-2\">\n {workers.some(isThrottled) && (\n <CirclePlay\n className=\"w-4 h-4 text-text-tertiary hover:text-status-success\"\n strokeWidth={1.5}\n onClick={(e) => {\n e.stopPropagation();\n onResumeQueue(queue);\n }}\n />\n )}\n <Gauge\n className=\"w-4 h-4 text-text-tertiary hover:text-accent\"\n strokeWidth={1.5}\n onClick={(e) => {\n e.stopPropagation();\n onQueueThrottle(queue);\n }}\n />\n </span>\n </button>\n\n <Collapsible open={expanded}>\n <div className=\"ml-6\">\n <DataTable\n columns={columns}\n data={workers}\n keyFn={rowKey}\n onRowClick={onWorkerClick}\n emptyMessage=\"No workers\"\n inline\n />\n </div>\n </Collapsible>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { CirclePause, Play } from 'lucide-react';\nimport { useControlPlaneApps, useThrottle } from '../../../api/controlplane';\n\nexport function EmergencyControls() {\n const { data: appsData } = useControlPlaneApps();\n const throttle = useThrottle();\n const [confirming, setConfirming] = useState(false);\n\n const apps = appsData?.apps ?? [];\n\n const applyAll = (ms: number) => {\n for (const app of apps) {\n throttle.mutate({ appId: app.appId, throttle: ms });\n }\n setConfirming(false);\n };\n\n if (confirming) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-status-error\">Pause all queues?</span>\n <button\n onClick={() => applyAll(-1)}\n className=\"px-2.5 py-1 text-xs rounded-md bg-status-error text-white hover:bg-status-error/90 transition-colors\"\n >\n Confirm\n </button>\n <button\n onClick={() => setConfirming(false)}\n className=\"px-2.5 py-1 text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Cancel\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setConfirming(true)}\n className=\"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-error/80 hover:text-status-error hover:bg-status-error/10 transition-colors\"\n title=\"Pause all queues\"\n >\n <CirclePause className=\"w-3.5 h-3.5\" />\n Pause All\n </button>\n <button\n onClick={() => applyAll(0)}\n className=\"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-success/80 hover:text-status-success hover:bg-status-success/10 transition-colors\"\n title=\"Resume all queues\"\n >\n <Play className=\"w-3.5 h-3.5\" />\n Resume All\n </button>\n </div>\n );\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { PageHeaderWithStats, type InlineStat } from '../../../components/common/layout/PageHeaderWithStats';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport {\n useControlPlaneApps,\n useRollCall,\n useStreamStats,\n useSubscribeMesh,\n} from '../../../api/controlplane';\nimport {\n DURATIONS,\n isWorker,\n isThrottled,\n rowKey,\n groupByQueue,\n type Duration,\n} from './helpers';\nimport { getEngineColumns } from './columns';\nimport { useMeshSelection } from './useMeshSelection';\nimport { ThrottleModal } from './ThrottleModal';\nimport { StreamVolumeChart } from './StreamVolumeChart';\nimport { QuorumFeed } from './QuorumFeed';\nimport { QueueCard } from './QueueCard';\nimport { EmergencyControls } from './EmergencyControls';\n\nexport function ControlPlanePage() {\n const { data: appsData } = useControlPlaneApps();\n const apps = appsData?.apps ?? [];\n\n const { filters, setFilter } = useFilterParams({\n filters: { app_id: '', duration: '1h' },\n });\n\n const firstAppId = apps[0]?.appId ?? 'durable';\n const activeAppId = filters.app_id || firstAppId;\n const activeDuration = (filters.duration || '1h') as Duration;\n\n const subscribeMesh = useSubscribeMesh();\n\n const REFRESH_INTERVAL = 60_000;\n\n const { data: rollCallData, isLoading, error: rollCallError, refetch, isFetching } = useRollCall(activeAppId, REFRESH_INTERVAL);\n const { data: streamStats } = useStreamStats(activeAppId, activeDuration, undefined, REFRESH_INTERVAL);\n\n // ── All profiles (sorted) ───────────────────────────────────\n const allProfiles = useMemo(() => {\n const raw = rollCallData?.profiles ?? [];\n return [...raw].sort((a, b) => {\n const ta = a.worker_topic || a.stream || '';\n const tb = b.worker_topic || b.stream || '';\n if (!a.worker_topic && b.worker_topic) return -1;\n if (a.worker_topic && !b.worker_topic) return 1;\n return ta.localeCompare(tb);\n });\n }, [rollCallData?.profiles]);\n\n // ── Derived data ──────────────────────────────────────────────\n const engines = useMemo(() => allProfiles.filter((p) => !isWorker(p)), [allProfiles]);\n const workers = useMemo(() => allProfiles.filter(isWorker), [allProfiles]);\n const queueMap = useMemo(() => groupByQueue(allProfiles), [allProfiles]);\n const throttledCount = allProfiles.filter(isThrottled).length;\n\n const appOptions = useMemo(() => {\n const ids = new Set(apps.map((a) => a.appId));\n if (activeAppId) ids.add(activeAppId);\n return [...ids].sort().map((id) => ({ value: id, label: id }));\n }, [apps, activeAppId]);\n\n // ── Queue card expand/collapse state ───────────────────────────\n const [expandedQueues, setExpandedQueues] = useState<Set<string>>(new Set());\n const toggleQueue = useCallback((queue: string) => {\n setExpandedQueues((prev) => {\n const next = new Set(prev);\n if (next.has(queue)) next.delete(queue);\n else next.add(queue);\n return next;\n });\n }, []);\n const allQueuesExpanded = queueMap.size > 0 && [...queueMap.keys()].every((q) => expandedQueues.has(q));\n const toggleAllQueues = useCallback(() => {\n if (allQueuesExpanded) setExpandedQueues(new Set());\n else setExpandedQueues(new Set(queueMap.keys()));\n }, [allQueuesExpanded, queueMap]);\n\n // ── Section collapse state (persisted) ─────────────────────────\n const STORAGE_KEY = 'lt:controlplane:collapsed';\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>(() => {\n try {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n } catch { return {}; }\n });\n const toggleSection = useCallback((key: string) => {\n setCollapsed((prev) => {\n const next = { ...prev, [key]: !prev[key] };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n return next;\n });\n }, []);\n\n // ── Selection + throttle logic ─────────────────────────────\n const {\n selectedIds,\n setSelectedIds,\n toggleCheckbox,\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleBulkThrottleOpen,\n handleResumeThrottle,\n handleResumeQueue,\n handleQueueThrottle,\n closeThrottleModal,\n } = useMeshSelection({ activeAppId, allProfiles, profiles: allProfiles });\n\n // ── Engine-scoped toggle ───────────────────────────────────────\n const toggleAllEngines = useCallback(() => {\n const engineKeys = new Set(engines.map(rowKey));\n const allSelected = engines.length > 0 && engines.every((e) => selectedIds.has(rowKey(e)));\n setSelectedIds((prev) => {\n const next = new Set(prev);\n for (const k of engineKeys) {\n if (allSelected) next.delete(k);\n else next.add(k);\n }\n return next;\n });\n }, [engines, selectedIds, setSelectedIds]);\n\n // ── Engine bulk throttle (header icon) ─────────────────────────\n const handleEngineBulkThrottle = useCallback(() => {\n const selected = engines.filter((e) => selectedIds.has(rowKey(e)));\n if (selected.length === 0) return;\n handleBulkThrottleOpen();\n }, [engines, selectedIds, handleBulkThrottleOpen]);\n\n // ── Engine column definitions ─────────────────────────────────\n const engineColumns = useMemo(\n () => getEngineColumns({\n profiles: engines,\n selectedIds,\n toggleAll: toggleAllEngines,\n toggleCheckbox,\n onRowThrottle: handleRowClick,\n onResumeThrottle: handleResumeThrottle,\n onBulkThrottle: handleEngineBulkThrottle,\n }),\n [engines, selectedIds, toggleAllEngines, toggleCheckbox, handleRowClick, handleResumeThrottle, handleEngineBulkThrottle],\n );\n\n // ── Header stats ──────────────────────────────────────────────\n const headerStats = useMemo((): InlineStat[] => {\n const stats: InlineStat[] = [\n { label: 'Engines', value: engines.length, dotClass: 'bg-blue-500' },\n { label: 'Workers', value: workers.length, dotClass: 'bg-text-secondary' },\n { label: 'Queues', value: queueMap.size },\n ];\n if (throttledCount > 0) {\n stats.push({ label: 'Throttled', value: throttledCount, dotClass: 'bg-status-warning' });\n }\n return stats;\n }, [engines.length, workers.length, queueMap.size, throttledCount]);\n\n // ── Quorum bridge ────────────────────────────────────────────\n const [bridgeActive, setBridgeActive] = useState(false);\n\n const handleStartBridge = useCallback(() => {\n subscribeMesh.mutate({ appId: activeAppId }, {\n onSuccess: () => setBridgeActive(true),\n });\n }, [activeAppId, subscribeMesh]);\n\n useEffect(() => {\n if (!bridgeActive && activeAppId) {\n handleStartBridge();\n }\n }, [activeAppId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Task Queues\"\n stats={headerStats}\n actions={<EmergencyControls />}\n />\n\n <FilterBar\n actions={\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setFilter('duration', d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n activeDuration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n }\n >\n <FilterSelect\n label=\"Application\"\n value={filters.app_id}\n onChange={(v) => setFilter('app_id', v)}\n options={appOptions}\n />\n <button\n onClick={() => refetch()}\n disabled={isFetching}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n Roll Call\n </button>\n </FilterBar>\n\n {/* Error banner */}\n {rollCallError && (\n <div className=\"mb-6 px-4 py-3 rounded bg-status-error/10 border border-status-error/20\">\n <p className=\"text-xs text-status-error font-medium\">\n {rollCallError.message === 'Session expired'\n ? 'Session expired — please log in again.'\n : `Failed to load mesh data: ${rollCallError.message}`}\n </p>\n </div>\n )}\n\n {/* Main content: sections (left) + quorum feed (right) */}\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-6\">\n <div className=\"flex flex-col gap-12 mt-10\">\n {/* Stream Volume section */}\n <CollapsibleSection\n title={`Stream Volume (${activeDuration})`}\n sectionKey=\"volume\"\n isCollapsed={!!collapsed.volume}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7\"\n >\n <StreamVolumeChart\n byStream={streamStats?.byStream ?? []}\n onNodeFilter={() => {}}\n onQueueFilter={() => {}}\n />\n </CollapsibleSection>\n\n {/* Task Queues section */}\n <CollapsibleSection\n title=\"Worker Queues\"\n sectionKey=\"queues\"\n isCollapsed={!!collapsed.queues}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7 flex flex-col gap-0\"\n >\n {isLoading ? (\n <p className=\"text-xs text-text-tertiary\">Discovering mesh nodes...</p>\n ) : queueMap.size === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No worker queues found. Click \"Roll Call\" to discover.</p>\n ) : (\n <>\n <div className=\"flex justify-end mb-2\">\n <button onClick={toggleAllQueues} className=\"text-[10px] text-accent hover:underline\">\n {allQueuesExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n </div>\n {[...queueMap.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([queue, qWorkers]) => (\n <QueueCard\n key={queue}\n queue={queue}\n workers={qWorkers}\n expanded={expandedQueues.has(queue)}\n onToggle={toggleQueue}\n onWorkerClick={handleRowClick}\n onResumeThrottle={handleResumeThrottle}\n onQueueThrottle={handleQueueThrottle}\n onResumeQueue={handleResumeQueue}\n byStream={streamStats?.byStream ?? []}\n activeDuration={activeDuration}\n />\n ))}\n </>\n )}\n </CollapsibleSection>\n\n {/* Engines section */}\n <CollapsibleSection\n title=\"Engines\"\n sectionKey=\"engines\"\n isCollapsed={!!collapsed.engines}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7\"\n >\n <DataTable\n columns={engineColumns}\n data={engines}\n keyFn={rowKey}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage={isLoading ? 'Discovering engines...' : 'No engines found.'}\n inline\n />\n </CollapsibleSection>\n </div>\n\n <QuorumFeed bridgeActive={bridgeActive} />\n </div>\n\n <ThrottleModal\n open={throttleModalOpen}\n onClose={closeThrottleModal}\n targets={throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets}\n onApply={handleBulkThrottle}\n isPending={throttleMutation.isPending}\n />\n </div>\n );\n}\n"],"names":["fetchApps","apiFetch","fetchRollCall","appId","postThrottle","body","postSubscribe","fetchStreamStats","duration","stream","url","useControlPlaneApps","useQuery","useRollCall","refetchInterval","useThrottle","qc","useQueryClient","useMutation","useStreamStats","useSubscribeMesh","DURATIONS","EVENT_TYPE_COLORS","MAX_EVENTS","isWorker","p","isThrottled","formatThrottleHuman","ms","formatMemory","total","free","t","f","stripStreamPrefix","name","QUORUM_CHANNELS","rowKey","groupByQueue","profiles","map","q","sumCounts","success","errors","code","n","throttleColumn","row","jsxDEV","memoryColumn","_a","_b","actionColumn","onRowThrottle","onResumeThrottle","RowActionGroup","RowAction","CirclePlay","Gauge","getEngineColumns","opts","hasSelection","e","c","useMeshSelection","activeAppId","allProfiles","throttleMutation","selectedIds","setSelectedIds","useState","throttleModalOpen","setThrottleModalOpen","throttleTargets","setThrottleTargets","useEffect","toggleCheckbox","useCallback","profile","prev","next","key","toggleAll","selectedThrottleTargets","useMemo","selected","engines","workers","targets","queues","w","queue","members","allOnQueue","label","queueName","PRESETS","TargetPill","target","isMesh","isEngine","color","scope","ThrottleModal","open","onClose","onApply","isPending","seconds","setSeconds","Modal","i","s","StreamVolumeChart","byStream","onNodeFilter","animated","setAnimated","raf","engineStreams","workerStreams","maxCount","renderBar","pct","barColor","labelColor","labelCls","Fragment","eventCounter","QuorumEventRow","event","expanded","setExpanded","_c","Collapsible","JsonViewer","ConfigPanel","channels","onToggle","customFilter","onCustomFilterChange","ch","QuorumFeed","bridgeActive","showConfig","setShowConfig","showRaw","setShowRaw","events","setEvents","setChannels","setCustomFilter","channelsRef","useRef","customFilterRef","toggleChannel","useEventSubscription","raw","type","cf","handleClear","Radio","v","Settings","Code","Eraser","evt","QueueCard","onWorkerClick","onQueueThrottle","onResumeQueue","activeDuration","streamCount","match","columns","ChevronRight","TaskQueuePill","Activity","Clock","DataTable","EmergencyControls","appsData","throttle","confirming","setConfirming","apps","applyAll","app","CirclePause","Play","ControlPlanePage","filters","setFilter","useFilterParams","firstAppId","subscribeMesh","REFRESH_INTERVAL","rollCallData","isLoading","rollCallError","refetch","isFetching","streamStats","a","b","ta","tb","queueMap","throttledCount","appOptions","ids","id","expandedQueues","setExpandedQueues","toggleQueue","allQueuesExpanded","toggleAllQueues","STORAGE_KEY","collapsed","setCollapsed","toggleSection","handleBulkThrottle","handleRowClick","handleBulkThrottleOpen","handleResumeThrottle","handleResumeQueue","handleQueueThrottle","closeThrottleModal","toggleAllEngines","engineKeys","allSelected","k","handleEngineBulkThrottle","engineColumns","headerStats","stats","setBridgeActive","handleStartBridge","PageHeaderWithStats","FilterBar","d","FilterSelect","RefreshCw","CollapsibleSection","qWorkers"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as r}from"./index-DSzSoku1.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{h as b}from"./workflows-B20dR3NE.js";import{D as g}from"./DataTable-B3uf5CCo.js";import{F as N,b as x}from"./FilterBar-CShf0oe7.js";import{R as v,a as m}from"./RowActions-Cp5HyK_w.js";import{u as P}from"./useFilterParams-BUyLHcx_.js";import{P as W}from"./PageHeader-SMD9qtOO.js";import{T as y}from"./TaskQueuePill-BtJbZTT0.js";import{W as D}from"./WorkflowPill-Diw8iWBP.js";import{H as E,V as j,Y as C}from"./vendor-icons-DCLlGYO9.js";import{c as V}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-BChBJNGS.js";function B(){const o=V(),{data:u,isLoading:c}=b(),{filters:s,setFilter:i}=P({filters:{search:"",queue:""}}),[a,p]=l.useState(s.search);l.useEffect(()=>{if(a===s.search)return;const e=setTimeout(()=>i("search",a),300);return()=>clearTimeout(e)},[a,i,s.search]);const t=u??[],f=l.useMemo(()=>[...new Set(t.map(e=>e.task_queue).filter(Boolean))].sort(),[t]),k=l.useMemo(()=>{let e=t;if(s.search){const n=s.search.toLowerCase();e=e.filter(h=>h.name.toLowerCase().includes(n))}return s.queue&&(e=e.filter(n=>n.task_queue===s.queue)),e},[t,s]),d=[{key:"name",label:"Workflow",render:e=>r.jsxDEV(D,{type:e.name},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:52,columnNumber:24},this)},{key:"task_queue",label:"Queue",render:e=>r.jsxDEV(y,{queue:e.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:57,columnNumber:24},this),className:"whitespace-nowrap"},{key:"registered",label:"Status",render:e=>e.registered?r.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[r.jsxDEV(E,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:131},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:11},this):r.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:65,columnNumber:11},this),className:"whitespace-nowrap"},{key:"actions",label:"",render:e=>r.jsxDEV(v,{children:e.registered?r.jsxDEV(m,{icon:j,title:"View config",onClick:()=>o(`/workflows/registry/${encodeURIComponent(e.name)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:74,columnNumber:13},this):r.jsxDEV(m,{icon:C,title:"Register workflow",onClick:()=>o(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:80,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:72,columnNumber:9},this),className:"w-16 text-right"}],w=e=>{e.registered?o(`/workflows/registry/${encodeURIComponent(e.name)}`):o(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)};return r.jsxDEV("div",{children:[r.jsxDEV(W,{title:"Workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:102,columnNumber:7},this),r.jsxDEV(N,{children:[r.jsxDEV("input",{type:"text",placeholder:"Search workers...",value:a,onChange:e=>p(e.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:105,columnNumber:9},this),r.jsxDEV(x,{label:"Queue",value:s.queue,onChange:e=>i("queue",e),options:f.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:112,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:104,columnNumber:7},this),r.jsxDEV(g,{columns:d,data:k,keyFn:e=>e.name,onRowClick:w,isLoading:c,emptyMessage:"No active workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:120,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:101,columnNumber:5},this)}export{B as WorkersPage};
2
- //# sourceMappingURL=index-BtOwLI0K.js.map
@@ -1,6 +0,0 @@
1
- import{j as e,S as D,k as J}from"./index-DSzSoku1.js";import{a as h}from"./vendor-query-DLp59M9_.js";import{c as R,d as L,b as $,u as B,e as q,f as z}from"./workflows-B20dR3NE.js";import{P as H}from"./PageHeader-SMD9qtOO.js";import{P as U,z as G,H as K,d as Q,J as I,N as X}from"./vendor-icons-DCLlGYO9.js";import{B as Y}from"./BotPicker-C51nKFEu.js";import{L as Z,c as F,f as ee}from"./vendor-react-Co3Y8ikm.js";import{D as se}from"./DataTable-B3uf5CCo.js";import{T as ae}from"./TimeAgo-WuM6xImZ.js";import{S as te}from"./StatusBadge-BYNGGZK5.js";import"./bots-BPiZXf2h.js";import"./EmptyState-BChBJNGS.js";function re({mode:s,onChange:r}){const m=(l,a,i)=>e.jsxDEV("button",{onClick:()=>r(l),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${s===l?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[a,i]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/ModeToggle.tsx",lineNumber:7,columnNumber:5},this);return e.jsxDEV("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[m("now",e.jsxDEV(U,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/ModeToggle.tsx",lineNumber:22,columnNumber:19},this),"Start Now"),m("schedule",e.jsxDEV(G,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/ModeToggle.tsx",lineNumber:23,columnNumber:24},this),"Schedule")]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/ModeToggle.tsx",lineNumber:21,columnNumber:5},this)}function oe({configs:s,selectedType:r,onSelect:m,certifiedTypes:l}){return e.jsxDEV("div",{children:[e.jsxDEV(D,{className:"mb-6",children:"Select Workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:18,columnNumber:7},this),e.jsxDEV("div",{children:s.map(a=>{const i=r===a.workflow_type,u=l.has(a.workflow_type);return e.jsxDEV("button",{onClick:()=>m(a),className:`w-full text-left py-4 border-b border-surface-border transition-colors duration-150 ${i?"border-l-2 border-l-accent pl-4":"pl-0 hover:text-text-primary"}`,children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[u?e.jsxDEV(K,{className:"w-3.5 h-3.5 shrink-0 text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:35,columnNumber:21},this):e.jsxDEV(Q,{className:"w-3.5 h-3.5 shrink-0 text-accent/75"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:36,columnNumber:21},this),e.jsxDEV("p",{className:`text-sm font-mono ${i?"font-medium text-accent":"text-text-secondary"}`,children:a.workflow_type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:37,columnNumber:17},this),a.execute_as&&e.jsxDEV("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded",children:[e.jsxDEV(I,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:42,columnNumber:21},this),a.execute_as]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:41,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:33,columnNumber:15},this),a.description&&e.jsxDEV("p",{className:"text-[11px] text-text-tertiary mt-1 leading-relaxed",children:a.description},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:48,columnNumber:17},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-1 opacity-60",children:a.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:52,columnNumber:15},this)]},a.workflow_type,!0,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:24,columnNumber:13},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:19,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/WorkflowSelector.tsx",lineNumber:17,columnNumber:5},this)}function A({children:s,className:r=""}){return e.jsxDEV("span",{className:`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${r}`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/Pill.tsx",lineNumber:10,columnNumber:5},this)}const C=`{
2
- "data": {},
3
- "metadata": {}
4
- }`;function le(s){return typeof s=="boolean"?"boolean":typeof s=="number"?"number":Array.isArray(s)?"array":s!==null&&typeof s=="object"?"object":"string"}function M(s){if(!s)return[];const r=s.data;return!r||typeof r!="object"?[]:Object.entries(r).map(([m,l])=>({key:m,type:le(l),defaultValue:l}))}function W(s){return{...s}}function O(s,r){return JSON.stringify({data:s,metadata:r},null,2)}function ie({config:s,overrideBot:r,onOverrideChange:m,showOverride:l}){const{user:a}=J(),i=r||s.execute_as;return e.jsxDEV("div",{className:"bg-surface-sunken rounded-lg px-4 py-3 space-y-2",children:[e.jsxDEV("div",{className:"flex items-center justify-between",children:[e.jsxDEV("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium",children:"Running as"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:23,columnNumber:9},this),i&&!r&&e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:"configured default"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:25,columnNumber:11},this),r&&e.jsxDEV("span",{className:"text-[9px] text-accent",children:"admin override"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:28,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:22,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-1.5",children:i?e.jsxDEV(e.Fragment,{children:[e.jsxDEV(I,{className:"w-3.5 h-3.5 text-accent/70"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:34,columnNumber:13},this),e.jsxDEV("span",{className:"text-xs text-text-primary font-mono",children:i},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:35,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:33,columnNumber:11},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(X,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:39,columnNumber:13},this),e.jsxDEV("span",{className:"text-xs text-text-primary",children:(a==null?void 0:a.displayName)||(a==null?void 0:a.username)||"you"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:40,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:38,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:31,columnNumber:7},this),l&&m&&e.jsxDEV("div",{className:"pt-1 border-t border-surface-border",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary mb-1 block",children:"Override identity"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:48,columnNumber:11},this),e.jsxDEV(Y,{selected:r??"",onChange:m,placeholder:s.execute_as?`Default: ${s.execute_as}`:"Invoking user (default)"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:49,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:47,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/IdentitySummary.tsx",lineNumber:21,columnNumber:5},this)}function ne({selectedConfig:s,isJsonMode:r,hasFormView:m,jsonInput:l,formFields:a,dataFields:i,onJsonChange:u,onToggleMode:k,onUpdateFormField:N,onSetFormFields:x}){return e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsxDEV("label",{className:"block text-xs text-text-secondary",children:"Envelope"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:36,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-3",children:[m&&e.jsxDEV("button",{type:"button",onClick:k,className:"text-[10px] text-accent hover:underline",children:r?"Form view":"JSON view"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:41,columnNumber:13},this),s.envelope_schema?e.jsxDEV("span",{className:"text-[10px] text-accent",children:"Pre-filled from workflow config"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:50,columnNumber:13},this):e.jsxDEV("span",{className:"text-[10px] text-status-warning",children:"No template"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:54,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:39,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:35,columnNumber:7},this),!s.envelope_schema&&e.jsxDEV("div",{className:"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3",children:e.jsxDEV("p",{className:"text-xs text-text-secondary leading-relaxed",children:["This workflow has no input template. Edit the JSON directly below, or register it as a ",e.jsxDEV(Z,{to:"/workflows/registry/new",className:"text-status-success hover:underline",children:"certified workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:64,columnNumber:100},this)," in the Workflow Registry for pre-filled fields and form-based input."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:63,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:62,columnNumber:9},this),r||!m?e.jsxDEV("textarea",{value:l,onChange:n=>u(n.target.value),className:"input font-mono text-xs",rows:12,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:71,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-3",children:i.map(({key:n,type:p})=>{var E,y;const c=a[n],b=typeof c=="string"?c:JSON.stringify(c??(p==="array"?[]:{}),null,2),w=Math.min(20,Math.max(4,((y=(E=b==null?void 0:b.split)==null?void 0:E.call(b,`
5
- `))==null?void 0:y.length)??4));return e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[n,e.jsxDEV("span",{className:"ml-2 font-normal normal-case",children:p},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:99,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:97,columnNumber:17},this),p==="boolean"?e.jsxDEV("select",{value:String(c??!1),onChange:v=>N(n,v.target.value,p),className:"select text-xs w-full",children:[e.jsxDEV("option",{value:"true",children:"true"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:111,columnNumber:21},this),e.jsxDEV("option",{value:"false",children:"false"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:112,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:104,columnNumber:19},this):p==="object"||p==="array"?e.jsxDEV("textarea",{value:b,onChange:v=>{try{N(n,JSON.parse(v.target.value),p)}catch{x({...a,[n]:v.target.value})}},className:"input font-mono text-[11px] w-full leading-relaxed",rows:w,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:115,columnNumber:19},this):e.jsxDEV("input",{type:p==="number"?"number":"text",value:String(c??""),onChange:v=>N(n,v.target.value,p),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:137,columnNumber:19},this)]},n,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:96,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:80,columnNumber:9},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-1.5",children:["The envelope wraps your workflow input. ",e.jsxDEV("code",{className:"text-accent/80",children:"data"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:152,columnNumber:49},this)," holds workflow-specific fields; ",e.jsxDEV("code",{className:"text-accent/80",children:"metadata"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:152,columnNumber:126},this)," is optional context."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:151,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/EnvelopeEditor.tsx",lineNumber:34,columnNumber:5},this)}function me({selected:s,executionsPath:r}){const m=F(),{isSuperAdmin:l,hasRoleType:a}=J(),i=l||a("admin"),u=R(),[k,N]=h.useState(C),[x,n]=h.useState(""),[p,c]=h.useState({}),[b,w]=h.useState(!1),[E,y]=h.useState(""),v=h.useMemo(()=>M(s.envelope_schema??null),[s.envelope_schema]),f=v.length>0,S=h.useMemo(()=>{if(!s.envelope_schema)return{};const o=s.envelope_schema.metadata;return o&&typeof o=="object"?o:{}},[s.envelope_schema]);h.useEffect(()=>{var g;n(""),u.reset();const o=sessionStorage.getItem("lt:invoke:prefill");if(o){sessionStorage.removeItem("lt:invoke:prefill"),N(o);try{const j=JSON.parse(o),P=(j==null?void 0:j.data)??j;P&&typeof P=="object"&&c(W(P))}catch{}w(!0),y("");return}const d=s.envelope_schema?JSON.stringify(s.envelope_schema,null,2):C;N(d),(g=s.envelope_schema)!=null&&g.data&&typeof s.envelope_schema.data=="object"?c(W(s.envelope_schema.data)):c({}),w(!M(s.envelope_schema??null).length),y("")},[s.workflow_type]);const _=()=>{if(b)try{const o=JSON.parse(k);o.data&&typeof o.data=="object"&&c(W(o.data))}catch{}else N(O(p,S));w(!b)},V=(o,d,g)=>{let j=d;g==="number"?j=d===""?0:Number(d):g==="boolean"&&(j=d==="true"||d===!0);const P={...p,[o]:j};c(P),N(O(P,S))},t=async()=>{n("");let o;try{o=JSON.parse(k)}catch{n("Invalid JSON");return}const{data:d,metadata:g}=o;if(!d||typeof d!="object"){n('Envelope must include a "data" object');return}try{await u.mutateAsync({workflowType:s.workflow_type,data:d,metadata:g??void 0,...E?{execute_as:E}:{}}),m(r)}catch{}};return e.jsxDEV("div",{className:"space-y-6",children:[e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between",children:[e.jsxDEV(D,{children:s.workflow_type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:121,columnNumber:11},this),e.jsxDEV("div",{className:"flex gap-2",children:s.roles.map(o=>e.jsxDEV(A,{children:o},o,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:124,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:122,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:120,columnNumber:9},this),s.description&&e.jsxDEV("p",{className:"text-sm text-text-secondary mt-2 leading-relaxed",children:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:129,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:119,columnNumber:7},this),e.jsxDEV(ie,{config:s,overrideBot:E,onOverrideChange:y,showOverride:i},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:135,columnNumber:7},this),e.jsxDEV(ne,{selectedConfig:s,isJsonMode:b,hasFormView:f,jsonInput:k,formFields:p,dataFields:v,onJsonChange:o=>{N(o),n("")},onToggleMode:_,onUpdateFormField:V,onSetFormFields:c},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:142,columnNumber:7},this),x&&e.jsxDEV("p",{className:"text-xs text-status-error",children:x},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:155,columnNumber:22},this),u.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:u.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:156,columnNumber:32},this),u.isSuccess&&e.jsxDEV("p",{className:"text-xs text-status-success",children:"Workflow started"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:157,columnNumber:36},this),e.jsxDEV("button",{onClick:t,disabled:u.isPending,className:"btn-primary",children:u.isPending?"Starting...":"Start Workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:159,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartNowPanel.tsx",lineNumber:118,columnNumber:5},this)}const ce={"* * * * *":"Every minute","*/5 * * * *":"Every 5 minutes","*/15 * * * *":"Every 15 minutes","*/30 * * * *":"Every 30 minutes","0 * * * *":"Every hour","0 */2 * * *":"Every 2 hours","0 */6 * * *":"Every 6 hours","0 */12 * * *":"Every 12 hours","0 0 * * *":"Daily at midnight","0 9 * * *":"Daily at 9 AM","0 9 * * 1-5":"Weekdays at 9 AM","0 0 * * 0":"Weekly (Sunday midnight)","0 0 1 * *":"Monthly (1st at midnight)","0 2 * * *":"Daily at 2 AM"};function T(s){return ce[s]??""}const de=[["*/15 * * * *","Every 15 min"],["0 * * * *","Every hour"],["0 */6 * * *","Every 6 hours"],["0 9 * * *","Daily 9 AM"],["0 9 * * 1-5","Weekdays 9 AM"],["0 0 * * 0","Weekly (Sun)"]];function ue(s){const r=s==null?void 0:s.data;if(!r||typeof r!="object"||Array.isArray(r))return null;const m=Object.entries(r);return m.length===0||!m.every(([,a])=>typeof a=="string"||typeof a=="number"||typeof a=="boolean"||a===null)?null:m.map(([a,i])=>({key:a,value:i===null?"":String(i),type:i===null?"string":typeof i}))}const pe=[{key:"workflow_id",label:"Workflow ID",render:s=>e.jsxDEV("span",{className:"font-mono text-[11px] text-text-secondary",children:s.workflow_id.length>40?`${s.workflow_id.slice(0,40)}...`:s.workflow_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/helpers.tsx",lineNumber:69,columnNumber:7},void 0)},{key:"status",label:"Status",render:s=>e.jsxDEV(te,{status:s.status},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/helpers.tsx",lineNumber:79,columnNumber:22},void 0),className:"w-28"},{key:"created_at",label:"Started",render:s=>e.jsxDEV(ae,{date:s.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/helpers.tsx",lineNumber:85,columnNumber:22},void 0),className:"w-32"}];function fe({selected:s,activeTypes:r}){const m=F(),l=L(),[a,i]=h.useState(""),[u,k]=h.useState(""),[N,x]=h.useState(""),[n,p]=h.useState("json"),c=h.useMemo(()=>s!=null&&s.envelope_schema?JSON.stringify(s.envelope_schema,null,2):C,[s==null?void 0:s.envelope_schema]),b=u!==c,w=h.useMemo(()=>{try{return JSON.parse(u)}catch{return null}},[u]),E=h.useMemo(()=>w?ue(w):null,[w]);h.useEffect(()=>{i(s.cron_schedule??""),k(s.envelope_schema?JSON.stringify(s.envelope_schema,null,2):C),x(""),p("json"),l.reset()},[s.workflow_type]);const{data:y,isLoading:v}=$({entity:s.workflow_type,limit:10}),f=()=>{let t;try{t=JSON.parse(u)}catch{x("Invalid JSON in envelope");return}x(""),l.mutate({config:s,cron_schedule:a.trim()||null,envelope_schema:t})},S=()=>{i(""),l.mutate({config:s,cron_schedule:null})},_=()=>{k(c),x("")},V=(t,o)=>{if(!w)return;const d={...w.data??{}},g=d[t];typeof g=="number"?d[t]=o===""?0:Number(o):typeof g=="boolean"?d[t]=o==="true":d[t]=o,k(JSON.stringify({...w,data:d},null,2))};return e.jsxDEV("div",{className:"space-y-8",children:[e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV(D,{children:s.workflow_type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:105,columnNumber:11},this),s.cron_schedule&&e.jsxDEV(A,{className:r.has(s.workflow_type)?"bg-status-success/10 text-status-success":"bg-surface-sunken text-text-tertiary",children:r.has(s.workflow_type)?"active":"inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:107,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:104,columnNumber:9},this),s.description&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-2 leading-relaxed",children:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:116,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:103,columnNumber:7},this),e.jsxDEV("div",{className:"bg-surface-sunken rounded-lg px-4 py-3",children:e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mr-2",children:"Cron runs as"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:125,columnNumber:11},this),e.jsxDEV(I,{className:"w-3.5 h-3.5 text-accent/70"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:126,columnNumber:11},this),e.jsxDEV("span",{className:"text-xs text-text-primary font-mono",children:s.execute_as??"lt-system"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:127,columnNumber:11},this),!s.execute_as&&e.jsxDEV("span",{className:"text-[9px] text-text-tertiary ml-1",children:"system bot"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:131,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:124,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:123,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV(D,{className:"mb-3",children:"Schedule"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:138,columnNumber:9},this),e.jsxDEV("div",{className:"flex gap-3 items-start",children:[e.jsxDEV("div",{className:"flex-1",children:[e.jsxDEV("input",{type:"text",value:a,onChange:t=>{i(t.target.value),l.reset()},placeholder:"0 */6 * * *",className:"input font-mono text-sm w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:141,columnNumber:13},this),a.trim()&&T(a.trim())&&e.jsxDEV("p",{className:"text-xs text-text-secondary mt-1.5",children:T(a.trim())},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:149,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:140,columnNumber:11},this),e.jsxDEV("button",{onClick:f,disabled:l.isPending,className:"btn-primary text-xs shrink-0",children:l.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:154,columnNumber:11},this),s.cron_schedule&&e.jsxDEV("button",{onClick:S,disabled:l.isPending,className:"btn-ghost text-xs text-status-error shrink-0",children:"Clear"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:158,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:139,columnNumber:9},this),l.isSuccess&&e.jsxDEV("p",{className:"text-[10px] text-status-success mt-2",children:"Schedule updated"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:163,columnNumber:31},this),l.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-2",children:l.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:164,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:137,columnNumber:7},this),e.jsxDEV("div",{className:"bg-surface-sunken rounded-lg p-4",children:[e.jsxDEV(D,{className:"mb-2",children:"Common Patterns"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:169,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5",children:de.map(([t,o])=>e.jsxDEV("button",{type:"button",onClick:()=>{i(t),l.reset()},className:"flex items-center gap-2 text-left py-0.5 group",children:[e.jsxDEV("code",{className:"font-mono text-[11px] text-accent group-hover:text-accent-hover",children:t},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:178,columnNumber:15},this),e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:179,columnNumber:15},this)]},t,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:172,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:170,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:168,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsxDEV(D,{children:"Cron Envelope"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:188,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-3",children:[b&&e.jsxDEV("button",{type:"button",onClick:_,className:"text-[10px] text-status-warning hover:text-status-warning/80 transition-colors",children:"Reset to default"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:191,columnNumber:15},this),E&&e.jsxDEV("div",{className:"flex rounded overflow-hidden border border-surface-border",children:[e.jsxDEV("button",{type:"button",onClick:()=>p("form"),className:`px-2 py-0.5 text-[10px] transition-colors ${n==="form"?"bg-accent/10 text-accent":"text-text-tertiary hover:text-text-secondary"}`,children:"Form"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:197,columnNumber:17},this),e.jsxDEV("button",{type:"button",onClick:()=>p("json"),className:`px-2 py-0.5 text-[10px] transition-colors ${n==="json"?"bg-accent/10 text-accent":"text-text-tertiary hover:text-text-secondary"}`,children:"JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:198,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:196,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:189,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:187,columnNumber:9},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mb-3",children:"This envelope is sent as the workflow input on each cron invocation."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:203,columnNumber:9},this),n==="form"&&E?e.jsxDEV("div",{className:"space-y-3",children:E.map(({key:t,value:o,type:d})=>e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[11px] text-text-secondary mb-1 font-mono",children:t},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:211,columnNumber:17},this),d==="boolean"?e.jsxDEV("select",{value:o,onChange:g=>V(t,g.target.value),className:"input text-xs w-full",children:[e.jsxDEV("option",{value:"true",children:"true"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:214,columnNumber:21},this),e.jsxDEV("option",{value:"false",children:"false"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:215,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:213,columnNumber:19},this):e.jsxDEV("input",{type:d==="number"?"number":"text",value:o,onChange:g=>V(t,g.target.value),className:"input text-xs font-mono w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:218,columnNumber:19},this)]},t,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:210,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:208,columnNumber:11},this):e.jsxDEV("textarea",{value:u,onChange:t=>{k(t.target.value),x("")},className:"input font-mono text-xs w-full",rows:10,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:224,columnNumber:11},this),N&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-2",children:N},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:233,columnNumber:27},this),b&&e.jsxDEV("p",{className:"text-[10px] text-accent mt-1.5",children:"Envelope has been customized. Changes will be saved with the schedule."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:234,columnNumber:32},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:186,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV(D,{className:"mb-3",children:"Recent Executions"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:239,columnNumber:9},this),e.jsxDEV(se,{columns:pe,data:(y==null?void 0:y.jobs)??[],keyFn:t=>t.workflow_id,onRowClick:t=>m(`/workflows/executions/${t.workflow_id}`),isLoading:v,emptyMessage:"No executions yet"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:240,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:238,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/SchedulePanel.tsx",lineNumber:101,columnNumber:5},this)}function he({tier:s}){const[r,m]=ee(),{data:l,isLoading:a}=B(),{data:i,isLoading:u}=q(),{data:k}=z(),N=r.get("mode")||"now",x=r.get("type")??"",n=l??[],p=h.useMemo(()=>new Set(n.filter(f=>f.invocable).map(f=>f.workflow_type)),[n]),c=h.useMemo(()=>{const f=n.filter(t=>t.invocable),S=new Set(n.map(t=>t.workflow_type)),V=(i??[]).filter(t=>t.active&&!S.has(t.workflow_type)).map(t=>({workflow_type:t.workflow_type,task_queue:t.task_queue??"",invocable:!0,description:null,default_role:"reviewer",roles:[],invocation_roles:[],consumes:[],envelope_schema:null,resolver_schema:null,cron_schedule:null,execute_as:null}));return[...f,...V]},[n,i]),b=c.find(f=>f.workflow_type===x),w=new Set((k??[]).filter(f=>f.active).map(f=>f.workflow_type)),E="/workflows/executions";h.useEffect(()=>{c.length===1&&!r.get("type")&&m({type:c[0].workflow_type,mode:N},{replace:!0})},[c.length]);const y=f=>{const S={mode:f};x&&(S.type=x),m(S,{replace:!0})},v=f=>{m({type:f.workflow_type,mode:N},{replace:!0})};return a||u?e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:80,columnNumber:9},this),e.jsxDEV("div",{className:"h-40 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:81,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:79,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(H,{title:"Invoke Workflow",actions:e.jsxDEV(re,{mode:N,onChange:y},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:90,columnNumber:18},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:88,columnNumber:7},this),c.length===0?e.jsxDEV("div",{className:"py-16 text-center",children:[e.jsxDEV("p",{className:"text-sm text-text-primary mb-1",children:"No invocable workflows"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:95,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Mark workflows as invocable in the registry, or start the server with examples enabled."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:96,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:94,columnNumber:9},this):e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-12",children:[e.jsxDEV(oe,{configs:c,selectedType:x,onSelect:v,certifiedTypes:p},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:100,columnNumber:11},this),e.jsxDEV("div",{className:"lg:col-span-2",children:x&&b?N==="now"?e.jsxDEV(me,{selected:b,executionsPath:E},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:110,columnNumber:17},this):e.jsxDEV(fe,{selected:b,activeTypes:w},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:112,columnNumber:17},this):e.jsxDEV("div",{className:"py-16 text-center",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:"Select a workflow to begin"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:116,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:115,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:107,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:99,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/start/StartWorkflowPage.tsx",lineNumber:87,columnNumber:5},this)}function Ve(){return e.jsxDEV(he,{tier:"durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/start/DurableInvokePage.tsx",lineNumber:4,columnNumber:10},this)}export{Ve as DurableInvokePage,he as StartWorkflowPage};
6
- //# sourceMappingURL=index-CBF3ZvRZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CBF3ZvRZ.js","sources":["../../src/pages/workflows/start/ModeToggle.tsx","../../src/pages/workflows/start/WorkflowSelector.tsx","../../src/components/common/display/Pill.tsx","../../src/pages/workflows/start/helpers.ts","../../src/pages/workflows/start/IdentitySummary.tsx","../../src/pages/workflows/start/EnvelopeEditor.tsx","../../src/pages/workflows/start/StartNowPanel.tsx","../../src/pages/workflows/cron/helpers.tsx","../../src/pages/workflows/start/SchedulePanel.tsx","../../src/pages/workflows/start/StartWorkflowPage.tsx","../../src/pages/workflows/start/DurableInvokePage.tsx"],"sourcesContent":["import { Play, Clock } from 'lucide-react';\n\nexport type Mode = 'now' | 'schedule';\n\nexport function ModeToggle({ mode, onChange }: { mode: Mode; onChange: (m: Mode) => void }) {\n const btn = (m: Mode, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(m)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n mode === m\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('now', <Play className=\"w-3.5 h-3.5\" />, 'Start Now')}\n {btn('schedule', <Clock className=\"w-3.5 h-3.5\" />, 'Schedule')}\n </div>\n );\n}\n","import { Bot, ShieldCheck, Workflow } from 'lucide-react';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\nexport function WorkflowSelector({\n configs,\n selectedType,\n onSelect,\n certifiedTypes,\n}: {\n configs: LTWorkflowConfig[];\n selectedType: string;\n onSelect: (config: LTWorkflowConfig) => void;\n certifiedTypes: Set<string>;\n}) {\n return (\n <div>\n <SectionLabel className=\"mb-6\">Select Workflow</SectionLabel>\n <div>\n {configs.map((config) => {\n const isSelected = selectedType === config.workflow_type;\n const isCertified = certifiedTypes.has(config.workflow_type);\n return (\n <button\n key={config.workflow_type}\n onClick={() => onSelect(config)}\n className={`w-full text-left py-4 border-b border-surface-border transition-colors duration-150 ${\n isSelected\n ? 'border-l-2 border-l-accent pl-4'\n : 'pl-0 hover:text-text-primary'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {isCertified\n ? <ShieldCheck className=\"w-3.5 h-3.5 shrink-0 text-status-success\" />\n : <Workflow className=\"w-3.5 h-3.5 shrink-0 text-accent/75\" />}\n <p className={`text-sm font-mono ${isSelected ? 'font-medium text-accent' : 'text-text-secondary'}`}>\n {config.workflow_type}\n </p>\n {config.execute_as && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded\">\n <Bot className=\"w-2.5 h-2.5\" />\n {config.execute_as}\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-[11px] text-text-tertiary mt-1 leading-relaxed\">\n {config.description}\n </p>\n )}\n <p className=\"text-[10px] text-text-tertiary mt-1 opacity-60\">\n {config.task_queue}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\ninterface PillProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Pill({ children, className = '' }: PillProps) {\n return (\n <span className={`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${className}`}>\n {children}\n </span>\n );\n}\n","export const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n/** Infer a simple field type from a value. */\nexport function inferTypeFromValue(value: unknown): string {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'number') return 'number';\n if (Array.isArray(value)) return 'array';\n if (value !== null && typeof value === 'object') return 'object';\n return 'string';\n}\n\n/** Extract the data keys from an envelope_schema and their inferred types. */\nexport function extractDataFields(\n schema: Record<string, unknown> | null,\n): { key: string; type: string; defaultValue: unknown }[] {\n if (!schema) return [];\n const data = schema.data;\n if (!data || typeof data !== 'object') return [];\n return Object.entries(data as Record<string, unknown>).map(([key, value]) => ({\n key,\n type: inferTypeFromValue(value),\n defaultValue: value,\n }));\n}\n\n/** Build form field values from data object. */\nexport function dataToFields(data: Record<string, unknown>): Record<string, unknown> {\n return { ...data };\n}\n\n/** Build full envelope JSON string from form fields + metadata. */\nexport function fieldsToJson(\n fields: Record<string, unknown>,\n metadata: Record<string, unknown>,\n): string {\n return JSON.stringify({ data: fields, metadata }, null, 2);\n}\n","import { Bot, UserCircle } from 'lucide-react';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { useAuth } from '../../../hooks/useAuth';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\nexport function IdentitySummary({\n config,\n overrideBot,\n onOverrideChange,\n showOverride,\n}: {\n config: LTWorkflowConfig;\n overrideBot?: string;\n onOverrideChange?: (botExternalId: string) => void;\n showOverride?: boolean;\n}) {\n const { user } = useAuth();\n const effectiveBot = overrideBot || config.execute_as;\n\n return (\n <div className=\"bg-surface-sunken rounded-lg px-4 py-3 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider font-medium\">Running as</span>\n {effectiveBot && !overrideBot && (\n <span className=\"text-[9px] text-text-tertiary\">configured default</span>\n )}\n {overrideBot && (\n <span className=\"text-[9px] text-accent\">admin override</span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n {effectiveBot ? (\n <>\n <Bot className=\"w-3.5 h-3.5 text-accent/70\" />\n <span className=\"text-xs text-text-primary font-mono\">{effectiveBot}</span>\n </>\n ) : (\n <>\n <UserCircle className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-xs text-text-primary\">\n {user?.displayName || user?.username || 'you'}\n </span>\n </>\n )}\n </div>\n {showOverride && onOverrideChange && (\n <div className=\"pt-1 border-t border-surface-border\">\n <label className=\"text-[10px] text-text-tertiary mb-1 block\">Override identity</label>\n <BotPicker\n selected={overrideBot ?? ''}\n onChange={onOverrideChange}\n placeholder={config.execute_as ? `Default: ${config.execute_as}` : 'Invoking user (default)'}\n />\n </div>\n )}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\ninterface DataField {\n key: string;\n type: string;\n defaultValue: unknown;\n}\n\nexport function EnvelopeEditor({\n selectedConfig,\n isJsonMode,\n hasFormView,\n jsonInput,\n formFields,\n dataFields,\n onJsonChange,\n onToggleMode,\n onUpdateFormField,\n onSetFormFields,\n}: {\n selectedConfig: LTWorkflowConfig;\n isJsonMode: boolean;\n hasFormView: boolean;\n jsonInput: string;\n formFields: Record<string, unknown>;\n dataFields: DataField[];\n onJsonChange: (value: string) => void;\n onToggleMode: () => void;\n onUpdateFormField: (key: string, value: unknown, type: string) => void;\n onSetFormFields: (fields: Record<string, unknown>) => void;\n}) {\n return (\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <label className=\"block text-xs text-text-secondary\">\n Envelope\n </label>\n <div className=\"flex items-center gap-3\">\n {hasFormView && (\n <button\n type=\"button\"\n onClick={onToggleMode}\n className=\"text-[10px] text-accent hover:underline\"\n >\n {isJsonMode ? 'Form view' : 'JSON view'}\n </button>\n )}\n {selectedConfig.envelope_schema ? (\n <span className=\"text-[10px] text-accent\">\n Pre-filled from workflow config\n </span>\n ) : (\n <span className=\"text-[10px] text-status-warning\">\n No template\n </span>\n )}\n </div>\n </div>\n\n {!selectedConfig.envelope_schema && (\n <div className=\"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n This workflow has no input template. Edit the JSON directly below, or register it as a <Link to=\"/workflows/registry/new\" className=\"text-status-success hover:underline\">certified workflow</Link> in the Workflow Registry for pre-filled fields and form-based input.\n </p>\n </div>\n )}\n\n {isJsonMode || !hasFormView ? (\n /* JSON view */\n <textarea\n value={jsonInput}\n onChange={(e) => onJsonChange(e.target.value)}\n className=\"input font-mono text-xs\"\n rows={12}\n spellCheck={false}\n />\n ) : (\n /* Form view */\n <div className=\"space-y-3\">\n {dataFields.map(({ key, type }) => {\n const value = formFields[key];\n const jsonValue =\n typeof value === 'string'\n ? value\n : JSON.stringify(\n value ?? (type === 'array' ? [] : {}),\n null,\n 2,\n );\n const textareaRows = Math.min(\n 20,\n Math.max(4, (jsonValue?.split?.('\\n')?.length ?? 4)),\n );\n return (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {key}\n <span className=\"ml-2 font-normal normal-case\">\n {type}\n </span>\n </label>\n {type === 'boolean' ? (\n <select\n value={String(value ?? false)}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"select text-xs w-full\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : type === 'object' || type === 'array' ? (\n <textarea\n value={jsonValue}\n onChange={(e) => {\n try {\n onUpdateFormField(\n key,\n JSON.parse(e.target.value),\n type,\n );\n } catch {\n // Keep raw text without syncing to JSON\n onSetFormFields({\n ...formFields,\n [key]: e.target.value,\n });\n }\n }}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={textareaRows}\n spellCheck={false}\n />\n ) : (\n <input\n type={type === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"input text-xs w-full\"\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n <p className=\"text-[10px] text-text-tertiary mt-1.5\">\n The envelope wraps your workflow input. <code className=\"text-accent/80\">data</code> holds workflow-specific fields; <code className=\"text-accent/80\">metadata</code> is optional context.\n </p>\n </div>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useInvokeWorkflow } from '../../../api/workflows';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { Pill } from '../../../components/common/display/Pill';\nimport { useAuth } from '../../../hooks/useAuth';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport {\n DEFAULT_ENVELOPE,\n extractDataFields,\n dataToFields,\n fieldsToJson,\n} from './helpers';\nimport { IdentitySummary } from './IdentitySummary';\nimport { EnvelopeEditor } from './EnvelopeEditor';\n\nexport function StartNowPanel({ selected, executionsPath }: { selected: LTWorkflowConfig; executionsPath: string }) {\n const navigate = useNavigate();\n const { isSuperAdmin, hasRoleType } = useAuth();\n const isAdmin = isSuperAdmin || hasRoleType('admin');\n const invokeMutation = useInvokeWorkflow();\n const [jsonInput, setJsonInput] = useState(DEFAULT_ENVELOPE);\n const [parseError, setParseError] = useState('');\n const [formFields, setFormFields] = useState<Record<string, unknown>>({});\n const [isJsonMode, setIsJsonMode] = useState(false);\n const [overrideBot, setOverrideBot] = useState('');\n\n const dataFields = useMemo(\n () => extractDataFields(selected.envelope_schema ?? null),\n [selected.envelope_schema],\n );\n const hasFormView = dataFields.length > 0;\n\n const schemaMetadata = useMemo(() => {\n if (!selected.envelope_schema) return {};\n const md = selected.envelope_schema.metadata;\n return md && typeof md === 'object' ? (md as Record<string, unknown>) : {};\n }, [selected.envelope_schema]);\n\n useEffect(() => {\n setParseError('');\n invokeMutation.reset();\n\n const prefill = sessionStorage.getItem('lt:invoke:prefill');\n if (prefill) {\n sessionStorage.removeItem('lt:invoke:prefill');\n setJsonInput(prefill);\n try {\n const parsed = JSON.parse(prefill);\n const data = parsed?.data ?? parsed;\n if (data && typeof data === 'object') setFormFields(dataToFields(data));\n } catch { /* use as-is */ }\n setIsJsonMode(true);\n setOverrideBot('');\n return;\n }\n\n const json = selected.envelope_schema\n ? JSON.stringify(selected.envelope_schema, null, 2)\n : DEFAULT_ENVELOPE;\n setJsonInput(json);\n if (selected.envelope_schema?.data && typeof selected.envelope_schema.data === 'object') {\n setFormFields(dataToFields(selected.envelope_schema.data as Record<string, unknown>));\n } else {\n setFormFields({});\n }\n setIsJsonMode(!extractDataFields(selected.envelope_schema ?? null).length);\n setOverrideBot('');\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleToggleMode = () => {\n if (isJsonMode) {\n try {\n const parsed = JSON.parse(jsonInput);\n if (parsed.data && typeof parsed.data === 'object') setFormFields(dataToFields(parsed.data));\n } catch { /* keep existing */ }\n } else {\n setJsonInput(fieldsToJson(formFields, schemaMetadata));\n }\n setIsJsonMode(!isJsonMode);\n };\n\n const updateFormField = (key: string, value: unknown, type: string) => {\n let parsed = value;\n if (type === 'number') parsed = value === '' ? 0 : Number(value);\n else if (type === 'boolean') parsed = value === 'true' || value === true;\n const updated = { ...formFields, [key]: parsed };\n setFormFields(updated);\n setJsonInput(fieldsToJson(updated, schemaMetadata));\n };\n\n const handleInvoke = async () => {\n setParseError('');\n let envelope: Record<string, unknown>;\n try {\n envelope = JSON.parse(jsonInput);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n const { data, metadata } = envelope;\n if (!data || typeof data !== 'object') {\n setParseError('Envelope must include a \"data\" object');\n return;\n }\n try {\n await invokeMutation.mutateAsync({\n workflowType: selected.workflow_type,\n data: data as Record<string, unknown>,\n metadata: (metadata as Record<string, unknown>) ?? undefined,\n ...(overrideBot ? { execute_as: overrideBot } : {}),\n });\n navigate(executionsPath);\n } catch { /* error via mutation */ }\n };\n\n return (\n <div className=\"space-y-6\">\n <div>\n <div className=\"flex items-center justify-between\">\n <SectionLabel>{selected.workflow_type}</SectionLabel>\n <div className=\"flex gap-2\">\n {selected.roles.map((r) => (\n <Pill key={r}>{r}</Pill>\n ))}\n </div>\n </div>\n {selected.description && (\n <p className=\"text-sm text-text-secondary mt-2 leading-relaxed\">\n {selected.description}\n </p>\n )}\n </div>\n\n <IdentitySummary\n config={selected}\n overrideBot={overrideBot}\n onOverrideChange={setOverrideBot}\n showOverride={isAdmin}\n />\n\n <EnvelopeEditor\n selectedConfig={selected}\n isJsonMode={isJsonMode}\n hasFormView={hasFormView}\n jsonInput={jsonInput}\n formFields={formFields}\n dataFields={dataFields}\n onJsonChange={(v) => { setJsonInput(v); setParseError(''); }}\n onToggleMode={handleToggleMode}\n onUpdateFormField={updateFormField}\n onSetFormFields={setFormFields}\n />\n\n {parseError && <p className=\"text-xs text-status-error\">{parseError}</p>}\n {invokeMutation.error && <p className=\"text-xs text-status-error\">{invokeMutation.error.message}</p>}\n {invokeMutation.isSuccess && <p className=\"text-xs text-status-success\">Workflow started</p>}\n\n <button onClick={handleInvoke} disabled={invokeMutation.isPending} className=\"btn-primary\">\n {invokeMutation.isPending ? 'Starting...' : 'Start Workflow'}\n </button>\n </div>\n );\n}\n","import type { LTJob } from '../../../api/types';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\n// -- Cron descriptions -------------------------------------------------------\n\nconst CRON_DESCRIPTIONS: Record<string, string> = {\n '* * * * *': 'Every minute',\n '*/5 * * * *': 'Every 5 minutes',\n '*/15 * * * *': 'Every 15 minutes',\n '*/30 * * * *': 'Every 30 minutes',\n '0 * * * *': 'Every hour',\n '0 */2 * * *': 'Every 2 hours',\n '0 */6 * * *': 'Every 6 hours',\n '0 */12 * * *': 'Every 12 hours',\n '0 0 * * *': 'Daily at midnight',\n '0 9 * * *': 'Daily at 9 AM',\n '0 9 * * 1-5': 'Weekdays at 9 AM',\n '0 0 * * 0': 'Weekly (Sunday midnight)',\n '0 0 1 * *': 'Monthly (1st at midnight)',\n '0 2 * * *': 'Daily at 2 AM',\n};\n\nexport function describeCron(expr: string): string {\n return CRON_DESCRIPTIONS[expr] ?? '';\n}\n\nexport const COMMON_PATTERNS: [string, string][] = [\n ['*/15 * * * *', 'Every 15 min'],\n ['0 * * * *', 'Every hour'],\n ['0 */6 * * *', 'Every 6 hours'],\n ['0 9 * * *', 'Daily 9 AM'],\n ['0 9 * * 1-5', 'Weekdays 9 AM'],\n ['0 0 * * 0', 'Weekly (Sun)'],\n];\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n// -- Envelope helpers ---------------------------------------------------------\n\n/** Extract simple string/number/boolean keys from `data` for form view. */\nexport function extractFormFields(\n envelope: Record<string, unknown>,\n): { key: string; value: string; type: string }[] | null {\n const data = envelope?.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return null;\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return null;\n // Only show form if all values are scalar\n const allScalar = entries.every(\n ([, v]) => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || v === null,\n );\n if (!allScalar) return null;\n return entries.map(([key, value]) => ({\n key,\n value: value === null ? '' : String(value),\n type: value === null ? 'string' : typeof value,\n }));\n}\n\n// -- Recent jobs table columns ------------------------------------------------\n\nexport const jobColumns: Column<LTJob>[] = [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => (\n <span className=\"font-mono text-[11px] text-text-secondary\">\n {row.workflow_id.length > 40\n ? `${row.workflow_id.slice(0, 40)}...`\n : row.workflow_id}\n </span>\n ),\n },\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-28',\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-32',\n },\n];\n","import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Bot } from 'lucide-react';\nimport { useSetCronSchedule, useJobs } from '../../../api/workflows';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { Pill } from '../../../components/common/display/Pill';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport { DEFAULT_ENVELOPE } from './helpers';\nimport { describeCron, COMMON_PATTERNS, extractFormFields, jobColumns } from '../cron/helpers';\n\nexport function SchedulePanel({\n selected,\n activeTypes,\n}: {\n selected: LTWorkflowConfig;\n activeTypes: Set<string>;\n}) {\n const navigate = useNavigate();\n const setCron = useSetCronSchedule();\n\n const [cronInput, setCronInput] = useState('');\n const [envelopeInput, setEnvelopeInput] = useState('');\n const [envelopeError, setEnvelopeError] = useState('');\n const [viewMode, setViewMode] = useState<'json' | 'form'>('json');\n\n const defaultEnvelope = useMemo(() => {\n if (!selected?.envelope_schema) return DEFAULT_ENVELOPE;\n return JSON.stringify(selected.envelope_schema, null, 2);\n }, [selected?.envelope_schema]);\n\n const isEnvelopeModified = envelopeInput !== defaultEnvelope;\n\n const parsedEnvelope = useMemo(() => {\n try {\n return JSON.parse(envelopeInput) as Record<string, unknown>;\n } catch {\n return null;\n }\n }, [envelopeInput]);\n\n const formFields = useMemo(\n () => (parsedEnvelope ? extractFormFields(parsedEnvelope) : null),\n [parsedEnvelope],\n );\n\n useEffect(() => {\n setCronInput(selected.cron_schedule ?? '');\n setEnvelopeInput(\n selected.envelope_schema\n ? JSON.stringify(selected.envelope_schema, null, 2)\n : DEFAULT_ENVELOPE,\n );\n setEnvelopeError('');\n setViewMode('json');\n setCron.reset();\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const { data: jobsData, isLoading: jobsLoading } = useJobs({\n entity: selected.workflow_type,\n limit: 10,\n });\n\n const handleSave = () => {\n let envelopeSchema: Record<string, unknown> | undefined;\n try {\n envelopeSchema = JSON.parse(envelopeInput);\n } catch {\n setEnvelopeError('Invalid JSON in envelope');\n return;\n }\n setEnvelopeError('');\n setCron.mutate({\n config: selected,\n cron_schedule: cronInput.trim() || null,\n envelope_schema: envelopeSchema,\n });\n };\n\n const handleClear = () => {\n setCronInput('');\n setCron.mutate({ config: selected, cron_schedule: null });\n };\n\n const handleResetEnvelope = () => {\n setEnvelopeInput(defaultEnvelope);\n setEnvelopeError('');\n };\n\n const handleFormFieldChange = (key: string, value: string) => {\n if (!parsedEnvelope) return;\n const data = { ...((parsedEnvelope.data as Record<string, unknown>) ?? {}) };\n const original = data[key];\n if (typeof original === 'number') data[key] = value === '' ? 0 : Number(value);\n else if (typeof original === 'boolean') data[key] = value === 'true';\n else data[key] = value;\n setEnvelopeInput(JSON.stringify({ ...parsedEnvelope, data }, null, 2));\n };\n\n return (\n <div className=\"space-y-8\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-3\">\n <SectionLabel>{selected.workflow_type}</SectionLabel>\n {selected.cron_schedule && (\n <Pill className={activeTypes.has(selected.workflow_type)\n ? 'bg-status-success/10 text-status-success'\n : 'bg-surface-sunken text-text-tertiary'\n }>\n {activeTypes.has(selected.workflow_type) ? 'active' : 'inactive'}\n </Pill>\n )}\n </div>\n {selected.description && (\n <p className=\"text-xs text-text-tertiary mt-2 leading-relaxed\">\n {selected.description}\n </p>\n )}\n </div>\n\n {/* Cron execution identity */}\n <div className=\"bg-surface-sunken rounded-lg px-4 py-3\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mr-2\">Cron runs as</span>\n <Bot className=\"w-3.5 h-3.5 text-accent/70\" />\n <span className=\"text-xs text-text-primary font-mono\">\n {selected.execute_as ?? 'lt-system'}\n </span>\n {!selected.execute_as && (\n <span className=\"text-[9px] text-text-tertiary ml-1\">system bot</span>\n )}\n </div>\n </div>\n\n {/* Cron editor */}\n <div>\n <SectionLabel className=\"mb-3\">Schedule</SectionLabel>\n <div className=\"flex gap-3 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={cronInput}\n onChange={(e) => { setCronInput(e.target.value); setCron.reset(); }}\n placeholder=\"0 */6 * * *\"\n className=\"input font-mono text-sm w-full\"\n />\n {cronInput.trim() && describeCron(cronInput.trim()) && (\n <p className=\"text-xs text-text-secondary mt-1.5\">\n {describeCron(cronInput.trim())}\n </p>\n )}\n </div>\n <button onClick={handleSave} disabled={setCron.isPending} className=\"btn-primary text-xs shrink-0\">\n {setCron.isPending ? 'Saving...' : 'Save'}\n </button>\n {selected.cron_schedule && (\n <button onClick={handleClear} disabled={setCron.isPending} className=\"btn-ghost text-xs text-status-error shrink-0\">\n Clear\n </button>\n )}\n </div>\n {setCron.isSuccess && <p className=\"text-[10px] text-status-success mt-2\">Schedule updated</p>}\n {setCron.error && <p className=\"text-[10px] text-status-error mt-2\">{setCron.error.message}</p>}\n </div>\n\n {/* Common patterns */}\n <div className=\"bg-surface-sunken rounded-lg p-4\">\n <SectionLabel className=\"mb-2\">Common Patterns</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5\">\n {COMMON_PATTERNS.map(([expr, desc]) => (\n <button\n key={expr}\n type=\"button\"\n onClick={() => { setCronInput(expr); setCron.reset(); }}\n className=\"flex items-center gap-2 text-left py-0.5 group\"\n >\n <code className=\"font-mono text-[11px] text-accent group-hover:text-accent-hover\">{expr}</code>\n <span className=\"text-[10px] text-text-tertiary\">{desc}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Cron Envelope editor */}\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <SectionLabel>Cron Envelope</SectionLabel>\n <div className=\"flex items-center gap-3\">\n {isEnvelopeModified && (\n <button type=\"button\" onClick={handleResetEnvelope} className=\"text-[10px] text-status-warning hover:text-status-warning/80 transition-colors\">\n Reset to default\n </button>\n )}\n {formFields && (\n <div className=\"flex rounded overflow-hidden border border-surface-border\">\n <button type=\"button\" onClick={() => setViewMode('form')} className={`px-2 py-0.5 text-[10px] transition-colors ${viewMode === 'form' ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-text-secondary'}`}>Form</button>\n <button type=\"button\" onClick={() => setViewMode('json')} className={`px-2 py-0.5 text-[10px] transition-colors ${viewMode === 'json' ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-text-secondary'}`}>JSON</button>\n </div>\n )}\n </div>\n </div>\n <p className=\"text-[10px] text-text-tertiary mb-3\">\n This envelope is sent as the workflow input on each cron invocation.\n </p>\n\n {viewMode === 'form' && formFields ? (\n <div className=\"space-y-3\">\n {formFields.map(({ key, value, type }) => (\n <div key={key}>\n <label className=\"block text-[11px] text-text-secondary mb-1 font-mono\">{key}</label>\n {type === 'boolean' ? (\n <select value={value} onChange={(e) => handleFormFieldChange(key, e.target.value)} className=\"input text-xs w-full\">\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input type={type === 'number' ? 'number' : 'text'} value={value} onChange={(e) => handleFormFieldChange(key, e.target.value)} className=\"input text-xs font-mono w-full\" />\n )}\n </div>\n ))}\n </div>\n ) : (\n <textarea\n value={envelopeInput}\n onChange={(e) => { setEnvelopeInput(e.target.value); setEnvelopeError(''); }}\n className=\"input font-mono text-xs w-full\"\n rows={10}\n spellCheck={false}\n />\n )}\n\n {envelopeError && <p className=\"text-[10px] text-status-error mt-2\">{envelopeError}</p>}\n {isEnvelopeModified && <p className=\"text-[10px] text-accent mt-1.5\">Envelope has been customized. Changes will be saved with the schedule.</p>}\n </div>\n\n {/* Recent executions */}\n <div>\n <SectionLabel className=\"mb-3\">Recent Executions</SectionLabel>\n <DataTable\n columns={jobColumns}\n data={jobsData?.jobs ?? []}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={jobsLoading}\n emptyMessage=\"No executions yet\"\n />\n </div>\n </div>\n );\n}\n","import { useEffect, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { useWorkflowConfigs, useDiscoveredWorkflows, useCronStatus } from '../../../api/workflows';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport { ModeToggle } from './ModeToggle';\nimport type { Mode } from './ModeToggle';\nimport { WorkflowSelector } from './WorkflowSelector';\nimport { StartNowPanel } from './StartNowPanel';\nimport { SchedulePanel } from './SchedulePanel';\n\nexport type InvokeTier = 'certified' | 'durable';\n\nexport function StartWorkflowPage({ tier: _tier }: { tier?: InvokeTier }) {\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: configsData, isLoading } = useWorkflowConfigs();\n const { data: discoveredData, isLoading: discoveredLoading } = useDiscoveredWorkflows();\n const { data: cronEntries } = useCronStatus();\n\n const mode = (searchParams.get('mode') as Mode) || 'now';\n const selectedType = searchParams.get('type') ?? '';\n\n const configs: LTWorkflowConfig[] = configsData ?? [];\n\n const certifiedTypes = useMemo(\n () => new Set(configs.filter((c) => c.invocable).map((c) => c.workflow_type)),\n [configs],\n );\n\n const invocableConfigs = useMemo(() => {\n const certified = configs.filter((c) => c.invocable);\n const registeredTypes = new Set(configs.map((c) => c.workflow_type));\n const discovered = discoveredData ?? [];\n const durable = discovered\n .filter((dw) => dw.active && !registeredTypes.has(dw.workflow_type))\n .map((dw) => ({\n workflow_type: dw.workflow_type,\n task_queue: dw.task_queue ?? '',\n invocable: true,\n description: null,\n default_role: 'reviewer',\n roles: [],\n invocation_roles: [],\n consumes: [],\n envelope_schema: null,\n resolver_schema: null,\n cron_schedule: null,\n execute_as: null,\n } satisfies LTWorkflowConfig));\n return [...certified, ...durable];\n }, [configs, discoveredData]);\n\n const selectedConfig = invocableConfigs.find((c) => c.workflow_type === selectedType);\n\n const activeTypes = new Set(\n (cronEntries ?? []).filter((e) => e.active).map((e) => e.workflow_type),\n );\n\n const executionsPath = '/workflows/executions';\n\n useEffect(() => {\n if (invocableConfigs.length === 1 && !searchParams.get('type')) {\n setSearchParams({ type: invocableConfigs[0].workflow_type, mode }, { replace: true });\n }\n }, [invocableConfigs.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const setMode = (m: Mode) => {\n const params: Record<string, string> = { mode: m };\n if (selectedType) params.type = selectedType;\n setSearchParams(params, { replace: true });\n };\n\n const handleSelect = (config: LTWorkflowConfig) => {\n setSearchParams({ type: config.workflow_type, mode }, { replace: true });\n };\n\n if (isLoading || discoveredLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"Invoke Workflow\"\n actions={<ModeToggle mode={mode} onChange={setMode} />}\n />\n\n {invocableConfigs.length === 0 ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-primary mb-1\">No invocable workflows</p>\n <p className=\"text-xs text-text-tertiary\">Mark workflows as invocable in the registry, or start the server with examples enabled.</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-12\">\n <WorkflowSelector\n configs={invocableConfigs}\n selectedType={selectedType}\n onSelect={handleSelect}\n certifiedTypes={certifiedTypes}\n />\n\n <div className=\"lg:col-span-2\">\n {selectedType && selectedConfig ? (\n mode === 'now' ? (\n <StartNowPanel selected={selectedConfig} executionsPath={executionsPath} />\n ) : (\n <SchedulePanel selected={selectedConfig} activeTypes={activeTypes} />\n )\n ) : (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n Select a workflow to begin\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { StartWorkflowPage } from './StartWorkflowPage';\n\nexport function DurableInvokePage() {\n return <StartWorkflowPage tier=\"durable\" />;\n}\n"],"names":["ModeToggle","mode","onChange","btn","m","icon","label","jsxDEV","Play","Clock","WorkflowSelector","configs","selectedType","onSelect","certifiedTypes","SectionLabel","config","isSelected","isCertified","ShieldCheck","Workflow","Bot","Pill","children","className","DEFAULT_ENVELOPE","inferTypeFromValue","value","extractDataFields","schema","data","key","dataToFields","fieldsToJson","fields","metadata","IdentitySummary","overrideBot","onOverrideChange","showOverride","user","useAuth","effectiveBot","Fragment","UserCircle","BotPicker","EnvelopeEditor","selectedConfig","isJsonMode","hasFormView","jsonInput","formFields","dataFields","onJsonChange","onToggleMode","onUpdateFormField","onSetFormFields","Link","e","type","jsonValue","textareaRows","_b","_a","StartNowPanel","selected","executionsPath","navigate","useNavigate","isSuperAdmin","hasRoleType","isAdmin","invokeMutation","useInvokeWorkflow","setJsonInput","useState","parseError","setParseError","setFormFields","setIsJsonMode","setOverrideBot","useMemo","schemaMetadata","md","useEffect","prefill","parsed","json","handleToggleMode","updateFormField","updated","handleInvoke","envelope","r","v","CRON_DESCRIPTIONS","describeCron","expr","COMMON_PATTERNS","extractFormFields","entries","jobColumns","row","this","StatusBadge","TimeAgo","SchedulePanel","activeTypes","setCron","useSetCronSchedule","cronInput","setCronInput","envelopeInput","setEnvelopeInput","envelopeError","setEnvelopeError","viewMode","setViewMode","defaultEnvelope","isEnvelopeModified","parsedEnvelope","jobsData","jobsLoading","useJobs","handleSave","envelopeSchema","handleClear","handleResetEnvelope","handleFormFieldChange","original","desc","DataTable","StartWorkflowPage","_tier","searchParams","setSearchParams","useSearchParams","configsData","isLoading","useWorkflowConfigs","discoveredData","discoveredLoading","useDiscoveredWorkflows","cronEntries","useCronStatus","c","invocableConfigs","certified","registeredTypes","durable","dw","setMode","params","handleSelect","PageHeader","DurableInvokePage"],"mappings":"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"}