@hotmeshio/long-tail 0.7.5 → 0.8.1

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 (364) hide show
  1. package/build/api/workflows/config.d.ts +7 -1
  2. package/build/api/workflows/config.js +7 -1
  3. package/build/api/workflows/discovery.js +1 -4
  4. package/build/lib/db/schemas/020_workflow_certified.sql +34 -0
  5. package/build/modules/ltconfig.d.ts +3 -2
  6. package/build/modules/ltconfig.js +4 -4
  7. package/build/routes/workflows/config.js +1 -0
  8. package/build/services/config/cache.js +1 -0
  9. package/build/services/config/read.js +2 -0
  10. package/build/services/config/sql.d.ts +2 -2
  11. package/build/services/config/sql.js +6 -5
  12. package/build/services/config/write.js +13 -0
  13. package/build/services/escalation/bulk.d.ts +3 -1
  14. package/build/services/escalation/bulk.js +3 -1
  15. package/build/services/escalation/crud.d.ts +4 -3
  16. package/build/services/escalation/crud.js +4 -3
  17. package/build/start/workers.js +1 -0
  18. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  19. package/build/system/mcp-servers/admin/schemas.js +3 -1
  20. package/build/system/mcp-servers/admin/workflow-config.js +1 -0
  21. package/build/types/config.d.ts +16 -0
  22. package/build/types/startup.d.ts +11 -1
  23. package/dashboard/dist/assets/AdminDashboard-Ck5-jV9T.js +2 -0
  24. package/dashboard/dist/assets/{AdminDashboard-Bgomc_jH.js.map → AdminDashboard-Ck5-jV9T.js.map} +1 -1
  25. package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js +16 -0
  26. package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js.map +1 -0
  27. package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js +4 -0
  28. package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js.map +1 -0
  29. package/dashboard/dist/assets/AgentsPage-DxwFuedf.js +2 -0
  30. package/dashboard/dist/assets/AgentsPage-DxwFuedf.js.map +1 -0
  31. package/dashboard/dist/assets/AvailableEscalationsPage-DNQbeIcn.js +2 -0
  32. package/dashboard/dist/assets/{AvailableEscalationsPage-C9DAtNGp.js.map → AvailableEscalationsPage-DNQbeIcn.js.map} +1 -1
  33. package/dashboard/dist/assets/BotPicker-mqwKVOE3.js +2 -0
  34. package/dashboard/dist/assets/{BotPicker-MnI3OyE7.js.map → BotPicker-mqwKVOE3.js.map} +1 -1
  35. package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js +2 -0
  36. package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js.map +1 -0
  37. package/dashboard/dist/assets/CollapsibleSection-Bn6Ks79X.js +2 -0
  38. package/dashboard/dist/assets/{CollapsibleSection-Ne-Q3QFM.js.map → CollapsibleSection-Bn6Ks79X.js.map} +1 -1
  39. package/dashboard/dist/assets/ConfirmDeleteModal-no0-c_1G.js +2 -0
  40. package/dashboard/dist/assets/{ConfirmDeleteModal-D9_1b4MW.js.map → ConfirmDeleteModal-no0-c_1G.js.map} +1 -1
  41. package/dashboard/dist/assets/CopyableId-DS6IDMIX.js +2 -0
  42. package/dashboard/dist/assets/{CopyableId-blg-gZvT.js.map → CopyableId-DS6IDMIX.js.map} +1 -1
  43. package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js +2 -0
  44. package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js.map +1 -0
  45. package/dashboard/dist/assets/CronLabel-DQWBx57H.js +2 -0
  46. package/dashboard/dist/assets/CronLabel-DQWBx57H.js.map +1 -0
  47. package/dashboard/dist/assets/CustomDurationPicker-DV42oZ1G.js +2 -0
  48. package/dashboard/dist/assets/{CustomDurationPicker-Cp1fgzPX.js.map → CustomDurationPicker-DV42oZ1G.js.map} +1 -1
  49. package/dashboard/dist/assets/DataTable-Bf4dgxll.js +2 -0
  50. package/dashboard/dist/assets/{DataTable-ZWgVQg7F.js.map → DataTable-Bf4dgxll.js.map} +1 -1
  51. package/dashboard/dist/assets/DropZone-CTSXBb3c.js +2 -0
  52. package/dashboard/dist/assets/{DropZone-CZDmNBn-.js.map → DropZone-CTSXBb3c.js.map} +1 -1
  53. package/dashboard/dist/assets/ElapsedCell-roy4G5SQ.js +2 -0
  54. package/dashboard/dist/assets/{ElapsedCell-Gr5UlUbn.js.map → ElapsedCell-roy4G5SQ.js.map} +1 -1
  55. package/dashboard/dist/assets/EmptyState-CLVm9KmA.js +2 -0
  56. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-CLVm9KmA.js.map} +1 -1
  57. package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js +9 -0
  58. package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js.map +1 -0
  59. package/dashboard/dist/assets/EscalationsOverview-DDwxn_mT.js +2 -0
  60. package/dashboard/dist/assets/{EscalationsOverview-BIZVnSBF.js.map → EscalationsOverview-DDwxn_mT.js.map} +1 -1
  61. package/dashboard/dist/assets/EventTable-BaLNvCew.js +2 -0
  62. package/dashboard/dist/assets/EventTable-BaLNvCew.js.map +1 -0
  63. package/dashboard/dist/assets/FilterBar-DEAbNQqp.js +2 -0
  64. package/dashboard/dist/assets/FilterBar-DEAbNQqp.js.map +1 -0
  65. package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js +2 -0
  66. package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js.map +1 -0
  67. package/dashboard/dist/assets/HomePage-Ds3PzWWr.js +2 -0
  68. package/dashboard/dist/assets/HomePage-Ds3PzWWr.js.map +1 -0
  69. package/dashboard/dist/assets/ListToolbar-Dviaskni.js +2 -0
  70. package/dashboard/dist/assets/{ListToolbar-CdmIvEIF.js.map → ListToolbar-Dviaskni.js.map} +1 -1
  71. package/dashboard/dist/assets/McpOverview-BBm66wbF.js +2 -0
  72. package/dashboard/dist/assets/{McpOverview-C-Ypezuv.js.map → McpOverview-BBm66wbF.js.map} +1 -1
  73. package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js +5 -0
  74. package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js.map +1 -0
  75. package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js +2 -0
  76. package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js.map +1 -0
  77. package/dashboard/dist/assets/McpRunDetailPage-CSq_0qqi.js +2 -0
  78. package/dashboard/dist/assets/{McpRunDetailPage-B1sCxKLD.js.map → McpRunDetailPage-CSq_0qqi.js.map} +1 -1
  79. package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js +2 -0
  80. package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js.map +1 -0
  81. package/dashboard/dist/assets/Modal-C6HI6btY.js +2 -0
  82. package/dashboard/dist/assets/{Modal-CSrxpXeM.js.map → Modal-C6HI6btY.js.map} +1 -1
  83. package/dashboard/dist/assets/NamespacePill-eGsbJBFa.js +2 -0
  84. package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js.map → NamespacePill-eGsbJBFa.js.map} +1 -1
  85. package/dashboard/dist/assets/OperationsPage-DODPFmf2.js +2 -0
  86. package/dashboard/dist/assets/OperationsPage-DODPFmf2.js.map +1 -0
  87. package/dashboard/dist/assets/OperatorDashboard-BbmgsOmQ.js +2 -0
  88. package/dashboard/dist/assets/{OperatorDashboard-YP6kP-f_.js.map → OperatorDashboard-BbmgsOmQ.js.map} +1 -1
  89. package/dashboard/dist/assets/PageHeader-DcgGV0Y2.js +2 -0
  90. package/dashboard/dist/assets/{PageHeader-CFta2VaS.js.map → PageHeader-DcgGV0Y2.js.map} +1 -1
  91. package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js +2 -0
  92. package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js.map +1 -0
  93. package/dashboard/dist/assets/PriorityBadge-a7u8C9uY.js +2 -0
  94. package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js.map → PriorityBadge-a7u8C9uY.js.map} +1 -1
  95. package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js +2 -0
  96. package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js.map +1 -0
  97. package/dashboard/dist/assets/ProcessesListPage-BjW5xUkv.js +2 -0
  98. package/dashboard/dist/assets/{ProcessesListPage-BNhFwTLl.js.map → ProcessesListPage-BjW5xUkv.js.map} +1 -1
  99. package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js +11 -0
  100. package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js.map +1 -0
  101. package/dashboard/dist/assets/RolePill-BAeaQUXX.js +2 -0
  102. package/dashboard/dist/assets/RolePill-BAeaQUXX.js.map +1 -0
  103. package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js +2 -0
  104. package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js.map +1 -0
  105. package/dashboard/dist/assets/RowActions--m4F6GW8.js +2 -0
  106. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions--m4F6GW8.js.map} +1 -1
  107. package/dashboard/dist/assets/RunAsSelector-DiGzSfiG.js +2 -0
  108. package/dashboard/dist/assets/{RunAsSelector-CokM3Ifp.js.map → RunAsSelector-DiGzSfiG.js.map} +1 -1
  109. package/dashboard/dist/assets/StatCard-DCPGFzCv.js +2 -0
  110. package/dashboard/dist/assets/StatCard-DCPGFzCv.js.map +1 -0
  111. package/dashboard/dist/assets/StatusBadge-mk-dJwPT.js +2 -0
  112. package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js.map → StatusBadge-mk-dJwPT.js.map} +1 -1
  113. package/dashboard/dist/assets/StickyPagination-Clm9H840.js +2 -0
  114. package/dashboard/dist/assets/{StickyPagination-_H2j2CAH.js.map → StickyPagination-Clm9H840.js.map} +1 -1
  115. package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js +2 -0
  116. package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js.map +1 -0
  117. package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js +2 -0
  118. package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js.map +1 -0
  119. package/dashboard/dist/assets/TagInput-DmJLnghg.js +2 -0
  120. package/dashboard/dist/assets/{TagInput-CQg-TrV9.js.map → TagInput-DmJLnghg.js.map} +1 -1
  121. package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js +2 -0
  122. package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js.map +1 -0
  123. package/dashboard/dist/assets/TaskQueuePill--1OX6egx.js +2 -0
  124. package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js.map → TaskQueuePill--1OX6egx.js.map} +1 -1
  125. package/dashboard/dist/assets/TasksListPage-DcYV-GMA.js +2 -0
  126. package/dashboard/dist/assets/{TasksListPage-B71FxvrY.js.map → TasksListPage-DcYV-GMA.js.map} +1 -1
  127. package/dashboard/dist/assets/TimeAgo-pYn3T9IZ.js +2 -0
  128. package/dashboard/dist/assets/{TimeAgo-JgT0U_sd.js.map → TimeAgo-pYn3T9IZ.js.map} +1 -1
  129. package/dashboard/dist/assets/TimestampCell-BPMCscic.js +2 -0
  130. package/dashboard/dist/assets/{TimestampCell-gEreK8Nn.js.map → TimestampCell-BPMCscic.js.map} +1 -1
  131. package/dashboard/dist/assets/ToolPill-BnF9lCUX.js +2 -0
  132. package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js.map → ToolPill-BnF9lCUX.js.map} +1 -1
  133. package/dashboard/dist/assets/ToolTestPanel-Bw4z_Tya.js +2 -0
  134. package/dashboard/dist/assets/{ToolTestPanel-ChfHw9Aq.js.map → ToolTestPanel-Bw4z_Tya.js.map} +1 -1
  135. package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js +9 -0
  136. package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js.map +1 -0
  137. package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js +2 -0
  138. package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js.map +1 -0
  139. package/dashboard/dist/assets/UserName-R96NG6xB.js +2 -0
  140. package/dashboard/dist/assets/{UserName-uncbaKYf.js.map → UserName-R96NG6xB.js.map} +1 -1
  141. package/dashboard/dist/assets/WorkflowExecutionPage-DmRJabMQ.js +2 -0
  142. package/dashboard/dist/assets/{WorkflowExecutionPage-DwzLKTkt.js.map → WorkflowExecutionPage-DmRJabMQ.js.map} +1 -1
  143. package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js +2 -0
  144. package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js.map +1 -0
  145. package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js +2 -0
  146. package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js.map +1 -0
  147. package/dashboard/dist/assets/WorkflowsOverview-BhgE0RS8.js +2 -0
  148. package/dashboard/dist/assets/{WorkflowsOverview-ihhW8DiS.js.map → WorkflowsOverview-BhgE0RS8.js.map} +1 -1
  149. package/dashboard/dist/assets/YamlWorkflowDetailPage-CvIgB5y7.js +33 -0
  150. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C61-8y-E.js.map → YamlWorkflowDetailPage-CvIgB5y7.js.map} +1 -1
  151. package/dashboard/dist/assets/YamlWorkflowsPage-DWnsgl2v.js +2 -0
  152. package/dashboard/dist/assets/{YamlWorkflowsPage-CMpgsLEo.js.map → YamlWorkflowsPage-DWnsgl2v.js.map} +1 -1
  153. package/dashboard/dist/assets/{agents-27sErp5R.js → agents-BpYMwrsB.js} +2 -2
  154. package/dashboard/dist/assets/{agents-27sErp5R.js.map → agents-BpYMwrsB.js.map} +1 -1
  155. package/dashboard/dist/assets/{bots-CPHuAvjW.js → bots-DI6Wqp5X.js} +2 -2
  156. package/dashboard/dist/assets/{bots-CPHuAvjW.js.map → bots-DI6Wqp5X.js.map} +1 -1
  157. package/dashboard/dist/assets/capabilities-BKZZb8eM.js +2 -0
  158. package/dashboard/dist/assets/{capabilities-BBTPqF-V.js.map → capabilities-BKZZb8eM.js.map} +1 -1
  159. package/dashboard/dist/assets/{controlplane-C9j2mwX8.js → controlplane-Djshb7fm.js} +2 -2
  160. package/dashboard/dist/assets/{controlplane-C9j2mwX8.js.map → controlplane-Djshb7fm.js.map} +1 -1
  161. package/dashboard/dist/assets/escalation-D8mrXtjS.js +2 -0
  162. package/dashboard/dist/assets/{escalation-CyJ_wz-f.js.map → escalation-D8mrXtjS.js.map} +1 -1
  163. package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js +2 -0
  164. package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js.map +1 -0
  165. package/dashboard/dist/assets/index-B5MAG4Uv.js +2 -0
  166. package/dashboard/dist/assets/{index-CCHGKErT.js.map → index-B5MAG4Uv.js.map} +1 -1
  167. package/dashboard/dist/assets/index-BfxiRwk2.js +6 -0
  168. package/dashboard/dist/assets/index-BfxiRwk2.js.map +1 -0
  169. package/dashboard/dist/assets/index-C71I-f5G.js +2 -0
  170. package/dashboard/dist/assets/{index-D9pi0fs6.js.map → index-C71I-f5G.js.map} +1 -1
  171. package/dashboard/dist/assets/index-CC4g-6QE.css +1 -0
  172. package/dashboard/dist/assets/index-CJb3dXku.js +2 -0
  173. package/dashboard/dist/assets/index-CJb3dXku.js.map +1 -0
  174. package/dashboard/dist/assets/index-CQtv2rj6.js +2 -0
  175. package/dashboard/dist/assets/index-CQtv2rj6.js.map +1 -0
  176. package/dashboard/dist/assets/index-CphzO7b8.js +2 -0
  177. package/dashboard/dist/assets/{index-CNprOGuS.js.map → index-CphzO7b8.js.map} +1 -1
  178. package/dashboard/dist/assets/index-CwAmiy_j.js +2 -0
  179. package/dashboard/dist/assets/index-CwAmiy_j.js.map +1 -0
  180. package/dashboard/dist/assets/index-DgCS2Frb.js +281 -0
  181. package/dashboard/dist/assets/index-DgCS2Frb.js.map +1 -0
  182. package/dashboard/dist/assets/index-DkbnD-Te.js +2 -0
  183. package/dashboard/dist/assets/{index-Dzqt3g-K.js.map → index-DkbnD-Te.js.map} +1 -1
  184. package/dashboard/dist/assets/index-Y6yj36QR.js +9 -0
  185. package/dashboard/dist/assets/index-Y6yj36QR.js.map +1 -0
  186. package/dashboard/dist/assets/index-eshNd6NY.js +6 -0
  187. package/dashboard/dist/assets/{index-BiLZJ43R.js.map → index-eshNd6NY.js.map} +1 -1
  188. package/dashboard/dist/assets/index-xn9fmkHC.js +2 -0
  189. package/dashboard/dist/assets/index-xn9fmkHC.js.map +1 -0
  190. package/dashboard/dist/assets/index-yxnQew1X.js +2 -0
  191. package/dashboard/dist/assets/index-yxnQew1X.js.map +1 -0
  192. package/dashboard/dist/assets/{knowledge-BErJA3Je.js → knowledge-C_1r0faY.js} +2 -2
  193. package/dashboard/dist/assets/{knowledge-BErJA3Je.js.map → knowledge-C_1r0faY.js.map} +1 -1
  194. package/dashboard/dist/assets/{mcp-Cx9L42EN.js → mcp-BtG54ZAx.js} +2 -2
  195. package/dashboard/dist/assets/{mcp-Cx9L42EN.js.map → mcp-BtG54ZAx.js.map} +1 -1
  196. package/dashboard/dist/assets/{mcp-query-Cf6kcBoW.js → mcp-query-CSdQWxmv.js} +2 -2
  197. package/dashboard/dist/assets/{mcp-query-Cf6kcBoW.js.map → mcp-query-CSdQWxmv.js.map} +1 -1
  198. package/dashboard/dist/assets/{pipelines-CFctrv71.js → pipelines-DVkwxN64.js} +2 -2
  199. package/dashboard/dist/assets/{pipelines-CFctrv71.js.map → pipelines-DVkwxN64.js.map} +1 -1
  200. package/dashboard/dist/assets/{roles-CCXZtqDr.js → roles-CpRcUIMm.js} +2 -2
  201. package/dashboard/dist/assets/{roles-CCXZtqDr.js.map → roles-CpRcUIMm.js.map} +1 -1
  202. package/dashboard/dist/assets/{tasks-BPNj8ZWL.js → tasks-DNdvW5H6.js} +2 -2
  203. package/dashboard/dist/assets/{tasks-BPNj8ZWL.js.map → tasks-DNdvW5H6.js.map} +1 -1
  204. package/dashboard/dist/assets/{topics-CR4UBuSV.js → topics-DNC77Chw.js} +2 -2
  205. package/dashboard/dist/assets/{topics-CR4UBuSV.js.map → topics-DNC77Chw.js.map} +1 -1
  206. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
  207. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
  208. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-DmL3uNt_.js} +2 -2
  209. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-DmL3uNt_.js.map} +1 -1
  210. package/dashboard/dist/assets/{useEventHooks-BgdnN8Rj.js → useEventHooks-CUUeBSH1.js} +2 -2
  211. package/dashboard/dist/assets/{useEventHooks-BgdnN8Rj.js.map → useEventHooks-CUUeBSH1.js.map} +1 -1
  212. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js → useFilterParams-Ch-a71bE.js} +2 -2
  213. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js.map → useFilterParams-Ch-a71bE.js.map} +1 -1
  214. package/dashboard/dist/assets/{useNamespace-BDsKfT0f.js → useNamespace-D-AjLnPK.js} +2 -2
  215. package/dashboard/dist/assets/{useNamespace-BDsKfT0f.js.map → useNamespace-D-AjLnPK.js.map} +1 -1
  216. package/dashboard/dist/assets/{useYamlActivityEvents-CWZwHIlR.js → useYamlActivityEvents-DRdetOb_.js} +2 -2
  217. package/dashboard/dist/assets/{useYamlActivityEvents-CWZwHIlR.js.map → useYamlActivityEvents-DRdetOb_.js.map} +1 -1
  218. package/dashboard/dist/assets/{users-BqmKVXR1.js → users-BUgdEsec.js} +2 -2
  219. package/dashboard/dist/assets/{users-BqmKVXR1.js.map → users-BUgdEsec.js.map} +1 -1
  220. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js → vendor-icons-CNyYGNsk.js} +3 -3
  221. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js.map → vendor-icons-CNyYGNsk.js.map} +1 -1
  222. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  223. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  224. package/dashboard/dist/assets/vendor-react-zA2lQFDs.js +26 -0
  225. package/dashboard/dist/assets/vendor-react-zA2lQFDs.js.map +1 -0
  226. package/dashboard/dist/assets/{workflows-Dps45zjk.js → workflows-BfyR5VJt.js} +2 -2
  227. package/dashboard/dist/assets/workflows-BfyR5VJt.js.map +1 -0
  228. package/dashboard/dist/assets/{yaml-workflows-DhlTkbvY.js → yaml-workflows-Bz7yEnhl.js} +2 -2
  229. package/dashboard/dist/assets/{yaml-workflows-DhlTkbvY.js.map → yaml-workflows-Bz7yEnhl.js.map} +1 -1
  230. package/dashboard/dist/index.html +5 -5
  231. package/docs/api/http/escalations.md +3 -3
  232. package/docs/api/http/workflows.md +2 -1
  233. package/docs/api/mcp/admin.md +13 -7
  234. package/docs/api/sdk/escalations.md +3 -1
  235. package/docs/api/sdk/workflows.md +3 -2
  236. package/docs/architecture.md +2 -2
  237. package/docs/dashboard.md +6 -5
  238. package/docs/iam.md +3 -3
  239. package/docs/workflows.md +7 -5
  240. package/package.json +2 -2
  241. package/dashboard/dist/assets/AdminDashboard-Bgomc_jH.js +0 -2
  242. package/dashboard/dist/assets/AgentConfigPage-C6gDgz21.js +0 -16
  243. package/dashboard/dist/assets/AgentConfigPage-C6gDgz21.js.map +0 -1
  244. package/dashboard/dist/assets/AgentDetailPage-0rrH5FmV.js +0 -4
  245. package/dashboard/dist/assets/AgentDetailPage-0rrH5FmV.js.map +0 -1
  246. package/dashboard/dist/assets/AgentsPage-DkIU2zed.js +0 -2
  247. package/dashboard/dist/assets/AgentsPage-DkIU2zed.js.map +0 -1
  248. package/dashboard/dist/assets/AvailableEscalationsPage-C9DAtNGp.js +0 -2
  249. package/dashboard/dist/assets/BotPicker-MnI3OyE7.js +0 -2
  250. package/dashboard/dist/assets/CapabilitiesPage-Cv_AD_5i.js +0 -2
  251. package/dashboard/dist/assets/CapabilitiesPage-Cv_AD_5i.js.map +0 -1
  252. package/dashboard/dist/assets/CollapsibleSection-Ne-Q3QFM.js +0 -2
  253. package/dashboard/dist/assets/ConfirmDeleteModal-D9_1b4MW.js +0 -2
  254. package/dashboard/dist/assets/CopyableId-blg-gZvT.js +0 -2
  255. package/dashboard/dist/assets/CredentialsPage-B3Mfwl22.js +0 -2
  256. package/dashboard/dist/assets/CredentialsPage-B3Mfwl22.js.map +0 -1
  257. package/dashboard/dist/assets/CronLabel-CtjUBRPo.js +0 -2
  258. package/dashboard/dist/assets/CronLabel-CtjUBRPo.js.map +0 -1
  259. package/dashboard/dist/assets/CustomDurationPicker-Cp1fgzPX.js +0 -2
  260. package/dashboard/dist/assets/DataTable-ZWgVQg7F.js +0 -2
  261. package/dashboard/dist/assets/DropZone-CZDmNBn-.js +0 -2
  262. package/dashboard/dist/assets/ElapsedCell-Gr5UlUbn.js +0 -2
  263. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  264. package/dashboard/dist/assets/EscalationSchemaPage-C5tuV6SJ.js +0 -9
  265. package/dashboard/dist/assets/EscalationSchemaPage-C5tuV6SJ.js.map +0 -1
  266. package/dashboard/dist/assets/EscalationsOverview-BIZVnSBF.js +0 -2
  267. package/dashboard/dist/assets/EventTable-90aUfsNr.js +0 -2
  268. package/dashboard/dist/assets/EventTable-90aUfsNr.js.map +0 -1
  269. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js +0 -2
  270. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js.map +0 -1
  271. package/dashboard/dist/assets/GraphInvokePage-Io5ZucT8.js +0 -2
  272. package/dashboard/dist/assets/GraphInvokePage-Io5ZucT8.js.map +0 -1
  273. package/dashboard/dist/assets/HomePage-Cu0vUzTF.js +0 -2
  274. package/dashboard/dist/assets/HomePage-Cu0vUzTF.js.map +0 -1
  275. package/dashboard/dist/assets/ListToolbar-CdmIvEIF.js +0 -2
  276. package/dashboard/dist/assets/McpOverview-C-Ypezuv.js +0 -2
  277. package/dashboard/dist/assets/McpQueryDetailPage-DdontKcj.js +0 -5
  278. package/dashboard/dist/assets/McpQueryDetailPage-DdontKcj.js.map +0 -1
  279. package/dashboard/dist/assets/McpQueryPage-D-1TaOGG.js +0 -2
  280. package/dashboard/dist/assets/McpQueryPage-D-1TaOGG.js.map +0 -1
  281. package/dashboard/dist/assets/McpRunDetailPage-B1sCxKLD.js +0 -2
  282. package/dashboard/dist/assets/McpRunsPage-eWJ7cDa3.js +0 -2
  283. package/dashboard/dist/assets/McpRunsPage-eWJ7cDa3.js.map +0 -1
  284. package/dashboard/dist/assets/Modal-CSrxpXeM.js +0 -2
  285. package/dashboard/dist/assets/NamespacePill-DlqBTvFR.js +0 -2
  286. package/dashboard/dist/assets/OperationsPage-C5phWL0O.js +0 -2
  287. package/dashboard/dist/assets/OperationsPage-C5phWL0O.js.map +0 -1
  288. package/dashboard/dist/assets/OperatorDashboard-YP6kP-f_.js +0 -2
  289. package/dashboard/dist/assets/PageHeader-CFta2VaS.js +0 -2
  290. package/dashboard/dist/assets/PageHeaderWithStats-CcVAji-7.js +0 -2
  291. package/dashboard/dist/assets/PageHeaderWithStats-CcVAji-7.js.map +0 -1
  292. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +0 -2
  293. package/dashboard/dist/assets/ProcessDetailPage-C_BXQvBs.js +0 -2
  294. package/dashboard/dist/assets/ProcessDetailPage-C_BXQvBs.js.map +0 -1
  295. package/dashboard/dist/assets/ProcessesListPage-BNhFwTLl.js +0 -2
  296. package/dashboard/dist/assets/RoleDetailPage-8GLNjj9I.js +0 -11
  297. package/dashboard/dist/assets/RoleDetailPage-8GLNjj9I.js.map +0 -1
  298. package/dashboard/dist/assets/RolePill-CXEyPMqb.js +0 -2
  299. package/dashboard/dist/assets/RolePill-CXEyPMqb.js.map +0 -1
  300. package/dashboard/dist/assets/RolesPage-B59tE2lZ.js +0 -2
  301. package/dashboard/dist/assets/RolesPage-B59tE2lZ.js.map +0 -1
  302. package/dashboard/dist/assets/RowActions-BA9L9djf.js +0 -2
  303. package/dashboard/dist/assets/RunAsSelector-CokM3Ifp.js +0 -2
  304. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  305. package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +0 -1
  306. package/dashboard/dist/assets/StatusBadge-D9MeQHrh.js +0 -2
  307. package/dashboard/dist/assets/StickyPagination-_H2j2CAH.js +0 -2
  308. package/dashboard/dist/assets/StreamMessageDetail-sSfHDYIa.js +0 -2
  309. package/dashboard/dist/assets/StreamMessageDetail-sSfHDYIa.js.map +0 -1
  310. package/dashboard/dist/assets/SwimlaneTimeline-LZWtfBK3.js +0 -2
  311. package/dashboard/dist/assets/SwimlaneTimeline-LZWtfBK3.js.map +0 -1
  312. package/dashboard/dist/assets/TagInput-CQg-TrV9.js +0 -2
  313. package/dashboard/dist/assets/TaskDetailPage-CHBV2V6R.js +0 -2
  314. package/dashboard/dist/assets/TaskDetailPage-CHBV2V6R.js.map +0 -1
  315. package/dashboard/dist/assets/TaskQueuePill-DyvtL8X4.js +0 -2
  316. package/dashboard/dist/assets/TasksListPage-B71FxvrY.js +0 -2
  317. package/dashboard/dist/assets/TimeAgo-JgT0U_sd.js +0 -2
  318. package/dashboard/dist/assets/TimestampCell-gEreK8Nn.js +0 -2
  319. package/dashboard/dist/assets/ToolPill-miuRcj1Q.js +0 -2
  320. package/dashboard/dist/assets/ToolTestPanel-ChfHw9Aq.js +0 -2
  321. package/dashboard/dist/assets/TopicDetailPage-DigI0HGt.js +0 -9
  322. package/dashboard/dist/assets/TopicDetailPage-DigI0HGt.js.map +0 -1
  323. package/dashboard/dist/assets/TopicsPage-BHjlFpPN.js +0 -2
  324. package/dashboard/dist/assets/TopicsPage-BHjlFpPN.js.map +0 -1
  325. package/dashboard/dist/assets/UserName-uncbaKYf.js +0 -2
  326. package/dashboard/dist/assets/WorkflowExecutionPage-DwzLKTkt.js +0 -2
  327. package/dashboard/dist/assets/WorkflowPill-BegV-iRF.js +0 -2
  328. package/dashboard/dist/assets/WorkflowPill-BegV-iRF.js.map +0 -1
  329. package/dashboard/dist/assets/WorkflowsDashboard-rpnGhGnl.js +0 -2
  330. package/dashboard/dist/assets/WorkflowsDashboard-rpnGhGnl.js.map +0 -1
  331. package/dashboard/dist/assets/WorkflowsOverview-ihhW8DiS.js +0 -2
  332. package/dashboard/dist/assets/YamlWorkflowDetailPage-C61-8y-E.js +0 -33
  333. package/dashboard/dist/assets/YamlWorkflowsPage-CMpgsLEo.js +0 -2
  334. package/dashboard/dist/assets/capabilities-BBTPqF-V.js +0 -2
  335. package/dashboard/dist/assets/escalation-CyJ_wz-f.js +0 -2
  336. package/dashboard/dist/assets/escalation-columns-DU4Jyxxo.js +0 -2
  337. package/dashboard/dist/assets/escalation-columns-DU4Jyxxo.js.map +0 -1
  338. package/dashboard/dist/assets/index-BBQggGcf.js +0 -2
  339. package/dashboard/dist/assets/index-BBQggGcf.js.map +0 -1
  340. package/dashboard/dist/assets/index-BHS-ubrT.js +0 -6
  341. package/dashboard/dist/assets/index-BHS-ubrT.js.map +0 -1
  342. package/dashboard/dist/assets/index-BVHXREYZ.js +0 -2
  343. package/dashboard/dist/assets/index-BVHXREYZ.js.map +0 -1
  344. package/dashboard/dist/assets/index-BiLZJ43R.js +0 -6
  345. package/dashboard/dist/assets/index-BoZydcaW.js +0 -63
  346. package/dashboard/dist/assets/index-BoZydcaW.js.map +0 -1
  347. package/dashboard/dist/assets/index-CCHGKErT.js +0 -2
  348. package/dashboard/dist/assets/index-CNprOGuS.js +0 -2
  349. package/dashboard/dist/assets/index-CZ6-l8_0.css +0 -1
  350. package/dashboard/dist/assets/index-CgeFUhUr.js +0 -2
  351. package/dashboard/dist/assets/index-CgeFUhUr.js.map +0 -1
  352. package/dashboard/dist/assets/index-ChniBGqD.js +0 -9
  353. package/dashboard/dist/assets/index-ChniBGqD.js.map +0 -1
  354. package/dashboard/dist/assets/index-CjXzZ19T.js +0 -2
  355. package/dashboard/dist/assets/index-CjXzZ19T.js.map +0 -1
  356. package/dashboard/dist/assets/index-D9pi0fs6.js +0 -2
  357. package/dashboard/dist/assets/index-DoivEaUZ.js +0 -2
  358. package/dashboard/dist/assets/index-DoivEaUZ.js.map +0 -1
  359. package/dashboard/dist/assets/index-Dzqt3g-K.js +0 -2
  360. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  361. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  362. package/dashboard/dist/assets/vendor-react-CXumBFUA.js +0 -22
  363. package/dashboard/dist/assets/vendor-react-CXumBFUA.js.map +0 -1
  364. package/dashboard/dist/assets/workflows-Dps45zjk.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-DgCS2Frb.js";import{M as r}from"./Modal-C6HI6btY.js";function c({open:a,onClose:o,onConfirm:t,title:l,description:n,isPending:m,error:s}){return e.jsxDEV(r,{open:a,onClose:o,title:l,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:26,columnNumber:9},this),s&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.message},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:27,columnNumber:19},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:o,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:29,columnNumber:11},this),e.jsxDEV("button",{onClick:t,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:m,children:m?"Deleting...":"Delete"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:28,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:25,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:24,columnNumber:5},this)}export{c as C};
2
+ //# sourceMappingURL=ConfirmDeleteModal-no0-c_1G.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDeleteModal-D9_1b4MW.js","sources":["../../src/components/common/modal/ConfirmDeleteModal.tsx"],"sourcesContent":["import { Modal } from './Modal';\nimport type { ReactNode } from 'react';\n\ninterface ConfirmDeleteModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description: ReactNode;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmDeleteModal({\n open,\n onClose,\n onConfirm,\n title,\n description,\n isPending,\n error,\n}: ConfirmDeleteModalProps) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{description}</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n"],"names":["ConfirmDeleteModal","open","onClose","onConfirm","title","description","isPending","error","jsx","Modal","jsxs"],"mappings":"uFAaO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,OACEC,EAAAA,IAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAE,EACnC,SAAAM,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,EAAY,EACvDE,GAASC,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,QAAQ,EAClEE,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASN,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAM,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,UAAU,gGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
1
+ {"version":3,"file":"ConfirmDeleteModal-no0-c_1G.js","sources":["../../src/components/common/modal/ConfirmDeleteModal.tsx"],"sourcesContent":["import { Modal } from './Modal';\nimport type { ReactNode } from 'react';\n\ninterface ConfirmDeleteModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description: ReactNode;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmDeleteModal({\n open,\n onClose,\n onConfirm,\n title,\n description,\n isPending,\n error,\n}: ConfirmDeleteModalProps) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{description}</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n"],"names":["ConfirmDeleteModal","open","onClose","onConfirm","title","description","isPending","error","jsxDEV","Modal"],"mappings":"gFAaO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,OACEC,EAAAA,OAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAE,EACnC,SAAAI,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAwD,EACvDE,GAASC,EAAAA,OAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,SAAhD,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwD,EAClEA,EAAAA,OAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAASN,EAAS,UAAU,wBAAwB,SAAA,UAA5D,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAM,EAAAA,OAAC,SAAA,CACC,QAASL,EACT,UAAU,gGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,EAL/B,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAWA,CAAA,CAAA,EAdF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAeA,CAAA,EAhBF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-DgCS2Frb.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{c as h}from"./vendor-react-zA2lQFDs.js";const x=20;function m(t,o=x){if(t.length<=o)return t;const s=Math.floor((o-1)/2);return`${t.slice(0,s)}…${t.slice(-s)}`}function v({label:t,value:o,href:s,external:c,bare:p}){const[i,r]=b.useState(!1),d=h();if(!o)return null;const a=n=>{n.stopPropagation(),navigator.clipboard.writeText(o),r(!0),setTimeout(()=>r(!1),1500)},u=n=>{n.stopPropagation(),s&&(c?window.open(s,"_blank","noopener,noreferrer"):d(s))},l=e.jsxDEV(e.Fragment,{children:[e.jsxDEV("button",{onClick:a,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:e.jsxDEV("svg",{className:`w-3 h-3 transition-colors ${i?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:i?e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:48,columnNumber:15},this):e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:49,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:46,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:45,columnNumber:7},this),s&&e.jsxDEV("button",{onClick:u,title:`View ${t??"link"}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:e.jsxDEV("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:56,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:55,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:44,columnNumber:5},this);return p?e.jsxDEV("span",{className:"flex items-center gap-1 group relative",children:[e.jsxDEV("button",{onClick:a,title:o,className:"font-mono text-text-primary group-hover:text-accent transition-colors",children:m(o)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:66,columnNumber:9},this),l]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:65,columnNumber:7},this):e.jsxDEV("div",{className:"text-left group relative",children:[e.jsxDEV("span",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:76,columnNumber:7},this),e.jsxDEV("span",{className:"flex items-center gap-1 mt-0.5",children:[e.jsxDEV("button",{onClick:a,title:o,className:"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors",children:m(o)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:78,columnNumber:9},this),l]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:77,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:75,columnNumber:5},this)}export{v as C};
2
+ //# sourceMappingURL=CopyableId-DS6IDMIX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CopyableId-blg-gZvT.js","sources":["../../src/components/common/display/CopyableId.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nconst ELLIPSIS_MAX = 20;\n\nfunction centerEllipsis(s: string, max = ELLIPSIS_MAX): string {\n if (s.length <= max) return s;\n const side = Math.floor((max - 1) / 2);\n return `${s.slice(0, side)}…${s.slice(-side)}`;\n}\n\ninterface CopyableIdProps {\n label?: string;\n value: string | null | undefined;\n href?: string;\n external?: boolean;\n /** Render only the value row (copy/navigate), without the built-in label. */\n bare?: boolean;\n}\n\nexport function CopyableId({ label, value, href, external, bare }: CopyableIdProps) {\n const [copied, setCopied] = useState(false);\n const navigate = useNavigate();\n if (!value) return null;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNavigate = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) return;\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n navigate(href);\n }\n };\n\n const valueButtons = (\n <>\n <button onClick={handleCopy} title=\"Copy\" className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-text-primary'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n {href && (\n <button onClick={handleNavigate} title={`View ${label ?? 'link'}`} className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n )}\n </>\n );\n\n if (bare) {\n return (\n <span className=\"flex items-center gap-1 group relative\">\n <button onClick={handleCopy} title={value} className=\"font-mono text-text-primary group-hover:text-accent transition-colors\">\n {centerEllipsis(value)}\n </button>\n {valueButtons}\n </span>\n );\n }\n\n return (\n <div className=\"text-left group relative\">\n <span className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">{label}</span>\n <span className=\"flex items-center gap-1 mt-0.5\">\n <button onClick={handleCopy} title={value} className=\"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors\">\n {centerEllipsis(value)}\n </button>\n {valueButtons}\n </span>\n </div>\n );\n}\n"],"names":["ELLIPSIS_MAX","centerEllipsis","s","max","side","CopyableId","label","value","href","external","bare","copied","setCopied","useState","navigate","useNavigate","handleCopy","e","handleNavigate","valueButtons","jsxs","Fragment","jsx"],"mappings":"qGAGA,MAAMA,EAAe,GAErB,SAASC,EAAeC,EAAWC,EAAMH,EAAsB,CAC7D,GAAIE,EAAE,QAAUC,EAAK,OAAOD,EAC5B,MAAME,EAAO,KAAK,OAAOD,EAAM,GAAK,CAAC,EACrC,MAAO,GAAGD,EAAE,MAAM,EAAGE,CAAI,CAAC,IAAIF,EAAE,MAAM,CAACE,CAAI,CAAC,EAC9C,CAWO,SAASC,EAAW,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,EAAM,SAAAC,EAAU,KAAAC,GAAyB,CAClF,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAWC,EAAA,EACjB,GAAI,CAACR,EAAO,OAAO,KAEnB,MAAMS,EAAcC,GAAwB,CAC1CA,EAAE,gBAAA,EACF,UAAU,UAAU,UAAUV,CAAK,EACnCK,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,IAAI,CACzC,EAEMM,EAAkBD,GAAwB,CAC9CA,EAAE,gBAAA,EACGT,IACDC,EACF,OAAO,KAAKD,EAAM,SAAU,qBAAqB,EAEjDM,EAASN,CAAI,EAEjB,EAEMW,EACJC,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAC,EAAAA,IAAC,UAAO,QAASN,EAAY,MAAM,OAAO,UAAU,sEAClD,SAAAM,EAAAA,IAAC,MAAA,CAAI,UAAW,6BAA6BX,EAAS,sBAAwB,4CAA4C,GAAI,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC9L,WACGW,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,iBAAiB,EACtEA,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uIAAuI,EAElM,CAAA,CACF,EACCd,GACCc,EAAAA,IAAC,SAAA,CAAO,QAASJ,EAAgB,MAAO,QAAQZ,GAAS,MAAM,GAAI,UAAU,sEAC3E,SAAAgB,EAAAA,IAAC,OAAI,UAAU,+CAA+C,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC/H,SAAAA,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,CAAuI,EAC9L,CAAA,CACF,CAAA,EAEJ,EAGF,OAAIZ,EAEAU,EAAAA,KAAC,OAAA,CAAK,UAAU,yCACd,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO,QAASN,EAAY,MAAOT,EAAO,UAAU,wEAClD,SAAAN,EAAeM,CAAK,CAAA,CACvB,EACCY,CAAA,EACH,EAKFC,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,sEAAuE,SAAAhB,EAAM,EAC7Fc,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO,QAASN,EAAY,MAAOT,EAAO,UAAU,oFAClD,SAAAN,EAAeM,CAAK,CAAA,CACvB,EACCY,CAAA,CAAA,CACH,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"CopyableId-DS6IDMIX.js","sources":["../../src/components/common/display/CopyableId.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nconst ELLIPSIS_MAX = 20;\n\nfunction centerEllipsis(s: string, max = ELLIPSIS_MAX): string {\n if (s.length <= max) return s;\n const side = Math.floor((max - 1) / 2);\n return `${s.slice(0, side)}…${s.slice(-side)}`;\n}\n\ninterface CopyableIdProps {\n label?: string;\n value: string | null | undefined;\n href?: string;\n external?: boolean;\n /** Render only the value row (copy/navigate), without the built-in label. */\n bare?: boolean;\n}\n\nexport function CopyableId({ label, value, href, external, bare }: CopyableIdProps) {\n const [copied, setCopied] = useState(false);\n const navigate = useNavigate();\n if (!value) return null;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNavigate = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) return;\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n navigate(href);\n }\n };\n\n const valueButtons = (\n <>\n <button onClick={handleCopy} title=\"Copy\" className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-text-primary'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n {href && (\n <button onClick={handleNavigate} title={`View ${label ?? 'link'}`} className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n )}\n </>\n );\n\n if (bare) {\n return (\n <span className=\"flex items-center gap-1 group relative\">\n <button onClick={handleCopy} title={value} className=\"font-mono text-text-primary group-hover:text-accent transition-colors\">\n {centerEllipsis(value)}\n </button>\n {valueButtons}\n </span>\n );\n }\n\n return (\n <div className=\"text-left group relative\">\n <span className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">{label}</span>\n <span className=\"flex items-center gap-1 mt-0.5\">\n <button onClick={handleCopy} title={value} className=\"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors\">\n {centerEllipsis(value)}\n </button>\n {valueButtons}\n </span>\n </div>\n );\n}\n"],"names":["ELLIPSIS_MAX","centerEllipsis","s","max","side","CopyableId","label","value","href","external","bare","copied","setCopied","useState","navigate","useNavigate","handleCopy","e","handleNavigate","valueButtons","jsxDEV","Fragment"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{Q as v,R as C,j as e,T as c,O as P,P as D}from"./index-DgCS2Frb.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{P as E}from"./PageHeader-DcgGV0Y2.js";import{T as j}from"./TimeAgo-pYn3T9IZ.js";import{C as V}from"./ConfirmDeleteModal-no0-c_1G.js";import{l as y,i as k,am as A,p as w}from"./vendor-icons-CNyYGNsk.js";import"./vendor-react-zA2lQFDs.js";import"./Modal-C6HI6btY.js";const d={anthropic:{name:"Anthropic",helpText:'Run "claude setup-token" for an OAuth token, or use an API key from console.anthropic.com.',placeholder:"sk-ant-oat01-... or sk-ant-api03-..."},openai:{name:"OpenAI",helpText:"Create an API key at platform.openai.com/api-keys.",placeholder:"sk-..."},google:{name:"Google",helpText:"Connect your Google account for Gmail, Calendar, and Drive access.",placeholder:"",oauth:!0}};function U(){var m,p;const{data:r,isLoading:u}=v(),i=C(),[a,l]=n.useState(null),[b,g]=n.useState(!1),[t,h]=n.useState("anthropic"),o=(r==null?void 0:r.connections)??[],x=()=>{a&&i.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},N=s=>`${P}/api/auth/oauth/connect/${s}?token=${encodeURIComponent(D()||"")}&returnTo=/credentials`;return e.jsxDEV("div",{children:[e.jsxDEV(E,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxDEV("button",{onClick:()=>g(s=>!s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(y,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:65,columnNumber:13},this),"Add Credential"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:61,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:57,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6",children:"Manage credentials used by tools when invoked on your behalf. Each credential is encrypted at rest and resolved automatically during tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:71,columnNumber:7},this),b&&e.jsxDEV("div",{className:"mb-6 pb-5 border-b border-surface-border/60 space-y-3",children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:80,columnNumber:13},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV("select",{value:t,onChange:s=>h(s.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(d).map(([s,f])=>e.jsxDEV("option",{value:s,children:f.name},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:88,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:82,columnNumber:15},this),e.jsxDEV(k,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:91,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:81,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:79,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:(m=d[t])==null?void 0:m.helpText},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:94,columnNumber:11},this),e.jsxDEV("a",{href:N(t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(c,{provider:t,className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:101,columnNumber:13},this),"Connect ",(p=d[t])==null?void 0:p.name]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:97,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:78,columnNumber:9},this),u?e.jsxDEV("div",{className:"animate-pulse space-y-3",children:[1,2].map(s=>e.jsxDEV("div",{className:"h-16 bg-surface-sunken rounded"},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:111,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:109,columnNumber:9},this):o.length===0?e.jsxDEV("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsxDEV(A,{className:"w-10 h-10 mx-auto mb-3 opacity-40"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:116,columnNumber:11},this),e.jsxDEV("p",{className:"text-sm",children:"No credentials registered."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:117,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:118,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:115,columnNumber:9},this):e.jsxDEV("div",{className:"divide-y divide-surface-border/30",children:o.map(s=>e.jsxDEV("div",{className:"group/row flex items-center gap-4 px-3 py-2.5 -mx-3",children:[e.jsxDEV(c,{provider:s.provider,className:"w-6 h-6 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:127,columnNumber:15},this),e.jsxDEV("div",{className:"flex-1 min-w-0",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:"text-sm text-text-primary font-medium capitalize",children:s.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:131,columnNumber:19},this),s.label!=="default"&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:s.label},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:135,columnNumber:21},this),s.credential_type&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:s.credential_type},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:140,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:130,columnNumber:17},this),e.jsxDEV("div",{className:"flex items-center gap-3 mt-0.5",children:[s.email&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:s.email},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:147,columnNumber:21},this),s.expires_at&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsxDEV(j,{date:s.expires_at},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:151,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:150,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:145,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:129,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>l({provider:s.provider,label:s.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsxDEV(w,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:162,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:157,columnNumber:15},this)]},`${s.provider}-${s.label}`,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:123,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:121,columnNumber:9},this),e.jsxDEV(V,{open:!!a,onClose:()=>l(null),onConfirm:x,title:"Revoke Credential",description:e.jsxDEV(e.Fragment,{children:["Revoke the"," ",e.jsxDEV("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:177,columnNumber:13},this),(a==null?void 0:a.label)!=="default"&&e.jsxDEV(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:181,columnNumber:15},this)," ","credential? Tools will no longer be able to use this credential."]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:175,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:169,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:56,columnNumber:5},this)}export{U as CredentialsPage};
2
+ //# sourceMappingURL=CredentialsPage-C3NyncEB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CredentialsPage-C3NyncEB.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\nimport { LT_BASE } from '../../lib/base-path';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string; oauth?: boolean }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n google: {\n name: 'Google',\n helpText: 'Connect your Google account for Gmail, Calendar, and Drive access.',\n placeholder: '',\n oauth: true,\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `${LT_BASE}/api/auth/oauth/connect/${provider}?token=${encodeURIComponent(getToken() || '')}&returnTo=/credentials`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n docsHash=\"#docs:dashboard.md:credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 pb-5 border-b border-surface-border/60 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-3 py-2.5 -mx-3\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","LT_BASE","getToken","jsxDEV","PageHeader","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{u,b as o,c as r}from"./vendor-query-DLp59M9_.js";import{d as i,j as n}from"./index-DgCS2Frb.js";import{R as l,a6 as m}from"./vendor-icons-CNyYGNsk.js";function b(t){return u({queryKey:["agent-subscriptions",t],queryFn:()=>i(`/agents/${t}/subscriptions`),enabled:!!t})}function f(){const t=o();return r({mutationFn:({agentId:e,...s})=>i(`/agents/${e}/subscriptions`,{method:"POST",body:JSON.stringify(s)}),onSuccess:(e,s)=>{t.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),t.invalidateQueries({queryKey:["agents"]})}})}function h(){const t=o();return r({mutationFn:({agentId:e,subId:s,...a})=>i(`/agents/${e}/subscriptions/${s}`,{method:"PUT",body:JSON.stringify(a)}),onSuccess:(e,s)=>{t.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]})}})}function g(){const t=o();return r({mutationFn:({agentId:e,subId:s})=>i(`/agents/${e}/subscriptions/${s}`,{method:"DELETE"}),onSuccess:(e,s)=>{t.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),t.invalidateQueries({queryKey:["agents"]})}})}const p={task:"text-status-active",workflow:"text-accent",escalation:"text-status-warning",activity:"text-status-active",knowledge:"text-accent",agent:"text-status-success",app:"text-status-error",milestone:"text-accent"};function N({topic:t}){const e=t.split("."),s=e[0]==="system"?e[1]:e[0],a=p[s]??"text-text-quaternary",c=e[0]==="system"?`${e[1]}.${e[e.length-1]}`:e.slice(-2).join(".");return n.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[n.jsxDEV(l,{className:`w-2.5 h-2.5 shrink-0 ${a}`,strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EventTopicPill.tsx",lineNumber:35,columnNumber:7},this),c]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EventTopicPill.tsx",lineNumber:34,columnNumber:5},this)}function v({cron:t}){return n.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[n.jsxDEV(m,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CronLabel.tsx",lineNumber:14,columnNumber:7},this),t]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CronLabel.tsx",lineNumber:13,columnNumber:5},this)}export{v as C,N as E,f as a,h as b,g as c,b as u};
2
+ //# sourceMappingURL=CronLabel-DQWBx57H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CronLabel-DQWBx57H.js","sources":["../../src/api/agent-subscriptions.ts","../../src/components/common/display/EventTopicPill.tsx","../../src/components/common/display/CronLabel.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface AgentSubscription {\n id: string;\n agent_id: string;\n topic: string;\n filter?: Record<string, any>;\n reaction_type: 'durable' | 'pipeline' | 'mcp_query' | 'capability';\n workflow_type?: string;\n pipeline_id?: string;\n mcp_prompt?: string;\n server_id?: string;\n tool_name?: string;\n input_mapping: Record<string, any>;\n execute_as?: string;\n enabled: boolean;\n created_at: string;\n updated_at: string;\n}\n\ninterface SubscriptionListResponse {\n subscriptions: AgentSubscription[];\n}\n\nexport function useAgentSubscriptions(agentId: string | null) {\n return useQuery<SubscriptionListResponse>({\n queryKey: ['agent-subscriptions', agentId],\n queryFn: () => apiFetch(`/agents/${agentId}/subscriptions`),\n enabled: !!agentId,\n });\n}\n\nexport function useCreateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n\nexport function useUpdateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string; subId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, subId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n },\n });\n}\n\nexport function useDeleteSubscription() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean }, Error, { agentId: string; subId: string }>({\n mutationFn: ({ agentId, subId }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, { method: 'DELETE' }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n","import { Radio } from 'lucide-react';\n\n/**\n * Universal event topic display — Radio icon + monotype text.\n * Used everywhere an event subscription topic is rendered.\n * No border, no background — matches CronLabel's simplicity.\n */\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'text-status-active',\n workflow: 'text-accent',\n escalation: 'text-status-warning',\n activity: 'text-status-active',\n knowledge: 'text-accent',\n agent: 'text-status-success',\n app: 'text-status-error',\n milestone: 'text-accent',\n};\n\ninterface EventTopicPillProps {\n topic: string;\n}\n\nexport function EventTopicPill({ topic }: EventTopicPillProps) {\n const parts = topic.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n const iconColor = CATEGORY_COLORS[category] ?? 'text-text-quaternary';\n // Show category.action for system events (e.g., workflow.completed)\n const shortTopic = parts[0] === 'system'\n ? `${parts[1]}.${parts[parts.length - 1]}`\n : parts.slice(-2).join('.');\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Radio className={`w-2.5 h-2.5 shrink-0 ${iconColor}`} strokeWidth={1.5} />\n {shortTopic}\n </span>\n );\n}\n","import { Clock } from 'lucide-react';\n\ninterface CronLabelProps {\n cron: string;\n}\n\n/**\n * Universal cron expression display — Clock icon + monotype text.\n * Used everywhere a cron schedule is rendered.\n */\nexport function CronLabel({ cron }: CronLabelProps) {\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Clock className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {cron}\n </span>\n );\n}\n"],"names":["useAgentSubscriptions","agentId","useQuery","apiFetch","useCreateSubscription","queryClient","useQueryClient","useMutation","body","_","vars","useUpdateSubscription","subId","useDeleteSubscription","CATEGORY_COLORS","EventTopicPill","topic","parts","category","iconColor","shortTopic","jsxDEV","Radio","CronLabel","cron","Clock"],"mappings":"8JAyBO,SAASA,EAAsBC,EAAwB,CAC5D,OAAOC,EAAmC,CACxC,SAAU,CAAC,sBAAuBD,CAAO,EACzC,QAAS,IAAME,EAAS,WAAWF,CAAO,gBAAgB,EAC1D,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAwF,CAC7F,WAAY,CAAC,CAAE,QAAAN,EAAS,GAAGO,KACzBL,EAAS,WAAWF,CAAO,iBAAkB,CAC3C,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAuG,CAC5G,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,EAAO,GAAGJ,CAAA,IAChCL,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CACpD,OAAQ,MACR,KAAM,KAAK,UAAUJ,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,CACnF,CAAA,CACD,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMR,EAAcC,EAAA,EACpB,OAAOC,EAA6E,CAClF,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,KACtBT,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CAAE,OAAQ,SAAU,EAC5E,UAAW,CAACH,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CChEA,MAAMS,EAA0C,CAC9C,KAAY,qBACZ,SAAY,cACZ,WAAY,sBACZ,SAAY,qBACZ,UAAY,cACZ,MAAY,sBACZ,IAAY,oBACZ,UAAY,aACd,EAMO,SAASC,EAAe,CAAE,MAAAC,GAA8B,CAC7D,MAAMC,EAAQD,EAAM,MAAM,GAAG,EACvBE,EAAWD,EAAM,CAAC,IAAM,SAAWA,EAAM,CAAC,EAAIA,EAAM,CAAC,EACrDE,EAAYL,EAAgBI,CAAQ,GAAK,uBAEzCE,EAAaH,EAAM,CAAC,IAAM,SAC5B,GAAGA,EAAM,CAAC,CAAC,IAAIA,EAAMA,EAAM,OAAS,CAAC,CAAC,GACtCA,EAAM,MAAM,EAAE,EAAE,KAAK,GAAG,EAE5B,OACEI,EAAAA,OAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAA,EAAAA,OAACC,GAAM,UAAW,wBAAwBH,CAAS,GAAI,YAAa,KAApE,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyE,EACxEC,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ,CC5BO,SAASG,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEH,EAAAA,OAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAA,SAACI,EAAA,CAAM,UAAU,4CAA4C,YAAa,GAAA,EAA1E,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA+E,EAC9ED,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as a,u as p}from"./index-DgCS2Frb.js";import{M as b}from"./Modal-C6HI6btY.js";import{a as r}from"./vendor-query-DLp59M9_.js";import{D as x,f}from"./constants-BHkpVaqx.js";function y({open:o,onClose:i,onConfirm:l,selectedCount:e,isPending:s,error:m}){const n=e&&e>1?`Cancel ${e} escalations`:"Cancel escalation";return a.jsxDEV(b,{open:o,onClose:i,title:n,children:a.jsxDEV("div",{className:"space-y-4",children:[a.jsxDEV("p",{className:"text-sm text-text-secondary",children:e&&e>1?`This will permanently cancel ${e} escalations. Any waiting workflows will be unblocked and receive a cancellation signal.`:"This will permanently cancel this escalation. Any waiting workflow will be unblocked and receive a cancellation signal."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:27,columnNumber:9},this),a.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"This action cannot be undone."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:32,columnNumber:9},this),m&&a.jsxDEV("p",{className:"text-xs text-status-error",children:m.message},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:33,columnNumber:19},this),a.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[a.jsxDEV("button",{onClick:i,disabled:s,className:"btn-secondary text-xs",children:"Keep"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:35,columnNumber:11},this),a.jsxDEV("button",{onClick:l,disabled:s,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-50",children:s?"Cancelling...":"Yes, Cancel"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:38,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:34,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:26,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmCancelModal.tsx",lineNumber:25,columnNumber:5},this)}function E(){const{data:o}=p();return r.useMemo(()=>{var l;return(((l=o==null?void 0:o.escalation)==null?void 0:l.claimDurations)??x).map(e=>({value:String(e),label:f(e)}))},[o])}const N=[{value:1,label:"minutes"},{value:60,label:"hours"}];function j({onChange:o,compact:i,autoFocus:l,"data-testid":e="custom-duration-input"}){const[s,m]=r.useState(""),[n,u]=r.useState(1);r.useEffect(()=>{const t=parseInt(s);o(t>0?t*n:0)},[s,n,o]);const c=i?"text-xs":"text-sm",d=i?"w-16":"w-20";return a.jsxDEV("div",{className:"flex items-center gap-2","data-testid":e,children:[a.jsxDEV("input",{type:"number",min:1,max:n===60?24:1440,value:s,onChange:t=>m(t.target.value),placeholder:n===60?"hrs":"min",className:`input ${c} ${d} text-center`,autoFocus:l,"data-testid":`${e}-quantity`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:37,columnNumber:7},this),a.jsxDEV("select",{value:n,onChange:t=>u(parseInt(t.target.value)),className:`select ${c} py-1`,"data-testid":`${e}-unit`,children:N.map(t=>a.jsxDEV("option",{value:t.value,children:t.label},t.value,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:55,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:48,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:36,columnNumber:5},this)}export{j as C,y as a,E as u};
2
+ //# sourceMappingURL=CustomDurationPicker-DV42oZ1G.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomDurationPicker-Cp1fgzPX.js","sources":["../../src/components/common/modal/ConfirmCancelModal.tsx","../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { Modal } from './Modal';\n\ninterface ConfirmCancelModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n selectedCount?: number;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmCancelModal({\n open,\n onClose,\n onConfirm,\n selectedCount,\n isPending,\n error,\n}: ConfirmCancelModalProps) {\n const title = selectedCount && selectedCount > 1\n ? `Cancel ${selectedCount} escalations`\n : 'Cancel escalation';\n\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n {selectedCount && selectedCount > 1\n ? `This will permanently cancel ${selectedCount} escalations. Any waiting workflows will be unblocked and receive a cancellation signal.`\n : 'This will permanently cancel this escalation. Any waiting workflow will be unblocked and receive a cancellation signal.'}\n </p>\n <p className=\"text-xs text-text-tertiary\">This action cannot be undone.</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} disabled={isPending} className=\"btn-secondary text-xs\">\n Keep\n </button>\n <button\n onClick={onConfirm}\n disabled={isPending}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-50\"\n >\n {isPending ? 'Cancelling...' : 'Yes, Cancel'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","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":["ConfirmCancelModal","open","onClose","onConfirm","selectedCount","isPending","error","title","jsx","Modal","jsxs","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","u"],"mappings":"yLAWO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,MAAMC,EAAQH,GAAiBA,EAAgB,EAC3C,UAAUA,CAAa,eACvB,oBAEJ,OACEI,EAAAA,IAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAK,EACnC,SAAAG,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,8BACV,SAAAJ,GAAiBA,EAAgB,EAC9B,gCAAgCA,CAAa,2FAC7C,yHAAA,CACN,EACAI,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,gCAA6B,EACtEF,GAASE,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,QAAQ,EAClEE,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,EAAAA,IAAC,UAAO,QAASN,EAAS,SAAUG,EAAW,UAAU,wBAAwB,SAAA,MAAA,CAEjF,EACAG,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,SAAUE,EACV,UAAU,oHAET,WAAY,gBAAkB,aAAA,CAAA,CACjC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CCnCO,SAASM,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,OACEZ,EAAAA,KAAC,MAAA,CAAI,UAAU,0BAA0B,cAAac,EACpD,SAAA,CAAAhB,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKoB,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAW,GAAMC,EAAY,EAAE,OAAO,KAAK,EAC3C,YAAaE,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,CAAA,EAExBhB,EAAAA,IAAC,SAAA,CACC,MAAOoB,EACP,SAAW,GAAMC,EAAc,SAAS,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUG,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKe,GACV1B,EAAAA,IAAC,SAAA,CAAqB,MAAO0B,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,KAAgC,CAChD,CAAA,CAAA,CACH,EACF,CAEJ"}
1
+ {"version":3,"file":"CustomDurationPicker-DV42oZ1G.js","sources":["../../src/components/common/modal/ConfirmCancelModal.tsx","../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { Modal } from './Modal';\n\ninterface ConfirmCancelModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n selectedCount?: number;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmCancelModal({\n open,\n onClose,\n onConfirm,\n selectedCount,\n isPending,\n error,\n}: ConfirmCancelModalProps) {\n const title = selectedCount && selectedCount > 1\n ? `Cancel ${selectedCount} escalations`\n : 'Cancel escalation';\n\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n {selectedCount && selectedCount > 1\n ? `This will permanently cancel ${selectedCount} escalations. Any waiting workflows will be unblocked and receive a cancellation signal.`\n : 'This will permanently cancel this escalation. Any waiting workflow will be unblocked and receive a cancellation signal.'}\n </p>\n <p className=\"text-xs text-text-tertiary\">This action cannot be undone.</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} disabled={isPending} className=\"btn-secondary text-xs\">\n Keep\n </button>\n <button\n onClick={onConfirm}\n disabled={isPending}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-50\"\n >\n {isPending ? 'Cancelling...' : 'Yes, Cancel'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","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":["ConfirmCancelModal","open","onClose","onConfirm","selectedCount","isPending","error","title","jsxDEV","Modal","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","e","u"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-DgCS2Frb.js";import{E as N}from"./EmptyState-CLVm9KmA.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-[60px] 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?"border-l-2 border-l-accent":""} ${d?d(a):""}`,children:s.map(l=>e.jsxDEV("td",{className:`px-6 py-2.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-Bf4dgxll.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable-ZWgVQg7F.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-[60px] 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 ? '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-2.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","jsx","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","jsxs","col","isSortable","isActive","row","index","EmptyState"],"mappings":"4FAgCA,SAASA,EAAS,CAAE,OAAAC,EAAQ,UAAAC,GAA6D,CACvF,OACEC,EAAAA,IAAC,MAAA,CACC,UAAW,gDACTF,EAAS,0BAA4B,8DACvC,IAAIA,GAAUC,IAAc,MAAQ,aAAe,EAAE,GACrD,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,IAEb,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAAA,CAAiB,CAAA,CAAA,CAG5E,CAEO,SAASE,EAAa,CAC3B,QAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EACA,aAAAC,EAAe,mBACf,KAAAC,EACA,OAAAC,EACA,OAAAC,CACF,EAAsB,CACpB,OAAIJ,EAEAR,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAA,CAAG,EAAE,IAAI,CAACa,EAAGC,IACjCd,EAAAA,IAAC,MAAA,CAAY,UAAU,uDACrB,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,CAAA,EAD9Cc,CAEV,CACD,CAAA,CACH,EAICX,EAAK,OAKRY,EAAAA,KAAC,QAAA,CAAM,UAAU,SACf,SAAA,CAAAf,EAAAA,IAAC,QAAA,CACC,eAAC,KAAA,CAAG,UAAU,WACX,SAAAE,EAAQ,IAAKc,GAAQ,CACpB,MAAMC,EAAaD,EAAI,UAAYL,EAC7BO,GAAWR,GAAA,YAAAA,EAAM,WAAYM,EAAI,IAEvC,OACEhB,EAAAA,IAAC,KAAA,CAEC,QAASiB,EAAa,IAAMN,EAAOK,EAAI,GAAG,EAAI,OAC9C,UAAW,GAAGJ,EAAS,GAAK,yBAAyB,2HAA2HI,EAAI,WAAa,EAAE,IACjMC,EAAa,wFAA0F,EACzG,GAEA,SAAAF,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACb,SAAA,CAAAC,EAAI,MACJC,SACEpB,EAAA,CAAS,OAAQqB,EAAU,UAAWA,EAAWR,EAAK,MAAQ,MAAA,CAAQ,CAAA,CAAA,CAE3E,CAAA,EAXKM,EAAI,GAAA,CAcf,CAAC,EACH,EACF,QACC,QAAA,CACE,SAAAb,EAAK,IAAI,CAACgB,EAAKC,IAAU,CACxB,MAAMF,EAAWZ,GAAgB,MAAQF,EAAMe,CAAG,IAAMb,EACxD,OACAN,EAAAA,IAAC,KAAA,CAEC,QAASK,EAAa,IAAMA,EAAWc,CAAG,EAAI,OAC9C,UAAW,qEACTd,EAAa,2BAA6B,EAC5C,IAAIa,EAAW,6BAA+B,EAAE,IAAIX,EAAeA,EAAaY,CAAG,EAAI,EAAE,GAExF,SAAAjB,EAAQ,IAAKc,GACZhB,EAAAA,IAAC,KAAA,CAEC,UAAW,uBAAuBgB,EAAI,WAAa,EAAE,GAEpD,SAAAA,EAAI,OAAOG,EAAKC,CAAK,CAAA,EAHjBJ,EAAI,GAAA,CAKZ,CAAA,EAbIZ,EAAMe,CAAG,CAAA,CAgBlB,CAAC,CAAA,CACH,CAAA,EACF,EArDOV,EAAeT,EAAAA,IAACqB,EAAA,CAAW,MAAOZ,EAAc,EAAK,IAuDhE"}
1
+ {"version":3,"file":"DataTable-Bf4dgxll.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-[60px] 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 ? '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-2.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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"}
@@ -0,0 +1,2 @@
1
+ import{j as l}from"./index-DgCS2Frb.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{aJ as b}from"./vendor-icons-CNyYGNsk.js";function g(t,c){const p=c.split(",").map(e=>e.trim());for(const e of p)if(e.startsWith(".")&&t.name.toLowerCase().endsWith(e.toLowerCase())||e===t.type||e.endsWith("/*")&&t.type.startsWith(e.slice(0,-1)))return!0;return!1}function E({onDrop:t,children:c,label:p="Drop files here",accept:e,disabled:i}){const[u,m]=n.useState(!1),a=n.useRef(0),f=n.useCallback(r=>{r.preventDefault(),r.stopPropagation(),a.current++,i||m(!0)},[i]),d=n.useCallback(r=>{r.preventDefault(),r.stopPropagation(),a.current--,a.current<=0&&(a.current=0,m(!1))},[]),h=n.useCallback(r=>{r.preventDefault(),r.stopPropagation()},[]),x=n.useCallback(r=>{if(r.preventDefault(),r.stopPropagation(),a.current=0,m(!1),i)return;const s=Array.from(r.dataTransfer.files);if(console.debug("[DropZone] dropped files:",s.map(o=>({name:o.name,type:o.type,size:o.size}))),e){const o=s.filter(D=>g(D,e));console.debug("[DropZone] after accept filter:",o.length,"of",s.length),o.length?t(o):console.warn("[DropZone] no files matched accept pattern:",e)}else s.length&&t(s)},[t,e,i]);return l.jsxDEV("div",{className:"relative",onDragEnter:f,onDragLeave:d,onDragOver:h,onDrop:x,children:[c,u&&l.jsxDEV("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none",style:{background:"rgba(var(--color-surface-rgb, 255 255 255) / 0.85)"},children:l.jsxDEV("div",{className:"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40",children:[l.jsxDEV(b,{className:"w-8 h-8 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:82,columnNumber:13},this),l.jsxDEV("p",{className:"text-xs text-text-secondary",children:p},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:83,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:81,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:78,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:69,columnNumber:5},this)}export{E as D};
2
+ //# sourceMappingURL=DropZone-CTSXBb3c.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone-CZDmNBn-.js","sources":["../../src/components/common/DropZone.tsx"],"sourcesContent":["import { useState, useCallback, useRef, type DragEvent, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\ninterface DropZoneProps {\n onDrop: (files: File[]) => void;\n children: ReactNode;\n label?: string;\n accept?: string;\n disabled?: boolean;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const patterns = accept.split(',').map(s => s.trim());\n for (const pattern of patterns) {\n if (pattern.startsWith('.') && file.name.toLowerCase().endsWith(pattern.toLowerCase())) return true;\n if (pattern === file.type) return true;\n if (pattern.endsWith('/*') && file.type.startsWith(pattern.slice(0, -1))) return true;\n }\n return false;\n}\n\nexport function DropZone({ onDrop, children, label = 'Drop files here', accept, disabled }: DropZoneProps) {\n const [dragOver, setDragOver] = useState(false);\n const dragCounter = useRef(0);\n\n const handleDragEnter = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current++;\n if (!disabled) setDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current--;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setDragOver(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n console.debug('[DropZone] dropped files:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n\n if (accept) {\n const filtered = files.filter(f => matchesAccept(f, accept));\n console.debug('[DropZone] after accept filter:', filtered.length, 'of', files.length);\n if (filtered.length) onDrop(filtered);\n else console.warn('[DropZone] no files matched accept pattern:', accept);\n } else {\n if (files.length) onDrop(files);\n }\n }, [onDrop, accept, disabled]);\n\n return (\n <div\n className=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n {dragOver && (\n <div className=\"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none\"\n style={{ background: 'rgba(var(--color-surface-rgb, 255 255 255) / 0.85)' }}\n >\n <div className=\"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40\">\n <UploadCloud className=\"w-8 h-8 text-text-tertiary\" />\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["matchesAccept","file","accept","patterns","s","pattern","DropZone","onDrop","children","label","disabled","dragOver","setDragOver","useState","dragCounter","useRef","handleDragEnter","useCallback","e","handleDragLeave","handleDragOver","handleDrop","files","f","filtered","jsxs","jsx","UploadCloud"],"mappings":"sGAWA,SAASA,EAAcC,EAAYC,EAAyB,CAC1D,MAAMC,EAAWD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,EACpD,UAAWC,KAAWF,EAGpB,GAFIE,EAAQ,WAAW,GAAG,GAAKJ,EAAK,KAAK,YAAA,EAAc,SAASI,EAAQ,YAAA,CAAa,GACjFA,IAAYJ,EAAK,MACjBI,EAAQ,SAAS,IAAI,GAAKJ,EAAK,KAAK,WAAWI,EAAQ,MAAM,EAAG,EAAE,CAAC,EAAG,MAAO,GAEnF,MAAO,EACT,CAEO,SAASC,EAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,MAAAC,EAAQ,kBAAmB,OAAAP,EAAQ,SAAAQ,GAA2B,CACzG,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAcC,EAAAA,OAAO,CAAC,EAEtBC,EAAkBC,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACPJ,GAAUE,EAAY,EAAI,CACjC,EAAG,CAACF,CAAQ,CAAC,EAEPS,EAAkBF,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACRA,EAAY,SAAW,IACzBA,EAAY,QAAU,EACtBF,EAAY,EAAK,EAErB,EAAG,CAAA,CAAE,EAECQ,EAAiBH,cAAaC,GAAiB,CACnDA,EAAE,eAAA,EACFA,EAAE,gBAAA,CACJ,EAAG,CAAA,CAAE,EAECG,EAAaJ,cAAaC,GAAiB,CAK/C,GAJAA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,QAAU,EACtBF,EAAY,EAAK,EACbF,EAAU,OAEd,MAAMY,EAAQ,MAAM,KAAKJ,EAAE,aAAa,KAAK,EAG7C,GAFA,QAAQ,MAAM,4BAA6BI,EAAM,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAMA,EAAE,IAAA,EAAO,CAAC,EAErGrB,EAAQ,CACV,MAAMsB,EAAWF,EAAM,UAAYtB,EAAcuB,EAAGrB,CAAM,CAAC,EAC3D,QAAQ,MAAM,kCAAmCsB,EAAS,OAAQ,KAAMF,EAAM,MAAM,EAChFE,EAAS,OAAQjB,EAAOiB,CAAQ,EAC/B,QAAQ,KAAK,8CAA+CtB,CAAM,CACzE,MACMoB,EAAM,QAAQf,EAAOe,CAAK,CAElC,EAAG,CAACf,EAAQL,EAAQQ,CAAQ,CAAC,EAE7B,OACEe,EAAAA,KAAC,MAAA,CACC,UAAU,WACV,YAAaT,EACb,YAAaG,EACb,WAAYC,EACZ,OAAQC,EAEP,SAAA,CAAAb,EACAG,GACCe,EAAAA,IAAC,MAAA,CAAI,UAAU,sGACb,MAAO,CAAE,WAAY,oDAAA,EAErB,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAY,UAAU,4BAAA,CAA6B,EACpDD,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAjB,CAAA,CAAM,CAAA,CAAA,CACpD,CAAA,CAAA,CACF,CAAA,CAAA,CAIR"}
1
+ {"version":3,"file":"DropZone-CTSXBb3c.js","sources":["../../src/components/common/DropZone.tsx"],"sourcesContent":["import { useState, useCallback, useRef, type DragEvent, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\ninterface DropZoneProps {\n onDrop: (files: File[]) => void;\n children: ReactNode;\n label?: string;\n accept?: string;\n disabled?: boolean;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const patterns = accept.split(',').map(s => s.trim());\n for (const pattern of patterns) {\n if (pattern.startsWith('.') && file.name.toLowerCase().endsWith(pattern.toLowerCase())) return true;\n if (pattern === file.type) return true;\n if (pattern.endsWith('/*') && file.type.startsWith(pattern.slice(0, -1))) return true;\n }\n return false;\n}\n\nexport function DropZone({ onDrop, children, label = 'Drop files here', accept, disabled }: DropZoneProps) {\n const [dragOver, setDragOver] = useState(false);\n const dragCounter = useRef(0);\n\n const handleDragEnter = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current++;\n if (!disabled) setDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current--;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setDragOver(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n console.debug('[DropZone] dropped files:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n\n if (accept) {\n const filtered = files.filter(f => matchesAccept(f, accept));\n console.debug('[DropZone] after accept filter:', filtered.length, 'of', files.length);\n if (filtered.length) onDrop(filtered);\n else console.warn('[DropZone] no files matched accept pattern:', accept);\n } else {\n if (files.length) onDrop(files);\n }\n }, [onDrop, accept, disabled]);\n\n return (\n <div\n className=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n {dragOver && (\n <div className=\"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none\"\n style={{ background: 'rgba(var(--color-surface-rgb, 255 255 255) / 0.85)' }}\n >\n <div className=\"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40\">\n <UploadCloud className=\"w-8 h-8 text-text-tertiary\" />\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["matchesAccept","file","accept","patterns","s","pattern","DropZone","onDrop","children","label","disabled","dragOver","setDragOver","useState","dragCounter","useRef","handleDragEnter","useCallback","e","handleDragLeave","handleDragOver","handleDrop","files","f","filtered","jsxDEV","UploadCloud"],"mappings":"uIAWA,SAASA,EAAcC,EAAYC,EAAyB,CAC1D,MAAMC,EAAWD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,EACpD,UAAWC,KAAWF,EAGpB,GAFIE,EAAQ,WAAW,GAAG,GAAKJ,EAAK,KAAK,YAAA,EAAc,SAASI,EAAQ,YAAA,CAAa,GACjFA,IAAYJ,EAAK,MACjBI,EAAQ,SAAS,IAAI,GAAKJ,EAAK,KAAK,WAAWI,EAAQ,MAAM,EAAG,EAAE,CAAC,EAAG,MAAO,GAEnF,MAAO,EACT,CAEO,SAASC,EAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,MAAAC,EAAQ,kBAAmB,OAAAP,EAAQ,SAAAQ,GAA2B,CACzG,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAcC,EAAAA,OAAO,CAAC,EAEtBC,EAAkBC,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACPJ,GAAUE,EAAY,EAAI,CACjC,EAAG,CAACF,CAAQ,CAAC,EAEPS,EAAkBF,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACRA,EAAY,SAAW,IACzBA,EAAY,QAAU,EACtBF,EAAY,EAAK,EAErB,EAAG,CAAA,CAAE,EAECQ,EAAiBH,cAAaC,GAAiB,CACnDA,EAAE,eAAA,EACFA,EAAE,gBAAA,CACJ,EAAG,CAAA,CAAE,EAECG,EAAaJ,cAAaC,GAAiB,CAK/C,GAJAA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,QAAU,EACtBF,EAAY,EAAK,EACbF,EAAU,OAEd,MAAMY,EAAQ,MAAM,KAAKJ,EAAE,aAAa,KAAK,EAG7C,GAFA,QAAQ,MAAM,4BAA6BI,EAAM,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAMA,EAAE,IAAA,EAAO,CAAC,EAErGrB,EAAQ,CACV,MAAMsB,EAAWF,EAAM,UAAYtB,EAAcuB,EAAGrB,CAAM,CAAC,EAC3D,QAAQ,MAAM,kCAAmCsB,EAAS,OAAQ,KAAMF,EAAM,MAAM,EAChFE,EAAS,OAAQjB,EAAOiB,CAAQ,EAC/B,QAAQ,KAAK,8CAA+CtB,CAAM,CACzE,MACMoB,EAAM,QAAQf,EAAOe,CAAK,CAElC,EAAG,CAACf,EAAQL,EAAQQ,CAAQ,CAAC,EAE7B,OACEe,EAAAA,OAAC,MAAA,CACC,UAAU,WACV,YAAaT,EACb,YAAaG,EACb,WAAYC,EACZ,OAAQC,EAEP,SAAA,CAAAb,EACAG,GACCc,EAAAA,OAAC,MAAA,CAAI,UAAU,sGACb,MAAO,CAAE,WAAY,oDAAA,EAErB,SAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAA,EAAAA,OAACC,EAAA,CAAY,UAAU,4BAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EACpDD,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAhB,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAkD,CAAA,CAAA,EAFpD,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAOA,CAAA,EAhBJ,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAoBJ"}
@@ -0,0 +1,2 @@
1
+ import{A as d,j as l,I as x}from"./index-DgCS2Frb.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-roy4G5SQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElapsedCell-Gr5UlUbn.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","jsx","DateTooltip"],"mappings":"qGAcO,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,IAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,EAAAA,IAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,CACH,EACF,CAEJ"}
1
+ {"version":3,"file":"ElapsedCell-roy4G5SQ.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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-DgCS2Frb.js";function o({title:m="No data",description:t,icon:s}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20",children:[s&&e.jsxDEV("div",{className:"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4",children:e.jsxDEV(s,{className:"w-5 h-5 text-accent/50"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:16,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:15,columnNumber:9},this),e.jsxDEV("p",{className:"text-sm text-text-secondary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:19,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:21,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:13,columnNumber:5},this)}export{o as E};
2
+ //# sourceMappingURL=EmptyState-CLVm9KmA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState-BcsfPq9T.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\n\nexport function EmptyState({\n title = 'No data',\n description,\n icon: Icon,\n}: {\n title?: string;\n description?: string;\n icon?: LucideIcon;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n {Icon && (\n <div className=\"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4\">\n <Icon className=\"w-5 h-5 text-accent/50\" />\n </div>\n )}\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","Icon","jsxs","jsx"],"mappings":"+CAEO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,EACA,KAAMC,CACR,EAIG,CACD,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACZ,SAAA,CAAAD,GACCE,EAAAA,IAAC,OAAI,UAAU,gFACb,eAACF,EAAA,CAAK,UAAU,yBAAyB,CAAA,CAC3C,EAEFE,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAJ,EAAM,EACjDC,GACCG,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAH,CAAA,CAAY,CAAA,EAEhE,CAEJ"}
1
+ {"version":3,"file":"EmptyState-CLVm9KmA.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\n\nexport function EmptyState({\n title = 'No data',\n description,\n icon: Icon,\n}: {\n title?: string;\n description?: string;\n icon?: LucideIcon;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n {Icon && (\n <div className=\"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4\">\n <Icon className=\"w-5 h-5 text-accent/50\" />\n </div>\n )}\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","Icon","jsxDEV"],"mappings":"wCAEO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,EACA,KAAMC,CACR,EAIG,CACD,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kDACZ,SAAA,CAAAD,YACE,MAAA,CAAI,UAAU,gFACb,SAAAC,SAACD,EAAA,CAAK,UAAU,wBAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAyC,CAAA,EAD3C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAEFC,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAkD,EACjDC,GACCE,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAF,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4D,CAAA,CAAA,EARhE,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,CAEJ"}
@@ -0,0 +1,9 @@
1
+ import{j as e,J as V}from"./index-DgCS2Frb.js";import{a as o}from"./vendor-query-DLp59M9_.js";import{b as D,f as P,j as y,c as k}from"./roles-CpRcUIMm.js";import{g as b,B as w,V as _,ah as C}from"./vendor-icons-CNyYGNsk.js";import{e as O}from"./vendor-react-zA2lQFDs.js";const R=`{
2
+ "type": "object",
3
+ "properties": {
4
+ "approved": { "type": "boolean", "title": "Approve?" },
5
+ "notes": { "type": "string", "title": "Notes" }
6
+ },
7
+ "required": ["approved"]
8
+ }`;function f(l){const s=l.trim();if(!s)return{ok:!0,value:null};try{const t=JSON.parse(s);return typeof t!="object"||Array.isArray(t)||t===null?{ok:!1}:{ok:!0,value:t}}catch{return{ok:!1}}}function F(){const{role:l}=O(),{data:s,isLoading:t}=D(),i=P(),a=((s==null?void 0:s.roles)??[]).find(r=>r.role===l),[n,m]=o.useState(""),[p,h]=o.useState(""),[g,c]=o.useState(!1),[E,d]=o.useState(!1),[N,u]=o.useState(!1),x=o.useRef(null);o.useEffect(()=>{!a||x.current===a.role||(x.current=a.role,m(a.form_schema?JSON.stringify(a.form_schema,null,2):""),h(""),c(!1),u(!1))},[a]);const v=r=>{m(r),c(!0),d(!1),u(!f(r).ok)},S=()=>{const r=f(n);if(!r.ok||!a){u(!r.ok);return}i.mutate({role:a.role,form_schema:r.value??null,change_summary:p.trim()||void 0},{onSuccess:()=>{c(!1),d(!0),h(""),window.setTimeout(()=>d(!1),2500)}})},j=r=>{m(r?JSON.stringify(r,null,2):""),c(!0),d(!1),u(!1)};return t?e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-64"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:102,columnNumber:9},this),e.jsxDEV("div",{className:"h-96 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:103,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:101,columnNumber:7},this):a?e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-start justify-between mb-10",children:[e.jsxDEV("div",{children:e.jsxDEV("div",{className:"flex items-center gap-3 mb-1",children:[e.jsxDEV(b,{className:"w-5 h-5 text-accent",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:123,columnNumber:13},this),e.jsxDEV("h1",{className:"text-lg font-medium text-text-primary",children:"Escalation Schema"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:124,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:escalation-schema"},className:"text-text-quaternary hover:text-accent transition-colors",title:"Open docs for this page",children:e.jsxDEV(w,{className:"w-4 h-4",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:130,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:125,columnNumber:13},this),e.jsxDEV("span",{className:"font-mono text-sm text-text-tertiary",children:a.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:132,columnNumber:13},this),a.current_schema_version!=null&&e.jsxDEV("span",{className:"text-[10px] font-mono text-text-quaternary",children:["v",a.current_schema_version," in use"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:134,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:122,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:121,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-2 shrink-0",children:[E&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-success animate-page-enter",children:[e.jsxDEV(_,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:144,columnNumber:15},this)," Saved"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:143,columnNumber:13},this),i.error&&e.jsxDEV("span",{className:"text-xs text-status-error max-w-[220px] truncate",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:148,columnNumber:13},this),e.jsxDEV("button",{onClick:S,disabled:!g||N||i.isPending,className:"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:i.isPending?"Saving…":"Save Version"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:152,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:141,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:120,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-3 gap-16 items-start",children:[e.jsxDEV("div",{className:"col-span-2 space-y-6",children:[e.jsxDEV("textarea",{value:n,onChange:r=>v(r.target.value),rows:28,spellCheck:!1,className:"input text-xs font-mono w-full resize-y leading-relaxed",placeholder:R},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:165,columnNumber:11},this),N&&e.jsxDEV("p",{className:"text-[10px] text-status-error -mt-4",children:"Invalid JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:173,columnNumber:25},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Change Summary"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:176,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:p,onChange:r=>h(r.target.value),placeholder:"e.g., Added lotNumber field for shoe orders",className:"input text-sm w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:179,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-quaternary mt-1.5",children:"Recorded on the version this save creates."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:186,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:175,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:164,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[e.jsxDEV(C,{className:"w-4 h-4 text-text-quaternary",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:195,columnNumber:13},this),e.jsxDEV("h2",{className:"section-h2",children:"Versions"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:196,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:194,columnNumber:11},this),e.jsxDEV(q,{role:a.role,onLoad:j},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:198,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:193,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:163,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:118,columnNumber:5},this):e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsxDEV(b,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:111,columnNumber:9},this),e.jsxDEV("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Role not found"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:112,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:110,columnNumber:7},this)}function q({role:l,onLoad:s}){const{data:t}=y(l),i=(t==null?void 0:t.versions)??[];return i.length===0?e.jsxDEV("p",{className:"text-[11px] text-text-tertiary leading-relaxed",children:"Versions appear here after the first save. Each schema change adds one; earlier versions stay viewable and loadable as an editing base."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:217,columnNumber:7},this):e.jsxDEV("div",{className:"divide-y divide-surface-border/40",children:i.map(a=>e.jsxDEV(J,{role:l,summary:a,onLoad:s},a.version,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:227,columnNumber:9},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:225,columnNumber:5},this)}function J({role:l,summary:s,onLoad:t}){const[i,a]=o.useState(!1),n=k(l,s.version,i);return e.jsxDEV("div",{className:"py-2",children:[e.jsxDEV("button",{onClick:()=>a(m=>!m),className:"w-full text-left group",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:"text-xs font-mono text-text-secondary",children:["v",s.version]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:250,columnNumber:11},this),s.is_current&&e.jsxDEV("span",{className:"text-[9px] font-bold uppercase tracking-wider text-accent",children:"current"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:252,columnNumber:13},this),e.jsxDEV("span",{className:"flex-1"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:254,columnNumber:11},this),e.jsxDEV("span",{className:"text-[10px] text-text-quaternary shrink-0",children:new Date(s.created_at).toLocaleDateString()},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:255,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:249,columnNumber:9},this),s.change_summary&&e.jsxDEV("p",{className:"mt-0.5 text-[10px] text-text-tertiary truncate",children:s.change_summary},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:260,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:248,columnNumber:7},this),i&&e.jsxDEV("div",{className:"mt-2 space-y-2",children:n.data?e.jsxDEV(e.Fragment,{children:[n.data.form_schema?e.jsxDEV(V,{data:n.data.form_schema,defaultCollapsed:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:268,columnNumber:19},this):e.jsxDEV("p",{className:"text-[10px] text-text-quaternary",children:"This version carries no form schema."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:269,columnNumber:19},this),e.jsxDEV("button",{onClick:()=>t(n.data.form_schema??null),className:"text-[10px] text-accent hover:underline",children:"Load into editor"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:270,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:266,columnNumber:13},this):e.jsxDEV("p",{className:"text-[10px] text-text-quaternary",children:"Loading…"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:278,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:264,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationSchemaPage.tsx",lineNumber:247,columnNumber:5},this)}export{F as EscalationSchemaPage};
9
+ //# sourceMappingURL=EscalationSchemaPage-DulCCxea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscalationSchemaPage-DulCCxea.js","sources":["../../src/pages/admin/roles/EscalationSchemaPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Braces, Check, History, BookOpen } from 'lucide-react';\nimport {\n useRoleDetails,\n useRoleSchema,\n useRoleSchemaVersions,\n useUpdateRole,\n type RoleSchemaVersionSummary,\n} from '../../../api/roles';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\n\n/**\n * The escalation form schema, on its own page (/admin/roles/:role/schema).\n * This is the form a person completes to resolve the role's escalations —\n * versioned, pinnable by workflows (conditionLT schemaVersion), and worth a\n * full editing surface. Saving here writes ONLY the schema: one PATCH with\n * form_schema (+ optional change summary); every actual change appends the\n * next immutable version.\n */\n\nconst PLACEHOLDER = `{\n \"type\": \"object\",\n \"properties\": {\n \"approved\": { \"type\": \"boolean\", \"title\": \"Approve?\" },\n \"notes\": { \"type\": \"string\", \"title\": \"Notes\" }\n },\n \"required\": [\"approved\"]\n}`;\n\nfunction safeParseObject(text: string): { ok: boolean; value?: Record<string, unknown> | null } {\n const trimmed = text.trim();\n if (!trimmed) return { ok: true, value: null };\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) return { ok: false };\n return { ok: true, value: parsed };\n } catch {\n return { ok: false };\n }\n}\n\nexport function EscalationSchemaPage() {\n const { role: roleKey } = useParams<{ role: string }>();\n const { data, isLoading } = useRoleDetails();\n const updateRole = useUpdateRole();\n\n const role = (data?.roles ?? []).find((r) => r.role === roleKey);\n\n const [text, setText] = useState('');\n const [summary, setSummary] = useState('');\n const [dirty, setDirty] = useState(false);\n const [savedOk, setSavedOk] = useState(false);\n const [jsonError, setJsonError] = useState(false);\n\n // Seed the editor from the live schema exactly once per role — refetches\n // (cache invalidations, saves) must not clobber in-progress edits.\n const seededFor = useRef<string | null>(null);\n useEffect(() => {\n if (!role || seededFor.current === role.role) return;\n seededFor.current = role.role;\n setText(role.form_schema ? JSON.stringify(role.form_schema, null, 2) : '');\n setSummary('');\n setDirty(false);\n setJsonError(false);\n }, [role]);\n\n const handleEdit = (value: string) => {\n setText(value);\n setDirty(true);\n setSavedOk(false);\n setJsonError(!safeParseObject(value).ok);\n };\n\n const handleSave = () => {\n const parsed = safeParseObject(text);\n if (!parsed.ok || !role) { setJsonError(!parsed.ok); return; }\n // Saving just the schema — nothing else rides this PATCH.\n updateRole.mutate(\n { role: role.role, form_schema: parsed.value ?? null, change_summary: summary.trim() || undefined },\n {\n onSuccess: () => {\n setDirty(false);\n setSavedOk(true);\n setSummary('');\n window.setTimeout(() => setSavedOk(false), 2500);\n },\n },\n );\n };\n\n const loadIntoEditor = (schema: Record<string, unknown> | null) => {\n setText(schema ? JSON.stringify(schema, null, 2) : '');\n setDirty(true);\n setSavedOk(false);\n setJsonError(false);\n };\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-96 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!role) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Braces className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Role not found</h2>\n </div>\n );\n }\n\n return (\n <div>\n {/* ── Header ── */}\n <div className=\"flex items-start justify-between mb-10\">\n <div>\n <div className=\"flex items-center gap-3 mb-1\">\n <Braces className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-medium text-text-primary\">Escalation Schema</h1>\n <button\n onClick={() => { window.location.hash = '#docs:dashboard.md:escalation-schema'; }}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n <span className=\"font-mono text-sm text-text-tertiary\">{role.role}</span>\n {role.current_schema_version != null && (\n <span className=\"text-[10px] font-mono text-text-quaternary\">\n v{role.current_schema_version} in use\n </span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n {savedOk && (\n <span className=\"flex items-center gap-1 text-xs text-status-success animate-page-enter\">\n <Check className=\"w-3 h-3\" /> Saved\n </span>\n )}\n {updateRole.error && (\n <span className=\"text-xs text-status-error max-w-[220px] truncate\">\n {(updateRole.error as Error).message}\n </span>\n )}\n <button\n onClick={handleSave}\n disabled={!dirty || jsonError || updateRole.isPending}\n className=\"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {updateRole.isPending ? 'Saving…' : 'Save Version'}\n </button>\n </div>\n </div>\n\n {/* ── Editor + version rail ── */}\n <div className=\"grid grid-cols-3 gap-16 items-start\">\n <div className=\"col-span-2 space-y-6\">\n <textarea\n value={text}\n onChange={(e) => handleEdit(e.target.value)}\n rows={28}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-y leading-relaxed\"\n placeholder={PLACEHOLDER}\n />\n {jsonError && <p className=\"text-[10px] text-status-error -mt-4\">Invalid JSON</p>}\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Change Summary\n </label>\n <input\n type=\"text\"\n value={summary}\n onChange={(e) => setSummary(e.target.value)}\n placeholder=\"e.g., Added lotNumber field for shoe orders\"\n className=\"input text-sm w-full\"\n />\n <p className=\"text-[10px] text-text-quaternary mt-1.5\">\n Recorded on the version this save creates.\n </p>\n </div>\n </div>\n\n {/* Version history — view any snapshot, load one as the editing base */}\n <div>\n <div className=\"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border\">\n <History className=\"w-4 h-4 text-text-quaternary\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">Versions</h2>\n </div>\n <VersionRail role={role.role} onLoad={loadIntoEditor} />\n </div>\n </div>\n </div>\n );\n}\n\nfunction VersionRail({\n role,\n onLoad,\n}: {\n role: string;\n onLoad: (schema: Record<string, unknown> | null) => void;\n}) {\n const { data } = useRoleSchemaVersions(role);\n const versions = data?.versions ?? [];\n\n if (versions.length === 0) {\n return (\n <p className=\"text-[11px] text-text-tertiary leading-relaxed\">\n Versions appear here after the first save. Each schema change adds one;\n earlier versions stay viewable and loadable as an editing base.\n </p>\n );\n }\n\n return (\n <div className=\"divide-y divide-surface-border/40\">\n {versions.map((v) => (\n <VersionEntry key={v.version} role={role} summary={v} onLoad={onLoad} />\n ))}\n </div>\n );\n}\n\nfunction VersionEntry({\n role,\n summary,\n onLoad,\n}: {\n role: string;\n summary: RoleSchemaVersionSummary;\n onLoad: (schema: Record<string, unknown> | null) => void;\n}) {\n const [open, setOpen] = useState(false);\n // Snapshot fetch is lazy — only when the entry is expanded.\n const snapshot = useRoleSchema(role, summary.version, open);\n\n return (\n <div className=\"py-2\">\n <button onClick={() => setOpen((o) => !o)} className=\"w-full text-left group\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-mono text-text-secondary\">v{summary.version}</span>\n {summary.is_current && (\n <span className=\"text-[9px] font-bold uppercase tracking-wider text-accent\">current</span>\n )}\n <span className=\"flex-1\" />\n <span className=\"text-[10px] text-text-quaternary shrink-0\">\n {new Date(summary.created_at).toLocaleDateString()}\n </span>\n </div>\n {summary.change_summary && (\n <p className=\"mt-0.5 text-[10px] text-text-tertiary truncate\">{summary.change_summary}</p>\n )}\n </button>\n {open && (\n <div className=\"mt-2 space-y-2\">\n {snapshot.data ? (\n <>\n {snapshot.data.form_schema\n ? <JsonViewer data={snapshot.data.form_schema} defaultCollapsed />\n : <p className=\"text-[10px] text-text-quaternary\">This version carries no form schema.</p>}\n <button\n onClick={() => onLoad((snapshot.data!.form_schema ?? null) as Record<string, unknown> | null)}\n className=\"text-[10px] text-accent hover:underline\"\n >\n Load into editor\n </button>\n </>\n ) : (\n <p className=\"text-[10px] text-text-quaternary\">Loading…</p>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["PLACEHOLDER","safeParseObject","text","trimmed","parsed","EscalationSchemaPage","roleKey","useParams","data","isLoading","useRoleDetails","updateRole","useUpdateRole","role","setText","useState","summary","setSummary","dirty","setDirty","savedOk","setSavedOk","jsonError","setJsonError","seededFor","useRef","useEffect","handleEdit","value","handleSave","loadIntoEditor","schema","jsxDEV","Braces","BookOpen","Check","e","History","VersionRail","onLoad","useRoleSchemaVersions","versions","v","VersionEntry","open","setOpen","snapshot","useRoleSchema","o","Fragment","JsonViewer"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as u,j as e}from"./index-DgCS2Frb.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{e as v}from"./useEventHooks-CUUeBSH1.js";import{P as N}from"./PageHeader-DcgGV0Y2.js";import{S as c}from"./StatCard-DCPGFzCv.js";import{c as h}from"./vendor-react-zA2lQFDs.js";import"./vendor-icons-CNyYGNsk.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,d;v();const o=h(),[l,n]=b.useState("24h"),{data:s}=u(l),r=a=>{const p=new URLSearchParams(a).toString();o(`/escalations/available${p?`?${p}`:""}`)},t="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(N,{title:"Escalations",docsHash:"#docs:dashboard.md:escalations-overview"},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),(((d=s==null?void 0:s.by_type)==null?void 0:d.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-DDwxn_mT.js.map