@hotmeshio/long-tail 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +44 -4
  2. package/build/api/auth.d.ts +5 -0
  3. package/build/api/auth.js +42 -0
  4. package/build/api/bot-accounts.d.ts +50 -0
  5. package/build/api/bot-accounts.js +215 -0
  6. package/build/api/controlplane.d.ts +20 -0
  7. package/build/api/controlplane.js +110 -0
  8. package/build/api/dba.d.ts +15 -0
  9. package/build/api/dba.js +68 -0
  10. package/build/api/escalations.d.ts +70 -0
  11. package/build/api/escalations.js +656 -0
  12. package/build/api/exports.d.ts +32 -0
  13. package/build/api/exports.js +146 -0
  14. package/build/api/index.d.ts +18 -0
  15. package/build/api/index.js +54 -0
  16. package/build/api/insight.d.ts +29 -0
  17. package/build/api/insight.js +90 -0
  18. package/build/api/maintenance.d.ts +7 -0
  19. package/build/api/maintenance.js +28 -0
  20. package/build/api/mcp-runs.d.ts +16 -0
  21. package/build/api/mcp-runs.js +62 -0
  22. package/build/api/mcp.d.ts +52 -0
  23. package/build/api/mcp.js +212 -0
  24. package/build/api/namespaces.d.ts +7 -0
  25. package/build/{routes/escalations/helpers.js → api/namespaces.js} +24 -12
  26. package/build/api/roles.d.ts +25 -0
  27. package/build/api/roles.js +159 -0
  28. package/build/api/settings.d.ts +2 -0
  29. package/build/api/settings.js +35 -0
  30. package/build/api/tasks.d.ts +27 -0
  31. package/build/api/tasks.js +96 -0
  32. package/build/api/users.d.ts +44 -0
  33. package/build/api/users.js +162 -0
  34. package/build/api/workflow-sets.d.ts +26 -0
  35. package/build/api/workflow-sets.js +119 -0
  36. package/build/api/workflows.d.ts +48 -0
  37. package/build/api/workflows.js +298 -0
  38. package/build/api/yaml-workflows.d.ts +87 -0
  39. package/build/api/yaml-workflows.js +556 -0
  40. package/build/index.d.ts +4 -0
  41. package/build/index.js +6 -1
  42. package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
  43. package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
  44. package/build/lib/db/schemas/011_system_workflow_configs.sql +7 -0
  45. package/build/lib/events/callback.d.ts +41 -0
  46. package/build/lib/events/callback.js +98 -0
  47. package/build/modules/config.js +1 -1
  48. package/build/routes/auth.js +37 -36
  49. package/build/routes/bot-accounts.js +34 -164
  50. package/build/routes/controlplane.js +20 -60
  51. package/build/routes/dba.js +18 -28
  52. package/build/routes/escalations/bulk.js +17 -192
  53. package/build/routes/escalations/list.js +29 -75
  54. package/build/routes/escalations/resolve.js +3 -193
  55. package/build/routes/escalations/single.js +13 -122
  56. package/build/routes/exports.js +44 -95
  57. package/build/routes/index.js +2 -0
  58. package/build/routes/insight.js +46 -88
  59. package/build/routes/maintenance.js +41 -17
  60. package/build/routes/mcp-runs.js +52 -60
  61. package/build/routes/mcp.js +49 -177
  62. package/build/routes/namespaces.js +9 -20
  63. package/build/routes/roles.js +23 -97
  64. package/build/routes/settings.js +37 -25
  65. package/build/routes/tasks.js +28 -64
  66. package/build/routes/users.js +24 -113
  67. package/build/routes/workflow-sets.d.ts +2 -0
  68. package/build/routes/workflow-sets.js +98 -0
  69. package/build/routes/workflows/config.js +23 -57
  70. package/build/routes/workflows/discovery.js +11 -85
  71. package/build/routes/workflows/invocation.js +16 -84
  72. package/build/routes/yaml-workflows/cron.js +12 -61
  73. package/build/routes/yaml-workflows/crud.js +30 -223
  74. package/build/routes/yaml-workflows/deployment.js +15 -115
  75. package/build/routes/yaml-workflows/versions.js +20 -58
  76. package/build/sdk/index.d.ts +327 -0
  77. package/build/sdk/index.js +298 -0
  78. package/build/services/controlplane/index.d.ts +1 -2
  79. package/build/services/controlplane/index.js +3 -3
  80. package/build/services/controlplane/sql.d.ts +2 -2
  81. package/build/services/controlplane/sql.js +4 -5
  82. package/build/services/controlplane/types.d.ts +1 -0
  83. package/build/services/export/index.js +6 -1
  84. package/build/services/hotmesh-utils.js +2 -4
  85. package/build/services/insight/index.d.ts +7 -0
  86. package/build/services/insight/index.js +30 -0
  87. package/build/services/mcp/client/tools.js +13 -1
  88. package/build/services/mcp-runs/sql.js +1 -1
  89. package/build/services/workflow-sets/db.d.ts +16 -0
  90. package/build/services/workflow-sets/db.js +78 -0
  91. package/build/services/workflow-sets/index.d.ts +1 -0
  92. package/build/services/workflow-sets/index.js +11 -0
  93. package/build/services/workflow-sets/sql.d.ts +6 -0
  94. package/build/services/workflow-sets/sql.js +24 -0
  95. package/build/services/yaml-workflow/db-utils.d.ts +1 -0
  96. package/build/services/yaml-workflow/db-utils.js +4 -0
  97. package/build/services/yaml-workflow/db.d.ts +5 -0
  98. package/build/services/yaml-workflow/db.js +17 -0
  99. package/build/services/yaml-workflow/pipeline/build/wiring.js +14 -1
  100. package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
  101. package/build/services/yaml-workflow/pipeline/prompts.js +1 -1
  102. package/build/services/yaml-workflow/sql.d.ts +2 -1
  103. package/build/services/yaml-workflow/sql.js +8 -3
  104. package/build/services/yaml-workflow/types.d.ts +3 -0
  105. package/build/services/yaml-workflow/workers/callbacks.js +7 -1
  106. package/build/services/yaml-workflow/workers/register.js +7 -0
  107. package/build/start/adapters.js +4 -0
  108. package/build/system/index.js +6 -0
  109. package/build/system/mcp-servers/knowledge.js +1 -1
  110. package/build/system/seed/server-definitions.js +2 -1
  111. package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +1 -1
  112. package/build/system/workflows/mcp-workflow-builder/activities/index.js +2 -1
  113. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +6 -0
  114. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +26 -0
  115. package/build/system/workflows/mcp-workflow-builder/index.js +26 -2
  116. package/build/system/workflows/mcp-workflow-builder/prompts.js +104 -35
  117. package/build/system/workflows/mcp-workflow-planner/activities/analyze.d.ts +11 -0
  118. package/build/system/workflows/mcp-workflow-planner/activities/analyze.js +36 -0
  119. package/build/system/workflows/mcp-workflow-planner/activities/index.d.ts +3 -0
  120. package/build/system/workflows/mcp-workflow-planner/activities/index.js +12 -0
  121. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +19 -0
  122. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +55 -0
  123. package/build/system/workflows/mcp-workflow-planner/activities/plan.d.ts +10 -0
  124. package/build/system/workflows/mcp-workflow-planner/activities/plan.js +43 -0
  125. package/build/system/workflows/mcp-workflow-planner/index.d.ts +7 -0
  126. package/build/system/workflows/mcp-workflow-planner/index.js +152 -0
  127. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +7 -0
  128. package/build/system/workflows/mcp-workflow-planner/prompts.js +77 -0
  129. package/build/tsconfig.tsbuildinfo +1 -1
  130. package/build/types/index.d.ts +1 -0
  131. package/build/types/sdk.d.ts +27 -0
  132. package/build/types/sdk.js +2 -0
  133. package/build/types/workflow-set.d.ts +44 -0
  134. package/build/types/workflow-set.js +5 -0
  135. package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js → AdminDashboard-DRjkRSjJ.js} +2 -2
  136. package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js.map → AdminDashboard-DRjkRSjJ.js.map} +1 -1
  137. package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js → AvailableEscalationsPage-CnivX4Tz.js} +2 -2
  138. package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js.map → AvailableEscalationsPage-CnivX4Tz.js.map} +1 -1
  139. package/dashboard/dist/assets/BotPicker-DwwaBhTH.js +2 -0
  140. package/dashboard/dist/assets/{BotPicker-A6LtzyuO.js.map → BotPicker-DwwaBhTH.js.map} +1 -1
  141. package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js → CollapsibleSection-DQpaVA0M.js} +2 -2
  142. package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js.map → CollapsibleSection-DQpaVA0M.js.map} +1 -1
  143. package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js → ConfirmDeleteModal-B7JoDNvt.js} +2 -2
  144. package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js.map → ConfirmDeleteModal-B7JoDNvt.js.map} +1 -1
  145. package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js → CopyableId-AqoZayBG.js} +2 -2
  146. package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js.map → CopyableId-AqoZayBG.js.map} +1 -1
  147. package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js → CredentialsPage-qGw1kQzi.js} +2 -2
  148. package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js.map → CredentialsPage-qGw1kQzi.js.map} +1 -1
  149. package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js → CustomDurationPicker-D1HUQcd0.js} +2 -2
  150. package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js.map → CustomDurationPicker-D1HUQcd0.js.map} +1 -1
  151. package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js → DataTable-DKvSKoVG.js} +2 -2
  152. package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js.map → DataTable-DKvSKoVG.js.map} +1 -1
  153. package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js → ElapsedCell-B0yrReGQ.js} +2 -2
  154. package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js.map → ElapsedCell-B0yrReGQ.js.map} +1 -1
  155. package/dashboard/dist/assets/{EmptyState-BBn78pmm.js → EmptyState-X0fIzYID.js} +2 -2
  156. package/dashboard/dist/assets/{EmptyState-BBn78pmm.js.map → EmptyState-X0fIzYID.js.map} +1 -1
  157. package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js → EscalationsOverview-BQAT9W7r.js} +2 -2
  158. package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js.map → EscalationsOverview-BQAT9W7r.js.map} +1 -1
  159. package/dashboard/dist/assets/{EventTable-C1en_KZ0.js → EventTable-CX1KNLhZ.js} +2 -2
  160. package/dashboard/dist/assets/{EventTable-C1en_KZ0.js.map → EventTable-CX1KNLhZ.js.map} +1 -1
  161. package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js → FilterBar-DMTvuQy-.js} +2 -2
  162. package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js.map → FilterBar-DMTvuQy-.js.map} +1 -1
  163. package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js → ListToolbar-DTOSxoEy.js} +2 -2
  164. package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js.map → ListToolbar-DTOSxoEy.js.map} +1 -1
  165. package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js → McpOverview-BaKTIWrG.js} +2 -2
  166. package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js.map → McpOverview-BaKTIWrG.js.map} +1 -1
  167. package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js +5 -0
  168. package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js.map +1 -0
  169. package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js +2 -0
  170. package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js.map +1 -0
  171. package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js → McpRunDetailPage-CKs1RWeV.js} +2 -2
  172. package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js.map → McpRunDetailPage-CKs1RWeV.js.map} +1 -1
  173. package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js → McpRunsPage-CcPD_tY1.js} +2 -2
  174. package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js.map → McpRunsPage-CcPD_tY1.js.map} +1 -1
  175. package/dashboard/dist/assets/{Modal-kB_P7ZOr.js → Modal-_2AbWxJT.js} +2 -2
  176. package/dashboard/dist/assets/{Modal-kB_P7ZOr.js.map → Modal-_2AbWxJT.js.map} +1 -1
  177. package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js +2 -0
  178. package/dashboard/dist/assets/{OperatorDashboard-jc0vrgDI.js.map → OperatorDashboard-BGiRaRDr.js.map} +1 -1
  179. package/dashboard/dist/assets/{PageHeader-NkOeBR05.js → PageHeader-DVr5Qyzm.js} +2 -2
  180. package/dashboard/dist/assets/{PageHeader-NkOeBR05.js.map → PageHeader-DVr5Qyzm.js.map} +1 -1
  181. package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js → PageHeaderWithStats-D0KRASML.js} +2 -2
  182. package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js.map → PageHeaderWithStats-D0KRASML.js.map} +1 -1
  183. package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js → PriorityBadge-Bx2559OU.js} +2 -2
  184. package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js.map → PriorityBadge-Bx2559OU.js.map} +1 -1
  185. package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js → ProcessDetailPage-69I--sry.js} +2 -2
  186. package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js.map → ProcessDetailPage-69I--sry.js.map} +1 -1
  187. package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js → ProcessesListPage-BDpUbua2.js} +2 -2
  188. package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js.map → ProcessesListPage-BDpUbua2.js.map} +1 -1
  189. package/dashboard/dist/assets/{RolePill-C1dgC-fK.js → RolePill-CcAqEaSt.js} +2 -2
  190. package/dashboard/dist/assets/{RolePill-C1dgC-fK.js.map → RolePill-CcAqEaSt.js.map} +1 -1
  191. package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js → RolesPage-Cl23Hjet.js} +2 -2
  192. package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js.map → RolesPage-Cl23Hjet.js.map} +1 -1
  193. package/dashboard/dist/assets/{RowActions-lYaHGI-v.js → RowActions-B4mqIt3Z.js} +2 -2
  194. package/dashboard/dist/assets/{RowActions-lYaHGI-v.js.map → RowActions-B4mqIt3Z.js.map} +1 -1
  195. package/dashboard/dist/assets/{StatCard-v2TiITVr.js → StatCard-Cz_2OjAZ.js} +2 -2
  196. package/dashboard/dist/assets/{StatCard-v2TiITVr.js.map → StatCard-Cz_2OjAZ.js.map} +1 -1
  197. package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js → StatusBadge-Wi2FJZsn.js} +2 -2
  198. package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js.map → StatusBadge-Wi2FJZsn.js.map} +1 -1
  199. package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js → StepIndicator-PW5NRDMb.js} +2 -2
  200. package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js.map → StepIndicator-PW5NRDMb.js.map} +1 -1
  201. package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js → StickyPagination-Bl2Uzz65.js} +2 -2
  202. package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js.map → StickyPagination-Bl2Uzz65.js.map} +1 -1
  203. package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js → SwimlaneTimeline-CUPqMd0z.js} +2 -2
  204. package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js.map → SwimlaneTimeline-CUPqMd0z.js.map} +1 -1
  205. package/dashboard/dist/assets/{TagInput-CH8qMGhC.js → TagInput-BLtf86Ly.js} +2 -2
  206. package/dashboard/dist/assets/{TagInput-CH8qMGhC.js.map → TagInput-BLtf86Ly.js.map} +1 -1
  207. package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js → TaskDetailPage-BXJFX74D.js} +2 -2
  208. package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js.map → TaskDetailPage-BXJFX74D.js.map} +1 -1
  209. package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js → TaskQueuePill-CWYj3xKe.js} +2 -2
  210. package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js.map → TaskQueuePill-CWYj3xKe.js.map} +1 -1
  211. package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js → TasksListPage-C3cX94Mw.js} +2 -2
  212. package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js.map → TasksListPage-C3cX94Mw.js.map} +1 -1
  213. package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js → TimeAgo-B_5yDDHV.js} +2 -2
  214. package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js.map → TimeAgo-B_5yDDHV.js.map} +1 -1
  215. package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js → TimestampCell-DRX724uU.js} +2 -2
  216. package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js.map → TimestampCell-DRX724uU.js.map} +1 -1
  217. package/dashboard/dist/assets/{UserName-BUFYCnRa.js → UserName-Ca8FA469.js} +2 -2
  218. package/dashboard/dist/assets/{UserName-BUFYCnRa.js.map → UserName-Ca8FA469.js.map} +1 -1
  219. package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js → WorkflowExecutionPage-BBYWEV2P.js} +2 -2
  220. package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js.map → WorkflowExecutionPage-BBYWEV2P.js.map} +1 -1
  221. package/dashboard/dist/assets/WorkflowPill-BXifAuLi.js +2 -0
  222. package/dashboard/dist/assets/{WorkflowPill-DPKOcbf4.js.map → WorkflowPill-BXifAuLi.js.map} +1 -1
  223. package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js → WorkflowsDashboard-Drl3juz9.js} +2 -2
  224. package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js.map → WorkflowsDashboard-Drl3juz9.js.map} +1 -1
  225. package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js → WorkflowsOverview-03IRrDLg.js} +2 -2
  226. package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js.map → WorkflowsOverview-03IRrDLg.js.map} +1 -1
  227. package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js +2 -0
  228. package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js.map +1 -0
  229. package/dashboard/dist/assets/{bots-Bi2_O1Ts.js → bots-DZEXcgiJ.js} +2 -2
  230. package/dashboard/dist/assets/{bots-Bi2_O1Ts.js.map → bots-DZEXcgiJ.js.map} +1 -1
  231. package/dashboard/dist/assets/{escalation-Ck1KlLkT.js → escalation-Cw48lNaF.js} +2 -2
  232. package/dashboard/dist/assets/{escalation-Ck1KlLkT.js.map → escalation-Cw48lNaF.js.map} +1 -1
  233. package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js → escalation-columns-NINpo3qf.js} +2 -2
  234. package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js.map → escalation-columns-NINpo3qf.js.map} +1 -1
  235. package/dashboard/dist/assets/helpers-Cuu3xKfr.js +2 -0
  236. package/dashboard/dist/assets/helpers-Cuu3xKfr.js.map +1 -0
  237. package/dashboard/dist/assets/{helpers-BoD2SgUY.js → helpers-fk_qr729.js} +2 -2
  238. package/dashboard/dist/assets/{helpers-BoD2SgUY.js.map → helpers-fk_qr729.js.map} +1 -1
  239. package/dashboard/dist/assets/index-B98ipWxE.js +2 -0
  240. package/dashboard/dist/assets/{index-D7zYZOnH.js.map → index-B98ipWxE.js.map} +1 -1
  241. package/dashboard/dist/assets/{index-BEtLIsML.js → index-BIG3KooI.js} +2 -2
  242. package/dashboard/dist/assets/{index-BEtLIsML.js.map → index-BIG3KooI.js.map} +1 -1
  243. package/dashboard/dist/assets/{index-DYyLF-Qb.js → index-BwN3KP_L.js} +5 -5
  244. package/dashboard/dist/assets/{index-DYyLF-Qb.js.map → index-BwN3KP_L.js.map} +1 -1
  245. package/dashboard/dist/assets/index-Bxe8h1x4.js +17 -0
  246. package/dashboard/dist/assets/{index-DOkHXmyf.js.map → index-Bxe8h1x4.js.map} +1 -1
  247. package/dashboard/dist/assets/{index-FuohTtaM.js → index-CNI7k7oB.js} +3 -3
  248. package/dashboard/dist/assets/{index-FuohTtaM.js.map → index-CNI7k7oB.js.map} +1 -1
  249. package/dashboard/dist/assets/{index-CZrJ09p-.js → index-CORHB0WC.js} +2 -2
  250. package/dashboard/dist/assets/{index-CZrJ09p-.js.map → index-CORHB0WC.js.map} +1 -1
  251. package/dashboard/dist/assets/{index-PyCTS05D.css → index-DcIKW-cZ.css} +1 -1
  252. package/dashboard/dist/assets/{index-D3NyVADW.js → index-Dj-z-x8M.js} +2 -2
  253. package/dashboard/dist/assets/index-Dj-z-x8M.js.map +1 -0
  254. package/dashboard/dist/assets/{index-Bn2xHDr8.js → index-DwRytW9O.js} +3 -3
  255. package/dashboard/dist/assets/{index-Bn2xHDr8.js.map → index-DwRytW9O.js.map} +1 -1
  256. package/dashboard/dist/assets/index-aRvL-dXp.js +2 -0
  257. package/dashboard/dist/assets/{index-Dk2Q51o0.js.map → index-aRvL-dXp.js.map} +1 -1
  258. package/dashboard/dist/assets/index-b03HlbnH.js +2 -0
  259. package/dashboard/dist/assets/{index-BpT-6WgJ.js.map → index-b03HlbnH.js.map} +1 -1
  260. package/dashboard/dist/assets/{mcp-CJtYjA7A.js → mcp-BZoFryNc.js} +2 -2
  261. package/dashboard/dist/assets/{mcp-CJtYjA7A.js.map → mcp-BZoFryNc.js.map} +1 -1
  262. package/dashboard/dist/assets/mcp-query-wiw1kwm8.js +2 -0
  263. package/dashboard/dist/assets/mcp-query-wiw1kwm8.js.map +1 -0
  264. package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js → mcp-runs-BaEKnf5v.js} +2 -2
  265. package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js.map → mcp-runs-BaEKnf5v.js.map} +1 -1
  266. package/dashboard/dist/assets/{namespaces-BM5P2qmL.js → namespaces-BwnZI4_A.js} +2 -2
  267. package/dashboard/dist/assets/{namespaces-BM5P2qmL.js.map → namespaces-BwnZI4_A.js.map} +1 -1
  268. package/dashboard/dist/assets/{roles-lv0shpjJ.js → roles-Bgn1K8zU.js} +2 -2
  269. package/dashboard/dist/assets/{roles-lv0shpjJ.js.map → roles-Bgn1K8zU.js.map} +1 -1
  270. package/dashboard/dist/assets/{settings-Wlq92mRo.js → settings-CizYiutL.js} +2 -2
  271. package/dashboard/dist/assets/{settings-Wlq92mRo.js.map → settings-CizYiutL.js.map} +1 -1
  272. package/dashboard/dist/assets/{tasks-BFGm4PuE.js → tasks-Bmte_hc4.js} +2 -2
  273. package/dashboard/dist/assets/{tasks-BFGm4PuE.js.map → tasks-Bmte_hc4.js.map} +1 -1
  274. package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js → useEventHooks-CUCxpiI2.js} +2 -2
  275. package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js.map → useEventHooks-CUCxpiI2.js.map} +1 -1
  276. package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js → useYamlActivityEvents-Cum02Ej9.js} +2 -2
  277. package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js.map → useYamlActivityEvents-Cum02Ej9.js.map} +1 -1
  278. package/dashboard/dist/assets/{users-tA5-K0wA.js → users-NSDgTt-z.js} +2 -2
  279. package/dashboard/dist/assets/{users-tA5-K0wA.js.map → users-NSDgTt-z.js.map} +1 -1
  280. package/dashboard/dist/assets/{vendor-icons-BiIug1SK.js → vendor-icons-D1DdudfH.js} +93 -73
  281. package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
  282. package/dashboard/dist/assets/{workflows-CfLc15Wr.js → workflows-k0XRdGXx.js} +2 -2
  283. package/dashboard/dist/assets/{workflows-CfLc15Wr.js.map → workflows-k0XRdGXx.js.map} +1 -1
  284. package/dashboard/dist/assets/yaml-workflows-DAre8I78.js +2 -0
  285. package/dashboard/dist/assets/yaml-workflows-DAre8I78.js.map +1 -0
  286. package/dashboard/dist/index.html +3 -3
  287. package/docs/epic-integration.md +224 -0
  288. package/docs/events.md +28 -0
  289. package/docs/sdk.md +177 -0
  290. package/docs/story.md +157 -0
  291. package/docs/workflow-builder.md +371 -0
  292. package/package.json +3 -2
  293. package/build/routes/escalations/helpers.d.ts +0 -5
  294. package/build/routes/resolve.d.ts +0 -9
  295. package/build/routes/resolve.js +0 -19
  296. package/build/routes/yaml-workflows/helpers.d.ts +0 -2
  297. package/build/routes/yaml-workflows/helpers.js +0 -8
  298. package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +0 -2
  299. package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +0 -5
  300. package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +0 -1
  301. package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +0 -2
  302. package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +0 -1
  303. package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +0 -2
  304. package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +0 -2
  305. package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +0 -1
  306. package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js +0 -2
  307. package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +0 -2
  308. package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +0 -1
  309. package/dashboard/dist/assets/index-BpT-6WgJ.js +0 -2
  310. package/dashboard/dist/assets/index-D3NyVADW.js.map +0 -1
  311. package/dashboard/dist/assets/index-D7zYZOnH.js +0 -2
  312. package/dashboard/dist/assets/index-DOkHXmyf.js +0 -17
  313. package/dashboard/dist/assets/index-Dk2Q51o0.js +0 -2
  314. package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +0 -2
  315. package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +0 -1
  316. package/dashboard/dist/assets/vendor-icons-BiIug1SK.js.map +0 -1
  317. package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +0 -2
  318. package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js.map +0 -1
  319. package/docs/img/01-login.png +0 -0
  320. package/docs/img/02-dashboard-home.png +0 -0
  321. package/docs/img/03-processes-list.png +0 -0
  322. package/docs/img/04-escalations-list.png +0 -0
  323. package/docs/img/05-mcp-servers.png +0 -0
  324. package/docs/img/06-mcp-pipelines.png +0 -0
  325. package/docs/img/07-workflows-list.png +0 -0
  326. package/docs/img/compilation/01-query-submit.png +0 -0
  327. package/docs/img/compilation/02-mcp-servers.png +0 -0
  328. package/docs/img/compilation/03-query-completed.png +0 -0
  329. package/docs/img/compilation/04-wizard-original.png +0 -0
  330. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  331. package/docs/img/compilation/06-wizard-profile.png +0 -0
  332. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  333. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  334. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  335. package/docs/img/compilation/10-wizard-verify.png +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CustomDurationPicker-CtH2hReF.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxDEV","e","u"],"mappings":"qLAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,OAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAU,EAAAA,OAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKN,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWU,GAAMT,EAAYS,EAAE,OAAO,KAAK,EAC3C,YAAaP,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,EATxB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAWAU,EAAAA,OAAC,SAAA,CACC,MAAON,EACP,SAAWO,GAAMN,EAAc,SAASM,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUH,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKiB,GACVF,EAAAA,OAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,MAAf,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,CAChD,CAAA,EARH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EArBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,CAEJ"}
1
+ {"version":3,"file":"CustomDurationPicker-D1HUQcd0.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxDEV","e","u"],"mappings":"qLAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,OAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAU,EAAAA,OAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKN,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWU,GAAMT,EAAYS,EAAE,OAAO,KAAK,EAC3C,YAAaP,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,EATxB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAWAU,EAAAA,OAAC,SAAA,CACC,MAAON,EACP,SAAWO,GAAMN,EAAc,SAASM,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUH,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKiB,GACVF,EAAAA,OAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,MAAf,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,CAChD,CAAA,EARH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EArBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-DYyLF-Qb.js";import{E as N}from"./EmptyState-BBn78pmm.js";function x({active:s,direction:r}){return e.jsxDEV("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${s?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${s&&r==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:35,columnNumber:5},this)}function v({columns:s,data:r,keyFn:i,onRowClick:m,activeRowKey:c,rowClassName:d,isLoading:u,emptyMessage:b="No records found",sort:o,onSort:p,inline:h}){return u?e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,t)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:67,columnNumber:13},this)},t,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:64,columnNumber:7},this):r.length?e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:s.map(a=>{const t=a.sortable&&p,n=(o==null?void 0:o.sort_by)===a.key;return e.jsxDEV("th",{onClick:t?()=>p(a.key):void 0,className:`${h?"":"sticky top-[2.75rem] z-10 "}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${a.className??""} ${t?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxDEV("span",{className:"inline-flex items-center gap-1",children:[a.label,t&&e.jsxDEV(x,{active:n,direction:n?o.order:"desc"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:97,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:94,columnNumber:17},this)},a.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:87,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:81,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:80,columnNumber:7},this),e.jsxDEV("tbody",{children:r.map((a,t)=>{const n=c!=null&&i(a)===c;return e.jsxDEV("tr",{onClick:m?()=>m(a):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${m?"cursor-pointer row-hover":""} ${n?"bg-accent/5 border-l-2 border-l-accent":""} ${d?d(a):""}`,children:s.map(l=>e.jsxDEV("td",{className:`px-6 py-3.5 text-sm ${l.className??""}`,children:l.render(a,t)},l.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:117,columnNumber:15},this))},i(a),!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:109,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:105,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:79,columnNumber:5},this):b?e.jsxDEV(N,{title:b},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:75,columnNumber:27},this):null}export{v as D};
2
- //# sourceMappingURL=DataTable-CM5ZcpPi.js.map
1
+ import{j as e}from"./index-BwN3KP_L.js";import{E as N}from"./EmptyState-X0fIzYID.js";function x({active:s,direction:r}){return e.jsxDEV("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${s?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${s&&r==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:35,columnNumber:5},this)}function v({columns:s,data:r,keyFn:i,onRowClick:m,activeRowKey:c,rowClassName:d,isLoading:u,emptyMessage:b="No records found",sort:o,onSort:p,inline:h}){return u?e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,t)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:67,columnNumber:13},this)},t,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:64,columnNumber:7},this):r.length?e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:s.map(a=>{const t=a.sortable&&p,n=(o==null?void 0:o.sort_by)===a.key;return e.jsxDEV("th",{onClick:t?()=>p(a.key):void 0,className:`${h?"":"sticky top-[2.75rem] z-10 "}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${a.className??""} ${t?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxDEV("span",{className:"inline-flex items-center gap-1",children:[a.label,t&&e.jsxDEV(x,{active:n,direction:n?o.order:"desc"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:97,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:94,columnNumber:17},this)},a.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:87,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:81,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:80,columnNumber:7},this),e.jsxDEV("tbody",{children:r.map((a,t)=>{const n=c!=null&&i(a)===c;return e.jsxDEV("tr",{onClick:m?()=>m(a):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${m?"cursor-pointer row-hover":""} ${n?"bg-accent/5 border-l-2 border-l-accent":""} ${d?d(a):""}`,children:s.map(l=>e.jsxDEV("td",{className:`px-6 py-3.5 text-sm ${l.className??""}`,children:l.render(a,t)},l.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:117,columnNumber:15},this))},i(a),!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:109,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:105,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:79,columnNumber:5},this):b?e.jsxDEV(N,{title:b},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:75,columnNumber:27},this):null}export{v as D};
2
+ //# sourceMappingURL=DataTable-DKvSKoVG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable-CM5ZcpPi.js","sources":["../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport type { SortState } from '../../../hooks/useFilterParams';\n\nexport interface Column<T> {\n key: string;\n label: string | ReactNode;\n render: (row: T, index: number) => ReactNode;\n className?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyFn: (row: T) => string;\n onRowClick?: (row: T) => void;\n /** Highlight the row whose keyFn matches this value. */\n activeRowKey?: string | null;\n /** Optional per-row class name for custom styling (e.g., engine vs worker tint). */\n rowClassName?: (row: T) => string;\n isLoading?: boolean;\n emptyMessage?: string;\n /** Current sort state — pass to show active sort indicator. */\n sort?: SortState;\n /** Called when a sortable column header is clicked. */\n onSort?: (column: string) => void;\n /** Disable the sticky header (useful when nested inside collapsible sections). */\n inline?: boolean;\n}\n\nfunction SortIcon({ active, direction }: { active: boolean; direction: 'asc' | 'desc' }) {\n return (\n <svg\n className={`w-3 h-3 shrink-0 transition-all duration-150 ${\n active ? 'text-accent opacity-100' : 'opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary'\n } ${active && direction === 'asc' ? 'rotate-180' : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function DataTable<T>({\n columns,\n data,\n keyFn,\n onRowClick,\n activeRowKey,\n rowClassName,\n isLoading,\n emptyMessage = 'No records found',\n sort,\n onSort,\n inline,\n}: DataTableProps<T>) {\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (!data.length) {\n return emptyMessage ? <EmptyState title={emptyMessage} /> : null;\n }\n\n return (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n {columns.map((col) => {\n const isSortable = col.sortable && onSort;\n const isActive = sort?.sort_by === col.key;\n\n return (\n <th\n key={col.key}\n onClick={isSortable ? () => onSort(col.key) : undefined}\n className={`${inline ? '' : 'sticky top-[2.75rem] z-10 '}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.className ?? ''} ${\n isSortable ? 'cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors' : ''\n }`}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSortable && (\n <SortIcon active={isActive} direction={isActive ? sort.order : 'desc'} />\n )}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <tr\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`group/row border-b last:border-b-0 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'bg-accent/5 border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={`px-6 py-3.5 text-sm ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"],"names":["SortIcon","active","direction","jsxDEV","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","col","isSortable","isActive","row","index","EmptyState"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable-DKvSKoVG.js","sources":["../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport type { SortState } from '../../../hooks/useFilterParams';\n\nexport interface Column<T> {\n key: string;\n label: string | ReactNode;\n render: (row: T, index: number) => ReactNode;\n className?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyFn: (row: T) => string;\n onRowClick?: (row: T) => void;\n /** Highlight the row whose keyFn matches this value. */\n activeRowKey?: string | null;\n /** Optional per-row class name for custom styling (e.g., engine vs worker tint). */\n rowClassName?: (row: T) => string;\n isLoading?: boolean;\n emptyMessage?: string;\n /** Current sort state — pass to show active sort indicator. */\n sort?: SortState;\n /** Called when a sortable column header is clicked. */\n onSort?: (column: string) => void;\n /** Disable the sticky header (useful when nested inside collapsible sections). */\n inline?: boolean;\n}\n\nfunction SortIcon({ active, direction }: { active: boolean; direction: 'asc' | 'desc' }) {\n return (\n <svg\n className={`w-3 h-3 shrink-0 transition-all duration-150 ${\n active ? 'text-accent opacity-100' : 'opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary'\n } ${active && direction === 'asc' ? 'rotate-180' : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function DataTable<T>({\n columns,\n data,\n keyFn,\n onRowClick,\n activeRowKey,\n rowClassName,\n isLoading,\n emptyMessage = 'No records found',\n sort,\n onSort,\n inline,\n}: DataTableProps<T>) {\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (!data.length) {\n return emptyMessage ? <EmptyState title={emptyMessage} /> : null;\n }\n\n return (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n {columns.map((col) => {\n const isSortable = col.sortable && onSort;\n const isActive = sort?.sort_by === col.key;\n\n return (\n <th\n key={col.key}\n onClick={isSortable ? () => onSort(col.key) : undefined}\n className={`${inline ? '' : 'sticky top-[2.75rem] z-10 '}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.className ?? ''} ${\n isSortable ? 'cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors' : ''\n }`}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSortable && (\n <SortIcon active={isActive} direction={isActive ? sort.order : 'desc'} />\n )}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <tr\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`group/row border-b last:border-b-0 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'bg-accent/5 border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={`px-6 py-3.5 text-sm ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"],"names":["SortIcon","active","direction","jsxDEV","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","col","isSortable","isActive","row","index","EmptyState"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{y as d,j as l,w as x}from"./index-DYyLF-Qb.js";import{a}from"./vendor-query-DLp59M9_.js";function E({startDate:n,endDate:o,isLive:t}){const[r,m]=a.useState(Date.now);a.useEffect(()=>{if(!t)return;const u=setInterval(()=>m(Date.now()),1e3);return()=>clearInterval(u)},[t]);const c=new Date(n).getTime(),i=o?new Date(o).getTime():r,e=Math.max(0,i-c),s=d(e),p=a.useMemo(()=>[{label:"ms",value:String(e)},{label:"sec",value:`${(e/1e3).toFixed(3)}s`},{label:"text",value:s}],[e,s]);return l.jsxDEV(x,{options:p,children:l.jsxDEV("span",{className:`text-xs ${t?"text-status-active":"text-text-tertiary"}`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:38,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:37,columnNumber:5},this)}export{E};
2
- //# sourceMappingURL=ElapsedCell-CwqavyeC.js.map
1
+ import{y as d,j as l,w as x}from"./index-BwN3KP_L.js";import{a}from"./vendor-query-DLp59M9_.js";function E({startDate:n,endDate:o,isLive:t}){const[r,m]=a.useState(Date.now);a.useEffect(()=>{if(!t)return;const u=setInterval(()=>m(Date.now()),1e3);return()=>clearInterval(u)},[t]);const c=new Date(n).getTime(),i=o?new Date(o).getTime():r,e=Math.max(0,i-c),s=d(e),p=a.useMemo(()=>[{label:"ms",value:String(e)},{label:"sec",value:`${(e/1e3).toFixed(3)}s`},{label:"text",value:s}],[e,s]);return l.jsxDEV(x,{options:p,children:l.jsxDEV("span",{className:`text-xs ${t?"text-status-active":"text-text-tertiary"}`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:38,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:37,columnNumber:5},this)}export{E};
2
+ //# sourceMappingURL=ElapsedCell-B0yrReGQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElapsedCell-CwqavyeC.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsxDEV","DateTooltip"],"mappings":"gGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,OAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,SAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,CAEJ"}
1
+ {"version":3,"file":"ElapsedCell-B0yrReGQ.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsxDEV","DateTooltip"],"mappings":"gGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,OAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,SAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-DYyLF-Qb.js";function a({title:s="No data",description:t}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:10,columnNumber:7},this),t&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:12,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:9,columnNumber:5},this)}export{a as E};
2
- //# sourceMappingURL=EmptyState-BBn78pmm.js.map
1
+ import{j as e}from"./index-BwN3KP_L.js";function a({title:s="No data",description:t}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:10,columnNumber:7},this),t&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:12,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:9,columnNumber:5},this)}export{a as E};
2
+ //# sourceMappingURL=EmptyState-X0fIzYID.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState-BBn78pmm.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["export function EmptyState({\n title = 'No data',\n description,\n}: {\n title?: string;\n description?: string;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n <p className=\"text-sm text-text-secondary\">{title}</p>\n {description && (\n <p className=\"text-xs text-text-tertiary mt-1\">{description}</p>\n )}\n </div>\n );\n}\n"],"names":["EmptyState","title","description","jsxDEV"],"mappings":"wCAAO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,CACF,EAGG,CACD,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAF,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAkD,EACjDC,GACCC,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAD,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4D,CAAA,CAAA,EAHhE,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAKA,CAEJ"}
1
+ {"version":3,"file":"EmptyState-X0fIzYID.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["export function EmptyState({\n title = 'No data',\n description,\n}: {\n title?: string;\n description?: string;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n <p className=\"text-sm text-text-secondary\">{title}</p>\n {description && (\n <p className=\"text-xs text-text-tertiary mt-1\">{description}</p>\n )}\n </div>\n );\n}\n"],"names":["EmptyState","title","description","jsxDEV"],"mappings":"wCAAO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,CACF,EAGG,CACD,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAF,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAkD,EACjDC,GACCC,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAD,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4D,CAAA,CAAA,EAHhE,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAKA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as u,j as e}from"./index-DYyLF-Qb.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{d as v}from"./useEventHooks-DIE6ue4x.js";import{P as N}from"./PageHeader-NkOeBR05.js";import{S as c}from"./StatCard-v2TiITVr.js";import{c as h}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-BiIug1SK.js";const x=[{label:"1h",value:"1h"},{label:"24h",value:"24h"},{label:"7d",value:"7d"},{label:"30d",value:"30d"}];function i({value:o,colorClass:l,onClick:n}){return o===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:31,columnNumber:12},this):e.jsxDEV("button",{onClick:n,className:`${l} hover:underline tabular-nums font-medium`,children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:34,columnNumber:5},this)}function w(){var m,p;v();const o=h(),[l,n]=b.useState("24h"),{data:s}=u(l),r=a=>{const d=new URLSearchParams(a).toString();o(`/escalations/available${d?`?${d}`:""}`)},t="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(N,{title:"Escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:61,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-1 mb-6",children:x.map(a=>e.jsxDEV("button",{onClick:()=>n(a.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${l===a.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:64,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(c,{label:"Open",value:(s==null?void 0:s.pending)??"—",colorClass:"text-status-pending",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV(c,{label:"Claimed",value:(s==null?void 0:s.claimed)??"—",colorClass:"text-status-active",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:83,columnNumber:9},this),e.jsxDEV(c,{label:"Created",value:(s==null?void 0:s.created)??"—",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:84,columnNumber:9},this),e.jsxDEV(c,{label:"Resolved",value:(s==null?void 0:s.resolved)??"—",colorClass:"text-status-success",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:85,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:81,columnNumber:7},this),(((m=s==null?void 0:s.by_role)==null?void 0:m.length)??0)>0&&e.jsxDEV("div",{className:"mb-8",children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:94,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:95,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:96,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:93,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_role.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({role:a.role}),className:"hover:text-accent hover:underline",children:a.role},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:103,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:102,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:111,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:110,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:118,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:117,columnNumber:19},this)]},a.role,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:101,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:99,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:91,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:90,columnNumber:9},this),(((p=s==null?void 0:s.by_type)==null?void 0:p.length)??0)>0&&e.jsxDEV("div",{children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:137,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:138,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:139,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Resolved"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:140,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:136,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:135,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_type.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({type:a.type}),className:"hover:text-accent hover:underline",children:a.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:147,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:146,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:155,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:154,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:162,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:161,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.resolved,colorClass:"text-status-success",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:169,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:168,columnNumber:19},this)]},a.type,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:145,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:143,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:134,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:133,columnNumber:9},this),s&&s.by_role.length===0&&s.by_type.length===0&&e.jsxDEV("div",{className:"py-16 text-center",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No escalation activity in the last ",l]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:185,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:184,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:60,columnNumber:5},this)}export{w as EscalationsOverview};
2
- //# sourceMappingURL=EscalationsOverview-BcJ2E3X7.js.map
1
+ import{h as u,j as e}from"./index-BwN3KP_L.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{d as v}from"./useEventHooks-CUCxpiI2.js";import{P as N}from"./PageHeader-DVr5Qyzm.js";import{S as c}from"./StatCard-Cz_2OjAZ.js";import{c as h}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-D1DdudfH.js";const x=[{label:"1h",value:"1h"},{label:"24h",value:"24h"},{label:"7d",value:"7d"},{label:"30d",value:"30d"}];function i({value:o,colorClass:l,onClick:n}){return o===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:31,columnNumber:12},this):e.jsxDEV("button",{onClick:n,className:`${l} hover:underline tabular-nums font-medium`,children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:34,columnNumber:5},this)}function w(){var m,p;v();const o=h(),[l,n]=b.useState("24h"),{data:s}=u(l),r=a=>{const d=new URLSearchParams(a).toString();o(`/escalations/available${d?`?${d}`:""}`)},t="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(N,{title:"Escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:61,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-1 mb-6",children:x.map(a=>e.jsxDEV("button",{onClick:()=>n(a.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${l===a.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:64,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(c,{label:"Open",value:(s==null?void 0:s.pending)??"—",colorClass:"text-status-pending",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV(c,{label:"Claimed",value:(s==null?void 0:s.claimed)??"—",colorClass:"text-status-active",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:83,columnNumber:9},this),e.jsxDEV(c,{label:"Created",value:(s==null?void 0:s.created)??"—",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:84,columnNumber:9},this),e.jsxDEV(c,{label:"Resolved",value:(s==null?void 0:s.resolved)??"—",colorClass:"text-status-success",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:85,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:81,columnNumber:7},this),(((m=s==null?void 0:s.by_role)==null?void 0:m.length)??0)>0&&e.jsxDEV("div",{className:"mb-8",children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:94,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:95,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:96,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:93,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_role.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({role:a.role}),className:"hover:text-accent hover:underline",children:a.role},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:103,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:102,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:111,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:110,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:118,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:117,columnNumber:19},this)]},a.role,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:101,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:99,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:91,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:90,columnNumber:9},this),(((p=s==null?void 0:s.by_type)==null?void 0:p.length)??0)>0&&e.jsxDEV("div",{children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:137,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:138,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:139,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Resolved"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:140,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:136,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:135,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_type.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({type:a.type}),className:"hover:text-accent hover:underline",children:a.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:147,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:146,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:155,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:154,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:162,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:161,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.resolved,colorClass:"text-status-success",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:169,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:168,columnNumber:19},this)]},a.type,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:145,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:143,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:134,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:133,columnNumber:9},this),s&&s.by_role.length===0&&s.by_type.length===0&&e.jsxDEV("div",{className:"py-16 text-center",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No escalation activity in the last ",l]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:185,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:184,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:60,columnNumber:5},this)}export{w as EscalationsOverview};
2
+ //# sourceMappingURL=EscalationsOverview-BQAT9W7r.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EscalationsOverview-BcJ2E3X7.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsxDEV","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","StatCard","_a","row","_b"],"mappings":"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"}
1
+ {"version":3,"file":"EscalationsOverview-BQAT9W7r.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsxDEV","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","StatCard","_a","row","_b"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as u}from"./vendor-query-DLp59M9_.js";import{j as t,f as j,C as V}from"./index-DYyLF-Qb.js";import{F as C,b as h}from"./FilterBar-CZTlrLQT.js";import{E as $}from"./SwimlaneTimeline-CNlj7fgg.js";const N="lt-collapsed-sections";function F(r){try{const a=localStorage.getItem(`${N}:${r}`);return a?new Set(JSON.parse(a)):new Set}catch{return new Set}}function O(r,a){localStorage.setItem(`${N}:${r}`,JSON.stringify([...a]))}function B(r){const[a,n]=u.useState(()=>F(r)),f=u.useCallback(i=>a.has(i),[a]),d=u.useCallback(i=>{n(m=>{const c=new Set(m);return c.has(i)?c.delete(i):c.add(i),O(r,c),c})},[r]);return{isCollapsed:f,toggle:d}}const P=new Set(["activity_task_scheduled","timer_started","child_workflow_execution_started","signal_wait_started"]),A=new Set(["activity_task_completed","activity_task_failed","timer_fired","child_workflow_execution_completed","child_workflow_execution_failed","workflow_execution_signaled"]);function L(r){const a=new Set;for(const n of r)A.has(n.event_type)&&n.attributes.timeline_key&&a.add(n.attributes.timeline_key);return a}function G({events:r,childTasks:a}){const[n,f]=u.useState(""),[d,i]=u.useState(""),[m,c]=u.useState("asc"),[b,p]=u.useState(new Set),v=[...new Set(r.map(e=>e.category))].sort(),g=[...new Set(r.map(e=>e.event_type))].sort(),k=L(r),E=e=>{if(e.duration_ms!==null||!P.has(e.event_type))return!1;const s=e.attributes.timeline_key;return!(s&&k.has(s))};let o=r;n&&(o=o.filter(e=>e.category===n)),d&&(o=o.filter(e=>e.event_type===d)),o=[...o].sort((e,s)=>m==="asc"?e.event_id-s.event_id:s.event_id-e.event_id);const _=e=>{switch(e){case"activity":return"bg-blue-500";case"signal":return"bg-emerald-500";case"timer":return"bg-status-warning";case"child_workflow":return"bg-violet-500";default:return"bg-text-tertiary"}},y=e=>{const s=e.event_type;if(e.attributes.activity_type)return`${s} — ${e.attributes.activity_type}`;if(e.attributes.signal_name)return`${s} — ${e.attributes.signal_name}`;if(e.attributes.child_workflow_id){const l=e.attributes.child_workflow_id,S=l.length>24?`${l.slice(0,24)}...`:l;return`${s} — ${S}`}return s},T=e=>{if(!(a!=null&&a.length))return;const s=e.attributes.activity_type;if(s)return a.find(l=>l.workflow_type===s)},w=e=>{p(s=>{const l=new Set(s);return l.has(e)?l.delete(e):l.add(e),l})},x=o.length>0&&o.every(e=>b.has(e.event_id)),D=()=>{p(x?new Set:new Set(o.map(e=>e.event_id)))};return t.jsxDEV("div",{children:[t.jsxDEV("div",{className:"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3",children:[t.jsxDEV("div",{className:"flex items-center gap-4",children:[t.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:["Events (",o.length,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:135,columnNumber:11},this),o.length>0&&t.jsxDEV("button",{onClick:D,className:"text-[10px] text-accent hover:underline",children:x?"Collapse all":"Expand all"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:139,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:134,columnNumber:9},this),t.jsxDEV(C,{children:[t.jsxDEV(h,{label:"Category",value:n,onChange:f,options:v.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:145,columnNumber:11},this),t.jsxDEV(h,{label:"Type",value:d,onChange:i,options:g.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:151,columnNumber:11},this),t.jsxDEV("button",{onClick:()=>c(e=>e==="asc"?"desc":"asc"),className:"btn-ghost text-xs",children:m==="asc"?"Oldest first":"Newest first"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:157,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:144,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:133,columnNumber:7},this),t.jsxDEV("div",{children:o.length===0?t.jsxDEV("div",{className:"px-6 py-8 text-center",children:t.jsxDEV("p",{className:"text-sm text-text-tertiary",children:"No events match the current filters"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:169,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:168,columnNumber:11},this):o.map(e=>{const s=b.has(e.event_id),l=E(e);return t.jsxDEV("div",{className:"border-b border-surface-border last:border-b-0",children:[t.jsxDEV("div",{className:"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200",onClick:()=>w(e.event_id),children:[t.jsxDEV("span",{className:`text-[10px] text-text-tertiary transition-transform duration-300 ${s?"rotate-90":""}`,children:"▶"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:187,columnNumber:19},this),t.jsxDEV("span",{className:"text-xs font-mono text-text-tertiary w-8 shrink-0",children:e.event_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:193,columnNumber:19},this),t.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${_(e.category)}`},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:196,columnNumber:19},this),t.jsxDEV("span",{className:"text-sm text-text-primary flex-1 truncate",children:y(e)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:199,columnNumber:19},this),t.jsxDEV("span",{className:"text-xs font-mono text-text-tertiary shrink-0",children:l?t.jsxDEV("span",{className:"inline-flex items-center gap-1 text-status-warning",children:[t.jsxDEV("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:205,columnNumber:25},this),"Pending"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:204,columnNumber:23},this):e.duration_ms!==null?j(e.duration_ms):"--"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:202,columnNumber:19},this),t.jsxDEV("time",{className:"text-[10px] font-mono text-text-tertiary shrink-0",children:new Date(e.event_time).toLocaleTimeString()},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:214,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:182,columnNumber:17},this),t.jsxDEV(V,{open:s&&!!e.attributes,children:t.jsxDEV("div",{className:"px-6 pb-4 pl-16",children:t.jsxDEV($,{event:e,childTask:T(e),pending:l,onClose:()=>w(e.event_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:222,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:221,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:220,columnNumber:17},this)]},e.event_id,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:177,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:166,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:132,columnNumber:5},this)}export{G as E,B as u};
2
- //# sourceMappingURL=EventTable-C1en_KZ0.js.map
1
+ import{a as u}from"./vendor-query-DLp59M9_.js";import{j as t,f as j,C as V}from"./index-BwN3KP_L.js";import{F as C,b as h}from"./FilterBar-DMTvuQy-.js";import{E as $}from"./SwimlaneTimeline-CUPqMd0z.js";const N="lt-collapsed-sections";function F(r){try{const a=localStorage.getItem(`${N}:${r}`);return a?new Set(JSON.parse(a)):new Set}catch{return new Set}}function O(r,a){localStorage.setItem(`${N}:${r}`,JSON.stringify([...a]))}function B(r){const[a,n]=u.useState(()=>F(r)),f=u.useCallback(i=>a.has(i),[a]),d=u.useCallback(i=>{n(m=>{const c=new Set(m);return c.has(i)?c.delete(i):c.add(i),O(r,c),c})},[r]);return{isCollapsed:f,toggle:d}}const P=new Set(["activity_task_scheduled","timer_started","child_workflow_execution_started","signal_wait_started"]),A=new Set(["activity_task_completed","activity_task_failed","timer_fired","child_workflow_execution_completed","child_workflow_execution_failed","workflow_execution_signaled"]);function L(r){const a=new Set;for(const n of r)A.has(n.event_type)&&n.attributes.timeline_key&&a.add(n.attributes.timeline_key);return a}function G({events:r,childTasks:a}){const[n,f]=u.useState(""),[d,i]=u.useState(""),[m,c]=u.useState("asc"),[b,p]=u.useState(new Set),v=[...new Set(r.map(e=>e.category))].sort(),g=[...new Set(r.map(e=>e.event_type))].sort(),k=L(r),E=e=>{if(e.duration_ms!==null||!P.has(e.event_type))return!1;const s=e.attributes.timeline_key;return!(s&&k.has(s))};let o=r;n&&(o=o.filter(e=>e.category===n)),d&&(o=o.filter(e=>e.event_type===d)),o=[...o].sort((e,s)=>m==="asc"?e.event_id-s.event_id:s.event_id-e.event_id);const _=e=>{switch(e){case"activity":return"bg-blue-500";case"signal":return"bg-emerald-500";case"timer":return"bg-status-warning";case"child_workflow":return"bg-violet-500";default:return"bg-text-tertiary"}},y=e=>{const s=e.event_type;if(e.attributes.activity_type)return`${s} — ${e.attributes.activity_type}`;if(e.attributes.signal_name)return`${s} — ${e.attributes.signal_name}`;if(e.attributes.child_workflow_id){const l=e.attributes.child_workflow_id,S=l.length>24?`${l.slice(0,24)}...`:l;return`${s} — ${S}`}return s},T=e=>{if(!(a!=null&&a.length))return;const s=e.attributes.activity_type;if(s)return a.find(l=>l.workflow_type===s)},w=e=>{p(s=>{const l=new Set(s);return l.has(e)?l.delete(e):l.add(e),l})},x=o.length>0&&o.every(e=>b.has(e.event_id)),D=()=>{p(x?new Set:new Set(o.map(e=>e.event_id)))};return t.jsxDEV("div",{children:[t.jsxDEV("div",{className:"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3",children:[t.jsxDEV("div",{className:"flex items-center gap-4",children:[t.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:["Events (",o.length,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:135,columnNumber:11},this),o.length>0&&t.jsxDEV("button",{onClick:D,className:"text-[10px] text-accent hover:underline",children:x?"Collapse all":"Expand all"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:139,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:134,columnNumber:9},this),t.jsxDEV(C,{children:[t.jsxDEV(h,{label:"Category",value:n,onChange:f,options:v.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:145,columnNumber:11},this),t.jsxDEV(h,{label:"Type",value:d,onChange:i,options:g.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:151,columnNumber:11},this),t.jsxDEV("button",{onClick:()=>c(e=>e==="asc"?"desc":"asc"),className:"btn-ghost text-xs",children:m==="asc"?"Oldest first":"Newest first"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:157,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:144,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:133,columnNumber:7},this),t.jsxDEV("div",{children:o.length===0?t.jsxDEV("div",{className:"px-6 py-8 text-center",children:t.jsxDEV("p",{className:"text-sm text-text-tertiary",children:"No events match the current filters"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:169,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:168,columnNumber:11},this):o.map(e=>{const s=b.has(e.event_id),l=E(e);return t.jsxDEV("div",{className:"border-b border-surface-border last:border-b-0",children:[t.jsxDEV("div",{className:"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200",onClick:()=>w(e.event_id),children:[t.jsxDEV("span",{className:`text-[10px] text-text-tertiary transition-transform duration-300 ${s?"rotate-90":""}`,children:"▶"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:187,columnNumber:19},this),t.jsxDEV("span",{className:"text-xs font-mono text-text-tertiary w-8 shrink-0",children:e.event_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:193,columnNumber:19},this),t.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${_(e.category)}`},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:196,columnNumber:19},this),t.jsxDEV("span",{className:"text-sm text-text-primary flex-1 truncate",children:y(e)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:199,columnNumber:19},this),t.jsxDEV("span",{className:"text-xs font-mono text-text-tertiary shrink-0",children:l?t.jsxDEV("span",{className:"inline-flex items-center gap-1 text-status-warning",children:[t.jsxDEV("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:205,columnNumber:25},this),"Pending"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:204,columnNumber:23},this):e.duration_ms!==null?j(e.duration_ms):"--"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:202,columnNumber:19},this),t.jsxDEV("time",{className:"text-[10px] font-mono text-text-tertiary shrink-0",children:new Date(e.event_time).toLocaleTimeString()},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:214,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:182,columnNumber:17},this),t.jsxDEV(V,{open:s&&!!e.attributes,children:t.jsxDEV("div",{className:"px-6 pb-4 pl-16",children:t.jsxDEV($,{event:e,childTask:T(e),pending:l,onClose:()=>w(e.event_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:222,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:221,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:220,columnNumber:17},this)]},e.event_id,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:177,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:166,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:132,columnNumber:5},this)}export{G as E,B as u};
2
+ //# sourceMappingURL=EventTable-CX1KNLhZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventTable-C1en_KZ0.js","sources":["../../src/hooks/useCollapsedSections.ts","../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nconst STORAGE_KEY = 'lt-collapsed-sections';\n\nfunction load(pageKey: string): Set<string> {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY}:${pageKey}`);\n if (!raw) return new Set();\n return new Set(JSON.parse(raw));\n } catch {\n return new Set();\n }\n}\n\nfunction save(pageKey: string, set: Set<string>) {\n localStorage.setItem(`${STORAGE_KEY}:${pageKey}`, JSON.stringify([...set]));\n}\n\nexport function useCollapsedSections(pageKey: string) {\n const [collapsed, setCollapsed] = useState<Set<string>>(() => load(pageKey));\n\n const isCollapsed = useCallback(\n (section: string) => collapsed.has(section),\n [collapsed],\n );\n\n const toggle = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(section)) {\n next.delete(section);\n } else {\n next.add(section);\n }\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n return { isCollapsed, toggle };\n}\n","import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STORAGE_KEY","load","pageKey","raw","save","set","useCollapsedSections","collapsed","setCollapsed","useState","isCollapsed","useCallback","section","toggle","prev","next","STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","allExpanded","toggleAll","jsxDEV","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"2MAEA,MAAMA,EAAc,wBAEpB,SAASC,EAAKC,EAA8B,CAC1C,GAAI,CACF,MAAMC,EAAM,aAAa,QAAQ,GAAGH,CAAW,IAAIE,CAAO,EAAE,EAC5D,OAAKC,EACE,IAAI,IAAI,KAAK,MAAMA,CAAG,CAAC,EADb,IAAI,GAEvB,MAAQ,CACN,WAAW,GACb,CACF,CAEA,SAASC,EAAKF,EAAiBG,EAAkB,CAC/C,aAAa,QAAQ,GAAGL,CAAW,IAAIE,CAAO,GAAI,KAAK,UAAU,CAAC,GAAGG,CAAG,CAAC,CAAC,CAC5E,CAEO,SAASC,EAAqBJ,EAAiB,CACpD,KAAM,CAACK,EAAWC,CAAY,EAAIC,EAAAA,SAAsB,IAAMR,EAAKC,CAAO,CAAC,EAErEQ,EAAcC,EAAAA,YACjBC,GAAoBL,EAAU,IAAIK,CAAO,EAC1C,CAACL,CAAS,CAAA,EAGNM,EAASF,EAAAA,YACZC,GAAoB,CACnBJ,EAAcM,GAAS,CACrB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIH,CAAO,EAClBG,EAAK,OAAOH,CAAO,EAEnBG,EAAK,IAAIH,CAAO,EAElBR,EAAKF,EAASa,CAAI,EACXA,CACT,CAAC,CACH,EACA,CAACb,CAAO,CAAA,EAGV,MAAO,CAAE,YAAAQ,EAAa,OAAAG,CAAA,CACxB,CC9BA,MAAMG,MAAoB,IAAI,CAC5B,0BACA,gBACA,mCACA,qBACF,CAAC,EAGKC,MAAsB,IAAI,CAC9B,0BACA,uBACA,cACA,qCACA,kCACA,6BACF,CAAC,EAMD,SAASC,EAAmBC,EAA+C,CACzE,MAAMC,MAAW,IACjB,UAAWC,KAAKF,EACVF,EAAgB,IAAII,EAAE,UAAU,GAAKA,EAAE,WAAW,cACpDD,EAAK,IAAIC,EAAE,WAAW,YAAY,EAGtC,OAAOD,CACT,CAEO,SAASE,EAAW,CAAE,OAAAH,EAAQ,WAAAI,GAA+B,CAClE,KAAM,CAACC,EAAgBC,CAAiB,EAAIhB,EAAAA,SAAS,EAAE,EACjD,CAACiB,EAAYC,CAAa,EAAIlB,EAAAA,SAAS,EAAE,EACzC,CAACmB,EAAWC,CAAY,EAAIpB,EAAAA,SAAyB,KAAK,EAC1D,CAACqB,EAAgBC,CAAiB,EAAItB,EAAAA,SAAsB,IAAI,GAAK,EAErEuB,EAAa,CAAC,GAAG,IAAI,IAAIb,EAAO,IAAK,GAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAA,EACzDc,EAAa,CAAC,GAAG,IAAI,IAAId,EAAO,IAAK,GAAM,EAAE,UAAU,CAAC,CAAC,EAAE,KAAA,EAC3De,EAAgBhB,EAAmBC,CAAM,EAGzCgB,EAAaC,GAAyC,CAE1D,GADIA,EAAI,cAAgB,MACpB,CAACpB,EAAc,IAAIoB,EAAI,UAAU,EAAG,MAAO,GAC/C,MAAMC,EAAMD,EAAI,WAAW,aAC3B,MAAI,EAAAC,GAAOH,EAAc,IAAIG,CAAG,EAElC,EAEA,IAAIC,EAAWnB,EACXK,MAA2Bc,EAAS,OAAQ,GAAM,EAAE,WAAad,CAAc,GAC/EE,MAAuBY,EAAS,OAAQ,GAAM,EAAE,aAAeZ,CAAU,GAE7EY,EAAW,CAAC,GAAGA,CAAQ,EAAE,KAAK,CAACC,EAAGC,IAChCZ,IAAc,MAAQW,EAAE,SAAWC,EAAE,SAAWA,EAAE,SAAWD,EAAE,QAAA,EAGjE,MAAME,EAAeC,GAAqB,CACxC,OAAQA,EAAA,CACN,IAAK,WACH,MAAO,cACT,IAAK,SACH,MAAO,iBACT,IAAK,QACH,MAAO,oBACT,IAAK,iBACH,MAAO,gBACT,QACE,MAAO,kBAAA,CAEb,EAGMC,EAAcP,GAAwC,CAC1D,MAAMQ,EAAOR,EAAI,WACjB,GAAIA,EAAI,WAAW,cACjB,MAAO,GAAGQ,CAAI,MAAMR,EAAI,WAAW,aAAa,GAElD,GAAIA,EAAI,WAAW,YACjB,MAAO,GAAGQ,CAAI,MAAMR,EAAI,WAAW,WAAW,GAEhD,GAAIA,EAAI,WAAW,kBAAmB,CACpC,MAAMS,EAAKT,EAAI,WAAW,kBACpBU,EAAYD,EAAG,OAAS,GAAK,GAAGA,EAAG,MAAM,EAAG,EAAE,CAAC,MAAQA,EAC7D,MAAO,GAAGD,CAAI,MAAME,CAAS,EAC/B,CACA,OAAOF,CACT,EAGMG,EAAiBX,GAA0D,CAC/E,GAAI,EAACb,GAAA,MAAAA,EAAY,QAAQ,OACzB,MAAMyB,EAAeZ,EAAI,WAAW,cACpC,GAAKY,EACL,OAAOzB,EAAW,KAAM0B,GAAMA,EAAE,gBAAkBD,CAAY,CAChE,EAEME,EAAeL,GAAe,CAClCd,EAAmBjB,GAAS,CAC1B,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAI8B,CAAE,EAAG9B,EAAK,OAAO8B,CAAE,EAC3B9B,EAAK,IAAI8B,CAAE,EACT9B,CACT,CAAC,CACH,EAEMoC,EAAcb,EAAS,OAAS,GAAKA,EAAS,MAAO,GAAMR,EAAe,IAAI,EAAE,QAAQ,CAAC,EAEzFsB,EAAY,IAAM,CAEpBrB,EADEoB,EACgB,IAAI,IAEJ,IAAI,IAAIb,EAAS,IAAK,GAAM,EAAE,QAAQ,CAAC,CAF9B,CAI/B,EAEA,gBACG,MAAA,CACC,SAAA,CAAAe,EAAAA,OAAC,MAAA,CAAI,UAAU,6FACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,CAAA,WAC3Ef,EAAS,OAAO,GAAA,CAAA,EAD3B,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACCA,EAAS,OAAS,GACjBe,EAAAA,OAAC,SAAA,CAAO,QAASD,EAAW,UAAU,0CACnC,SAAAD,EAAc,eAAiB,YAAA,EADlC,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAPJ,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IASA,WACCG,EAAA,CACC,SAAA,CAAAD,EAAAA,OAACE,EAAA,CACC,MAAM,WACN,MAAO/B,EACP,SAAUC,EACV,QAASO,EAAW,IAAKwB,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,EAJzD,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAMAH,EAAAA,OAACE,EAAA,CACC,MAAM,OACN,MAAO7B,EACP,SAAUC,EACV,QAASM,EAAW,IAAKgB,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,EAJzD,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAMAI,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMxB,EAAc4B,GAAOA,IAAM,MAAQ,OAAS,KAAM,EACjE,UAAU,oBAET,SAAA7B,IAAc,MAAQ,eAAiB,cAAA,EAJ1C,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAKA,CAAA,EAlBF,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAmBA,CAAA,CAAA,EA9BF,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA+BA,EAEAyB,SAAC,MAAA,CACE,SAAAf,EAAS,SAAW,EACnBe,EAAAA,OAAC,MAAA,CAAI,UAAU,wBACb,SAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,qCAAA,EAA1C,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA6E,CAAA,EAD/E,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EAEAf,EAAS,IAAKF,GAAQ,CACpB,MAAMsB,EAAa5B,EAAe,IAAIM,EAAI,QAAQ,EAC5CuB,EAAUxB,EAAUC,CAAG,EAE7B,OACEiB,EAAAA,OAAC,MAAA,CAEC,UAAU,iDAGV,SAAA,CAAAA,EAAAA,OAAC,MAAA,CACC,UAAU,yGACV,QAAS,IAAMH,EAAYd,EAAI,QAAQ,EAGvC,SAAA,CAAAiB,EAAAA,OAAC,OAAA,CACC,UAAW,oEAAoEK,EAAa,YAAc,EAAE,GAC7G,SAAA,GAAA,EAFD,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAMAL,SAAC,OAAA,CAAK,UAAU,oDACb,WAAI,QAAA,EADP,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACAA,EAAAA,OAAC,OAAA,CACC,UAAW,iCAAiCZ,EAAYL,EAAI,QAAQ,CAAC,EAAA,EADvE,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,WAGC,OAAA,CAAK,UAAU,4CACb,SAAAO,EAAWP,CAAG,CAAA,EADjB,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACAiB,EAAAA,OAAC,QAAK,UAAU,gDACb,WACCA,EAAAA,OAAC,OAAA,CAAK,UAAU,qDACd,SAAA,CAAAA,EAAAA,OAAC,OAAA,CAAK,UAAU,0DAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA2E,EAAE,SAAA,CAAA,EAD/E,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAGA,EACEjB,EAAI,cAAgB,KACtBwB,EAAexB,EAAI,WAAW,EAE9B,MATJ,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAWA,EACAiB,EAAAA,OAAC,OAAA,CAAK,UAAU,oDACb,SAAA,IAAI,KAAKjB,EAAI,UAAU,EAAE,mBAAA,CAAmB,EAD/C,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAlCF,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAsCAiB,EAAAA,OAACQ,EAAA,CAAY,KAAMH,GAAc,CAAC,CAACtB,EAAI,WACrC,SAAAiB,EAAAA,OAAC,MAAA,CAAI,UAAU,kBACb,SAAAA,EAAAA,OAACS,EAAA,CACC,MAAO1B,EACP,UAAWW,EAAcX,CAAG,EAC5B,QAAAuB,EACA,QAAS,IAAMT,EAAYd,EAAI,QAAQ,CAAA,EAJzC,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAKA,EANF,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAOA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IASA,CAAA,CAAA,EAnDKA,EAAI,SADX,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAuDJ,CAAC,CAAA,EAlEL,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAoEA,CAAA,CAAA,EAtGF,OAAA,GAAA,CAAA,SAAA,uEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAuGA,CAEJ"}
1
+ {"version":3,"file":"EventTable-CX1KNLhZ.js","sources":["../../src/hooks/useCollapsedSections.ts","../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nconst STORAGE_KEY = 'lt-collapsed-sections';\n\nfunction load(pageKey: string): Set<string> {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY}:${pageKey}`);\n if (!raw) return new Set();\n return new Set(JSON.parse(raw));\n } catch {\n return new Set();\n }\n}\n\nfunction save(pageKey: string, set: Set<string>) {\n localStorage.setItem(`${STORAGE_KEY}:${pageKey}`, JSON.stringify([...set]));\n}\n\nexport function useCollapsedSections(pageKey: string) {\n const [collapsed, setCollapsed] = useState<Set<string>>(() => load(pageKey));\n\n const isCollapsed = useCallback(\n (section: string) => collapsed.has(section),\n [collapsed],\n );\n\n const toggle = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(section)) {\n next.delete(section);\n } else {\n next.add(section);\n }\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n return { isCollapsed, toggle };\n}\n","import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STORAGE_KEY","load","pageKey","raw","save","set","useCollapsedSections","collapsed","setCollapsed","useState","isCollapsed","useCallback","section","toggle","prev","next","STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","allExpanded","toggleAll","jsxDEV","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-DYyLF-Qb.js";import{a as m}from"./vendor-query-DLp59M9_.js";function p({children:r,actions:t}){return e.jsxDEV("div",{className:"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50",children:e.jsxDEV("div",{className:"flex items-center gap-2 flex-wrap",children:[r,t&&e.jsxDEV("div",{className:"ml-auto flex items-center gap-2",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:13,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:11,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:10,columnNumber:5},this)}function x({label:r,value:t,onChange:l,options:n,required:i,placeholder:s}){return e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("select",{value:t,onChange:a=>l(a.target.value),className:"select text-[11px] py-1 px-2",children:[!i&&e.jsxDEV("option",{value:"",children:s||"All"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:38,columnNumber:23},this),n.map(a=>e.jsxDEV("option",{value:a.value,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:40,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:33,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:31,columnNumber:5},this)}function b({label:r,value:t,onChange:l,placeholder:n}){const[i,s]=m.useState(t),a=m.useRef(void 0);m.useEffect(()=>{s(t)},[t]);const c=o=>{s(o),clearTimeout(a.current),a.current=setTimeout(()=>l(o),300)};return m.useEffect(()=>()=>clearTimeout(a.current),[]),e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:74,columnNumber:7},this),e.jsxDEV("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:n,className:"input text-[11px] py-1 px-2 w-48 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:75,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:73,columnNumber:5},this)}export{p as F,b as a,x as b};
2
- //# sourceMappingURL=FilterBar-CZTlrLQT.js.map
1
+ import{j as e}from"./index-BwN3KP_L.js";import{a as m}from"./vendor-query-DLp59M9_.js";function p({children:r,actions:t}){return e.jsxDEV("div",{className:"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50",children:e.jsxDEV("div",{className:"flex items-center gap-2 flex-wrap",children:[r,t&&e.jsxDEV("div",{className:"ml-auto flex items-center gap-2",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:13,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:11,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:10,columnNumber:5},this)}function x({label:r,value:t,onChange:l,options:n,required:i,placeholder:s}){return e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("select",{value:t,onChange:a=>l(a.target.value),className:"select text-[11px] py-1 px-2",children:[!i&&e.jsxDEV("option",{value:"",children:s||"All"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:38,columnNumber:23},this),n.map(a=>e.jsxDEV("option",{value:a.value,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:40,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:33,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:31,columnNumber:5},this)}function b({label:r,value:t,onChange:l,placeholder:n}){const[i,s]=m.useState(t),a=m.useRef(void 0);m.useEffect(()=>{s(t)},[t]);const c=o=>{s(o),clearTimeout(a.current),a.current=setTimeout(()=>l(o),300)};return m.useEffect(()=>()=>clearTimeout(a.current),[]),e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:74,columnNumber:7},this),e.jsxDEV("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:n,className:"input text-[11px] py-1 px-2 w-48 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:75,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:73,columnNumber:5},this)}export{p as F,b as a,x as b};
2
+ //# sourceMappingURL=FilterBar-DMTvuQy-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar-CZTlrLQT.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxDEV","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"uFAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,gBACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,OAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWC,EAAAA,OAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAD,CAAA,EAAlD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA0D,CAAA,CAAA,EAFxE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,CAEJ,CAYO,SAASE,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACEP,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,CAAA,EAAnD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACzDF,EAAAA,OAAC,SAAA,CACC,MAAAG,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAI,YAAe,OAAjC,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuC,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,OAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,MAAjB,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,CAAA,EAVH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAWA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDd,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,CAAA,EAArE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2E,EAC3EF,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,EALZ,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,CAEJ"}
1
+ {"version":3,"file":"FilterBar-DMTvuQy-.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxDEV","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"uFAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,gBACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,OAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWC,EAAAA,OAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAD,CAAA,EAAlD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA0D,CAAA,CAAA,EAFxE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,CAEJ,CAYO,SAASE,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACEP,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,CAAA,EAAnD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACzDF,EAAAA,OAAC,SAAA,CACC,MAAAG,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAI,YAAe,OAAjC,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuC,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,OAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,MAAjB,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,CAAA,EAVH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAWA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDd,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,CAAA,EAArE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2E,EAC3EF,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,EALZ,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as o,z as N}from"./index-DYyLF-Qb.js";import{a as x}from"./vendor-query-DLp59M9_.js";import{x as m,a1 as h,a2 as f,a3 as T}from"./vendor-icons-BiIug1SK.js";function E({onRefresh:d,isFetching:r=!1,apiPath:s}){const[n,l]=x.useState(null),i=(e,t)=>{navigator.clipboard.writeText(e).then(()=>{l(t),setTimeout(()=>l(null),2e3)})},u=()=>{if(!s)return;const e=`${window.location.origin}/api${s}`;i(e,"url")},b=()=>{if(!s)return;const e=`${window.location.origin}/api${s}`,t=N(),p=t?`curl -H "Authorization: Bearer ${t}" "${e}"`:`curl "${e}"`;i(p,"curl")},c="p-1.5 text-text-tertiary/70 hover:text-text-secondary transition-colors rounded",a="w-2.5 h-2.5";return o.jsxDEV("div",{className:"flex items-center gap-0.5",children:[s&&o.jsxDEV(o.Fragment,{children:[o.jsxDEV("button",{onClick:u,className:c,title:"Copy API URL",children:n==="url"?o.jsxDEV(m,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:33},this):o.jsxDEV(h,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:90},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:51,columnNumber:11},this),o.jsxDEV("button",{onClick:b,className:c,title:"Copy curl (includes auth token)",children:n==="curl"?o.jsxDEV(m,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:34},this):o.jsxDEV(f,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:91},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:54,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:50,columnNumber:9},this),o.jsxDEV("button",{onClick:d,disabled:r,className:"p-1.5 text-accent/75 hover:text-accent transition-colors disabled:opacity-50 rounded",title:"Refresh",children:o.jsxDEV(T,{className:`w-3.5 h-3.5 ${r?"animate-spin":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:60,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:59,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:48,columnNumber:5},this)}export{E as L};
2
- //# sourceMappingURL=ListToolbar-Cdbsapig.js.map
1
+ import{j as o,z as N}from"./index-BwN3KP_L.js";import{a as x}from"./vendor-query-DLp59M9_.js";import{H as m,a5 as h,a6 as f,a7 as T}from"./vendor-icons-D1DdudfH.js";function E({onRefresh:d,isFetching:r=!1,apiPath:s}){const[n,l]=x.useState(null),i=(e,t)=>{navigator.clipboard.writeText(e).then(()=>{l(t),setTimeout(()=>l(null),2e3)})},u=()=>{if(!s)return;const e=`${window.location.origin}/api${s}`;i(e,"url")},b=()=>{if(!s)return;const e=`${window.location.origin}/api${s}`,t=N(),p=t?`curl -H "Authorization: Bearer ${t}" "${e}"`:`curl "${e}"`;i(p,"curl")},c="p-1.5 text-text-tertiary/70 hover:text-text-secondary transition-colors rounded",a="w-2.5 h-2.5";return o.jsxDEV("div",{className:"flex items-center gap-0.5",children:[s&&o.jsxDEV(o.Fragment,{children:[o.jsxDEV("button",{onClick:u,className:c,title:"Copy API URL",children:n==="url"?o.jsxDEV(m,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:33},this):o.jsxDEV(h,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:90},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:51,columnNumber:11},this),o.jsxDEV("button",{onClick:b,className:c,title:"Copy curl (includes auth token)",children:n==="curl"?o.jsxDEV(m,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:34},this):o.jsxDEV(f,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:91},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:54,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:50,columnNumber:9},this),o.jsxDEV("button",{onClick:d,disabled:r,className:"p-1.5 text-accent/75 hover:text-accent transition-colors disabled:opacity-50 rounded",title:"Refresh",children:o.jsxDEV(T,{className:`w-3.5 h-3.5 ${r?"animate-spin":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:60,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:59,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:48,columnNumber:5},this)}export{E as L};
2
+ //# sourceMappingURL=ListToolbar-DTOSxoEy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListToolbar-Cdbsapig.js","sources":["../../src/components/common/data/ListToolbar.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RefreshCw, Link2, Terminal, Check } from 'lucide-react';\nimport { getToken } from '../../../api/client';\n\ninterface ListToolbarProps {\n onRefresh: () => void;\n isFetching?: boolean;\n /** API path (e.g. \"/workflow-states/jobs?limit=50\") for URL/curl copy. */\n apiPath?: string;\n}\n\ntype CopiedState = 'url' | 'curl' | null;\n\n/**\n * Toolbar for list pages: refresh, copy API URL, copy curl command.\n * Designed to sit in FilterBar `actions` slot.\n */\nexport function ListToolbar({ onRefresh, isFetching = false, apiPath }: ListToolbarProps) {\n const [copied, setCopied] = useState<CopiedState>(null);\n\n const copyToClipboard = (text: string, type: CopiedState) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(type);\n setTimeout(() => setCopied(null), 2000);\n });\n };\n\n const handleCopyUrl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n copyToClipboard(url, 'url');\n };\n\n const handleCopyCurl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n const token = getToken();\n const cmd = token\n ? `curl -H \"Authorization: Bearer ${token}\" \"${url}\"`\n : `curl \"${url}\"`;\n copyToClipboard(cmd, 'curl');\n };\n\n const BTN_SECONDARY = 'p-1.5 text-text-tertiary/70 hover:text-text-secondary transition-colors rounded';\n const ICON_SM = 'w-2.5 h-2.5';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {apiPath && (\n <>\n <button onClick={handleCopyUrl} className={BTN_SECONDARY} title=\"Copy API URL\">\n {copied === 'url' ? <Check className={`${ICON_SM} text-status-success`} /> : <Link2 className={ICON_SM} />}\n </button>\n <button onClick={handleCopyCurl} className={BTN_SECONDARY} title=\"Copy curl (includes auth token)\">\n {copied === 'curl' ? <Check className={`${ICON_SM} text-status-success`} /> : <Terminal className={ICON_SM} />}\n </button>\n </>\n )}\n <button onClick={onRefresh} disabled={isFetching} className=\"p-1.5 text-accent/75 hover:text-accent transition-colors disabled:opacity-50 rounded\" title=\"Refresh\">\n <RefreshCw className={`w-3.5 h-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n );\n}\n"],"names":["ListToolbar","onRefresh","isFetching","apiPath","copied","setCopied","useState","copyToClipboard","text","type","handleCopyUrl","url","handleCopyCurl","token","getToken","cmd","BTN_SECONDARY","ICON_SM","jsxDEV","Fragment","Check","Link2","Terminal","RefreshCw"],"mappings":"qKAiBO,SAASA,EAAY,CAAE,UAAAC,EAAW,WAAAC,EAAa,GAAO,QAAAC,GAA6B,CACxF,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,IAAI,EAEhDC,EAAkB,CAACC,EAAcC,IAAsB,CAC3D,UAAU,UAAU,UAAUD,CAAI,EAAE,KAAK,IAAM,CAC7CH,EAAUI,CAAI,EACd,WAAW,IAAMJ,EAAU,IAAI,EAAG,GAAI,CACxC,CAAC,CACH,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACP,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GACnDI,EAAgBI,EAAK,KAAK,CAC5B,EAEMC,EAAiB,IAAM,CAC3B,GAAI,CAACT,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GAC7CU,EAAQC,EAAA,EACRC,EAAMF,EACR,kCAAkCA,CAAK,MAAMF,CAAG,IAChD,SAASA,CAAG,IAChBJ,EAAgBQ,EAAK,MAAM,CAC7B,EAEMC,EAAgB,kFAChBC,EAAU,cAEhB,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAf,GACCe,EAAAA,OAAAC,WAAA,CACE,SAAA,CAAAD,SAAC,SAAA,CAAO,QAASR,EAAe,UAAWM,EAAe,MAAM,eAC7D,SAAAZ,IAAW,MAAQc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAO,sBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EAAKC,EAAAA,OAACG,EAAA,CAAM,UAAWJ,CAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EAD1G,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAC,SAAC,SAAA,CAAO,QAASN,EAAgB,UAAWI,EAAe,MAAM,kCAC9D,SAAAZ,IAAW,OAASc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAO,sBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EAAKC,EAAAA,OAACI,EAAA,CAAS,UAAWL,CAAA,EAArB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA8B,CAAA,EAD9G,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAOA,WAED,SAAA,CAAO,QAAShB,EAAW,SAAUC,EAAY,UAAU,uFAAuF,MAAM,UACvJ,kBAACqB,EAAA,CAAU,UAAW,eAAerB,EAAa,eAAiB,EAAE,IAArE,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyE,CAAA,EAD3E,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ"}
1
+ {"version":3,"file":"ListToolbar-DTOSxoEy.js","sources":["../../src/components/common/data/ListToolbar.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RefreshCw, Link2, Terminal, Check } from 'lucide-react';\nimport { getToken } from '../../../api/client';\n\ninterface ListToolbarProps {\n onRefresh: () => void;\n isFetching?: boolean;\n /** API path (e.g. \"/workflow-states/jobs?limit=50\") for URL/curl copy. */\n apiPath?: string;\n}\n\ntype CopiedState = 'url' | 'curl' | null;\n\n/**\n * Toolbar for list pages: refresh, copy API URL, copy curl command.\n * Designed to sit in FilterBar `actions` slot.\n */\nexport function ListToolbar({ onRefresh, isFetching = false, apiPath }: ListToolbarProps) {\n const [copied, setCopied] = useState<CopiedState>(null);\n\n const copyToClipboard = (text: string, type: CopiedState) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(type);\n setTimeout(() => setCopied(null), 2000);\n });\n };\n\n const handleCopyUrl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n copyToClipboard(url, 'url');\n };\n\n const handleCopyCurl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n const token = getToken();\n const cmd = token\n ? `curl -H \"Authorization: Bearer ${token}\" \"${url}\"`\n : `curl \"${url}\"`;\n copyToClipboard(cmd, 'curl');\n };\n\n const BTN_SECONDARY = 'p-1.5 text-text-tertiary/70 hover:text-text-secondary transition-colors rounded';\n const ICON_SM = 'w-2.5 h-2.5';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {apiPath && (\n <>\n <button onClick={handleCopyUrl} className={BTN_SECONDARY} title=\"Copy API URL\">\n {copied === 'url' ? <Check className={`${ICON_SM} text-status-success`} /> : <Link2 className={ICON_SM} />}\n </button>\n <button onClick={handleCopyCurl} className={BTN_SECONDARY} title=\"Copy curl (includes auth token)\">\n {copied === 'curl' ? <Check className={`${ICON_SM} text-status-success`} /> : <Terminal className={ICON_SM} />}\n </button>\n </>\n )}\n <button onClick={onRefresh} disabled={isFetching} className=\"p-1.5 text-accent/75 hover:text-accent transition-colors disabled:opacity-50 rounded\" title=\"Refresh\">\n <RefreshCw className={`w-3.5 h-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n );\n}\n"],"names":["ListToolbar","onRefresh","isFetching","apiPath","copied","setCopied","useState","copyToClipboard","text","type","handleCopyUrl","url","handleCopyCurl","token","getToken","cmd","BTN_SECONDARY","ICON_SM","jsxDEV","Fragment","Check","Link2","Terminal","RefreshCw"],"mappings":"qKAiBO,SAASA,EAAY,CAAE,UAAAC,EAAW,WAAAC,EAAa,GAAO,QAAAC,GAA6B,CACxF,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,IAAI,EAEhDC,EAAkB,CAACC,EAAcC,IAAsB,CAC3D,UAAU,UAAU,UAAUD,CAAI,EAAE,KAAK,IAAM,CAC7CH,EAAUI,CAAI,EACd,WAAW,IAAMJ,EAAU,IAAI,EAAG,GAAI,CACxC,CAAC,CACH,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACP,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GACnDI,EAAgBI,EAAK,KAAK,CAC5B,EAEMC,EAAiB,IAAM,CAC3B,GAAI,CAACT,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GAC7CU,EAAQC,EAAA,EACRC,EAAMF,EACR,kCAAkCA,CAAK,MAAMF,CAAG,IAChD,SAASA,CAAG,IAChBJ,EAAgBQ,EAAK,MAAM,CAC7B,EAEMC,EAAgB,kFAChBC,EAAU,cAEhB,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAf,GACCe,EAAAA,OAAAC,WAAA,CACE,SAAA,CAAAD,SAAC,SAAA,CAAO,QAASR,EAAe,UAAWM,EAAe,MAAM,eAC7D,SAAAZ,IAAW,MAAQc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAO,sBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EAAKC,EAAAA,OAACG,EAAA,CAAM,UAAWJ,CAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EAD1G,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAC,SAAC,SAAA,CAAO,QAASN,EAAgB,UAAWI,EAAe,MAAM,kCAC9D,SAAAZ,IAAW,OAASc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAO,sBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EAAKC,EAAAA,OAACI,EAAA,CAAS,UAAWL,CAAA,EAArB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA8B,CAAA,EAD9G,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAOA,WAED,SAAA,CAAO,QAAShB,EAAW,SAAUC,EAAY,UAAU,uFAAuF,MAAM,UACvJ,kBAACqB,EAAA,CAAU,UAAW,eAAerB,EAAa,eAAiB,EAAE,IAArE,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyE,CAAA,EAD3E,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ"}