@hotmeshio/long-tail 0.10.4 → 0.10.6

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 (221) hide show
  1. package/build/index.d.ts +1 -0
  2. package/build/index.js +5 -3
  3. package/build/themes/midnight.d.ts +14 -0
  4. package/build/themes/midnight.js +67 -0
  5. package/build/tsconfig.tsbuildinfo +1 -1
  6. package/dashboard/dist/assets/{AdminDashboard-Cma2NGsF.js → AdminDashboard-B5B8cf1A.js} +2 -2
  7. package/dashboard/dist/assets/{AdminDashboard-Cma2NGsF.js.map → AdminDashboard-B5B8cf1A.js.map} +1 -1
  8. package/dashboard/dist/assets/AgentConfigPage-BxuHbkDF.js +16 -0
  9. package/dashboard/dist/assets/{AgentConfigPage-CbIhM-fa.js.map → AgentConfigPage-BxuHbkDF.js.map} +1 -1
  10. package/dashboard/dist/assets/AgentDetailPage-Bv89ria_.js +4 -0
  11. package/dashboard/dist/assets/AgentDetailPage-Bv89ria_.js.map +1 -0
  12. package/dashboard/dist/assets/AgentsPage-BPgki44D.js +2 -0
  13. package/dashboard/dist/assets/AgentsPage-BPgki44D.js.map +1 -0
  14. package/dashboard/dist/assets/AvailableEscalationsPage-Dq_FyUcB.js +2 -0
  15. package/dashboard/dist/assets/AvailableEscalationsPage-Dq_FyUcB.js.map +1 -0
  16. package/dashboard/dist/assets/{BotPicker-CidlGr6f.js → BotPicker-D-WegFKH.js} +2 -2
  17. package/dashboard/dist/assets/{BotPicker-CidlGr6f.js.map → BotPicker-D-WegFKH.js.map} +1 -1
  18. package/dashboard/dist/assets/CapabilitiesPage-C8Zxzh1x.js +2 -0
  19. package/dashboard/dist/assets/{CapabilitiesPage-BMNNTa0D.js.map → CapabilitiesPage-C8Zxzh1x.js.map} +1 -1
  20. package/dashboard/dist/assets/{CollapsibleSection-W9F9lziT.js → CollapsibleSection-Ca2iifr4.js} +2 -2
  21. package/dashboard/dist/assets/{CollapsibleSection-W9F9lziT.js.map → CollapsibleSection-Ca2iifr4.js.map} +1 -1
  22. package/dashboard/dist/assets/{ConfirmDeleteModal-BUh-Dzba.js → ConfirmDeleteModal-DD7SEMeX.js} +2 -2
  23. package/dashboard/dist/assets/{ConfirmDeleteModal-BUh-Dzba.js.map → ConfirmDeleteModal-DD7SEMeX.js.map} +1 -1
  24. package/dashboard/dist/assets/{CopyableId-B1mxKfVb.js → CopyableId-BpB-NvDh.js} +2 -2
  25. package/dashboard/dist/assets/{CopyableId-B1mxKfVb.js.map → CopyableId-BpB-NvDh.js.map} +1 -1
  26. package/dashboard/dist/assets/{CountdownTimer-lkv_7msa.js → CountdownTimer-CQSukTT4.js} +2 -2
  27. package/dashboard/dist/assets/{CountdownTimer-lkv_7msa.js.map → CountdownTimer-CQSukTT4.js.map} +1 -1
  28. package/dashboard/dist/assets/{CredentialsPage-DyOgfnPB.js → CredentialsPage-BFf0p9CE.js} +2 -2
  29. package/dashboard/dist/assets/{CredentialsPage-DyOgfnPB.js.map → CredentialsPage-BFf0p9CE.js.map} +1 -1
  30. package/dashboard/dist/assets/{CronLabel-geum95dj.js → CronLabel-CvjUA6jF.js} +2 -2
  31. package/dashboard/dist/assets/{CronLabel-geum95dj.js.map → CronLabel-CvjUA6jF.js.map} +1 -1
  32. package/dashboard/dist/assets/CustomDurationPicker-znQCEiPe.js +2 -0
  33. package/dashboard/dist/assets/CustomDurationPicker-znQCEiPe.js.map +1 -0
  34. package/dashboard/dist/assets/{DropZone-C3hOjJtC.js → DropZone-BrnAkQxF.js} +2 -2
  35. package/dashboard/dist/assets/{DropZone-C3hOjJtC.js.map → DropZone-BrnAkQxF.js.map} +1 -1
  36. package/dashboard/dist/assets/{ElapsedCell-DFOW9T4b.js → ElapsedCell-C0pd3pO8.js} +2 -2
  37. package/dashboard/dist/assets/{ElapsedCell-DFOW9T4b.js.map → ElapsedCell-C0pd3pO8.js.map} +1 -1
  38. package/dashboard/dist/assets/{EscalationListSchemaPage-_IhqXIQu.js → EscalationListSchemaPage-BRrrftTq.js} +3 -3
  39. package/dashboard/dist/assets/{EscalationListSchemaPage-_IhqXIQu.js.map → EscalationListSchemaPage-BRrrftTq.js.map} +1 -1
  40. package/dashboard/dist/assets/{EscalationSchemaPage-BCC7iscN.js → EscalationSchemaPage-ChawQh5H.js} +3 -3
  41. package/dashboard/dist/assets/{EscalationSchemaPage-BCC7iscN.js.map → EscalationSchemaPage-ChawQh5H.js.map} +1 -1
  42. package/dashboard/dist/assets/{EscalationsOverview-CvIdOtoP.js → EscalationsOverview-D3dFDffZ.js} +2 -2
  43. package/dashboard/dist/assets/{EscalationsOverview-CvIdOtoP.js.map → EscalationsOverview-D3dFDffZ.js.map} +1 -1
  44. package/dashboard/dist/assets/{EventTable-DJWJ7J0m.js → EventTable-C6vkJJcQ.js} +2 -2
  45. package/dashboard/dist/assets/{EventTable-DJWJ7J0m.js.map → EventTable-C6vkJJcQ.js.map} +1 -1
  46. package/dashboard/dist/assets/{FilterBar-BR3ztZ8y.js → FilterBar-OqpCEYW2.js} +2 -2
  47. package/dashboard/dist/assets/{FilterBar-BR3ztZ8y.js.map → FilterBar-OqpCEYW2.js.map} +1 -1
  48. package/dashboard/dist/assets/{GraphInvokePage-Cwn-8Glr.js → GraphInvokePage-CJOyaU4g.js} +2 -2
  49. package/dashboard/dist/assets/{GraphInvokePage-Cwn-8Glr.js.map → GraphInvokePage-CJOyaU4g.js.map} +1 -1
  50. package/dashboard/dist/assets/HomePage-DxJz7AQ7.js +2 -0
  51. package/dashboard/dist/assets/HomePage-DxJz7AQ7.js.map +1 -0
  52. package/dashboard/dist/assets/{ListToolbar-DuoEdVtK.js → ListToolbar-B6ZoJ4Rd.js} +2 -2
  53. package/dashboard/dist/assets/{ListToolbar-DuoEdVtK.js.map → ListToolbar-B6ZoJ4Rd.js.map} +1 -1
  54. package/dashboard/dist/assets/{McpOverview-NXKsGiWU.js → McpOverview-YPY-lX3M.js} +2 -2
  55. package/dashboard/dist/assets/{McpOverview-NXKsGiWU.js.map → McpOverview-YPY-lX3M.js.map} +1 -1
  56. package/dashboard/dist/assets/{McpQueryDetailPage-BC-iXfIx.js → McpQueryDetailPage-Ct3Mb1R2.js} +2 -2
  57. package/dashboard/dist/assets/{McpQueryDetailPage-BC-iXfIx.js.map → McpQueryDetailPage-Ct3Mb1R2.js.map} +1 -1
  58. package/dashboard/dist/assets/{McpQueryPage-BPJmFYOY.js → McpQueryPage-C5-AQvnp.js} +2 -2
  59. package/dashboard/dist/assets/{McpQueryPage-BPJmFYOY.js.map → McpQueryPage-C5-AQvnp.js.map} +1 -1
  60. package/dashboard/dist/assets/{McpRunDetailPage-B49nUXEl.js → McpRunDetailPage-Bl12usuN.js} +2 -2
  61. package/dashboard/dist/assets/{McpRunDetailPage-B49nUXEl.js.map → McpRunDetailPage-Bl12usuN.js.map} +1 -1
  62. package/dashboard/dist/assets/{McpRunsPage-Ce_XIYpP.js → McpRunsPage-PRAQPR-H.js} +2 -2
  63. package/dashboard/dist/assets/{McpRunsPage-Ce_XIYpP.js.map → McpRunsPage-PRAQPR-H.js.map} +1 -1
  64. package/dashboard/dist/assets/{Modal-D4afnAjc.js → Modal-CA2Iv02H.js} +2 -2
  65. package/dashboard/dist/assets/{Modal-D4afnAjc.js.map → Modal-CA2Iv02H.js.map} +1 -1
  66. package/dashboard/dist/assets/{NamespacePill-LWvZXt_g.js → NamespacePill-DQGzN0Ph.js} +2 -2
  67. package/dashboard/dist/assets/{NamespacePill-LWvZXt_g.js.map → NamespacePill-DQGzN0Ph.js.map} +1 -1
  68. package/dashboard/dist/assets/OperationsPage-DLGNcE-b.js +2 -0
  69. package/dashboard/dist/assets/OperationsPage-DLGNcE-b.js.map +1 -0
  70. package/dashboard/dist/assets/{OperatorDashboard-DpXjhs-3.js → OperatorDashboard-353PWYOD.js} +2 -2
  71. package/dashboard/dist/assets/{OperatorDashboard-DpXjhs-3.js.map → OperatorDashboard-353PWYOD.js.map} +1 -1
  72. package/dashboard/dist/assets/{PageHeader-DvEmMMP6.js → PageHeader-DlcE3U5L.js} +2 -2
  73. package/dashboard/dist/assets/{PageHeader-DvEmMMP6.js.map → PageHeader-DlcE3U5L.js.map} +1 -1
  74. package/dashboard/dist/assets/{PageHeaderWithStats-X0eAmu-x.js → PageHeaderWithStats-BMhnR3-9.js} +2 -2
  75. package/dashboard/dist/assets/{PageHeaderWithStats-X0eAmu-x.js.map → PageHeaderWithStats-BMhnR3-9.js.map} +1 -1
  76. package/dashboard/dist/assets/{ProcessDetailPage-DpYSMRj1.js → ProcessDetailPage-DyB979ge.js} +2 -2
  77. package/dashboard/dist/assets/{ProcessDetailPage-DpYSMRj1.js.map → ProcessDetailPage-DyB979ge.js.map} +1 -1
  78. package/dashboard/dist/assets/{ProcessesListPage-CQ9tSw7U.js → ProcessesListPage-BPi9CNxQ.js} +2 -2
  79. package/dashboard/dist/assets/{ProcessesListPage-CQ9tSw7U.js.map → ProcessesListPage-BPi9CNxQ.js.map} +1 -1
  80. package/dashboard/dist/assets/{RoleDetailPage-DKeQKDkW.js → RoleDetailPage-D6K3tdNO.js} +3 -3
  81. package/dashboard/dist/assets/{RoleDetailPage-DKeQKDkW.js.map → RoleDetailPage-D6K3tdNO.js.map} +1 -1
  82. package/dashboard/dist/assets/{RolePill-CWhoLwef.js → RolePill-dzo14hB_.js} +2 -2
  83. package/dashboard/dist/assets/{RolePill-CWhoLwef.js.map → RolePill-dzo14hB_.js.map} +1 -1
  84. package/dashboard/dist/assets/{RolesPage-D-6kIact.js → RolesPage-C_i2RLwv.js} +2 -2
  85. package/dashboard/dist/assets/{RolesPage-D-6kIact.js.map → RolesPage-C_i2RLwv.js.map} +1 -1
  86. package/dashboard/dist/assets/{RunAsSelector-DzYcpQTm.js → RunAsSelector-CWBQWKM0.js} +2 -2
  87. package/dashboard/dist/assets/{RunAsSelector-DzYcpQTm.js.map → RunAsSelector-CWBQWKM0.js.map} +1 -1
  88. package/dashboard/dist/assets/{StickyPagination-BTGfmGV3.js → StickyPagination-4cY0OXWj.js} +2 -2
  89. package/dashboard/dist/assets/{StickyPagination-BTGfmGV3.js.map → StickyPagination-4cY0OXWj.js.map} +1 -1
  90. package/dashboard/dist/assets/{StreamMessageDetail-DqRpzA_6.js → StreamMessageDetail-DxA7AzOR.js} +2 -2
  91. package/dashboard/dist/assets/{StreamMessageDetail-DqRpzA_6.js.map → StreamMessageDetail-DxA7AzOR.js.map} +1 -1
  92. package/dashboard/dist/assets/{SwimlaneTimeline-CA106TYo.js → SwimlaneTimeline-BlinxMjc.js} +2 -2
  93. package/dashboard/dist/assets/{SwimlaneTimeline-CA106TYo.js.map → SwimlaneTimeline-BlinxMjc.js.map} +1 -1
  94. package/dashboard/dist/assets/{TagInput-CoR4MzsW.js → TagInput-cyhTZTwe.js} +2 -2
  95. package/dashboard/dist/assets/{TagInput-CoR4MzsW.js.map → TagInput-cyhTZTwe.js.map} +1 -1
  96. package/dashboard/dist/assets/{TaskDetailPage-BRg-w2Ev.js → TaskDetailPage-Cbr6Bzx3.js} +2 -2
  97. package/dashboard/dist/assets/{TaskDetailPage-BRg-w2Ev.js.map → TaskDetailPage-Cbr6Bzx3.js.map} +1 -1
  98. package/dashboard/dist/assets/{TaskQueuePill-Dw3YN8M-.js → TaskQueuePill-_zIpG4bG.js} +2 -2
  99. package/dashboard/dist/assets/{TaskQueuePill-Dw3YN8M-.js.map → TaskQueuePill-_zIpG4bG.js.map} +1 -1
  100. package/dashboard/dist/assets/{TasksListPage-kB_j9G8o.js → TasksListPage-DNjZbo42.js} +2 -2
  101. package/dashboard/dist/assets/{TasksListPage-kB_j9G8o.js.map → TasksListPage-DNjZbo42.js.map} +1 -1
  102. package/dashboard/dist/assets/{TimeAgo-D7dSIY7-.js → TimeAgo-BEOuisPG.js} +2 -2
  103. package/dashboard/dist/assets/{TimeAgo-D7dSIY7-.js.map → TimeAgo-BEOuisPG.js.map} +1 -1
  104. package/dashboard/dist/assets/{TimestampCell-BZe6bx18.js → TimestampCell--CLqQOJa.js} +2 -2
  105. package/dashboard/dist/assets/{TimestampCell-BZe6bx18.js.map → TimestampCell--CLqQOJa.js.map} +1 -1
  106. package/dashboard/dist/assets/{ToolPill-xX-buQtY.js → ToolPill-CKHYG6eV.js} +2 -2
  107. package/dashboard/dist/assets/{ToolPill-xX-buQtY.js.map → ToolPill-CKHYG6eV.js.map} +1 -1
  108. package/dashboard/dist/assets/{ToolTestPanel-U3NaF_T_.js → ToolTestPanel-x7po38Fn.js} +2 -2
  109. package/dashboard/dist/assets/{ToolTestPanel-U3NaF_T_.js.map → ToolTestPanel-x7po38Fn.js.map} +1 -1
  110. package/dashboard/dist/assets/{TopicDetailPage-BpALvXP1.js → TopicDetailPage-Bay2lUOW.js} +3 -3
  111. package/dashboard/dist/assets/{TopicDetailPage-BpALvXP1.js.map → TopicDetailPage-Bay2lUOW.js.map} +1 -1
  112. package/dashboard/dist/assets/{TopicsPage-Cy3chaca.js → TopicsPage-Ckh6ln0h.js} +2 -2
  113. package/dashboard/dist/assets/{TopicsPage-Cy3chaca.js.map → TopicsPage-Ckh6ln0h.js.map} +1 -1
  114. package/dashboard/dist/assets/{UserName-VXM1oHMC.js → UserName-Doe8DDXc.js} +2 -2
  115. package/dashboard/dist/assets/{UserName-VXM1oHMC.js.map → UserName-Doe8DDXc.js.map} +1 -1
  116. package/dashboard/dist/assets/{WorkflowExecutionPage-BCq2cR1V.js → WorkflowExecutionPage-DPymyMAM.js} +2 -2
  117. package/dashboard/dist/assets/{WorkflowExecutionPage-BCq2cR1V.js.map → WorkflowExecutionPage-DPymyMAM.js.map} +1 -1
  118. package/dashboard/dist/assets/{WorkflowPill-CQ1AmhlC.js → WorkflowPill-DlSVXnnj.js} +2 -2
  119. package/dashboard/dist/assets/{WorkflowPill-CQ1AmhlC.js.map → WorkflowPill-DlSVXnnj.js.map} +1 -1
  120. package/dashboard/dist/assets/{WorkflowsDashboard-BbM69MnB.js → WorkflowsDashboard-CrwdULL7.js} +2 -2
  121. package/dashboard/dist/assets/{WorkflowsDashboard-BbM69MnB.js.map → WorkflowsDashboard-CrwdULL7.js.map} +1 -1
  122. package/dashboard/dist/assets/{WorkflowsOverview-D5HthpAW.js → WorkflowsOverview-YoPFHjOb.js} +2 -2
  123. package/dashboard/dist/assets/{WorkflowsOverview-D5HthpAW.js.map → WorkflowsOverview-YoPFHjOb.js.map} +1 -1
  124. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CDDVMYWi.js → YamlWorkflowDetailPage-B4H8WvSt.js} +10 -10
  125. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CDDVMYWi.js.map → YamlWorkflowDetailPage-B4H8WvSt.js.map} +1 -1
  126. package/dashboard/dist/assets/{YamlWorkflowsPage-FFjWwydj.js → YamlWorkflowsPage-gburzX11.js} +2 -2
  127. package/dashboard/dist/assets/{YamlWorkflowsPage-FFjWwydj.js.map → YamlWorkflowsPage-gburzX11.js.map} +1 -1
  128. package/dashboard/dist/assets/{agents-BwiSNu73.js → agents-BwrYw_S8.js} +2 -2
  129. package/dashboard/dist/assets/{agents-BwiSNu73.js.map → agents-BwrYw_S8.js.map} +1 -1
  130. package/dashboard/dist/assets/{bots-ClgSrxel.js → bots-C0vU7IG9.js} +2 -2
  131. package/dashboard/dist/assets/{bots-ClgSrxel.js.map → bots-C0vU7IG9.js.map} +1 -1
  132. package/dashboard/dist/assets/{capabilities-JUaKsby4.js → capabilities-DOE8jqWc.js} +2 -2
  133. package/dashboard/dist/assets/{capabilities-JUaKsby4.js.map → capabilities-DOE8jqWc.js.map} +1 -1
  134. package/dashboard/dist/assets/{controlplane-CuTQ7eUE.js → controlplane-TtPp8V9E.js} +2 -2
  135. package/dashboard/dist/assets/{controlplane-CuTQ7eUE.js.map → controlplane-TtPp8V9E.js.map} +1 -1
  136. package/dashboard/dist/assets/escalation-columns-Cyp-K89u.js +2 -0
  137. package/dashboard/dist/assets/escalation-columns-Cyp-K89u.js.map +1 -0
  138. package/dashboard/dist/assets/{index-C1t0YIXC.js → index-BTsTdaRt.js} +3 -3
  139. package/dashboard/dist/assets/{index-C1t0YIXC.js.map → index-BTsTdaRt.js.map} +1 -1
  140. package/dashboard/dist/assets/{index-CBj-vstO.js → index-Bl-09ECD.js} +2 -2
  141. package/dashboard/dist/assets/{index-CBj-vstO.js.map → index-Bl-09ECD.js.map} +1 -1
  142. package/dashboard/dist/assets/index-BmsZnbW1.js +63 -0
  143. package/dashboard/dist/assets/index-BmsZnbW1.js.map +1 -0
  144. package/dashboard/dist/assets/index-CR1_qhQf.js +2 -0
  145. package/dashboard/dist/assets/{index-Xd1jcHe7.js.map → index-CR1_qhQf.js.map} +1 -1
  146. package/dashboard/dist/assets/{index-BBA4AxmL.js → index-CVZOAQVo.js} +2 -2
  147. package/dashboard/dist/assets/{index-BBA4AxmL.js.map → index-CVZOAQVo.js.map} +1 -1
  148. package/dashboard/dist/assets/{index-CoPWHo_H.js → index-CkwNuQzx.js} +2 -2
  149. package/dashboard/dist/assets/{index-CoPWHo_H.js.map → index-CkwNuQzx.js.map} +1 -1
  150. package/dashboard/dist/assets/index-Cm42dgjx.css +1 -0
  151. package/dashboard/dist/assets/index-DFJm742Y.js +2 -0
  152. package/dashboard/dist/assets/{index-C9o2UNhC.js.map → index-DFJm742Y.js.map} +1 -1
  153. package/dashboard/dist/assets/{index-CnsPBTXL.js → index-Dh6F3Wbx.js} +2 -2
  154. package/dashboard/dist/assets/{index-CnsPBTXL.js.map → index-Dh6F3Wbx.js.map} +1 -1
  155. package/dashboard/dist/assets/index-Wu6GCvUq.js +5 -0
  156. package/dashboard/dist/assets/index-Wu6GCvUq.js.map +1 -0
  157. package/dashboard/dist/assets/{index-Cavwd8UU.js → index-b7P6Hjd3.js} +3 -3
  158. package/dashboard/dist/assets/{index-Cavwd8UU.js.map → index-b7P6Hjd3.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-CUguKMXZ.js → index-j-X71wT4.js} +2 -2
  160. package/dashboard/dist/assets/{index-CUguKMXZ.js.map → index-j-X71wT4.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-DSa-6Ux8.js → index-stu9QXmW.js} +2 -2
  162. package/dashboard/dist/assets/{index-DSa-6Ux8.js.map → index-stu9QXmW.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-CwQVaa7x.js → index-zuK6pSyZ.js} +2 -2
  164. package/dashboard/dist/assets/{index-CwQVaa7x.js.map → index-zuK6pSyZ.js.map} +1 -1
  165. package/dashboard/dist/assets/{knowledge-BHBt-6kW.js → knowledge-DD9NIG9d.js} +2 -2
  166. package/dashboard/dist/assets/{knowledge-BHBt-6kW.js.map → knowledge-DD9NIG9d.js.map} +1 -1
  167. package/dashboard/dist/assets/{mcp-CBcz4BCS.js → mcp-C4upVuuP.js} +2 -2
  168. package/dashboard/dist/assets/{mcp-CBcz4BCS.js.map → mcp-C4upVuuP.js.map} +1 -1
  169. package/dashboard/dist/assets/{mcp-query-C4fKTOYo.js → mcp-query-JEk3cZyH.js} +2 -2
  170. package/dashboard/dist/assets/{mcp-query-C4fKTOYo.js.map → mcp-query-JEk3cZyH.js.map} +1 -1
  171. package/dashboard/dist/assets/{pipelines-CmAAH3B6.js → pipelines-BkBpa2Y7.js} +2 -2
  172. package/dashboard/dist/assets/{pipelines-CmAAH3B6.js.map → pipelines-BkBpa2Y7.js.map} +1 -1
  173. package/dashboard/dist/assets/{tasks-BAEsqcz2.js → tasks-B7QVagGw.js} +2 -2
  174. package/dashboard/dist/assets/{tasks-BAEsqcz2.js.map → tasks-B7QVagGw.js.map} +1 -1
  175. package/dashboard/dist/assets/{topics-CY0pJ6_o.js → topics-C55xydgR.js} +2 -2
  176. package/dashboard/dist/assets/{topics-CY0pJ6_o.js.map → topics-C55xydgR.js.map} +1 -1
  177. package/dashboard/dist/assets/{useEventHooks-BlpwRvHO.js → useEventHooks-CKpFrpjc.js} +2 -2
  178. package/dashboard/dist/assets/{useEventHooks-BlpwRvHO.js.map → useEventHooks-CKpFrpjc.js.map} +1 -1
  179. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js → useFilterParams-CvRyYHJN.js} +2 -2
  180. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js.map → useFilterParams-CvRyYHJN.js.map} +1 -1
  181. package/dashboard/dist/assets/{useNamespace-CoNUlZ6Z.js → useNamespace-BJbjZubz.js} +2 -2
  182. package/dashboard/dist/assets/{useNamespace-CoNUlZ6Z.js.map → useNamespace-BJbjZubz.js.map} +1 -1
  183. package/dashboard/dist/assets/{useYamlActivityEvents-8GUn5Wie.js → useYamlActivityEvents-C80oooy6.js} +2 -2
  184. package/dashboard/dist/assets/{useYamlActivityEvents-8GUn5Wie.js.map → useYamlActivityEvents-C80oooy6.js.map} +1 -1
  185. package/dashboard/dist/assets/{users-uGtDRGxR.js → users-BdvakxB1.js} +2 -2
  186. package/dashboard/dist/assets/{users-uGtDRGxR.js.map → users-BdvakxB1.js.map} +1 -1
  187. package/dashboard/dist/assets/{vendor-icons-DKCAtTJ9.js → vendor-icons-BE_WrH2z.js} +2 -2
  188. package/dashboard/dist/assets/{vendor-icons-DKCAtTJ9.js.map → vendor-icons-BE_WrH2z.js.map} +1 -1
  189. package/dashboard/dist/assets/{vendor-react-CXumBFUA.js → vendor-react-BpdAFEQc.js} +2 -2
  190. package/dashboard/dist/assets/{vendor-react-CXumBFUA.js.map → vendor-react-BpdAFEQc.js.map} +1 -1
  191. package/dashboard/dist/assets/{workflows-DoX-AtHN.js → workflows-DYTqfgom.js} +2 -2
  192. package/dashboard/dist/assets/{workflows-DoX-AtHN.js.map → workflows-DYTqfgom.js.map} +1 -1
  193. package/dashboard/dist/assets/{yaml-workflows-DM3jVem2.js → yaml-workflows-D3o7rHzN.js} +2 -2
  194. package/dashboard/dist/assets/{yaml-workflows-DM3jVem2.js.map → yaml-workflows-D3o7rHzN.js.map} +1 -1
  195. package/dashboard/dist/index.html +4 -4
  196. package/docs/hitl/x-lt-embed.md +213 -0
  197. package/docs/hitl/x-lt-widget.md +3 -0
  198. package/package.json +1 -1
  199. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +0 -16
  200. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +0 -4
  201. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +0 -1
  202. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +0 -2
  203. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +0 -1
  204. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +0 -2
  205. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +0 -1
  206. package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +0 -2
  207. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +0 -2
  208. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +0 -1
  209. package/dashboard/dist/assets/HomePage-D8RVntg0.js +0 -2
  210. package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +0 -1
  211. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +0 -2
  212. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +0 -1
  213. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +0 -2
  214. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +0 -1
  215. package/dashboard/dist/assets/index-C-8xXyvr.js +0 -63
  216. package/dashboard/dist/assets/index-C-8xXyvr.js.map +0 -1
  217. package/dashboard/dist/assets/index-C9o2UNhC.js +0 -2
  218. package/dashboard/dist/assets/index-DeMs_aBT.css +0 -1
  219. package/dashboard/dist/assets/index-Ikj_NTuy.js +0 -5
  220. package/dashboard/dist/assets/index-Ikj_NTuy.js.map +0 -1
  221. package/dashboard/dist/assets/index-Xd1jcHe7.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"BotPicker-CidlGr6f.js","sources":["../../src/components/common/form/BotPicker.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from 'react';\nimport { Bot, X, ChevronDown, Check, UserCircle } from 'lucide-react';\nimport { useBots } from '../../../api/bots';\n\ninterface BotPickerProps {\n selected: string;\n onChange: (botExternalId: string) => void;\n placeholder?: string;\n}\n\nexport function BotPicker({ selected, onChange, placeholder }: BotPickerProps) {\n const { data } = useBots({ limit: 100 });\n const bots = (data?.bots ?? []).filter((b) => b.status === 'active');\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const selectedBot = bots.find((b) => b.external_id === selected);\n const placeholderText = placeholder ?? 'Invoking user (default)';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"field flex items-center gap-1.5 text-left cursor-pointer hover:border-accent\"\n >\n {selected && selectedBot ? (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-2xs\">\n <Bot className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {selectedBot.display_name || selectedBot.external_id}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); onChange(''); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-xs text-text-tertiary\">\n <UserCircle className=\"w-3 h-3 shrink-0\" />\n {placeholderText}\n </span>\n )}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute z-[100] mt-1 w-full bg-surface-raised border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {/* Default: invoking user */}\n <button\n type=\"button\"\n onClick={() => { onChange(''); setOpen(false); }}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n !selected ? 'bg-accent/[0.06] text-accent' : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <UserCircle className=\"w-3 h-3 shrink-0 text-text-tertiary\" />\n <span className=\"flex-1\">Invoking user</span>\n {!selected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n\n {bots.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No bot accounts</p>\n ) : (\n bots.map((bot) => {\n const isSelected = selected === bot.external_id;\n return (\n <button\n key={bot.id}\n type=\"button\"\n onClick={() => { onChange(bot.external_id); setOpen(false); }}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Bot className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <div className=\"flex-1 min-w-0\">\n <span>{bot.display_name || bot.external_id}</span>\n {bot.display_name && bot.display_name !== bot.external_id && (\n <span className=\"ml-1 text-text-tertiary font-mono\">{bot.external_id}</span>\n )}\n </div>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["BotPicker","selected","onChange","placeholder","data","useBots","bots","b","open","setOpen","useState","ref","useRef","useEffect","handler","e","selectedBot","placeholderText","jsxs","jsx","Bot","X","UserCircle","ChevronDown","Check","bot","isSelected"],"mappings":"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"}
1
+ {"version":3,"file":"BotPicker-D-WegFKH.js","sources":["../../src/components/common/form/BotPicker.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from 'react';\nimport { Bot, X, ChevronDown, Check, UserCircle } from 'lucide-react';\nimport { useBots } from '../../../api/bots';\n\ninterface BotPickerProps {\n selected: string;\n onChange: (botExternalId: string) => void;\n placeholder?: string;\n}\n\nexport function BotPicker({ selected, onChange, placeholder }: BotPickerProps) {\n const { data } = useBots({ limit: 100 });\n const bots = (data?.bots ?? []).filter((b) => b.status === 'active');\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const selectedBot = bots.find((b) => b.external_id === selected);\n const placeholderText = placeholder ?? 'Invoking user (default)';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"field flex items-center gap-1.5 text-left cursor-pointer hover:border-accent\"\n >\n {selected && selectedBot ? (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-2xs\">\n <Bot className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {selectedBot.display_name || selectedBot.external_id}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); onChange(''); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-xs text-text-tertiary\">\n <UserCircle className=\"w-3 h-3 shrink-0\" />\n {placeholderText}\n </span>\n )}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute z-[100] mt-1 w-full bg-surface-raised border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {/* Default: invoking user */}\n <button\n type=\"button\"\n onClick={() => { onChange(''); setOpen(false); }}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n !selected ? 'bg-accent/[0.06] text-accent' : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <UserCircle className=\"w-3 h-3 shrink-0 text-text-tertiary\" />\n <span className=\"flex-1\">Invoking user</span>\n {!selected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n\n {bots.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No bot accounts</p>\n ) : (\n bots.map((bot) => {\n const isSelected = selected === bot.external_id;\n return (\n <button\n key={bot.id}\n type=\"button\"\n onClick={() => { onChange(bot.external_id); setOpen(false); }}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Bot className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <div className=\"flex-1 min-w-0\">\n <span>{bot.display_name || bot.external_id}</span>\n {bot.display_name && bot.display_name !== bot.external_id && (\n <span className=\"ml-1 text-text-tertiary font-mono\">{bot.external_id}</span>\n )}\n </div>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["BotPicker","selected","onChange","placeholder","data","useBots","bots","b","open","setOpen","useState","ref","useRef","useEffect","handler","e","selectedBot","placeholderText","jsxs","jsx","Bot","X","UserCircle","ChevronDown","Check","bot","isSelected"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as d,j as e}from"./vendor-query-B2UbickB.js";import{u as f}from"./capabilities-DOE8jqWc.js";import{T as N,S as y}from"./ToolTestPanel-x7po38Fn.js";import{T as b}from"./ToolPill-CKHYG6eV.js";import{P as g}from"./PageHeader-DlcE3U5L.js";import{F as C,b as S,a as w}from"./FilterBar-OqpCEYW2.js";import{b5 as I,B as k,b6 as T,i as E,b7 as P,D as L,aU as q,E as D,J as O,g as R,Z as A}from"./vendor-icons-BE_WrH2z.js";import"./index-BmsZnbW1.js";import"./vendor-react-BpdAFEQc.js";import"./mcp-C4upVuuP.js";import"./RunAsSelector-CWBQWKM0.js";import"./BotPicker-D-WegFKH.js";import"./bots-C0vU7IG9.js";import"./helpers-DzO-OGPe.js";const h={Communication:O,Analysis:D,Media:q,Data:L,Automation:P,Development:E,System:T,Reference:k,Other:I};function V(){const{data:a,isLoading:l}=f(),[i,c]=d.useState(""),[o,v]=d.useState(null),[r,p]=d.useState(null),m=(a==null?void 0:a.categories)??[],j=(a==null?void 0:a.totalTools)??0,u=d.useMemo(()=>{let s=m;if(o&&(s=s.filter(t=>t.name===o)),!i.trim())return s;const n=i.toLowerCase();return s.map(t=>({...t,tools:t.tools.filter(x=>x.name.toLowerCase().includes(n)||x.description.toLowerCase().includes(n)||x.serverName.toLowerCase().includes(n))})).filter(t=>t.tools.length>0)},[m,i,o]);return e.jsxs("div",{children:[e.jsx(g,{title:"Capabilities"}),e.jsxs("div",{className:"grid grid-cols-3 gap-8 items-start",children:[e.jsxs("div",{className:"col-span-2",children:[!l&&m.length>0&&e.jsxs(C,{children:[e.jsx(S,{label:"Category",value:o??"",onChange:s=>v(s||null),options:m.map(s=>({value:s.name,label:s.name}))}),e.jsx(w,{label:"Search",value:i,onChange:c,placeholder:`${j} capabilities…`})]}),l?e.jsx("div",{className:"animate-pulse space-y-8",children:[1,2,3].map(s=>e.jsxs("div",{children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-28 mb-4"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(n=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-36"}),e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})]},n))})]},s))}):u.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:i||o?"No capabilities match your filter.":"No capabilities registered yet."}):e.jsx("div",{className:"space-y-10",children:u.map(s=>{const n=h[s.name]??h.Other;return e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[60px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(n,{className:"w-3 h-3 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:s.name}),e.jsx("span",{className:"text-xs text-text-quaternary",children:s.tools.length})]}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:s.tools.map(t=>e.jsx($,{tool:t,isSelected:(r==null?void 0:r.tool.name)===t.name&&(r==null?void 0:r.serverId)===t.serverId,onSelect:()=>p({serverId:t.serverId,serverName:t.serverName,tool:{name:t.name,description:t.description,inputSchema:t.inputSchema}})},`${t.serverId}-${t.name}`))})]},s.name)})})]}),e.jsx("div",{className:"sticky top-4",children:r?e.jsx(N,{serverId:r.serverId,serverName:r.serverName,tool:r.tool,onClose:()=>p(null)}):e.jsx(F,{})})]})]})}function F(){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 gap-3 text-center",children:[e.jsx(A,{className:"w-7 h-7 text-text-quaternary",strokeWidth:1}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a capability"}),e.jsx("p",{className:"text-xs text-text-quaternary leading-relaxed max-w-[200px]",children:"Explore its inputs, run it live, and inspect the response."})]})}function $({tool:a,isSelected:l,onSelect:i}){return e.jsxs("div",{role:"button",tabIndex:0,onClick:i,onKeyDown:c=>{(c.key==="Enter"||c.key===" ")&&i()},className:"group relative py-2 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left",children:[l&&e.jsx("span",{className:"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(b,{name:a.name,size:"md"}),e.jsx("p",{className:"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors",children:a.description}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsx(y,{name:a.serverName,serverId:a.serverId}),e.jsx(R,{className:`w-3 h-3 transition-opacity ${l?"text-accent opacity-100":"text-accent opacity-0 group-hover:opacity-100"}`,strokeWidth:1.5})]})]})]})}export{V as CapabilitiesPage};
2
+ //# sourceMappingURL=CapabilitiesPage-C8Zxzh1x.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CapabilitiesPage-BMNNTa0D.js","sources":["../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Play,\n MessageSquare, Eye, Database, Cog, Code2, Shield, BookOpen,\n LayoutGrid, Image, Zap,\n} from 'lucide-react';\nimport { useCapabilities, type CapabilityTool } from '../../api/capabilities';\nimport { ToolTestPanel } from '../../components/common/test/ToolTestPanel';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { ServerName } from '../../components/common/display/ServerName';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport type { LucideIcon } from 'lucide-react';\n\n// ── Category meta ─────────────────────────────────────────────────────────────\n\nconst CATEGORY_ICONS: Record<string, LucideIcon> = {\n Communication: MessageSquare,\n Analysis: Eye,\n Media: Image,\n Data: Database,\n Automation: Cog,\n Development: Code2,\n System: Shield,\n Reference: BookOpen,\n Other: LayoutGrid,\n};\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function CapabilitiesPage() {\n const { data, isLoading } = useCapabilities();\n const [search, setSearch] = useState('');\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [selected, setSelected] = useState<{\n serverId: string;\n serverName: string;\n tool: { name: string; description: string; inputSchema: Record<string, any> };\n } | null>(null);\n\n const categories = data?.categories ?? [];\n const totalTools = data?.totalTools ?? 0;\n\n const filtered = useMemo(() => {\n let cats = categories;\n if (activeCategory) cats = cats.filter((c) => c.name === activeCategory);\n if (!search.trim()) return cats;\n const q = search.toLowerCase();\n return cats\n .map((cat) => ({\n ...cat,\n tools: cat.tools.filter(\n (t) =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.serverName.toLowerCase().includes(q),\n ),\n }))\n .filter((cat) => cat.tools.length > 0);\n }, [categories, search, activeCategory]);\n\n return (\n <div>\n <PageHeader title=\"Capabilities\" />\n\n {/* Two-panel grid */}\n <div className=\"grid grid-cols-3 gap-8 items-start\">\n\n {/* ── Left: filter bar + capability list (2 cols) ── */}\n <div className=\"col-span-2\">\n\n {/* Sticky: category select + search — spans only the list column */}\n {!isLoading && categories.length > 0 && (\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={activeCategory ?? ''}\n onChange={(v) => setActiveCategory(v || null)}\n options={categories.map((c) => ({ value: c.name, label: c.name }))}\n />\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={`${totalTools} capabilities…`}\n />\n </FilterBar>\n )}\n\n {/* Capability list */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-8\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-4 bg-surface-sunken rounded w-28 mb-4\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((j) => (\n <div key={j} className=\"space-y-1.5\">\n <div className=\"h-4 bg-surface-sunken rounded w-36\" />\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search || activeCategory ? 'No capabilities match your filter.' : 'No capabilities registered yet.'}\n </p>\n ) : (\n <div className=\"space-y-10\">\n {filtered.map((category) => {\n const Icon = CATEGORY_ICONS[category.name] ?? CATEGORY_ICONS.Other;\n return (\n <div key={category.name}>\n <div className=\"sticky top-[60px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border\">\n <Icon className=\"w-3 h-3 text-accent\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">{category.name}</h2>\n <span className=\"text-xs text-text-quaternary\">{category.tools.length}</span>\n </div>\n <div className=\"divide-y divide-surface-border/30\">\n {category.tools.map((tool) => (\n <ToolRow\n key={`${tool.serverId}-${tool.name}`}\n tool={tool}\n isSelected={selected?.tool.name === tool.name && selected?.serverId === tool.serverId}\n onSelect={() =>\n setSelected({\n serverId: tool.serverId,\n serverName: tool.serverName,\n tool: { name: tool.name, description: tool.description, inputSchema: tool.inputSchema },\n })\n }\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* ── Right: run panel (1 col, sticky) ── */}\n <div className=\"sticky top-4\">\n {selected ? (\n <ToolTestPanel\n serverId={selected.serverId}\n serverName={selected.serverName}\n tool={selected.tool}\n onClose={() => setSelected(null)}\n />\n ) : (\n <EmptyRunPanel />\n )}\n </div>\n\n </div>\n </div>\n );\n}\n\n// ── Empty run panel ──────────────────────────────────────────────────────────\n\nfunction EmptyRunPanel() {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 gap-3 text-center\">\n <Zap className=\"w-7 h-7 text-text-quaternary\" strokeWidth={1} />\n <p className=\"text-sm text-text-tertiary\">Select a capability</p>\n <p className=\"text-xs text-text-quaternary leading-relaxed max-w-[200px]\">\n Explore its inputs, run it live, and inspect the response.\n </p>\n </div>\n );\n}\n\n// ── Tool row ─────────────────────────────────────────────────────────────────\n\nfunction ToolRow({\n tool,\n isSelected,\n onSelect,\n}: {\n tool: CapabilityTool;\n isSelected: boolean;\n onSelect: () => void;\n}) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onSelect}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onSelect(); }}\n className=\"group relative py-2 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left\"\n >\n {isSelected && <span className=\"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full\" />}\n <div className=\"flex items-center gap-3\">\n <ToolPill name={tool.name} size=\"md\" />\n <p className=\"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors\">\n {tool.description}\n </p>\n <div className=\"flex items-center gap-2 shrink-0\">\n <ServerName name={tool.serverName} serverId={tool.serverId} />\n <Play\n className={`w-3 h-3 transition-opacity ${isSelected ? 'text-accent opacity-100' : 'text-accent opacity-0 group-hover:opacity-100'}`}\n strokeWidth={1.5}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_ICONS","MessageSquare","Eye","Image","Database","Cog","Code2","Shield","BookOpen","LayoutGrid","CapabilitiesPage","data","isLoading","useCapabilities","search","setSearch","useState","activeCategory","setActiveCategory","selected","setSelected","categories","totalTools","filtered","useMemo","cats","c","q","cat","t","jsx","PageHeader","jsxs","FilterBar","FilterSelect","v","FilterInput","i","j","category","Icon","tool","ToolRow","ToolTestPanel","EmptyRunPanel","Zap","isSelected","onSelect","e","ToolPill","ServerName","Play"],"mappings":"4nBAgBA,MAAMA,EAA6C,CACjD,cAAeC,EACf,SAAUC,EACV,MAAOC,EACP,KAAMC,EACN,WAAYC,EACZ,YAAaC,EACb,OAAQC,EACR,UAAWC,EACX,MAAOC,CACT,EAIO,SAASC,GAAmB,CACjC,KAAM,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcC,EAAA,EACtB,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAE,EACjC,CAACC,EAAgBC,CAAiB,EAAIF,EAAAA,SAAwB,IAAI,EAClE,CAACG,EAAUC,CAAW,EAAIJ,EAAAA,SAItB,IAAI,EAERK,GAAaV,GAAA,YAAAA,EAAM,aAAc,CAAA,EACjCW,GAAaX,GAAA,YAAAA,EAAM,aAAc,EAEjCY,EAAWC,EAAAA,QAAQ,IAAM,CAC7B,IAAIC,EAAOJ,EAEX,GADIJ,MAAuBQ,EAAK,OAAQC,GAAMA,EAAE,OAAST,CAAc,GACnE,CAACH,EAAO,KAAA,EAAQ,OAAOW,EAC3B,MAAME,EAAIb,EAAO,YAAA,EACjB,OAAOW,EACJ,IAAKG,IAAS,CACb,GAAGA,EACH,MAAOA,EAAI,MAAM,OACdC,GACCA,EAAE,KAAK,cAAc,SAASF,CAAC,GAC/BE,EAAE,YAAY,cAAc,SAASF,CAAC,GACtCE,EAAE,WAAW,YAAA,EAAc,SAASF,CAAC,CAAA,CACzC,EACA,EACD,OAAQC,GAAQA,EAAI,MAAM,OAAS,CAAC,CACzC,EAAG,CAACP,EAAYP,EAAQG,CAAc,CAAC,EAEvC,cACG,MAAA,CACC,SAAA,CAAAa,EAAAA,IAACC,EAAA,CAAW,MAAM,cAAA,CAAe,EAGjCC,EAAAA,KAAC,MAAA,CAAI,UAAU,qCAGb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,aAGZ,SAAA,CAAA,CAACpB,GAAaS,EAAW,OAAS,UAChCY,EAAA,CACC,SAAA,CAAAH,EAAAA,IAACI,EAAA,CACC,MAAM,WACN,MAAOjB,GAAkB,GACzB,SAAWkB,GAAMjB,EAAkBiB,GAAK,IAAI,EAC5C,QAASd,EAAW,IAAKK,IAAO,CAAE,MAAOA,EAAE,KAAM,MAAOA,EAAE,IAAA,EAAO,CAAA,CAAA,EAEnEI,EAAAA,IAACM,EAAA,CACC,MAAM,SACN,MAAOtB,EACP,SAAUC,EACV,YAAa,GAAGO,CAAU,gBAAA,CAAA,CAC5B,EACF,EAIDV,EACCkB,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAC,EAAG,EAAG,CAAC,EAAE,IAAKO,UACb,MAAA,CACC,SAAA,CAAAP,EAAAA,IAAC,MAAA,CAAI,UAAU,yCAAA,CAA0C,EACzDA,EAAAA,IAAC,MAAA,CAAI,UAAU,YACZ,UAAC,EAAG,EAAG,CAAC,EAAE,IAAKQ,GACdN,EAAAA,KAAC,MAAA,CAAY,UAAU,cACrB,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,CAAA,CAAA,EAF9CQ,CAGV,CACD,CAAA,CACH,CAAA,CAAA,EATQD,CAUV,CACD,EACH,EACEd,EAAS,SAAW,EACtBO,EAAAA,IAAC,IAAA,CAAE,UAAU,kCACV,YAAUb,EAAiB,qCAAuC,iCAAA,CACrE,EAEAa,EAAAA,IAAC,MAAA,CAAI,UAAU,aACZ,SAAAP,EAAS,IAAKgB,GAAa,CAC1B,MAAMC,EAAOxC,EAAeuC,EAAS,IAAI,GAAKvC,EAAe,MAC7D,cACG,MAAA,CACC,SAAA,CAAAgC,EAAAA,KAAC,MAAA,CAAI,UAAU,qGACb,SAAA,CAAAF,EAAAA,IAACU,EAAA,CAAK,UAAU,sBAAsB,YAAa,IAAK,EACxDV,EAAAA,IAAC,KAAA,CAAG,UAAU,aAAc,WAAS,KAAK,QACzC,OAAA,CAAK,UAAU,+BAAgC,SAAAS,EAAS,MAAM,MAAA,CAAO,CAAA,EACxE,EACAT,EAAAA,IAAC,OAAI,UAAU,oCACZ,WAAS,MAAM,IAAKW,GACnBX,EAAAA,IAACY,EAAA,CAEC,KAAAD,EACA,YAAYtB,GAAA,YAAAA,EAAU,KAAK,QAASsB,EAAK,OAAQtB,GAAA,YAAAA,EAAU,YAAasB,EAAK,SAC7E,SAAU,IACRrB,EAAY,CACV,SAAUqB,EAAK,SACf,WAAYA,EAAK,WACjB,KAAM,CAAE,KAAMA,EAAK,KAAM,YAAaA,EAAK,YAAa,YAAaA,EAAK,WAAA,CAAY,CACvF,CAAA,EARE,GAAGA,EAAK,QAAQ,IAAIA,EAAK,IAAI,EAAA,CAWrC,CAAA,CACH,CAAA,CAAA,EArBQF,EAAS,IAsBnB,CAEJ,CAAC,CAAA,CACH,CAAA,EAEJ,EAGAT,EAAAA,IAAC,MAAA,CAAI,UAAU,eACZ,SAAAX,EACCW,EAAAA,IAACa,EAAA,CACC,SAAUxB,EAAS,SACnB,WAAYA,EAAS,WACrB,KAAMA,EAAS,KACf,QAAS,IAAMC,EAAY,IAAI,CAAA,CAAA,EAGjCU,EAAAA,IAACc,EAAA,CAAA,CAAc,CAAA,CAEnB,CAAA,CAAA,CAEF,CAAA,EACF,CAEJ,CAIA,SAASA,GAAgB,CACvB,OACEZ,EAAAA,KAAC,MAAA,CAAI,UAAU,oEACb,SAAA,CAAAF,EAAAA,IAACe,EAAA,CAAI,UAAU,+BAA+B,YAAa,EAAG,EAC9Df,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,sBAAmB,EAC7DA,EAAAA,IAAC,IAAA,CAAE,UAAU,6DAA6D,SAAA,4DAAA,CAE1E,CAAA,EACF,CAEJ,CAIA,SAASY,EAAQ,CACf,KAAAD,EACA,WAAAK,EACA,SAAAC,CACF,EAIG,CACD,OACEf,EAAAA,KAAC,MAAA,CACC,KAAK,SACL,SAAU,EACV,QAASe,EACT,UAAYC,GAAM,EAAMA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKD,EAAA,CAAY,EACxE,UAAU,uFAET,SAAA,CAAAD,GAAchB,EAAAA,IAAC,OAAA,CAAK,UAAU,6DAAA,CAA8D,EAC7FE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAACmB,EAAA,CAAS,KAAMR,EAAK,KAAM,KAAK,KAAK,EACrCX,EAAAA,IAAC,IAAA,CAAE,UAAU,wGACV,WAAK,YACR,EACAE,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAF,MAACoB,GAAW,KAAMT,EAAK,WAAY,SAAUA,EAAK,SAAU,EAC5DX,EAAAA,IAACqB,EAAA,CACC,UAAW,8BAA8BL,EAAa,0BAA4B,+CAA+C,GACjI,YAAa,GAAA,CAAA,CACf,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAGN"}
1
+ {"version":3,"file":"CapabilitiesPage-C8Zxzh1x.js","sources":["../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Play,\n MessageSquare, Eye, Database, Cog, Code2, Shield, BookOpen,\n LayoutGrid, Image, Zap,\n} from 'lucide-react';\nimport { useCapabilities, type CapabilityTool } from '../../api/capabilities';\nimport { ToolTestPanel } from '../../components/common/test/ToolTestPanel';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { ServerName } from '../../components/common/display/ServerName';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport type { LucideIcon } from 'lucide-react';\n\n// ── Category meta ─────────────────────────────────────────────────────────────\n\nconst CATEGORY_ICONS: Record<string, LucideIcon> = {\n Communication: MessageSquare,\n Analysis: Eye,\n Media: Image,\n Data: Database,\n Automation: Cog,\n Development: Code2,\n System: Shield,\n Reference: BookOpen,\n Other: LayoutGrid,\n};\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function CapabilitiesPage() {\n const { data, isLoading } = useCapabilities();\n const [search, setSearch] = useState('');\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [selected, setSelected] = useState<{\n serverId: string;\n serverName: string;\n tool: { name: string; description: string; inputSchema: Record<string, any> };\n } | null>(null);\n\n const categories = data?.categories ?? [];\n const totalTools = data?.totalTools ?? 0;\n\n const filtered = useMemo(() => {\n let cats = categories;\n if (activeCategory) cats = cats.filter((c) => c.name === activeCategory);\n if (!search.trim()) return cats;\n const q = search.toLowerCase();\n return cats\n .map((cat) => ({\n ...cat,\n tools: cat.tools.filter(\n (t) =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.serverName.toLowerCase().includes(q),\n ),\n }))\n .filter((cat) => cat.tools.length > 0);\n }, [categories, search, activeCategory]);\n\n return (\n <div>\n <PageHeader title=\"Capabilities\" />\n\n {/* Two-panel grid */}\n <div className=\"grid grid-cols-3 gap-8 items-start\">\n\n {/* ── Left: filter bar + capability list (2 cols) ── */}\n <div className=\"col-span-2\">\n\n {/* Sticky: category select + search — spans only the list column */}\n {!isLoading && categories.length > 0 && (\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={activeCategory ?? ''}\n onChange={(v) => setActiveCategory(v || null)}\n options={categories.map((c) => ({ value: c.name, label: c.name }))}\n />\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={`${totalTools} capabilities…`}\n />\n </FilterBar>\n )}\n\n {/* Capability list */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-8\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-4 bg-surface-sunken rounded w-28 mb-4\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((j) => (\n <div key={j} className=\"space-y-1.5\">\n <div className=\"h-4 bg-surface-sunken rounded w-36\" />\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search || activeCategory ? 'No capabilities match your filter.' : 'No capabilities registered yet.'}\n </p>\n ) : (\n <div className=\"space-y-10\">\n {filtered.map((category) => {\n const Icon = CATEGORY_ICONS[category.name] ?? CATEGORY_ICONS.Other;\n return (\n <div key={category.name}>\n <div className=\"sticky top-[60px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border\">\n <Icon className=\"w-3 h-3 text-accent\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">{category.name}</h2>\n <span className=\"text-xs text-text-quaternary\">{category.tools.length}</span>\n </div>\n <div className=\"divide-y divide-surface-border/30\">\n {category.tools.map((tool) => (\n <ToolRow\n key={`${tool.serverId}-${tool.name}`}\n tool={tool}\n isSelected={selected?.tool.name === tool.name && selected?.serverId === tool.serverId}\n onSelect={() =>\n setSelected({\n serverId: tool.serverId,\n serverName: tool.serverName,\n tool: { name: tool.name, description: tool.description, inputSchema: tool.inputSchema },\n })\n }\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* ── Right: run panel (1 col, sticky) ── */}\n <div className=\"sticky top-4\">\n {selected ? (\n <ToolTestPanel\n serverId={selected.serverId}\n serverName={selected.serverName}\n tool={selected.tool}\n onClose={() => setSelected(null)}\n />\n ) : (\n <EmptyRunPanel />\n )}\n </div>\n\n </div>\n </div>\n );\n}\n\n// ── Empty run panel ──────────────────────────────────────────────────────────\n\nfunction EmptyRunPanel() {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 gap-3 text-center\">\n <Zap className=\"w-7 h-7 text-text-quaternary\" strokeWidth={1} />\n <p className=\"text-sm text-text-tertiary\">Select a capability</p>\n <p className=\"text-xs text-text-quaternary leading-relaxed max-w-[200px]\">\n Explore its inputs, run it live, and inspect the response.\n </p>\n </div>\n );\n}\n\n// ── Tool row ─────────────────────────────────────────────────────────────────\n\nfunction ToolRow({\n tool,\n isSelected,\n onSelect,\n}: {\n tool: CapabilityTool;\n isSelected: boolean;\n onSelect: () => void;\n}) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onSelect}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onSelect(); }}\n className=\"group relative py-2 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left\"\n >\n {isSelected && <span className=\"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full\" />}\n <div className=\"flex items-center gap-3\">\n <ToolPill name={tool.name} size=\"md\" />\n <p className=\"flex-1 min-w-0 truncate text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors\">\n {tool.description}\n </p>\n <div className=\"flex items-center gap-2 shrink-0\">\n <ServerName name={tool.serverName} serverId={tool.serverId} />\n <Play\n className={`w-3 h-3 transition-opacity ${isSelected ? 'text-accent opacity-100' : 'text-accent opacity-0 group-hover:opacity-100'}`}\n strokeWidth={1.5}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_ICONS","MessageSquare","Eye","Image","Database","Cog","Code2","Shield","BookOpen","LayoutGrid","CapabilitiesPage","data","isLoading","useCapabilities","search","setSearch","useState","activeCategory","setActiveCategory","selected","setSelected","categories","totalTools","filtered","useMemo","cats","c","q","cat","t","jsx","PageHeader","jsxs","FilterBar","FilterSelect","v","FilterInput","i","j","category","Icon","tool","ToolRow","ToolTestPanel","EmptyRunPanel","Zap","isSelected","onSelect","e","ToolPill","ServerName","Play"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-C-8xXyvr.js";function c({title:r,sectionKey:s,isCollapsed:e,onToggle:o,contentClassName:n,children:i}){return t.jsxs("div",{children:[t.jsxs("button",{onClick:()=>o(s),className:"flex items-center gap-3 w-full group/section",children:[t.jsx("svg",{className:`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${e?"":"rotate-90"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"})}),t.jsx("span",{className:`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${e?"text-text-tertiary":"text-text-secondary"}`,children:r}),t.jsx("span",{className:"flex-1 border-b border-surface-border"})]}),t.jsx(a,{open:!e,children:t.jsx("div",{className:n??"mt-4 ml-7",children:i})})]})}export{c as C};
2
- //# sourceMappingURL=CollapsibleSection-W9F9lziT.js.map
1
+ import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-BmsZnbW1.js";function c({title:r,sectionKey:s,isCollapsed:e,onToggle:o,contentClassName:n,children:i}){return t.jsxs("div",{children:[t.jsxs("button",{onClick:()=>o(s),className:"flex items-center gap-3 w-full group/section",children:[t.jsx("svg",{className:`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${e?"":"rotate-90"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"})}),t.jsx("span",{className:`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${e?"text-text-tertiary":"text-text-secondary"}`,children:r}),t.jsx("span",{className:"flex-1 border-b border-surface-border"})]}),t.jsx(a,{open:!e,children:t.jsx("div",{className:n??"mt-4 ml-7",children:i})})]})}export{c as C};
2
+ //# sourceMappingURL=CollapsibleSection-Ca2iifr4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollapsibleSection-W9F9lziT.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-Ca2iifr4.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-B2UbickB.js";import{M as i}from"./Modal-D4afnAjc.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-BUh-Dzba.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{M as i}from"./Modal-CA2Iv02H.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-DD7SEMeX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDeleteModal-BUh-Dzba.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-DD7SEMeX.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-B2UbickB.js";import{c as m}from"./vendor-react-CXumBFUA.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-B1mxKfVb.js.map
1
+ import{a as h,j as t}from"./vendor-query-B2UbickB.js";import{a as m}from"./vendor-react-BpdAFEQc.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-BpB-NvDh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CopyableId-B1mxKfVb.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-BpB-NvDh.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,2 +1,2 @@
1
- import{a as n,j as r}from"./vendor-query-B2UbickB.js";import{_ as l,$ as c,a0 as m}from"./index-C-8xXyvr.js";function w(t){return!!(t.assigned_to&&t.assigned_until&&new Date(t.assigned_until)>new Date)}function d(t){return!t.workflow_type}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 u(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 g({until:t}){const[e,s]=n.useState(()=>new Date(t).getTime()-Date.now());n.useEffect(()=>{const o=setInterval(()=>{s(new Date(t).getTime()-Date.now())},1e3);return()=>clearInterval(o)},[t]);const i=n.useMemo(()=>{const o=new Date(t);return[{label:"ms",value:String(Math.max(0,e))},{label:"until",value:o.toISOString()},{label:"local",value:l(o,"MMM d, yyyy h:mm:ss a")}]},[t,e]);return r.jsx(c,{options:i,children:r.jsx("span",{className:`text-xs font-mono ${u(e)}`,children:m(e)})})}export{g as C,d as a,w as i};
2
- //# sourceMappingURL=CountdownTimer-lkv_7msa.js.map
1
+ import{a as n,j as r}from"./vendor-query-B2UbickB.js";import{_ as l,$ as c,a0 as m}from"./index-BmsZnbW1.js";function w(t){return!!(t.assigned_to&&t.assigned_until&&new Date(t.assigned_until)>new Date)}function d(t){return!t.workflow_type}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 u(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 g({until:t}){const[e,s]=n.useState(()=>new Date(t).getTime()-Date.now());n.useEffect(()=>{const o=setInterval(()=>{s(new Date(t).getTime()-Date.now())},1e3);return()=>clearInterval(o)},[t]);const i=n.useMemo(()=>{const o=new Date(t);return[{label:"ms",value:String(Math.max(0,e))},{label:"until",value:o.toISOString()},{label:"local",value:l(o,"MMM d, yyyy h:mm:ss a")}]},[t,e]);return r.jsx(c,{options:i,children:r.jsx("span",{className:`text-xs font-mono ${u(e)}`,children:m(e)})})}export{g as C,d as a,w as i};
2
+ //# sourceMappingURL=CountdownTimer-CQSukTT4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CountdownTimer-lkv_7msa.js","sources":["../../src/lib/escalation.ts","../../src/components/common/display/CountdownTimer.tsx"],"sourcesContent":["import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n","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":["isEffectivelyClaimed","esc","isAckEscalation","COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","options","useMemo","d","fnsFormat","jsx","DateTooltip","formatRemaining"],"mappings":"6GAEO,SAASA,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd,CCRA,MAAME,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
+ {"version":3,"file":"CountdownTimer-CQSukTT4.js","sources":["../../src/lib/escalation.ts","../../src/components/common/display/CountdownTimer.tsx"],"sourcesContent":["import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n","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":["isEffectivelyClaimed","esc","isAckEscalation","COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","options","useMemo","d","fnsFormat","jsx","DateTooltip","formatRemaining"],"mappings":"6GAEO,SAASA,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd,CCRA,MAAME,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 l,j as e}from"./vendor-query-B2UbickB.js";import{af as y,ag as N,ah as p,ac as f,ad as C}from"./index-C-8xXyvr.js";import{P as k}from"./PageHeader-DvEmMMP6.js";import{T as A}from"./TimeAgo-D7dSIY7-.js";import{C as w}from"./ConfirmDeleteModal-BUh-Dzba.js";import{d as P,p as T,aF as O,T as S}from"./vendor-icons-DKCAtTJ9.js";import"./vendor-react-CXumBFUA.js";import"./Modal-D4afnAjc.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 U(){var d,x;const{data:r,isLoading:m}=y(),n=N(),[a,i]=l.useState(null),[h,u]=l.useState(!1),[s,j]=l.useState("anthropic"),c=(r==null?void 0:r.connections)??[],v=()=>{a&&n.mutate({provider:a.provider,label:a.label},{onSuccess:()=>i(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,g])=>e.jsx("option",{value:t,children:g.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:()=>i({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:!!a,onClose:()=>i(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{U as CredentialsPage};
2
- //# sourceMappingURL=CredentialsPage-DyOgfnPB.js.map
1
+ import{a as l,j as e}from"./vendor-query-B2UbickB.js";import{af as y,ag as N,ah as p,ac as f,ad as C}from"./index-BmsZnbW1.js";import{P as k}from"./PageHeader-DlcE3U5L.js";import{T as A}from"./TimeAgo-BEOuisPG.js";import{C as w}from"./ConfirmDeleteModal-DD7SEMeX.js";import{d as P,q as T,aE as O,T as E}from"./vendor-icons-BE_WrH2z.js";import"./vendor-react-BpdAFEQc.js";import"./Modal-CA2Iv02H.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 z(){var d,x;const{data:r,isLoading:m}=y(),n=N(),[a,i]=l.useState(null),[h,u]=l.useState(!1),[s,j]=l.useState("anthropic"),c=(r==null?void 0:r.connections)??[],v=()=>{a&&n.mutate({provider:a.provider,label:a.label},{onSuccess:()=>i(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,g])=>e.jsx("option",{value:t,children:g.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:()=>i({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(E,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(w,{open:!!a,onClose:()=>i(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{z as CredentialsPage};
2
+ //# sourceMappingURL=CredentialsPage-BFf0p9CE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CredentialsPage-DyOgfnPB.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-BFf0p9CE.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-B2UbickB.js";import{d as i}from"./index-C-8xXyvr.js";import{R as l,al as y}from"./vendor-icons-DKCAtTJ9.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-geum95dj.js.map
1
+ import{u as c,b as r,c as o,j as n}from"./vendor-query-B2UbickB.js";import{d as i}from"./index-BmsZnbW1.js";import{R as l,aj as y}from"./vendor-icons-BE_WrH2z.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-CvjUA6jF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CronLabel-geum95dj.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-CvjUA6jF.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"}
@@ -0,0 +1,2 @@
1
+ import{j as t,a as j}from"./vendor-query-B2UbickB.js";import{M as Y}from"./Modal-CA2Iv02H.js";import{Q as _,m as M,K as W,b as q,P as z,u as J}from"./index-BmsZnbW1.js";import{a as C}from"./StatusBadge-BbqghFMi.js";import{S as D}from"./StickyPagination-4cY0OXWj.js";import{i as O}from"./CountdownTimer-CQSukTT4.js";import{ab as Q,ac as Z,ar as B}from"./vendor-icons-BE_WrH2z.js";import{D as X,f as P}from"./constants-BHkpVaqx.js";function wt({open:e,onClose:s,onConfirm:a,selectedCount:r,isPending:n,error:l}){const i=r&&r>1?`Cancel ${r} escalations`:"Cancel escalation";return t.jsx(Y,{open:e,onClose:s,title:i,children:t.jsxs("div",{className:"space-y-4",children:[t.jsx("p",{className:"text-sm text-text-secondary",children:r&&r>1?`This will permanently cancel ${r} escalations. Any waiting workflows will be unblocked and receive a cancellation signal.`:"This will permanently cancel this escalation. Any waiting workflow will be unblocked and receive a cancellation signal."}),t.jsx("p",{className:"text-xs text-text-tertiary",children:"This action cannot be undone."}),l&&t.jsx("p",{className:"text-xs text-status-error",children:l.message}),t.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[t.jsx("button",{onClick:s,disabled:n,className:"btn-secondary text-xs",children:"Keep"}),t.jsx("button",{onClick:a,disabled:n,className:"bg-status-error text-text-inverse px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-50",children:n?"Cancelling...":"Yes, Cancel"})]})]})})}const G=new Set(["__proto__","constructor","prototype"]);function F(e){const s=[];for(const a of e.split(".")){const r=a.match(/^([^[\]]*)((?:\[\d+\])*)$/);if(!r)throw new Error(`invalid x-lt-bind path segment: "${a}"`);const[,n,l]=r;if(n){if(G.has(n))throw new Error(`x-lt-bind path may not target "${n}"`);s.push({key:n})}for(const i of l.match(/\d+/g)??[])s.push({index:Number(i)})}if(s.length===0)throw new Error(`empty x-lt-bind path: "${e}"`);return s}function R(e,s,a){const r=F(s);let n=e;for(let i=0;i<r.length-1;i++){const o=r[i],x=r[i+1],u="key"in o?o.key:o.index,c="index"in x;(n[u]==null||typeof n[u]!="object")&&(n[u]=c?[]:{}),n=n[u]}const l=r[r.length-1];n["key"in l?l.key:l.index]=a}function E(e,s){let a=e;for(const r of F(s)){if(a==null||typeof a!="object")return;a=a["key"in r?r.key:r.index]}return a}function U(e,s){const a=s==null?void 0:s["x-lt-bind"];return typeof a=="string"&&a.length>0?a:e}function kt(e,s){const a=s==null?void 0:s.properties;if(!a)return{...e};const r={};for(const[n,l]of Object.entries(a))n in e&&R(r,U(n,l),e[n]);return r}function Tt(e,s){const a=s==null?void 0:s.properties;if(!a)return e?{...e}:{};const r={};for(const[n,l]of Object.entries(a)){const i=E(e,U(n,l));i!==void 0&&(r[n]=i)}return r}const tt=["escalation","metadata","envelope","payload","resolver"],et=/\{\{\s*([^{}]+?)\s*\}\}/g,T="—";function L(e){if(e==null)return T;if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);try{return JSON.stringify(e)}catch{return T}}function p(e,s){return e.replace(et,(a,r)=>{const n=r.indexOf("."),l=n===-1?r:r.slice(0,n);if(!tt.includes(l))return T;const i=s[l];if(n===-1)return L(i);try{return L(E(i,r.slice(n+1)))}catch{return T}})}function st(e){const s=e==null?void 0:e["x-lt-help"];if(typeof s=="string"&&s.trim().length>0)return s;const a=e==null?void 0:e["x-lt-context"];return typeof a=="string"&&a.trim().length>0?a:null}function _t(e,s){const a=st(e);return a?p(a,s):null}function Et({isTerminal:e,status:s,claimed:a,claimedByMe:r}){return e?s==="cancelled"?"This escalation was cancelled. The record is shown for reference.":"This escalation has been resolved. The submitted form is shown for reference.":r?"You have claimed this escalation. Fill out the form and submit to resolve it.":a?"Another user has claimed this escalation. It unlocks if their claim expires or is released.":"Claim this escalation to enable the form."}const I=[{text:"text-rose-400",bg:"bg-rose-400/[0.08]"},{text:"text-pink-400",bg:"bg-pink-400/[0.08]"},{text:"text-fuchsia-400",bg:"bg-fuchsia-400/[0.08]"},{text:"text-purple-400",bg:"bg-purple-400/[0.08]"},{text:"text-violet-400",bg:"bg-violet-400/[0.08]"},{text:"text-indigo-400",bg:"bg-indigo-400/[0.08]"},{text:"text-blue-400",bg:"bg-blue-400/[0.08]"},{text:"text-sky-400",bg:"bg-sky-400/[0.08]"},{text:"text-cyan-400",bg:"bg-cyan-400/[0.08]"},{text:"text-teal-400",bg:"bg-teal-400/[0.08]"},{text:"text-emerald-400",bg:"bg-emerald-400/[0.08]"},{text:"text-green-400",bg:"bg-green-400/[0.08]"},{text:"text-lime-400",bg:"bg-lime-400/[0.08]"},{text:"text-yellow-400",bg:"bg-yellow-400/[0.08]"},{text:"text-amber-400",bg:"bg-amber-400/[0.08]"},{text:"text-orange-400",bg:"bg-orange-400/[0.08]"},{text:"text-red-400",bg:"bg-red-400/[0.08]"},{text:"text-stone-400",bg:"bg-stone-400/[0.08]"},{text:"text-rose-300",bg:"bg-rose-300/[0.08]"},{text:"text-violet-300",bg:"bg-violet-300/[0.08]"},{text:"text-sky-300",bg:"bg-sky-300/[0.08]"},{text:"text-teal-300",bg:"bg-teal-300/[0.08]"},{text:"text-amber-300",bg:"bg-amber-300/[0.08]"},{text:"text-pink-300",bg:"bg-pink-300/[0.08]"}];function at(e){let s=0;for(let a=0;a<e.length;a++)s=(s<<5)-s+e.charCodeAt(a)|0;return Math.abs(s)}function rt(e){return I[at(e)%I.length]}function nt(e){const[,s]=j.useState(0);j.useEffect(()=>{if(!e)return;const a=window.setInterval(()=>s(r=>r+1),6e4);return()=>window.clearInterval(a)},[e])}function it(e){var s;return[...e["x-lt-columns"]??[],...((s=e["x-lt-card"])==null?void 0:s.fields)??[]].some(a=>a.format==="age")}function N(e){const s=a=>{if(!a)return null;try{const r=JSON.parse(a);return r&&typeof r=="object"?r:null}catch{return null}};return{escalation:e,metadata:e.metadata??null,envelope:s(e.envelope),payload:s(e.escalation_payload),resolver:s(e.resolver_payload)}}const lt=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/,K="—";function S({raw:e,format:s}){if(!e||e===K)return t.jsx("span",{className:"text-text-quaternary",children:K});if(s==="age"){const a=new Date(e);if(!Number.isNaN(a.getTime()))return t.jsx("span",{title:a.toLocaleString(),className:"tabular-nums whitespace-nowrap",children:z(e)})}return lt.test(e)?t.jsx(q,{date:e,format:"datetime",className:"text-text-primary"}):t.jsx(t.Fragment,{children:e})}function ct({esc:e,card:s,onOpen:a}){const r=N(e),n=s.title?p(s.title,r):e.type,l=e.status==="pending"&&!O(e);return t.jsxs("div",{children:[t.jsxs("div",{className:"flex items-start justify-between gap-6",children:[t.jsxs("button",{onClick:a,className:"text-left group min-w-0",children:[t.jsx("h3",{className:"heading-2 group-hover:text-accent transition-colors leading-tight",children:n}),s.subtitle&&t.jsx("p",{className:"text-xs text-text-tertiary mt-1.5",children:p(s.subtitle,r)})]}),l&&t.jsxs("button",{onClick:a,className:"inline-flex items-center gap-1.5 px-4 py-2 rounded-md bg-accent text-text-inverse text-xs font-medium hover:bg-accent-hover transition-colors shrink-0",children:["Claim",t.jsx(B,{className:"w-3.5 h-3.5"})]})]}),s.fields&&s.fields.length>0&&t.jsx("dl",{className:"flex flex-wrap gap-x-10 gap-y-4 mt-6",children:s.fields.map((i,o)=>t.jsxs("div",{children:[t.jsx("dt",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:i.label}),t.jsx("dd",{className:"text-xs text-text-primary mt-1",children:t.jsx(S,{raw:p(i.value,r)})})]},o))}),s.body&&t.jsx("div",{className:"mt-7 pt-6 border-t border-surface-border/50",children:t.jsx(_,{content:p(s.body,r)})})]})}function ot({role:e,def:s,onRowClick:a}){var u,c;const[r,n]=j.useState(!1),l=W({role:e,status:s.status??"resolved",sort_by:"resolved_at",order:"desc",limit:s.limit??25,enabled:r}),i=((u=l.data)==null?void 0:u.escalations)??[],o=((c=l.data)==null?void 0:c.total)??0,x=s.row??{};return r?l.isLoading?t.jsx("p",{className:"text-xs text-text-tertiary italic",children:"Loading history…"}):i.length===0?t.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No past revisions."}):t.jsxs("div",{children:[t.jsx("div",{className:"divide-y divide-surface-border/40",children:i.map(d=>{const b=N(d);return t.jsxs("button",{onClick:()=>a==null?void 0:a(d),className:"w-full text-left py-2.5 group flex items-center gap-3",children:[t.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full dot-ring ${C[d.status]??"bg-status-pending"}`,title:d.status}),t.jsxs("span",{className:"min-w-0 flex-1",children:[t.jsx("span",{className:"block text-xs text-text-primary group-hover:text-accent transition-colors truncate",children:x.title?p(x.title,b):d.type}),x.subtitle&&t.jsx("span",{className:"block text-2xs text-text-tertiary truncate",children:p(x.subtitle,b)})]}),x.meta?t.jsx("span",{className:"text-2xs text-text-tertiary shrink-0",children:p(x.meta,b)}):d.resolved_at&&t.jsx(q,{date:d.resolved_at,format:"relative",className:"text-2xs text-text-tertiary shrink-0 whitespace-nowrap"})]},d.id)})}),o>i.length&&t.jsxs("p",{className:"text-2xs text-text-quaternary mt-3",children:["Showing ",i.length," of ",o,"."]})]}):t.jsx("button",{onClick:()=>n(!0),className:"text-xs text-accent hover:underline","data-testid":"load-history",children:"Load full history →"})}function xt({schema:e,rows:s,onRowClick:a}){const r=e["x-lt-columns"]??[];return s.length===0?t.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No pending items."}):t.jsx("div",{className:"overflow-x-auto",children:t.jsxs("table",{className:"w-full text-xs",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b border-surface-border/60",children:[t.jsx("th",{className:"w-4 pb-2 pr-3","aria-label":"Status"}),r.map((n,l)=>t.jsx("th",{className:"text-left pb-2 pr-8 text-2xs font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap",children:n.label},l))]})}),t.jsx("tbody",{className:"divide-y divide-surface-border/30",children:s.map(n=>{const l=N(n);return t.jsxs("tr",{onClick:()=>a==null?void 0:a(n),className:a?"group cursor-pointer hover:bg-surface-hover":"group","data-testid":"facet-table-row",children:[t.jsx("td",{className:"py-2.5 pr-3",children:t.jsx("span",{className:`w-1.5 h-1.5 inline-block rounded-full dot-ring ${C[n.status]??"bg-status-pending"}`,title:n.status})}),r.map((i,o)=>t.jsx("td",{className:"py-2.5 pr-8 text-text-secondary group-hover:text-text-primary transition-colors",children:t.jsx(S,{raw:p(i.value,l),format:i.format})},o))]},n.id)})})]})})}function H({children:e}){return t.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:e})}function dt(e,s){var l;const a=s.indexOf("."),r=s.startsWith("metadata.")?s.slice(9):null,n=new Map;for(const i of e){const o=N(i);let x;try{x=a===-1?o[s]:E(o[s.slice(0,a)],s.slice(a+1))}catch{x=void 0}if(x==null||x==="")continue;const u=String(x),c=r?((l=i.metadata)==null?void 0:l[r])??x:x,d=n.get(u);d?(d.count+=1,new Date(i.created_at)>new Date(d.latest.created_at)&&(d.latest=i)):n.set(u,{key:u,rawValue:c,latest:i,count:1})}return[...n.values()].sort((i,o)=>i.key.localeCompare(o.key))}const ut=/^\{\{\s*metadata\.([a-zA-Z0-9_]+)\s*\}\}$/;function mt({schema:e,rows:s,role:a,onOpenDetail:r,onOpenGroup:n,onAddFacet:l}){const i=e["x-lt-group-by"],o=e["x-lt-card"]??{};if(!i)return t.jsx("p",{className:"text-xs text-text-tertiary italic",children:"facet-board needs an x-lt-group-by path."});const x=i.startsWith("metadata.")?i.slice(9):null,u=dt(s,i);return u.length===0?t.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No entities in scope."}):t.jsx("div",{className:"grid grid-cols-[repeat(auto-fill,minmax(15rem,1fr))] gap-4","data-testid":"facet-board",children:u.map(c=>{const d=N(c.latest),b=o.title?p(o.title,d):c.key,w=o.state?p(o.state,d):c.latest.subtype||c.latest.status,h=rt(w),y=m=>{if(m.shiftKey&&x&&l){l(x,c.rawValue);return}r==null||r(c.latest)};return t.jsxs("div",{role:"button",tabIndex:0,onClick:y,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),y(m))},title:x?"Open the latest item · ⇧ click to filter the board":"Open the latest item",className:"group/card border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40","data-testid":"facet-board-card",children:[t.jsxs("div",{className:"flex items-center justify-between gap-2 mb-2.5",children:[t.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate",children:b}),t.jsx("span",{className:"shrink-0 px-1.5 py-0.5 rounded text-2xs font-mono font-medium",style:{color:h.text,backgroundColor:h.bg},title:w,children:w})]}),o.fields&&o.fields.length>0&&t.jsx("dl",{className:"space-y-1",children:o.fields.map((m,v)=>{var A,$;const f=(A=m.value.match(ut))==null?void 0:A[1],g=f?($=c.latest.metadata)==null?void 0:$[f]:void 0,V=f!=null&&g!==void 0&&g!==null&&g!=="";return t.jsxs("div",{className:"group/frow flex items-baseline justify-between gap-3",children:[t.jsx("dt",{className:"text-2xs uppercase tracking-wider text-text-quaternary shrink-0",children:m.label}),t.jsxs("dd",{className:"min-w-0 flex items-baseline gap-1 text-2xs text-text-primary",children:[t.jsx("span",{className:"truncate",children:t.jsx(S,{raw:p(m.value,d),format:m.format})}),t.jsx("span",{className:"shrink-0 w-9 self-center flex items-center justify-end gap-px",children:V&&(n||l)&&t.jsxs("span",{className:"flex items-center gap-px opacity-0 group-hover/frow:opacity-100 transition-opacity",children:[t.jsx("button",{onClick:k=>{k.stopPropagation(),k.shiftKey&&l?l(f,g):n==null||n(M(f,g,a))},className:"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors",title:`Filter ${a}: ${f} = ${String(g)} · ⇧ click adds to current filters`,"data-testid":"facet-field-filter",children:t.jsx(Q,{className:"w-3 h-3"})}),t.jsx("button",{onClick:k=>{k.stopPropagation(),n==null||n(M(f,g))},className:"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors",title:`Search all: ${f} = ${String(g)}`,"data-testid":"facet-field-search",children:t.jsx(Z,{className:"w-3 h-3"})})]})})]})]},v)})})]},c.key)})})}function St({role:e,listSchema:s,activeEscalations:a,onRowClick:r,onOpenGroup:n,onAddFacet:l,total:i,page:o,totalPages:x,pageSize:u,onPageChange:c,onPageSizeChange:d}){const b=s["x-lt-layout"],w=s["x-lt-active"]??{},h=a[0],y=s["x-lt-help"];nt(it(s));const m=h?t.jsx(ct,{esc:h,card:w,onOpen:()=>r==null?void 0:r(h)}):t.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No active item right now."}),v=y&&h?t.jsx("div",{className:"mb-8",children:t.jsx(_,{content:p(y,N(h))})}):y?t.jsx("div",{className:"mb-8",children:t.jsx(_,{content:y})}):null;if(b==="facet-table"){const f=i??a.length;return t.jsxs("div",{children:[v,f>0&&t.jsxs("p",{className:"text-2xs text-text-tertiary mb-3 tabular-nums",children:[f.toLocaleString()," result",f!==1?"s":""]}),t.jsx(xt,{schema:s,rows:a,onRowClick:r}),o!==void 0&&x!==void 0&&c&&t.jsx(D,{page:o,totalPages:x,onPageChange:c,total:f,pageSize:u??25,onPageSizeChange:d})]})}return b==="facet-board"?t.jsxs("div",{children:[v,t.jsx(mt,{schema:s,rows:a,role:e,onOpenDetail:r,onOpenGroup:n,onAddFacet:l}),o!==void 0&&x!==void 0&&c&&x>1&&t.jsx(D,{page:o,totalPages:x,onPageChange:c,total:i??a.length,pageSize:u??25,onPageSizeChange:d})]}):b==="active-history"?t.jsxs("div",{children:[v,t.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-[1.6fr_1fr] gap-12 items-start",children:[t.jsxs("div",{children:[t.jsx(H,{children:"Active"}),m]}),t.jsxs("div",{children:[t.jsx(H,{children:"History"}),t.jsx(ot,{role:e,def:s["x-lt-history"]??{},onRowClick:r})]})]})]}):t.jsxs("div",{children:[v,m]})}function At(){const{data:e}=J();return j.useMemo(()=>{var a;return(((a=e==null?void 0:e.escalation)==null?void 0:a.claimDurations)??X).map(r=>({value:String(r),label:P(r)}))},[e])}const ft=[{value:1,label:"minutes"},{value:60,label:"hours"}];function $t({onChange:e,compact:s,autoFocus:a,"data-testid":r="custom-duration-input"}){const[n,l]=j.useState(""),[i,o]=j.useState(1);j.useEffect(()=>{const c=parseInt(n);e(c>0?c*i:0)},[n,i,e]);const x=s?"text-xs":"text-sm",u=s?"w-16":"w-20";return t.jsxs("div",{className:"flex items-center gap-2","data-testid":r,children:[t.jsx("input",{type:"number",min:1,max:i===60?24:1440,value:n,onChange:c=>l(c.target.value),placeholder:i===60?"hrs":"min",className:`input ${x} ${u} text-center`,autoFocus:a,"data-testid":`${r}-quantity`}),t.jsx("select",{value:i,onChange:c=>o(parseInt(c.target.value)),className:`select ${x} py-1`,"data-testid":`${r}-unit`,children:ft.map(c=>t.jsx("option",{value:c.value,children:c.label},c.value))})]})}export{$t as C,St as E,tt as H,wt as a,_t as b,Tt as c,Et as d,E as g,p as i,kt as m,N as r,At as u};
2
+ //# sourceMappingURL=CustomDurationPicker-znQCEiPe.js.map