@hotmeshio/long-tail 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/build/api/agents.d.ts +1 -1
  2. package/build/api/agents.js +1 -1
  3. package/build/api/controlplane.d.ts +33 -0
  4. package/build/api/controlplane.js +46 -0
  5. package/build/bin/ltc.js +16 -0
  6. package/build/lib/cli/commands/streams.d.ts +20 -0
  7. package/build/lib/cli/commands/streams.js +134 -0
  8. package/build/lib/db/schemas/003_agents.sql +1 -2
  9. package/build/lib/db/schemas/004_agent_subscriptions.sql +1 -1
  10. package/build/routes/agents.js +3 -3
  11. package/build/routes/controlplane.js +28 -0
  12. package/build/sdk/index.d.ts +1 -0
  13. package/build/sdk/index.js +1 -0
  14. package/build/services/agent/index.d.ts +2 -3
  15. package/build/services/agent/index.js +5 -12
  16. package/build/services/agent/sql.d.ts +3 -4
  17. package/build/services/agent/sql.js +16 -20
  18. package/build/services/agent/subscription-sql.d.ts +1 -1
  19. package/build/services/agent/subscription-sql.js +1 -1
  20. package/build/services/agent/trigger-registry.js +1 -1
  21. package/build/services/controlplane/index.d.ts +9 -1
  22. package/build/services/controlplane/index.js +39 -0
  23. package/build/services/controlplane/stream-messages-sql.d.ts +21 -0
  24. package/build/services/controlplane/stream-messages-sql.js +108 -0
  25. package/build/services/controlplane/types.d.ts +44 -0
  26. package/build/services/cron/index.js +5 -5
  27. package/build/services/export/post-process.js +14 -6
  28. package/build/services/mcp-runs/execution-builder.js +9 -4
  29. package/build/services/topics/index.js +1 -4
  30. package/build/services/topics/sql.d.ts +2 -2
  31. package/build/services/topics/sql.js +9 -2
  32. package/build/services/topics/system-topics.js +2 -3
  33. package/build/start/workers.js +11 -14
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/types/agent.d.ts +1 -1
  36. package/dashboard/dist/assets/AdminDashboard-CR0FtTE6.js +2 -0
  37. package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js.map → AdminDashboard-CR0FtTE6.js.map} +1 -1
  38. package/dashboard/dist/assets/AgentConfigPage-BVypgq9m.js +13 -0
  39. package/dashboard/dist/assets/AgentConfigPage-BVypgq9m.js.map +1 -0
  40. package/dashboard/dist/assets/AgentDetailPage-D64ath8c.js +4 -0
  41. package/dashboard/dist/assets/AgentDetailPage-D64ath8c.js.map +1 -0
  42. package/dashboard/dist/assets/AgentsPage-j-zblMNR.js +2 -0
  43. package/dashboard/dist/assets/AgentsPage-j-zblMNR.js.map +1 -0
  44. package/dashboard/dist/assets/AvailableEscalationsPage-DmUid1h0.js +2 -0
  45. package/dashboard/dist/assets/{AvailableEscalationsPage-DdrzePy4.js.map → AvailableEscalationsPage-DmUid1h0.js.map} +1 -1
  46. package/dashboard/dist/assets/BotPicker-DCScT8BN.js +2 -0
  47. package/dashboard/dist/assets/{BotPicker-kKBifD1w.js.map → BotPicker-DCScT8BN.js.map} +1 -1
  48. package/dashboard/dist/assets/CapabilitiesPage-g5iUvHRL.js +2 -0
  49. package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-g5iUvHRL.js.map} +1 -1
  50. package/dashboard/dist/assets/CollapsibleSection-Dj1YOsVG.js +2 -0
  51. package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js.map → CollapsibleSection-Dj1YOsVG.js.map} +1 -1
  52. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
  53. package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
  54. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
  55. package/dashboard/dist/assets/{CopyableId-B4CL12pv.js.map → CopyableId-DmLF-RqZ.js.map} +1 -1
  56. package/dashboard/dist/assets/CredentialsPage-Dvb4QelY.js +2 -0
  57. package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-Dvb4QelY.js.map} +1 -1
  58. package/dashboard/dist/assets/CronLabel-sk1BkcJd.js +2 -0
  59. package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js.map → CronLabel-sk1BkcJd.js.map} +1 -1
  60. package/dashboard/dist/assets/CustomDurationPicker-C0MV2Q06.js +2 -0
  61. package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js.map → CustomDurationPicker-C0MV2Q06.js.map} +1 -1
  62. package/dashboard/dist/assets/DataTable-D9yuBv0w.js +2 -0
  63. package/dashboard/dist/assets/{DataTable-J5R6mepB.js.map → DataTable-D9yuBv0w.js.map} +1 -1
  64. package/dashboard/dist/assets/DropZone-DN8uwUtf.js +2 -0
  65. package/dashboard/dist/assets/{DropZone-DwNj3GiG.js.map → DropZone-DN8uwUtf.js.map} +1 -1
  66. package/dashboard/dist/assets/ElapsedCell-CFXhhKKc.js +2 -0
  67. package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js.map → ElapsedCell-CFXhhKKc.js.map} +1 -1
  68. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
  69. package/dashboard/dist/assets/{EmptyState-BXGvOADa.js.map → EmptyState-BcsfPq9T.js.map} +1 -1
  70. package/dashboard/dist/assets/EscalationsOverview-BEuUFGwC.js +2 -0
  71. package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js.map → EscalationsOverview-BEuUFGwC.js.map} +1 -1
  72. package/dashboard/dist/assets/EventTable-DcwVWOKb.js +2 -0
  73. package/dashboard/dist/assets/{EventTable-CvJ98E8s.js.map → EventTable-DcwVWOKb.js.map} +1 -1
  74. package/dashboard/dist/assets/EventTopicPill-CWCP1v1O.js +2 -0
  75. package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js.map → EventTopicPill-CWCP1v1O.js.map} +1 -1
  76. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
  77. package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
  78. package/dashboard/dist/assets/HomePage-BH-F5ws9.js +2 -0
  79. package/dashboard/dist/assets/HomePage-BH-F5ws9.js.map +1 -0
  80. package/dashboard/dist/assets/ListToolbar-CUxJlz__.js +2 -0
  81. package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js.map → ListToolbar-CUxJlz__.js.map} +1 -1
  82. package/dashboard/dist/assets/McpOverview-O8XrOzy0.js +2 -0
  83. package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js.map → McpOverview-O8XrOzy0.js.map} +1 -1
  84. package/dashboard/dist/assets/McpQueryDetailPage-DhiR0Xrx.js +5 -0
  85. package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js.map → McpQueryDetailPage-DhiR0Xrx.js.map} +1 -1
  86. package/dashboard/dist/assets/McpQueryPage-Czot0nfl.js +2 -0
  87. package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js.map → McpQueryPage-Czot0nfl.js.map} +1 -1
  88. package/dashboard/dist/assets/McpRunDetailPage-B1kNnD_t.js +2 -0
  89. package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js.map → McpRunDetailPage-B1kNnD_t.js.map} +1 -1
  90. package/dashboard/dist/assets/McpRunsPage-QUY3pWp9.js +2 -0
  91. package/dashboard/dist/assets/McpRunsPage-QUY3pWp9.js.map +1 -0
  92. package/dashboard/dist/assets/Modal-DEODGeqx.js +2 -0
  93. package/dashboard/dist/assets/{Modal-C6k6_5KB.js.map → Modal-DEODGeqx.js.map} +1 -1
  94. package/dashboard/dist/assets/OperatorDashboard-BG1Q9qZk.js +2 -0
  95. package/dashboard/dist/assets/{OperatorDashboard-e5N3_dVl.js.map → OperatorDashboard-BG1Q9qZk.js.map} +1 -1
  96. package/dashboard/dist/assets/PageHeader-DlzOOM4Y.js +2 -0
  97. package/dashboard/dist/assets/{PageHeader-COcgWWf-.js.map → PageHeader-DlzOOM4Y.js.map} +1 -1
  98. package/dashboard/dist/assets/PageHeaderWithStats-C5cZ3IOO.js +2 -0
  99. package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js.map → PageHeaderWithStats-C5cZ3IOO.js.map} +1 -1
  100. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
  101. package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
  102. package/dashboard/dist/assets/ProcessDetailPage-DS1AwTso.js +2 -0
  103. package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js.map → ProcessDetailPage-DS1AwTso.js.map} +1 -1
  104. package/dashboard/dist/assets/ProcessesListPage-CAmVcn1P.js +2 -0
  105. package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js.map → ProcessesListPage-CAmVcn1P.js.map} +1 -1
  106. package/dashboard/dist/assets/RolePill-BZaUpkHg.js +2 -0
  107. package/dashboard/dist/assets/{RolePill-CHwys1f9.js.map → RolePill-BZaUpkHg.js.map} +1 -1
  108. package/dashboard/dist/assets/RolesPage-CFdIXfmv.js +2 -0
  109. package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js.map → RolesPage-CFdIXfmv.js.map} +1 -1
  110. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
  111. package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
  112. package/dashboard/dist/assets/RunAsSelector-BGww9lta.js +2 -0
  113. package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js.map → RunAsSelector-BGww9lta.js.map} +1 -1
  114. package/dashboard/dist/assets/ServerName-DfS3pfon.js +2 -0
  115. package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js.map → ServerName-DfS3pfon.js.map} +1 -1
  116. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
  117. package/dashboard/dist/assets/{StatCard-OKzRSSx4.js.map → StatCard-DlgF0CJC.js.map} +1 -1
  118. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +2 -0
  119. package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js.map → StatusBadge-XQlNFwmH.js.map} +1 -1
  120. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +2 -0
  121. package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
  122. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
  123. package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js.map → StickyPagination-F9FZsRy9.js.map} +1 -1
  124. package/dashboard/dist/assets/SwimlaneTimeline-C2hGjy0V.js +2 -0
  125. package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js.map → SwimlaneTimeline-C2hGjy0V.js.map} +1 -1
  126. package/dashboard/dist/assets/TagInput-D21mrQx6.js +2 -0
  127. package/dashboard/dist/assets/{TagInput-BGxXKiWD.js.map → TagInput-D21mrQx6.js.map} +1 -1
  128. package/dashboard/dist/assets/TaskDetailPage-B49WQj8W.js +2 -0
  129. package/dashboard/dist/assets/TaskDetailPage-B49WQj8W.js.map +1 -0
  130. package/dashboard/dist/assets/TaskQueuePill-D8UMH1rd.js +2 -0
  131. package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js.map → TaskQueuePill-D8UMH1rd.js.map} +1 -1
  132. package/dashboard/dist/assets/TasksListPage-CJB-EvKX.js +2 -0
  133. package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js.map → TasksListPage-CJB-EvKX.js.map} +1 -1
  134. package/dashboard/dist/assets/TimeAgo-CnjY3XDt.js +2 -0
  135. package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js.map → TimeAgo-CnjY3XDt.js.map} +1 -1
  136. package/dashboard/dist/assets/TimestampCell-u1YA8eA3.js +2 -0
  137. package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js.map → TimestampCell-u1YA8eA3.js.map} +1 -1
  138. package/dashboard/dist/assets/ToolPill-Dmcwmqh2.js +2 -0
  139. package/dashboard/dist/assets/{ToolPill-DdLN3JOT.js.map → ToolPill-Dmcwmqh2.js.map} +1 -1
  140. package/dashboard/dist/assets/ToolTestPanel-B1T4Hk0t.js +2 -0
  141. package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js.map → ToolTestPanel-B1T4Hk0t.js.map} +1 -1
  142. package/dashboard/dist/assets/TopicDetailPage-ClibbST4.js +9 -0
  143. package/dashboard/dist/assets/TopicDetailPage-ClibbST4.js.map +1 -0
  144. package/dashboard/dist/assets/TopicsPage-KjODhitc.js +2 -0
  145. package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js.map → TopicsPage-KjODhitc.js.map} +1 -1
  146. package/dashboard/dist/assets/UserName-DVqimwsO.js +2 -0
  147. package/dashboard/dist/assets/{UserName-CLbusknU.js.map → UserName-DVqimwsO.js.map} +1 -1
  148. package/dashboard/dist/assets/WorkflowExecutionPage-DYNPy7Gk.js +2 -0
  149. package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js.map → WorkflowExecutionPage-DYNPy7Gk.js.map} +1 -1
  150. package/dashboard/dist/assets/WorkflowPill-h43nlUmM.js +2 -0
  151. package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js.map → WorkflowPill-h43nlUmM.js.map} +1 -1
  152. package/dashboard/dist/assets/WorkflowsDashboard-DdJm6X7x.js +2 -0
  153. package/dashboard/dist/assets/{WorkflowsDashboard-BWiUNvyl.js.map → WorkflowsDashboard-DdJm6X7x.js.map} +1 -1
  154. package/dashboard/dist/assets/WorkflowsOverview-CBOYkfpD.js +2 -0
  155. package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js.map → WorkflowsOverview-CBOYkfpD.js.map} +1 -1
  156. package/dashboard/dist/assets/YamlWorkflowsPage-BZnD_hMw.js +2 -0
  157. package/dashboard/dist/assets/{YamlWorkflowsPage-CLebf2eL.js.map → YamlWorkflowsPage-BZnD_hMw.js.map} +1 -1
  158. package/dashboard/dist/assets/{agents-Dga6NU7U.js → agents-oHMkS1GD.js} +2 -2
  159. package/dashboard/dist/assets/agents-oHMkS1GD.js.map +1 -0
  160. package/dashboard/dist/assets/{bots-CtU4i4OQ.js → bots-BispbsY3.js} +2 -2
  161. package/dashboard/dist/assets/{bots-CtU4i4OQ.js.map → bots-BispbsY3.js.map} +1 -1
  162. package/dashboard/dist/assets/{controlplane-BVoALhbL.js → controlplane-CIbrx5rX.js} +2 -2
  163. package/dashboard/dist/assets/{controlplane-BVoALhbL.js.map → controlplane-CIbrx5rX.js.map} +1 -1
  164. package/dashboard/dist/assets/escalation-columns-Dh_0iVTH.js +2 -0
  165. package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js.map → escalation-columns-Dh_0iVTH.js.map} +1 -1
  166. package/dashboard/dist/assets/escalation-qhj4TxA3.js +2 -0
  167. package/dashboard/dist/assets/{escalation-_N5GfuIi.js.map → escalation-qhj4TxA3.js.map} +1 -1
  168. package/dashboard/dist/assets/helpers-BYw1qqKV.js +2 -0
  169. package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js.map → helpers-BYw1qqKV.js.map} +1 -1
  170. package/dashboard/dist/assets/index-B9t_vpam.js +2 -0
  171. package/dashboard/dist/assets/{index-Dpjguclc.js.map → index-B9t_vpam.js.map} +1 -1
  172. package/dashboard/dist/assets/index-Bh9g-EOF.js +2 -0
  173. package/dashboard/dist/assets/{index-CS61sh5q.js.map → index-Bh9g-EOF.js.map} +1 -1
  174. package/dashboard/dist/assets/index-BhhWCADo.js +63 -0
  175. package/dashboard/dist/assets/index-BhhWCADo.js.map +1 -0
  176. package/dashboard/dist/assets/index-Bn-VSH41.js +2 -0
  177. package/dashboard/dist/assets/index-Bn-VSH41.js.map +1 -0
  178. package/dashboard/dist/assets/index-C2yJWps6.js +6 -0
  179. package/dashboard/dist/assets/{index-B9ealjkt.js.map → index-C2yJWps6.js.map} +1 -1
  180. package/dashboard/dist/assets/index-C4W1_Rfk.js +5 -0
  181. package/dashboard/dist/assets/{index-CtbG3UN-.js.map → index-C4W1_Rfk.js.map} +1 -1
  182. package/dashboard/dist/assets/index-CEF3Idec.js +2 -0
  183. package/dashboard/dist/assets/{index-6Kd78p_v.js.map → index-CEF3Idec.js.map} +1 -1
  184. package/dashboard/dist/assets/index-CHxvfc97.css +1 -0
  185. package/dashboard/dist/assets/index-CVRVw3g_.js +2 -0
  186. package/dashboard/dist/assets/{index-dM-OgCY3.js.map → index-CVRVw3g_.js.map} +1 -1
  187. package/dashboard/dist/assets/index-CY3EhrEA.js +2 -0
  188. package/dashboard/dist/assets/{index-QicYdUsl.js.map → index-CY3EhrEA.js.map} +1 -1
  189. package/dashboard/dist/assets/index-D-q2lzup.js +2 -0
  190. package/dashboard/dist/assets/{index-DWUunWxh.js.map → index-D-q2lzup.js.map} +1 -1
  191. package/dashboard/dist/assets/index-D6YjH5uG.js +15 -0
  192. package/dashboard/dist/assets/{index-BYwPVJv0.js.map → index-D6YjH5uG.js.map} +1 -1
  193. package/dashboard/dist/assets/index-ht5r_7jQ.js +2 -0
  194. package/dashboard/dist/assets/index-ht5r_7jQ.js.map +1 -0
  195. package/dashboard/dist/assets/index-zHicKKh9.js +2 -0
  196. package/dashboard/dist/assets/{index-D_H_Prht.js.map → index-zHicKKh9.js.map} +1 -1
  197. package/dashboard/dist/assets/{knowledge-DJlebU82.js → knowledge-B23TU6JN.js} +2 -2
  198. package/dashboard/dist/assets/{knowledge-DJlebU82.js.map → knowledge-B23TU6JN.js.map} +1 -1
  199. package/dashboard/dist/assets/{mcp-CsLJ5SRm.js → mcp-Cew_Sb-Q.js} +2 -2
  200. package/dashboard/dist/assets/{mcp-CsLJ5SRm.js.map → mcp-Cew_Sb-Q.js.map} +1 -1
  201. package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js → mcp-query-So0Oz5Lx.js} +2 -2
  202. package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js.map → mcp-query-So0Oz5Lx.js.map} +1 -1
  203. package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js → mcp-runs-4176y3SA.js} +2 -2
  204. package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js.map → mcp-runs-4176y3SA.js.map} +1 -1
  205. package/dashboard/dist/assets/namespaces-CqBbWsJx.js +2 -0
  206. package/dashboard/dist/assets/{namespaces-iRejH3_A.js.map → namespaces-CqBbWsJx.js.map} +1 -1
  207. package/dashboard/dist/assets/{roles-3Jm5KtKc.js → roles-BTxMgLE6.js} +2 -2
  208. package/dashboard/dist/assets/{roles-3Jm5KtKc.js.map → roles-BTxMgLE6.js.map} +1 -1
  209. package/dashboard/dist/assets/settings-CtQNxacL.js +2 -0
  210. package/dashboard/dist/assets/{settings-DmN2I-c6.js.map → settings-CtQNxacL.js.map} +1 -1
  211. package/dashboard/dist/assets/{tasks-Cc-QoITQ.js → tasks-CIRlUTbo.js} +2 -2
  212. package/dashboard/dist/assets/{tasks-Cc-QoITQ.js.map → tasks-CIRlUTbo.js.map} +1 -1
  213. package/dashboard/dist/assets/{topics-p8anbgi0.js → topics-C8YmK_j2.js} +2 -2
  214. package/dashboard/dist/assets/topics-C8YmK_j2.js.map +1 -0
  215. package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js → useEventHooks-BvMUy36X.js} +2 -2
  216. package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js.map → useEventHooks-BvMUy36X.js.map} +1 -1
  217. package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js → useExpandedRows-CkcEntB-.js} +2 -2
  218. package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js.map → useExpandedRows-CkcEntB-.js.map} +1 -1
  219. package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js → useFilterParams-DZCAaBC7.js} +2 -2
  220. package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js.map → useFilterParams-DZCAaBC7.js.map} +1 -1
  221. package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js → useYamlActivityEvents-DLEzqv-z.js} +2 -2
  222. package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js.map → useYamlActivityEvents-DLEzqv-z.js.map} +1 -1
  223. package/dashboard/dist/assets/{users-oXOlnold.js → users-C_bD6mzW.js} +2 -2
  224. package/dashboard/dist/assets/{users-oXOlnold.js.map → users-C_bD6mzW.js.map} +1 -1
  225. package/dashboard/dist/assets/{vendor-icons-CBOM6Es0.js → vendor-icons-DY1ctJgc.js} +111 -101
  226. package/dashboard/dist/assets/vendor-icons-DY1ctJgc.js.map +1 -0
  227. package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
  228. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
  229. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +22 -0
  230. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +1 -0
  231. package/dashboard/dist/assets/{workflows-Yq7cK-vR.js → workflows-DFR0-hI3.js} +2 -2
  232. package/dashboard/dist/assets/{workflows-Yq7cK-vR.js.map → workflows-DFR0-hI3.js.map} +1 -1
  233. package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js → yaml-workflows-wXURdyjP.js} +2 -2
  234. package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js.map → yaml-workflows-wXURdyjP.js.map} +1 -1
  235. package/dashboard/dist/index.html +5 -5
  236. package/docs/agents.md +1 -1
  237. package/docs/api/http/agents.md +5 -7
  238. package/docs/api/http/controlplane.md +193 -0
  239. package/docs/api/sdk/agents.md +5 -5
  240. package/docs/api/sdk/controlplane.md +36 -0
  241. package/docs/dashboard.md +13 -0
  242. package/package.json +2 -2
  243. package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +0 -2
  244. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +0 -13
  245. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +0 -1
  246. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +0 -4
  247. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +0 -1
  248. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +0 -2
  249. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js.map +0 -1
  250. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +0 -2
  251. package/dashboard/dist/assets/BotPicker-kKBifD1w.js +0 -2
  252. package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +0 -2
  253. package/dashboard/dist/assets/CollapsibleSection-kYTBL7dT.js +0 -2
  254. package/dashboard/dist/assets/ConfirmDeleteModal-CcaAapMl.js +0 -2
  255. package/dashboard/dist/assets/CopyableId-B4CL12pv.js +0 -2
  256. package/dashboard/dist/assets/CredentialsPage-D1VAlwid.js +0 -2
  257. package/dashboard/dist/assets/CronLabel-DRmO5rH0.js +0 -2
  258. package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +0 -2
  259. package/dashboard/dist/assets/DataTable-J5R6mepB.js +0 -2
  260. package/dashboard/dist/assets/DropZone-DwNj3GiG.js +0 -2
  261. package/dashboard/dist/assets/ElapsedCell-ChyMzl9n.js +0 -2
  262. package/dashboard/dist/assets/EmptyState-BXGvOADa.js +0 -2
  263. package/dashboard/dist/assets/EscalationsOverview-DM6zmE4g.js +0 -2
  264. package/dashboard/dist/assets/EventTable-CvJ98E8s.js +0 -2
  265. package/dashboard/dist/assets/EventTopicPill-CB_rIGlL.js +0 -2
  266. package/dashboard/dist/assets/FilterBar-Bdssa-Xn.js +0 -2
  267. package/dashboard/dist/assets/HomePage-BuZkdXZt.js +0 -2
  268. package/dashboard/dist/assets/HomePage-BuZkdXZt.js.map +0 -1
  269. package/dashboard/dist/assets/ListToolbar-jy8NL6ll.js +0 -2
  270. package/dashboard/dist/assets/McpOverview-xkaKuHbX.js +0 -2
  271. package/dashboard/dist/assets/McpQueryDetailPage-D5ICn6cR.js +0 -5
  272. package/dashboard/dist/assets/McpQueryPage-C46fzfm5.js +0 -2
  273. package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +0 -2
  274. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +0 -2
  275. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js.map +0 -1
  276. package/dashboard/dist/assets/Modal-C6k6_5KB.js +0 -2
  277. package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +0 -2
  278. package/dashboard/dist/assets/PageHeader-COcgWWf-.js +0 -2
  279. package/dashboard/dist/assets/PageHeaderWithStats-C0PCY3aJ.js +0 -2
  280. package/dashboard/dist/assets/PriorityBadge-BQCsYMpM.js +0 -2
  281. package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +0 -2
  282. package/dashboard/dist/assets/ProcessesListPage-iyPsmlhm.js +0 -2
  283. package/dashboard/dist/assets/RolePill-CHwys1f9.js +0 -2
  284. package/dashboard/dist/assets/RolesPage-Bmc3XaUk.js +0 -2
  285. package/dashboard/dist/assets/RowActions-Bs4PF-Gd.js +0 -2
  286. package/dashboard/dist/assets/RunAsSelector-DXzAr2WW.js +0 -2
  287. package/dashboard/dist/assets/ServerName-BIdLC1Ay.js +0 -2
  288. package/dashboard/dist/assets/StatCard-OKzRSSx4.js +0 -2
  289. package/dashboard/dist/assets/StatusBadge-CQlF46RR.js +0 -2
  290. package/dashboard/dist/assets/StepIndicator-CP7eycjI.js +0 -2
  291. package/dashboard/dist/assets/StickyPagination-CGk8VAKt.js +0 -2
  292. package/dashboard/dist/assets/SwimlaneTimeline-MEUPc3yJ.js +0 -2
  293. package/dashboard/dist/assets/TagInput-BGxXKiWD.js +0 -2
  294. package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js +0 -2
  295. package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js.map +0 -1
  296. package/dashboard/dist/assets/TaskQueuePill-bw8ieKsf.js +0 -2
  297. package/dashboard/dist/assets/TasksListPage-D1INzcrA.js +0 -2
  298. package/dashboard/dist/assets/TimeAgo-CywLVIBA.js +0 -2
  299. package/dashboard/dist/assets/TimestampCell-B4Pc6f3A.js +0 -2
  300. package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +0 -2
  301. package/dashboard/dist/assets/ToolTestPanel-DusbUka5.js +0 -2
  302. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +0 -9
  303. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +0 -1
  304. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +0 -2
  305. package/dashboard/dist/assets/UserName-CLbusknU.js +0 -2
  306. package/dashboard/dist/assets/WorkflowExecutionPage-C61R-3Gg.js +0 -2
  307. package/dashboard/dist/assets/WorkflowPill-7vt2F6wR.js +0 -2
  308. package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +0 -2
  309. package/dashboard/dist/assets/WorkflowsOverview-DA2ZOs7D.js +0 -2
  310. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +0 -2
  311. package/dashboard/dist/assets/agents-Dga6NU7U.js.map +0 -1
  312. package/dashboard/dist/assets/escalation-_N5GfuIi.js +0 -2
  313. package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js +0 -2
  314. package/dashboard/dist/assets/helpers-Dz2U3Ctb.js +0 -2
  315. package/dashboard/dist/assets/index-6Kd78p_v.js +0 -2
  316. package/dashboard/dist/assets/index-B9ealjkt.js +0 -6
  317. package/dashboard/dist/assets/index-BIUHY2Jz.css +0 -1
  318. package/dashboard/dist/assets/index-BWHDW_CF.js +0 -2
  319. package/dashboard/dist/assets/index-BWHDW_CF.js.map +0 -1
  320. package/dashboard/dist/assets/index-BYwPVJv0.js +0 -15
  321. package/dashboard/dist/assets/index-CCOSf1PY.js +0 -281
  322. package/dashboard/dist/assets/index-CCOSf1PY.js.map +0 -1
  323. package/dashboard/dist/assets/index-CS61sh5q.js +0 -2
  324. package/dashboard/dist/assets/index-CtbG3UN-.js +0 -5
  325. package/dashboard/dist/assets/index-DWUunWxh.js +0 -2
  326. package/dashboard/dist/assets/index-D_H_Prht.js +0 -2
  327. package/dashboard/dist/assets/index-Dpjguclc.js +0 -2
  328. package/dashboard/dist/assets/index-QicYdUsl.js +0 -2
  329. package/dashboard/dist/assets/index-dM-OgCY3.js +0 -2
  330. package/dashboard/dist/assets/namespaces-iRejH3_A.js +0 -2
  331. package/dashboard/dist/assets/settings-DmN2I-c6.js +0 -2
  332. package/dashboard/dist/assets/topics-p8anbgi0.js.map +0 -1
  333. package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +0 -1
  334. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
  335. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
  336. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +0 -26
  337. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BWHDW_CF.js","sources":["../../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/EmergencyControls.tsx","../../src/pages/admin/controlplane/StreamVolumeChart.tsx","../../src/pages/admin/controlplane/QueueCard.tsx","../../src/pages/admin/controlplane/QuorumFeed.tsx","../../src/pages/admin/controlplane/ControlPlaneContent.tsx","../../src/pages/admin/controlplane/ControlPlanePage.tsx"],"sourcesContent":["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 } 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 { 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 { 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, 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 event 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 { DataTable } from '../../../components/common/data/DataTable';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { StreamVolumeChart } from './StreamVolumeChart';\nimport { QueueCard } from './QueueCard';\nimport { QuorumFeed } from './QuorumFeed';\nimport { rowKey } from './helpers';\nimport type { Duration } from './helpers';\nimport type { Column } from '../../../components/common/data/DataTable';\n\ninterface ControlPlaneContentProps {\n collapsed: Record<string, boolean>;\n toggleSection: (key: string) => void;\n activeDuration: Duration;\n streamStats: { byStream: Array<any> } | undefined;\n isLoading: boolean;\n queueMap: Map<string, Array<any>>;\n expandedQueues: Set<string>;\n toggleQueue: (queue: string) => void;\n allQueuesExpanded: boolean;\n toggleAllQueues: () => void;\n handleRowClick: (profile: any) => void;\n handleResumeThrottle: (profile: any) => void;\n handleQueueThrottle: (queue: string) => void;\n handleResumeQueue: (queue: string) => void;\n engineColumns: Column<any>[];\n engines: Array<any>;\n bridgeActive: boolean;\n}\n\nexport function ControlPlaneContent({\n collapsed,\n toggleSection,\n activeDuration,\n streamStats,\n isLoading,\n queueMap,\n expandedQueues,\n toggleQueue,\n allQueuesExpanded,\n toggleAllQueues,\n handleRowClick,\n handleResumeThrottle,\n handleQueueThrottle,\n handleResumeQueue,\n engineColumns,\n engines,\n bridgeActive,\n}: ControlPlaneContentProps) {\n return (\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}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { PageHeaderWithStats, type InlineStat } from '../../../components/common/layout/PageHeaderWithStats';\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 { EmergencyControls } from './EmergencyControls';\nimport { ControlPlaneContent } from './ControlPlaneContent';\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 docsHash=\"#docs:dashboard.md: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 <ControlPlaneContent\n collapsed={collapsed}\n toggleSection={toggleSection}\n activeDuration={activeDuration}\n streamStats={streamStats}\n isLoading={isLoading}\n queueMap={queueMap}\n expandedQueues={expandedQueues}\n toggleQueue={toggleQueue}\n allQueuesExpanded={allQueuesExpanded}\n toggleAllQueues={toggleAllQueues}\n handleRowClick={handleRowClick}\n handleResumeThrottle={handleResumeThrottle}\n handleQueueThrottle={handleQueueThrottle}\n handleResumeQueue={handleResumeQueue}\n engineColumns={engineColumns}\n engines={engines}\n bridgeActive={bridgeActive}\n />\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":["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","useThrottle","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","EmergencyControls","appsData","useControlPlaneApps","throttle","confirming","setConfirming","apps","applyAll","app","CirclePause","Play","StreamVolumeChart","byStream","onNodeFilter","animated","setAnimated","raf","engineStreams","workerStreams","maxCount","renderBar","pct","barColor","labelColor","labelCls","Fragment","QueueCard","expanded","onToggle","onWorkerClick","onQueueThrottle","onResumeQueue","activeDuration","streamCount","match","columns","ChevronRight","TaskQueuePill","Activity","Clock","Collapsible","DataTable","eventCounter","QuorumEventRow","event","setExpanded","_c","JsonViewer","ConfigPanel","channels","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","ControlPlaneContent","collapsed","toggleSection","streamStats","isLoading","queueMap","expandedQueues","toggleQueue","allQueuesExpanded","toggleAllQueues","handleRowClick","handleResumeThrottle","handleQueueThrottle","handleResumeQueue","engineColumns","CollapsibleSection","a","b","qWorkers","ControlPlanePage","filters","setFilter","useFilterParams","firstAppId","subscribeMesh","useSubscribeMesh","REFRESH_INTERVAL","rollCallData","rollCallError","refetch","isFetching","useRollCall","useStreamStats","ta","tb","throttledCount","appOptions","ids","id","setExpandedQueues","STORAGE_KEY","setCollapsed","handleBulkThrottle","handleBulkThrottleOpen","closeThrottleModal","toggleAllEngines","engineKeys","allSelected","k","handleEngineBulkThrottle","headerStats","stats","setBridgeActive","handleStartBridge","PageHeaderWithStats","FilterBar","d","FilterSelect","RefreshCw"],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import{j as e}from"./index-CCOSf1PY.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{e as Z,i as ee,u as J,j as se,b as re}from"./workflows-Yq7cK-vR.js";import{D as oe}from"./DataTable-J5R6mepB.js";import{C as ae}from"./ConfirmDeleteModal-CcaAapMl.js";import{F as te,b as _}from"./FilterBar-Bdssa-Xn.js";import{R as ie,a as S}from"./RowActions-Bs4PF-Gd.js";import{u as le}from"./useFilterParams-CGRYFw_A.js";import{P as M}from"./PageHeader-COcgWWf-.js";import{R as I}from"./RolePill-CHwys1f9.js";import{T as ne}from"./TaskQueuePill-bw8ieKsf.js";import{W as ce}from"./WorkflowPill-7vt2F6wR.js";import{a6 as q,S as me,f as T,a9 as de,P as ue,aa as fe,ab as pe,U as L,X as B,h as Q,H,c as O}from"./vendor-icons-CBOM6Es0.js";import{c as Y,e as he,f as Ne}from"./vendor-react-Co3Y8ikm.js";import{S as be}from"./StepIndicator-CP7eycjI.js";import{u as ge}from"./roles-3Jm5KtKc.js";import{B as we}from"./BotPicker-kKBifD1w.js";import"./EmptyState-BXGvOADa.js";import"./Modal-C6k6_5KB.js";import"./bots-CtU4i4OQ.js";function xe(s,o){const l=o.toLowerCase();return s.workflow_type.toLowerCase().includes(l)||(s.description??"").toLowerCase().includes(l)}function He(){const s=Y(),{data:o,isLoading:l}=Z(),d=ee(),{filters:a,setFilter:n}=le({filters:{search:"",queue:"",role:"",tier:""}}),[m,v]=u.useState(a.search),[p,y]=u.useState(null);u.useEffect(()=>{if(m===a.search)return;const r=setTimeout(()=>n("search",m),300);return()=>clearTimeout(r)},[m,n,a.search]);const i=o??[],f=u.useMemo(()=>[...new Set(i.map(r=>r.task_queue).filter(Boolean))].sort(),[i]),c=u.useMemo(()=>[...new Set(i.flatMap(r=>r.roles??[]))].sort(),[i]),t=u.useMemo(()=>{let r=i;return a.search&&(r=r.filter(N=>xe(N,a.search))),a.queue&&(r=r.filter(N=>N.task_queue===a.queue)),a.role&&(r=r.filter(N=>(N.roles??[]).includes(a.role))),a.tier&&(r=r.filter(N=>N.tier===a.tier)),r},[i,a]),C=[{key:"workflow_type",label:"Workflow",className:"max-w-xs",render:r=>e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV(ce,{type:r.workflow_type,size:"md",variant:r.tier==="certified"?"certified":r.tier==="configured"?"configured":"durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:78,columnNumber:11},this),r.description&&e.jsxDEV("p",{className:"text-[10px] leading-tight text-text-quaternary mt-0.5",children:r.description},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:80,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:77,columnNumber:9},this)},{key:"task_queue",label:"Queue",render:r=>r.task_queue?e.jsxDEV(ne,{queue:r.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:88,columnNumber:41},this):e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:88,columnNumber:84},this),className:"whitespace-nowrap"},{key:"tier",label:"Tier",render:r=>r.tier==="certified"?e.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsxDEV(q,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:95,columnNumber:139},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:95,columnNumber:46},this):r.tier==="configured"?e.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsxDEV(me,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:96,columnNumber:140},this),"Configured"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:96,columnNumber:47},this):e.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsxDEV(T,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:97,columnNumber:109},this),"Durable"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:97,columnNumber:16},this),className:"whitespace-nowrap"},{key:"roles",label:"Access",render:r=>{if(!r.registered)return e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:105,columnNumber:37},this);const N=r.roles??[],b=r.invocation_roles??[];return!N.length&&!b.length?e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:108,columnNumber:61},this):e.jsxDEV("div",{className:"space-y-1.5",children:[N.length>0&&e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("span",{title:"Escalation roles",children:e.jsxDEV(q,{className:"w-3 h-3 text-text-quaternary shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:113,columnNumber:48},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:113,columnNumber:17},this),e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:N.map(D=>e.jsxDEV(I,{role:D},`e-${D}`,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:114,columnNumber:76},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:114,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:112,columnNumber:15},this),b.length>0&&e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("span",{title:"Invocation roles",children:e.jsxDEV(de,{className:"w-3 h-3 text-text-quaternary shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:119,columnNumber:48},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:119,columnNumber:17},this),e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:b.map(D=>e.jsxDEV(I,{role:D},`i-${D}`,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:120,columnNumber:79},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:120,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:118,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:110,columnNumber:11},this)}},{key:"actions",label:"",render:r=>e.jsxDEV(ie,{children:[r.invocable&&e.jsxDEV(S,{icon:ue,title:"Invoke workflow",onClick:()=>s(`/workflows/start?type=${encodeURIComponent(r.workflow_type)}&mode=now`),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:133,columnNumber:13},this),r.tier==="durable"&&e.jsxDEV(S,{icon:T,title:"Configure workflow",onClick:()=>s(`/workflows/registry/new?workflow_type=${encodeURIComponent(r.workflow_type)}&task_queue=${encodeURIComponent(r.task_queue??"")}`),colorClass:"text-text-tertiary hover:text-status-info"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:141,columnNumber:13},this),r.tier==="configured"&&e.jsxDEV(S,{icon:fe,title:"Certify workflow",onClick:()=>s(`/workflows/registry/${encodeURIComponent(r.workflow_type)}`),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:149,columnNumber:13},this),r.registered&&e.jsxDEV(S,{icon:pe,title:"Remove configuration",onClick:()=>y(r.workflow_type),colorClass:"text-text-tertiary hover:text-status-warning"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:157,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:131,columnNumber:9},this),className:"w-16 text-right"}],V=()=>{p&&d.mutate(p,{onSuccess:()=>y(null)})},E=r=>{r.registered?s(`/workflows/registry/${encodeURIComponent(r.workflow_type)}`):s(`/workflows/registry/new?workflow_type=${encodeURIComponent(r.workflow_type)}&task_queue=${encodeURIComponent(r.task_queue??"")}`)};return e.jsxDEV("div",{children:[e.jsxDEV(M,{title:"Workflow Registry",docsHash:"#docs:dashboard.md:workflow-registry",actions:e.jsxDEV("button",{onClick:()=>s("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:191,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:187,columnNumber:7},this),e.jsxDEV(te,{children:[e.jsxDEV("input",{type:"text",placeholder:"Search workflow type...",value:m,onChange:r=>v(r.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:201,columnNumber:9},this),e.jsxDEV(_,{label:"Queue",value:a.queue,onChange:r=>n("queue",r),options:f.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:208,columnNumber:9},this),e.jsxDEV(_,{label:"Tier",value:a.tier,onChange:r=>n("tier",r),options:[{value:"certified",label:"Certified"},{value:"configured",label:"Configured"},{value:"durable",label:"Durable"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:214,columnNumber:9},this),e.jsxDEV(_,{label:"Role",value:a.role,onChange:r=>n("role",r),options:c.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:224,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:200,columnNumber:7},this),e.jsxDEV(oe,{columns:C,data:t,keyFn:r=>r.workflow_type,onRowClick:E,isLoading:l,emptyMessage:"No workflows found"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:232,columnNumber:7},this),e.jsxDEV(ae,{open:!!p,onClose:()=>y(null),onConfirm:V,title:"De-certify Workflow",description:e.jsxDEV(e.Fragment,{children:["Remove certification from ",e.jsxDEV("span",{className:"font-mono font-medium text-text-primary",children:p},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:247,columnNumber:50},this),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:247,columnNumber:22},this),isPending:d.isPending,error:d.error},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:242,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:186,columnNumber:5},this)}function j(s){return s.split(",").map(o=>o.trim()).filter(Boolean)}const R={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:"",certified:!1};function ke(s){const o=(s.roles??[]).join(", "),l=(s.consumes??[]).join(", ");return{workflow_type:s.workflow_type,description:s.description??"",task_queue:s.task_queue??"",default_role:s.default_role,invocable:s.invocable,roles:o,invocation_roles:(s.invocation_roles??[]).join(", "),consumes:l,envelope_schema:s.envelope_schema?JSON.stringify(s.envelope_schema,null,2):"",resolver_schema:s.resolver_schema?JSON.stringify(s.resolver_schema,null,2):"",cron_schedule:s.cron_schedule??"",execute_as:s.execute_as??"",certified:!!(o||l)}}const F=["Identity","Invocation","Advanced"];function W(s){if(!s.trim())return!0;try{return JSON.parse(s),!0}catch{return!1}}function $(s,o){return s===1?!!o.workflow_type.trim():s===2?W(o.envelope_schema):s===3?W(o.resolver_schema):!0}const k="label",w="hint",G="input-json w-full";function A({selected:s,onChange:o,single:l,placeholder:d}){const{data:a}=ge(),n=(a==null?void 0:a.roles)??[],[m,v]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{const c=t=>{p.current&&!p.current.contains(t.target)&&v(!1)};return document.addEventListener("mousedown",c),()=>document.removeEventListener("mousedown",c)},[]);const y=c=>{l?(o(s.includes(c)?[]:[c]),v(!1)):o(s.includes(c)?s.filter(t=>t!==c):[...s,c])},i=c=>{o(s.filter(t=>t!==c))},f=d??(l?"Select role...":"Add roles...");return e.jsxDEV("div",{ref:p,className:"relative",children:[e.jsxDEV("button",{type:"button",onClick:()=>v(!m),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[s.length===0&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:f},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:55,columnNumber:11},this),s.map(c=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsxDEV(L,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:62,columnNumber:13},this),c,e.jsxDEV("span",{role:"button",onClick:t=>{t.stopPropagation(),i(c)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsxDEV(B,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:69,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:64,columnNumber:13},this)]},c,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:58,columnNumber:11},this)),e.jsxDEV(Q,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${m?"rotate-180":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:73,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:49,columnNumber:7},this),m&&e.jsxDEV("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:n.length===0?e.jsxDEV("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:80,columnNumber:13},this):n.map(c=>{const t=s.includes(c);return e.jsxDEV("button",{type:"button",onClick:()=>y(c),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${t?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsxDEV(L,{className:"w-3 h-3 shrink-0 text-accent/60"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:95,columnNumber:19},this),e.jsxDEV("span",{className:"flex-1",children:c},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:96,columnNumber:19},this),t&&e.jsxDEV(H,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:97,columnNumber:34},this)]},c,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:85,columnNumber:17},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:78,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:47,columnNumber:5},this)}function ve({options:s,selected:o,onChange:l,placeholder:d}){const[a,n]=u.useState(!1),m=u.useRef(null);u.useEffect(()=>{const i=f=>{m.current&&!m.current.contains(f.target)&&n(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[]);const v=i=>{l(o.includes(i)?o.filter(f=>f!==i):[...o,i])},p=i=>{l(o.filter(f=>f!==i))},y=d??"Add workflows...";return e.jsxDEV("div",{ref:m,className:"relative",children:[e.jsxDEV("button",{type:"button",onClick:()=>n(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[o.length===0&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:y},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:45,columnNumber:11},this),o.map(i=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsxDEV(O,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:52,columnNumber:13},this),i,e.jsxDEV("span",{role:"button",onClick:f=>{f.stopPropagation(),p(i)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsxDEV(B,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:59,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:54,columnNumber:13},this)]},i,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:48,columnNumber:11},this)),e.jsxDEV(Q,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:63,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:39,columnNumber:7},this),a&&e.jsxDEV("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:s.length===0?e.jsxDEV("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:69,columnNumber:13},this):s.map(i=>{const f=o.includes(i);return e.jsxDEV("button",{type:"button",onClick:()=>v(i),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${f?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsxDEV(O,{className:"w-3 h-3 shrink-0 text-accent/60"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:84,columnNumber:19},this),e.jsxDEV("span",{className:"flex-1",children:i},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:85,columnNumber:19},this),f&&e.jsxDEV(H,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:86,columnNumber:34},this)]},i,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:74,columnNumber:17},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:38,columnNumber:5},this)}function z(s){return j(s)}function U(s){return s.join(", ")}function ye({form:s,set:o}){const{data:l}=J(),d=(l??[]).map(a=>a.workflow_type).filter(a=>a!==s.workflow_type);return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Resolver Schema"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:31,columnNumber:9},this),e.jsxDEV("textarea",{value:s.resolver_schema,onChange:a=>o("resolver_schema",a.target.value),placeholder:`{
2
- "properties": {
3
- "approved": { "type": "boolean", "default": false, "description": "Approve?" },
4
- "notes": { "type": "string", "default": "", "description": "Reviewer notes" }
5
- }
6
- }`,className:G,rows:8,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:32,columnNumber:9},this),e.jsxDEV("p",{className:w,children:["Default form template for resolving escalations from this workflow. Use ",e.jsxDEV("span",{className:"font-mono",children:"properties"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:42,columnNumber:15},this)," with ",e.jsxDEV("span",{className:"font-mono",children:"type"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:42,columnNumber:66},this),", ",e.jsxDEV("span",{className:"font-mono",children:"default"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:42,columnNumber:107},this),", ",e.jsxDEV("span",{className:"font-mono",children:"description"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:42,columnNumber:151},this),", ",e.jsxDEV("span",{className:"font-mono",children:"enum"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:42,columnNumber:199},this),", and ",e.jsxDEV("span",{className:"font-mono",children:"format"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:42,columnNumber:244},this)," for typed form fields."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:40,columnNumber:9},this),s.resolver_schema.trim()&&!W(s.resolver_schema)&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:45,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:30,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-6 pt-1",children:e.jsxDEV("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:s.certified,onChange:a=>o("certified",a.target.checked),className:"w-4 h-4 rounded border-border accent-accent"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:52,columnNumber:11},this),e.jsxDEV("span",{className:"text-xs text-text-primary font-medium",children:"Certify for HITL Escalation"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:51,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:50,columnNumber:7},this),e.jsxDEV("p",{className:w,children:"Certified workflows use the interceptor to wrap executions — failures escalate to human reviewers instead of throwing."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:61,columnNumber:7},this),s.certified?e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Default Escalation Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:70,columnNumber:13},this),e.jsxDEV(A,{selected:z(s.default_role),onChange:a=>o("default_role",a[0]??""),single:!0,placeholder:"Select escalation role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:71,columnNumber:13},this),e.jsxDEV("p",{className:w,children:"When this workflow escalates, assign to users with this role"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:77,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:69,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Escalation Roles"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:84,columnNumber:13},this),e.jsxDEV(A,{selected:z(s.roles),onChange:a=>o("roles",U(a)),placeholder:"Select who can resolve escalations..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:85,columnNumber:13},this),e.jsxDEV("p",{className:w,children:"Users with any of these roles can claim and resolve escalations from this workflow."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:90,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:83,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Consumes"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:97,columnNumber:13},this),e.jsxDEV(ve,{options:d,selected:z(s.consumes),onChange:a=>o("consumes",U(a)),placeholder:"Select workflow dependencies..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:98,columnNumber:13},this),e.jsxDEV("p",{className:w,children:"Output from these upstream workflows will be injected into the input envelope for this workflow."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:104,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:96,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:67,columnNumber:9},this):e.jsxDEV("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:["This workflow will run as standard durable without the interceptor. Enable"," ",e.jsxDEV("span",{className:"font-medium text-text-secondary",children:"Certify for HITL Escalation"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:114,columnNumber:13},this)," ","to add automatic escalation routing and role-based resolution."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:111,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:110,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/AdvancedStep.tsx",lineNumber:28,columnNumber:5},this)}function De(s){return j(s)}function Ce(s){return s.join(", ")}function Ee({form:s,set:o,editing:l,durableTypes:d=[]}){const a=!l&&d.length>0;return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Workflow Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:36,columnNumber:9},this),a&&!s.workflow_type?e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register:"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:39,columnNumber:13},this),e.jsxDEV("div",{className:"grid gap-1",children:d.map(n=>e.jsxDEV("button",{onClick:()=>o("workflow_type",n),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:n},n,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:44,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:42,columnNumber:13},this),e.jsxDEV("div",{className:"flex items-center gap-2 pt-1",children:[e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:"or"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:54,columnNumber:15},this),e.jsxDEV("input",{type:"text",onChange:n=>o("workflow_type",n.target.value),placeholder:"Enter a workflow type manually",className:"input font-mono flex-1"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:55,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:53,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:38,columnNumber:11},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("input",{type:"text",value:s.workflow_type,onChange:n=>o("workflow_type",n.target.value),disabled:l,placeholder:"reviewContent",className:"input font-mono w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:65,columnNumber:13},this),!l&&s.workflow_type&&d.length>0&&e.jsxDEV("button",{onClick:()=>o("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:74,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:64,columnNumber:11},this),e.jsxDEV("p",{className:w,children:"Register a workflow to configure invocation schemas and dashboard visibility. Certification for HITL escalation is optional (step 3)."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:83,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:35,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:89,columnNumber:9},this),e.jsxDEV("input",{type:"text",value:s.description,onChange:n=>o("description",n.target.value),placeholder:"AI-powered content moderation with human escalation",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:90,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:88,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Task Queue"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:100,columnNumber:9},this),e.jsxDEV("input",{type:"text",value:s.task_queue,onChange:n=>o("task_queue",n.target.value),placeholder:"lt-review",className:"input font-mono w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:101,columnNumber:9},this),e.jsxDEV("p",{className:w,children:"Durable task queue this workflow listens on"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:108,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:99,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:34,columnNumber:5},this)}function je({form:s,set:o}){return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{className:"flex gap-6 pt-1",children:e.jsxDEV("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:s.invocable,onChange:l=>o("invocable",l.target.checked),className:"w-4 h-4 rounded border-border accent-accent"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:124,columnNumber:11},this),e.jsxDEV("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:130,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:123,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:122,columnNumber:7},this),e.jsxDEV("p",{className:w,children:"Allow this workflow to be started from the dashboard or API."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:133,columnNumber:7},this),s.invocable&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Run As"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:141,columnNumber:13},this),e.jsxDEV(we,{selected:s.execute_as,onChange:l=>o("execute_as",l)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:142,columnNumber:13},this),e.jsxDEV("p",{className:w,children:"Choose a bot to execute this workflow under its identity and credentials. Default runs as the invoking user."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:146,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:140,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Invocation Roles"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:154,columnNumber:13},this),e.jsxDEV(A,{selected:De(s.invocation_roles),onChange:l=>o("invocation_roles",Ce(l)),placeholder:"Select who can start this workflow..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:155,columnNumber:13},this),e.jsxDEV("p",{className:w,children:"Only users with these roles can start this workflow. Leave empty to allow all authenticated users."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:160,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:153,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:k,children:"Envelope Schema"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:168,columnNumber:13},this),e.jsxDEV("textarea",{value:s.envelope_schema,onChange:l=>o("envelope_schema",l.target.value),placeholder:`{
7
- "data": {
8
- "contentId": "example-123",
9
- "content": "Text to review"
10
- },
11
- "metadata": {
12
- "source": "dashboard"
13
- }
14
- }`,className:G,rows:8,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:169,columnNumber:13},this),e.jsxDEV("p",{className:w,children:["Pre-fills the JSON editor when invoking this workflow. Should include ",e.jsxDEV("span",{className:"font-mono",children:"data"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:179,columnNumber:30},this)," (workflow input) and optional ",e.jsxDEV("span",{className:"font-mono",children:"metadata"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:179,columnNumber:100},this)," (context)."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:177,columnNumber:13},this),s.envelope_schema.trim()&&!W(s.envelope_schema)&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:182,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:167,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:138,columnNumber:9},this),!s.invocable&&e.jsxDEV("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:["Enable ",e.jsxDEV("span",{className:"font-medium text-text-secondary",children:"Invocable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:191,columnNumber:20},this)," above to configure who can start this workflow and set an input template."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:190,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:189,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:120,columnNumber:5},this)}function Ye(){const{workflowType:s}=he(),o=!s,l=Y(),{data:d,isLoading:a}=J(),n=se(),m=(d==null?void 0:d.find(h=>h.workflow_type===s))??null,v=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]),{data:p}=re({limit:500}),y=u.useMemo(()=>{const h=new Set((d??[]).map(g=>g.workflow_type));return[...new Set(((p==null?void 0:p.jobs)??[]).map(g=>g.entity))].filter(g=>!h.has(g)&&!v.has(g)).sort()},[d,p]),[i,f]=Ne(),c=u.useMemo(()=>{if(!o)return R;const h=i.get("workflow_type")??"",x=i.get("task_queue")??"";return!h&&!x?R:{...R,workflow_type:h,task_queue:x}},[o,i]),[t,C]=u.useState(c),[V,E]=u.useState(""),[r,N]=u.useState(!1),b=parseInt(i.get("step")||"1",10),D=u.useCallback(h=>{f(x=>{const g=new URLSearchParams(x);return g.set("step",String(h)),g},{replace:!1})},[f]);u.useEffect(()=>{if(!r){if(o){C(c),N(!0);return}m&&(C(ke(m)),N(!0))}},[m,o,r,c]);const P=(h,x)=>C(g=>({...g,[h]:x})),K=()=>{if(!t.workflow_type.trim())return;E("");let h=null,x=null;try{t.envelope_schema.trim()&&(h=JSON.parse(t.envelope_schema))}catch{E("Invalid JSON in Envelope Schema");return}try{t.resolver_schema.trim()&&(x=JSON.parse(t.resolver_schema))}catch{E("Invalid JSON in Resolver Schema");return}n.mutate({workflow_type:t.workflow_type.trim(),description:t.description.trim()||null,task_queue:t.task_queue.trim()||null,default_role:t.default_role.trim()||"reviewer",invocable:t.invocable,roles:j(t.roles),invocation_roles:j(t.invocation_roles),consumes:j(t.consumes),envelope_schema:h,resolver_schema:x,cron_schedule:t.cron_schedule.trim()||null,execute_as:t.execute_as.trim()||null},{onSuccess:()=>{l("/workflows/registry")}})};if(a)return 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/registry/WorkflowConfigDetailPage.tsx",lineNumber:132,columnNumber:9},this),e.jsxDEV("div",{className:"h-60 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:133,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:131,columnNumber:7},this);if(!o&&!m)return e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"Config not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:139,columnNumber:12},this);const X=b===F.length;return e.jsxDEV("div",{children:[e.jsxDEV(M,{title:o?"Register Workflow":(m==null?void 0:m.workflow_type)??""},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:147,columnNumber:7},this),e.jsxDEV("div",{className:"max-w-3xl",children:[e.jsxDEV(be,{steps:F,currentStep:b-1,onStepClick:h=>D(h+1)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:150,columnNumber:11},this),e.jsxDEV("div",{className:"min-h-[360px] py-2",children:[b===1&&e.jsxDEV(Ee,{form:t,set:P,editing:!!m,durableTypes:y},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:153,columnNumber:28},this),b===2&&e.jsxDEV(je,{form:t,set:P},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:154,columnNumber:28},this),b===3&&e.jsxDEV(ye,{form:t,set:P},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:155,columnNumber:28},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:152,columnNumber:11},this),(V||n.error)&&e.jsxDEV("p",{className:"text-xs text-status-error mt-4",children:V||n.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:159,columnNumber:13},this),e.jsxDEV("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsxDEV("div",{children:b>1&&e.jsxDEV("button",{onClick:()=>D(b-1),className:"btn-secondary text-xs",children:"Back"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:168,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:166,columnNumber:13},this),e.jsxDEV("div",{className:"flex gap-3",children:[e.jsxDEV("button",{onClick:()=>l("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:177,columnNumber:15},this),X?e.jsxDEV("button",{onClick:K,disabled:!$(b,t)||n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":m?"Save":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:181,columnNumber:17},this):e.jsxDEV("button",{onClick:()=>D(b+1),disabled:!$(b,t),className:"btn-primary text-xs",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:189,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:176,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:165,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:149,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:146,columnNumber:5},this)}export{Ye as WorkflowConfigDetailPage,He as WorkflowConfigsPage};
15
- //# sourceMappingURL=index-BYwPVJv0.js.map