@hotmeshio/long-tail 0.5.11 → 0.6.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 (350) hide show
  1. package/README.md +1 -0
  2. package/build/api/diagnostics.d.ts +5 -0
  3. package/build/api/diagnostics.js +5 -1
  4. package/build/api/escalations/bulk.js +9 -1
  5. package/build/api/escalations/cancel.js +5 -7
  6. package/build/api/escalations/claim.js +18 -15
  7. package/build/api/escalations/create.d.ts +6 -0
  8. package/build/api/escalations/create.js +11 -8
  9. package/build/api/escalations/facets.d.ts +18 -0
  10. package/build/api/escalations/facets.js +115 -0
  11. package/build/api/escalations/helpers.d.ts +70 -1
  12. package/build/api/escalations/helpers.js +101 -7
  13. package/build/api/escalations/index.d.ts +3 -2
  14. package/build/api/escalations/index.js +7 -1
  15. package/build/api/escalations/list.d.ts +23 -2
  16. package/build/api/escalations/list.js +111 -10
  17. package/build/api/escalations/metadata.js +22 -27
  18. package/build/api/escalations/resolve.d.ts +19 -1
  19. package/build/api/escalations/resolve.js +111 -26
  20. package/build/api/escalations/single.js +8 -8
  21. package/build/api/settings.d.ts +1 -1
  22. package/build/api/settings.js +3 -1
  23. package/build/api/users.d.ts +6 -0
  24. package/build/api/users.js +29 -1
  25. package/build/api/workflows/invocation.d.ts +6 -0
  26. package/build/api/workflows/invocation.js +6 -2
  27. package/build/bin/ltc.js +40 -0
  28. package/build/lib/cli/commands/escalations.d.ts +36 -0
  29. package/build/lib/cli/commands/escalations.js +98 -0
  30. package/build/lib/db/schemas/001_schema.sql +10 -5
  31. package/build/lib/db/schemas/012_lt_tasks_workflow_id_unique.sql +20 -0
  32. package/build/lib/db/schemas/013_role_scope.sql +37 -0
  33. package/build/modules/features.d.ts +19 -0
  34. package/build/modules/features.js +16 -0
  35. package/build/modules/version.d.ts +10 -5
  36. package/build/modules/version.js +27 -11
  37. package/build/routes/diagnostics.js +15 -2
  38. package/build/routes/escalations/facets.d.ts +7 -0
  39. package/build/routes/escalations/facets.js +81 -0
  40. package/build/routes/escalations/index.js +3 -0
  41. package/build/routes/escalations/list.js +48 -0
  42. package/build/routes/escalations/resolve.js +22 -4
  43. package/build/routes/users.js +9 -5
  44. package/build/routes/workflows/invocation.js +12 -4
  45. package/build/sdk/index.d.ts +35 -2
  46. package/build/sdk/index.js +7 -0
  47. package/build/services/diagnostics/index.d.ts +40 -6
  48. package/build/services/diagnostics/index.js +54 -5
  49. package/build/services/escalation/crud.d.ts +56 -6
  50. package/build/services/escalation/crud.js +102 -31
  51. package/build/services/escalation/facet-sql.d.ts +18 -0
  52. package/build/services/escalation/facet-sql.js +118 -0
  53. package/build/services/escalation/facets.d.ts +45 -0
  54. package/build/services/escalation/facets.js +218 -0
  55. package/build/services/escalation/index.d.ts +1 -0
  56. package/build/services/escalation/index.js +8 -1
  57. package/build/services/escalation/queries.d.ts +47 -0
  58. package/build/services/escalation/queries.js +185 -2
  59. package/build/services/escalation/sql.d.ts +15 -2
  60. package/build/services/escalation/sql.js +80 -3
  61. package/build/services/interceptor/activities/escalation.d.ts +2 -0
  62. package/build/services/interceptor/activities/escalation.js +1 -1
  63. package/build/services/interceptor/lifecycle.js +4 -0
  64. package/build/services/mcp/server-tools.js +10 -4
  65. package/build/services/orchestrator/condition.js +6 -2
  66. package/build/services/role/index.js +2 -3
  67. package/build/services/role/sql.d.ts +8 -0
  68. package/build/services/role/sql.js +17 -1
  69. package/build/services/task/crud.js +22 -14
  70. package/build/services/task/process.js +3 -21
  71. package/build/services/task/resolve.d.ts +5 -3
  72. package/build/services/task/resolve.js +9 -6
  73. package/build/services/task/sql.d.ts +30 -2
  74. package/build/services/task/sql.js +72 -2
  75. package/build/services/user/crud.d.ts +1 -0
  76. package/build/services/user/crud.js +29 -11
  77. package/build/services/user/index.d.ts +2 -1
  78. package/build/services/user/index.js +12 -1
  79. package/build/services/user/rbac.d.ts +18 -0
  80. package/build/services/user/rbac.js +27 -0
  81. package/build/services/user/roles.d.ts +7 -2
  82. package/build/services/user/roles.js +21 -5
  83. package/build/services/user/scope.d.ts +22 -0
  84. package/build/services/user/scope.js +50 -0
  85. package/build/services/user/seed-admin.js +34 -17
  86. package/build/services/user/sql.d.ts +18 -7
  87. package/build/services/user/sql.js +38 -13
  88. package/build/services/user/sso-provision.js +41 -24
  89. package/build/services/user/types.d.ts +9 -5
  90. package/build/start/adapters.js +3 -0
  91. package/build/system/mcp-servers/admin/diagnostics.d.ts +5 -4
  92. package/build/system/mcp-servers/admin/diagnostics.js +12 -10
  93. package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
  94. package/build/system/mcp-servers/admin/escalations.js +247 -54
  95. package/build/system/mcp-servers/admin/index.js +3 -3
  96. package/build/system/mcp-servers/admin/schemas.d.ts +417 -3
  97. package/build/system/mcp-servers/admin/schemas.js +101 -5
  98. package/build/system/mcp-servers/admin/users.js +28 -2
  99. package/build/system/mcp-servers/admin/workflows.js +23 -12
  100. package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
  101. package/build/system/seed/tool-manifests-admin.js +10 -2
  102. package/build/tsconfig.tsbuildinfo +1 -1
  103. package/build/types/envelope.d.ts +7 -0
  104. package/build/types/facets.d.ts +60 -0
  105. package/build/types/facets.js +10 -0
  106. package/build/types/index.d.ts +2 -1
  107. package/build/types/startup.d.ts +9 -0
  108. package/build/types/user.d.ts +11 -0
  109. package/dashboard/dist/assets/AdminDashboard-2CZ8py9X.js +2 -0
  110. package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js.map → AdminDashboard-2CZ8py9X.js.map} +1 -1
  111. package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js → AgentConfigPage-D68sodgo.js} +7 -7
  112. package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js.map → AgentConfigPage-D68sodgo.js.map} +1 -1
  113. package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js +4 -0
  114. package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js.map +1 -0
  115. package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js +2 -0
  116. package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js.map +1 -0
  117. package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js +2 -0
  118. package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js.map +1 -0
  119. package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js → BotPicker-D-FvXJOM.js} +2 -2
  120. package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js.map → BotPicker-D-FvXJOM.js.map} +1 -1
  121. package/dashboard/dist/assets/CapabilitiesPage-ByDf6WJr.js +2 -0
  122. package/dashboard/dist/assets/{CapabilitiesPage-DTfKCzBQ.js.map → CapabilitiesPage-ByDf6WJr.js.map} +1 -1
  123. package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js → CollapsibleSection-BjGNYEvh.js} +2 -2
  124. package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js.map → CollapsibleSection-BjGNYEvh.js.map} +1 -1
  125. package/dashboard/dist/assets/CopyableId-blg-gZvT.js +2 -0
  126. package/dashboard/dist/assets/CopyableId-blg-gZvT.js.map +1 -0
  127. package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js → CredentialsPage-DvCA-wQN.js} +2 -2
  128. package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js.map → CredentialsPage-DvCA-wQN.js.map} +1 -1
  129. package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js → CronLabel-DBMurd_c.js} +2 -2
  130. package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js.map → CronLabel-DBMurd_c.js.map} +1 -1
  131. package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js → CustomDurationPicker-DHflFoEa.js} +2 -2
  132. package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js.map → CustomDurationPicker-DHflFoEa.js.map} +1 -1
  133. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-CUtdp99Z.js} +2 -2
  134. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-CUtdp99Z.js.map} +1 -1
  135. package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js → ElapsedCell-CSjcVOpo.js} +2 -2
  136. package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js.map → ElapsedCell-CSjcVOpo.js.map} +1 -1
  137. package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js → EscalationsOverview-BUqRNJbK.js} +2 -2
  138. package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js.map → EscalationsOverview-BUqRNJbK.js.map} +1 -1
  139. package/dashboard/dist/assets/{EventTable-CwvX_L9t.js → EventTable-Chz-6XPE.js} +2 -2
  140. package/dashboard/dist/assets/{EventTable-CwvX_L9t.js.map → EventTable-Chz-6XPE.js.map} +1 -1
  141. package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js → GraphInvokePage-BXdgciWg.js} +2 -2
  142. package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js.map → GraphInvokePage-BXdgciWg.js.map} +1 -1
  143. package/dashboard/dist/assets/{HomePage-BS_-jcHr.js → HomePage-CEMxnk0r.js} +2 -2
  144. package/dashboard/dist/assets/{HomePage-BS_-jcHr.js.map → HomePage-CEMxnk0r.js.map} +1 -1
  145. package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js → ListToolbar-_73JCdbB.js} +2 -2
  146. package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js.map → ListToolbar-_73JCdbB.js.map} +1 -1
  147. package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js → McpOverview-DfdqxhSz.js} +2 -2
  148. package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js.map → McpOverview-DfdqxhSz.js.map} +1 -1
  149. package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js → McpQueryDetailPage-DPAljieY.js} +2 -2
  150. package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js.map → McpQueryDetailPage-DPAljieY.js.map} +1 -1
  151. package/dashboard/dist/assets/McpQueryPage-D5cSziYS.js +2 -0
  152. package/dashboard/dist/assets/McpQueryPage-D5cSziYS.js.map +1 -0
  153. package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js → McpRunDetailPage-DwNb9wZg.js} +2 -2
  154. package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js.map → McpRunDetailPage-DwNb9wZg.js.map} +1 -1
  155. package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js +2 -0
  156. package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js.map +1 -0
  157. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-uW-xOedj.js} +2 -2
  158. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-uW-xOedj.js.map} +1 -1
  159. package/dashboard/dist/assets/OperatorDashboard-DYw9Ekv5.js +2 -0
  160. package/dashboard/dist/assets/OperatorDashboard-DYw9Ekv5.js.map +1 -0
  161. package/dashboard/dist/assets/PageHeader-DVOZjBfL.js +2 -0
  162. package/dashboard/dist/assets/PageHeader-DVOZjBfL.js.map +1 -0
  163. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DtTpDHOd.js} +2 -2
  164. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DtTpDHOd.js.map} +1 -1
  165. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +2 -0
  166. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +1 -0
  167. package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js → ProcessDetailPage-B0Dokcx9.js} +2 -2
  168. package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js.map → ProcessDetailPage-B0Dokcx9.js.map} +1 -1
  169. package/dashboard/dist/assets/ProcessesListPage-Cc87WIjL.js +2 -0
  170. package/dashboard/dist/assets/ProcessesListPage-Cc87WIjL.js.map +1 -0
  171. package/dashboard/dist/assets/RolePill-BaW-30TC.js +2 -0
  172. package/dashboard/dist/assets/RolePill-BaW-30TC.js.map +1 -0
  173. package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js → RolesPage-cp6PiF08.js} +2 -2
  174. package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js.map → RolesPage-cp6PiF08.js.map} +1 -1
  175. package/dashboard/dist/assets/RowActions-BA9L9djf.js +2 -0
  176. package/dashboard/dist/assets/RowActions-BA9L9djf.js.map +1 -0
  177. package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js → RunAsSelector-2LWkjSnO.js} +2 -2
  178. package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js.map → RunAsSelector-2LWkjSnO.js.map} +1 -1
  179. package/dashboard/dist/assets/{StickyPagination-BWhFSr2d.js → StickyPagination-BQEm--kI.js} +2 -2
  180. package/dashboard/dist/assets/{StickyPagination-BWhFSr2d.js.map → StickyPagination-BQEm--kI.js.map} +1 -1
  181. package/dashboard/dist/assets/StreamMessageDetail-BTtw3GjX.js +2 -0
  182. package/dashboard/dist/assets/{StreamMessageDetail-BF0tM0cd.js.map → StreamMessageDetail-BTtw3GjX.js.map} +1 -1
  183. package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js → SwimlaneTimeline-DdXxP4fO.js} +2 -2
  184. package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js.map → SwimlaneTimeline-DdXxP4fO.js.map} +1 -1
  185. package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-x9XTuqMb.js} +2 -2
  186. package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-x9XTuqMb.js.map} +1 -1
  187. package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js → TaskDetailPage-B8veYG4X.js} +2 -2
  188. package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js.map → TaskDetailPage-B8veYG4X.js.map} +1 -1
  189. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-DSEQZ-HT.js} +2 -2
  190. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-DSEQZ-HT.js.map} +1 -1
  191. package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js → TasksListPage-CsN1gZj5.js} +2 -2
  192. package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js.map → TasksListPage-CsN1gZj5.js.map} +1 -1
  193. package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js → TimeAgo-n182EcLx.js} +2 -2
  194. package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js.map → TimeAgo-n182EcLx.js.map} +1 -1
  195. package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js → TimestampCell-2dlcQAfX.js} +2 -2
  196. package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js.map → TimestampCell-2dlcQAfX.js.map} +1 -1
  197. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-B_e4eT77.js} +2 -2
  198. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-B_e4eT77.js.map} +1 -1
  199. package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js → ToolTestPanel-Bhnncc6M.js} +2 -2
  200. package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js.map → ToolTestPanel-Bhnncc6M.js.map} +1 -1
  201. package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js → TopicDetailPage-29lsNsqI.js} +3 -3
  202. package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js.map → TopicDetailPage-29lsNsqI.js.map} +1 -1
  203. package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js → TopicsPage-KJ7_LAvo.js} +2 -2
  204. package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js.map → TopicsPage-KJ7_LAvo.js.map} +1 -1
  205. package/dashboard/dist/assets/{UserName-xHAgkk8M.js → UserName-CMoFi9zb.js} +2 -2
  206. package/dashboard/dist/assets/{UserName-xHAgkk8M.js.map → UserName-CMoFi9zb.js.map} +1 -1
  207. package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js → WorkflowExecutionPage-Cymfx-Bp.js} +2 -2
  208. package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js.map → WorkflowExecutionPage-Cymfx-Bp.js.map} +1 -1
  209. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-B66_AnaY.js} +2 -2
  210. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-B66_AnaY.js.map} +1 -1
  211. package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js +2 -0
  212. package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js.map +1 -0
  213. package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js → WorkflowsOverview-0Rc2WT6q.js} +2 -2
  214. package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js.map → WorkflowsOverview-0Rc2WT6q.js.map} +1 -1
  215. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js → YamlWorkflowDetailPage-CARQ7_LN.js} +2 -2
  216. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js.map → YamlWorkflowDetailPage-CARQ7_LN.js.map} +1 -1
  217. package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js → YamlWorkflowsPage-B-7sz1nf.js} +2 -2
  218. package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js.map → YamlWorkflowsPage-B-7sz1nf.js.map} +1 -1
  219. package/dashboard/dist/assets/{agents-JE4aL07D.js → agents-zM43d5Yf.js} +2 -2
  220. package/dashboard/dist/assets/{agents-JE4aL07D.js.map → agents-zM43d5Yf.js.map} +1 -1
  221. package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
  222. package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
  223. package/dashboard/dist/assets/{bots-cAzKkDtQ.js → bots-D5BasOGz.js} +2 -2
  224. package/dashboard/dist/assets/{bots-cAzKkDtQ.js.map → bots-D5BasOGz.js.map} +1 -1
  225. package/dashboard/dist/assets/{capabilities-RBFXLAXF.js → capabilities-BT3PW9CZ.js} +2 -2
  226. package/dashboard/dist/assets/{capabilities-RBFXLAXF.js.map → capabilities-BT3PW9CZ.js.map} +1 -1
  227. package/dashboard/dist/assets/{controlplane-DGhv3rwI.js → controlplane-NpJr49rN.js} +2 -2
  228. package/dashboard/dist/assets/{controlplane-DGhv3rwI.js.map → controlplane-NpJr49rN.js.map} +1 -1
  229. package/dashboard/dist/assets/{escalation-ne7dIaPa.js → escalation-DrzQolPG.js} +2 -2
  230. package/dashboard/dist/assets/{escalation-ne7dIaPa.js.map → escalation-DrzQolPG.js.map} +1 -1
  231. package/dashboard/dist/assets/escalation-columns-QzwmtD60.js +2 -0
  232. package/dashboard/dist/assets/escalation-columns-QzwmtD60.js.map +1 -0
  233. package/dashboard/dist/assets/index-B5w4Gjyk.js +6 -0
  234. package/dashboard/dist/assets/index-B5w4Gjyk.js.map +1 -0
  235. package/dashboard/dist/assets/{index-CByjpYlU.js → index-BCT4kqGR.js} +2 -2
  236. package/dashboard/dist/assets/{index-CByjpYlU.js.map → index-BCT4kqGR.js.map} +1 -1
  237. package/dashboard/dist/assets/{index-CgyucK0e.js → index-C69XvBfg.js} +2 -2
  238. package/dashboard/dist/assets/{index-CgyucK0e.js.map → index-C69XvBfg.js.map} +1 -1
  239. package/dashboard/dist/assets/index-CHw4Fl0t.css +1 -0
  240. package/dashboard/dist/assets/index-C_NwHTMh.js +2 -0
  241. package/dashboard/dist/assets/index-C_NwHTMh.js.map +1 -0
  242. package/dashboard/dist/assets/{index-DgzgRTNg.js → index-Cq0trGqf.js} +2 -2
  243. package/dashboard/dist/assets/{index-DgzgRTNg.js.map → index-Cq0trGqf.js.map} +1 -1
  244. package/dashboard/dist/assets/{index-DPJW96d2.js → index-DE0r9SEX.js} +26 -26
  245. package/dashboard/dist/assets/index-DE0r9SEX.js.map +1 -0
  246. package/dashboard/dist/assets/{index-BTqhAT6p.js → index-DH_CiD0W.js} +2 -2
  247. package/dashboard/dist/assets/{index-BTqhAT6p.js.map → index-DH_CiD0W.js.map} +1 -1
  248. package/dashboard/dist/assets/{index-C2l4GcZ7.js → index-K23FdS-T.js} +3 -3
  249. package/dashboard/dist/assets/{index-C2l4GcZ7.js.map → index-K23FdS-T.js.map} +1 -1
  250. package/dashboard/dist/assets/index-f6K1UNrn.js +2 -0
  251. package/dashboard/dist/assets/index-f6K1UNrn.js.map +1 -0
  252. package/dashboard/dist/assets/{index-BbJuC9kg.js → index-qr1fndqM.js} +2 -2
  253. package/dashboard/dist/assets/{index-BbJuC9kg.js.map → index-qr1fndqM.js.map} +1 -1
  254. package/dashboard/dist/assets/index-vKTvJ_li.js +2 -0
  255. package/dashboard/dist/assets/index-vKTvJ_li.js.map +1 -0
  256. package/dashboard/dist/assets/{index-CQDn-bLr.js → index-y-3ODtEE.js} +2 -2
  257. package/dashboard/dist/assets/{index-CQDn-bLr.js.map → index-y-3ODtEE.js.map} +1 -1
  258. package/dashboard/dist/assets/{index-QxAYCJ1S.js → index-y56Ds-LB.js} +2 -2
  259. package/dashboard/dist/assets/{index-QxAYCJ1S.js.map → index-y56Ds-LB.js.map} +1 -1
  260. package/dashboard/dist/assets/{knowledge-DzRpsm3D.js → knowledge-DSSATOTX.js} +2 -2
  261. package/dashboard/dist/assets/{knowledge-DzRpsm3D.js.map → knowledge-DSSATOTX.js.map} +1 -1
  262. package/dashboard/dist/assets/{mcp-B1lc6nL4.js → mcp-CfJFVo5k.js} +2 -2
  263. package/dashboard/dist/assets/{mcp-B1lc6nL4.js.map → mcp-CfJFVo5k.js.map} +1 -1
  264. package/dashboard/dist/assets/{mcp-query-CXuweaN3.js → mcp-query-DKVx2Q-X.js} +2 -2
  265. package/dashboard/dist/assets/{mcp-query-CXuweaN3.js.map → mcp-query-DKVx2Q-X.js.map} +1 -1
  266. package/dashboard/dist/assets/{pipelines-D4VLWDvu.js → pipelines-BSWzE-6M.js} +2 -2
  267. package/dashboard/dist/assets/{pipelines-D4VLWDvu.js.map → pipelines-BSWzE-6M.js.map} +1 -1
  268. package/dashboard/dist/assets/{roles-CSpHRRu8.js → roles-t9HzhI5N.js} +2 -2
  269. package/dashboard/dist/assets/{roles-CSpHRRu8.js.map → roles-t9HzhI5N.js.map} +1 -1
  270. package/dashboard/dist/assets/{tasks-CWUsKhM4.js → tasks-B7rUihoH.js} +2 -2
  271. package/dashboard/dist/assets/{tasks-CWUsKhM4.js.map → tasks-B7rUihoH.js.map} +1 -1
  272. package/dashboard/dist/assets/{topics-BXwstrzB.js → topics-PC2fEiyD.js} +2 -2
  273. package/dashboard/dist/assets/{topics-BXwstrzB.js.map → topics-PC2fEiyD.js.map} +1 -1
  274. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
  275. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
  276. package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js → useEventHooks-DK9mw1cI.js} +2 -2
  277. package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js.map → useEventHooks-DK9mw1cI.js.map} +1 -1
  278. package/dashboard/dist/assets/{useNamespace-CsepDyR5.js → useNamespace-3IjtUtAw.js} +2 -2
  279. package/dashboard/dist/assets/{useNamespace-CsepDyR5.js.map → useNamespace-3IjtUtAw.js.map} +1 -1
  280. package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js → useYamlActivityEvents-uxukp3gO.js} +2 -2
  281. package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js.map → useYamlActivityEvents-uxukp3gO.js.map} +1 -1
  282. package/dashboard/dist/assets/users-CC4B5Fm5.js +2 -0
  283. package/dashboard/dist/assets/users-CC4B5Fm5.js.map +1 -0
  284. package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-Dy5Jpknf.js} +114 -109
  285. package/dashboard/dist/assets/vendor-icons-Dy5Jpknf.js.map +1 -0
  286. package/dashboard/dist/assets/{workflows-C7Cam2Ok.js → workflows-S7MF1nNk.js} +2 -2
  287. package/dashboard/dist/assets/{workflows-C7Cam2Ok.js.map → workflows-S7MF1nNk.js.map} +1 -1
  288. package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js → yaml-workflows-WfdaMHNn.js} +2 -2
  289. package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js.map → yaml-workflows-WfdaMHNn.js.map} +1 -1
  290. package/dashboard/dist/index.html +3 -3
  291. package/docs/api/http/escalations.md +131 -10
  292. package/docs/api/http/roles.md +44 -9
  293. package/docs/api/http/users.md +15 -6
  294. package/docs/api/mcp/admin.md +164 -14
  295. package/docs/api/mcp/human-queue.md +34 -2
  296. package/docs/api/sdk/escalations.md +155 -2
  297. package/docs/api/sdk/roles.md +11 -0
  298. package/docs/api/sdk/users.md +26 -1
  299. package/docs/auth.md +1 -1
  300. package/docs/dashboard.md +5 -4
  301. package/docs/data.md +9 -2
  302. package/docs/faceted-routing.md +221 -0
  303. package/docs/hitl-guide.md +50 -0
  304. package/docs/iam.md +31 -0
  305. package/docs/mcp.md +8 -0
  306. package/package.json +2 -2
  307. package/dashboard/dist/assets/AdminDashboard-DZpduYdW.js +0 -2
  308. package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js +0 -4
  309. package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js.map +0 -1
  310. package/dashboard/dist/assets/AgentsPage-C3FztFd_.js +0 -2
  311. package/dashboard/dist/assets/AgentsPage-C3FztFd_.js.map +0 -1
  312. package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js +0 -2
  313. package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js.map +0 -1
  314. package/dashboard/dist/assets/CapabilitiesPage-DTfKCzBQ.js +0 -2
  315. package/dashboard/dist/assets/CopyableId-DaT0ZRHg.js +0 -2
  316. package/dashboard/dist/assets/CopyableId-DaT0ZRHg.js.map +0 -1
  317. package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js +0 -2
  318. package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js.map +0 -1
  319. package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js +0 -2
  320. package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js.map +0 -1
  321. package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js +0 -2
  322. package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js.map +0 -1
  323. package/dashboard/dist/assets/PageHeader-Bnt2iQQa.js +0 -2
  324. package/dashboard/dist/assets/PageHeader-Bnt2iQQa.js.map +0 -1
  325. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  326. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js.map +0 -1
  327. package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js +0 -2
  328. package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js.map +0 -1
  329. package/dashboard/dist/assets/RolePill-DQTT1s9v.js +0 -2
  330. package/dashboard/dist/assets/RolePill-DQTT1s9v.js.map +0 -1
  331. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  332. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js.map +0 -1
  333. package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js +0 -2
  334. package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js +0 -2
  335. package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js.map +0 -1
  336. package/dashboard/dist/assets/escalation-columns-DqTkKbCv.js +0 -2
  337. package/dashboard/dist/assets/escalation-columns-DqTkKbCv.js.map +0 -1
  338. package/dashboard/dist/assets/index-CEpw_Fh8.js +0 -2
  339. package/dashboard/dist/assets/index-CEpw_Fh8.js.map +0 -1
  340. package/dashboard/dist/assets/index-ClvYSNZd.css +0 -1
  341. package/dashboard/dist/assets/index-CucXk58o.js +0 -6
  342. package/dashboard/dist/assets/index-CucXk58o.js.map +0 -1
  343. package/dashboard/dist/assets/index-DPJW96d2.js.map +0 -1
  344. package/dashboard/dist/assets/index-DeZhNCf5.js +0 -2
  345. package/dashboard/dist/assets/index-DeZhNCf5.js.map +0 -1
  346. package/dashboard/dist/assets/index-Do8Xp3pa.js +0 -2
  347. package/dashboard/dist/assets/index-Do8Xp3pa.js.map +0 -1
  348. package/dashboard/dist/assets/users-DvhHbR0R.js +0 -2
  349. package/dashboard/dist/assets/users-DvhHbR0R.js.map +0 -1
  350. package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"AvailableEscalationsPage-DIqdBCwe.js","sources":["../../src/components/common/modal/BulkActionBar.tsx","../../src/components/common/modal/BulkAssignModal.tsx","../../src/components/common/modal/BulkTriageModal.tsx","../../src/pages/operator/helpers.ts","../../src/pages/operator/ClaimModal.tsx","../../src/pages/operator/AvailableEscalationsPage.tsx"],"sourcesContent":["import { PRIORITY_OPTIONS } from '../../../lib/constants';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface BulkActionBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n onSetPriority: (priority: 1 | 2 | 3 | 4) => void;\n onClaim: (durationMinutes: number) => void;\n onAssign: () => void;\n onEscalate: (targetRole: string) => void;\n onTriage: () => void;\n onCancel: () => void;\n isPriorityPending: boolean;\n isClaimPending: boolean;\n isAssignPending: boolean;\n isEscalatePending: boolean;\n isTriagePending: boolean;\n isCancelPending: boolean;\n availableRoles: string[];\n}\n\nconst anyPending = (props: BulkActionBarProps) =>\n props.isPriorityPending || props.isClaimPending || props.isAssignPending || props.isEscalatePending || props.isTriagePending || props.isCancelPending;\n\nexport function BulkActionBar(props: BulkActionBarProps) {\n const disabled = anyPending(props);\n const claimDurations = useClaimDurations();\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {props.selectedCount} selected\n </span>\n\n <div className=\"w-px h-5 bg-surface-border\" />\n\n {/* Priority */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onSetPriority(parseInt(e.target.value) as 1 | 2 | 3 | 4);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Priority...</option>\n {PRIORITY_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Claim */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onClaim(parseInt(e.target.value));\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Claim for...</option>\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Assign */}\n <button\n onClick={props.onAssign}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isAssignPending ? 'Assigning...' : 'Assign to...'}\n </button>\n\n {/* Escalate */}\n {props.availableRoles.length > 0 && (\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onEscalate(e.target.value);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Escalate to...</option>\n {props.availableRoles.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n )}\n\n {/* Triage */}\n <button\n onClick={props.onTriage}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isTriagePending ? 'Triaging...' : 'Triage'}\n </button>\n\n {/* Cancel */}\n <button\n onClick={props.onCancel}\n disabled={disabled}\n className=\"text-xs py-1.5 px-3 rounded-md border border-status-error/40 text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50\"\n >\n {props.isCancelPending ? 'Cancelling...' : 'Cancel'}\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Clear */}\n <button\n onClick={props.onClearSelection}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n\n {disabled && (\n <span className=\"text-xs text-text-tertiary animate-pulse\">Processing...</span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Modal } from './Modal';\nimport { CustomDurationPicker } from '../form/CustomDurationPicker';\nimport { useUsers } from '../../../api/users';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\nimport type { LTUserRecord } from '../../../api/types';\n\ninterface BulkAssignModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n /** Distinct roles of the selected escalations; scopes user list for admins */\n selectedRoles: string[];\n onSubmit: (targetUserId: string, durationMinutes: number) => void;\n isPending: boolean;\n}\n\nexport function BulkAssignModal({\n open,\n onClose,\n selectedCount,\n selectedRoles,\n onSubmit,\n isPending,\n}: BulkAssignModalProps) {\n const { isSuperAdmin } = useAuth();\n const claimDurations = useClaimDurations();\n const [step, setStep] = useState<'user' | 'duration'>('user');\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [search, setSearch] = useState('');\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n // Admins with a single role: scope to that role. Otherwise show all active users.\n const roleFilter =\n !isSuperAdmin && selectedRoles.length === 1 ? selectedRoles[0] : undefined;\n\n const { data: usersData, isLoading: usersLoading } = useUsers({\n role: roleFilter,\n status: 'active',\n limit: 200,\n });\n\n const filteredUsers = useMemo(() => {\n const users = usersData?.users ?? [];\n if (!search.trim()) return users;\n const q = search.toLowerCase();\n return users.filter(\n (u) =>\n u.display_name?.toLowerCase().includes(q) ||\n u.email?.toLowerCase().includes(q),\n );\n }, [usersData?.users, search]);\n\n const handleClose = () => {\n setStep('user');\n setSelectedUser(null);\n setSearch('');\n setDuration('30');\n setCustomMinutes(0);\n onClose();\n };\n\n const handleSelectUser = (user: LTUserRecord) => {\n setSelectedUser(user);\n setStep('duration');\n };\n\n const handleBack = () => {\n setStep('user');\n };\n\n const handleSubmit = () => {\n if (!selectedUser) return;\n const minutes = duration === 'custom' ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onSubmit(selectedUser.id, minutes);\n };\n\n return (\n <Modal open={open} onClose={handleClose} title=\"Assign Escalations\">\n <div className=\"space-y-4\">\n {step === 'user' && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Select a user to assign{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedCount}\n </span>{' '}\n escalation(s) to:\n </p>\n\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search by name or email...\"\n className=\"input text-xs w-full\"\n autoFocus\n />\n\n <div className=\"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border\">\n {usersLoading && (\n <p className=\"text-xs text-text-tertiary p-3\">\n Loading users...\n </p>\n )}\n {!usersLoading && filteredUsers.length === 0 && (\n <p className=\"text-xs text-text-tertiary p-3\">\n No users found\n </p>\n )}\n {filteredUsers.map((user) => (\n <button\n key={user.id}\n onClick={() => handleSelectUser(user)}\n className=\"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors\"\n >\n <p className=\"text-xs font-medium text-text-primary\">\n {user.display_name || user.external_id}\n </p>\n {user.email && (\n <p className=\"text-[10px] text-text-tertiary\">\n {user.email}\n </p>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-end pt-2\">\n <button onClick={handleClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n </div>\n </>\n )}\n\n {step === 'duration' && selectedUser && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Assign to{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedUser.display_name || selectedUser.external_id}\n </span>{' '}\n for:\n </p>\n\n <select\n value={duration}\n onChange={(e) => { setDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {duration === 'custom' && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={handleBack} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Assigning...' : 'Assign'}\n </button>\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Modal } from './Modal';\n\ninterface BulkTriageModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n onSubmit: (hint?: string) => void;\n isPending: boolean;\n}\n\nexport function BulkTriageModal({\n open,\n onClose,\n selectedCount,\n onSubmit,\n isPending,\n}: BulkTriageModalProps) {\n const [hint, setHint] = useState('');\n\n const handleSubmit = () => {\n onSubmit(hint || undefined);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Submit for AI Triage\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Submit <span className=\"font-medium text-text-primary\">{selectedCount}</span> escalation(s)\n for AI triage? The triage orchestrator will take over resolution.\n </p>\n\n <div>\n <label className=\"text-xs font-medium text-text-secondary block mb-1\">\n Triage hint <span className=\"text-text-tertiary\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={hint}\n onChange={(e) => setHint(e.target.value)}\n placeholder=\"e.g., image_orientation\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Guides the triage workflow on what remediation to apply\n </p>\n </div>\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={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Submitting...' : 'Submit for Triage'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\n\n/**\n * Create a bulk-action handler that calls a mutation and clears selection on success.\n */\nfunction bulkHandler<TData, TVariables>(\n mutation: UseMutationResult<TData, Error, TVariables>,\n clearSelection: () => void,\n afterSuccess?: () => void,\n) {\n return (variables: TVariables) => {\n mutation.mutate(variables, {\n onSuccess: () => {\n clearSelection();\n afterSuccess?.();\n },\n });\n };\n}\n\nexport function createBulkHandlers(deps: {\n selectedIds: Set<string>;\n clearSelection: () => void;\n setPriority: UseMutationResult<{ updated: number }, Error, { ids: string[]; priority: 1 | 2 | 3 | 4 }>;\n bulkClaim: UseMutationResult<{ claimed: number; skipped: number }, Error, { ids: string[]; durationMinutes: number }>;\n bulkEscalate: UseMutationResult<{ updated: number }, Error, { ids: string[]; targetRole: string }>;\n bulkTriage: UseMutationResult<{ triaged: number }, Error, { ids: string[]; hint?: string }>;\n bulkAssign: UseMutationResult<{ assigned: number; skipped: number }, Error, { ids: string[]; targetUserId: string; durationMinutes: number }>;\n bulkCancel: UseMutationResult<{ cancelled: number; skipped: number }, Error, { ids: string[] }>;\n closeTriageModal: () => void;\n closeAssignModal: () => void;\n closeCancelModal: () => void;\n}) {\n const ids = () => [...deps.selectedIds];\n\n const handleSetPriority = (priority: 1 | 2 | 3 | 4) => {\n bulkHandler(\n deps.setPriority,\n deps.clearSelection,\n )({ ids: ids(), priority });\n };\n\n const handleBulkClaim = (durationMinutes: number) => {\n bulkHandler(\n deps.bulkClaim,\n deps.clearSelection,\n )({ ids: ids(), durationMinutes });\n };\n\n const handleBulkEscalate = (targetRole: string) => {\n bulkHandler(\n deps.bulkEscalate,\n deps.clearSelection,\n )({ ids: ids(), targetRole });\n };\n\n const handleBulkTriage = (hint?: string) => {\n bulkHandler(\n deps.bulkTriage,\n deps.clearSelection,\n deps.closeTriageModal,\n )({ ids: ids(), hint });\n };\n\n const handleBulkAssign = (targetUserId: string, durationMinutes: number) => {\n bulkHandler(\n deps.bulkAssign,\n deps.clearSelection,\n deps.closeAssignModal,\n )({ ids: ids(), targetUserId, durationMinutes });\n };\n\n const handleBulkCancel = () => {\n bulkHandler(\n deps.bulkCancel,\n deps.clearSelection,\n deps.closeCancelModal,\n )({ ids: ids() });\n };\n\n return { handleSetPriority, handleBulkClaim, handleBulkEscalate, handleBulkTriage, handleBulkAssign, handleBulkCancel };\n}\n","import { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\n title=\"Claim Escalation\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Claim <span className=\"font-medium text-text-primary\">{claimTarget?.type}</span> for:\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { onDurationChange(e.target.value); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {claimDuration === 'custom' && (\n <CustomDurationPicker onChange={onCustomClaimChange} autoFocus />\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={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAccess } from '../../hooks/useAccess';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\n useEscalationTypes,\n useClaimEscalation,\n useSetEscalationPriority,\n useBulkClaimEscalations,\n useBulkAssignEscalations,\n useBulkEscalateToRole,\n useBulkTriageEscalations,\n useBulkCancelEscalations,\n} from '../../api/escalations';\nimport { ConfirmCancelModal } from '../../components/common/modal/ConfirmCancelModal';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { BulkActionBar } from '../../components/common/modal/BulkActionBar';\nimport { BulkAssignModal } from '../../components/common/modal/BulkAssignModal';\nimport { BulkTriageModal } from '../../components/common/modal/BulkTriageModal';\nimport { useClaimDurations } from '../../hooks/useClaimDurations';\nimport { Lock } from 'lucide-react';\nimport { ESCALATION_COLUMNS, EscalationFilterBar } from './escalation-columns';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available', search: '' },\n });\n const claimDurations = useClaimDurations();\n const [claimTarget, setClaimTarget] = useState<LTEscalationRecord | null>(null);\n const [claimDuration, setClaimDuration] = useState('30');\n const [customClaimMinutes, setCustomClaimMinutes] = useState(0);\n const onCustomClaimChange = useCallback((m: number) => setCustomClaimMinutes(m), []);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [triageModalOpen, setTriageModalOpen] = useState(false);\n const [assignModalOpen, setAssignModalOpen] = useState(false);\n const [cancelModalOpen, setCancelModalOpen] = useState(false);\n\n const claim = useClaimEscalation();\n const setPriority = useSetEscalationPriority();\n const bulkClaim = useBulkClaimEscalations();\n const bulkAssign = useBulkAssignEscalations();\n const bulkEscalate = useBulkEscalateToRole();\n const bulkTriage = useBulkTriageEscalations();\n const bulkCancel = useBulkCancelEscalations();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n // Clear selections on filter/page changes\n useEffect(() => {\n setSelectedIds(new Set());\n }, [filters.role, filters.type, filters.priority, filters.status, pagination.page, pagination.pageSize]);\n\n const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const isClaimed = statusFilter === 'claimed';\n const apiStatus = isClaimed ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : statusFilter === 'cancelled' ? 'cancelled'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n };\n\n const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n claimed: isClaimed || undefined,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const rawEscalations = data?.escalations ?? [];\n\n // Client-side search across visible fields + metadata values\n const searchTerm = (filters.search ?? '').toLowerCase();\n const escalations = searchTerm\n ? rawEscalations.filter((e) => {\n const fields = [e.id, e.type, e.subtype, e.description, e.workflow_id, e.origin_id, e.role];\n if (e.metadata) fields.push(...Object.values(e.metadata).map(String));\n return fields.some((f) => f && String(f).toLowerCase().includes(searchTerm));\n })\n : rawEscalations;\n\n const total = searchTerm\n ? escalations.length\n : data?.total ?? 0;\n const { canBulk: canBulkManage } = useAccess();\n\n const selectedRoles = useMemo(() => {\n const roles = new Set<string>();\n for (const esc of escalations) {\n if (selectedIds.has(esc.id)) roles.add(esc.role);\n }\n return [...roles];\n }, [escalations, selectedIds]);\n\n const clearSelection = useCallback(() => setSelectedIds(new Set()), []);\n\n const handleClaim = () => {\n if (!claimTarget) return;\n const minutes = claimDuration === 'custom' ? customClaimMinutes : parseInt(claimDuration);\n if (!minutes || minutes <= 0) return;\n claim.mutate(\n { id: claimTarget.id, durationMinutes: minutes },\n {\n onSuccess: () => {\n setClaimTarget(null);\n navigate(`/escalations/detail/${claimTarget.id}`);\n },\n },\n );\n };\n\n const {\n handleSetPriority,\n handleBulkClaim,\n handleBulkEscalate,\n handleBulkTriage,\n handleBulkAssign,\n handleBulkCancel,\n } = createBulkHandlers({\n selectedIds,\n clearSelection,\n setPriority,\n bulkClaim,\n bulkEscalate,\n bulkTriage,\n bulkAssign,\n bulkCancel,\n closeTriageModal: () => setTriageModalOpen(false),\n closeAssignModal: () => setAssignModalOpen(false),\n closeCancelModal: () => setCancelModalOpen(false),\n });\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleAll = () => {\n if (selectedIds.size === escalations.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(escalations.map((e) => e.id)));\n }\n };\n\n const columns: Column<LTEscalationRecord>[] = [\n canBulkManage ? {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={escalations.length > 0 && selectedIds.size === escalations.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row: LTEscalationRecord) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(row.id)}\n onChange={(e) => {\n e.stopPropagation();\n toggleSelect(row.id);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n } : {\n key: 'spacer',\n label: '',\n render: () => null,\n className: 'w-10',\n },\n ...ESCALATION_COLUMNS,\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Lock}\n title=\"Claim escalation\"\n onClick={() => setClaimTarget(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Available Escalations\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {selectedIds.size > 0 && (\n <BulkActionBar\n selectedCount={selectedIds.size}\n onClearSelection={() => setSelectedIds(new Set())}\n onSetPriority={handleSetPriority}\n onClaim={handleBulkClaim}\n onAssign={() => setAssignModalOpen(true)}\n onEscalate={handleBulkEscalate}\n onTriage={() => setTriageModalOpen(true)}\n onCancel={() => setCancelModalOpen(true)}\n isPriorityPending={setPriority.isPending}\n isClaimPending={bulkClaim.isPending}\n isAssignPending={bulkAssign.isPending}\n isEscalatePending={bulkEscalate.isPending}\n isTriagePending={bulkTriage.isPending}\n isCancelPending={bulkCancel.isPending}\n availableRoles={rolesData?.roles ?? []}\n />\n )}\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={escalations}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/available' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No available escalations'}\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\n <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\n\n <BulkTriageModal\n open={triageModalOpen}\n onClose={() => setTriageModalOpen(false)}\n selectedCount={selectedIds.size}\n onSubmit={handleBulkTriage}\n isPending={bulkTriage.isPending}\n />\n\n <BulkAssignModal\n open={assignModalOpen}\n onClose={() => setAssignModalOpen(false)}\n selectedCount={selectedIds.size}\n selectedRoles={selectedRoles}\n onSubmit={handleBulkAssign}\n isPending={bulkAssign.isPending}\n />\n\n <ConfirmCancelModal\n open={cancelModalOpen}\n onClose={() => setCancelModalOpen(false)}\n onConfirm={handleBulkCancel}\n selectedCount={selectedIds.size}\n isPending={bulkCancel.isPending}\n error={bulkCancel.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["anyPending","props","BulkActionBar","disabled","claimDurations","useClaimDurations","jsxs","jsx","e","PRIORITY_OPTIONS","opt","role","BulkAssignModal","open","onClose","selectedCount","selectedRoles","onSubmit","isPending","isSuperAdmin","useAuth","step","setStep","useState","selectedUser","setSelectedUser","search","setSearch","duration","setDuration","customMinutes","setCustomMinutes","onCustomChange","useCallback","m","roleFilter","usersData","usersLoading","useUsers","filteredUsers","useMemo","users","q","u","_a","_b","handleClose","handleSelectUser","user","handleBack","handleSubmit","minutes","Modal","Fragment","CustomDurationPicker","BulkTriageModal","hint","setHint","bulkHandler","mutation","clearSelection","afterSuccess","variables","createBulkHandlers","deps","ids","priority","durationMinutes","targetRole","targetUserId","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","cancelModalOpen","setCancelModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","bulkCancel","useBulkCancelEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","isClaimed","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","rawEscalations","searchTerm","escalations","fields","f","total","canBulkManage","useAccess","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","handleBulkCancel","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v","ConfirmCancelModal"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as d,j as e}from"./vendor-query-B2UbickB.js";import{u as N}from"./capabilities-RBFXLAXF.js";import{T as y,S as g}from"./ToolTestPanel-3OcG18e5.js";import{T as b}from"./ToolPill-DjvedZSn.js";import{P as k}from"./PageHeader-Bnt2iQQa.js";import{aN as f,B as w,f as C,C as S,aO as I,D as T,az as q,ag as P,x as E,aP as $,P as A,Z as L}from"./vendor-icons-Dj2F0Jrb.js";import"./index-DPJW96d2.js";import"./vendor-react-CXumBFUA.js";import"./mcp-B1lc6nL4.js";import"./RunAsSelector-CvxGTNGT.js";import"./BotPicker-Dse2jW4b.js";import"./bots-cAzKkDtQ.js";import"./helpers-DzO-OGPe.js";const p={Communication:{icon:E,color:"text-blue-400"},Analysis:{icon:P,color:"text-violet-400"},Media:{icon:q,color:"text-pink-400"},Data:{icon:T,color:"text-emerald-400"},Automation:{icon:I,color:"text-amber-400"},Development:{icon:S,color:"text-cyan-400"},System:{icon:C,color:"text-red-400"},Reference:{icon:w,color:"text-text-tertiary"},Other:{icon:f,color:"text-text-tertiary"}};function J(){const{data:a,isLoading:l}=N(),[c,m]=d.useState(""),[o,u]=d.useState(null),[n,h]=d.useState(null),x=(a==null?void 0:a.categories)??[],j=(a==null?void 0:a.totalTools)??0,v=d.useMemo(()=>{let t=x;if(o&&(t=t.filter(i=>i.name===o)),!c.trim())return t;const r=c.toLowerCase();return t.map(i=>({...i,tools:i.tools.filter(s=>s.name.toLowerCase().includes(r)||s.description.toLowerCase().includes(r)||s.serverName.toLowerCase().includes(r))})).filter(i=>i.tools.length>0)},[x,c,o]);return e.jsxs("div",{children:[e.jsx(k,{title:"Capabilities"}),!l&&x.length>0&&e.jsxs("div",{className:"flex items-center gap-5 mb-10",children:[e.jsxs("button",{onClick:()=>u(null),className:`flex flex-col items-center gap-1 transition-colors ${o===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(f,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),x.map(t=>{const r=p[t.name]??p.Other,i=r.icon,s=o===t.name;return e.jsxs("button",{onClick:()=>u(s?null:t.name),className:`flex flex-col items-center gap-1 transition-colors ${s?r.color:"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(i,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:t.name})]},t.name)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx($,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary"}),e.jsx("input",{type:"text",value:c,onChange:t=>m(t.target.value),placeholder:`Search ${j} capabilities…`,className:"pl-9 pr-3 py-1.5 text-sm bg-surface-sunken border border-surface-border rounded-md text-text-primary placeholder:text-text-quaternary focus:outline-none focus:ring-1 focus:ring-accent/50 w-56"})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-8 items-start",children:[e.jsx("div",{className:"col-span-2",children:l?e.jsx("div",{className:"animate-pulse space-y-8",children:[1,2,3].map(t=>e.jsxs("div",{children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-28 mb-4"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(r=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-36"}),e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})]},r))})]},t))}):v.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:c||o?"No capabilities match your filter.":"No capabilities registered yet."}):e.jsx("div",{className:"space-y-10",children:v.map(t=>{const r=p[t.name]??p.Other,i=r.icon;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1 pb-2 border-b border-surface-border",children:[e.jsx(i,{className:`w-4 h-4 ${r.color}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:t.name}),e.jsx("span",{className:"text-xs text-text-quaternary",children:t.tools.length})]}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:t.tools.map(s=>e.jsx(D,{tool:s,isSelected:(n==null?void 0:n.tool.name)===s.name&&(n==null?void 0:n.serverId)===s.serverId,onSelect:()=>h({serverId:s.serverId,serverName:s.serverName,tool:{name:s.name,description:s.description,inputSchema:s.inputSchema}})},`${s.serverId}-${s.name}`))})]},t.name)})})}),e.jsx("div",{className:"sticky top-4",children:n?e.jsx(y,{serverId:n.serverId,serverName:n.serverName,tool:n.tool,onClose:()=>h(null)}):e.jsx(O,{})})]})]})}function O(){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 gap-3 text-center",children:[e.jsx(L,{className:"w-7 h-7 text-text-quaternary",strokeWidth:1}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a capability"}),e.jsx("p",{className:"text-xs text-text-quaternary leading-relaxed max-w-[200px]",children:"Explore its inputs, run it live, and inspect the response."})]})}function D({tool:a,isSelected:l,onSelect:c}){return e.jsxs("div",{role:"button",tabIndex:0,onClick:c,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&c()},className:`group py-3 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left ${l?"bg-accent/[0.06]":"hover:bg-surface-hover/60"}`,children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 mb-1",children:[e.jsx(b,{name:a.name,size:"md"}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsx(g,{name:a.serverName,serverId:a.serverId}),e.jsx(A,{className:`w-3 h-3 transition-opacity ${l?"text-accent opacity-100":"text-accent opacity-0 group-hover:opacity-100"}`,strokeWidth:1.5})]})]}),e.jsx("p",{className:"text-[11px] text-text-tertiary leading-relaxed line-clamp-2 pl-0.5",children:a.description})]})}export{J as CapabilitiesPage};
2
- //# sourceMappingURL=CapabilitiesPage-DTfKCzBQ.js.map
@@ -1,2 +0,0 @@
1
- import{a as x,j as t}from"./vendor-query-B2UbickB.js";import{c as d}from"./vendor-react-CXumBFUA.js";const u=20;function h(e,o=u){if(e.length<=o)return e;const r=Math.floor((o-1)/2);return`${e.slice(0,r)}…${e.slice(-r)}`}function j({label:e,value:o,href:r,external:c}){const[s,i]=x.useState(!1),l=d();if(!o)return null;const a=n=>{n.stopPropagation(),navigator.clipboard.writeText(o),i(!0),setTimeout(()=>i(!1),1500)},p=n=>{n.stopPropagation(),r&&(c?window.open(r,"_blank","noopener,noreferrer"):l(r))};return t.jsxs("div",{className:"text-left group relative",children:[t.jsx("span",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:e}),t.jsxs("span",{className:"flex items-center gap-1 mt-0.5",children:[t.jsx("button",{onClick:a,title:o,className:"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors",children:h(o)}),t.jsx("button",{onClick:a,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:`w-3 h-3 transition-colors ${s?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:s?t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),r&&t.jsx("button",{onClick:p,title:`View ${e}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})})})]})]})}export{j as C};
2
- //# sourceMappingURL=CopyableId-DaT0ZRHg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CopyableId-DaT0ZRHg.js","sources":["../../src/components/common/display/CopyableId.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nconst ELLIPSIS_MAX = 20;\n\nfunction centerEllipsis(s: string, max = ELLIPSIS_MAX): string {\n if (s.length <= max) return s;\n const side = Math.floor((max - 1) / 2);\n return `${s.slice(0, side)}…${s.slice(-side)}`;\n}\n\ninterface CopyableIdProps {\n label: string;\n value: string | null | undefined;\n href?: string;\n external?: boolean;\n}\n\nexport function CopyableId({ label, value, href, external }: CopyableIdProps) {\n const [copied, setCopied] = useState(false);\n const navigate = useNavigate();\n if (!value) return null;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNavigate = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) return;\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n navigate(href);\n }\n };\n\n return (\n <div className=\"text-left group relative\">\n <span className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">{label}</span>\n <span className=\"flex items-center gap-1 mt-0.5\">\n <button\n onClick={handleCopy}\n title={value}\n className=\"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors\"\n >\n {centerEllipsis(value)}\n </button>\n <button onClick={handleCopy} title=\"Copy\" className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-text-primary'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n {href && (\n <button onClick={handleNavigate} title={`View ${label}`} className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n )}\n </span>\n </div>\n );\n}\n"],"names":["ELLIPSIS_MAX","centerEllipsis","s","max","side","CopyableId","label","value","href","external","copied","setCopied","useState","navigate","useNavigate","handleCopy","e","handleNavigate","jsxs","jsx"],"mappings":"qGAGA,MAAMA,EAAe,GAErB,SAASC,EAAeC,EAAWC,EAAMH,EAAsB,CAC7D,GAAIE,EAAE,QAAUC,EAAK,OAAOD,EAC5B,MAAME,EAAO,KAAK,OAAOD,EAAM,GAAK,CAAC,EACrC,MAAO,GAAGD,EAAE,MAAM,EAAGE,CAAI,CAAC,IAAIF,EAAE,MAAM,CAACE,CAAI,CAAC,EAC9C,CASO,SAASC,EAAW,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,EAAM,SAAAC,GAA6B,CAC5E,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAWC,EAAA,EACjB,GAAI,CAACP,EAAO,OAAO,KAEnB,MAAMQ,EAAcC,GAAwB,CAC1CA,EAAE,gBAAA,EACF,UAAU,UAAU,UAAUT,CAAK,EACnCI,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,IAAI,CACzC,EAEMM,EAAkBD,GAAwB,CAC9CA,EAAE,gBAAA,EACGR,IACDC,EACF,OAAO,KAAKD,EAAM,SAAU,qBAAqB,EAEjDK,EAASL,CAAI,EAEjB,EAEA,OACEU,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,sEAAuE,SAAAb,EAAM,EAC7FY,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,QAASJ,EACT,MAAOR,EACP,UAAU,oFAET,WAAeA,CAAK,CAAA,CAAA,QAEtB,SAAA,CAAO,QAASQ,EAAY,MAAM,OAAO,UAAU,sEAClD,SAAAI,EAAAA,IAAC,OAAI,UAAW,6BAA6BT,EAAS,sBAAwB,4CAA4C,GAAI,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC9L,WACGS,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,iBAAiB,EACtEA,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uIAAuI,EAElM,CAAA,CACF,EACCX,GACCW,EAAAA,IAAC,SAAA,CAAO,QAASF,EAAgB,MAAO,QAAQX,CAAK,GAAI,UAAU,sEACjE,SAAAa,EAAAA,IAAC,MAAA,CAAI,UAAU,+CAA+C,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC/H,SAAAA,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,CAAuI,EAC9L,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{P as j}from"./PageHeader-Bnt2iQQa.js";import{D as _}from"./DataTable-D9yuBv0w.js";import{F as v,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as N}from"./StickyPagination-BWhFSr2d.js";import{L as P}from"./ListToolbar-BH9rwQVE.js";import{T as h}from"./TimestampCell-Dsje8GH-.js";import{E as C}from"./ElapsedCell-BNexhR5d.js";import{W as $}from"./WorkflowPill-F1oKUzmc.js";import{E as W}from"./EmptyState-BcsfPq9T.js";import{R as c}from"./RowActions-Dg-Fsm5O.js";import{u as S}from"./useFilterParams-x-Dg0Vgz.js";import{b as q}from"./useEventHooks-CjygrbYy.js";import{u as T}from"./mcp-query-CXuweaN3.js";import{b as y,v as D,w as g,x as k,y as B,z as F}from"./vendor-icons-Dj2F0Jrb.js";import{c as L}from"./vendor-react-CXumBFUA.js";import"./index-DPJW96d2.js";const M={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function z(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const a=p(t),o=M[a]??"bg-status-pending",l=a==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${o}${l}`,title:a}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx($,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const a=p(t);return e.jsx(C,{startDate:t.created_at,endDate:a==="in_progress"?null:t.updated_at,isLive:a==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const o=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(D,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Build":"Planning...",disabled:!o,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Profile":"Building...",disabled:!o,children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Compile":"Complete discovery first",disabled:!o,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function se(){const s=L(),t=z(s),{filters:a,setFilter:o,pagination:l,sort:d,setSort:r}=S({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=T({limit:l.pageSize,offset:l.offset,search:a.search,status:a.status,entity:a.type||void 0});q();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(P,{onRefresh:()=>b(),apiPath:`/workflow-states/jobs?entity=${a.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner"}&limit=${l.pageSize}&offset=${l.offset}&sort_by=created_at&order=desc${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[e.jsx(f,{label:"Type",value:a.type,onChange:i=>o("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:a.status,onChange:i=>o("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const w=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(w)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(W,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(N,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{se as McpQueryPage};
2
- //# sourceMappingURL=McpQueryPage-Db1LUKVs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpQueryPage-Db1LUKVs.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\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\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={s} />\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 <WorkflowPill type={row.entity || 'unknown'} />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => {\n const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={`/workflow-states/jobs?entity=${filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner'}&limit=${pagination.pageSize}&offset=${pagination.offset}&sort_by=created_at&order=desc${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\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) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as u,j as s}from"./vendor-query-B2UbickB.js";import{a as T,u as F}from"./pipelines-D4VLWDvu.js";import{a as R}from"./yaml-workflows-ChUOE22W.js";import{u as M}from"./useFilterParams-x-Dg0Vgz.js";import{u as z}from"./useNamespace-CsepDyR5.js";import{D as E}from"./DataTable-D9yuBv0w.js";import{W as A}from"./WorkflowPill-F1oKUzmc.js";import{T as b}from"./TimestampCell-Dsje8GH-.js";import{E as L}from"./ElapsedCell-BNexhR5d.js";import{P as U}from"./PageHeader-Bnt2iQQa.js";import{F as I,b as g}from"./FilterBar-Ck4K4rzu.js";import{S as O}from"./StickyPagination-BWhFSr2d.js";import{L as W}from"./ListToolbar-BH9rwQVE.js";import{R as B,a as H}from"./RowActions-Dg-Fsm5O.js";import{u as q}from"./vendor-icons-Dj2F0Jrb.js";import{c as G}from"./vendor-react-CXumBFUA.js";import"./index-DPJW96d2.js";import"./controlplane-DGhv3rwI.js";import"./EmptyState-BcsfPq9T.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},J={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},K={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function Q(d,x){return[{key:"workflow_id",label:"Run ID / Tool",render:t=>{const a=J[Y[t.status]??t.status]??"bg-status-pending",n=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}${n}`,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(A,{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(L,{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(B,{children:[s.jsx(H,{icon:q,title:`Filter by ${t.entity}`,onClick:()=>d(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),x(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] ${K[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 fe(){const d=G(),{namespace:x,available:t}=z("namespace"),{filters:a,setFilter:n,setFilters:j,pagination:i,sort:f,setSort:v}=M({filters:{search:"",entity:"",status:"",namespace:""}}),[m,S]=u.useState(a.search);u.useEffect(()=>{if(m===a.search)return;const e=setTimeout(()=>n("search",m),300);return()=>clearTimeout(e)},[m,n,a.search]);const{data:l}=R(),h=u.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]),o=a.namespace||x,{data:c}=T(o),{data:p,isLoading:N,refetch:_,isFetching:k}=F({app_id:o,limit:i.pageSize,offset:i.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:f.sort_by||"created_at",order:f.order||"desc"}),y=(p==null?void 0:p.total)??0,C=(p==null?void 0:p.jobs)??[],$=Q(e=>n("entity",e),e=>n("status",e)),w=u.useMemo(()=>{const e=new Set(h);return o&&e.add(o),[...e].sort().map(r=>({value:r,label:r}))},[h,o]),P=u.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(U,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:pipeline-executions"}),s.jsxs(I,{actions:s.jsx(W,{onRefresh:()=>_(),isFetching:k,apiPath:`/pipelines?app_id=${o}&limit=${i.pageSize}&offset=${i.offset}${a.entity?`&entity=${a.entity}`:""}${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[s.jsx(g,{label:"Namespace",value:o,onChange:e=>{j({namespace:e,entity:""})},options:w,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:m,onChange:e=>S(e.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>n("entity",e),options:P}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>n("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(E,{columns:$,data:C,keyFn:e=>e.workflow_id,onRowClick:e=>d(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${o}`),isLoading:N,emptyMessage:"No pipeline executions found",sort:f,onSort:v}),s.jsx(O,{page:i.page,totalPages:i.totalPages(y),onPageChange:i.setPage,total:y,pageSize:i.pageSize,onPageSizeChange:i.setPageSize})]})}export{fe as McpRunsPage};
2
- //# sourceMappingURL=McpRunsPage--tgT5uo7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunsPage--tgT5uo7.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 { 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={`/pipelines?app_id=${activeNamespace}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\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","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as o}from"./vendor-query-B2UbickB.js";import{j as P,v as L,q as w,s as R}from"./index-DPJW96d2.js";import{f as $}from"./useEventHooks-CjygrbYy.js";import{u as _}from"./roles-CSpHRRu8.js";import{u as T}from"./useFilterParams-x-Dg0Vgz.js";import{D as k}from"./DataTable-D9yuBv0w.js";import{P as F}from"./PageHeader-Bnt2iQQa.js";import{S as N}from"./StickyPagination-BWhFSr2d.js";import{R as z,a as O}from"./RowActions-Dg-Fsm5O.js";import{a as A,T as M,E as I}from"./escalation-columns-DqTkKbCv.js";import{L as q}from"./ListToolbar-BH9rwQVE.js";import{a5 as U}from"./vendor-icons-Dj2F0Jrb.js";import{c as B}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-DQTT1s9v.js";import"./WorkflowPill-F1oKUzmc.js";import"./TimestampCell-Dsje8GH-.js";import"./escalation-ne7dIaPa.js";function pt(){$();const y=B(),{user:i}=P(),{filters:e,setFilter:x,pagination:s,sort:n,setSort:h}=T({filters:{role:"",type:"",priority:"",search:""}}),S=L(),{data:l}=_(),{data:p}=w(),{data:a,isLoading:b,error:r,refetch:j,isFetching:v}=R({assigned_to:i==null?void 0:i.userId,status:"pending",role:e.role||void 0,type:e.type||void 0,priority:e.priority?parseInt(e.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc"}),m=(a==null?void 0:a.escalations)??[],c=(e.search??"").toLowerCase(),d=c?m.filter(t=>{const u=[t.id,t.type,t.subtype,t.description,t.workflow_id,t.origin_id,t.role];return t.metadata&&u.push(...Object.values(t.metadata).map(String)),u.some(f=>f&&String(f).toLowerCase().includes(c))}):m,g=c?d.length:(a==null?void 0:a.total)??0,E={key:"actions",label:"",render:t=>o.jsx(z,{children:o.jsx(O,{icon:U,title:"Release escalation",onClick:()=>S.mutate(t.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},C=[M,...I,E];return o.jsxs("div",{children:[o.jsx(F,{title:"My Escalations"}),o.jsx(A,{filters:e,setFilter:x,roles:(l==null?void 0:l.roles)??[],types:(p==null?void 0:p.types)??[],actions:o.jsx(q,{onRefresh:()=>j(),isFetching:v,apiPath:`/escalations?status=claimed&limit=${s.pageSize}&offset=${s.offset}${e.role?`&role=${e.role}`:""}${e.type?`&type=${e.type}`:""}${e.priority?`&priority=${e.priority}`:""}`})}),r&&o.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:r.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${r.message}`}),o.jsx(k,{columns:C,data:d,keyFn:t=>t.id,onRowClick:t=>y(`/escalations/detail/${t.id}`,{state:{from:"/escalations/queue"}}),isLoading:b,emptyMessage:r?"Unable to load data":"No assigned escalations",sort:n,onSort:h}),o.jsx(N,{page:s.page,totalPages:s.totalPages(g),onPageChange:s.setPage,total:g,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{pt as OperatorDashboard};
2
- //# sourceMappingURL=OperatorDashboard-BWVUbJkZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperatorDashboard-BWVUbJkZ.js","sources":["../../src/pages/operator/OperatorDashboard.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { LockOpen } from 'lucide-react';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalations, useEscalationTypes, useReleaseEscalation } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ESCALATION_COLUMNS, TIME_LEFT_COLUMN, EscalationFilterBar } from './escalation-columns';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function OperatorDashboard() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', search: '' },\n });\n const release = useReleaseEscalation();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n const { data, isLoading, error: queryError, refetch, isFetching } = useEscalations({\n assigned_to: user?.userId,\n status: 'pending',\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n });\n\n const activeRaw = data?.escalations ?? [];\n\n // Client-side search across visible fields + metadata values\n const searchTerm = (filters.search ?? '').toLowerCase();\n const activeClaims = searchTerm\n ? activeRaw.filter((e) => {\n const fields = [e.id, e.type, e.subtype, e.description, e.workflow_id, e.origin_id, e.role];\n if (e.metadata) fields.push(...Object.values(e.metadata).map(String));\n return fields.some((f) => f && String(f).toLowerCase().includes(searchTerm));\n })\n : activeRaw;\n const total = searchTerm ? activeClaims.length : (data?.total ?? 0);\n\n const releaseColumn: Column<LTEscalationRecord> = {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={LockOpen}\n title=\"Release escalation\"\n onClick={() => release.mutate(row.id)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n };\n\n // Time-left first (aligns with checkbox on All Escalations), then summary + base columns + actions\n const columns: Column<LTEscalationRecord>[] = [\n TIME_LEFT_COLUMN,\n ...ESCALATION_COLUMNS,\n releaseColumn,\n ];\n\n return (\n <div>\n <PageHeader title=\"My Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations?status=claimed&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={activeClaims}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/queue' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No assigned escalations'}\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":["OperatorDashboard","useEscalationListEvents","navigate","useNavigate","user","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","release","useReleaseEscalation","rolesData","useRoles","typesData","useEscalationTypes","data","isLoading","queryError","refetch","isFetching","useEscalations","activeRaw","searchTerm","activeClaims","e","fields","total","releaseColumn","row","jsx","RowActionGroup","RowAction","LockOpen","columns","TIME_LEFT_COLUMN","ESCALATION_COLUMNS","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-Dj2F0Jrb.js";function l({title:a,actions:t,docsHash:s}){return e.jsxs("div",{className:"flex items-center gap-4 mb-10",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-1",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:a}),s&&e.jsx("button",{onClick:()=>{window.location.hash=s},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),t&&e.jsx("div",{className:"flex items-center gap-3",children:t})]})}export{l as P};
2
- //# sourceMappingURL=PageHeader-Bnt2iQQa.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PageHeader-Bnt2iQQa.js","sources":["../../src/components/common/layout/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\ninterface PageHeaderProps {\n title: string;\n actions?: ReactNode;\n /** Hash link to open the docs drawer to a specific section, e.g. \"#docs=dashboard.md#workflow-registry\" */\n docsHash?: string;\n}\n\nexport function PageHeader({ title, actions, docsHash }: PageHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-10\">\n <div className=\"flex items-center gap-2 flex-1\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n );\n}\n"],"names":["PageHeader","title","actions","docsHash","jsxs","jsx","BookOpen"],"mappings":"8FAUO,SAASA,EAAW,CAAE,MAAAC,EAAO,QAAAC,EAAS,SAAAC,GAA6B,CACxE,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAJ,EAAM,EAC5DE,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCJ,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,EAChE,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";const r={1:"P1",2:"P2",3:"P3",4:"P4"},s={1:"text-text-primary font-semibold",2:"text-text-primary font-medium",3:"text-text-secondary",4:"text-text-tertiary"};function o({priority:t}){return e.jsx("span",{className:`text-xs ${s[t]??"text-text-secondary"}`,children:r[t]??`P${t}`})}export{o as P};
2
- //# sourceMappingURL=PriorityBadge-DfQY9St9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PriorityBadge-DfQY9St9.js","sources":["../../src/components/common/display/PriorityBadge.tsx"],"sourcesContent":["const priorityLabels: Record<number, string> = {\n 1: 'P1',\n 2: 'P2',\n 3: 'P3',\n 4: 'P4',\n};\n\nconst priorityStyles: Record<number, string> = {\n 1: 'text-text-primary font-semibold',\n 2: 'text-text-primary font-medium',\n 3: 'text-text-secondary',\n 4: 'text-text-tertiary',\n};\n\nexport function PriorityBadge({ priority }: { priority: number }) {\n return (\n <span className={`text-xs ${priorityStyles[priority] ?? 'text-text-secondary'}`}>\n {priorityLabels[priority] ?? `P${priority}`}\n </span>\n );\n}\n"],"names":["priorityLabels","priorityStyles","PriorityBadge","priority","jsx"],"mappings":"+CAAA,MAAMA,EAAyC,CAC7C,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,IACL,EAEMC,EAAyC,CAC7C,EAAG,kCACH,EAAG,gCACH,EAAG,sBACH,EAAG,oBACL,EAEO,SAASC,EAAc,CAAE,SAAAC,GAAkC,CAChE,OACEC,EAAAA,IAAC,OAAA,CAAK,UAAW,WAAWH,EAAeE,CAAQ,GAAK,qBAAqB,GAC1E,SAAAH,EAAeG,CAAQ,GAAK,IAAIA,CAAQ,GAC3C,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{a as c,j as s}from"./vendor-query-B2UbickB.js";import{u as h}from"./tasks-CWUsKhM4.js";import{u as w}from"./workflows-C7Cam2Ok.js";import{u as k}from"./useEventHooks-CjygrbYy.js";import{u as y}from"./useFilterParams-x-Dg0Vgz.js";import{D as _}from"./DataTable-D9yuBv0w.js";import{T as p}from"./TimestampCell-Dsje8GH-.js";import{S as b}from"./StickyPagination-BWhFSr2d.js";import{F as j,a as v,b as m}from"./FilterBar-Ck4K4rzu.js";import{P}from"./PageHeader-Bnt2iQQa.js";import{L as S}from"./ListToolbar-BH9rwQVE.js";import{W as N}from"./WorkflowPill-F1oKUzmc.js";import{c as T}from"./vendor-react-CXumBFUA.js";import"./index-DPJW96d2.js";import"./vendor-icons-Dj2F0Jrb.js";import"./EmptyState-BcsfPq9T.js";function C(e,t=300){const[i,o]=c.useState(e);return c.useEffect(()=>{const l=setTimeout(()=>o(e),t);return()=>clearTimeout(l)},[e,t]),i}const $=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],F=[{key:"origin_id",label:"Origin",render:e=>s.jsx("span",{className:"font-mono text-xs",title:e.origin_id,children:e.origin_id.length>40?`${e.origin_id.slice(0,40)}…`:e.origin_id})},{key:"workflow_types",label:"Workflows",render:e=>s.jsx("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(t=>s.jsx(N,{type:t},t))})},{key:"task_count",label:"Tasks",render:e=>s.jsx("span",{children:e.task_count}),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?s.jsx("span",{className:"text-status-success",children:e.completed}):s.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?s.jsx("span",{className:"text-status-error",children:e.escalated}):s.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>s.jsx(p,{date:e.started_at}),className:"w-44"},{key:"last_activity",label:"Last Activity",render:e=>s.jsx(p,{date:e.last_activity}),className:"w-44"}];function J(){k();const e=T(),{filters:t,setFilter:i,pagination:o}=y({filters:{workflow_type:"",status:"",search:""}}),l=C(t.search,300),{data:d}=w(),f=[...new Set((d??[]).map(a=>a.workflow_type))].sort(),{data:r,isLoading:u,refetch:g,isFetching:x}=h({workflow_type:t.workflow_type||void 0,status:t.status||void 0,search:l||void 0,limit:o.pageSize,offset:o.offset}),n=(r==null?void 0:r.total)??0;return s.jsxs("div",{children:[s.jsx(P,{title:"All Processes",docsHash:"#docs:dashboard.md:processes-overview"}),s.jsxs(j,{actions:s.jsx(S,{onRefresh:()=>g(),isFetching:x,apiPath:`/tasks/processes?limit=${o.pageSize}&offset=${o.offset}${t.workflow_type?`&workflow_type=${t.workflow_type}`:""}${t.status?`&status=${t.status}`:""}${l?`&search=${l}`:""}`}),children:[s.jsx(v,{label:"Search",value:t.search,onChange:a=>i("search",a),placeholder:"origin, workflow, or trace ID"}),s.jsx(m,{label:"Status",value:t.status,onChange:a=>i("status",a),options:$}),s.jsx(m,{label:"Workflow Type",value:t.workflow_type,onChange:a=>i("workflow_type",a),options:f.map(a=>({value:a,label:a}))})]}),s.jsx(_,{columns:F,data:(r==null?void 0:r.processes)??[],keyFn:a=>a.origin_id,onRowClick:a=>e(`/processes/detail/${encodeURIComponent(a.origin_id)}`),isLoading:u,emptyMessage:"No business processes found"}),s.jsx(b,{page:o.page,totalPages:o.totalPages(n),onPageChange:o.setPage,total:n,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{J as ProcessesListPage};
2
- //# sourceMappingURL=ProcessesListPage-CWiRM_h3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProcessesListPage-CWiRM_h3.js","sources":["../../src/hooks/useDebouncedValue.ts","../../src/pages/processes/ProcessesListPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Returns a debounced copy of `value` that only updates\n * after `delay` ms of inactivity.\n */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return debounced;\n}\n","import { useNavigate } from 'react-router-dom';\nimport { useProcesses, type ProcessSummary } from '../../api/tasks';\nimport { useWorkflowConfigs } from '../../api/workflows';\nimport { useProcessListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'completed', label: 'Completed' },\n { value: 'escalated', label: 'Escalated' },\n];\n\nconst columns: Column<ProcessSummary>[] = [\n {\n key: 'origin_id',\n label: 'Origin',\n render: (row) => (\n <span className=\"font-mono text-xs\" title={row.origin_id}>\n {row.origin_id.length > 40 ? `${row.origin_id.slice(0, 40)}…` : row.origin_id}\n </span>\n ),\n },\n {\n key: 'workflow_types',\n label: 'Workflows',\n render: (row) => (\n <div className=\"flex flex-wrap gap-1\">\n {row.workflow_types.map((wt) => (\n <WorkflowPill key={wt} type={wt} />\n ))}\n </div>\n ),\n },\n {\n key: 'task_count',\n label: 'Tasks',\n render: (row) => <span>{row.task_count}</span>,\n className: 'w-20 text-right',\n },\n {\n key: 'completed',\n label: 'Completed',\n render: (row) =>\n row.completed > 0\n ? <span className=\"text-status-success\">{row.completed}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'escalated',\n label: 'Escalated',\n render: (row) =>\n row.escalated > 0\n ? <span className=\"text-status-error\">{row.escalated}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'started_at',\n label: 'Started',\n render: (row) => <TimestampCell date={row.started_at} />,\n className: 'w-44',\n },\n {\n key: 'last_activity',\n label: 'Last Activity',\n render: (row) => <TimestampCell date={row.last_activity} />,\n className: 'w-44',\n },\n];\n\nexport function ProcessesListPage() {\n useProcessListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { workflow_type: '', status: '', search: '' },\n });\n\n const debouncedSearch = useDebouncedValue(filters.search, 300);\n\n const { data: configs } = useWorkflowConfigs();\n const workflowTypes = [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n\n const { data, isLoading, refetch, isFetching } = useProcesses({\n workflow_type: filters.workflow_type || undefined,\n status: filters.status || undefined,\n search: debouncedSearch || 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=\"All Processes\" docsHash=\"#docs:dashboard.md:processes-overview\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/tasks/processes?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.workflow_type ? `&workflow_type=${filters.workflow_type}` : ''}${filters.status ? `&status=${filters.status}` : ''}${debouncedSearch ? `&search=${debouncedSearch}` : ''}`}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"origin, workflow, or trace ID\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.workflow_type}\n onChange={(v) => setFilter('workflow_type', v)}\n options={workflowTypes.map((t) => ({ value: t, label: t }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.processes ?? []}\n keyFn={(row) => row.origin_id}\n onRowClick={(row) => navigate(`/processes/detail/${encodeURIComponent(row.origin_id)}`)}\n isLoading={isLoading}\n emptyMessage=\"No business processes found\"\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":["useDebouncedValue","value","delay","debounced","setDebounced","useState","useEffect","timer","STATUS_OPTIONS","columns","row","jsx","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","jsxs","FilterBar","ListToolbar","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as t}from"./vendor-query-B2UbickB.js";import{U as r}from"./vendor-icons-Dj2F0Jrb.js";function c({role:e,size:s="sm"}){const n=s==="md"?"py-0.5 text-[11px] gap-1.5":"py-0.5 text-[10px] gap-1",a=s==="md"?"w-3 h-3":"w-2.5 h-2.5";return t.jsxs("span",{className:`inline-flex items-center ${n} text-text-secondary`,children:[t.jsx(r,{className:`${a} shrink-0 text-accent/75`}),e]})}export{c as R};
2
- //# sourceMappingURL=RolePill-DQTT1s9v.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RolePill-DQTT1s9v.js","sources":["../../src/components/common/display/RolePill.tsx"],"sourcesContent":["import { User } from 'lucide-react';\n\ninterface RolePillProps {\n role: string;\n size?: 'sm' | 'md';\n}\n\nexport function RolePill({ role, size = 'sm' }: RolePillProps) {\n const sizeClass = size === 'md'\n ? 'py-0.5 text-[11px] gap-1.5'\n : 'py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} text-text-secondary`}>\n <User className={`${iconClass} shrink-0 text-accent/75`} />\n {role}\n </span>\n );\n}\n"],"names":["RolePill","role","size","sizeClass","iconClass","jsxs","jsx","User"],"mappings":"8FAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,6BACA,2BACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,uBACpD,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAK,UAAW,GAAGH,CAAS,2BAA4B,EACxDH,CAAA,EACH,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{j as o}from"./vendor-query-B2UbickB.js";function c({icon:t,title:e,onClick:i,colorClass:n="text-text-tertiary hover:text-accent",alwaysVisible:r}){return o.jsx("button",{onClick:a=>{a.stopPropagation(),i(a)},className:`transition-opacity ${r?"opacity-100":"opacity-0 group-hover/row:opacity-100"} ${n}`,title:e,children:o.jsx(t,{className:"w-[18px] h-[18px]",strokeWidth:1.5})})}function p({children:t}){return o.jsx("span",{className:"flex items-center justify-end gap-2.5",children:t})}export{p as R,c as a};
2
- //# sourceMappingURL=RowActions-Dg-Fsm5O.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RowActions-Dg-Fsm5O.js","sources":["../../src/components/common/layout/RowActions.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/**\n * Ephemeral icon button that appears on row hover.\n * Uses `group-hover/row:opacity-100` to show on hover — rows must have `group/row`.\n */\nexport function RowAction({\n icon: Icon,\n title,\n onClick,\n colorClass = 'text-text-tertiary hover:text-accent',\n alwaysVisible,\n}: {\n icon: LucideIcon;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n colorClass?: string;\n alwaysVisible?: boolean;\n}) {\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n className={`transition-opacity ${\n alwaysVisible ? 'opacity-100' : 'opacity-0 group-hover/row:opacity-100'\n } ${colorClass}`}\n title={title}\n >\n <Icon className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n );\n}\n\n/**\n * Container for one or more RowAction icons in the last table column.\n */\nexport function RowActionGroup({ children }: { children: ReactNode }) {\n return (\n <span className=\"flex items-center justify-end gap-2.5\">\n {children}\n </span>\n );\n}\n"],"names":["RowAction","Icon","title","onClick","colorClass","alwaysVisible","jsx","e","RowActionGroup","children"],"mappings":"+CAOO,SAASA,EAAU,CACxB,KAAMC,EACN,MAAAC,EACA,QAAAC,EACA,WAAAC,EAAa,uCACb,cAAAC,CACF,EAMG,CACD,OACEC,EAAAA,IAAC,SAAA,CACC,QAAUC,GAAM,CACdA,EAAE,gBAAA,EACFJ,EAAQI,CAAC,CACX,EACA,UAAW,sBACTF,EAAgB,cAAgB,uCAClC,IAAID,CAAU,GACd,MAAAF,EAEA,SAAAI,EAAAA,IAACL,EAAA,CAAK,UAAU,oBAAoB,YAAa,GAAA,CAAK,CAAA,CAAA,CAG5D,CAKO,SAASO,EAAe,CAAE,SAAAC,GAAqC,CACpE,OACEH,EAAAA,IAAC,OAAA,CAAK,UAAU,wCACb,SAAAG,CAAA,CACH,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-DPJW96d2.js";import{u}from"./vendor-icons-Dj2F0Jrb.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-BF0tM0cd.js.map
@@ -1,2 +0,0 @@
1
- import{a as u,j as s}from"./vendor-query-B2UbickB.js";import{T as h}from"./TimestampCell-Dsje8GH-.js";import{E as R}from"./ElapsedCell-BNexhR5d.js";import{u as W,d as z,b as E}from"./workflows-C7Cam2Ok.js";import{j as A}from"./index-DPJW96d2.js";import{u as L}from"./useNamespace-CsepDyR5.js";import{b as M}from"./useEventHooks-CjygrbYy.js";import{u as I}from"./useFilterParams-x-Dg0Vgz.js";import{D as U}from"./DataTable-D9yuBv0w.js";import{W as O}from"./WorkflowPill-F1oKUzmc.js";import{P as B}from"./PageHeader-Bnt2iQQa.js";import{F as H,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as G}from"./StickyPagination-BWhFSr2d.js";import{L as J}from"./ListToolbar-BH9rwQVE.js";import{R as V,a as w}from"./RowActions-Dg-Fsm5O.js";import{u as q,y as K}from"./vendor-icons-Dj2F0Jrb.js";import{c as Q}from"./vendor-react-CXumBFUA.js";import"./controlplane-DGhv3rwI.js";import"./EmptyState-BcsfPq9T.js";const X={running:"in_progress",completed:"completed",failed:"failed"},Y={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},Z={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function ee(d,n,p,m,a){return[{key:"workflow_id",label:"Workflow ID / Type",render:e=>{const o=Y[X[e.status]??e.status]??"bg-status-pending",r=e.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 ${o}${r}`,title:e.status}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:e.workflow_id}),s.jsx("div",{className:"mt-0.5",children:s.jsx(O,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"})})]})]})}},{key:"created_at",label:"Created",render:e=>s.jsx(h,{date:e.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:e=>s.jsx(h,{date:e.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:e=>s.jsx(R,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>s.jsxs(V,{children:[s.jsx(w,{icon:q,title:`Filter by ${e.entity}`,onClick:()=>d(e.entity)}),s.jsx("button",{onClick:o=>{o.stopPropagation(),n(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${Z[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})}),p&&s.jsx(w,{icon:K,title:"View config",onClick:()=>m(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function we({tier:d="all"}){M();const n=Q(),{isSuperAdmin:p}=A(),{namespace:m}=L(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:v}=I({filters:{search:"",entity:"",status:"",tier:d}}),l=a.tier||"all",k=l==="certified"?"true":l==="durable"?"false":void 0,{data:g}=W(),{data:x}=z(),j=u.useMemo(()=>{const t=new Map;for(const y of x??[])t.set(y.workflow_type,y.tier??"durable");return t},[x]),S=ee(t=>e("entity",t),t=>e("status",t),p,n,j),[c,C]=u.useState(a.search);u.useEffect(()=>{if(c===a.search)return;const t=setTimeout(()=>e("search",c),300);return()=>clearTimeout(t)},[c,e,a.search]);const{data:i,isLoading:_,refetch:$,isFetching:N}=E({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:k,namespace:m||void 0}),b=(i==null?void 0:i.total)??0,T=(i==null?void 0:i.jobs)??[],P=u.useMemo(()=>[...new Set((g??[]).map(t=>t.workflow_type))].sort(),[g]),F="Workflow Executions",D=l==="certified"?"No certified workflow executions found":l==="durable"?"No durable workflow executions found":"No workflow executions found";return s.jsxs("div",{children:[s.jsx(B,{title:F,docsHash:"#docs:dashboard.md:durable-executions"}),s.jsxs(H,{actions:s.jsx(J,{onRefresh:()=>$(),isFetching:N,apiPath:`/workflow-states/jobs?limit=${o.pageSize}&offset=${o.offset}${a.entity?`&entity=${a.entity}`:""}${a.search?`&search=${a.search}`:""}${a.status?`&status=${a.status}`:""}${r.sort_by?`&sort_by=${r.sort_by}&order=${r.order}`:""}`}),children:[s.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:c,onChange:t=>C(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(f,{label:"Type",value:a.entity,onChange:t=>e("entity",t),options:P.map(t=>({value:t,label:t}))}),s.jsx(f,{label:"Status",value:a.status,onChange:t=>e("status",t),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]}),s.jsx(f,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:t=>e("tier",t||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),s.jsx(U,{columns:S,data:T,keyFn:t=>t.workflow_id,onRowClick:t=>n(`/workflows/executions/${t.workflow_id}`),isLoading:_,emptyMessage:D,sort:r,onSort:v}),s.jsx(G,{page:o.page,totalPages:o.totalPages(b),onPageChange:o.setPage,total:b,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{we as WorkflowsDashboard};
2
- //# sourceMappingURL=WorkflowsDashboard-M13lIaw7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowsDashboard-M13lIaw7.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\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, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: 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 isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[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 <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\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 {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n const { namespace } = useNamespace();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\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: jobsData, isLoading, refetch, isFetching } = useJobs({\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 registered: registeredFilter,\n namespace: namespace || undefined,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Workflow Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:durable-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/jobs?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.search ? `&search=${filters.search}` : ''}${filters.status ? `&status=${filters.status}` : ''}${sort.sort_by ? `&sort_by=${sort.sort_by}&order=${sort.order}` : ''}`}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow 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=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\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 <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\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":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","namespace","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as a}from"./vendor-query-B2UbickB.js";import{F as x,b as l,a as p}from"./FilterBar-Ck4K4rzu.js";import{P as m}from"./PriorityBadge-DfQY9St9.js";import{R as u}from"./RolePill-DQTT1s9v.js";import{W as d}from"./WorkflowPill-F1oKUzmc.js";import{T as h}from"./TimestampCell-Dsje8GH-.js";import{C as y,i as v,a as j}from"./escalation-ne7dIaPa.js";import{a6 as b,a7 as k,a8 as f,a9 as r}from"./vendor-icons-Dj2F0Jrb.js";import{L as N}from"./vendor-react-CXumBFUA.js";function C({row:e}){if(v(e)){const t=e.status==="resolved"?"text-status-success":"text-text-tertiary";return a.jsx(f,{className:`w-3 h-3 shrink-0 ${t}`})}return e.status==="resolved"?a.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):e.status==="cancelled"?a.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):j(e)?a.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):a.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}const A=[{key:"description",label:"Summary",render:e=>a.jsxs("div",{className:"flex items-start gap-2 overflow-hidden",children:[a.jsx("span",{className:"mt-1 shrink-0",children:a.jsx(C,{row:e})}),a.jsxs("div",{className:"min-w-0 overflow-hidden",children:[a.jsx("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type}),a.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[a.jsx(d,{type:e.type}),e.subtype&&e.subtype!==e.type&&a.jsx("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype})]})]})]}),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?a.jsxs(N,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:t=>t.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",a.jsx(b,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"})]}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>a.jsx(u,{role:e.role}),className:"w-28"},{key:"priority",label:"Priority",render:e=>a.jsx(m,{priority:e.priority}),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>a.jsx(h,{date:e.created_at}),className:"w-40",sortable:!0}],B={key:"expires",label:a.jsx(k,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:e=>e.assigned_until?a.jsx(y,{until:e.assigned_until}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-16 whitespace-nowrap"},g=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],w=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"},{value:"cancelled",label:"Cancelled"}];function M({filters:e,setFilter:t,roles:i,types:n,showStatus:o=!1,actions:c}){return a.jsxs(x,{actions:c,children:[o&&a.jsx(l,{label:"Status",value:e.status??"",onChange:s=>t("status",s),options:w}),a.jsx(l,{label:"Role",value:e.role,onChange:s=>t("role",s),options:i.map(s=>({value:s,label:s}))}),a.jsx(l,{label:"Type",value:e.type,onChange:s=>t("type",s),options:n.map(s=>({value:s,label:s}))}),a.jsx(l,{label:"Priority",value:e.priority,onChange:s=>t("priority",s),options:g}),a.jsx(p,{label:"Search",value:e.search??"",onChange:s=>t("search",s),placeholder:"ID, workflow, origin…"})]})}export{A as E,B as T,M as a};
2
- //# sourceMappingURL=escalation-columns-DqTkKbCv.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"escalation-columns-DqTkKbCv.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { ExternalLink, Circle, Bell, Clock } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-start gap-2 overflow-hidden\">\n <span className=\"mt-1 shrink-0\"><StatusDot row={row} /></span>\n <div className=\"min-w-0 overflow-hidden\">\n <p className=\"text-xs text-text-primary truncate\">{row.description || row.type}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <WorkflowPill type={row.type} />\n {row.subtype && row.subtype !== row.type && (\n <span className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{row.subtype}</span>\n )}\n </div>\n </div>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'task_id',\n label: 'Task',\n render: (row) =>\n row.task_id ? (\n <Link\n to={`/workflows/tasks/detail/${row.task_id}`}\n onClick={(e) => e.stopPropagation()}\n className=\"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors\"\n >\n {row.task_id.slice(0, 12)}…\n <ExternalLink size={10} className=\"opacity-0 group-hover/task:opacity-100 transition-opacity\" />\n </Link>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n sortable: true,\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-16 whitespace-nowrap',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. */\nexport const STATUS_OPTIONS = [\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n { value: 'cancelled', label: 'Cancelled' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n actions,\n}: {\n filters: { role: string; type: string; priority: string; status?: string; search?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <FilterBar actions={actions}>\n {showStatus && (\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n <FilterInput\n label=\"Search\"\n value={filters.search ?? ''}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"ID, workflow, origin…\"\n />\n </FilterBar>\n );\n}\n"],"names":["StatusDot","row","isAckEscalation","color","jsx","Bell","Circle","isEffectivelyClaimed","ESCALATION_COLUMNS","jsxs","WorkflowPill","Link","e","ExternalLink","RolePill","PriorityBadge","TimestampCell","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","actions","FilterBar","FilterSelect","v","r","t","FilterInput"],"mappings":"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"}