@hotmeshio/long-tail 0.6.0 → 0.7.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 (298) hide show
  1. package/build/api/escalations/create.js +45 -0
  2. package/build/api/escalations/index.d.ts +1 -1
  3. package/build/api/escalations/index.js +2 -1
  4. package/build/api/escalations/list.d.ts +3 -0
  5. package/build/api/escalations/list.js +14 -0
  6. package/build/api/roles.d.ts +17 -0
  7. package/build/api/roles.js +46 -0
  8. package/build/bin/ltc.js +1 -0
  9. package/build/lib/cli/commands/escalations.d.ts +1 -0
  10. package/build/lib/cli/commands/escalations.js +2 -0
  11. package/build/lib/db/migrate.js +22 -2
  12. package/build/lib/db/schemas/014_roles_v2.sql +19 -0
  13. package/build/lib/db/schemas/015_role_ops.sql +50 -0
  14. package/build/lib/db/schemas/016_station_metrics_indexes.sql +13 -0
  15. package/build/lib/events/system-events.js +3 -0
  16. package/build/modules/auth.d.ts +9 -0
  17. package/build/modules/auth.js +38 -1
  18. package/build/routes/escalations/list.js +10 -0
  19. package/build/routes/roles.js +16 -5
  20. package/build/scripts/ortho-populate.d.ts +37 -0
  21. package/build/scripts/ortho-populate.js +228 -0
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/sdk/index.js +2 -0
  24. package/build/services/escalation/client.js +93 -2
  25. package/build/services/escalation/crud.js +18 -9
  26. package/build/services/escalation/metrics-cache.d.ts +14 -0
  27. package/build/services/escalation/metrics-cache.js +53 -0
  28. package/build/services/escalation/queries.d.ts +14 -2
  29. package/build/services/escalation/queries.js +121 -11
  30. package/build/services/escalation/sql.d.ts +29 -2
  31. package/build/services/escalation/sql.js +156 -27
  32. package/build/services/escalation/types.d.ts +17 -0
  33. package/build/services/escalation/types.js +1 -0
  34. package/build/services/mcp/external-server.js +5 -1
  35. package/build/services/orchestrator/condition.d.ts +20 -0
  36. package/build/services/orchestrator/condition.js +20 -0
  37. package/build/services/role/index.d.ts +22 -3
  38. package/build/services/role/index.js +50 -2
  39. package/build/services/role/sql.d.ts +11 -1
  40. package/build/services/role/sql.js +38 -1
  41. package/build/services/role/types.d.ts +32 -0
  42. package/build/system/mcp-servers/admin/escalations.js +8 -7
  43. package/build/system/mcp-servers/admin/index.js +5 -3
  44. package/build/system/mcp-servers/admin/ortho.d.ts +10 -0
  45. package/build/system/mcp-servers/admin/ortho.js +242 -0
  46. package/build/system/mcp-servers/admin/schemas.d.ts +40 -3
  47. package/build/system/mcp-servers/admin/schemas.js +17 -4
  48. package/build/system/mcp-servers/admin/users.js +31 -0
  49. package/build/system/seed/tool-manifests-admin.d.ts +4016 -712
  50. package/build/system/seed/tool-manifests-admin.js +14 -1
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/build/types/escalation.d.ts +3 -1
  53. package/dashboard/dist/assets/{AdminDashboard-2CZ8py9X.js → AdminDashboard-Bg1HgukI.js} +2 -2
  54. package/dashboard/dist/assets/{AdminDashboard-2CZ8py9X.js.map → AdminDashboard-Bg1HgukI.js.map} +1 -1
  55. package/dashboard/dist/assets/{AgentConfigPage-D68sodgo.js → AgentConfigPage-HBe_YDU_.js} +5 -5
  56. package/dashboard/dist/assets/{AgentConfigPage-D68sodgo.js.map → AgentConfigPage-HBe_YDU_.js.map} +1 -1
  57. package/dashboard/dist/assets/{AgentDetailPage-BmhuWbKi.js → AgentDetailPage-BsaiYbwL.js} +4 -4
  58. package/dashboard/dist/assets/AgentDetailPage-BsaiYbwL.js.map +1 -0
  59. package/dashboard/dist/assets/AgentsPage-DhN2lIBh.js +2 -0
  60. package/dashboard/dist/assets/{AgentsPage-C4SKQVeU.js.map → AgentsPage-DhN2lIBh.js.map} +1 -1
  61. package/dashboard/dist/assets/AvailableEscalationsPage-_xcWvlIz.js +2 -0
  62. package/dashboard/dist/assets/AvailableEscalationsPage-_xcWvlIz.js.map +1 -0
  63. package/dashboard/dist/assets/{BotPicker-D-FvXJOM.js → BotPicker-DY6iUVC9.js} +2 -2
  64. package/dashboard/dist/assets/{BotPicker-D-FvXJOM.js.map → BotPicker-DY6iUVC9.js.map} +1 -1
  65. package/dashboard/dist/assets/CapabilitiesPage-w1owqsmN.js +2 -0
  66. package/dashboard/dist/assets/CapabilitiesPage-w1owqsmN.js.map +1 -0
  67. package/dashboard/dist/assets/{CollapsibleSection-BjGNYEvh.js → CollapsibleSection-DIMGjlJ-.js} +2 -2
  68. package/dashboard/dist/assets/{CollapsibleSection-BjGNYEvh.js.map → CollapsibleSection-DIMGjlJ-.js.map} +1 -1
  69. package/dashboard/dist/assets/{CredentialsPage-DvCA-wQN.js → CredentialsPage-D1OmMHux.js} +2 -2
  70. package/dashboard/dist/assets/{CredentialsPage-DvCA-wQN.js.map → CredentialsPage-D1OmMHux.js.map} +1 -1
  71. package/dashboard/dist/assets/{CronLabel-DBMurd_c.js → CronLabel-CQy3DrUQ.js} +2 -2
  72. package/dashboard/dist/assets/{CronLabel-DBMurd_c.js.map → CronLabel-CQy3DrUQ.js.map} +1 -1
  73. package/dashboard/dist/assets/{CustomDurationPicker-DHflFoEa.js → CustomDurationPicker-BoBkl9tw.js} +2 -2
  74. package/dashboard/dist/assets/{CustomDurationPicker-DHflFoEa.js.map → CustomDurationPicker-BoBkl9tw.js.map} +1 -1
  75. package/dashboard/dist/assets/{DataTable-D9yuBv0w.js → DataTable-ZWgVQg7F.js} +2 -2
  76. package/dashboard/dist/assets/DataTable-ZWgVQg7F.js.map +1 -0
  77. package/dashboard/dist/assets/{DropZone-CUtdp99Z.js → DropZone-QXbiuU0b.js} +2 -2
  78. package/dashboard/dist/assets/{DropZone-CUtdp99Z.js.map → DropZone-QXbiuU0b.js.map} +1 -1
  79. package/dashboard/dist/assets/{ElapsedCell-CSjcVOpo.js → ElapsedCell-Donjm9gT.js} +2 -2
  80. package/dashboard/dist/assets/{ElapsedCell-CSjcVOpo.js.map → ElapsedCell-Donjm9gT.js.map} +1 -1
  81. package/dashboard/dist/assets/{EscalationsOverview-BUqRNJbK.js → EscalationsOverview-CvHIJ_GG.js} +2 -2
  82. package/dashboard/dist/assets/{EscalationsOverview-BUqRNJbK.js.map → EscalationsOverview-CvHIJ_GG.js.map} +1 -1
  83. package/dashboard/dist/assets/{EventTable-Chz-6XPE.js → EventTable-DpAXMmT3.js} +2 -2
  84. package/dashboard/dist/assets/{EventTable-Chz-6XPE.js.map → EventTable-DpAXMmT3.js.map} +1 -1
  85. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js +2 -0
  86. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js.map +1 -0
  87. package/dashboard/dist/assets/GraphInvokePage-De1XVx5d.js +2 -0
  88. package/dashboard/dist/assets/GraphInvokePage-De1XVx5d.js.map +1 -0
  89. package/dashboard/dist/assets/HomePage-BYR5VXXw.js +2 -0
  90. package/dashboard/dist/assets/HomePage-BYR5VXXw.js.map +1 -0
  91. package/dashboard/dist/assets/{ListToolbar-_73JCdbB.js → ListToolbar-Bx7jGzPA.js} +2 -2
  92. package/dashboard/dist/assets/{ListToolbar-_73JCdbB.js.map → ListToolbar-Bx7jGzPA.js.map} +1 -1
  93. package/dashboard/dist/assets/{McpOverview-DfdqxhSz.js → McpOverview-DXRKcJN0.js} +2 -2
  94. package/dashboard/dist/assets/{McpOverview-DfdqxhSz.js.map → McpOverview-DXRKcJN0.js.map} +1 -1
  95. package/dashboard/dist/assets/{McpQueryDetailPage-DPAljieY.js → McpQueryDetailPage-CmW15w5e.js} +2 -2
  96. package/dashboard/dist/assets/{McpQueryDetailPage-DPAljieY.js.map → McpQueryDetailPage-CmW15w5e.js.map} +1 -1
  97. package/dashboard/dist/assets/{McpQueryPage-D5cSziYS.js → McpQueryPage-BE6I011z.js} +2 -2
  98. package/dashboard/dist/assets/{McpQueryPage-D5cSziYS.js.map → McpQueryPage-BE6I011z.js.map} +1 -1
  99. package/dashboard/dist/assets/{McpRunDetailPage-DwNb9wZg.js → McpRunDetailPage-Dsa3G3XQ.js} +2 -2
  100. package/dashboard/dist/assets/{McpRunDetailPage-DwNb9wZg.js.map → McpRunDetailPage-Dsa3G3XQ.js.map} +1 -1
  101. package/dashboard/dist/assets/McpRunsPage-uTbym66Y.js +2 -0
  102. package/dashboard/dist/assets/McpRunsPage-uTbym66Y.js.map +1 -0
  103. package/dashboard/dist/assets/{NamespacePill-uW-xOedj.js → NamespacePill-BGf0jHwE.js} +2 -2
  104. package/dashboard/dist/assets/{NamespacePill-uW-xOedj.js.map → NamespacePill-BGf0jHwE.js.map} +1 -1
  105. package/dashboard/dist/assets/OperationsPage-CAmiFHI6.js +2 -0
  106. package/dashboard/dist/assets/OperationsPage-CAmiFHI6.js.map +1 -0
  107. package/dashboard/dist/assets/{OperatorDashboard-DYw9Ekv5.js → OperatorDashboard-i8cxaDlk.js} +2 -2
  108. package/dashboard/dist/assets/{OperatorDashboard-DYw9Ekv5.js.map → OperatorDashboard-i8cxaDlk.js.map} +1 -1
  109. package/dashboard/dist/assets/{PageHeader-DVOZjBfL.js → PageHeader-BZJsEVOC.js} +2 -2
  110. package/dashboard/dist/assets/{PageHeader-DVOZjBfL.js.map → PageHeader-BZJsEVOC.js.map} +1 -1
  111. package/dashboard/dist/assets/{PageHeaderWithStats-DtTpDHOd.js → PageHeaderWithStats-BWuD7s9c.js} +2 -2
  112. package/dashboard/dist/assets/{PageHeaderWithStats-DtTpDHOd.js.map → PageHeaderWithStats-BWuD7s9c.js.map} +1 -1
  113. package/dashboard/dist/assets/{ProcessDetailPage-B0Dokcx9.js → ProcessDetailPage-CP7GZhgs.js} +2 -2
  114. package/dashboard/dist/assets/{ProcessDetailPage-B0Dokcx9.js.map → ProcessDetailPage-CP7GZhgs.js.map} +1 -1
  115. package/dashboard/dist/assets/{ProcessesListPage-Cc87WIjL.js → ProcessesListPage-btsU6hBR.js} +2 -2
  116. package/dashboard/dist/assets/{ProcessesListPage-Cc87WIjL.js.map → ProcessesListPage-btsU6hBR.js.map} +1 -1
  117. package/dashboard/dist/assets/RoleDetailPage-BB_e330f.js +16 -0
  118. package/dashboard/dist/assets/RoleDetailPage-BB_e330f.js.map +1 -0
  119. package/dashboard/dist/assets/{RolePill-BaW-30TC.js → RolePill-Pb9TKSQN.js} +2 -2
  120. package/dashboard/dist/assets/{RolePill-BaW-30TC.js.map → RolePill-Pb9TKSQN.js.map} +1 -1
  121. package/dashboard/dist/assets/RolesPage-1DBoEMsb.js +2 -0
  122. package/dashboard/dist/assets/RolesPage-1DBoEMsb.js.map +1 -0
  123. package/dashboard/dist/assets/{RunAsSelector-2LWkjSnO.js → RunAsSelector-Cp6j3FEY.js} +2 -2
  124. package/dashboard/dist/assets/{RunAsSelector-2LWkjSnO.js.map → RunAsSelector-Cp6j3FEY.js.map} +1 -1
  125. package/dashboard/dist/assets/StatusBadge-D9MeQHrh.js +2 -0
  126. package/dashboard/dist/assets/StatusBadge-D9MeQHrh.js.map +1 -0
  127. package/dashboard/dist/assets/StickyPagination-Pr8kawv8.js +2 -0
  128. package/dashboard/dist/assets/StickyPagination-Pr8kawv8.js.map +1 -0
  129. package/dashboard/dist/assets/StreamMessageDetail-BqmQ-N3y.js +2 -0
  130. package/dashboard/dist/assets/{StreamMessageDetail-BTtw3GjX.js.map → StreamMessageDetail-BqmQ-N3y.js.map} +1 -1
  131. package/dashboard/dist/assets/{SwimlaneTimeline-DdXxP4fO.js → SwimlaneTimeline-y1YmXrsj.js} +2 -2
  132. package/dashboard/dist/assets/{SwimlaneTimeline-DdXxP4fO.js.map → SwimlaneTimeline-y1YmXrsj.js.map} +1 -1
  133. package/dashboard/dist/assets/{TagInput-x9XTuqMb.js → TagInput-Df4myuYF.js} +2 -2
  134. package/dashboard/dist/assets/{TagInput-x9XTuqMb.js.map → TagInput-Df4myuYF.js.map} +1 -1
  135. package/dashboard/dist/assets/{TaskDetailPage-B8veYG4X.js → TaskDetailPage-CT5rXHK5.js} +2 -2
  136. package/dashboard/dist/assets/{TaskDetailPage-B8veYG4X.js.map → TaskDetailPage-CT5rXHK5.js.map} +1 -1
  137. package/dashboard/dist/assets/{TaskQueuePill-DSEQZ-HT.js → TaskQueuePill-YalYdCNo.js} +2 -2
  138. package/dashboard/dist/assets/{TaskQueuePill-DSEQZ-HT.js.map → TaskQueuePill-YalYdCNo.js.map} +1 -1
  139. package/dashboard/dist/assets/{TasksListPage-CsN1gZj5.js → TasksListPage-DOy6JlKS.js} +2 -2
  140. package/dashboard/dist/assets/{TasksListPage-CsN1gZj5.js.map → TasksListPage-DOy6JlKS.js.map} +1 -1
  141. package/dashboard/dist/assets/TimeAgo-BAQwZSpq.js +2 -0
  142. package/dashboard/dist/assets/{TimeAgo-n182EcLx.js.map → TimeAgo-BAQwZSpq.js.map} +1 -1
  143. package/dashboard/dist/assets/{TimestampCell-2dlcQAfX.js → TimestampCell-BK_jufns.js} +2 -2
  144. package/dashboard/dist/assets/{TimestampCell-2dlcQAfX.js.map → TimestampCell-BK_jufns.js.map} +1 -1
  145. package/dashboard/dist/assets/{ToolPill-B_e4eT77.js → ToolPill-VGpT6Quy.js} +2 -2
  146. package/dashboard/dist/assets/{ToolPill-B_e4eT77.js.map → ToolPill-VGpT6Quy.js.map} +1 -1
  147. package/dashboard/dist/assets/{ToolTestPanel-Bhnncc6M.js → ToolTestPanel-5PMQyUCe.js} +2 -2
  148. package/dashboard/dist/assets/{ToolTestPanel-Bhnncc6M.js.map → ToolTestPanel-5PMQyUCe.js.map} +1 -1
  149. package/dashboard/dist/assets/{TopicDetailPage-29lsNsqI.js → TopicDetailPage-Cn1ShfR8.js} +3 -3
  150. package/dashboard/dist/assets/TopicDetailPage-Cn1ShfR8.js.map +1 -0
  151. package/dashboard/dist/assets/TopicsPage-D67tjS8L.js +2 -0
  152. package/dashboard/dist/assets/TopicsPage-D67tjS8L.js.map +1 -0
  153. package/dashboard/dist/assets/{UserName-CMoFi9zb.js → UserName-Dsu1Jk4N.js} +2 -2
  154. package/dashboard/dist/assets/{UserName-CMoFi9zb.js.map → UserName-Dsu1Jk4N.js.map} +1 -1
  155. package/dashboard/dist/assets/{WorkflowExecutionPage-Cymfx-Bp.js → WorkflowExecutionPage-BwQoOmUE.js} +2 -2
  156. package/dashboard/dist/assets/{WorkflowExecutionPage-Cymfx-Bp.js.map → WorkflowExecutionPage-BwQoOmUE.js.map} +1 -1
  157. package/dashboard/dist/assets/{WorkflowPill-B66_AnaY.js → WorkflowPill-pPUqmx6Q.js} +2 -2
  158. package/dashboard/dist/assets/{WorkflowPill-B66_AnaY.js.map → WorkflowPill-pPUqmx6Q.js.map} +1 -1
  159. package/dashboard/dist/assets/WorkflowsDashboard-D3z7COgH.js +2 -0
  160. package/dashboard/dist/assets/WorkflowsDashboard-D3z7COgH.js.map +1 -0
  161. package/dashboard/dist/assets/{WorkflowsOverview-0Rc2WT6q.js → WorkflowsOverview-C15JcxyY.js} +2 -2
  162. package/dashboard/dist/assets/{WorkflowsOverview-0Rc2WT6q.js.map → WorkflowsOverview-C15JcxyY.js.map} +1 -1
  163. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CARQ7_LN.js → YamlWorkflowDetailPage-BYq3t7E-.js} +25 -25
  164. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CARQ7_LN.js.map → YamlWorkflowDetailPage-BYq3t7E-.js.map} +1 -1
  165. package/dashboard/dist/assets/YamlWorkflowsPage-B44WgwE_.js +2 -0
  166. package/dashboard/dist/assets/{YamlWorkflowsPage-B-7sz1nf.js.map → YamlWorkflowsPage-B44WgwE_.js.map} +1 -1
  167. package/dashboard/dist/assets/{agents-zM43d5Yf.js → agents-BRmmK6Y9.js} +2 -2
  168. package/dashboard/dist/assets/{agents-zM43d5Yf.js.map → agents-BRmmK6Y9.js.map} +1 -1
  169. package/dashboard/dist/assets/{bots-D5BasOGz.js → bots-BD75mzGG.js} +2 -2
  170. package/dashboard/dist/assets/{bots-D5BasOGz.js.map → bots-BD75mzGG.js.map} +1 -1
  171. package/dashboard/dist/assets/{capabilities-BT3PW9CZ.js → capabilities-DDgC_Kds.js} +2 -2
  172. package/dashboard/dist/assets/{capabilities-BT3PW9CZ.js.map → capabilities-DDgC_Kds.js.map} +1 -1
  173. package/dashboard/dist/assets/controlplane-BJh12lMv.js +2 -0
  174. package/dashboard/dist/assets/controlplane-BJh12lMv.js.map +1 -0
  175. package/dashboard/dist/assets/{escalation-DrzQolPG.js → escalation-DIJt2sgn.js} +2 -2
  176. package/dashboard/dist/assets/{escalation-DrzQolPG.js.map → escalation-DIJt2sgn.js.map} +1 -1
  177. package/dashboard/dist/assets/escalation-columns-zl6E94Up.js +2 -0
  178. package/dashboard/dist/assets/escalation-columns-zl6E94Up.js.map +1 -0
  179. package/dashboard/dist/assets/{index-C_NwHTMh.js → index-B0kmiSmt.js} +2 -2
  180. package/dashboard/dist/assets/{index-C_NwHTMh.js.map → index-B0kmiSmt.js.map} +1 -1
  181. package/dashboard/dist/assets/index-BRtKQtQZ.css +1 -0
  182. package/dashboard/dist/assets/index-BUbzfEA9.js +6 -0
  183. package/dashboard/dist/assets/index-BUbzfEA9.js.map +1 -0
  184. package/dashboard/dist/assets/index-BhznDv-4.js +2 -0
  185. package/dashboard/dist/assets/index-BhznDv-4.js.map +1 -0
  186. package/dashboard/dist/assets/index-CDPBXB4e.js +9 -0
  187. package/dashboard/dist/assets/index-CDPBXB4e.js.map +1 -0
  188. package/dashboard/dist/assets/{index-qr1fndqM.js → index-CV4lEd4I.js} +2 -2
  189. package/dashboard/dist/assets/{index-qr1fndqM.js.map → index-CV4lEd4I.js.map} +1 -1
  190. package/dashboard/dist/assets/{index-y-3ODtEE.js → index-CknKy4RA.js} +2 -2
  191. package/dashboard/dist/assets/{index-y-3ODtEE.js.map → index-CknKy4RA.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-DH_CiD0W.js → index-CpgV4Kkp.js} +2 -2
  193. package/dashboard/dist/assets/{index-DH_CiD0W.js.map → index-CpgV4Kkp.js.map} +1 -1
  194. package/dashboard/dist/assets/{index-DE0r9SEX.js → index-CtDf8vvQ.js} +24 -24
  195. package/dashboard/dist/assets/index-CtDf8vvQ.js.map +1 -0
  196. package/dashboard/dist/assets/{index-C69XvBfg.js → index-DU7YumVJ.js} +2 -2
  197. package/dashboard/dist/assets/{index-C69XvBfg.js.map → index-DU7YumVJ.js.map} +1 -1
  198. package/dashboard/dist/assets/{index-y56Ds-LB.js → index-DVVIeBBk.js} +2 -2
  199. package/dashboard/dist/assets/{index-y56Ds-LB.js.map → index-DVVIeBBk.js.map} +1 -1
  200. package/dashboard/dist/assets/index-DccCwyZl.js +6 -0
  201. package/dashboard/dist/assets/{index-B5w4Gjyk.js.map → index-DccCwyZl.js.map} +1 -1
  202. package/dashboard/dist/assets/index-DrUkTcn-.js +2 -0
  203. package/dashboard/dist/assets/index-DrUkTcn-.js.map +1 -0
  204. package/dashboard/dist/assets/{index-Cq0trGqf.js → index-j-C7g_Ej.js} +2 -2
  205. package/dashboard/dist/assets/{index-Cq0trGqf.js.map → index-j-C7g_Ej.js.map} +1 -1
  206. package/dashboard/dist/assets/{knowledge-DSSATOTX.js → knowledge-pNDWACXB.js} +2 -2
  207. package/dashboard/dist/assets/{knowledge-DSSATOTX.js.map → knowledge-pNDWACXB.js.map} +1 -1
  208. package/dashboard/dist/assets/{mcp-query-DKVx2Q-X.js → mcp-query-CmNjvxTG.js} +2 -2
  209. package/dashboard/dist/assets/{mcp-query-DKVx2Q-X.js.map → mcp-query-CmNjvxTG.js.map} +1 -1
  210. package/dashboard/dist/assets/{mcp-CfJFVo5k.js → mcp-xddLBwUW.js} +2 -2
  211. package/dashboard/dist/assets/{mcp-CfJFVo5k.js.map → mcp-xddLBwUW.js.map} +1 -1
  212. package/dashboard/dist/assets/pipelines-B05sd2nB.js +2 -0
  213. package/dashboard/dist/assets/pipelines-B05sd2nB.js.map +1 -0
  214. package/dashboard/dist/assets/roles-bRgaMcdy.js +2 -0
  215. package/dashboard/dist/assets/roles-bRgaMcdy.js.map +1 -0
  216. package/dashboard/dist/assets/tasks-Bm1OKrJA.js +2 -0
  217. package/dashboard/dist/assets/{tasks-B7rUihoH.js.map → tasks-Bm1OKrJA.js.map} +1 -1
  218. package/dashboard/dist/assets/{topics-PC2fEiyD.js → topics-BVIqtmd4.js} +2 -2
  219. package/dashboard/dist/assets/{topics-PC2fEiyD.js.map → topics-BVIqtmd4.js.map} +1 -1
  220. package/dashboard/dist/assets/useEventHooks-_qCzU74s.js +2 -0
  221. package/dashboard/dist/assets/useEventHooks-_qCzU74s.js.map +1 -0
  222. package/dashboard/dist/assets/{useNamespace-3IjtUtAw.js → useNamespace-CDnCSFpG.js} +2 -2
  223. package/dashboard/dist/assets/{useNamespace-3IjtUtAw.js.map → useNamespace-CDnCSFpG.js.map} +1 -1
  224. package/dashboard/dist/assets/{useYamlActivityEvents-uxukp3gO.js → useYamlActivityEvents-zrHMhaFM.js} +2 -2
  225. package/dashboard/dist/assets/{useYamlActivityEvents-uxukp3gO.js.map → useYamlActivityEvents-zrHMhaFM.js.map} +1 -1
  226. package/dashboard/dist/assets/{users-CC4B5Fm5.js → users-BPBMZg27.js} +2 -2
  227. package/dashboard/dist/assets/{users-CC4B5Fm5.js.map → users-BPBMZg27.js.map} +1 -1
  228. package/dashboard/dist/assets/{vendor-icons-Dy5Jpknf.js → vendor-icons-C1zVP_dv.js} +140 -110
  229. package/dashboard/dist/assets/vendor-icons-C1zVP_dv.js.map +1 -0
  230. package/dashboard/dist/assets/workflows-CT6nTL1I.js +2 -0
  231. package/dashboard/dist/assets/workflows-CT6nTL1I.js.map +1 -0
  232. package/dashboard/dist/assets/{yaml-workflows-WfdaMHNn.js → yaml-workflows-CdfjkOKU.js} +2 -2
  233. package/dashboard/dist/assets/{yaml-workflows-WfdaMHNn.js.map → yaml-workflows-CdfjkOKU.js.map} +1 -1
  234. package/dashboard/dist/index.html +3 -3
  235. package/docs/api/http/escalations.md +82 -6
  236. package/docs/api/http/roles.md +82 -3
  237. package/docs/api/mcp/admin.md +127 -1
  238. package/docs/api/sdk/escalations.md +65 -4
  239. package/docs/api/sdk/roles.md +81 -0
  240. package/docs/cli.md +2 -0
  241. package/docs/dashboard.md +17 -2
  242. package/docs/hitl-guide.md +12 -3
  243. package/docs/operations.md +113 -0
  244. package/package.json +3 -2
  245. package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js.map +0 -1
  246. package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js +0 -2
  247. package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js +0 -2
  248. package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js.map +0 -1
  249. package/dashboard/dist/assets/CapabilitiesPage-ByDf6WJr.js +0 -2
  250. package/dashboard/dist/assets/CapabilitiesPage-ByDf6WJr.js.map +0 -1
  251. package/dashboard/dist/assets/DataTable-D9yuBv0w.js.map +0 -1
  252. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  253. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js.map +0 -1
  254. package/dashboard/dist/assets/GraphInvokePage-BXdgciWg.js +0 -2
  255. package/dashboard/dist/assets/GraphInvokePage-BXdgciWg.js.map +0 -1
  256. package/dashboard/dist/assets/HomePage-CEMxnk0r.js +0 -2
  257. package/dashboard/dist/assets/HomePage-CEMxnk0r.js.map +0 -1
  258. package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js +0 -2
  259. package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js.map +0 -1
  260. package/dashboard/dist/assets/RolesPage-cp6PiF08.js +0 -2
  261. package/dashboard/dist/assets/RolesPage-cp6PiF08.js.map +0 -1
  262. package/dashboard/dist/assets/StatusBadge-Bl3FXVmF.js +0 -2
  263. package/dashboard/dist/assets/StatusBadge-Bl3FXVmF.js.map +0 -1
  264. package/dashboard/dist/assets/StickyPagination-BQEm--kI.js +0 -2
  265. package/dashboard/dist/assets/StickyPagination-BQEm--kI.js.map +0 -1
  266. package/dashboard/dist/assets/StreamMessageDetail-BTtw3GjX.js +0 -2
  267. package/dashboard/dist/assets/TimeAgo-n182EcLx.js +0 -2
  268. package/dashboard/dist/assets/TopicDetailPage-29lsNsqI.js.map +0 -1
  269. package/dashboard/dist/assets/TopicsPage-KJ7_LAvo.js +0 -2
  270. package/dashboard/dist/assets/TopicsPage-KJ7_LAvo.js.map +0 -1
  271. package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js +0 -2
  272. package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js.map +0 -1
  273. package/dashboard/dist/assets/YamlWorkflowsPage-B-7sz1nf.js +0 -2
  274. package/dashboard/dist/assets/controlplane-NpJr49rN.js +0 -2
  275. package/dashboard/dist/assets/controlplane-NpJr49rN.js.map +0 -1
  276. package/dashboard/dist/assets/escalation-columns-QzwmtD60.js +0 -2
  277. package/dashboard/dist/assets/escalation-columns-QzwmtD60.js.map +0 -1
  278. package/dashboard/dist/assets/index-B5w4Gjyk.js +0 -6
  279. package/dashboard/dist/assets/index-BCT4kqGR.js +0 -9
  280. package/dashboard/dist/assets/index-BCT4kqGR.js.map +0 -1
  281. package/dashboard/dist/assets/index-CHw4Fl0t.css +0 -1
  282. package/dashboard/dist/assets/index-DE0r9SEX.js.map +0 -1
  283. package/dashboard/dist/assets/index-K23FdS-T.js +0 -6
  284. package/dashboard/dist/assets/index-K23FdS-T.js.map +0 -1
  285. package/dashboard/dist/assets/index-f6K1UNrn.js +0 -2
  286. package/dashboard/dist/assets/index-f6K1UNrn.js.map +0 -1
  287. package/dashboard/dist/assets/index-vKTvJ_li.js +0 -2
  288. package/dashboard/dist/assets/index-vKTvJ_li.js.map +0 -1
  289. package/dashboard/dist/assets/pipelines-BSWzE-6M.js +0 -2
  290. package/dashboard/dist/assets/pipelines-BSWzE-6M.js.map +0 -1
  291. package/dashboard/dist/assets/roles-t9HzhI5N.js +0 -2
  292. package/dashboard/dist/assets/roles-t9HzhI5N.js.map +0 -1
  293. package/dashboard/dist/assets/tasks-B7rUihoH.js +0 -2
  294. package/dashboard/dist/assets/useEventHooks-DK9mw1cI.js +0 -2
  295. package/dashboard/dist/assets/useEventHooks-DK9mw1cI.js.map +0 -1
  296. package/dashboard/dist/assets/vendor-icons-Dy5Jpknf.js.map +0 -1
  297. package/dashboard/dist/assets/workflows-S7MF1nNk.js +0 -2
  298. package/dashboard/dist/assets/workflows-S7MF1nNk.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{j as e,a as c}from"./vendor-query-B2UbickB.js";function u({children:a,actions:s}){return e.jsx("div",{className:"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50",children:e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[a,s&&e.jsx("div",{className:"ml-auto flex items-center gap-2",children:s})]})})}function m({label:a,value:s,onChange:n,options:i,required:x,placeholder:r}){return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("label",{className:"text-[10px] text-text-tertiary",children:a}),e.jsxs("select",{value:s,onChange:t=>n(t.target.value),className:"select text-[11px] py-1 px-2",children:[!x&&e.jsx("option",{value:"",children:r||"All"}),i.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value))]})]})}function d({label:a,value:s,onChange:n,placeholder:i}){const[x,r]=c.useState(s),t=c.useRef(void 0);c.useEffect(()=>{r(s)},[s]);const o=l=>{r(l),clearTimeout(t.current),t.current=setTimeout(()=>n(l),300)};return c.useEffect(()=>()=>clearTimeout(t.current),[]),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("label",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:a}),e.jsx("input",{type:"text",value:x,onChange:l=>o(l.target.value),placeholder:i,className:"input text-[11px] py-1 px-2 w-48 font-mono"})]})}export{u as F,d as a,m as b};
2
- //# sourceMappingURL=FilterBar-Ck4K4rzu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FilterBar-Ck4K4rzu.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxs","jsx","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"sDAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,aACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWE,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAF,CAAA,CAAQ,CAAA,CAAA,CACxE,CAAA,CACF,CAEJ,CAYO,SAASG,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACER,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,EAAM,EACzDH,EAAAA,KAAC,SAAA,CACC,MAAAI,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,MAAC,SAAA,CAAO,MAAM,GAAI,YAAe,MAAM,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,IAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,KAEjB,CACD,CAAA,CAAA,CAAA,CACH,EACF,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDf,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,EAAM,EAC3EF,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,CAAA,CACZ,EACF,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{a as l,j as e}from"./vendor-query-B2UbickB.js";import{l as O,u as P}from"./yaml-workflows-WfdaMHNn.js";import{P as J}from"./PageHeader-DVOZjBfL.js";import{u as E}from"./useYamlActivityEvents-uxukp3gO.js";import{R as L}from"./RunAsSelector-2LWkjSnO.js";import{b as A}from"./helpers-DzO-OGPe.js";import{X as $,ac as z,ad as M,P as k,a5 as T}from"./vendor-icons-Dy5Jpknf.js";import{L as F,f as W}from"./vendor-react-CXumBFUA.js";import{S as G}from"./index-DE0r9SEX.js";import{T as U}from"./ToolPill-B_e4eT77.js";import{N as Y}from"./NamespacePill-uW-xOedj.js";import"./BotPicker-D-FvXJOM.js";import"./bots-D5BasOGz.js";const S={mcp:{border:"border-blue-500",text:"text-blue-500",icon:"MCP"},db:{border:"border-blue-500",text:"text-blue-500",icon:"DB"},llm:{border:"border-violet-500",text:"text-violet-500",icon:"LLM"},transform:{border:"border-emerald-500",text:"text-emerald-500",icon:"Map"}};function q({steps:a,manifest:d,isComplete:i}){const s=d.filter(t=>t.type==="worker"),x=s.length,r=s.map(t=>{const n=a.find(p=>p.activityId===t.activity_id),u=t.tool_source||"mcp",h=S[u]||S.mcp;return{activityId:t.activity_id,title:t.title||t.mcp_tool_name||t.activity_id,toolName:t.mcp_tool_name,colors:h,status:(n==null?void 0:n.status)||"pending",error:n==null?void 0:n.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] text-text-secondary mb-3",children:i?`All ${x} steps completed`:`Running step ${r.filter(t=>t.status==="completed").length+1} of ${x}...`}),e.jsx("div",{className:"space-y-0",children:r.map((t,n)=>{const u=n===r.length-1;return e.jsxs("div",{className:"flex items-stretch gap-2",children:[e.jsxs("div",{className:"flex flex-col items-center w-4 shrink-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${t.status==="completed"?"bg-status-success border-status-success":t.status==="running"?`${t.colors.border} bg-transparent animate-pulse`:t.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!u&&e.jsx("span",{className:`w-px flex-1 transition-colors ${t.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:u?"":"pb-3",children:[e.jsx("p",{className:`text-[11px] font-medium ${t.status==="running"?"text-text-primary":t.status==="completed"?"text-text-secondary":t.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:t.title}),t.toolName&&e.jsx("span",{className:"text-[9px] text-text-tertiary font-mono",children:t.toolName}),t.error&&e.jsx("p",{className:"text-[9px] text-status-error mt-0.5",children:t.error})]})]},t.activityId)})})]})}function B({workflow:a,onClose:d}){const i=O(),[s,x]=l.useState(!1),[r,t]=l.useState({}),[n,u]=l.useState(""),[h,p]=l.useState(""),[g,w]=l.useState(""),[f,j]=l.useState(null),[N,b]=l.useState(null),{steps:C,isComplete:y}=E(f);l.useEffect(()=>{j(null),b(null),p(""),i.reset();const c=A(a.input_schema);t(c),u(JSON.stringify(c,null,2)),x(!1)},[a.id]),l.useEffect(()=>{if(y&&f){const c=f,o=setTimeout(()=>{b({jobId:c}),j(null)},800);return()=>clearTimeout(o)}},[y,f]);const _=()=>{if(!s)u(JSON.stringify(r,null,2));else try{t(JSON.parse(n))}catch{}x(!s)},R=async()=>{p(""),b(null);let c;if(s)try{c=JSON.parse(n)}catch{p("Invalid JSON");return}else c={...r};try{const o=await i.mutateAsync({id:a.id,data:c,sync:!1,...g?{execute_as:g}:{}});o.job_id&&j(o.job_id)}catch{}},v=!!f,I=a.app_id||"";return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary truncate",children:a.app_id}),e.jsx("code",{className:"text-[11px] font-mono text-accent truncate block",children:a.graph_topic})]}),e.jsx("button",{onClick:()=>{v||d()},className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsx($,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:v?e.jsx(q,{steps:C,manifest:a.activity_manifest,isComplete:y}):N?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(F,{to:`/mcp/executions/${encodeURIComponent(N.jobId)}?namespace=${encodeURIComponent(I)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(z,{size:12})," View execution"]}),e.jsxs("button",{onClick:()=>b(null),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(M,{size:12})," Run again"]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx(L,{selected:g,onChange:w}),a.description&&e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:a.description}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Input"}),e.jsx("button",{onClick:_,className:"text-[10px] text-accent hover:underline",children:s?"Form view":"JSON view"})]}),s?e.jsx("textarea",{value:n,onChange:c=>u(c.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(r).map(([c,o])=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:c}),typeof o=="boolean"?e.jsxs("select",{value:String(o),onChange:m=>t({...r,[c]:m.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):typeof o=="object"?e.jsx("textarea",{value:JSON.stringify(o,null,2),onChange:m=>{try{t({...r,[c]:JSON.parse(m.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"}):e.jsx("input",{type:typeof o=="number"?"number":"text",value:String(o??""),onChange:m=>t({...r,[c]:typeof o=="number"?Number(m.target.value):m.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"})]},c)),Object.keys(r).length===0&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"})]}),h&&e.jsx("p",{className:"text-[11px] text-status-error mt-1",children:h})]}),i.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-[11px] text-status-error",children:i.error instanceof Error?i.error.message:"Invocation failed"})}),e.jsx("button",{onClick:R,disabled:i.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:i.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(k,{size:12})," Run"]})})]})})]})}function H({flows:a,selectedId:d,onSelect:i}){return e.jsxs("div",{children:[e.jsx(G,{className:"mb-4",children:"Select Flow"}),e.jsx("div",{children:a.map(s=>{const x=d===s.id;return e.jsxs("button",{onClick:()=>i(s),className:`w-full text-left px-6 py-3.5 border-b border-surface-border/50 transition-colors duration-150 ${x?"border-l-2 border-l-accent":"hover:bg-surface-hover/30"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(U,{name:s.graph_topic,size:"md"}),e.jsx(Y,{namespace:s.app_id}),s.cron_schedule&&e.jsx("span",{title:"Cron schedule active",children:e.jsx(T,{className:"w-3 h-3 text-status-success/70 shrink-0"})})]}),s.description&&e.jsx("p",{className:"text-[10px] text-text-quaternary mt-1 leading-snug",children:s.description})]},s.id)})})]})}function ie(){const[a,d]=W(),i=a.get("id")??"",{data:s,isLoading:x}=P({status:"active",limit:200,offset:0}),r=(s==null?void 0:s.workflows)??[],t=r.find(n=>n.id===i)??null;return l.useEffect(()=>{r.length===1&&!a.get("id")&&d({id:r[0].id},{replace:!0})},[r.length]),x?e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]}):e.jsxs("div",{children:[e.jsx(J,{title:"Invoke",docsHash:"#docs:dashboard.md:mcp-pipeline-tools"}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Run a Graph flow — the compiled form of a durable workflow that the router discovers and executes on demand. The procedural form runs under Orchestrate › Procedural."}),r.length===0?e.jsxs("div",{className:"py-16 text-center",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:"No active graph flows"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Register graph flows at startup with the graphWorkflows config, or deploy one from Configure."})]}):e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-8",children:[e.jsx(H,{flows:r,selectedId:i,onSelect:n=>d({id:n.id},{replace:!0})}),e.jsx("div",{className:"lg:col-span-2",children:t?e.jsx(B,{workflow:t,onClose:()=>d({},{replace:!0})}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-24 text-center",children:[e.jsx("div",{className:"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4",children:e.jsx(k,{className:"w-5 h-5 text-accent/50"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-1",children:"Run"}),e.jsx("p",{className:"text-xs text-text-quaternary",children:"Choose a flow to get started"})]})})]})]})}export{ie as GraphInvokePage};
2
- //# sourceMappingURL=GraphInvokePage-BXdgciWg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GraphInvokePage-BXdgciWg.js","sources":["../../src/components/common/test/WorkflowTestPanel.tsx","../../src/pages/workflows/GraphFlowSelector.tsx","../../src/pages/workflows/GraphInvokePage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, Play, RotateCcw, ExternalLink } from 'lucide-react';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents, type ActivityStep } from '../../../hooks/useYamlActivityEvents';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-blue-500', text: 'text-blue-500', icon: 'MCP' },\n db: { border: 'border-blue-500', text: 'text-blue-500', icon: 'DB' },\n llm: { border: 'border-violet-500', text: 'text-violet-500', icon: 'LLM' },\n transform: { border: 'border-emerald-500', text: 'text-emerald-500', icon: 'Map' },\n};\n\nfunction LiveTimeline({ steps, manifest, isComplete }: {\n steps: ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-[11px] text-text-secondary mb-3\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-2\">\n <div className=\"flex flex-col items-center w-4 shrink-0\">\n <span className={`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={isLast ? '' : 'pb-3'}>\n <p className={`text-[11px] font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>{step.title}</p>\n {step.toolName && (\n <span className=\"text-[9px] text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n {step.error && (\n <p className=\"text-[9px] text-status-error mt-0.5\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface WorkflowTestPanelProps {\n workflow: LTYamlWorkflowRecord;\n onClose: () => void;\n}\n\nexport function WorkflowTestPanel({ workflow, onClose }: WorkflowTestPanelProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n useEffect(() => {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n const skeleton = buildSkeleton(workflow.input_schema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n }, [workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n try {\n const result = await invokeMutation.mutateAsync({\n id: workflow.id,\n data: parsed,\n sync: false,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n if (result.job_id) setActiveJobId(result.job_id);\n } catch { /* error shown in panel */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || '';\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">{workflow.app_id}</p>\n <code className=\"text-[11px] font-mono text-accent truncate block\">{workflow.graph_topic}</code>\n </div>\n <button onClick={() => { if (!isRunning) onClose(); }} className=\"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-4\">\n {isRunning ? (\n <LiveTimeline steps={steps} manifest={workflow.activity_manifest} isComplete={isComplete} />\n ) : completedResult ? (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n <div className=\"flex items-center justify-between\">\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} /> View execution\n </Link>\n <button\n onClick={() => setCompletedResult(null)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n <>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n\n {workflow.description && (\n <p className=\"text-[11px] text-text-secondary leading-relaxed\">{workflow.description}</p>\n )}\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Input</label>\n <button onClick={toggleMode} className=\"text-[10px] text-accent hover:underline\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3 max-h-[300px] overflow-y-auto\">\n {Object.entries(fields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-tertiary italic\">No input fields defined</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-[11px] text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-[11px] text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { Clock } from 'lucide-react';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { NamespacePill } from '../../components/common/display/NamespacePill';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\nexport function GraphFlowSelector({\n flows,\n selectedId,\n onSelect,\n}: {\n flows: LTYamlWorkflowRecord[];\n selectedId: string;\n onSelect: (flow: LTYamlWorkflowRecord) => void;\n}) {\n return (\n <div>\n <SectionLabel className=\"mb-4\">Select Flow</SectionLabel>\n <div>\n {flows.map((flow) => {\n const isSelected = selectedId === flow.id;\n return (\n <button\n key={flow.id}\n onClick={() => onSelect(flow)}\n className={`w-full text-left px-6 py-3.5 border-b border-surface-border/50 transition-colors duration-150 ${\n isSelected ? 'border-l-2 border-l-accent' : 'hover:bg-surface-hover/30'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n <ToolPill name={flow.graph_topic} size=\"md\" />\n <NamespacePill namespace={flow.app_id} />\n {flow.cron_schedule && (\n <span title=\"Cron schedule active\"><Clock className=\"w-3 h-3 text-status-success/70 shrink-0\" /></span>\n )}\n </div>\n {flow.description && (\n <p className=\"text-[10px] text-text-quaternary mt-1 leading-snug\">{flow.description}</p>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Play } from 'lucide-react';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { WorkflowTestPanel } from '../../components/common/test/WorkflowTestPanel';\nimport { GraphFlowSelector } from './GraphFlowSelector';\n\nexport function GraphInvokePage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const selectedId = searchParams.get('id') ?? '';\n\n const { data, isLoading } = useYamlWorkflows({ status: 'active' as any, limit: 200, offset: 0 });\n const flows = data?.workflows ?? [];\n const selected = flows.find((f) => f.id === selectedId) ?? null;\n\n // Auto-select when there's exactly one flow\n useEffect(() => {\n if (flows.length === 1 && !searchParams.get('id')) {\n setSearchParams({ id: flows[0].id }, { replace: true });\n }\n }, [flows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader title=\"Invoke\" docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\" />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Run a Graph flow — the compiled form of a durable workflow that the router discovers and\n executes on demand. The procedural form runs under Orchestrate › Procedural.\n </p>\n\n {flows.length === 0 ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-primary mb-1\">No active graph flows</p>\n <p className=\"text-xs text-text-tertiary\">\n Register graph flows at startup with the graphWorkflows config, or deploy one from Configure.\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-8\">\n <GraphFlowSelector\n flows={flows}\n selectedId={selectedId}\n onSelect={(f) => setSearchParams({ id: f.id }, { replace: true })}\n />\n\n <div className=\"lg:col-span-2\">\n {selected ? (\n <WorkflowTestPanel\n workflow={selected}\n onClose={() => setSearchParams({}, { replace: true })}\n />\n ) : (\n <div className=\"flex flex-col items-center justify-center py-24 text-center\">\n <div className=\"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4\">\n <Play className=\"w-5 h-5 text-accent/50\" />\n </div>\n <p className=\"text-sm text-text-secondary mb-1\">Run</p>\n <p className=\"text-xs text-text-quaternary\">Choose a flow to get started</p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsx","step","idx","isLast","jsxs","WorkflowTestPanel","workflow","onClose","invokeMutation","useInvokeYamlWorkflow","jsonMode","setJsonMode","useState","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","skeleton","buildSkeleton","jobId","timer","toggleMode","handleRun","parsed","result","isRunning","ns","X","Link","ExternalLink","RotateCcw","Fragment","RunAsSelector","e","key","value","Play","GraphFlowSelector","flows","selectedId","onSelect","SectionLabel","flow","isSelected","ToolPill","NamespacePill","Clock","GraphInvokePage","searchParams","setSearchParams","useSearchParams","data","isLoading","useYamlWorkflows","selected","f","PageHeader"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as l,j as e}from"./vendor-query-B2UbickB.js";import{j as oe,v as re,s as ce,t as le,c as P}from"./index-DE0r9SEX.js";import{b as de}from"./workflows-S7MF1nNk.js";import{u as xe}from"./pipelines-BSWzE-6M.js";import{u as pe}from"./controlplane-NpJr49rN.js";import{u as me}from"./tasks-B7rUihoH.js";import{e as ue,b as he,u as fe}from"./useEventHooks-DK9mw1cI.js";import{R as O}from"./RolePill-BaW-30TC.js";import{W as p}from"./WorkflowPill-B66_AnaY.js";import{L as m}from"./ListToolbar-_73JCdbB.js";import{I as k,ac as u,v as U,aI as G,u as J,B as je}from"./vendor-icons-Dy5Jpknf.js";import{c as X,f as ge}from"./vendor-react-CXumBFUA.js";const be={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function V(t){return be[t]??"bg-text-tertiary"}function h({icon:t,color:a,docsHash:n,count:i,children:r,actions:c}){return e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(t,{className:`w-4.5 h-4.5 ${a||"text-accent/60"}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:r}),i!==void 0&&i>0&&e.jsx("span",{className:"text-[10px] text-text-quaternary tabular-nums",children:i})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[n&&e.jsx("button",{onClick:()=>{window.location.hash=n},className:"text-text-quaternary hover:text-accent transition-colors",title:"Docs",children:e.jsx(je,{className:"w-2.5 h-2.5",strokeWidth:1.5})}),c]})]})}function f({icon:t,text:a}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(t,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:a})]})}function ve(t,a=37){if(!t||t.length<=a)return t;const n=Math.floor((a-3)/2);return`${t.slice(0,n)}...${t.slice(-n)}`}function E({dot:t,pill:a,id:n,date:i,onClick:r}){return e.jsxs("button",{onClick:r,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t}`}),e.jsx("span",{className:"text-[12px] text-text-primary font-mono truncate max-w-[60%]",children:ve(n)}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap",children:e.jsx(P,{date:i})})]}),e.jsx("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:a})]})}function j({to:t,icon:a,title:n}){const i=X();return e.jsx("button",{onClick:()=>i(t),className:"text-text-quaternary hover:text-accent transition-colors",title:n,children:e.jsx(a,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function K({appIds:t,selected:a,onSelect:n}){const[i,r]=l.useState(!1),c=l.useRef(null);return l.useEffect(()=>{if(!i)return;const o=g=>{c.current&&!c.current.contains(g.target)&&r(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[i]),t.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:c,children:[e.jsxs("button",{onClick:()=>r(o=>!o),className:"flex items-center gap-1 px-2 py-0.5 text-[10px] rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors",children:[a,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${i?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),i&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-30 py-1 min-w-[120px]",children:t.map(o=>e.jsx("button",{onClick:()=>{n(o),r(!1)},className:`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${a===o?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:o},o))})]})}function Ie(){var T,F,S,L,W,z,B,H,M,Q;const t=X(),{user:a}=oe(),{isBuilder:n}=re(),[i,r]=ge(),{data:c}=pe(),o=l.useMemo(()=>((c==null?void 0:c.apps)??[]).map(s=>s.appId).sort(),[c]),g=o[0]??"",b=i.get("pipelinenamespace")||g,_=i.get("durablenamespace")||g,A=l.useCallback((s,w)=>{r(ne=>{const D=new URLSearchParams(ne);return D.set(s,w),D},{replace:!1})},[r]);ue(),he(),fe();const v=me({limit:5}),y=de({limit:5,sort_by:"updated_at",order:"desc",namespace:_}),Y=o,Z=o,N=xe({limit:5,app_id:b,sort_by:"updated_at",order:"desc"}),d=ce({limit:5,sort_by:"created_at",order:"desc"}),x=le({assigned_to:a==null?void 0:a.userId,status:"pending",limit:5,sort_by:"created_at",order:"desc"});l.useEffect(()=>{const s=setTimeout(()=>{x.refetch(),d.refetch()},2e3);return()=>clearTimeout(s)},[]);const $=((T=v.data)==null?void 0:T.processes)??[],ee=(F=v.data)==null?void 0:F.total,C=((S=y.data)==null?void 0:S.jobs)??[],se=(L=y.data)==null?void 0:L.total,R=((W=N.data)==null?void 0:W.jobs)??[],te=(z=N.data)==null?void 0:z.total,q=((B=d.data)==null?void 0:B.escalations)??[],ae=(H=d.data)==null?void 0:H.total,I=((M=x.data)==null?void 0:M.escalations)??[],ie=(Q=x.data)==null?void 0:Q.total;return e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary mb-10",children:"Recent Activity"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-x-14",children:[e.jsxs("div",{children:[e.jsx(h,{icon:k,color:"text-blue-400",count:ae,docsHash:"#docs:dashboard.md:all-escalations",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(m,{onRefresh:()=>d.refetch(),isFetching:d.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(j,{to:"/escalations/available",icon:u,title:"All available escalations"})]}),children:"Available Escalations"}),q.length===0?e.jsx(f,{icon:k,text:"No pending escalations"}):e.jsx("div",{className:"space-y-1",children:q.map(s=>e.jsxs("button",{onClick:()=>t(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(P,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(p,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(O,{role:s.role})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsx(h,{icon:k,color:"text-orange-400",count:ie,docsHash:"#docs:dashboard.md:escalations-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(m,{onRefresh:()=>x.refetch(),isFetching:x.isFetching,apiPath:`/escalations?assigned_to=${(a==null?void 0:a.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(j,{to:"/escalations/queue",icon:u,title:"My escalation queue"})]}),children:"My Escalations"}),I.length===0?e.jsx(f,{icon:k,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-1",children:I.map(s=>e.jsxs("button",{onClick:()=>t(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(P,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(p,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(O,{role:s.role})]})]},s.id))})]})]}),n&&e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14",children:[e.jsxs("div",{children:[e.jsx(h,{icon:U,color:"text-emerald-400",count:ee,docsHash:"#docs:dashboard.md:processes-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(m,{onRefresh:()=>v.refetch(),isFetching:v.isFetching,apiPath:"/tasks/processes?limit=5"}),e.jsx(j,{to:"/processes/all",icon:u,title:"All processes"})]}),children:"Certified Processes"}),e.jsx("div",{className:"mb-3 -mt-2",children:e.jsx("span",{className:"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest",children:"all namespaces"})}),$.length===0?e.jsx(f,{icon:U,text:"No recent processes"}):e.jsx("div",{className:"space-y-1",children:$.map(s=>e.jsx(E,{dot:(s.task_count??0)>0&&(s.completed??0)>=(s.task_count??0)?"bg-status-success":(s.escalated??0)>0?"border border-status-error":"bg-status-active",pill:e.jsx(e.Fragment,{children:(s.workflow_types??[s.workflow_type]).filter(Boolean).map(w=>e.jsx(p,{type:w,size:"xs"},w))}),id:s.origin_id,date:s.last_activity??s.started_at,onClick:()=>t(`/processes/detail/${s.origin_id}`)},s.origin_id))})]}),e.jsxs("div",{children:[e.jsx(h,{icon:G,color:"text-blue-400",count:se,docsHash:"#docs:dashboard.md:durable-executions",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(m,{onRefresh:()=>y.refetch(),isFetching:y.isFetching,apiPath:`/workflow-states/jobs?namespace=${_}&limit=5`}),e.jsx(j,{to:"/workflows/executions",icon:u,title:"All durable executions"})]}),children:"Workflow Executions"}),e.jsx(K,{appIds:Y,selected:_,onSelect:s=>A("durablenamespace",s)}),C.length===0?e.jsx(f,{icon:G,text:"No recent executions"}):e.jsx("div",{className:"space-y-1",children:C.map(s=>e.jsx(E,{dot:V(s.status),pill:e.jsx(p,{type:s.entity||s.type||"workflow",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/workflows/executions/${s.workflow_id}`)},s.workflow_id))})]}),e.jsxs("div",{children:[e.jsx(h,{icon:J,color:"text-violet-400",count:te,docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(m,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:`/pipelines?app_id=${b}&limit=5`}),e.jsx(j,{to:"/mcp/executions",icon:u,title:"All pipeline executions"})]}),children:"Pipeline Executions"}),e.jsx(K,{appIds:Z,selected:b,onSelect:s=>A("pipelinenamespace",s)}),R.length===0?e.jsx(f,{icon:J,text:"No recent pipeline runs"}):e.jsx("div",{className:"space-y-1",children:R.map(s=>e.jsx(E,{dot:V(s.status),pill:e.jsx(p,{type:s.entity||s.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/mcp/executions/${s.workflow_id}?namespace=${b}`)},s.workflow_id))})]})]})]})}export{Ie as HomePage};
2
- //# sourceMappingURL=HomePage-CEMxnk0r.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HomePage-CEMxnk0r.js","sources":["../../src/pages/home/HomePage.tsx"],"sourcesContent":["import { useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n Inbox, ScrollText, GitBranch, Layers, ExternalLink, BookOpen,\n} from 'lucide-react';\nimport { useAvailableEscalations, useEscalations } from '../../api/escalations';\nimport { useJobs } from '../../api/workflows';\nimport { useMcpRuns } from '../../api/pipelines';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { useProcesses } from '../../api/tasks';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useAccess } from '../../hooks/useAccess';\nimport { useEscalationStatsEvents, useWorkflowListEvents, useProcessListEvents } from '../../hooks/useEventHooks';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nconst STATUS_DOT: Record<string, string> = {\n completed: 'bg-status-success',\n active: 'bg-status-active',\n running: 'bg-status-active',\n pending: 'bg-status-pending',\n error: 'bg-status-error',\n failed: 'bg-status-error',\n};\nfunction statusDotClass(status: string): string {\n return STATUS_DOT[status] ?? 'bg-text-tertiary';\n}\n\n// ── Section header ──────────────────────────────────────────────────────────\n\nfunction SectionHeader({ icon: Icon, color, docsHash, count, children, actions }: { icon: React.ElementType; color?: string; docsHash?: string; count?: number; children: React.ReactNode; actions?: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between mb-4 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4.5 h-4.5 ${color || 'text-accent/60'}`} strokeWidth={1.5} />\n <h2 className=\"text-sm font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n {count !== undefined && count > 0 && (\n <span className=\"text-[10px] text-text-quaternary tabular-nums\">{count}</span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {docsHash && (\n <button onClick={() => { window.location.hash = docsHash; }} className=\"text-text-quaternary hover:text-accent transition-colors\" title=\"Docs\">\n <BookOpen className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n )}\n {actions}\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel({ icon: Icon, text }: { icon: React.ElementType; text: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-10 text-center\">\n <Icon className=\"w-6 h-6 text-text-quaternary/50 mb-2\" strokeWidth={1} />\n <p className=\"text-xs text-text-quaternary\">{text}</p>\n </div>\n );\n}\n\n/** Middle-ellipsis: keep first N and last N chars with ... in between */\nfunction midEllipsis(s: string, maxLen = 37): string {\n if (!s || s.length <= maxLen) return s;\n const keep = Math.floor((maxLen - 3) / 2);\n return `${s.slice(0, keep)}...${s.slice(-keep)}`;\n}\n\n/** Consistent row for all execution lists in row 1 */\nfunction ExecutionRow({ dot, pill, id, date, onClick }: {\n dot: string;\n pill: React.ReactNode;\n id: string;\n date: string;\n onClick: () => void;\n}) {\n return (\n <button onClick={onClick} className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${dot}`} />\n <span className=\"text-[12px] text-text-primary font-mono truncate max-w-[60%]\">{midEllipsis(id)}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap\"><DateValue date={date} /></span>\n </div>\n <div className=\"pl-3.5 flex items-center gap-1 overflow-hidden\">{pill}</div>\n </button>\n );\n}\n\nfunction NavIcon({ to, icon: Icon, title }: { to: string; icon: React.ElementType; title: string }) {\n const navigate = useNavigate();\n return (\n <button\n onClick={() => navigate(to)}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title={title}\n >\n <Icon className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n );\n}\n\n// ── Namespace Picker ────────────────────────────────────────────────────────\n\nfunction AppPicker({ appIds, selected, onSelect }: {\n appIds: string[];\n selected: string;\n onSelect: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (appIds.length <= 1) return null;\n\n return (\n <div className=\"relative mb-3 -mt-2\" ref={ref}>\n <button\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1 px-2 py-0.5 text-[10px] rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors\"\n >\n {selected}\n <svg className={`w-2.5 h-2.5 transition-transform ${open ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {open && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-30 py-1 min-w-[120px]\">\n {appIds.map((id) => (\n <button\n key={id}\n onClick={() => { onSelect(id); setOpen(false); }}\n className={`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${\n selected === id ? 'text-accent bg-accent/5' : 'text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {id}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function HomePage() {\n const navigate = useNavigate();\n const { user } = useAuth();\n const { isBuilder } = useAccess();\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: cpData } = useControlPlaneApps();\n const allAppIds = useMemo(() => (cpData?.apps ?? []).map((a: any) => a.appId).sort(), [cpData]);\n const firstAppId = allAppIds[0] ?? '';\n const pipelineNs = searchParams.get('pipelinenamespace') || firstAppId;\n const durableNs = searchParams.get('durablenamespace') || firstAppId;\n const setNs = useCallback((key: string, ns: string) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(key, ns);\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n useEscalationStatsEvents();\n useWorkflowListEvents();\n useProcessListEvents();\n\n const procQ = useProcesses({ limit: 5 });\n const jobsQ = useJobs({ limit: 5, sort_by: 'updated_at', order: 'desc', namespace: durableNs });\n const durableAppIds = allAppIds;\n const pipelineAppIds = allAppIds;\n const mcpQ = useMcpRuns({ limit: 5, app_id: pipelineNs, sort_by: 'updated_at', order: 'desc' });\n const allEscQ = useAvailableEscalations({ limit: 5, sort_by: 'created_at', order: 'desc' });\n const myEscQ = useEscalations({ assigned_to: user?.userId, status: 'pending', limit: 5, sort_by: 'created_at', order: 'desc' });\n\n // Delayed refetch — allows signal-routed escalation resolutions\n // (durable activity) time to commit before refreshing the list\n useEffect(() => {\n const timer = setTimeout(() => {\n myEscQ.refetch();\n allEscQ.refetch();\n }, 2000);\n return () => clearTimeout(timer);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const processes = procQ.data?.processes ?? [];\n const processTotal = (procQ.data as any)?.total as number | undefined;\n const jobs = jobsQ.data?.jobs ?? [];\n const jobsTotal = jobsQ.data?.total;\n const mcpRuns = (mcpQ.data as any)?.jobs ?? [];\n const mcpTotal = (mcpQ.data as any)?.total as number | undefined;\n const allEscalations = allEscQ.data?.escalations ?? [];\n const allEscTotal = allEscQ.data?.total;\n const myEscalations = myEscQ.data?.escalations ?? [];\n const myEscTotal = myEscQ.data?.total;\n\n return (\n <div>\n <h1 className=\"text-3xl font-light text-text-primary mb-10\">Recent Activity</h1>\n\n {/* ── Row 1: Available Escalations | My Escalations ────────────────── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-x-14\">\n\n {/* Col 1: Available Escalations */}\n <div>\n <SectionHeader icon={Inbox} color=\"text-blue-400\" count={allEscTotal} docsHash=\"#docs:dashboard.md:all-escalations\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => allEscQ.refetch()} isFetching={allEscQ.isFetching} apiPath=\"/escalations?status=pending&limit=5&sort_by=created_at&order=desc\" />\n <NavIcon to=\"/escalations/available\" icon={ExternalLink} title=\"All available escalations\" />\n </div>\n }>\n Available Escalations\n </SectionHeader>\n {allEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No pending escalations\" />\n ) : (\n <div className=\"space-y-1\">\n {allEscalations.map((esc: any) => (\n <button\n key={esc.id}\n onClick={() => navigate(`/escalations/detail/${esc.id}`)}\n className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-[9px] text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-[12px] text-text-primary truncate flex-1 max-w-[65%]\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto\"><DateValue date={esc.updated_at ?? esc.created_at} /></span>\n </div>\n <div className=\"flex items-center gap-2 pl-5\">\n <WorkflowPill type={esc.type || 'unknown'} size=\"xs\" />\n <span className=\"flex-1\" />\n <RolePill role={esc.role} />\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: My Escalations */}\n <div>\n <SectionHeader icon={Inbox} color=\"text-orange-400\" count={myEscTotal} docsHash=\"#docs:dashboard.md:escalations-overview\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => myEscQ.refetch()} isFetching={myEscQ.isFetching} apiPath={`/escalations?assigned_to=${user?.userId ?? ''}&status=pending&limit=5&sort_by=created_at&order=desc`} />\n <NavIcon to=\"/escalations/queue\" icon={ExternalLink} title=\"My escalation queue\" />\n </div>\n }>\n My Escalations\n </SectionHeader>\n {myEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No assigned escalations\" />\n ) : (\n <div className=\"space-y-1\">\n {myEscalations.map((esc: any) => (\n <button\n key={esc.id}\n onClick={() => navigate(`/escalations/detail/${esc.id}`)}\n className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-[9px] text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-[12px] text-text-primary truncate flex-1 max-w-[65%]\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto\"><DateValue date={esc.updated_at ?? esc.created_at} /></span>\n </div>\n <div className=\"flex items-center gap-2 pl-5\">\n <WorkflowPill type={esc.type || 'unknown'} size=\"xs\" />\n <span className=\"flex-1\" />\n <RolePill role={esc.role} />\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* ── Row 2: Processes | Workflow Executions | Pipeline Executions (builders only) */}\n {isBuilder && <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14\">\n\n {/* Col 1: Processes */}\n <div>\n <SectionHeader icon={Layers} color=\"text-emerald-400\" count={processTotal} docsHash=\"#docs:dashboard.md:processes-overview\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => procQ.refetch()} isFetching={procQ.isFetching} apiPath=\"/tasks/processes?limit=5\" />\n <NavIcon to=\"/processes/all\" icon={ExternalLink} title=\"All processes\" />\n </div>\n }>\n Certified Processes\n </SectionHeader>\n <div className=\"mb-3 -mt-2\">\n <span className=\"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest\">all namespaces</span>\n </div>\n {processes.length === 0 ? (\n <EmptyPanel icon={Layers} text=\"No recent processes\" />\n ) : (\n <div className=\"space-y-1\">\n {processes.map((p: any) => (\n <ExecutionRow\n key={p.origin_id}\n dot={(p.task_count ?? 0) > 0 && (p.completed ?? 0) >= (p.task_count ?? 0) ? 'bg-status-success' : (p.escalated ?? 0) > 0 ? 'border border-status-error' : 'bg-status-active'}\n pill={<>{(p.workflow_types ?? [p.workflow_type]).filter(Boolean).map((wt: string) => <WorkflowPill key={wt} type={wt} size=\"xs\" />)}</>}\n id={p.origin_id}\n date={p.last_activity ?? p.started_at}\n onClick={() => navigate(`/processes/detail/${p.origin_id}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: Workflow Executions */}\n <div>\n <SectionHeader icon={ScrollText} color=\"text-blue-400\" count={jobsTotal} docsHash=\"#docs:dashboard.md:durable-executions\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => jobsQ.refetch()} isFetching={jobsQ.isFetching} apiPath={`/workflow-states/jobs?namespace=${durableNs}&limit=5`} />\n <NavIcon to=\"/workflows/executions\" icon={ExternalLink} title=\"All durable executions\" />\n </div>\n }>\n Workflow Executions\n </SectionHeader>\n <AppPicker appIds={durableAppIds} selected={durableNs} onSelect={(ns) => setNs('durablenamespace', ns)} />\n {jobs.length === 0 ? (\n <EmptyPanel icon={ScrollText} text=\"No recent executions\" />\n ) : (\n <div className=\"space-y-1\">\n {jobs.map((job: any) => (\n <ExecutionRow\n key={job.workflow_id}\n dot={statusDotClass(job.status)}\n pill={<WorkflowPill type={job.entity || job.type || 'workflow'} size=\"xs\" />}\n id={job.workflow_id}\n date={job.updated_at ?? job.created_at}\n onClick={() => navigate(`/workflows/executions/${job.workflow_id}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Col 3: Pipeline Executions */}\n <div>\n <SectionHeader icon={GitBranch} color=\"text-violet-400\" count={mcpTotal} docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => mcpQ.refetch()} isFetching={mcpQ.isFetching} apiPath={`/pipelines?app_id=${pipelineNs}&limit=5`} />\n <NavIcon to=\"/mcp/executions\" icon={ExternalLink} title=\"All pipeline executions\" />\n </div>\n }>\n Pipeline Executions\n </SectionHeader>\n <AppPicker appIds={pipelineAppIds} selected={pipelineNs} onSelect={(ns) => setNs('pipelinenamespace', ns)} />\n {mcpRuns.length === 0 ? (\n <EmptyPanel icon={GitBranch} text=\"No recent pipeline runs\" />\n ) : (\n <div className=\"space-y-1\">\n {mcpRuns.map((run: any) => (\n <ExecutionRow\n key={run.workflow_id}\n dot={statusDotClass(run.status)}\n pill={<WorkflowPill type={run.entity || run.workflow_name || 'pipeline'} variant=\"pipeline\" size=\"xs\" />}\n id={run.workflow_id}\n date={run.updated_at ?? run.created_at}\n onClick={() => navigate(`/mcp/executions/${run.workflow_id}?namespace=${pipelineNs}`)}\n />\n ))}\n </div>\n )}\n </div>\n </div>}\n </div>\n );\n}\n"],"names":["STATUS_DOT","statusDotClass","status","SectionHeader","Icon","color","docsHash","count","children","actions","jsxs","jsx","BookOpen","EmptyPanel","text","midEllipsis","s","maxLen","keep","ExecutionRow","dot","pill","id","date","onClick","DateValue","NavIcon","to","title","navigate","useNavigate","AppPicker","appIds","selected","onSelect","open","setOpen","useState","ref","useRef","useEffect","handler","e","v","HomePage","user","useAuth","isBuilder","useAccess","searchParams","setSearchParams","useSearchParams","cpData","useControlPlaneApps","allAppIds","useMemo","a","firstAppId","pipelineNs","durableNs","setNs","useCallback","key","ns","prev","next","useEscalationStatsEvents","useWorkflowListEvents","useProcessListEvents","procQ","useProcesses","jobsQ","useJobs","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useAvailableEscalations","myEscQ","useEscalations","timer","processes","_a","processTotal","_b","jobs","_c","jobsTotal","_d","mcpRuns","_e","mcpTotal","_f","allEscalations","_g","allEscTotal","_h","myEscalations","_i","myEscTotal","_j","Inbox","ListToolbar","ExternalLink","esc","WorkflowPill","RolePill","Layers","p","wt","ScrollText","job","GitBranch","run"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as m,j as s}from"./vendor-query-B2UbickB.js";import{a as F,u as R}from"./pipelines-BSWzE-6M.js";import{a as M}from"./yaml-workflows-WfdaMHNn.js";import{u as z}from"./useFilterParams-x-Dg0Vgz.js";import{u as E}from"./useNamespace-3IjtUtAw.js";import{b as $}from"./api-path-u2Jf9QXS.js";import{D as A}from"./DataTable-D9yuBv0w.js";import{W as L}from"./WorkflowPill-B66_AnaY.js";import{T as b}from"./TimestampCell-2dlcQAfX.js";import{E as U}from"./ElapsedCell-CSjcVOpo.js";import{P as I}from"./PageHeader-DVOZjBfL.js";import{F as O,b as g}from"./FilterBar-Ck4K4rzu.js";import{S as W}from"./StickyPagination-BQEm--kI.js";import{L as B}from"./ListToolbar-_73JCdbB.js";import{R as H,a as q}from"./RowActions-BA9L9djf.js";import{t as G}from"./vendor-icons-Dy5Jpknf.js";import{c as Y}from"./vendor-react-CXumBFUA.js";import"./index-DE0r9SEX.js";import"./controlplane-NpJr49rN.js";import"./EmptyState-BcsfPq9T.js";const J={running:"in_progress",completed:"completed",failed:"failed"},K={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},Q={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function V(x,f){return[{key:"workflow_id",label:"Run ID / Tool",render:t=>{const a=K[J[t.status]??t.status]??"bg-status-pending",i=t.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${a}${i}`,title:t.status}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),s.jsx("div",{className:"mt-0.5",children:t.entity?s.jsx(L,{type:t.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-[10px] text-text-tertiary",children:"—"})})]})]})}},{key:"created_at",label:"Created",sortable:!0,render:t=>s.jsx(b,{date:t.created_at}),className:"w-40"},{key:"updated_at",label:"Updated",sortable:!0,render:t=>s.jsx(b,{date:t.updated_at}),className:"w-40"},{key:"duration",label:"Duration",render:t=>s.jsx(U,{startDate:t.created_at,endDate:t.status==="running"?null:t.updated_at,isLive:t.status==="running"}),className:"w-28"},{key:"actions",label:"",render:t=>s.jsxs(H,{children:[s.jsx(q,{icon:G,title:`Filter by ${t.entity}`,onClick:()=>x(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),f(t.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${t.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${Q[t.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function he(){const x=Y(),{namespace:f,available:t}=E("namespace"),{filters:a,setFilter:i,setFilters:v,pagination:o,sort:u,setSort:j}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[d,_]=m.useState(a.search);m.useEffect(()=>{if(d===a.search)return;const e=setTimeout(()=>i("search",d),300);return()=>clearTimeout(e)},[d,i,a.search]);const{data:l}=M(),h=m.useMemo(()=>{const e=new Set(t);for(const r of(l==null?void 0:l.app_ids)??[])e.add(r);return[...e].sort()},[t,l==null?void 0:l.app_ids]),n=a.namespace||f,{data:c}=F(n),{data:p,isLoading:S,refetch:N,isFetching:k}=R({app_id:n,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"}),y=(p==null?void 0:p.total)??0,C=(p==null?void 0:p.jobs)??[],P=V(e=>i("entity",e),e=>i("status",e)),w=m.useMemo(()=>{const e=new Set(h);return n&&e.add(n),[...e].sort().map(r=>({value:r,label:r}))},[h,n]),T=m.useMemo(()=>{const e=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!e.has(a.entity)&&e.add(a.entity),[...e].sort().map(r=>({value:r,label:r}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(I,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:pipeline-executions"}),s.jsxs(O,{actions:s.jsx(B,{onRefresh:()=>N(),isFetching:k,apiPath:$("/pipelines",{app_id:n,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,status:a.status||void 0,search:a.search||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"})}),children:[s.jsx(g,{label:"Namespace",value:n,onChange:e=>{v({namespace:e,entity:""})},options:w,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:e=>_(e.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>i("entity",e),options:T}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>i("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(A,{columns:P,data:C,keyFn:e=>e.workflow_id,onRowClick:e=>x(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${n}`),isLoading:S,emptyMessage:"No pipeline executions found",sort:u,onSort:j}),s.jsx(W,{page:o.page,totalPages:o.totalPages(y),onPageChange:o.setPage,total:y,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{he as McpRunsPage};
2
- //# sourceMappingURL=McpRunsPage-O5H6yStl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunsPage-O5H6yStl.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID / Tool',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n {row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-[10px] text-text-tertiary\">—</span>}\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { namespace: hookNamespace, available } = useNamespace('namespace');\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:pipeline-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as l,j as e}from"./vendor-query-B2UbickB.js";import{b as f,c as j,d as g,e as N,f as y,g as b}from"./roles-t9HzhI5N.js";import{D as v}from"./DataTable-D9yuBv0w.js";import{C}from"./ConfirmDeleteModal-D9_1b4MW.js";import{P as k}from"./PageHeader-DVOZjBfL.js";import{M as w}from"./Modal-CSrxpXeM.js";import{R as _,a as R}from"./RowActions-BA9L9djf.js";import{e as S,o as P}from"./vendor-icons-Dy5Jpknf.js";import"./index-DE0r9SEX.js";import"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";function A({open:s,onClose:r}){const a=f(),[o,m]=l.useState(""),[n,c]=l.useState(s);s!==n&&(c(s),s&&(m(""),a.reset()));const x=()=>{const i=o.trim().toLowerCase();i&&a.mutate(i,{onSuccess:r})};return e.jsx(w,{open:s,onClose:r,title:"Create Role",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Role Name (required)"}),e.jsx("input",{type:"text",value:o,onChange:i=>m(i.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:i=>{i.key==="Enter"&&x()}}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Lowercase letters, numbers, hyphens, and underscores only."})]}),a.error&&e.jsx("p",{className:"text-xs text-status-error",children:a.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:r,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:x,disabled:!o.trim()||a.isPending,className:"btn-primary text-xs",children:a.isPending?"Creating...":"Create"})]})]})})}function D({selectedRole:s,allRoles:r}){const{data:a}=j(),o=g(),m=N(),[n,c]=l.useState(""),x=(a==null?void 0:a.chains)??[],i=l.useMemo(()=>s?x.filter(t=>t.source_role===s).map(t=>t.target_role):[],[x,s]),d=l.useMemo(()=>s?r.filter(t=>t!==s&&t!=="superadmin"&&!i.includes(t)):[],[r,s,i]),u=()=>{!s||!n.trim()||o.mutate({source_role:s,target_role:n.trim()},{onSuccess:()=>c("")})},p=t=>{s&&m.mutate({source_role:s,target_role:t})},h=s==="superadmin";return e.jsxs("div",{className:"border-l border-surface-border pl-6 min-h-[300px]",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Escalation Routing"}),s?h?e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-mono text-text-primary mb-2",children:s}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Superadmins can escalate to any role implicitly."})]}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-mono text-text-primary",children:s}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Can escalate to:"})]}),i.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No escalation targets configured."}):e.jsx("div",{className:"flex flex-wrap gap-2",children:i.map(t=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono",children:[t,e.jsx("button",{onClick:()=>p(t),className:"text-text-tertiary hover:text-status-error transition-colors",title:`Remove ${t}`,children:"×"})]},t))}),d.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Target"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:n,onChange:t=>c(t.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),d.map(t=>e.jsx("option",{value:t,children:t},t))]}),e.jsx("button",{onClick:u,disabled:!n||o.isPending,className:"btn-primary text-xs",children:o.isPending?"Adding...":"Add"})]})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a role to manage its escalation targets."})]})}function E(s){return[{key:"role",label:"Role",render:r=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(S,{className:"w-4 h-4 text-accent/60 shrink-0"}),e.jsx("span",{className:"text-sm text-text-primary",children:r.role})]})},{key:"user_count",label:"Users",render:r=>r.user_count>0?e.jsx("span",{className:"text-text-primary",children:r.user_count}):e.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"chain_count",label:"Escalations",render:r=>r.chain_count>0?e.jsx("span",{className:"text-text-primary",children:r.chain_count}):e.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-28 text-right"},{key:"workflow_count",label:"Workflows",render:r=>r.workflow_count>0?e.jsx("span",{className:"text-text-primary",children:r.workflow_count}):e.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-28 text-right"},{key:"actions",label:"",render:r=>r.user_count>0||r.chain_count>0||r.workflow_count>0?null:e.jsx(_,{children:e.jsx(R,{icon:P,title:"Delete role",onClick:()=>s(r),colorClass:"text-text-tertiary hover:text-status-error"})}),className:"w-16 text-right"}]}function $(){const{data:s,isLoading:r}=y(),a=b(),[o,m]=l.useState(!1),[n,c]=l.useState(null),[x,i]=l.useState(null),d=(s==null?void 0:s.roles)??[],u=l.useMemo(()=>d.map(t=>t.role),[d]),p=E(t=>c(t)),h=()=>{n&&a.mutate(n.role,{onSuccess:()=>c(null)})};return e.jsxs("div",{children:[e.jsx(k,{title:"Roles",docsHash:"#docs:dashboard.md:roles-and-permissions",actions:e.jsx("button",{onClick:()=>m(!0),className:"btn-primary text-xs",children:"Add Role"})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsx("div",{children:e.jsx(v,{columns:p,data:d,keyFn:t=>t.role,isLoading:r,emptyMessage:"No roles found",onRowClick:t=>i(t.role),activeRowKey:x})}),e.jsx(D,{selectedRole:x,allRoles:u})]}),e.jsx(A,{open:o,onClose:()=>m(!1)}),e.jsx(C,{open:!!n,onClose:()=>c(null),onConfirm:h,title:"Delete Role",description:e.jsxs(e.Fragment,{children:["Delete role"," ",e.jsx("span",{className:"font-medium font-mono text-text-primary",children:n==null?void 0:n.role}),"? This action cannot be undone."]}),isPending:a.isPending,error:a.error})]})}export{$ as RolesPage};
2
- //# sourceMappingURL=RolesPage-cp6PiF08.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RolesPage-cp6PiF08.js","sources":["../../src/pages/admin/roles/CreateRoleModal.tsx","../../src/pages/admin/roles/EscalationPanel.tsx","../../src/pages/admin/roles/RoleColumns.tsx","../../src/pages/admin/roles/RolesPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateRole } from '../../../api/roles';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateRoleModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createRole = useCreateRole();\n const [roleName, setRoleName] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setRoleName('');\n createRole.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = roleName.trim().toLowerCase();\n if (!trimmed) return;\n createRole.mutate(trimmed, { onSuccess: onClose });\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Role\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Role Name (required)\n </label>\n <input\n type=\"text\"\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n placeholder=\"e.g., reviewer\"\n className=\"input text-xs w-full\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only.\n </p>\n </div>\n\n {createRole.error && (\n <p className=\"text-xs text-status-error\">{(createRole.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!roleName.trim() || createRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {createRole.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n} from '../../../api/roles';\n\nexport function EscalationPanel({\n selectedRole,\n allRoles,\n}: {\n selectedRole: string | null;\n allRoles: string[];\n}) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n\n const targets = useMemo(() => {\n if (!selectedRole) return [];\n return chains.filter((c) => c.source_role === selectedRole).map((c) => c.target_role);\n }, [chains, selectedRole]);\n\n const available = useMemo(() => {\n if (!selectedRole) return [];\n return allRoles.filter((r) => r !== selectedRole && r !== 'superadmin' && !targets.includes(r));\n }, [allRoles, selectedRole, targets]);\n\n const handleAdd = () => {\n if (!selectedRole || !newTarget.trim()) return;\n addChain.mutate(\n { source_role: selectedRole, target_role: newTarget.trim() },\n { onSuccess: () => setNewTarget('') },\n );\n };\n\n const handleRemove = (target: string) => {\n if (!selectedRole) return;\n removeChain.mutate({ source_role: selectedRole, target_role: target });\n };\n\n const isSuperAdmin = selectedRole === 'superadmin';\n\n return (\n <div className=\"border-l border-surface-border pl-6 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Escalation Routing\n </p>\n\n {!selectedRole ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a role to manage its escalation targets.\n </p>\n ) : isSuperAdmin ? (\n <div>\n <p className=\"text-sm font-mono text-text-primary mb-2\">{selectedRole}</p>\n <p className=\"text-xs text-text-tertiary\">\n Superadmins can escalate to any role implicitly.\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-mono text-text-primary\">{selectedRole}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Can escalate to:</p>\n </div>\n\n {targets.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n No escalation targets configured.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {targets.map((target) => (\n <span\n key={target}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono\"\n >\n {target}\n <button\n onClick={() => handleRemove(target)}\n className=\"text-text-tertiary hover:text-status-error transition-colors\"\n title={`Remove ${target}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Target\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <button\n onClick={handleAdd}\n disabled={!newTarget || addChain.isPending}\n className=\"btn-primary text-xs\"\n >\n {addChain.isPending ? 'Adding...' : 'Add'}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Users, Trash2 } from 'lucide-react';\nimport { type RoleDetail } from '../../../api/roles';\nimport { type Column } from '../../../components/common/data/DataTable';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\n\nexport function getRoleColumns(\n onDelete: (row: RoleDetail) => void,\n): Column<RoleDetail>[] {\n return [\n {\n key: 'role',\n label: 'Role',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <Users className=\"w-4 h-4 text-accent/60 shrink-0\" />\n <span className=\"text-sm text-text-primary\">{row.role}</span>\n </div>\n ),\n },\n {\n key: 'user_count',\n label: 'Users',\n render: (row) =>\n row.user_count > 0\n ? <span className=\"text-text-primary\">{row.user_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'chain_count',\n label: 'Escalations',\n render: (row) =>\n row.chain_count > 0\n ? <span className=\"text-text-primary\">{row.chain_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'workflow_count',\n label: 'Workflows',\n render: (row) =>\n row.workflow_count > 0\n ? <span className=\"text-text-primary\">{row.workflow_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => {\n const inUse = row.user_count > 0 || row.chain_count > 0 || row.workflow_count > 0;\n if (inUse) return null;\n return (\n <RowActionGroup>\n <RowAction\n icon={Trash2}\n title=\"Delete role\"\n onClick={() => onDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n );\n },\n className: 'w-16 text-right',\n },\n ];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoleDetails, useDeleteRole, type RoleDetail } from '../../../api/roles';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { CreateRoleModal } from './CreateRoleModal';\nimport { EscalationPanel } from './EscalationPanel';\nimport { getRoleColumns } from './RoleColumns';\n\nexport function RolesPage() {\n const { data, isLoading } = useRoleDetails();\n const deleteRole = useDeleteRole();\n\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<RoleDetail | null>(null);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n\n const roles = data?.roles ?? [];\n const allRoleNames = useMemo(() => roles.map((r) => r.role), [roles]);\n\n const columns = getRoleColumns((row) => setConfirmDelete(row));\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteRole.mutate(confirmDelete.role, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n docsHash=\"#docs:dashboard.md:roles-and-permissions\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Role\n </button>\n }\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={roles}\n keyFn={(row) => row.role}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n onRowClick={(row) => setSelectedRole(row.role)}\n activeRowKey={selectedRole}\n />\n </div>\n\n <EscalationPanel selectedRole={selectedRole} allRoles={allRoleNames} />\n </div>\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role{' '}\n <span className=\"font-medium font-mono text-text-primary\">\n {confirmDelete?.role}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsx","Modal","jsxs","e","EscalationPanel","selectedRole","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","chains","targets","useMemo","c","available","r","handleAdd","handleRemove","target","isSuperAdmin","getRoleColumns","onDelete","row","Users","RowActionGroup","RowAction","Trash2","RolesPage","data","isLoading","useRoleDetails","deleteRole","useDeleteRole","showCreate","setShowCreate","confirmDelete","setConfirmDelete","setSelectedRole","roles","allRoleNames","columns","handleDelete","PageHeader","DataTable","ConfirmDeleteModal","Fragment"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as s}from"./vendor-query-B2UbickB.js";const r={pending:"bg-status-pending",in_progress:"bg-status-active animate-pulse",completed:"bg-status-success",resolved:"bg-status-success",needs_intervention:"bg-status-error",failed:"bg-status-error",cancelled:"bg-status-error",draft:"bg-status-draft",deployed:"bg-status-active",active:"bg-status-success",archived:"bg-text-tertiary",connected:"bg-status-success",registered:"bg-status-pending",disconnected:"bg-text-tertiary",error:"bg-status-error"},a={pending:"Pending",in_progress:"In Progress",completed:"Completed",resolved:"Resolved",needs_intervention:"Needs Intervention",failed:"Failed",cancelled:"Cancelled",draft:"Draft",deployed:"Deployed",active:"Active",archived:"Archived",connected:"connected",registered:"registered",disconnected:"disconnected",error:"error"};function c({status:e}){const t=r[e]??"bg-status-pending",n=a[e]??e;return s.jsxs("span",{className:"inline-flex items-center gap-2",children:[s.jsx("span",{className:`w-2 h-2 rounded-full ${t}`}),s.jsx("span",{className:"text-xs text-text-secondary",children:n})]})}export{c as S};
2
- //# sourceMappingURL=StatusBadge-Bl3FXVmF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatusBadge-Bl3FXVmF.js","sources":["../../src/components/common/display/StatusBadge.tsx"],"sourcesContent":["import type { LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\ntype Status = LTTaskStatus | LTEscalationStatus | string;\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-pending',\n in_progress: 'bg-status-active animate-pulse',\n completed: 'bg-status-success',\n resolved: 'bg-status-success',\n needs_intervention: 'bg-status-error',\n failed: 'bg-status-error',\n cancelled: 'bg-status-error',\n draft: 'bg-status-draft',\n deployed: 'bg-status-active',\n active: 'bg-status-success',\n archived: 'bg-text-tertiary',\n connected: 'bg-status-success',\n registered: 'bg-status-pending',\n disconnected: 'bg-text-tertiary',\n error: 'bg-status-error',\n};\n\nconst statusLabels: Record<string, string> = {\n pending: 'Pending',\n in_progress: 'In Progress',\n completed: 'Completed',\n resolved: 'Resolved',\n needs_intervention: 'Needs Intervention',\n failed: 'Failed',\n cancelled: 'Cancelled',\n draft: 'Draft',\n deployed: 'Deployed',\n active: 'Active',\n archived: 'Archived',\n connected: 'connected',\n registered: 'registered',\n disconnected: 'disconnected',\n error: 'error',\n};\n\nexport function StatusBadge({ status }: { status: Status }) {\n const dotClass = statusStyles[status] ?? 'bg-status-pending';\n const label = statusLabels[status] ?? status;\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${dotClass}`} />\n <span className=\"text-xs text-text-secondary\">{label}</span>\n </span>\n );\n}\n"],"names":["statusStyles","statusLabels","StatusBadge","status","dotClass","label","jsxs","jsx"],"mappings":"+CAIA,MAAMA,EAAuC,CAC3C,QAAS,oBACT,YAAa,iCACb,UAAW,oBACX,SAAU,oBACV,mBAAoB,kBACpB,OAAQ,kBACR,UAAW,kBACX,MAAO,kBACP,SAAU,mBACV,OAAQ,oBACR,SAAU,mBACV,UAAW,oBACX,WAAY,oBACZ,aAAc,mBACd,MAAO,iBACT,EAEMC,EAAuC,CAC3C,QAAS,UACT,YAAa,cACb,UAAW,YACX,SAAU,WACV,mBAAoB,qBACpB,OAAQ,SACR,UAAW,YACX,MAAO,QACP,SAAU,WACV,OAAQ,SACR,SAAU,WACV,UAAW,YACX,WAAY,aACZ,aAAc,eACd,MAAO,OACT,EAEO,SAASC,EAAY,CAAE,OAAAC,GAA8B,CAC1D,MAAMC,EAAWJ,EAAaG,CAAM,GAAK,oBACnCE,EAAQJ,EAAaE,CAAM,GAAKA,EAEtC,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAW,wBAAwBH,CAAQ,GAAI,EACrDG,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,SAAAF,CAAA,CAAM,CAAA,EACvD,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{j as s}from"./vendor-query-B2UbickB.js";const d=[10,25,50,100];function o({page:t,totalPages:r,onPageChange:l,total:n,pageSize:c,onPageSizeChange:i}){if(n===0)return null;const a=(t-1)*c+1,x=Math.min(t*c,n);return s.jsxs("div",{className:"flex items-center justify-between pt-4",children:[s.jsxs("div",{className:"flex items-center gap-4",children:[s.jsxs("p",{className:"text-xs text-text-tertiary",children:[a,"–",x," of ",n]}),i&&s.jsx("select",{value:c,onChange:e=>i(parseInt(e.target.value)),className:"select text-xs py-1",children:d.map(e=>s.jsxs("option",{value:e,children:[e," / page"]},e))})]}),r>1&&s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("button",{onClick:()=>l(t-1),disabled:t<=1,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Previous"}),s.jsxs("span",{className:"px-3 text-xs text-text-secondary",children:[t," / ",r]}),s.jsx("button",{onClick:()=>l(t+1),disabled:t>=r,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Next"})]})]})}function m(t){return t.total===0?null:s.jsx("div",{className:"sticky bottom-0 z-20 bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4",children:s.jsx(o,{...t})})}export{m as S};
2
- //# sourceMappingURL=StickyPagination-BQEm--kI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StickyPagination-BQEm--kI.js","sources":["../../src/components/common/data/Pagination.tsx","../../src/components/common/data/StickyPagination.tsx"],"sourcesContent":["const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n total,\n pageSize,\n onPageSizeChange,\n}: PaginationProps) {\n if (total === 0) return null;\n\n const start = (page - 1) * pageSize + 1;\n const end = Math.min(page * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between pt-4\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n {start}&ndash;{end} of {total}\n </p>\n {onPageSizeChange && (\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n </div>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"px-3 text-xs text-text-secondary\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { Pagination } from './Pagination';\n\ninterface StickyPaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function StickyPagination(props: StickyPaginationProps) {\n if (props.total === 0) return null;\n\n return (\n <div className=\"sticky bottom-0 z-20 bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4\">\n <Pagination {...props} />\n </div>\n );\n}\n"],"names":["PAGE_SIZE_OPTIONS","Pagination","page","totalPages","onPageChange","total","pageSize","onPageSizeChange","start","end","jsxs","jsx","size","StickyPagination","props"],"mappings":"+CAAA,MAAMA,EAAoB,CAAC,GAAI,GAAI,GAAI,GAAG,EAWnC,SAASC,EAAW,CACzB,KAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,CACF,EAAoB,CAClB,GAAIF,IAAU,EAAG,OAAO,KAExB,MAAMG,GAASN,EAAO,GAAKI,EAAW,EAChCG,EAAM,KAAK,IAAIP,EAAOI,EAAUD,CAAK,EAE3C,OACEK,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,IAAA,CAAE,UAAU,6BACV,SAAA,CAAAF,EAAM,IAAQC,EAAI,OAAKJ,CAAA,EAC1B,EACCE,GACCI,EAAAA,IAAC,SAAA,CACC,MAAOL,EACP,SAAW,GAAMC,EAAiB,SAAS,EAAE,OAAO,KAAK,CAAC,EAC1D,UAAU,sBAET,WAAkB,IAAKK,GACtBF,OAAC,SAAA,CAAkB,MAAOE,EACvB,SAAA,CAAAA,EAAK,SAAA,CAAA,EADKA,CAEb,CACD,CAAA,CAAA,CACH,EAEJ,EACCT,EAAa,GACZO,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMP,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQ,EAClB,UAAU,oEACX,SAAA,UAAA,CAAA,EAGDQ,EAAAA,KAAC,OAAA,CAAK,UAAU,mCACb,SAAA,CAAAR,EAAK,MAAIC,CAAA,EACZ,EACAQ,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMP,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQC,EAClB,UAAU,oEACX,SAAA,MAAA,CAAA,CAED,CAAA,CACF,CAAA,EAEJ,CAEJ,CCxDO,SAASU,EAAiBC,EAA8B,CAC7D,OAAIA,EAAM,QAAU,EAAU,KAG5BH,MAAC,OAAI,UAAU,4GACb,eAACV,EAAA,CAAY,GAAGa,EAAO,CAAA,CACzB,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{u as i,j as a}from"./vendor-query-B2UbickB.js";import{d as c,S as n,J as o,c as x}from"./index-DE0r9SEX.js";import{t as u}from"./vendor-icons-Dy5Jpknf.js";function j(e){const t=new URLSearchParams;return t.set("namespace",e.namespace),t.set("source",e.source),e.limit&&t.set("limit",String(e.limit)),e.offset&&t.set("offset",String(e.offset)),e.sort_by&&t.set("sort_by",e.sort_by),e.order&&t.set("order",e.order),e.status&&t.set("status",e.status),e.stream_name&&t.set("stream_name",e.stream_name),e.msg_type&&t.set("msg_type",e.msg_type),e.topic&&t.set("topic",e.topic),e.workflow_name&&t.set("workflow_name",e.workflow_name),e.jid&&t.set("jid",e.jid),e.aid&&t.set("aid",e.aid),e.dad&&t.set("dad",e.dad),c(`/controlplane/stream-messages?${t}`)}function _(e,t){return i({queryKey:["controlplane","stream-messages",e],queryFn:()=>j(e),enabled:!!e.namespace&&((t==null?void 0:t.enabled)??!0),staleTime:15e3})}const b={pending:"bg-text-tertiary",claimed:"bg-status-warning",processed:"bg-status-success",dead_lettered:"bg-status-error"},y={pending:"Pending",claimed:"Claimed",processed:"Processed",dead_lettered:"Dead Lettered"},m="inline-block px-1.5 py-0.5 text-[10px] font-mono rounded bg-surface-sunken text-text-secondary",N=[{value:"pending",label:"Pending"},{value:"claimed",label:"Claimed"},{value:"processed",label:"Processed"},{value:"dead_lettered",label:"Dead Lettered"}],S=[{value:"engine",label:"Engine"},{value:"worker",label:"Worker"}];function d({label:e,value:t}){return t?a.jsxs("div",{children:[a.jsx("span",{className:"text-text-tertiary",children:e}),a.jsx("div",{className:"mt-0.5",children:a.jsx(x,{date:t,format:"datetime"})})]}):null}function r({label:e,value:t}){return t?a.jsxs("div",{children:[a.jsx("span",{className:"text-text-tertiary",children:e}),a.jsx("p",{className:"text-xs text-text-primary font-mono break-all",children:t})]}):null}function s({label:e,value:t,onFilter:l}){return t?a.jsxs("div",{children:[a.jsx("span",{className:"text-text-tertiary",children:e}),a.jsxs("button",{onClick:()=>l==null?void 0:l(t),className:"flex items-center gap-1 group text-left w-full",title:`Filter by ${e.toLowerCase()}: ${t}`,children:[a.jsx("p",{className:"text-xs text-text-primary font-mono break-all group-hover:text-accent transition-colors",children:t}),a.jsx(u,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity"})]})]}):null}function g({message:e,filters:t}){return e?a.jsxs("div",{className:"space-y-5 text-[11px]",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${b[e.status]}`}),a.jsx(s,{label:"",value:y[e.status],onFilter:()=>{var l;return(l=t==null?void 0:t.onFilterStatus)==null?void 0:l.call(t,e.status)}}),a.jsx("span",{className:m,children:e.source})]}),a.jsx(s,{label:"",value:e.stream_name,onFilter:()=>{var l;return(l=t==null?void 0:t.onFilterStreamName)==null?void 0:l.call(t,e.stream_name)}}),a.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:["ID: ",e.id]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx(n,{children:"Timestamps"}),a.jsxs("div",{className:"grid grid-cols-1 gap-2",children:[a.jsx(d,{label:"Created",value:e.created_at}),a.jsx(d,{label:"Reserved",value:e.reserved_at}),a.jsx(d,{label:"Processed",value:e.expired_at}),a.jsx(d,{label:"Dead-lettered",value:e.dead_lettered_at})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx(n,{children:"Metadata"}),a.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[a.jsx(r,{label:"Priority",value:String(e.priority)}),a.jsx(r,{label:"Retries",value:`${e.retry_attempt} / ${e.max_retry_attempts}`}),a.jsx(r,{label:"Reserved by",value:e.reserved_by})]})]}),e.jid&&a.jsxs("div",{className:"space-y-2",children:[a.jsx(n,{children:"Job"}),a.jsx("div",{className:"grid grid-cols-1 gap-2",children:a.jsx(s,{label:"Job ID",value:e.jid,onFilter:t==null?void 0:t.onFilterJid})})]}),e.source==="worker"&&a.jsxs("div",{className:"space-y-2",children:[a.jsx(n,{children:"Worker Details"}),a.jsxs("div",{className:"grid grid-cols-1 gap-2",children:[a.jsx(s,{label:"Workflow",value:e.workflow_name,onFilter:t==null?void 0:t.onFilterWorkflow}),a.jsx(s,{label:"Activity",value:e.aid,onFilter:t==null?void 0:t.onFilterAid}),a.jsx(r,{label:"Dimension",value:e.dad}),a.jsx(s,{label:"Type",value:e.msg_type,onFilter:t==null?void 0:t.onFilterMsgType}),a.jsx(s,{label:"Topic",value:e.topic,onFilter:t==null?void 0:t.onFilterTopic})]})]}),a.jsx("div",{className:"space-y-2",children:a.jsx(o,{data:e.message,label:"Payload",defaultCollapsed:!1})})]}):null}export{g as S,S as a,N as b,b as c,y as d,m as e,_ as u};
2
- //# sourceMappingURL=StreamMessageDetail-BTtw3GjX.js.map
@@ -1,2 +0,0 @@
1
- import{j as o}from"./vendor-query-B2UbickB.js";import{c as e}from"./index-DE0r9SEX.js";function i({date:r,className:t=""}){return o.jsx(e,{date:r,format:"relative",className:t})}export{i as T};
2
- //# sourceMappingURL=TimeAgo-n182EcLx.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TopicDetailPage-29lsNsqI.js","sources":["../../src/pages/topics/TopicDetailPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { Radio, Bot, Tag, Pencil, Trash2, Save, X, BookOpen, Send, FlaskConical, Info, Braces } from 'lucide-react';\nimport { useTopic, useUpdateTopic, useDeleteTopic, usePublishTopic } from '../../api/topics';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { useSettings } from '../../api/settings';\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'bg-blue-400/15 text-blue-400',\n workflow: 'bg-accent/15 text-accent',\n escalation: 'bg-amber-400/15 text-amber-400',\n activity: 'bg-cyan-400/15 text-cyan-400',\n knowledge: 'bg-violet-400/15 text-violet-400',\n agent: 'bg-emerald-400/15 text-emerald-400',\n app: 'bg-rose-400/15 text-rose-400',\n milestone: 'bg-violet-400/15 text-violet-400',\n};\n\nfunction SectionHeader({ icon: Icon, color, children }: { icon: React.ElementType; color: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"text-xs font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n );\n}\n\nexport function TopicDetailPage() {\n const { topic: encodedTopic } = useParams<{ topic: string }>();\n const topicKey = encodedTopic ? decodeURIComponent(encodedTopic) : null;\n const navigate = useNavigate();\n const { data: topic, isLoading, refetch, isFetching } = useTopic(topicKey);\n const { data: settings } = useSettings();\n const subscriberLabel = settings?.ai?.enabled ? 'agents' : 'automations';\n const updateMutation = useUpdateTopic();\n const deleteMutation = useDeleteTopic();\n const publishMutation = usePublishTopic();\n\n const [editing, setEditing] = useState(false);\n const [publishSubject, setPublishSubject] = useState('');\n const [publishEventId, setPublishEventId] = useState(() => `evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`);\n const [publishPayload, setPublishPayload] = useState('');\n // Opt-in envelope extension fields. Which ones are shown depends on the topic\n // family (system.workflow.* shows workflow fields; a custom/file topic shows\n // none). Prefilled like Event ID; sent as top-level event fields.\n const [publishWorkflowName, setPublishWorkflowName] = useState('myWorkflow');\n const [publishWorkflowId, setPublishWorkflowId] = useState('wf-001');\n const [publishTaskQueue, setPublishTaskQueue] = useState('default');\n const [publishStatus, setPublishStatus] = useState('');\n const [publishEscalationId, setPublishEscalationId] = useState('esc-001');\n const [publishActivityName, setPublishActivityName] = useState('myActivity');\n const [editDescription, setEditDescription] = useState('');\n const [editTags, setEditTags] = useState('');\n const [editSchema, setEditSchema] = useState('');\n const [schemaError, setSchemaError] = useState('');\n\n if (isLoading) {\n return <div className=\"animate-pulse space-y-4\"><div className=\"h-8 bg-surface-sunken rounded w-48\" /><div className=\"h-40 bg-surface-sunken rounded\" /></div>;\n }\n\n if (!topic) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Radio className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Topic not found</h2>\n </div>\n );\n }\n\n const isSystem = topic.source === 'system';\n const isManaged = topic.managed;\n const editable = !isManaged;\n const categoryPillCls = CATEGORY_COLORS[topic.category] ?? 'bg-zinc-400/15 text-zinc-400';\n\n const defaultPayload = topic.example_payload\n ? JSON.stringify(topic.example_payload, null, 2)\n : topic.payload_schema?.properties\n ? JSON.stringify(Object.fromEntries(Object.keys(topic.payload_schema.properties).map(k => [k, ''])), null, 2)\n : '{}';\n\n // Which envelope extensions belong to this topic's family (\"the system injects\n // fields by type\"). Custom / file / knowledge topics carry none — just data.\n const fam =\n topic.topic.startsWith('system.workflow.') || topic.topic.startsWith('system.task.') ? 'workflow'\n : topic.topic.startsWith('system.escalation.') ? 'escalation'\n : topic.topic.startsWith('system.activity.') ? 'activity'\n : 'none';\n const showWorkflowFields = fam === 'workflow' || fam === 'escalation' || fam === 'activity';\n const showStatus = fam === 'workflow' || fam === 'escalation';\n // Status default mirrors the subject's terminal verb (failed / completed / resolved …).\n const statusDefault = (publishSubject || topic.topic).split('.').pop() ?? '';\n\n // The literal event the publish will send — built from the universal envelope\n // (id, subject, source) + only the family's extension fields + the payload.\n const buildPublishEvent = (): Record<string, any> => {\n let data: Record<string, any> = {};\n try { data = JSON.parse(publishPayload || defaultPayload); } catch { /* invalid JSON */ }\n const subject = (publishSubject || topic.topic) !== topic.topic ? (publishSubject || topic.topic) : undefined;\n const event: Record<string, any> = { id: publishEventId || undefined, source: 'dashboard', data };\n if (subject) event.subject = subject;\n if (showWorkflowFields) {\n event.workflowName = publishWorkflowName;\n event.workflowId = publishWorkflowId;\n event.taskQueue = publishTaskQueue;\n }\n if (showStatus) event.status = publishStatus || statusDefault;\n if (fam === 'escalation') event.escalationId = publishEscalationId;\n if (fam === 'activity') event.activityName = publishActivityName;\n return event;\n };\n // A literal preview of the published envelope (type derived from subject).\n const eventPreview = (() => {\n const { subject, ...rest } = buildPublishEvent();\n return JSON.stringify({ type: subject || topic.topic, timestamp: '<minted>', ...rest }, null, 2);\n })();\n if (!publishPayload && defaultPayload !== '{}') {\n setPublishPayload(defaultPayload);\n }\n if (!publishSubject) {\n setPublishSubject(topic.topic);\n }\n\n const startEdit = () => {\n setEditDescription(topic.description ?? '');\n setEditTags((topic.tags ?? []).join(', '));\n setEditSchema(topic.payload_schema ? JSON.stringify(topic.payload_schema, null, 2) : '');\n setSchemaError('');\n setEditing(true);\n };\n\n const cancelEdit = () => setEditing(false);\n\n const saveEdit = () => {\n const tags = editTags.split(',').map((t) => t.trim()).filter(Boolean);\n let payload_schema: Record<string, any> | undefined;\n if (editSchema.trim()) {\n try {\n payload_schema = JSON.parse(editSchema);\n setSchemaError('');\n } catch {\n setSchemaError('Invalid JSON');\n return;\n }\n }\n updateMutation.mutate(\n { topic: topic.topic, description: editDescription, tags, ...(payload_schema !== undefined ? { payload_schema } : {}) },\n { onSuccess: () => { setEditing(false); refetch(); } },\n );\n };\n\n const handleDelete = () => {\n if (confirm(`Delete topic \"${topic.topic}\"?\\n\\nThis removes it from the catalog. Active subscriptions are not affected.`)) {\n deleteMutation.mutate(topic.topic, { onSuccess: () => navigate('/topics') });\n }\n };\n\n return (\n <div>\n {/* ── Header ───────────────────────────────────────────────── */}\n <div className=\"flex items-start justify-between mb-4\">\n <div>\n <div className=\"flex items-center gap-3 mb-1\">\n <Radio className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-mono font-medium text-text-primary\">{topic.topic}</h1>\n <button onClick={() => { window.location.hash = '#docs:topics.md'; }} className=\"text-text-quaternary hover:text-accent transition-colors\" title=\"Topic docs\">\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n </div>\n {!editing && topic.description ? (\n <p className=\"text-sm text-text-secondary leading-relaxed\">{topic.description}</p>\n ) : !editing ? (\n <p className=\"text-sm text-text-quaternary italic\">No description</p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {!editing && editable && (\n <button onClick={startEdit} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Pencil className=\"w-3 h-3\" /> Edit\n </button>\n )}\n {!editing && !isSystem && editable && (\n <button onClick={handleDelete} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors\">\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n )}\n {editing && (\n <>\n <button onClick={saveEdit} disabled={updateMutation.isPending} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Save className=\"w-3 h-3\" /> Save\n </button>\n <button onClick={cancelEdit} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors\">\n <X className=\"w-3 h-3\" /> Cancel\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* ── Details band ─────────────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md px-5 py-3 flex flex-wrap gap-x-6 gap-y-3 items-start mb-5 relative\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Category</p>\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${categoryPillCls}`}>{topic.category}</span>\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Source</p>\n <span className=\"text-xs font-mono text-text-secondary\">{topic.source}</span>\n </div>\n {topic.tags?.length > 0 && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags</p>\n <div className=\"flex items-center gap-1.5\">\n <Tag className=\"w-2.5 h-2.5 text-text-quaternary\" strokeWidth={1.5} />\n {topic.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken\">{tag}</span>\n ))}\n </div>\n </div>\n )}\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Created</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.created_at} /></span>\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Updated</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.updated_at} /></span>\n </div>\n {topic.last_seen_at && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Last Seen</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.last_seen_at} /></span>\n </div>\n )}\n <div className=\"ml-auto self-center\">\n <ListToolbar onRefresh={() => refetch()} isFetching={isFetching} apiPath={`/topics/by-name/${encodeURIComponent(topic.topic)}`} />\n </div>\n </div>\n\n {/* ── Three-column layout: Schema | Example | Test ─── */}\n {!editing && (\n <div className=\"grid grid-cols-3 gap-5\">\n {/* Col 1 — Payload Schema */}\n <div className=\"min-w-0\">\n <SectionHeader icon={Radio} color=\"text-accent\">Payload Schema</SectionHeader>\n {topic.payload_schema ? (\n <JsonViewer data={topic.payload_schema} />\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No schema defined. Click Edit to add one.</p>\n )}\n </div>\n\n {/* Col 2 — Example Payload */}\n <div className=\"min-w-0\">\n <SectionHeader icon={Braces} color=\"text-cyan-400\">Example Payload</SectionHeader>\n {topic.example_payload ? (\n <JsonViewer data={topic.example_payload} />\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No example defined. Click Edit to add one.</p>\n )}\n </div>\n\n {/* Col 3 — Test */}\n <div className=\"min-w-0 space-y-4 animate-page-enter\">\n <SectionHeader icon={FlaskConical} color=\"text-violet-400\">Test</SectionHeader>\n {/* Target Subscribers */}\n <div className=\"bg-surface-sunken/30 rounded-md px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Bot className=\"w-3.5 h-3.5 text-emerald-400\" strokeWidth={1.5} />\n <h2 className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Target Subscribers\n </h2>\n <span className=\"relative group ml-auto\">\n <Info className=\"w-3 h-3 text-text-quaternary cursor-help\" strokeWidth={1.5} />\n <span className=\"absolute right-0 top-full mt-1 w-48 p-2 rounded bg-surface-raised border border-surface-border shadow-lg text-[10px] text-text-secondary leading-relaxed hidden group-hover:block z-10\">\n Publishing a test event is live — these subscribers will receive and process the payload.\n </span>\n </span>\n </div>\n {topic.subscribers?.length ? (\n <div className=\"space-y-0.5\">\n {topic.subscribers.map((sub) => (\n <button\n key={sub.id}\n onClick={() => navigate(`/agents/${sub.agent_id}`)}\n className=\"flex items-center gap-2 w-full text-left py-1 rounded hover:bg-surface-hover/50 transition-colors\"\n >\n <Bot className=\"w-2.5 h-2.5 text-emerald-400 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[11px] text-text-primary hover:text-accent transition-colors truncate\">{sub.agent_name}</span>\n <span className=\"text-[9px] font-mono text-text-quaternary ml-auto shrink-0\">{sub.reaction_type}</span>\n </button>\n ))}\n </div>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No {subscriberLabel} subscribed.</p>\n )}\n </div>\n\n {/* Publish */}\n <div className=\"sticky top-16 bg-surface-sunken/40 rounded-md p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Send className=\"w-3.5 h-3.5 text-accent\" strokeWidth={1.5} />\n <h2 className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Publish</h2>\n </div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Event ID</label>\n <input\n value={publishEventId}\n onChange={(e) => setPublishEventId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"evt-1720368000000-a3f2\"\n />\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Subject</label>\n <input\n value={publishSubject || topic.topic}\n onChange={(e) => setPublishSubject(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n />\n {showWorkflowFields && (\n <div className=\"grid grid-cols-2 gap-x-3\">\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Workflow Name</label>\n <input\n value={publishWorkflowName}\n onChange={(e) => setPublishWorkflowName(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"myWorkflow\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Workflow ID</label>\n <input\n value={publishWorkflowId}\n onChange={(e) => setPublishWorkflowId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"wf-001\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Task Queue</label>\n <input\n value={publishTaskQueue}\n onChange={(e) => setPublishTaskQueue(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"default\"\n />\n </div>\n {showStatus && (\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Status</label>\n <input\n value={publishStatus || statusDefault}\n onChange={(e) => setPublishStatus(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder={statusDefault}\n />\n </div>\n )}\n {fam === 'escalation' && (\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Escalation ID</label>\n <input\n value={publishEscalationId}\n onChange={(e) => setPublishEscalationId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"esc-001\"\n />\n </div>\n )}\n {fam === 'activity' && (\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Activity Name</label>\n <input\n value={publishActivityName}\n onChange={(e) => setPublishActivityName(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"myActivity\"\n />\n </div>\n )}\n </div>\n )}\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Payload</label>\n <textarea\n value={publishPayload || defaultPayload}\n onChange={(e) => setPublishPayload(e.target.value)}\n className=\"input-json w-full text-[11px]\"\n rows={6}\n spellCheck={false}\n placeholder='{ \"key\": \"value\" }'\n />\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1 mt-3\">Event Preview</label>\n <pre className=\"bg-surface-sunken/60 rounded px-2 py-2 text-[10px] font-mono text-text-tertiary overflow-auto max-h-44 whitespace-pre\">{eventPreview}</pre>\n <div className=\"mt-3\">\n <button\n onClick={() => {\n publishMutation.mutate(\n { topic: topic.topic, event: buildPublishEvent() },\n { onSuccess: () => {\n refetch();\n // Generate a fresh event ID for the next publish\n setPublishEventId(`evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`);\n } },\n );\n }}\n disabled={publishMutation.isPending}\n className=\"btn-primary text-xs w-full\"\n >\n {publishMutation.isPending ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n {publishMutation.isSuccess && (\n <p className=\"text-[10px] text-status-success mt-2 animate-page-enter\">Event published</p>\n )}\n {publishMutation.isError && (\n <p className=\"text-[10px] text-status-error mt-2\">{publishMutation.error.message}</p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ── Edit mode ────────────────────────────────────────────── */}\n {editing && (\n <div className=\"space-y-6 max-w-3xl\">\n <div>\n <label className=\"section-header\">Description</label>\n <textarea\n value={editDescription}\n onChange={(e) => setEditDescription(e.target.value)}\n rows={3}\n className=\"input resize-none\"\n placeholder=\"What this topic represents\"\n />\n </div>\n <div>\n <label className=\"section-header\">Tags</label>\n <input\n type=\"text\"\n value={editTags}\n onChange={(e) => setEditTags(e.target.value)}\n placeholder=\"lifecycle, core, error\"\n className=\"input font-mono\"\n />\n <p className=\"hint\">Comma-separated. Used for filtering in the catalog.</p>\n </div>\n <div>\n <label className=\"section-header\">Payload Schema</label>\n <textarea\n value={editSchema}\n onChange={(e) => { setEditSchema(e.target.value); setSchemaError(''); }}\n rows={12}\n className=\"input-json w-full\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"orderId\": { \"type\": \"string\" }\\n }\\n}'}\n />\n {schemaError && <p className=\"text-[10px] text-red-400 mt-1\">{schemaError}</p>}\n <p className=\"hint\">JSON Schema describing the event.data shape.</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["CATEGORY_COLORS","SectionHeader","Icon","color","children","jsxs","jsx","TopicDetailPage","encodedTopic","useParams","topicKey","navigate","useNavigate","topic","isLoading","refetch","isFetching","useTopic","settings","useSettings","subscriberLabel","_a","updateMutation","useUpdateTopic","deleteMutation","useDeleteTopic","publishMutation","usePublishTopic","editing","setEditing","useState","publishSubject","setPublishSubject","publishEventId","setPublishEventId","publishPayload","setPublishPayload","publishWorkflowName","setPublishWorkflowName","publishWorkflowId","setPublishWorkflowId","publishTaskQueue","setPublishTaskQueue","publishStatus","setPublishStatus","publishEscalationId","setPublishEscalationId","publishActivityName","setPublishActivityName","editDescription","setEditDescription","editTags","setEditTags","editSchema","setEditSchema","schemaError","setSchemaError","Radio","isSystem","editable","categoryPillCls","defaultPayload","_b","k","fam","showWorkflowFields","showStatus","statusDefault","buildPublishEvent","data","subject","event","eventPreview","rest","startEdit","cancelEdit","saveEdit","tags","t","payload_schema","handleDelete","BookOpen","Pencil","Trash2","Fragment","Save","X","_c","Tag","tag","DateValue","ListToolbar","JsonViewer","Braces","FlaskConical","Bot","Info","_d","sub","Send","e"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{u as x}from"./topics-PC2fEiyD.js";import{u as m}from"./useFilterParams-x-Dg0Vgz.js";import{D as g}from"./DataTable-D9yuBv0w.js";import{S as u}from"./StickyPagination-BQEm--kI.js";import{F as d,b}from"./FilterBar-Ck4K4rzu.js";import{P as f}from"./PageHeader-DVOZjBfL.js";import{L as y}from"./ListToolbar-_73JCdbB.js";import{c as h}from"./index-DE0r9SEX.js";import{R as j}from"./vendor-icons-Dy5Jpknf.js";import{c as v}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";const k={task:"bg-blue-400/15 text-blue-400",workflow:"bg-accent/15 text-accent",escalation:"bg-amber-400/15 text-amber-400",activity:"bg-cyan-400/15 text-cyan-400",knowledge:"bg-violet-400/15 text-violet-400",agent:"bg-emerald-400/15 text-emerald-400",app:"bg-rose-400/15 text-rose-400",milestone:"bg-violet-400/15 text-violet-400"},N=[{value:"task",label:"Task"},{value:"workflow",label:"Workflow"},{value:"escalation",label:"Escalation"},{value:"activity",label:"Activity"},{value:"knowledge",label:"Knowledge"},{value:"agent",label:"Agent"},{value:"app",label:"App"},{value:"milestone",label:"Milestone"}];function w({category:t}){const a=k[t]??"bg-zinc-400/15 text-zinc-400";return e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${a}`,children:t})}const P=[{key:"topic",label:"Topic",render:t=>e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(j,{className:"w-3 h-3 shrink-0 text-text-quaternary",strokeWidth:1.5}),e.jsx("span",{className:"text-xs font-mono text-text-primary truncate",children:t.topic})]})},{key:"category",label:"Category",render:t=>e.jsx(w,{category:t.category}),className:"w-28"},{key:"description",label:"Description",render:t=>t.description?e.jsx("span",{className:"text-[11px] text-text-secondary truncate block max-w-xs",children:t.description}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},{key:"source",label:"Source",render:t=>e.jsx("span",{className:"text-[10px] font-mono text-text-tertiary",children:t.source}),className:"w-24"},{key:"subscriber_count",label:"Subscribers",render:t=>{const a=t.subscriber_count??0;return a?e.jsx("span",{className:"inline-flex items-center justify-center min-w-[20px] px-1.5 py-0.5 rounded-full text-[10px] font-medium bg-accent/15 text-accent",children:a}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},className:"w-24 text-center"},{key:"last_seen_at",label:"Last Seen",render:t=>t.last_seen_at?e.jsx("span",{className:"whitespace-nowrap",children:e.jsx(h,{date:t.last_seen_at})}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-28"}];function D(){const t=v(),{filters:a,setFilter:n,pagination:s}=m({filters:{category:""}}),{data:o,isLoading:l,refetch:c,isFetching:p}=x({category:a.category||void 0,limit:s.pageSize,offset:s.offset}),i=(o==null?void 0:o.total)??0;return e.jsxs("div",{children:[e.jsx(f,{title:"Topic Catalog",docsHash:"#docs:topics.md"}),e.jsx(d,{actions:e.jsx(y,{onRefresh:()=>c(),isFetching:p,apiPath:`/topics?limit=${s.pageSize}&offset=${s.offset}${a.category?`&category=${a.category}`:""}`}),children:e.jsx(b,{label:"Category",value:a.category,onChange:r=>n("category",r),options:N})}),e.jsx(g,{columns:P,data:(o==null?void 0:o.topics)??[],keyFn:r=>r.topic,onRowClick:r=>t(`/topics/${encodeURIComponent(r.topic)}`),isLoading:l,emptyMessage:"No topics registered yet"}),e.jsx(u,{page:s.page,totalPages:s.totalPages(i),onPageChange:s.setPage,total:i,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{D as TopicsPage};
2
- //# sourceMappingURL=TopicsPage-KJ7_LAvo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TopicsPage-KJ7_LAvo.js","sources":["../../src/pages/topics/TopicsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Radio } from 'lucide-react';\nimport { useTopics, type TopicCatalogEntry } from '../../api/topics';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { DateValue } from '../../components/common/display/DateValue';\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'bg-blue-400/15 text-blue-400',\n workflow: 'bg-accent/15 text-accent',\n escalation: 'bg-amber-400/15 text-amber-400',\n activity: 'bg-cyan-400/15 text-cyan-400',\n knowledge: 'bg-violet-400/15 text-violet-400',\n agent: 'bg-emerald-400/15 text-emerald-400',\n app: 'bg-rose-400/15 text-rose-400',\n milestone: 'bg-violet-400/15 text-violet-400',\n};\n\nconst CATEGORY_OPTIONS = [\n { value: 'task', label: 'Task' },\n { value: 'workflow', label: 'Workflow' },\n { value: 'escalation', label: 'Escalation' },\n { value: 'activity', label: 'Activity' },\n { value: 'knowledge', label: 'Knowledge' },\n { value: 'agent', label: 'Agent' },\n { value: 'app', label: 'App' },\n { value: 'milestone', label: 'Milestone' },\n];\n\nfunction CategoryPill({ category }: { category: string }) {\n const cls = CATEGORY_COLORS[category] ?? 'bg-zinc-400/15 text-zinc-400';\n return (\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${cls}`}>\n {category}\n </span>\n );\n}\n\nconst columns: Column<TopicCatalogEntry>[] = [\n {\n key: 'topic',\n label: 'Topic',\n render: (row) => (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Radio className=\"w-3 h-3 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n <span className=\"text-xs font-mono text-text-primary truncate\">{row.topic}</span>\n </div>\n ),\n },\n {\n key: 'category',\n label: 'Category',\n render: (row) => <CategoryPill category={row.category} />,\n className: 'w-28',\n },\n {\n key: 'description',\n label: 'Description',\n render: (row) => row.description\n ? <span className=\"text-[11px] text-text-secondary truncate block max-w-xs\">{row.description}</span>\n : <span className=\"text-text-quaternary\">—</span>,\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => (\n <span className=\"text-[10px] font-mono text-text-tertiary\">{row.source}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'subscriber_count',\n label: 'Subscribers',\n render: (row) => {\n const count = row.subscriber_count ?? 0;\n if (!count) return <span className=\"text-text-quaternary\">—</span>;\n return (\n <span className=\"inline-flex items-center justify-center min-w-[20px] px-1.5 py-0.5 rounded-full text-[10px] font-medium bg-accent/15 text-accent\">\n {count}\n </span>\n );\n },\n className: 'w-24 text-center',\n },\n {\n key: 'last_seen_at',\n label: 'Last Seen',\n render: (row) => row.last_seen_at\n ? <span className=\"whitespace-nowrap\"><DateValue date={row.last_seen_at} /></span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-28',\n },\n];\n\nexport function TopicsPage() {\n const navigate = useNavigate();\n\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { category: '' },\n });\n\n const { data, isLoading, refetch, isFetching } = useTopics({\n category: filters.category || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"Topic Catalog\" docsHash=\"#docs:topics.md\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/topics?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.category ? `&category=${filters.category}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Category\"\n value={filters.category}\n onChange={(v) => setFilter('category', v)}\n options={CATEGORY_OPTIONS}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.topics ?? []}\n keyFn={(row) => row.topic}\n onRowClick={(row) => navigate(`/topics/${encodeURIComponent(row.topic)}`)}\n isLoading={isLoading}\n emptyMessage=\"No topics registered yet\"\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["CATEGORY_COLORS","CATEGORY_OPTIONS","CategoryPill","category","cls","columns","row","jsxs","jsx","Radio","count","DateValue","TopicsPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","data","isLoading","refetch","isFetching","useTopics","total","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}