@hotmeshio/long-tail 0.18.1 → 0.19.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 (367) hide show
  1. package/build/api/escalations/index.d.ts +1 -1
  2. package/build/api/escalations/index.js +2 -1
  3. package/build/api/escalations/list.d.ts +11 -0
  4. package/build/api/escalations/list.js +31 -2
  5. package/build/api/users.d.ts +11 -0
  6. package/build/api/users.js +19 -0
  7. package/build/api/workflows/config.d.ts +5 -1
  8. package/build/api/workflows/config.js +9 -1
  9. package/build/api/workflows/index.d.ts +3 -0
  10. package/build/api/workflows/index.js +7 -1
  11. package/build/api/workflows/input-validation.d.ts +13 -0
  12. package/build/api/workflows/input-validation.js +38 -0
  13. package/build/api/workflows/invocable.d.ts +19 -0
  14. package/build/api/workflows/invocable.js +106 -0
  15. package/build/api/workflows/invocation.js +6 -0
  16. package/build/lib/db/schemas/034_workflow_input_schema.sql +13 -0
  17. package/build/lib/uuid.d.ts +11 -0
  18. package/build/lib/uuid.js +20 -0
  19. package/build/routes/escalations/list.js +10 -1
  20. package/build/routes/users.js +9 -0
  21. package/build/routes/workflows/config.js +2 -0
  22. package/build/routes/workflows/discovery.js +14 -0
  23. package/build/scripts/ortho-populate.d.ts +3 -1
  24. package/build/scripts/ortho-populate.js +15 -5
  25. package/build/sdk/index.d.ts +1 -0
  26. package/build/services/config/cache.js +2 -0
  27. package/build/services/config/read.js +4 -0
  28. package/build/services/config/sql.d.ts +2 -2
  29. package/build/services/config/sql.js +7 -5
  30. package/build/services/config/write.js +11 -1
  31. package/build/services/escalation/batch.js +3 -0
  32. package/build/services/escalation/bulk.js +8 -0
  33. package/build/services/escalation/crud.js +26 -0
  34. package/build/services/escalation/queries.d.ts +14 -1
  35. package/build/services/escalation/queries.js +49 -7
  36. package/build/services/escalation/sql.d.ts +4 -2
  37. package/build/services/escalation/sql.js +4 -0
  38. package/build/services/interceptor/index.js +7 -0
  39. package/build/services/invocation-access.d.ts +18 -0
  40. package/build/services/invocation-access.js +32 -0
  41. package/build/services/role/types.d.ts +1 -1
  42. package/build/services/role/types.js +1 -1
  43. package/build/services/user/auth.js +2 -2
  44. package/build/services/user/crud.d.ts +13 -0
  45. package/build/services/user/crud.js +26 -3
  46. package/build/services/user/index.d.ts +1 -1
  47. package/build/services/user/index.js +2 -1
  48. package/build/services/user/sql.d.ts +11 -5
  49. package/build/services/user/sql.js +18 -6
  50. package/build/services/workflow-invocation.js +4 -9
  51. package/build/shared/form-validation/index.d.ts +1 -0
  52. package/build/shared/form-validation/index.js +1 -0
  53. package/build/shared/form-validation/invoke-context.d.ts +7 -0
  54. package/build/shared/form-validation/invoke-context.js +11 -0
  55. package/build/shared/form-validation/validate-resolver-payload.d.ts +1 -1
  56. package/build/shared/form-validation/validate-resolver-payload.js +1 -0
  57. package/build/shared/form-validation/x-lt-help.d.ts +2 -2
  58. package/build/shared/form-validation/x-lt-help.js +2 -2
  59. package/build/shared/form-validation/x-lt-show-if.d.ts +1 -0
  60. package/build/shared/form-validation/x-lt-show-if.js +3 -0
  61. package/build/start/workers.js +2 -0
  62. package/build/system/mcp-servers/admin/workflows.js +15 -2
  63. package/build/tsconfig.tsbuildinfo +1 -1
  64. package/build/types/config.d.ts +6 -0
  65. package/build/types/index.d.ts +2 -0
  66. package/build/types/index.js +4 -1
  67. package/build/types/startup.d.ts +10 -0
  68. package/build/types/validation.d.ts +4 -2
  69. package/build/types/workflow-icons.d.ts +86 -0
  70. package/build/types/workflow-icons.js +92 -0
  71. package/dashboard/dist/assets/{AdminDashboard-DDY8bceq.js → AdminDashboard-Drs-9TRM.js} +2 -2
  72. package/dashboard/dist/assets/{AdminDashboard-DDY8bceq.js.map → AdminDashboard-Drs-9TRM.js.map} +1 -1
  73. package/dashboard/dist/assets/{AgentConfigPage-D47sHnup.js → AgentConfigPage-BDPDZ7-v.js} +3 -3
  74. package/dashboard/dist/assets/{AgentConfigPage-D47sHnup.js.map → AgentConfigPage-BDPDZ7-v.js.map} +1 -1
  75. package/dashboard/dist/assets/{AgentDetailPage-DwrfByA2.js → AgentDetailPage-CGBulM4_.js} +3 -3
  76. package/dashboard/dist/assets/{AgentDetailPage-DwrfByA2.js.map → AgentDetailPage-CGBulM4_.js.map} +1 -1
  77. package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +2 -0
  78. package/dashboard/dist/assets/{AgentsPage-CLSjlyXy.js.map → AgentsPage-D77JeViQ.js.map} +1 -1
  79. package/dashboard/dist/assets/{AutoGrowTextarea-DgEQeRQw.js → AutoGrowTextarea-7X3T9La8.js} +2 -2
  80. package/dashboard/dist/assets/{AutoGrowTextarea-DgEQeRQw.js.map → AutoGrowTextarea-7X3T9La8.js.map} +1 -1
  81. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +2 -0
  82. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +1 -0
  83. package/dashboard/dist/assets/{BotPicker-CbL7gQFq.js → BotPicker-CC5vI_Sv.js} +2 -2
  84. package/dashboard/dist/assets/{BotPicker-CbL7gQFq.js.map → BotPicker-CC5vI_Sv.js.map} +1 -1
  85. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +2 -0
  86. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js.map +1 -0
  87. package/dashboard/dist/assets/{CapabilitiesPage-Q9Pe0y_p.js → CapabilitiesPage-D9TC2iKy.js} +2 -2
  88. package/dashboard/dist/assets/{CapabilitiesPage-Q9Pe0y_p.js.map → CapabilitiesPage-D9TC2iKy.js.map} +1 -1
  89. package/dashboard/dist/assets/{CollapsibleSection-BZOtaWPR.js → CollapsibleSection-D10lGw_u.js} +2 -2
  90. package/dashboard/dist/assets/{CollapsibleSection-BZOtaWPR.js.map → CollapsibleSection-D10lGw_u.js.map} +1 -1
  91. package/dashboard/dist/assets/{ConfirmDeleteModal-6CidwpPx.js → ConfirmDeleteModal-BJdLN6No.js} +2 -2
  92. package/dashboard/dist/assets/{ConfirmDeleteModal-6CidwpPx.js.map → ConfirmDeleteModal-BJdLN6No.js.map} +1 -1
  93. package/dashboard/dist/assets/{CopyableId-4Lqlc5cU.js → CopyableId-Bn02zYxt.js} +2 -2
  94. package/dashboard/dist/assets/{CopyableId-4Lqlc5cU.js.map → CopyableId-Bn02zYxt.js.map} +1 -1
  95. package/dashboard/dist/assets/CountdownTimer-D9B-BjQ7.js +2 -0
  96. package/dashboard/dist/assets/CountdownTimer-D9B-BjQ7.js.map +1 -0
  97. package/dashboard/dist/assets/{CredentialsPage-dxjrUEyO.js → CredentialsPage-hniUAFBK.js} +2 -2
  98. package/dashboard/dist/assets/{CredentialsPage-dxjrUEyO.js.map → CredentialsPage-hniUAFBK.js.map} +1 -1
  99. package/dashboard/dist/assets/{CronLabel-D8oo8eaA.js → CronLabel-v9DCD2FX.js} +2 -2
  100. package/dashboard/dist/assets/{CronLabel-D8oo8eaA.js.map → CronLabel-v9DCD2FX.js.map} +1 -1
  101. package/dashboard/dist/assets/{DataTable-DFPMeqyQ.js → DataTable-7C7riavf.js} +2 -2
  102. package/dashboard/dist/assets/{DataTable-DFPMeqyQ.js.map → DataTable-7C7riavf.js.map} +1 -1
  103. package/dashboard/dist/assets/{DropZone-CWCh5ItZ.js → DropZone-XlcY8hEH.js} +2 -2
  104. package/dashboard/dist/assets/{DropZone-CWCh5ItZ.js.map → DropZone-XlcY8hEH.js.map} +1 -1
  105. package/dashboard/dist/assets/{ElapsedCell-FHHQ69G3.js → ElapsedCell-_xvVTK8N.js} +2 -2
  106. package/dashboard/dist/assets/{ElapsedCell-FHHQ69G3.js.map → ElapsedCell-_xvVTK8N.js.map} +1 -1
  107. package/dashboard/dist/assets/{EmptyState-lpUFYfun.js → EmptyState-DgC_6njU.js} +2 -2
  108. package/dashboard/dist/assets/{EmptyState-lpUFYfun.js.map → EmptyState-DgC_6njU.js.map} +1 -1
  109. package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +2 -0
  110. package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js.map +1 -0
  111. package/dashboard/dist/assets/{EscalationListSchemaPage-D5L5lDNb.js → EscalationListSchemaPage-BeQUTUEO.js} +3 -3
  112. package/dashboard/dist/assets/{EscalationListSchemaPage-D5L5lDNb.js.map → EscalationListSchemaPage-BeQUTUEO.js.map} +1 -1
  113. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +2 -0
  114. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +1 -0
  115. package/dashboard/dist/assets/{EscalationSchemaPage-bYbfEpSB.js → EscalationSchemaPage-D4VlEwyS.js} +3 -3
  116. package/dashboard/dist/assets/{EscalationSchemaPage-bYbfEpSB.js.map → EscalationSchemaPage-D4VlEwyS.js.map} +1 -1
  117. package/dashboard/dist/assets/{EscalationsOverview-DjtIjL1b.js → EscalationsOverview-Bx6Zrzm-.js} +2 -2
  118. package/dashboard/dist/assets/{EscalationsOverview-DjtIjL1b.js.map → EscalationsOverview-Bx6Zrzm-.js.map} +1 -1
  119. package/dashboard/dist/assets/{EventTable-CihVTREC.js → EventTable-KEC3YWBf.js} +2 -2
  120. package/dashboard/dist/assets/{EventTable-CihVTREC.js.map → EventTable-KEC3YWBf.js.map} +1 -1
  121. package/dashboard/dist/assets/{FilterBar-Fin1IqHc.js → FilterBar-xwN_b5fj.js} +2 -2
  122. package/dashboard/dist/assets/{FilterBar-Fin1IqHc.js.map → FilterBar-xwN_b5fj.js.map} +1 -1
  123. package/dashboard/dist/assets/{GraphInvokePage-D77ILPd3.js → GraphInvokePage-DV7Y0fe2.js} +2 -2
  124. package/dashboard/dist/assets/{GraphInvokePage-D77ILPd3.js.map → GraphInvokePage-DV7Y0fe2.js.map} +1 -1
  125. package/dashboard/dist/assets/HomePage-G785SWcW.js +2 -0
  126. package/dashboard/dist/assets/HomePage-G785SWcW.js.map +1 -0
  127. package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +2 -0
  128. package/dashboard/dist/assets/{ListToolbar-DyHaJBTk.js.map → ListToolbar-zPVYPg3W.js.map} +1 -1
  129. package/dashboard/dist/assets/{McpOverview-qz7Ivf0G.js → McpOverview-CMGUq8hx.js} +2 -2
  130. package/dashboard/dist/assets/{McpOverview-qz7Ivf0G.js.map → McpOverview-CMGUq8hx.js.map} +1 -1
  131. package/dashboard/dist/assets/{McpQueryDetailPage-D6MB4CZM.js → McpQueryDetailPage-CdhLhaKn.js} +3 -3
  132. package/dashboard/dist/assets/{McpQueryDetailPage-D6MB4CZM.js.map → McpQueryDetailPage-CdhLhaKn.js.map} +1 -1
  133. package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +2 -0
  134. package/dashboard/dist/assets/{McpQueryPage-BqqRF5cQ.js.map → McpQueryPage-CNSNMagY.js.map} +1 -1
  135. package/dashboard/dist/assets/{McpRunDetailPage-DxLEhzhn.js → McpRunDetailPage-DBm8hUaW.js} +2 -2
  136. package/dashboard/dist/assets/{McpRunDetailPage-DxLEhzhn.js.map → McpRunDetailPage-DBm8hUaW.js.map} +1 -1
  137. package/dashboard/dist/assets/{McpRunsPage-BOsS4Hdf.js → McpRunsPage-B6rb5QBf.js} +2 -2
  138. package/dashboard/dist/assets/{McpRunsPage-BOsS4Hdf.js.map → McpRunsPage-B6rb5QBf.js.map} +1 -1
  139. package/dashboard/dist/assets/NamespacePill-Bb3revqD.js +2 -0
  140. package/dashboard/dist/assets/{NamespacePill-CJikgGzE.js.map → NamespacePill-Bb3revqD.js.map} +1 -1
  141. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +3 -0
  142. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +1 -0
  143. package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +2 -0
  144. package/dashboard/dist/assets/{OperatorDashboard-C5rlijvh.js.map → OperatorDashboard-DBOscDnf.js.map} +1 -1
  145. package/dashboard/dist/assets/{PageHeader-DZmymFBS.js → PageHeader-Di5Sz3an.js} +2 -2
  146. package/dashboard/dist/assets/{PageHeader-DZmymFBS.js.map → PageHeader-Di5Sz3an.js.map} +1 -1
  147. package/dashboard/dist/assets/{PageHeaderWithStats-DuAm6YK2.js → PageHeaderWithStats-DutKJ-h2.js} +2 -2
  148. package/dashboard/dist/assets/{PageHeaderWithStats-DuAm6YK2.js.map → PageHeaderWithStats-DutKJ-h2.js.map} +1 -1
  149. package/dashboard/dist/assets/{PersonaDetailPage-JBdVvT5g.js → PersonaDetailPage-BGRdGpeR.js} +2 -2
  150. package/dashboard/dist/assets/{PersonaDetailPage-JBdVvT5g.js.map → PersonaDetailPage-BGRdGpeR.js.map} +1 -1
  151. package/dashboard/dist/assets/PersonasPage-DRzOZcVa.js +2 -0
  152. package/dashboard/dist/assets/PersonasPage-DRzOZcVa.js.map +1 -0
  153. package/dashboard/dist/assets/{PriorityBadge-BETdj4M-.js → PriorityBadge-r33mpDju.js} +2 -2
  154. package/dashboard/dist/assets/{PriorityBadge-BETdj4M-.js.map → PriorityBadge-r33mpDju.js.map} +1 -1
  155. package/dashboard/dist/assets/{ProcessDetailPage-CHnzOzQn.js → ProcessDetailPage-BLGjZXpM.js} +2 -2
  156. package/dashboard/dist/assets/{ProcessDetailPage-CHnzOzQn.js.map → ProcessDetailPage-BLGjZXpM.js.map} +1 -1
  157. package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +2 -0
  158. package/dashboard/dist/assets/{ProcessesListPage-DuXTS5-v.js.map → ProcessesListPage-5NnysKFC.js.map} +1 -1
  159. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +2 -0
  160. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +1 -0
  161. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +8 -0
  162. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +1 -0
  163. package/dashboard/dist/assets/{RolePill-C9LSs1aK.js → RolePill-DhnVPK4q.js} +2 -2
  164. package/dashboard/dist/assets/{RolePill-C9LSs1aK.js.map → RolePill-DhnVPK4q.js.map} +1 -1
  165. package/dashboard/dist/assets/RolesPage-BmW1LzkU.js +2 -0
  166. package/dashboard/dist/assets/{RolesPage-h77-JOLd.js.map → RolesPage-BmW1LzkU.js.map} +1 -1
  167. package/dashboard/dist/assets/{RowActions-eYrzgQSj.js → RowActions-Bdd7z4eB.js} +2 -2
  168. package/dashboard/dist/assets/{RowActions-eYrzgQSj.js.map → RowActions-Bdd7z4eB.js.map} +1 -1
  169. package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +2 -0
  170. package/dashboard/dist/assets/{RunAsSelector-DoLFJ0mZ.js.map → RunAsSelector-BwZTJ4Yj.js.map} +1 -1
  171. package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +2 -0
  172. package/dashboard/dist/assets/{ScanCodesPage-b5NZM_-f.js.map → ScanCodesPage-FiYIYB-m.js.map} +1 -1
  173. package/dashboard/dist/assets/{ScanSchemeDetailPage-t7X6ekaW.js → ScanSchemeDetailPage-BiAqtD-a.js} +2 -2
  174. package/dashboard/dist/assets/{ScanSchemeDetailPage-t7X6ekaW.js.map → ScanSchemeDetailPage-BiAqtD-a.js.map} +1 -1
  175. package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +2 -0
  176. package/dashboard/dist/assets/{ScanStationPage-r02hkTAG.js.map → ScanStationPage-8CdOtbCD.js.map} +1 -1
  177. package/dashboard/dist/assets/{ScopeBadge-CjyC7iyO.js → ScopeBadge-CXUg0FHo.js} +2 -2
  178. package/dashboard/dist/assets/{ScopeBadge-CjyC7iyO.js.map → ScopeBadge-CXUg0FHo.js.map} +1 -1
  179. package/dashboard/dist/assets/{SegmentedTabs-DXNzY05q.js → SegmentedTabs-BpJh4Hwn.js} +2 -2
  180. package/dashboard/dist/assets/{SegmentedTabs-DXNzY05q.js.map → SegmentedTabs-BpJh4Hwn.js.map} +1 -1
  181. package/dashboard/dist/assets/{StatCard-BXQ8dD9Y.js → StatCard-nWY4sndl.js} +2 -2
  182. package/dashboard/dist/assets/{StatCard-BXQ8dD9Y.js.map → StatCard-nWY4sndl.js.map} +1 -1
  183. package/dashboard/dist/assets/{StatusBadge-BDeUwPtb.js → StatusBadge-DHVwxre2.js} +2 -2
  184. package/dashboard/dist/assets/{StatusBadge-BDeUwPtb.js.map → StatusBadge-DHVwxre2.js.map} +1 -1
  185. package/dashboard/dist/assets/{StickyPagination-BGHQbp0_.js → StickyPagination-DRuqKhZt.js} +2 -2
  186. package/dashboard/dist/assets/{StickyPagination-BGHQbp0_.js.map → StickyPagination-DRuqKhZt.js.map} +1 -1
  187. package/dashboard/dist/assets/{StreamMessageDetail-C-wfdbLJ.js → StreamMessageDetail-JwlbRiMn.js} +2 -2
  188. package/dashboard/dist/assets/{StreamMessageDetail-C-wfdbLJ.js.map → StreamMessageDetail-JwlbRiMn.js.map} +1 -1
  189. package/dashboard/dist/assets/{SwimlaneTimeline-Dnoz-me3.js → SwimlaneTimeline-hu3c4bCJ.js} +2 -2
  190. package/dashboard/dist/assets/{SwimlaneTimeline-Dnoz-me3.js.map → SwimlaneTimeline-hu3c4bCJ.js.map} +1 -1
  191. package/dashboard/dist/assets/{TagInput-D-vLSMQC.js → TagInput-BZ8vb2oW.js} +2 -2
  192. package/dashboard/dist/assets/{TagInput-D-vLSMQC.js.map → TagInput-BZ8vb2oW.js.map} +1 -1
  193. package/dashboard/dist/assets/{TaskDetailPage-c9IiAhVJ.js → TaskDetailPage-NqVZF3jW.js} +2 -2
  194. package/dashboard/dist/assets/{TaskDetailPage-c9IiAhVJ.js.map → TaskDetailPage-NqVZF3jW.js.map} +1 -1
  195. package/dashboard/dist/assets/{TaskQueuePill-sFRMrQ5D.js → TaskQueuePill-Bxir8WRl.js} +2 -2
  196. package/dashboard/dist/assets/{TaskQueuePill-sFRMrQ5D.js.map → TaskQueuePill-Bxir8WRl.js.map} +1 -1
  197. package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +2 -0
  198. package/dashboard/dist/assets/{TasksListPage-Dor8LSc5.js.map → TasksListPage-BQNaSzCn.js.map} +1 -1
  199. package/dashboard/dist/assets/TimeAgo-Cv35DOiI.js +2 -0
  200. package/dashboard/dist/assets/{TimeAgo-Dd8vmRnM.js.map → TimeAgo-Cv35DOiI.js.map} +1 -1
  201. package/dashboard/dist/assets/{TimestampCell-qJfC6-iT.js → TimestampCell-DHUXey9s.js} +2 -2
  202. package/dashboard/dist/assets/{TimestampCell-qJfC6-iT.js.map → TimestampCell-DHUXey9s.js.map} +1 -1
  203. package/dashboard/dist/assets/{ToolPill-OQ3mC11d.js → ToolPill-FkgTXIhq.js} +2 -2
  204. package/dashboard/dist/assets/{ToolPill-OQ3mC11d.js.map → ToolPill-FkgTXIhq.js.map} +1 -1
  205. package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +2 -0
  206. package/dashboard/dist/assets/{ToolTestPanel-CEGY5jss.js.map → ToolTestPanel-DvuLFWqQ.js.map} +1 -1
  207. package/dashboard/dist/assets/{TopicDetailPage-SI80ZTVv.js → TopicDetailPage-TXX3QNSo.js} +3 -3
  208. package/dashboard/dist/assets/{TopicDetailPage-SI80ZTVv.js.map → TopicDetailPage-TXX3QNSo.js.map} +1 -1
  209. package/dashboard/dist/assets/{TopicsPage-DiVB8tNr.js → TopicsPage-h-oyTeEJ.js} +2 -2
  210. package/dashboard/dist/assets/{TopicsPage-DiVB8tNr.js.map → TopicsPage-h-oyTeEJ.js.map} +1 -1
  211. package/dashboard/dist/assets/UserName-BceRCeDF.js +2 -0
  212. package/dashboard/dist/assets/UserName-BceRCeDF.js.map +1 -0
  213. package/dashboard/dist/assets/WorkflowExecutionPage-CmHGcaN9.js +2 -0
  214. package/dashboard/dist/assets/{WorkflowExecutionPage-e-Q57yiJ.js.map → WorkflowExecutionPage-CmHGcaN9.js.map} +1 -1
  215. package/dashboard/dist/assets/{WorkflowPill-Dh3hIW1l.js → WorkflowPill--AYMW7u_.js} +2 -2
  216. package/dashboard/dist/assets/WorkflowPill--AYMW7u_.js.map +1 -0
  217. package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +2 -0
  218. package/dashboard/dist/assets/{WorkflowsDashboard-DLKzN80h.js.map → WorkflowsDashboard-B0r2lQXk.js.map} +1 -1
  219. package/dashboard/dist/assets/WorkflowsOverview-BTMc2PJ_.js +2 -0
  220. package/dashboard/dist/assets/{WorkflowsOverview-J-ITQiO5.js.map → WorkflowsOverview-BTMc2PJ_.js.map} +1 -1
  221. package/dashboard/dist/assets/{YamlWorkflowDetailPage-B_-ahhf1.js → YamlWorkflowDetailPage-DUiCVnZp.js} +2 -2
  222. package/dashboard/dist/assets/{YamlWorkflowDetailPage-B_-ahhf1.js.map → YamlWorkflowDetailPage-DUiCVnZp.js.map} +1 -1
  223. package/dashboard/dist/assets/YamlWorkflowsPage-BAuXfwi0.js +2 -0
  224. package/dashboard/dist/assets/{YamlWorkflowsPage-DQNeERXU.js.map → YamlWorkflowsPage-BAuXfwi0.js.map} +1 -1
  225. package/dashboard/dist/assets/{agents-BsJ-MizQ.js → agents-BvmLCk4h.js} +2 -2
  226. package/dashboard/dist/assets/{agents-BsJ-MizQ.js.map → agents-BvmLCk4h.js.map} +1 -1
  227. package/dashboard/dist/assets/{bots-q1UYqaIh.js → bots-f_tyhl4I.js} +2 -2
  228. package/dashboard/dist/assets/{bots-q1UYqaIh.js.map → bots-f_tyhl4I.js.map} +1 -1
  229. package/dashboard/dist/assets/capabilities-DNo5bqLx.js +2 -0
  230. package/dashboard/dist/assets/{capabilities-BvjPXUcJ.js.map → capabilities-DNo5bqLx.js.map} +1 -1
  231. package/dashboard/dist/assets/{controlplane-BwlNpoJ_.js → controlplane-Dyyj2Irb.js} +2 -2
  232. package/dashboard/dist/assets/{controlplane-BwlNpoJ_.js.map → controlplane-Dyyj2Irb.js.map} +1 -1
  233. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +2 -0
  234. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +1 -0
  235. package/dashboard/dist/assets/index-BMlQYOE1.js +67 -0
  236. package/dashboard/dist/assets/index-BMlQYOE1.js.map +1 -0
  237. package/dashboard/dist/assets/index-BNZknxFY.js +2 -0
  238. package/dashboard/dist/assets/{index-cvmt1plS.js.map → index-BNZknxFY.js.map} +1 -1
  239. package/dashboard/dist/assets/index-Bpvfr4OW.css +1 -0
  240. package/dashboard/dist/assets/{index-CldVY0UQ.js → index-C-Xr2V3F.js} +2 -2
  241. package/dashboard/dist/assets/{index-CldVY0UQ.js.map → index-C-Xr2V3F.js.map} +1 -1
  242. package/dashboard/dist/assets/index-CegPUKpc.js +3 -0
  243. package/dashboard/dist/assets/index-CegPUKpc.js.map +1 -0
  244. package/dashboard/dist/assets/{index-O9uuK2yO.js → index-CsKiRyhy.js} +2 -2
  245. package/dashboard/dist/assets/{index-O9uuK2yO.js.map → index-CsKiRyhy.js.map} +1 -1
  246. package/dashboard/dist/assets/index-D7ESqn22.js +2 -0
  247. package/dashboard/dist/assets/{index-BhzsR_gZ.js.map → index-D7ESqn22.js.map} +1 -1
  248. package/dashboard/dist/assets/{index-Hbbox1A4.js → index-DL83W7Gu.js} +2 -2
  249. package/dashboard/dist/assets/{index-Hbbox1A4.js.map → index-DL83W7Gu.js.map} +1 -1
  250. package/dashboard/dist/assets/index-DPLssnMW.js +6 -0
  251. package/dashboard/dist/assets/index-DPLssnMW.js.map +1 -0
  252. package/dashboard/dist/assets/{index-DsKqDMs4.js → index-DWse7ERF.js} +2 -2
  253. package/dashboard/dist/assets/{index-DsKqDMs4.js.map → index-DWse7ERF.js.map} +1 -1
  254. package/dashboard/dist/assets/index-DoETPlJP.js +11 -0
  255. package/dashboard/dist/assets/index-DoETPlJP.js.map +1 -0
  256. package/dashboard/dist/assets/{index-8Gmtvd8e.js → index-DvxxrFBo.js} +2 -2
  257. package/dashboard/dist/assets/{index-8Gmtvd8e.js.map → index-DvxxrFBo.js.map} +1 -1
  258. package/dashboard/dist/assets/{index-DDHoDZRg.js → index-PcyGjmBm.js} +2 -2
  259. package/dashboard/dist/assets/{index-DDHoDZRg.js.map → index-PcyGjmBm.js.map} +1 -1
  260. package/dashboard/dist/assets/{index-BvGIyZUt.js → index-e2X-s0EQ.js} +2 -2
  261. package/dashboard/dist/assets/{index-BvGIyZUt.js.map → index-e2X-s0EQ.js.map} +1 -1
  262. package/dashboard/dist/assets/{knowledge-DM0tNphj.js → knowledge-Coo6CKzo.js} +2 -2
  263. package/dashboard/dist/assets/{knowledge-DM0tNphj.js.map → knowledge-Coo6CKzo.js.map} +1 -1
  264. package/dashboard/dist/assets/{mcp-CQ_TD2P9.js → mcp-Cz5eFnP_.js} +2 -2
  265. package/dashboard/dist/assets/{mcp-CQ_TD2P9.js.map → mcp-Cz5eFnP_.js.map} +1 -1
  266. package/dashboard/dist/assets/{mcp-query-BP7KSGhc.js → mcp-query-BtnuO4LF.js} +2 -2
  267. package/dashboard/dist/assets/{mcp-query-BP7KSGhc.js.map → mcp-query-BtnuO4LF.js.map} +1 -1
  268. package/dashboard/dist/assets/{personas-DclHdHKK.js → personas-C2-LgpHQ.js} +2 -2
  269. package/dashboard/dist/assets/{personas-DclHdHKK.js.map → personas-C2-LgpHQ.js.map} +1 -1
  270. package/dashboard/dist/assets/{pipelines-LwuKJfj-.js → pipelines-TuXQvUA-.js} +2 -2
  271. package/dashboard/dist/assets/{pipelines-LwuKJfj-.js.map → pipelines-TuXQvUA-.js.map} +1 -1
  272. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +2 -0
  273. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +1 -0
  274. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +2 -0
  275. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +1 -0
  276. package/dashboard/dist/assets/{tasks-CDs-Li2v.js → tasks-OUzpu__z.js} +2 -2
  277. package/dashboard/dist/assets/{tasks-CDs-Li2v.js.map → tasks-OUzpu__z.js.map} +1 -1
  278. package/dashboard/dist/assets/{topics-BeOSelBX.js → topics-B8bdrBaW.js} +2 -2
  279. package/dashboard/dist/assets/{topics-BeOSelBX.js.map → topics-B8bdrBaW.js.map} +1 -1
  280. package/dashboard/dist/assets/useDebouncedValue-Cp5ZOtVE.js +2 -0
  281. package/dashboard/dist/assets/{useDebouncedValue-DhhAKjDC.js.map → useDebouncedValue-Cp5ZOtVE.js.map} +1 -1
  282. package/dashboard/dist/assets/{useFilterParams-crmlBw_l.js → useFilterParams-DBRw1Hcv.js} +2 -2
  283. package/dashboard/dist/assets/{useFilterParams-crmlBw_l.js.map → useFilterParams-DBRw1Hcv.js.map} +1 -1
  284. package/dashboard/dist/assets/{useNamespace-C-E2gNEK.js → useNamespace-DtQe3wZ5.js} +2 -2
  285. package/dashboard/dist/assets/{useNamespace-C-E2gNEK.js.map → useNamespace-DtQe3wZ5.js.map} +1 -1
  286. package/dashboard/dist/assets/{useYamlActivityEvents-CmLzX3YU.js → useYamlActivityEvents-CS22c15X.js} +2 -2
  287. package/dashboard/dist/assets/{useYamlActivityEvents-CmLzX3YU.js.map → useYamlActivityEvents-CS22c15X.js.map} +1 -1
  288. package/dashboard/dist/assets/{vendor-icons-R9b9gQ04.js → vendor-icons-DeBdvyKJ.js} +368 -143
  289. package/dashboard/dist/assets/vendor-icons-DeBdvyKJ.js.map +1 -0
  290. package/dashboard/dist/assets/vendor-query-DvWWuNIB.js +18 -0
  291. package/dashboard/dist/assets/vendor-query-DvWWuNIB.js.map +1 -0
  292. package/dashboard/dist/assets/{vendor-react-CdqEC2zv.js → vendor-react-_9U4mKFr.js} +2 -2
  293. package/dashboard/dist/assets/{vendor-react-CdqEC2zv.js.map → vendor-react-_9U4mKFr.js.map} +1 -1
  294. package/dashboard/dist/assets/{yaml-workflows-BgAsc6-I.js → yaml-workflows-HQIki3hI.js} +2 -2
  295. package/dashboard/dist/assets/{yaml-workflows-BgAsc6-I.js.map → yaml-workflows-HQIki3hI.js.map} +1 -1
  296. package/dashboard/dist/index.html +5 -5
  297. package/docs/api/http/workflows.md +25 -1
  298. package/docs/code-owned-configuration.md +1 -1
  299. package/docs/dashboard.md +179 -80
  300. package/docs/events.md +3 -1
  301. package/docs/faceted-routing.md +5 -1
  302. package/docs/hitl/iframe.md +35 -6
  303. package/docs/hitl/invoke-form.md +98 -0
  304. package/docs/hitl/x-lt-list-schema.md +3 -0
  305. package/docs/hitl/x-lt-show-if.md +11 -0
  306. package/docs/hitl-guide.md +4 -2
  307. package/docs/iam.md +1 -1
  308. package/docs/operations.md +61 -60
  309. package/docs/scan-codes.md +30 -3
  310. package/docs/workflows.md +1 -1
  311. package/package.json +1 -1
  312. package/dashboard/dist/assets/AgentsPage-CLSjlyXy.js +0 -2
  313. package/dashboard/dist/assets/AvailableEscalationsPage-D2ukvuQh.js +0 -2
  314. package/dashboard/dist/assets/AvailableEscalationsPage-D2ukvuQh.js.map +0 -1
  315. package/dashboard/dist/assets/BulkAssignModal-CMSgvHIs.js +0 -2
  316. package/dashboard/dist/assets/BulkAssignModal-CMSgvHIs.js.map +0 -1
  317. package/dashboard/dist/assets/CountdownTimer-B5lM7PfE.js +0 -2
  318. package/dashboard/dist/assets/CountdownTimer-B5lM7PfE.js.map +0 -1
  319. package/dashboard/dist/assets/EntityTimelinePanel-B5NuHnPF.js +0 -2
  320. package/dashboard/dist/assets/EntityTimelinePanel-B5NuHnPF.js.map +0 -1
  321. package/dashboard/dist/assets/HomePage-8XsQFqKL.js +0 -2
  322. package/dashboard/dist/assets/HomePage-8XsQFqKL.js.map +0 -1
  323. package/dashboard/dist/assets/ListToolbar-DyHaJBTk.js +0 -2
  324. package/dashboard/dist/assets/McpQueryPage-BqqRF5cQ.js +0 -2
  325. package/dashboard/dist/assets/NamespacePill-CJikgGzE.js +0 -2
  326. package/dashboard/dist/assets/OperationsPage-Cj1mJLMC.js +0 -3
  327. package/dashboard/dist/assets/OperationsPage-Cj1mJLMC.js.map +0 -1
  328. package/dashboard/dist/assets/OperatorDashboard-C5rlijvh.js +0 -2
  329. package/dashboard/dist/assets/PersonasPage-Xp_Gt6El.js +0 -2
  330. package/dashboard/dist/assets/PersonasPage-Xp_Gt6El.js.map +0 -1
  331. package/dashboard/dist/assets/ProcessesListPage-DuXTS5-v.js +0 -2
  332. package/dashboard/dist/assets/RoleDetailPage-C9GGHNf4.js +0 -8
  333. package/dashboard/dist/assets/RoleDetailPage-C9GGHNf4.js.map +0 -1
  334. package/dashboard/dist/assets/RolesPage-h77-JOLd.js +0 -2
  335. package/dashboard/dist/assets/RunAsSelector-DoLFJ0mZ.js +0 -2
  336. package/dashboard/dist/assets/ScanCodesPage-b5NZM_-f.js +0 -2
  337. package/dashboard/dist/assets/ScanStationPage-r02hkTAG.js +0 -2
  338. package/dashboard/dist/assets/TasksListPage-Dor8LSc5.js +0 -2
  339. package/dashboard/dist/assets/TimeAgo-Dd8vmRnM.js +0 -2
  340. package/dashboard/dist/assets/ToolTestPanel-CEGY5jss.js +0 -2
  341. package/dashboard/dist/assets/UserName-Dmm456xT.js +0 -2
  342. package/dashboard/dist/assets/UserName-Dmm456xT.js.map +0 -1
  343. package/dashboard/dist/assets/WorkflowExecutionPage-e-Q57yiJ.js +0 -2
  344. package/dashboard/dist/assets/WorkflowPill-Dh3hIW1l.js.map +0 -1
  345. package/dashboard/dist/assets/WorkflowsDashboard-DLKzN80h.js +0 -2
  346. package/dashboard/dist/assets/WorkflowsOverview-J-ITQiO5.js +0 -2
  347. package/dashboard/dist/assets/YamlWorkflowsPage-DQNeERXU.js +0 -2
  348. package/dashboard/dist/assets/capabilities-BvjPXUcJ.js +0 -2
  349. package/dashboard/dist/assets/escalation-columns-Bo3PfIZj.js +0 -2
  350. package/dashboard/dist/assets/escalation-columns-Bo3PfIZj.js.map +0 -1
  351. package/dashboard/dist/assets/index-B8JfGtQB.js +0 -3
  352. package/dashboard/dist/assets/index-B8JfGtQB.js.map +0 -1
  353. package/dashboard/dist/assets/index-Bb9ZZUyB.js +0 -5
  354. package/dashboard/dist/assets/index-Bb9ZZUyB.js.map +0 -1
  355. package/dashboard/dist/assets/index-BhzsR_gZ.js +0 -2
  356. package/dashboard/dist/assets/index-D88VWEVp.js +0 -67
  357. package/dashboard/dist/assets/index-D88VWEVp.js.map +0 -1
  358. package/dashboard/dist/assets/index-DBvkaa-B.js +0 -6
  359. package/dashboard/dist/assets/index-DBvkaa-B.js.map +0 -1
  360. package/dashboard/dist/assets/index-cvmt1plS.js +0 -2
  361. package/dashboard/dist/assets/index-qU_dXqP4.css +0 -1
  362. package/dashboard/dist/assets/useDebouncedValue-DhhAKjDC.js +0 -2
  363. package/dashboard/dist/assets/vendor-icons-R9b9gQ04.js.map +0 -1
  364. package/dashboard/dist/assets/vendor-query-RUZdMvN6.js +0 -18
  365. package/dashboard/dist/assets/vendor-query-RUZdMvN6.js.map +0 -1
  366. package/dashboard/dist/assets/workflows-CYv1CTU0.js +0 -2
  367. package/dashboard/dist/assets/workflows-CYv1CTU0.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CollapsibleSection-BZOtaWPR.js","sources":["../../src/components/common/layout/CollapsibleSection.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Collapsible } from './Collapsible';\n\n/**\n * Shared collapsible section with chevron toggle and horizontal rule.\n * Used by WorkflowExecutionPage, McpRunDetailPage, and YamlWorkflowDetailPage.\n */\nexport function CollapsibleSection({\n title,\n sectionKey,\n isCollapsed,\n onToggle,\n contentClassName,\n children,\n}: {\n title: string;\n sectionKey: string;\n isCollapsed: boolean;\n onToggle: (key: string) => void;\n /** Optional class override for the content wrapper (default: \"mt-4 ml-7\") */\n contentClassName?: string;\n children: ReactNode;\n}) {\n return (\n <div>\n <button\n onClick={() => onToggle(sectionKey)}\n className=\"flex items-center gap-3 w-full group/section\"\n >\n <svg\n className={`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${!isCollapsed ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <span className={`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${isCollapsed ? 'text-text-tertiary' : 'text-text-secondary'}`}>\n {title}\n </span>\n <span className=\"flex-1 border-b border-surface-border\" />\n </button>\n <Collapsible open={!isCollapsed}>\n <div className={contentClassName ?? 'mt-4 ml-7'}>{children}</div>\n </Collapsible>\n </div>\n );\n}\n"],"names":["CollapsibleSection","title","sectionKey","isCollapsed","onToggle","contentClassName","children","jsxs","jsx","Collapsible"],"mappings":"uFAOO,SAASA,EAAmB,CACjC,MAAAC,EACA,WAAAC,EACA,YAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,SAAAC,CACF,EAQG,CACD,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMH,EAASF,CAAU,EAClC,UAAU,+CAEV,SAAA,CAAAM,EAAAA,IAAC,MAAA,CACC,UAAW,6GAA8GL,EAA4B,GAAd,WAAgB,GACvJ,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAEnE,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,cAAA,CAAe,CAAA,CAAA,EAEtEK,EAAAA,IAAC,QAAK,UAAW,kFAAkFL,EAAc,qBAAuB,qBAAqB,GAC1J,SAAAF,CAAA,CACH,EACAO,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAA,CAAwC,CAAA,CAAA,CAAA,EAE1DA,EAAAA,IAACC,EAAA,CAAY,KAAM,CAACN,EAClB,SAAAK,EAAAA,IAAC,MAAA,CAAI,UAAWH,GAAoB,YAAc,SAAAC,CAAA,CAAS,CAAA,CAC7D,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"CollapsibleSection-D10lGw_u.js","sources":["../../src/components/common/layout/CollapsibleSection.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Collapsible } from './Collapsible';\n\n/**\n * Shared collapsible section with chevron toggle and horizontal rule.\n * Used by WorkflowExecutionPage, McpRunDetailPage, and YamlWorkflowDetailPage.\n */\nexport function CollapsibleSection({\n title,\n sectionKey,\n isCollapsed,\n onToggle,\n contentClassName,\n children,\n}: {\n title: string;\n sectionKey: string;\n isCollapsed: boolean;\n onToggle: (key: string) => void;\n /** Optional class override for the content wrapper (default: \"mt-4 ml-7\") */\n contentClassName?: string;\n children: ReactNode;\n}) {\n return (\n <div>\n <button\n onClick={() => onToggle(sectionKey)}\n className=\"flex items-center gap-3 w-full group/section\"\n >\n <svg\n className={`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${!isCollapsed ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <span className={`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${isCollapsed ? 'text-text-tertiary' : 'text-text-secondary'}`}>\n {title}\n </span>\n <span className=\"flex-1 border-b border-surface-border\" />\n </button>\n <Collapsible open={!isCollapsed}>\n <div className={contentClassName ?? 'mt-4 ml-7'}>{children}</div>\n </Collapsible>\n </div>\n );\n}\n"],"names":["CollapsibleSection","title","sectionKey","isCollapsed","onToggle","contentClassName","children","jsxs","jsx","Collapsible"],"mappings":"uFAOO,SAASA,EAAmB,CACjC,MAAAC,EACA,WAAAC,EACA,YAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,SAAAC,CACF,EAQG,CACD,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMH,EAASF,CAAU,EAClC,UAAU,+CAEV,SAAA,CAAAM,EAAAA,IAAC,MAAA,CACC,UAAW,6GAA8GL,EAA4B,GAAd,WAAgB,GACvJ,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAEnE,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,cAAA,CAAe,CAAA,CAAA,EAEtEK,EAAAA,IAAC,QAAK,UAAW,kFAAkFL,EAAc,qBAAuB,qBAAqB,GAC1J,SAAAF,CAAA,CACH,EACAO,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAA,CAAwC,CAAA,CAAA,CAAA,EAE1DA,EAAAA,IAACC,EAAA,CAAY,KAAM,CAACN,EAClB,SAAAK,EAAAA,IAAC,MAAA,CAAI,UAAWH,GAAoB,YAAc,SAAAC,CAAA,CAAS,CAAA,CAC7D,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-RUZdMvN6.js";import{M as i}from"./index-D88VWEVp.js";function d({open:r,onClose:t,onConfirm:x,title:n,description:c,isPending:s,error:a}){return e.jsx(i,{open:r,onClose:t,title:n,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:c}),a&&e.jsx("p",{className:"text-xs text-status-error",children:a.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:t,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:x,className:"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:s,children:s?"Deleting...":"Delete"})]})]})})}export{d as C};
2
- //# sourceMappingURL=ConfirmDeleteModal-6CidwpPx.js.map
1
+ import{j as e}from"./vendor-query-DvWWuNIB.js";import{M as i}from"./index-BMlQYOE1.js";function d({open:r,onClose:t,onConfirm:x,title:n,description:c,isPending:s,error:a}){return e.jsx(i,{open:r,onClose:t,title:n,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:c}),a&&e.jsx("p",{className:"text-xs text-status-error",children:a.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:t,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:x,className:"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:s,children:s?"Deleting...":"Delete"})]})]})})}export{d as C};
2
+ //# sourceMappingURL=ConfirmDeleteModal-BJdLN6No.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDeleteModal-6CidwpPx.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-text-inverse 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,uGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
1
+ {"version":3,"file":"ConfirmDeleteModal-BJdLN6No.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-text-inverse 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,uGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{a as h,j as t}from"./vendor-query-RUZdMvN6.js";import{u as m}from"./vendor-react-CdqEC2zv.js";const f=20;function l(o,e=f){if(o.length<=e)return o;const n=Math.floor((e-1)/2);return`${o.slice(0,n)}…${o.slice(-n)}`}function k({label:o,value:e,href:n,external:p,bare:x}){const[i,a]=h.useState(!1),d=m();if(!e)return null;const r=s=>{s.stopPropagation(),navigator.clipboard.writeText(e),a(!0),setTimeout(()=>a(!1),1500)},u=s=>{s.stopPropagation(),n&&(p?window.open(n,"_blank","noopener,noreferrer"):d(n))},c=t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:r,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:`w-3 h-3 transition-colors ${i?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:i?t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),n&&t.jsx("button",{onClick:u,title:`View ${o??"link"}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})})})]});return x?t.jsxs("span",{className:"flex items-center gap-1 group relative",children:[t.jsx("button",{onClick:r,title:e,className:"font-mono text-text-primary group-hover:text-accent transition-colors",children:l(e)}),c]}):t.jsxs("div",{className:"text-left group relative",children:[t.jsx("span",{className:"text-2xs font-medium text-text-secondary uppercase tracking-wide",children:o}),t.jsxs("span",{className:"flex items-center gap-1 mt-0.5",children:[t.jsx("button",{onClick:r,title:e,className:"flex-1 text-left text-xs font-mono text-text-primary group-hover:text-accent transition-colors",children:l(e)}),c]})]})}export{k as C};
2
- //# sourceMappingURL=CopyableId-4Lqlc5cU.js.map
1
+ import{a as h,j as t}from"./vendor-query-DvWWuNIB.js";import{u as m}from"./vendor-react-_9U4mKFr.js";const f=20;function l(o,e=f){if(o.length<=e)return o;const n=Math.floor((e-1)/2);return`${o.slice(0,n)}…${o.slice(-n)}`}function k({label:o,value:e,href:n,external:p,bare:x}){const[i,a]=h.useState(!1),d=m();if(!e)return null;const r=s=>{s.stopPropagation(),navigator.clipboard.writeText(e),a(!0),setTimeout(()=>a(!1),1500)},u=s=>{s.stopPropagation(),n&&(p?window.open(n,"_blank","noopener,noreferrer"):d(n))},c=t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:r,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:`w-3 h-3 transition-colors ${i?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:i?t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),n&&t.jsx("button",{onClick:u,title:`View ${o??"link"}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})})})]});return x?t.jsxs("span",{className:"flex items-center gap-1 group relative",children:[t.jsx("button",{onClick:r,title:e,className:"font-mono text-text-primary group-hover:text-accent transition-colors",children:l(e)}),c]}):t.jsxs("div",{className:"text-left group relative",children:[t.jsx("span",{className:"text-2xs font-medium text-text-secondary uppercase tracking-wide",children:o}),t.jsxs("span",{className:"flex items-center gap-1 mt-0.5",children:[t.jsx("button",{onClick:r,title:e,className:"flex-1 text-left text-xs font-mono text-text-primary group-hover:text-accent transition-colors",children:l(e)}),c]})]})}export{k as C};
2
+ //# sourceMappingURL=CopyableId-Bn02zYxt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CopyableId-4Lqlc5cU.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-2xs 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=\"flex-1 text-left text-xs 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,mEAAoE,SAAAhB,EAAM,EAC1Fc,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO,QAASN,EAAY,MAAOT,EAAO,UAAU,iGAClD,SAAAN,EAAeM,CAAK,CAAA,CACvB,EACCY,CAAA,CAAA,CACH,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"CopyableId-Bn02zYxt.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-2xs 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=\"flex-1 text-left text-xs 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,mEAAoE,SAAAhB,EAAM,EAC1Fc,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAE,EAAAA,IAAC,SAAA,CAAO,QAASN,EAAY,MAAOT,EAAO,UAAU,iGAClD,SAAAN,EAAeM,CAAK,CAAA,CACvB,EACCY,CAAA,CAAA,CACH,CAAA,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{a as r,j as n}from"./vendor-query-DvWWuNIB.js";import{aq as c,ar as m,as as i}from"./index-BMlQYOE1.js";const a=[{maxMs:0,color:"text-status-error"},{maxMs:300*1e3,color:"text-status-error"},{maxMs:900*1e3,color:"text-status-warning"},{maxMs:1/0,color:"text-text-secondary"}];function x(t){if(t<=0)return a[0].color;for(const e of a)if(t<e.maxMs)return e.color;return a[a.length-1].color}function M({until:t}){const[e,s]=r.useState(()=>new Date(t).getTime()-Date.now());r.useEffect(()=>{const o=setInterval(()=>{s(new Date(t).getTime()-Date.now())},1e3);return()=>clearInterval(o)},[t]);const l=r.useMemo(()=>{const o=new Date(t);return[{label:"ms",value:String(Math.max(0,e))},{label:"until",value:o.toISOString()},{label:"local",value:c(o,"MMM d, yyyy h:mm:ss a")}]},[t,e]);return n.jsx(m,{options:l,children:n.jsx("span",{className:`text-xs font-mono ${x(e)}`,children:i(e)})})}export{M as C};
2
+ //# sourceMappingURL=CountdownTimer-D9B-BjQ7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CountdownTimer-D9B-BjQ7.js","sources":["../../src/components/common/display/CountdownTimer.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { format as fnsFormat } from 'date-fns';\nimport { formatRemaining } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\nconst COUNTDOWN_THRESHOLDS = [\n { maxMs: 0, color: 'text-status-error' },\n { maxMs: 5 * 60 * 1000, color: 'text-status-error' },\n { maxMs: 15 * 60 * 1000, color: 'text-status-warning' },\n { maxMs: Infinity, color: 'text-text-secondary' },\n] as const;\n\nfunction countdownColor(remainingMs: number): string {\n if (remainingMs <= 0) return COUNTDOWN_THRESHOLDS[0].color;\n for (const t of COUNTDOWN_THRESHOLDS) {\n if (remainingMs < t.maxMs) return t.color;\n }\n return COUNTDOWN_THRESHOLDS[COUNTDOWN_THRESHOLDS.length - 1].color;\n}\n\nexport function CountdownTimer({ until }: { until: string }) {\n const [remaining, setRemaining] = useState(() => new Date(until).getTime() - Date.now());\n\n useEffect(() => {\n const interval = setInterval(() => {\n setRemaining(new Date(until).getTime() - Date.now());\n }, 1000);\n return () => clearInterval(interval);\n }, [until]);\n\n const options = useMemo(() => {\n const d = new Date(until);\n return [\n { label: 'ms', value: String(Math.max(0, remaining)) },\n { label: 'until', value: d.toISOString() },\n { label: 'local', value: fnsFormat(d, 'MMM d, yyyy h:mm:ss a') },\n ];\n }, [until, remaining]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs font-mono ${countdownColor(remaining)}`}>\n {formatRemaining(remaining)}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","options","useMemo","d","fnsFormat","jsx","DateTooltip","formatRemaining"],"mappings":"+GAKA,MAAMA,EAAuB,CAC3B,CAAE,MAAO,EAAgB,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAS,IAAO,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAU,IAAM,MAAO,qBAAA,EAChC,CAAE,MAAO,IAAiB,MAAO,qBAAA,CACnC,EAEA,SAASC,EAAeC,EAA6B,CACnD,GAAIA,GAAe,EAAG,OAAOF,EAAqB,CAAC,EAAE,MACrD,UAAWG,KAAKH,EACd,GAAIE,EAAcC,EAAE,MAAO,OAAOA,EAAE,MAEtC,OAAOH,EAAqBA,EAAqB,OAAS,CAAC,EAAE,KAC/D,CAEO,SAASI,EAAe,CAAE,MAAAC,GAA4B,CAC3D,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,IAAM,IAAI,KAAKH,CAAK,EAAE,QAAA,EAAY,KAAK,KAAK,EAEvFI,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YAAY,IAAM,CACjCH,EAAa,IAAI,KAAKF,CAAK,EAAE,UAAY,KAAK,KAAK,CACrD,EAAG,GAAI,EACP,MAAO,IAAM,cAAcK,CAAQ,CACrC,EAAG,CAACL,CAAK,CAAC,EAEV,MAAMM,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,EAAI,IAAI,KAAKR,CAAK,EACxB,MAAO,CACL,CAAE,MAAO,KAAM,MAAO,OAAO,KAAK,IAAI,EAAGC,CAAS,CAAC,CAAA,EACnD,CAAE,MAAO,QAAS,MAAOO,EAAE,aAAY,EACvC,CAAE,MAAO,QAAS,MAAOC,EAAUD,EAAG,uBAAuB,CAAA,CAAE,CAEnE,EAAG,CAACR,EAAOC,CAAS,CAAC,EAErB,OACES,EAAAA,IAACC,EAAA,CAAY,QAAAL,EACX,SAAAI,MAAC,QAAK,UAAW,qBAAqBd,EAAeK,CAAS,CAAC,GAC5D,SAAAW,EAAgBX,CAAS,EAC5B,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{a as i,j as e}from"./vendor-query-RUZdMvN6.js";import{aZ as g,a_ as N,a$ as p,aF as f,aG as C}from"./index-D88VWEVp.js";import{P as k}from"./PageHeader-DZmymFBS.js";import{T as A}from"./TimeAgo-Dd8vmRnM.js";import{C as w}from"./ConfirmDeleteModal-6CidwpPx.js";import{f as P,s as T,aI as O,T as I}from"./vendor-icons-R9b9gQ04.js";import"./vendor-react-CdqEC2zv.js";const o={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 F(){var d,x;const{data:r,isLoading:m}=g(),n=N(),[a,l]=i.useState(null),[h,u]=i.useState(!1),[s,j]=i.useState("anthropic"),c=(r==null?void 0:r.connections)??[],v=()=>{a&&n.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},b=t=>`${f}/api/auth/oauth/connect/${t}?token=${encodeURIComponent(C()||"")}&returnTo=/credentials`;return e.jsxs("div",{children:[e.jsx(k,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxs("button",{onClick:()=>u(t=>!t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(P,{className:"w-3.5 h-3.5"}),"Add Credential"]})}),e.jsx("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."}),h&&e.jsxs("div",{className:"mb-6 pb-5 border-b border-surface-border/60 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"}),e.jsxs("div",{className:"relative",children:[e.jsx("select",{value:s,onChange:t=>j(t.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(o).map(([t,y])=>e.jsx("option",{value:t,children:y.name},t))}),e.jsx(T,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"})]})]}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(d=o[s])==null?void 0:d.helpText}),e.jsxs("a",{href:b(s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(p,{provider:s,className:"w-3.5 h-3.5"}),"Connect ",(x=o[s])==null?void 0:x.name]})]}),m?e.jsx("div",{className:"animate-pulse space-y-3",children:[1,2].map(t=>e.jsx("div",{className:"h-16 bg-surface-sunken rounded"},t))}):c.length===0?e.jsxs("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsx(O,{className:"w-10 h-10 mx-auto mb-3 opacity-40"}),e.jsx("p",{className:"text-sm",children:"No credentials registered."}),e.jsx("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."})]}):e.jsx("div",{className:"divide-y divide-surface-border/30",children:c.map(t=>e.jsxs("div",{className:"group/row flex items-center gap-4 px-3 py-2.5 -mx-3",children:[e.jsx(p,{provider:t.provider,className:"w-6 h-6 shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-text-primary font-medium capitalize",children:t.provider}),t.label!=="default"&&e.jsx("span",{className:"text-2xs px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:t.label}),t.credential_type&&e.jsx("span",{className:"text-2xs px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:t.credential_type})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-0.5",children:[t.email&&e.jsx("span",{className:"text-xs text-text-tertiary",children:t.email}),t.expires_at&&e.jsxs("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsx(A,{date:t.expires_at})]})]})]}),e.jsx("button",{onClick:()=>l({provider:t.provider,label:t.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsx(I,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(w,{open:!!a,onClose:()=>l(null),onConfirm:v,title:"Revoke Credential",description:e.jsxs(e.Fragment,{children:["Revoke the"," ",e.jsx("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider}),(a==null?void 0:a.label)!=="default"&&e.jsxs(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]})," ","credential? Tools will no longer be able to use this credential."]}),isPending:n.isPending,error:n.error})]})}export{F as CredentialsPage};
2
- //# sourceMappingURL=CredentialsPage-dxjrUEyO.js.map
1
+ import{a as i,j as e}from"./vendor-query-DvWWuNIB.js";import{bd as g,be as N,bf as p,aU as f,aV as C}from"./index-BMlQYOE1.js";import{P as k}from"./PageHeader-Di5Sz3an.js";import{T as A}from"./TimeAgo-Cv35DOiI.js";import{C as w}from"./ConfirmDeleteModal-BJdLN6No.js";import{g as P,C as T,bx as O,y as S}from"./vendor-icons-DeBdvyKJ.js";import"./vendor-react-_9U4mKFr.js";const o={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 G(){var d,x;const{data:r,isLoading:m}=g(),n=N(),[s,l]=i.useState(null),[h,u]=i.useState(!1),[a,j]=i.useState("anthropic"),c=(r==null?void 0:r.connections)??[],b=()=>{s&&n.mutate({provider:s.provider,label:s.label},{onSuccess:()=>l(null)})},v=t=>`${f}/api/auth/oauth/connect/${t}?token=${encodeURIComponent(C()||"")}&returnTo=/credentials`;return e.jsxs("div",{children:[e.jsx(k,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxs("button",{onClick:()=>u(t=>!t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(P,{className:"w-3.5 h-3.5"}),"Add Credential"]})}),e.jsx("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."}),h&&e.jsxs("div",{className:"mb-6 pb-5 border-b border-surface-border/60 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"}),e.jsxs("div",{className:"relative",children:[e.jsx("select",{value:a,onChange:t=>j(t.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(o).map(([t,y])=>e.jsx("option",{value:t,children:y.name},t))}),e.jsx(T,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"})]})]}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(d=o[a])==null?void 0:d.helpText}),e.jsxs("a",{href:v(a),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(p,{provider:a,className:"w-3.5 h-3.5"}),"Connect ",(x=o[a])==null?void 0:x.name]})]}),m?e.jsx("div",{className:"animate-pulse space-y-3",children:[1,2].map(t=>e.jsx("div",{className:"h-16 bg-surface-sunken rounded"},t))}):c.length===0?e.jsxs("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsx(O,{className:"w-10 h-10 mx-auto mb-3 opacity-40"}),e.jsx("p",{className:"text-sm",children:"No credentials registered."}),e.jsx("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."})]}):e.jsx("div",{className:"divide-y divide-surface-border/30",children:c.map(t=>e.jsxs("div",{className:"group/row flex items-center gap-4 px-3 py-2.5 -mx-3",children:[e.jsx(p,{provider:t.provider,className:"w-6 h-6 shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-text-primary font-medium capitalize",children:t.provider}),t.label!=="default"&&e.jsx("span",{className:"text-2xs px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:t.label}),t.credential_type&&e.jsx("span",{className:"text-2xs px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:t.credential_type})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-0.5",children:[t.email&&e.jsx("span",{className:"text-xs text-text-tertiary",children:t.email}),t.expires_at&&e.jsxs("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsx(A,{date:t.expires_at})]})]})]}),e.jsx("button",{onClick:()=>l({provider:t.provider,label:t.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsx(S,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(w,{open:!!s,onClose:()=>l(null),onConfirm:b,title:"Revoke Credential",description:e.jsxs(e.Fragment,{children:["Revoke the"," ",e.jsx("span",{className:"font-medium text-text-primary capitalize",children:s==null?void 0:s.provider}),(s==null?void 0:s.label)!=="default"&&e.jsxs(e.Fragment,{children:[" (",s==null?void 0:s.label,")"]})," ","credential? Tools will no longer be able to use this credential."]}),isPending:n.isPending,error:n.error})]})}export{G as CredentialsPage};
2
+ //# sourceMappingURL=CredentialsPage-hniUAFBK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CredentialsPage-dxjrUEyO.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-2xs 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-2xs 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","jsx","PageHeader","jsxs","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"CredentialsPage-hniUAFBK.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-2xs 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-2xs 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","jsx","PageHeader","jsxs","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{u as c,b as r,c as o,j as n}from"./vendor-query-RUZdMvN6.js";import{l as i}from"./index-D88VWEVp.js";import{R as l,aq as y}from"./vendor-icons-R9b9gQ04.js";function g(e){return c({queryKey:["agent-subscriptions",e],queryFn:()=>i(`/agents/${e}/subscriptions`),enabled:!!e})}function b(){const e=r();return o({mutationFn:({agentId:t,...s})=>i(`/agents/${t}/subscriptions`,{method:"POST",body:JSON.stringify(s)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function f(){const e=r();return o({mutationFn:({agentId:t,subId:s,...a})=>i(`/agents/${t}/subscriptions/${s}`,{method:"PUT",body:JSON.stringify(a)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]})}})}function h(){const e=r();return o({mutationFn:({agentId:t,subId:s})=>i(`/agents/${t}/subscriptions/${s}`,{method:"DELETE"}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.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 q({topic:e}){const t=e.split("."),s=t[0]==="system"?t[1]:t[0],a=p[s]??"text-text-quaternary",u=t[0]==="system"?`${t[1]}.${t[t.length-1]}`:t.slice(-2).join(".");return n.jsxs("span",{className:"inline-flex items-center gap-1 text-2xs font-mono text-text-secondary",children:[n.jsx(l,{className:`w-2.5 h-2.5 shrink-0 ${a}`,strokeWidth:1.5}),u]})}function C({cron:e}){return n.jsxs("span",{className:"inline-flex items-center gap-1 text-2xs font-mono text-text-secondary",children:[n.jsx(y,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5}),e]})}export{C,q as E,b as a,f as b,h as c,g as u};
2
- //# sourceMappingURL=CronLabel-D8oo8eaA.js.map
1
+ import{u as c,b as r,c as o,j as n}from"./vendor-query-DvWWuNIB.js";import{m as i}from"./index-BMlQYOE1.js";import{R as l,ar as y}from"./vendor-icons-DeBdvyKJ.js";function g(e){return c({queryKey:["agent-subscriptions",e],queryFn:()=>i(`/agents/${e}/subscriptions`),enabled:!!e})}function b(){const e=r();return o({mutationFn:({agentId:t,...s})=>i(`/agents/${t}/subscriptions`,{method:"POST",body:JSON.stringify(s)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function f(){const e=r();return o({mutationFn:({agentId:t,subId:s,...a})=>i(`/agents/${t}/subscriptions/${s}`,{method:"PUT",body:JSON.stringify(a)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]})}})}function h(){const e=r();return o({mutationFn:({agentId:t,subId:s})=>i(`/agents/${t}/subscriptions/${s}`,{method:"DELETE"}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.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 q({topic:e}){const t=e.split("."),s=t[0]==="system"?t[1]:t[0],a=p[s]??"text-text-quaternary",u=t[0]==="system"?`${t[1]}.${t[t.length-1]}`:t.slice(-2).join(".");return n.jsxs("span",{className:"inline-flex items-center gap-1 text-2xs font-mono text-text-secondary",children:[n.jsx(l,{className:`w-2.5 h-2.5 shrink-0 ${a}`,strokeWidth:1.5}),u]})}function C({cron:e}){return n.jsxs("span",{className:"inline-flex items-center gap-1 text-2xs font-mono text-text-secondary",children:[n.jsx(y,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5}),e]})}export{C,q as E,b as a,f as b,h as c,g as u};
2
+ //# sourceMappingURL=CronLabel-v9DCD2FX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CronLabel-D8oo8eaA.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-2xs 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-2xs 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","jsxs","jsx","Radio","CronLabel","cron","Clock"],"mappings":"mKAyBO,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,KAAC,OAAA,CAAK,UAAU,wEACd,SAAA,CAAAC,MAACC,GAAM,UAAW,wBAAwBJ,CAAS,GAAI,YAAa,IAAK,EACxEC,CAAA,EACH,CAEJ,CC5BO,SAASI,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEJ,EAAAA,KAAC,OAAA,CAAK,UAAU,wEACd,SAAA,CAAAC,EAAAA,IAACI,EAAA,CAAM,UAAU,4CAA4C,YAAa,IAAK,EAC9ED,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"CronLabel-v9DCD2FX.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-2xs 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-2xs 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","jsxs","jsx","Radio","CronLabel","cron","Clock"],"mappings":"mKAyBO,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,KAAC,OAAA,CAAK,UAAU,wEACd,SAAA,CAAAC,MAACC,GAAM,UAAW,wBAAwBJ,CAAS,GAAI,YAAa,IAAK,EACxEC,CAAA,EACH,CAEJ,CC5BO,SAASI,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEJ,EAAAA,KAAC,OAAA,CAAK,UAAU,wEACd,SAAA,CAAAC,EAAAA,IAACI,EAAA,CAAM,UAAU,4CAA4C,YAAa,IAAK,EAC9ED,CAAA,EACH,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{a as m,j as e}from"./vendor-query-RUZdMvN6.js";import{E}from"./EmptyState-lpUFYfun.js";function F(){const[r,t]=m.useState(null),[d,a]=m.useState(null),s=m.useCallback(i=>t(i),[]);return m.useEffect(()=>{if(!r||typeof ResizeObserver>"u")return;const i=new ResizeObserver(p=>{const o=p[0];o&&a(o.contentRect.width)});return i.observe(r),()=>i.disconnect()},[r]),[s,d]}const v={split:"hidden @split/table:table-cell",wall:"hidden @wall/table:table-cell"};function S(r){const t=r.some(i=>i.priority!==void 0),d=[],a=[],s=[];return r.forEach((i,p)=>{const o=i.priority??(t?2:p===0?1:2);o===1?d.push(i):o===3?s.push(i):a.push(i)}),{identity:d,meta:a,dropped:s}}const A=48;function C(){if(typeof window>"u"||typeof document>"u")return 16;const r=parseFloat(getComputedStyle(document.documentElement).fontSize);return Number.isFinite(r)&&r>0?r:16}function z({active:r,direction:t}){return e.jsx("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${r?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${r&&t==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})}function D({columns:r,sort:t,onSort:d}){const a=r.filter(s=>s.sortable);return a.length===0?null:e.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 border-b",children:[e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wide text-text-tertiary",children:"Sort"}),e.jsxs("select",{className:"select text-2xs py-1",value:(t==null?void 0:t.sort_by)??"",onChange:s=>s.target.value&&d(s.target.value),children:[!(t!=null&&t.sort_by)&&e.jsx("option",{value:"",disabled:!0,children:"Choose…"}),a.map(s=>e.jsx("option",{value:s.key,children:typeof s.label=="string"?s.label:s.key},s.key))]}),(t==null?void 0:t.sort_by)&&e.jsx("button",{onClick:()=>d(t.sort_by),className:"text-2xs text-text-tertiary hover:text-accent transition-colors tabular-nums",title:"Flip sort direction",children:t.order==="asc"?"↑ asc":"↓ desc"})]})}function M({columns:r,data:t,keyFn:d,onRowClick:a,activeRowKey:s,rowClassName:i,isLoading:p,emptyMessage:o="No records found",sort:h,onSort:b,inline:g,layout:N="auto",forceCardMode:k}){const[f,y]=F(),$=k??(y!==null&&y<A*C());if(p)return e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((n,c)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},c))});if(!t.length)return o?e.jsx(E,{title:o}):null;if($){const{identity:n,meta:c}=S(r),x=Math.max(0,n.findIndex(l=>!/(^|\s)w-\d/.test(l.className??"")));return e.jsxs("div",{ref:f,className:"@container/table",children:[b&&e.jsx(D,{columns:r,sort:h,onSort:b}),e.jsx("div",{className:"divide-y divide-surface-border",children:t.map((l,j)=>{const w=s!=null&&d(l)===s;return e.jsxs("div",{onClick:a?()=>a(l):void 0,className:`py-3 px-4 transition-colors duration-100 ${a?"cursor-pointer row-hover":""} ${w?"border-l-2 border-l-accent":""} ${i?i(l):""}`,children:[e.jsx("div",{className:"flex items-center gap-2 min-w-0",children:n.map((u,_)=>e.jsx("div",{className:_===x?"flex-1 min-w-0":"shrink-0",children:u.render(l,j)},u.key))}),c.length>0&&e.jsx("dl",{className:"mt-2 grid grid-cols-1 @dict-inline/table:grid-cols-[max-content_1fr] gap-x-6 gap-y-1 items-baseline",children:c.map(u=>e.jsxs(m.Fragment,{children:[e.jsx("dt",{className:"text-2xs font-semibold uppercase tracking-wide text-text-tertiary",children:u.label}),e.jsx("dd",{className:"text-sm min-w-0 break-words",children:u.render(l,j)})]},u.key))})]},d(l))})})]})}return e.jsx("div",{ref:f,className:"@container/table",children:e.jsxs("table",{className:`w-full ${N==="fixed"?"table-fixed":""}`,children:[e.jsx("thead",{children:e.jsx("tr",{className:"border-b",children:r.map(n=>{const c=n.sortable&&b,x=(h==null?void 0:h.sort_by)===n.key;return e.jsx("th",{onClick:c?()=>b(n.key):void 0,style:n.width?{width:n.width}:void 0,className:`${g?"":"sticky top-[var(--lt-sticky-top,60px)] z-10 "}bg-surface px-6 py-3 text-left text-2xs font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${n.showFrom?v[n.showFrom]:""} ${n.className??""} ${c?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[n.label,c&&e.jsx(z,{active:x,direction:x?h.order:"desc"})]})},n.key)})})}),e.jsx("tbody",{children:t.map((n,c)=>{const x=s!=null&&d(n)===s;return e.jsx("tr",{onClick:a?()=>a(n):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${a?"cursor-pointer row-hover":""} ${x?"border-l-2 border-l-accent":""} ${i?i(n):""}`,children:r.map(l=>e.jsx("td",{className:`px-6 py-2.5 text-sm overflow-hidden ${l.showFrom?v[l.showFrom]:""} ${l.className??""}`,children:l.render(n,c)},l.key))},d(n))})})]})})}export{M as D};
2
- //# sourceMappingURL=DataTable-DFPMeqyQ.js.map
1
+ import{a as m,j as e}from"./vendor-query-DvWWuNIB.js";import{E}from"./EmptyState-DgC_6njU.js";function F(){const[r,t]=m.useState(null),[d,a]=m.useState(null),s=m.useCallback(i=>t(i),[]);return m.useEffect(()=>{if(!r||typeof ResizeObserver>"u")return;const i=new ResizeObserver(p=>{const o=p[0];o&&a(o.contentRect.width)});return i.observe(r),()=>i.disconnect()},[r]),[s,d]}const v={split:"hidden @split/table:table-cell",wall:"hidden @wall/table:table-cell"};function S(r){const t=r.some(i=>i.priority!==void 0),d=[],a=[],s=[];return r.forEach((i,p)=>{const o=i.priority??(t?2:p===0?1:2);o===1?d.push(i):o===3?s.push(i):a.push(i)}),{identity:d,meta:a,dropped:s}}const A=48;function C(){if(typeof window>"u"||typeof document>"u")return 16;const r=parseFloat(getComputedStyle(document.documentElement).fontSize);return Number.isFinite(r)&&r>0?r:16}function z({active:r,direction:t}){return e.jsx("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${r?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${r&&t==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})}function D({columns:r,sort:t,onSort:d}){const a=r.filter(s=>s.sortable);return a.length===0?null:e.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 border-b",children:[e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wide text-text-tertiary",children:"Sort"}),e.jsxs("select",{className:"select text-2xs py-1",value:(t==null?void 0:t.sort_by)??"",onChange:s=>s.target.value&&d(s.target.value),children:[!(t!=null&&t.sort_by)&&e.jsx("option",{value:"",disabled:!0,children:"Choose…"}),a.map(s=>e.jsx("option",{value:s.key,children:typeof s.label=="string"?s.label:s.key},s.key))]}),(t==null?void 0:t.sort_by)&&e.jsx("button",{onClick:()=>d(t.sort_by),className:"text-2xs text-text-tertiary hover:text-accent transition-colors tabular-nums",title:"Flip sort direction",children:t.order==="asc"?"↑ asc":"↓ desc"})]})}function M({columns:r,data:t,keyFn:d,onRowClick:a,activeRowKey:s,rowClassName:i,isLoading:p,emptyMessage:o="No records found",sort:h,onSort:b,inline:g,layout:N="auto",forceCardMode:k}){const[f,y]=F(),$=k??(y!==null&&y<A*C());if(p)return e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((n,c)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},c))});if(!t.length)return o?e.jsx(E,{title:o}):null;if($){const{identity:n,meta:c}=S(r),x=Math.max(0,n.findIndex(l=>!/(^|\s)w-\d/.test(l.className??"")));return e.jsxs("div",{ref:f,className:"@container/table",children:[b&&e.jsx(D,{columns:r,sort:h,onSort:b}),e.jsx("div",{className:"divide-y divide-surface-border",children:t.map((l,j)=>{const w=s!=null&&d(l)===s;return e.jsxs("div",{onClick:a?()=>a(l):void 0,className:`py-3 px-4 transition-colors duration-100 ${a?"cursor-pointer row-hover":""} ${w?"border-l-2 border-l-accent":""} ${i?i(l):""}`,children:[e.jsx("div",{className:"flex items-center gap-2 min-w-0",children:n.map((u,_)=>e.jsx("div",{className:_===x?"flex-1 min-w-0":"shrink-0",children:u.render(l,j)},u.key))}),c.length>0&&e.jsx("dl",{className:"mt-2 grid grid-cols-1 @dict-inline/table:grid-cols-[max-content_1fr] gap-x-6 gap-y-1 items-baseline",children:c.map(u=>e.jsxs(m.Fragment,{children:[e.jsx("dt",{className:"text-2xs font-semibold uppercase tracking-wide text-text-tertiary",children:u.label}),e.jsx("dd",{className:"text-sm min-w-0 break-words",children:u.render(l,j)})]},u.key))})]},d(l))})})]})}return e.jsx("div",{ref:f,className:"@container/table",children:e.jsxs("table",{className:`w-full ${N==="fixed"?"table-fixed":""}`,children:[e.jsx("thead",{children:e.jsx("tr",{className:"border-b",children:r.map(n=>{const c=n.sortable&&b,x=(h==null?void 0:h.sort_by)===n.key;return e.jsx("th",{onClick:c?()=>b(n.key):void 0,style:n.width?{width:n.width}:void 0,className:`${g?"":"sticky top-[var(--lt-sticky-top,60px)] z-10 "}bg-surface px-6 py-3 text-left text-2xs font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${n.showFrom?v[n.showFrom]:""} ${n.className??""} ${c?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[n.label,c&&e.jsx(z,{active:x,direction:x?h.order:"desc"})]})},n.key)})})}),e.jsx("tbody",{children:t.map((n,c)=>{const x=s!=null&&d(n)===s;return e.jsx("tr",{onClick:a?()=>a(n):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${a?"cursor-pointer row-hover":""} ${x?"border-l-2 border-l-accent":""} ${i?i(n):""}`,children:r.map(l=>e.jsx("td",{className:`px-6 py-2.5 text-sm overflow-hidden ${l.showFrom?v[l.showFrom]:""} ${l.className??""}`,children:l.render(n,c)},l.key))},d(n))})})]})})}export{M as D};
2
+ //# sourceMappingURL=DataTable-7C7riavf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable-DFPMeqyQ.js","sources":["../../src/hooks/useContainerWidth.ts","../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\n/**\n * Measures an element's content-box width via ResizeObserver — the hook form\n * of \"geometry follows the container\". Returns a CALLBACK ref (the observed\n * element can mount late, e.g. after a loading state) and the width: `null`\n * before the first measure and in environments without ResizeObserver\n * (jsdom), which callers treat as \"wide\".\n */\nexport function useContainerWidth<T extends HTMLElement>(): [(node: T | null) => void, number | null] {\n const [el, setEl] = useState<T | null>(null);\n const [width, setWidth] = useState<number | null>(null);\n\n const ref = useCallback((node: T | null) => setEl(node), []);\n\n useEffect(() => {\n if (!el || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setWidth(entry.contentRect.width);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [el]);\n\n return [ref, width];\n}\n","import { Fragment, type ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport { useContainerWidth } from '../../../hooks/useContainerWidth';\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 /** CSS width for the column (e.g. \"40%\", \"12rem\") — set on the header cell,\n * which sizes the whole column under `layout=\"fixed\"`. */\n width?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n /**\n * Card-fold behavior when the container drops below the @table threshold:\n * 1 = identity — always visible, forms the card's title line;\n * 2 = folds into the card body as a label/value pair (default);\n * 3 = dropped in card mode.\n */\n priority?: 1 | 2 | 3;\n /**\n * Table-mode disclosure: the column renders only when the table's\n * container clears the named threshold. The column budget governs the\n * floor; enrichment columns return with room.\n */\n showFrom?: 'split' | 'wall';\n}\n\n/* Literal class strings so Tailwind's scanner sees the container variants. */\nconst SHOW_FROM_CLASS: Record<NonNullable<Column<unknown>['showFrom']>, string> = {\n split: 'hidden @split/table:table-cell',\n wall: 'hidden @wall/table:table-cell',\n};\n\n/**\n * Split columns by card-fold priority. When NO column declares a priority,\n * the first column is the identity and the rest fold — the sane default for\n * every list page. When any column declares one, undeclared columns fold.\n * Exported for tests.\n */\nexport function partitionColumns<T>(columns: Column<T>[]): {\n identity: Column<T>[];\n meta: Column<T>[];\n dropped: Column<T>[];\n} {\n const anyDeclared = columns.some((c) => c.priority !== undefined);\n const identity: Column<T>[] = [];\n const meta: Column<T>[] = [];\n const dropped: Column<T>[] = [];\n columns.forEach((col, i) => {\n const priority = col.priority ?? (anyDeclared ? 2 : i === 0 ? 1 : 2);\n if (priority === 1) identity.push(col);\n else if (priority === 3) dropped.push(col);\n else meta.push(col);\n });\n return { identity, meta, dropped };\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 * `fixed` locks the table to its container width: columns with width\n * classes keep them, the rest share the remainder, and long content\n * truncates instead of widening the table. Use beside a slide panel where\n * the table must shrink as the panel expands.\n */\n layout?: 'auto' | 'fixed';\n /** Force console-card rendering regardless of measured width (tests). */\n forceCardMode?: boolean;\n}\n\n/** The @table threshold in rem — below this the table folds into cards. */\nconst CARD_FOLD_REM = 48;\n\nfunction rootFontPx(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 16;\n const size = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return Number.isFinite(size) && size > 0 ? size : 16;\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\n/** Compact sort control for card mode, where there is no header row. */\nfunction CardSortControl<T>({ columns, sort, onSort }: {\n columns: Column<T>[];\n sort?: SortState;\n onSort: (column: string) => void;\n}) {\n const sortable = columns.filter((c) => c.sortable);\n if (sortable.length === 0) return null;\n return (\n <div className=\"flex items-center gap-2 px-4 py-2 border-b\">\n <span className=\"text-2xs font-semibold uppercase tracking-wide text-text-tertiary\">Sort</span>\n <select\n className=\"select text-2xs py-1\"\n value={sort?.sort_by ?? ''}\n onChange={(e) => e.target.value && onSort(e.target.value)}\n >\n {!sort?.sort_by && <option value=\"\" disabled>Choose…</option>}\n {sortable.map((c) => (\n <option key={c.key} value={c.key}>{typeof c.label === 'string' ? c.label : c.key}</option>\n ))}\n </select>\n {sort?.sort_by && (\n <button\n onClick={() => onSort(sort.sort_by)}\n className=\"text-2xs text-text-tertiary hover:text-accent transition-colors tabular-nums\"\n title=\"Flip sort direction\"\n >\n {sort.order === 'asc' ? '↑ asc' : '↓ desc'}\n </button>\n )}\n </div>\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 layout = 'auto',\n forceCardMode,\n}: DataTableProps<T>) {\n const [wrapRef, width] = useContainerWidth<HTMLDivElement>();\n const cardMode = forceCardMode ?? (width !== null && width < CARD_FOLD_REM * rootFontPx());\n\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 if (cardMode) {\n // A table row IS a dictionary: identity columns form the title line, the\n // rest fold into dense console-style pairs. Tables never scroll\n // horizontally — they fold.\n const { identity, meta } = partitionColumns(columns);\n // The title line: glyph/width-classed identity columns (status dots,\n // checkboxes, countdowns) hold their size; the first free-width identity\n // column (the description) flexes and truncates.\n const flexAt = Math.max(0, identity.findIndex((c) => !/(^|\\s)w-\\d/.test(c.className ?? '')));\n return (\n <div ref={wrapRef} className=\"@container/table\">\n {onSort && <CardSortControl columns={columns} sort={sort} onSort={onSort} />}\n <div className=\"divide-y divide-surface-border\">\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <div\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`py-3 px-4 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n {identity.map((col, i) => (\n <div key={col.key} className={i === flexAt ? 'flex-1 min-w-0' : 'shrink-0'}>\n {col.render(row, index)}\n </div>\n ))}\n </div>\n {meta.length > 0 && (\n <dl className=\"mt-2 grid grid-cols-1 @dict-inline/table:grid-cols-[max-content_1fr] gap-x-6 gap-y-1 items-baseline\">\n {meta.map((col) => (\n <Fragment key={col.key}>\n <dt className=\"text-2xs font-semibold uppercase tracking-wide text-text-tertiary\">\n {col.label}\n </dt>\n <dd className=\"text-sm min-w-0 break-words\">{col.render(row, index)}</dd>\n </Fragment>\n ))}\n </dl>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n return (\n <div ref={wrapRef} className=\"@container/table\">\n <table className={`w-full ${layout === 'fixed' ? 'table-fixed' : ''}`}>\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 style={col.width ? { width: col.width } : undefined}\n className={`${inline ? '' : 'sticky top-[var(--lt-sticky-top,60px)] z-10 '}bg-surface px-6 py-3 text-left text-2xs font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.showFrom ? SHOW_FROM_CLASS[col.showFrom] : ''} ${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 overflow-hidden ${col.showFrom ? SHOW_FROM_CLASS[col.showFrom] : ''} ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n"],"names":["useContainerWidth","el","setEl","useState","width","setWidth","ref","useCallback","node","useEffect","observer","entries","entry","SHOW_FROM_CLASS","partitionColumns","columns","anyDeclared","c","identity","meta","dropped","col","i","priority","CARD_FOLD_REM","rootFontPx","size","SortIcon","active","direction","jsx","CardSortControl","sort","onSort","sortable","jsxs","e","DataTable","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","inline","layout","forceCardMode","wrapRef","cardMode","_","EmptyState","flexAt","row","index","isActive","Fragment","isSortable"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable-7C7riavf.js","sources":["../../src/hooks/useContainerWidth.ts","../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\n/**\n * Measures an element's content-box width via ResizeObserver — the hook form\n * of \"geometry follows the container\". Returns a CALLBACK ref (the observed\n * element can mount late, e.g. after a loading state) and the width: `null`\n * before the first measure and in environments without ResizeObserver\n * (jsdom), which callers treat as \"wide\".\n */\nexport function useContainerWidth<T extends HTMLElement>(): [(node: T | null) => void, number | null] {\n const [el, setEl] = useState<T | null>(null);\n const [width, setWidth] = useState<number | null>(null);\n\n const ref = useCallback((node: T | null) => setEl(node), []);\n\n useEffect(() => {\n if (!el || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setWidth(entry.contentRect.width);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [el]);\n\n return [ref, width];\n}\n","import { Fragment, type ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport { useContainerWidth } from '../../../hooks/useContainerWidth';\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 /** CSS width for the column (e.g. \"40%\", \"12rem\") — set on the header cell,\n * which sizes the whole column under `layout=\"fixed\"`. */\n width?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n /**\n * Card-fold behavior when the container drops below the @table threshold:\n * 1 = identity — always visible, forms the card's title line;\n * 2 = folds into the card body as a label/value pair (default);\n * 3 = dropped in card mode.\n */\n priority?: 1 | 2 | 3;\n /**\n * Table-mode disclosure: the column renders only when the table's\n * container clears the named threshold. The column budget governs the\n * floor; enrichment columns return with room.\n */\n showFrom?: 'split' | 'wall';\n}\n\n/* Literal class strings so Tailwind's scanner sees the container variants. */\nconst SHOW_FROM_CLASS: Record<NonNullable<Column<unknown>['showFrom']>, string> = {\n split: 'hidden @split/table:table-cell',\n wall: 'hidden @wall/table:table-cell',\n};\n\n/**\n * Split columns by card-fold priority. When NO column declares a priority,\n * the first column is the identity and the rest fold — the sane default for\n * every list page. When any column declares one, undeclared columns fold.\n * Exported for tests.\n */\nexport function partitionColumns<T>(columns: Column<T>[]): {\n identity: Column<T>[];\n meta: Column<T>[];\n dropped: Column<T>[];\n} {\n const anyDeclared = columns.some((c) => c.priority !== undefined);\n const identity: Column<T>[] = [];\n const meta: Column<T>[] = [];\n const dropped: Column<T>[] = [];\n columns.forEach((col, i) => {\n const priority = col.priority ?? (anyDeclared ? 2 : i === 0 ? 1 : 2);\n if (priority === 1) identity.push(col);\n else if (priority === 3) dropped.push(col);\n else meta.push(col);\n });\n return { identity, meta, dropped };\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 * `fixed` locks the table to its container width: columns with width\n * classes keep them, the rest share the remainder, and long content\n * truncates instead of widening the table. Use beside a slide panel where\n * the table must shrink as the panel expands.\n */\n layout?: 'auto' | 'fixed';\n /** Force console-card rendering regardless of measured width (tests). */\n forceCardMode?: boolean;\n}\n\n/** The @table threshold in rem — below this the table folds into cards. */\nconst CARD_FOLD_REM = 48;\n\nfunction rootFontPx(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 16;\n const size = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return Number.isFinite(size) && size > 0 ? size : 16;\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\n/** Compact sort control for card mode, where there is no header row. */\nfunction CardSortControl<T>({ columns, sort, onSort }: {\n columns: Column<T>[];\n sort?: SortState;\n onSort: (column: string) => void;\n}) {\n const sortable = columns.filter((c) => c.sortable);\n if (sortable.length === 0) return null;\n return (\n <div className=\"flex items-center gap-2 px-4 py-2 border-b\">\n <span className=\"text-2xs font-semibold uppercase tracking-wide text-text-tertiary\">Sort</span>\n <select\n className=\"select text-2xs py-1\"\n value={sort?.sort_by ?? ''}\n onChange={(e) => e.target.value && onSort(e.target.value)}\n >\n {!sort?.sort_by && <option value=\"\" disabled>Choose…</option>}\n {sortable.map((c) => (\n <option key={c.key} value={c.key}>{typeof c.label === 'string' ? c.label : c.key}</option>\n ))}\n </select>\n {sort?.sort_by && (\n <button\n onClick={() => onSort(sort.sort_by)}\n className=\"text-2xs text-text-tertiary hover:text-accent transition-colors tabular-nums\"\n title=\"Flip sort direction\"\n >\n {sort.order === 'asc' ? '↑ asc' : '↓ desc'}\n </button>\n )}\n </div>\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 layout = 'auto',\n forceCardMode,\n}: DataTableProps<T>) {\n const [wrapRef, width] = useContainerWidth<HTMLDivElement>();\n const cardMode = forceCardMode ?? (width !== null && width < CARD_FOLD_REM * rootFontPx());\n\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 if (cardMode) {\n // A table row IS a dictionary: identity columns form the title line, the\n // rest fold into dense console-style pairs. Tables never scroll\n // horizontally — they fold.\n const { identity, meta } = partitionColumns(columns);\n // The title line: glyph/width-classed identity columns (status dots,\n // checkboxes, countdowns) hold their size; the first free-width identity\n // column (the description) flexes and truncates.\n const flexAt = Math.max(0, identity.findIndex((c) => !/(^|\\s)w-\\d/.test(c.className ?? '')));\n return (\n <div ref={wrapRef} className=\"@container/table\">\n {onSort && <CardSortControl columns={columns} sort={sort} onSort={onSort} />}\n <div className=\"divide-y divide-surface-border\">\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <div\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`py-3 px-4 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n {identity.map((col, i) => (\n <div key={col.key} className={i === flexAt ? 'flex-1 min-w-0' : 'shrink-0'}>\n {col.render(row, index)}\n </div>\n ))}\n </div>\n {meta.length > 0 && (\n <dl className=\"mt-2 grid grid-cols-1 @dict-inline/table:grid-cols-[max-content_1fr] gap-x-6 gap-y-1 items-baseline\">\n {meta.map((col) => (\n <Fragment key={col.key}>\n <dt className=\"text-2xs font-semibold uppercase tracking-wide text-text-tertiary\">\n {col.label}\n </dt>\n <dd className=\"text-sm min-w-0 break-words\">{col.render(row, index)}</dd>\n </Fragment>\n ))}\n </dl>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n return (\n <div ref={wrapRef} className=\"@container/table\">\n <table className={`w-full ${layout === 'fixed' ? 'table-fixed' : ''}`}>\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 style={col.width ? { width: col.width } : undefined}\n className={`${inline ? '' : 'sticky top-[var(--lt-sticky-top,60px)] z-10 '}bg-surface px-6 py-3 text-left text-2xs font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.showFrom ? SHOW_FROM_CLASS[col.showFrom] : ''} ${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 overflow-hidden ${col.showFrom ? SHOW_FROM_CLASS[col.showFrom] : ''} ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n"],"names":["useContainerWidth","el","setEl","useState","width","setWidth","ref","useCallback","node","useEffect","observer","entries","entry","SHOW_FROM_CLASS","partitionColumns","columns","anyDeclared","c","identity","meta","dropped","col","i","priority","CARD_FOLD_REM","rootFontPx","size","SortIcon","active","direction","jsx","CardSortControl","sort","onSort","sortable","jsxs","e","DataTable","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","inline","layout","forceCardMode","wrapRef","cardMode","_","EmptyState","flexAt","row","index","isActive","Fragment","isSortable"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as n,j as l}from"./vendor-query-RUZdMvN6.js";import{b7 as D}from"./vendor-icons-R9b9gQ04.js";function v(r,c){const p=c.split(",").map(e=>e.trim());for(const e of p)if(e.startsWith(".")&&r.name.toLowerCase().endsWith(e.toLowerCase())||e===r.type||e.endsWith("/*")&&r.type.startsWith(e.slice(0,-1)))return!0;return!1}function j({onDrop:r,children:c,label:p="Drop files here",accept:e,disabled:i}){const[u,f]=n.useState(!1),s=n.useRef(0),d=n.useCallback(t=>{t.preventDefault(),t.stopPropagation(),s.current++,i||f(!0)},[i]),g=n.useCallback(t=>{t.preventDefault(),t.stopPropagation(),s.current--,s.current<=0&&(s.current=0,f(!1))},[]),x=n.useCallback(t=>{t.preventDefault(),t.stopPropagation()},[]),h=n.useCallback(t=>{if(t.preventDefault(),t.stopPropagation(),s.current=0,f(!1),i)return;const o=Array.from(t.dataTransfer.files);if(console.debug("[DropZone] dropped files:",o.map(a=>({name:a.name,type:a.type,size:a.size}))),e){const a=o.filter(m=>v(m,e));console.debug("[DropZone] after accept filter:",a.length,"of",o.length),a.length?r(a):console.warn("[DropZone] no files matched accept pattern:",e)}else o.length&&r(o)},[r,e,i]);return l.jsxs("div",{className:"relative",onDragEnter:d,onDragLeave:g,onDragOver:x,onDrop:h,children:[c,u&&l.jsx("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.jsxs("div",{className:"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40",children:[l.jsx(D,{className:"w-8 h-8 text-text-tertiary"}),l.jsx("p",{className:"text-xs text-text-secondary",children:p})]})})]})}export{j as D};
2
- //# sourceMappingURL=DropZone-CWCh5ItZ.js.map
1
+ import{a as n,j as l}from"./vendor-query-DvWWuNIB.js";import{bS as D}from"./vendor-icons-DeBdvyKJ.js";function v(r,c){const p=c.split(",").map(e=>e.trim());for(const e of p)if(e.startsWith(".")&&r.name.toLowerCase().endsWith(e.toLowerCase())||e===r.type||e.endsWith("/*")&&r.type.startsWith(e.slice(0,-1)))return!0;return!1}function j({onDrop:r,children:c,label:p="Drop files here",accept:e,disabled:i}){const[u,f]=n.useState(!1),s=n.useRef(0),d=n.useCallback(t=>{t.preventDefault(),t.stopPropagation(),s.current++,i||f(!0)},[i]),g=n.useCallback(t=>{t.preventDefault(),t.stopPropagation(),s.current--,s.current<=0&&(s.current=0,f(!1))},[]),x=n.useCallback(t=>{t.preventDefault(),t.stopPropagation()},[]),h=n.useCallback(t=>{if(t.preventDefault(),t.stopPropagation(),s.current=0,f(!1),i)return;const o=Array.from(t.dataTransfer.files);if(console.debug("[DropZone] dropped files:",o.map(a=>({name:a.name,type:a.type,size:a.size}))),e){const a=o.filter(m=>v(m,e));console.debug("[DropZone] after accept filter:",a.length,"of",o.length),a.length?r(a):console.warn("[DropZone] no files matched accept pattern:",e)}else o.length&&r(o)},[r,e,i]);return l.jsxs("div",{className:"relative",onDragEnter:d,onDragLeave:g,onDragOver:x,onDrop:h,children:[c,u&&l.jsx("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.jsxs("div",{className:"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40",children:[l.jsx(D,{className:"w-8 h-8 text-text-tertiary"}),l.jsx("p",{className:"text-xs text-text-secondary",children:p})]})})]})}export{j as D};
2
+ //# sourceMappingURL=DropZone-XlcY8hEH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone-CWCh5ItZ.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-XlcY8hEH.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,2 +1,2 @@
1
- import{a as s,j as n}from"./vendor-query-RUZdMvN6.js";import{a4 as p,ap as f}from"./index-D88VWEVp.js";function D({startDate:r,endDate:o,isLive:e}){const[l,c]=s.useState(Date.now);s.useEffect(()=>{if(!e)return;const u=setInterval(()=>c(Date.now()),1e3);return()=>clearInterval(u)},[e]);const i=new Date(r).getTime(),m=o?new Date(o).getTime():l,t=Math.max(0,m-i),a=p(t),x=s.useMemo(()=>[{label:"ms",value:String(t)},{label:"sec",value:`${(t/1e3).toFixed(3)}s`},{label:"text",value:a}],[t,a]);return n.jsx(f,{options:x,children:n.jsx("span",{className:`text-xs ${e?"text-status-active":"text-text-tertiary"}`,children:a})})}export{D as E};
2
- //# sourceMappingURL=ElapsedCell-FHHQ69G3.js.map
1
+ import{a as s,j as n}from"./vendor-query-DvWWuNIB.js";import{a6 as p,ar as f}from"./index-BMlQYOE1.js";function D({startDate:r,endDate:o,isLive:e}){const[l,c]=s.useState(Date.now);s.useEffect(()=>{if(!e)return;const u=setInterval(()=>c(Date.now()),1e3);return()=>clearInterval(u)},[e]);const i=new Date(r).getTime(),m=o?new Date(o).getTime():l,t=Math.max(0,m-i),a=p(t),x=s.useMemo(()=>[{label:"ms",value:String(t)},{label:"sec",value:`${(t/1e3).toFixed(3)}s`},{label:"text",value:a}],[t,a]);return n.jsx(f,{options:x,children:n.jsx("span",{className:`text-xs ${e?"text-status-active":"text-text-tertiary"}`,children:a})})}export{D as E};
2
+ //# sourceMappingURL=ElapsedCell-_xvVTK8N.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElapsedCell-FHHQ69G3.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":"uGAcO,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-_xvVTK8N.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":"uGAcO,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,2 +1,2 @@
1
- import{j as e}from"./vendor-query-RUZdMvN6.js";function x({title:a="No data",description:t,icon:s}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20",children:[s&&e.jsx("div",{className:"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4",children:e.jsx(s,{className:"w-5 h-5 text-accent/50"})}),e.jsx("p",{className:"text-sm text-text-secondary",children:a}),t&&e.jsx("p",{className:"text-xs text-text-tertiary mt-1",children:t})]})}export{x as E};
2
- //# sourceMappingURL=EmptyState-lpUFYfun.js.map
1
+ import{j as e}from"./vendor-query-DvWWuNIB.js";function x({title:a="No data",description:t,icon:s}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20",children:[s&&e.jsx("div",{className:"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4",children:e.jsx(s,{className:"w-5 h-5 text-accent/50"})}),e.jsx("p",{className:"text-sm text-text-secondary",children:a}),t&&e.jsx("p",{className:"text-xs text-text-tertiary mt-1",children:t})]})}export{x as E};
2
+ //# sourceMappingURL=EmptyState-DgC_6njU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState-lpUFYfun.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-DgC_6njU.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"}
@@ -0,0 +1,2 @@
1
+ import{a as c,u as U,j as t}from"./vendor-query-DvWWuNIB.js";import{ao as W,m as J,_ as H,aW as ee,I as te,z as se,a6 as X,aX as B}from"./index-BMlQYOE1.js";import{ai as re,aj as ae,b as ne,X as le,bH as oe}from"./vendor-icons-DeBdvyKJ.js";import{L as ce}from"./vendor-react-_9U4mKFr.js";function Y(e){return JSON.stringify(e,(s,r)=>r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).sort(([n],[a])=>n<a?-1:1)):r)}function k(e,s=Date.now()){const r=Math.ceil(s/6e4)*6e4;return{from:new Date(r-e*36e5).toISOString(),to:new Date(r).toISOString()}}function ie(e){const[s,r]=c.useState(()=>k(e));return c.useEffect(()=>{r(k(e));let n;const a=()=>{n=setTimeout(()=>{r(k(e)),a()},6e4-Date.now()%6e4+250)};return a(),()=>clearTimeout(n)},[e]),s}function z(e,s){return s instanceof W&&s.status===403?!1:e<2}function P(e,s){return U({queryKey:["escAggregate",e?Y(e):"off"],queryFn:()=>J("/escalations/aggregate-by-facets",{method:"POST",body:JSON.stringify(e)}),staleTime:15e3,enabled:((s==null?void 0:s.enabled)??!0)&&!!e,retry:z})}function G(e){return J("/escalations/timeline-by-facet",{method:"POST",body:JSON.stringify(e)})}function de(e,s){return U({queryKey:["escTimeline",e?Y(e):"off"],queryFn:()=>G(e),staleTime:15e3,enabled:!!e,retry:z})}function ue(e){return e instanceof W&&e.status===403}const D=["rgb(var(--lt-cat-1))","rgb(var(--lt-cat-2))","rgb(var(--lt-cat-3))","rgb(var(--lt-cat-4))","rgb(var(--lt-cat-5))","rgb(var(--lt-cat-6))","rgb(var(--lt-cat-7))","rgb(var(--lt-cat-8))","rgb(var(--lt-cat-9))","rgb(var(--lt-cat-10))"],xe="∅",me="no subtype";function fe(e){return e??xe}function Se(e){return e??me}function A(e){const s=new Map;for(const a of e)s.set(a.label,(s.get(a.label)??0)+a.weight);const r=[...s.entries()].sort(([a,d],[u,l])=>l-d||(a<u?-1:1)),n=new Map;return r.forEach(([a],d)=>n.set(a,D[d%D.length])),n}function Ee(e){return A(e.map(s=>({label:fe(s.subtype),weight:s.dwellSeconds??s.count??0})))}function pe(e,{enabled:s=!0,periodHours:r=720}={}){const n=ie(r),a=e.entity?{entity:e.entity}:e.role?{roles:[e.role]}:null,d=s&&!!a,u=P(d?{query:a,groupBy:{state:!0},measure:{kind:"dwell",window:n},orderBy:[{field:"dwellSeconds",direction:"desc"}]}:null),l=P(d?{query:a,groupBy:{state:!0},measure:{kind:"membership"}}:null),{data:x}=H({enabled:d}),g=c.useMemo(()=>new Set(((x==null?void 0:x.roles)??[]).filter(i=>i.entity_state_source==="subtype").map(i=>i.role)),[x]),j=c.useMemo(()=>{var i,p;return A([...(((i=u.data)==null?void 0:i.groups)??[]).filter(f=>(f.dwellSeconds??0)>0),...((p=l.data)==null?void 0:p.groups)??[]].map(f=>({label:f.state??"—",weight:f.dwellSeconds??f.count??0})))},[u.data,l.data]);return c.useCallback(i=>{const p=g.has(i.role)?i.subtype??i.role:i.role;return j.get(p)},[j,g])}const v=e=>e.subtype??e.role,M=100;function ke({facetKey:e,value:s,role:r,entity:n,intervalColor:a}){var I,_;ee();const{closePanel:d}=te(),u=n?{query:{entity:n}}:r?{query:{roles:[r]}}:{},{data:l,error:x,isLoading:g}=de({facet:{key:e,value:s},...u,order:"desc",limit:M}),j=pe({entity:n,role:r},{enabled:!a}),i=a??j,p=[...(l==null?void 0:l.intervals)??[]].reverse(),[f,T]=c.useState([]),[C,L]=c.useState(!1),[N,O]=c.useState(!1),[q,S]=c.useState(null),E=l?`${s}|${l.intervals.length}|${((I=l.intervals[0])==null?void 0:I.startedAt)??""}|${((_=l.intervals[l.intervals.length-1])==null?void 0:_.startedAt)??""}`:null,$=c.useRef(null);c.useEffect(()=>{E!==$.current&&($.current=E,T([]),L((l==null?void 0:l.overflow)??!1),S(null))},[E,l]);const m=[...f,...p],[h,Q]=c.useState("desc"),y=h==="desc"?[...m].reverse():m,Z=o=>h==="desc"?{prev:y[o],next:y[o-1]}:{prev:y[o-1],next:y[o]},K=A(m.map(o=>({label:v(o),weight:o.durationSeconds}))),F=async()=>{var b;const o=(b=m[0])==null?void 0:b.startedAt;if(!(!o||N)){O(!0),S(null);try{const w=await G({facet:{key:e,value:s},...u,order:"desc",before:o,limit:M});T(V=>[...[...w.intervals].reverse(),...V]),L(w.overflow)}catch(w){S(w.message)}finally{O(!1)}}};return t.jsxs("div",{className:"h-full flex flex-col",children:[t.jsxs("div",{className:"flex items-start justify-between px-5 pt-5 pb-3 border-b border-surface-border/40",children:[t.jsxs("div",{className:"min-w-0",children:[t.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:["Timeline · ",t.jsx("span",{className:"normal-case font-mono",children:e})]}),t.jsx("p",{className:"text-sm font-mono text-text-primary truncate mt-0.5",title:s,children:s}),m.length>0&&t.jsxs("p",{className:"flex items-center gap-2 text-2xs text-text-quaternary mt-0.5",children:[t.jsxs("span",{children:[m.length," interval",m.length===1?"":"s"]}),t.jsx("span",{className:"h-2.5 w-px bg-surface-border"}),t.jsx("button",{onClick:()=>Q(o=>o==="desc"?"asc":"desc"),className:"inline-flex items-center gap-0.5 icon-link",title:h==="desc"?"Newest first — click for oldest first":"Oldest first — click for newest first","data-testid":"timeline-sort-toggle",children:h==="desc"?t.jsxs(t.Fragment,{children:[t.jsx(re,{className:"w-2.5 h-2.5"})," newest first"]}):t.jsxs(t.Fragment,{children:[t.jsx(ae,{className:"w-2.5 h-2.5"})," oldest first"]})})]})]}),t.jsxs("span",{className:"flex items-center gap-1 mt-0.5 shrink-0 ml-2",children:[n&&t.jsx(he,{entity:n,value:s}),t.jsx(ce,{to:se(e,s),className:"icon-link",title:`Search every queue for ${e} ${s}`,"data-testid":"timeline-facet-search",children:t.jsx(ne,{className:"w-3.5 h-3.5"})}),t.jsx("button",{onClick:()=>d("entity-timeline"),className:"icon-link",children:t.jsx(le,{className:"w-4 h-4"})})]})]}),t.jsx("div",{className:"flex-1 overflow-y-auto px-5 py-4",children:g?t.jsx("p",{className:"text-2xs text-text-tertiary italic",children:"Loading timeline…"}):ue(x)?t.jsx("p",{className:"text-2xs text-text-tertiary",children:"Timeline requires full read access to this station's queue."}):x?t.jsx("p",{className:"text-2xs text-status-error",children:x.message}):m.length===0?t.jsx("p",{className:"text-2xs text-text-quaternary",children:"No escalation has carried this value."}):t.jsxs("div",{className:"relative",children:[h==="asc"&&t.jsx(R,{hasEarlier:C,loading:N,error:q,onLoad:F,edge:"top"}),t.jsx("div",{className:"absolute left-[4px] top-2 bottom-2 w-px bg-surface-border"}),t.jsx("div",{className:"space-y-0",children:y.map((o,b)=>t.jsxs(c.Fragment,{children:[b>0&&t.jsx(ye,{...Z(b)}),t.jsx(be,{interval:o,color:i(o)??K.get(v(o))})]},`${o.startedAt}-${b}`))}),h==="desc"&&t.jsx(R,{hasEarlier:C,loading:N,error:q,onLoad:F,edge:"bottom"})]})})]})}function R({hasEarlier:e,loading:s,error:r,onLoad:n,edge:a}){return!e&&!r?null:t.jsxs("div",{className:`${a==="top"?"pb-2":"pt-2"} pl-5`,children:[e&&t.jsx("button",{onClick:n,disabled:s,className:"text-2xs text-text-tertiary hover:text-accent transition-colors disabled:opacity-40",children:s?"Loading older…":"Load older"}),r&&t.jsx("p",{className:"text-2xs text-status-error mt-1",children:r})]})}function he({entity:e,value:s}){const[r,n]=c.useState(!1),a=c.useRef(void 0);c.useEffect(()=>()=>clearTimeout(a.current),[]);const d=async()=>{const u=`${window.location.origin}/trends?lens=${encodeURIComponent(e)}&entity=${encodeURIComponent(s)}`;await navigator.clipboard.writeText(u),n(!0),clearTimeout(a.current),a.current=setTimeout(()=>n(!1),1500)};return t.jsxs("span",{className:"flex items-center gap-1",children:[r&&t.jsx("span",{className:"text-2xs text-text-quaternary",children:"copied"}),t.jsx("button",{onClick:d,className:"icon-link",title:"Copy link to this timeline",children:t.jsx(oe,{className:"w-3.5 h-3.5"})})]})}function be({interval:e,color:s}){return t.jsxs("div",{className:"relative flex gap-3 py-2",children:[t.jsx("span",{className:"w-[9px] h-[9px] rounded-full shrink-0 mt-1 relative z-10",style:{backgroundColor:s??"rgb(var(--lt-surface-border))"},title:v(e)}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsxs("div",{className:"flex items-baseline gap-2",children:[t.jsxs("span",{className:"text-xs font-mono text-text-primary truncate",children:[e.role,e.subtype?t.jsxs("span",{className:"text-text-tertiary",children:[" · ",e.subtype]}):null]}),t.jsx("span",{className:"text-2xs font-mono tabular-nums text-text-secondary ml-auto shrink-0",children:X(e.durationSeconds*1e3)})]}),t.jsxs("p",{className:"text-2xs font-mono text-text-tertiary mt-0.5",children:[B(e.startedAt)," → ",e.endedAt?B(e.endedAt):"now"]})]})]})}function ye({prev:e,next:s}){if(!e.endedAt)return null;const r=Date.parse(s.startedAt)-Date.parse(e.endedAt);return r<=1e3?null:t.jsxs("div",{className:"relative flex items-center gap-3 py-1",children:[t.jsx("span",{className:"w-[9px] shrink-0"}),t.jsx("div",{className:"flex-1 border-t border-dashed border-surface-border/60"}),t.jsxs("span",{className:"text-2xs text-text-quaternary shrink-0",children:["untracked · ",X(r)]}),t.jsx("div",{className:"flex-1 border-t border-dashed border-surface-border/60"})]})}export{ke as E,fe as a,ie as b,A as c,Ee as d,ue as i,Se as s,P as u};
2
+ //# sourceMappingURL=EntityTimelinePanel-1lT3jkCM.js.map