@hotmeshio/long-tail 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -1
- package/build/api/yaml-workflows/crud.d.ts +1 -0
- package/build/api/yaml-workflows/crud.js +2 -2
- package/build/routes/mcp-endpoint.js +3 -5
- package/build/services/topics/system-topics.js +27 -27
- package/build/services/yaml-workflow/invoke.js +77 -6
- package/build/start/graph-workflows.d.ts +14 -0
- package/build/start/graph-workflows.js +126 -0
- package/build/start/workers.js +14 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +2 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/startup.d.ts +28 -0
- package/dashboard/dist/assets/{AdminDashboard-CgJC8ZZF.js → AdminDashboard-CMzR4d-w.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CgJC8ZZF.js.map → AdminDashboard-CMzR4d-w.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Bjl2Lsvo.js → AgentConfigPage-DHCpN4xk.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-Bjl2Lsvo.js.map → AgentConfigPage-DHCpN4xk.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-D5dHrfaM.js → AgentDetailPage-CSrejvSl.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-D5dHrfaM.js.map → AgentDetailPage-CSrejvSl.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-Mom3N1Av.js → AgentsPage-ntuzWHCD.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-Mom3N1Av.js.map → AgentsPage-ntuzWHCD.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-B2ZAb41C.js → AvailableEscalationsPage-Ci24fdxC.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-B2ZAb41C.js.map → AvailableEscalationsPage-Ci24fdxC.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-dCvnjynP.js → BotPicker-lj42d48P.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-dCvnjynP.js.map → BotPicker-lj42d48P.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-Bea9yLmU.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-Bea9yLmU.js.map +1 -0
- package/dashboard/dist/assets/{CollapsibleSection-bW0UZN9b.js → CollapsibleSection-BeBsI1M4.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-bW0UZN9b.js.map → CollapsibleSection-BeBsI1M4.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-DVOK3aaR.js → CredentialsPage-BDzFa3HV.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DVOK3aaR.js.map → CredentialsPage-BDzFa3HV.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-Cv5em7OP.js → CronLabel-DeNm1I4r.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Cv5em7OP.js.map → CronLabel-DeNm1I4r.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Dy4NBqhZ.js → CustomDurationPicker-C2OH9YcV.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Dy4NBqhZ.js.map → CustomDurationPicker-C2OH9YcV.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-CptiQ0wc.js → DropZone-Dwpgbueb.js} +2 -2
- package/dashboard/dist/assets/{DropZone-CptiQ0wc.js.map → DropZone-Dwpgbueb.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-TQqWaVRq.js → ElapsedCell-WdzqA0dR.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-TQqWaVRq.js.map → ElapsedCell-WdzqA0dR.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Cv5UvuHI.js → EscalationsOverview-BIEeflEV.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Cv5UvuHI.js.map → EscalationsOverview-BIEeflEV.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Doky6fCO.js → EventTable-NIhWP__B.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Doky6fCO.js.map → EventTable-NIhWP__B.js.map} +1 -1
- package/dashboard/dist/assets/GraphInvokePage-DtAW8ilc.js +2 -0
- package/dashboard/dist/assets/GraphInvokePage-DtAW8ilc.js.map +1 -0
- package/dashboard/dist/assets/HomePage-HsO-M8ub.js +2 -0
- package/dashboard/dist/assets/{HomePage-CzvVyTq4.js.map → HomePage-HsO-M8ub.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Cfec9gz_.js → ListToolbar-DqaRlXrF.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Cfec9gz_.js.map → ListToolbar-DqaRlXrF.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BN4GsBGI.js → McpOverview-B4GsHxij.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BN4GsBGI.js.map → McpOverview-B4GsHxij.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DZKpzWST.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DZKpzWST.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-BK5L2PqJ.js → McpQueryPage-B-8WR3GV.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BK5L2PqJ.js.map → McpQueryPage-B-8WR3GV.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Dt7Ai3qB.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-Dt7Ai3qB.js.map +1 -0
- package/dashboard/dist/assets/{McpRunsPage-QsXid9Xe.js → McpRunsPage-Bdke-HoQ.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-QsXid9Xe.js.map → McpRunsPage-Bdke-HoQ.js.map} +1 -1
- package/dashboard/dist/assets/NamespacePill-DnJl4Lre.js +2 -0
- package/dashboard/dist/assets/NamespacePill-DnJl4Lre.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-CZQSINho.js → OperatorDashboard-VZ97mufd.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CZQSINho.js.map → OperatorDashboard-VZ97mufd.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BuJpMxyu.js → PageHeader-Bnt2iQQa.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BuJpMxyu.js.map → PageHeader-Bnt2iQQa.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-yD_PTbOl.js → PageHeaderWithStats-BuKc9MKt.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-yD_PTbOl.js.map → PageHeaderWithStats-BuKc9MKt.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DUCOOvOK.js → ProcessDetailPage-BLfLfmWX.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DUCOOvOK.js.map → ProcessDetailPage-BLfLfmWX.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CXvSLTIM.js → ProcessesListPage-DG54t-Nd.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CXvSLTIM.js.map → ProcessesListPage-DG54t-Nd.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-SasQKc_B.js → RolePill-DQTT1s9v.js} +2 -2
- package/dashboard/dist/assets/{RolePill-SasQKc_B.js.map → RolePill-DQTT1s9v.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DlQR0Iz_.js → RolesPage-Bdlv3DdW.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DlQR0Iz_.js.map → RolesPage-Bdlv3DdW.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DP-jxsv6.js → RunAsSelector-BFxxMvL3.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DP-jxsv6.js.map → RunAsSelector-BFxxMvL3.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BmASA0nN.js → SwimlaneTimeline-BZmad7WQ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BmASA0nN.js.map → SwimlaneTimeline-BZmad7WQ.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-DvF3j8MA.js → TagInput-B00uqhjX.js} +2 -2
- package/dashboard/dist/assets/{TagInput-DvF3j8MA.js.map → TagInput-B00uqhjX.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CRowpkeZ.js → TaskDetailPage-CLl2mgBC.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CRowpkeZ.js.map → TaskDetailPage-CLl2mgBC.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BCQrS2oK.js → TaskQueuePill-CUsofm0X.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BCQrS2oK.js.map → TaskQueuePill-CUsofm0X.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-uJ6z37J-.js → TasksListPage-DoHXxZF-.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-uJ6z37J-.js.map → TasksListPage-DoHXxZF-.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BxwngK1D.js → TimeAgo-DZF9w8Rl.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BxwngK1D.js.map → TimeAgo-DZF9w8Rl.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CDmichOM.js → TimestampCell-DPpoTdrw.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CDmichOM.js.map → TimestampCell-DPpoTdrw.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DjvedZSn.js +2 -0
- package/dashboard/dist/assets/ToolPill-DjvedZSn.js.map +1 -0
- package/dashboard/dist/assets/ToolTestPanel-DtAgJQfr.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-DtAgJQfr.js.map +1 -0
- package/dashboard/dist/assets/TopicDetailPage-W9RKkNNp.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-W9RKkNNp.js.map +1 -0
- package/dashboard/dist/assets/{TopicsPage-letISGGD.js → TopicsPage-Bc-4ne6V.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-letISGGD.js.map → TopicsPage-Bc-4ne6V.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-W6_Iz2Qb.js → UserName-O2Q4-E6E.js} +2 -2
- package/dashboard/dist/assets/{UserName-W6_Iz2Qb.js.map → UserName-O2Q4-E6E.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-Cfx-xlRT.js → WorkflowExecutionPage-DEDsBmn1.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-Cfx-xlRT.js.map → WorkflowExecutionPage-DEDsBmn1.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-Z-zHRKOK.js → WorkflowPill-F1oKUzmc.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-Z-zHRKOK.js.map → WorkflowPill-F1oKUzmc.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DC4XHMWt.js → WorkflowsDashboard-Bcf17vCt.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DC4XHMWt.js.map → WorkflowsDashboard-Bcf17vCt.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-GefO_yn0.js → WorkflowsOverview-Cwo2rqGT.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-GefO_yn0.js.map → WorkflowsOverview-Cwo2rqGT.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowDetailPage-Bv8ZFwO-.js +33 -0
- package/dashboard/dist/assets/YamlWorkflowDetailPage-Bv8ZFwO-.js.map +1 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DOiEQDOq.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DOiEQDOq.js.map +1 -0
- package/dashboard/dist/assets/{agents-BI5OeN84.js → agents-D09G0HCv.js} +2 -2
- package/dashboard/dist/assets/{agents-BI5OeN84.js.map → agents-D09G0HCv.js.map} +1 -1
- package/dashboard/dist/assets/{bots-1UzUCsrR.js → bots-D0LhyZZM.js} +2 -2
- package/dashboard/dist/assets/{bots-1UzUCsrR.js.map → bots-D0LhyZZM.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BUbl-ojp.js → capabilities-DON4-NXs.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BUbl-ojp.js.map → capabilities-DON4-NXs.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DTFrH_vN.js → controlplane-Bihd1kXf.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DTFrH_vN.js.map → controlplane-Bihd1kXf.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-BQhCt4W0.js → escalation-CP2XbdXK.js} +2 -2
- package/dashboard/dist/assets/{escalation-BQhCt4W0.js.map → escalation-CP2XbdXK.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-J20k5CcY.js → escalation-columns-9aw8Y4qq.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-J20k5CcY.js.map → escalation-columns-9aw8Y4qq.js.map} +1 -1
- package/dashboard/dist/assets/helpers-DzO-OGPe.js +2 -0
- package/dashboard/dist/assets/helpers-DzO-OGPe.js.map +1 -0
- package/dashboard/dist/assets/{index-CVGgSoda.js → index-B-BK3vtk.js} +2 -2
- package/dashboard/dist/assets/{index-CVGgSoda.js.map → index-B-BK3vtk.js.map} +1 -1
- package/dashboard/dist/assets/{index-CWEOhAiK.js → index-B7lEd0cY.js} +25 -25
- package/dashboard/dist/assets/index-B7lEd0cY.js.map +1 -0
- package/dashboard/dist/assets/index-BBBGETMs.js +6 -0
- package/dashboard/dist/assets/index-BBBGETMs.js.map +1 -0
- package/dashboard/dist/assets/index-BFyzZGtv.css +1 -0
- package/dashboard/dist/assets/{index-vgxjge70.js → index-BInTEEIX.js} +2 -2
- package/dashboard/dist/assets/{index-vgxjge70.js.map → index-BInTEEIX.js.map} +1 -1
- package/dashboard/dist/assets/index-BTp73vYK.js +2 -0
- package/dashboard/dist/assets/index-BTp73vYK.js.map +1 -0
- package/dashboard/dist/assets/index-CCup2uaP.js +2 -0
- package/dashboard/dist/assets/{index-C9ClHiiW.js.map → index-CCup2uaP.js.map} +1 -1
- package/dashboard/dist/assets/index-CMRW_PE-.js +9 -0
- package/dashboard/dist/assets/index-CMRW_PE-.js.map +1 -0
- package/dashboard/dist/assets/index-Cb7aSzox.js +2 -0
- package/dashboard/dist/assets/{index-si70YcIP.js.map → index-Cb7aSzox.js.map} +1 -1
- package/dashboard/dist/assets/index-Cjb8ulHm.js +2 -0
- package/dashboard/dist/assets/{index-WQQJ_cp7.js.map → index-Cjb8ulHm.js.map} +1 -1
- package/dashboard/dist/assets/index-DgLZ8Ix5.js +2 -0
- package/dashboard/dist/assets/{index-DasoTRjT.js.map → index-DgLZ8Ix5.js.map} +1 -1
- package/dashboard/dist/assets/index-H5Yb8CY2.js +2 -0
- package/dashboard/dist/assets/index-H5Yb8CY2.js.map +1 -0
- package/dashboard/dist/assets/{index-CLUYzdwz.js → index-_JsRJPds.js} +2 -2
- package/dashboard/dist/assets/{index-CLUYzdwz.js.map → index-_JsRJPds.js.map} +1 -1
- package/dashboard/dist/assets/{index-C-mbURj-.js → index-rbuNUyAh.js} +2 -2
- package/dashboard/dist/assets/{index-C-mbURj-.js.map → index-rbuNUyAh.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-D9Tuh-o-.js → knowledge-Bl_KaoKJ.js} +2 -2
- package/dashboard/dist/assets/{knowledge-D9Tuh-o-.js.map → knowledge-Bl_KaoKJ.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BO8QnWyk.js → mcp-DXbFGoA8.js} +2 -2
- package/dashboard/dist/assets/{mcp-BO8QnWyk.js.map → mcp-DXbFGoA8.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-WLtQtr51.js → mcp-query-Bg69DF2x.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-WLtQtr51.js.map → mcp-query-Bg69DF2x.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BAVf9xud.js → pipelines-DK9LTg9F.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BAVf9xud.js.map → pipelines-DK9LTg9F.js.map} +1 -1
- package/dashboard/dist/assets/{roles-mGO2-2hA.js → roles-BrsBN4hO.js} +2 -2
- package/dashboard/dist/assets/{roles-mGO2-2hA.js.map → roles-BrsBN4hO.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-JVRVCx0f.js → tasks-CwjvPECN.js} +2 -2
- package/dashboard/dist/assets/{tasks-JVRVCx0f.js.map → tasks-CwjvPECN.js.map} +1 -1
- package/dashboard/dist/assets/{topics-BLVnahd7.js → topics-BrwkmaFR.js} +2 -2
- package/dashboard/dist/assets/{topics-BLVnahd7.js.map → topics-BrwkmaFR.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BwjAi0Qq.js → useEventHooks-Cd1GM1NG.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BwjAi0Qq.js.map → useEventHooks-Cd1GM1NG.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DkHmXddZ.js → useNamespace-D9lghZ25.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DkHmXddZ.js.map → useNamespace-D9lghZ25.js.map} +1 -1
- package/dashboard/dist/assets/useYamlActivityEvents-vOhAwmKO.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-vOhAwmKO.js.map +1 -0
- package/dashboard/dist/assets/{users-BvizpAkV.js → users-ChQ7soaq.js} +2 -2
- package/dashboard/dist/assets/{users-BvizpAkV.js.map → users-ChQ7soaq.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-Doy0g69_.js → vendor-icons-Dj2F0Jrb.js} +38 -38
- package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +1 -0
- package/dashboard/dist/assets/workflows-BLKji1_1.js +2 -0
- package/dashboard/dist/assets/{workflows-CyEYa01a.js.map → workflows-BLKji1_1.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-BUhMfdaw.js +2 -0
- package/dashboard/dist/assets/{yaml-workflows-i3GzrEme.js.map → yaml-workflows-BUhMfdaw.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/story.md +13 -9
- package/package.json +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-CK2fJ9Sy.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-CK2fJ9Sy.js.map +0 -1
- package/dashboard/dist/assets/HomePage-CzvVyTq4.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-lCW668WQ.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-lCW668WQ.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CQOeYqxa.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CQOeYqxa.js.map +0 -1
- package/dashboard/dist/assets/ServerName-CHspudaC.js +0 -2
- package/dashboard/dist/assets/ServerName-CHspudaC.js.map +0 -1
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js.map +0 -1
- package/dashboard/dist/assets/ToolPill-1aTqYtzp.js +0 -2
- package/dashboard/dist/assets/ToolPill-1aTqYtzp.js.map +0 -1
- package/dashboard/dist/assets/ToolTestPanel-xjTn8sU8.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-xjTn8sU8.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-Dm0hDlS8.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-Dm0hDlS8.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-CMsrFooO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CMsrFooO.js.map +0 -1
- package/dashboard/dist/assets/helpers-ge6Eu90Y.js +0 -2
- package/dashboard/dist/assets/helpers-ge6Eu90Y.js.map +0 -1
- package/dashboard/dist/assets/index-C--SEsU7.css +0 -1
- package/dashboard/dist/assets/index-C45DvtAZ.js +0 -15
- package/dashboard/dist/assets/index-C45DvtAZ.js.map +0 -1
- package/dashboard/dist/assets/index-C9ClHiiW.js +0 -2
- package/dashboard/dist/assets/index-CWEOhAiK.js.map +0 -1
- package/dashboard/dist/assets/index-CWlP6vHG.js +0 -6
- package/dashboard/dist/assets/index-CWlP6vHG.js.map +0 -1
- package/dashboard/dist/assets/index-DasoTRjT.js +0 -2
- package/dashboard/dist/assets/index-FhasoOjO.js +0 -2
- package/dashboard/dist/assets/index-FhasoOjO.js.map +0 -1
- package/dashboard/dist/assets/index-WQQJ_cp7.js +0 -2
- package/dashboard/dist/assets/index-hAZiac0C.js +0 -2
- package/dashboard/dist/assets/index-hAZiac0C.js.map +0 -1
- package/dashboard/dist/assets/index-si70YcIP.js +0 -2
- package/dashboard/dist/assets/useExpandedRows-CkcEntB-.js +0 -2
- package/dashboard/dist/assets/useExpandedRows-CkcEntB-.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-CsaR5dWj.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-CsaR5dWj.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-Doy0g69_.js.map +0 -1
- package/dashboard/dist/assets/workflows-CyEYa01a.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-i3GzrEme.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as j}from"./bots-
|
|
2
|
-
//# sourceMappingURL=BotPicker-
|
|
1
|
+
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as j}from"./bots-D0LhyZZM.js";import{a as d,X as y,ac as u,j as N,V as p}from"./vendor-icons-Dj2F0Jrb.js";function k({selected:s,onChange:n,placeholder:f}){const{data:c}=j({limit:100}),l=((c==null?void 0:c.bots)??[]).filter(t=>t.status==="active"),[o,r]=m.useState(!1),i=m.useRef(null);m.useEffect(()=>{const t=a=>{i.current&&!i.current.contains(a.target)&&r(!1)};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[]);const x=l.find(t=>t.external_id===s),h=f??"Invoking user (default)";return e.jsxs("div",{ref:i,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>r(!o),className:"flex items-center gap-1.5 w-full px-1 py-1.5 bg-transparent border-b border-surface-border/60 text-left cursor-pointer hover:border-accent/50 transition-colors focus:outline-none focus:border-accent/50",children:[s&&x?e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(d,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),x.display_name||x.external_id,e.jsx("span",{role:"button",onClick:t=>{t.stopPropagation(),n("")},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(y,{className:"w-2.5 h-2.5"})})]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs text-text-tertiary",children:[e.jsx(u,{className:"w-3 h-3 shrink-0"}),h]}),e.jsx(N,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${o?"rotate-180":""}`})]}),o&&e.jsxs("div",{className:"absolute z-20 mt-1 w-full bg-surface-raised border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:[e.jsxs("button",{type:"button",onClick:()=>{n(""),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${s?"text-text-primary hover:bg-surface-sunken":"bg-accent/[0.06] text-accent"}`,children:[e.jsx(u,{className:"w-3 h-3 shrink-0 text-text-tertiary"}),e.jsx("span",{className:"flex-1",children:"Invoking user"}),!s&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]}),l.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No bot accounts"}):l.map(t=>{const a=s===t.external_id;return e.jsxs("button",{type:"button",onClick:()=>{n(t.external_id),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${a?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(d,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{children:t.display_name||t.external_id}),t.display_name&&t.display_name!==t.external_id&&e.jsx("span",{className:"ml-1 text-text-tertiary font-mono",children:t.external_id})]}),a&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]},t.id)})]})]})}export{k as B};
|
|
2
|
+
//# sourceMappingURL=BotPicker-lj42d48P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BotPicker-
|
|
1
|
+
{"version":3,"file":"BotPicker-lj42d48P.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=\"flex items-center gap-1.5 w-full px-1 py-1.5 bg-transparent border-b border-surface-border/60 text-left cursor-pointer hover:border-accent/50 transition-colors focus:outline-none focus:border-accent/50\"\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-[11px]\">\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-20 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 N}from"./capabilities-DON4-NXs.js";import{T as y,S as g}from"./ToolTestPanel-DtAgJQfr.js";import{T as b}from"./ToolPill-DjvedZSn.js";import{P as k}from"./PageHeader-Bnt2iQQa.js";import{aN as f,B as w,f as C,C as S,aO as I,D as T,az as q,ag as P,x as E,aP as $,P as A,Z as L}from"./vendor-icons-Dj2F0Jrb.js";import"./index-B7lEd0cY.js";import"./vendor-react-CXumBFUA.js";import"./mcp-DXbFGoA8.js";import"./RunAsSelector-BFxxMvL3.js";import"./BotPicker-lj42d48P.js";import"./bots-D0LhyZZM.js";import"./helpers-DzO-OGPe.js";const p={Communication:{icon:E,color:"text-blue-400"},Analysis:{icon:P,color:"text-violet-400"},Media:{icon:q,color:"text-pink-400"},Data:{icon:T,color:"text-emerald-400"},Automation:{icon:I,color:"text-amber-400"},Development:{icon:S,color:"text-cyan-400"},System:{icon:C,color:"text-red-400"},Reference:{icon:w,color:"text-text-tertiary"},Other:{icon:f,color:"text-text-tertiary"}};function J(){const{data:a,isLoading:l}=N(),[c,m]=d.useState(""),[o,u]=d.useState(null),[n,h]=d.useState(null),x=(a==null?void 0:a.categories)??[],j=(a==null?void 0:a.totalTools)??0,v=d.useMemo(()=>{let t=x;if(o&&(t=t.filter(i=>i.name===o)),!c.trim())return t;const r=c.toLowerCase();return t.map(i=>({...i,tools:i.tools.filter(s=>s.name.toLowerCase().includes(r)||s.description.toLowerCase().includes(r)||s.serverName.toLowerCase().includes(r))})).filter(i=>i.tools.length>0)},[x,c,o]);return e.jsxs("div",{children:[e.jsx(k,{title:"Capabilities"}),!l&&x.length>0&&e.jsxs("div",{className:"flex items-center gap-5 mb-10",children:[e.jsxs("button",{onClick:()=>u(null),className:`flex flex-col items-center gap-1 transition-colors ${o===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(f,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),x.map(t=>{const r=p[t.name]??p.Other,i=r.icon,s=o===t.name;return e.jsxs("button",{onClick:()=>u(s?null:t.name),className:`flex flex-col items-center gap-1 transition-colors ${s?r.color:"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(i,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:t.name})]},t.name)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx($,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary"}),e.jsx("input",{type:"text",value:c,onChange:t=>m(t.target.value),placeholder:`Search ${j} capabilities…`,className:"pl-9 pr-3 py-1.5 text-sm bg-surface-sunken border border-surface-border rounded-md text-text-primary placeholder:text-text-quaternary focus:outline-none focus:ring-1 focus:ring-accent/50 w-56"})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-8 items-start",children:[e.jsx("div",{className:"col-span-2",children:l?e.jsx("div",{className:"animate-pulse space-y-8",children:[1,2,3].map(t=>e.jsxs("div",{children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-28 mb-4"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(r=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-36"}),e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})]},r))})]},t))}):v.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:c||o?"No capabilities match your filter.":"No capabilities registered yet."}):e.jsx("div",{className:"space-y-10",children:v.map(t=>{const r=p[t.name]??p.Other,i=r.icon;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1 pb-2 border-b border-surface-border",children:[e.jsx(i,{className:`w-4 h-4 ${r.color}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:t.name}),e.jsx("span",{className:"text-xs text-text-quaternary",children:t.tools.length})]}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:t.tools.map(s=>e.jsx(D,{tool:s,isSelected:(n==null?void 0:n.tool.name)===s.name&&(n==null?void 0:n.serverId)===s.serverId,onSelect:()=>h({serverId:s.serverId,serverName:s.serverName,tool:{name:s.name,description:s.description,inputSchema:s.inputSchema}})},`${s.serverId}-${s.name}`))})]},t.name)})})}),e.jsx("div",{className:"sticky top-4",children:n?e.jsx(y,{serverId:n.serverId,serverName:n.serverName,tool:n.tool,onClose:()=>h(null)}):e.jsx(O,{})})]})]})}function O(){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 gap-3 text-center",children:[e.jsx(L,{className:"w-7 h-7 text-text-quaternary",strokeWidth:1}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a capability"}),e.jsx("p",{className:"text-xs text-text-quaternary leading-relaxed max-w-[200px]",children:"Explore its inputs, run it live, and inspect the response."})]})}function D({tool:a,isSelected:l,onSelect:c}){return e.jsxs("div",{role:"button",tabIndex:0,onClick:c,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&c()},className:`group py-3 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left ${l?"bg-accent/[0.06]":"hover:bg-surface-hover/60"}`,children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 mb-1",children:[e.jsx(b,{name:a.name,size:"md"}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsx(g,{name:a.serverName,serverId:a.serverId}),e.jsx(A,{className:`w-3 h-3 transition-opacity ${l?"text-accent opacity-100":"text-accent opacity-0 group-hover:opacity-100"}`,strokeWidth:1.5})]})]}),e.jsx("p",{className:"text-[11px] text-text-tertiary leading-relaxed line-clamp-2 pl-0.5",children:a.description})]})}export{J as CapabilitiesPage};
|
|
2
|
+
//# sourceMappingURL=CapabilitiesPage-Bea9yLmU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapabilitiesPage-Bea9yLmU.js","sources":["../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Search, 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 type { LucideIcon } from 'lucide-react';\n\n// ── Category meta ─────────────────────────────────────────────────────────────\n\nconst CATEGORY_META: Record<string, { icon: LucideIcon; color: string }> = {\n Communication: { icon: MessageSquare, color: 'text-blue-400' },\n Analysis: { icon: Eye, color: 'text-violet-400' },\n Media: { icon: Image, color: 'text-pink-400' },\n Data: { icon: Database, color: 'text-emerald-400' },\n Automation: { icon: Cog, color: 'text-amber-400' },\n Development: { icon: Code2, color: 'text-cyan-400' },\n System: { icon: Shield, color: 'text-red-400' },\n Reference: { icon: BookOpen, color: 'text-text-tertiary' },\n Other: { icon: LayoutGrid, color: 'text-text-tertiary' },\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 {/* Category tabs + search */}\n {!isLoading && categories.length > 0 && (\n <div className=\"flex items-center gap-5 mb-10\">\n <button\n onClick={() => setActiveCategory(null)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n activeCategory === null ? 'text-accent' : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <LayoutGrid className=\"w-5 h-5\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">All</span>\n </button>\n {categories.map((cat) => {\n const meta = CATEGORY_META[cat.name] ?? CATEGORY_META.Other;\n const Icon = meta.icon;\n const isActive = activeCategory === cat.name;\n return (\n <button\n key={cat.name}\n onClick={() => setActiveCategory(isActive ? null : cat.name)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n isActive ? meta.color : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <Icon className=\"w-5 h-5\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">{cat.name}</span>\n </button>\n );\n })}\n <span className=\"flex-1\" />\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${totalTools} capabilities…`}\n className=\"pl-9 pr-3 py-1.5 text-sm bg-surface-sunken border border-surface-border rounded-md text-text-primary placeholder:text-text-quaternary focus:outline-none focus:ring-1 focus:ring-accent/50 w-56\"\n />\n </div>\n </div>\n )}\n\n {/* Two-panel grid — list always shares space with the run panel */}\n <div className=\"grid grid-cols-3 gap-8 items-start\">\n\n {/* ── Left: capability list (2 cols) ── */}\n <div className=\"col-span-2\">\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 meta = CATEGORY_META[category.name] ?? CATEGORY_META.Other;\n const Icon = meta.icon;\n return (\n <div key={category.name}>\n <div className=\"flex items-center gap-2 mb-1 pb-2 border-b border-surface-border\">\n <Icon className={`w-4 h-4 ${meta.color}`} strokeWidth={1.5} />\n <h2 className=\"text-xs font-semibold uppercase tracking-widest text-accent/80\">{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 py-3 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left ${\n isSelected ? 'bg-accent/[0.06]' : 'hover:bg-surface-hover/60'\n }`}\n >\n <div className=\"flex items-center justify-between gap-3 mb-1\">\n <ToolPill name={tool.name} size=\"md\" />\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 <p className=\"text-[11px] text-text-tertiary leading-relaxed line-clamp-2 pl-0.5\">\n {tool.description}\n </p>\n </div>\n );\n}\n"],"names":["CATEGORY_META","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","meta","Icon","isActive","Search","e","i","j","category","tool","ToolRow","ToolTestPanel","EmptyRunPanel","Zap","isSelected","onSelect","ToolPill","ServerName","Play"],"mappings":"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"}
|
package/dashboard/dist/assets/{CollapsibleSection-bW0UZN9b.js → CollapsibleSection-BeBsI1M4.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=CollapsibleSection-
|
|
1
|
+
import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-B7lEd0cY.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-BeBsI1M4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleSection-
|
|
1
|
+
{"version":3,"file":"CollapsibleSection-BeBsI1M4.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{a as i,j as e}from"./vendor-query-B2UbickB.js";import{B as y,E as N,O as p,L as f,G as C}from"./index-
|
|
2
|
-
//# sourceMappingURL=CredentialsPage-
|
|
1
|
+
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{B as y,E as N,O as p,L as f,G as C}from"./index-B7lEd0cY.js";import{P as k}from"./PageHeader-Bnt2iQQa.js";import{T as A}from"./TimeAgo-DZF9w8Rl.js";import{C as w}from"./ConfirmDeleteModal-D9_1b4MW.js";import{m as P,j as T,al as O,q as E}from"./vendor-icons-Dj2F0Jrb.js";import"./vendor-react-CXumBFUA.js";import"./Modal-CSrxpXeM.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,l]=i.useState(null),[h,u]=i.useState(!1),[s,j]=i.useState("anthropic"),c=(r==null?void 0:r.connections)??[],b=()=>{a&&n.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},v=t=>`${f}/api/auth/oauth/connect/${t}?token=${encodeURIComponent(C()||"")}&returnTo=/credentials`;return e.jsxs("div",{children:[e.jsx(k,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxs("button",{onClick:()=>u(t=>!t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(P,{className:"w-3.5 h-3.5"}),"Add Credential"]})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6",children:"Manage credentials used by tools when invoked on your behalf. Each credential is encrypted at rest and resolved automatically during tool execution."}),h&&e.jsxs("div",{className:"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md 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:v(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:"space-y-2",children:c.map(t=>e.jsxs("div",{className:"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md",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-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:t.label}),t.credential_type&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:t.credential_type})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-0.5",children:[t.email&&e.jsx("span",{className:"text-xs text-text-tertiary",children:t.email}),t.expires_at&&e.jsxs("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsx(A,{date:t.expires_at})]})]})]}),e.jsx("button",{onClick:()=>l({provider:t.provider,label:t.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsx(E,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(w,{open:!!a,onClose:()=>l(null),onConfirm:b,title:"Revoke Credential",description:e.jsxs(e.Fragment,{children:["Revoke the"," ",e.jsx("span",{className:"font-medium text-text-primary capitalize",children: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-BDzFa3HV.js.map
|
package/dashboard/dist/assets/{CredentialsPage-DVOK3aaR.js.map → CredentialsPage-BDzFa3HV.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsPage-DVOK3aaR.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 p-4 bg-surface-raised border border-surface-border rounded-md 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=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","LT_BASE","getToken","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-BDzFa3HV.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 p-4 bg-surface-raised border border-surface-border rounded-md 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=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","LT_BASE","getToken","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 o,c as r,j as n}from"./vendor-query-B2UbickB.js";import{d as i}from"./index-
|
|
2
|
-
//# sourceMappingURL=CronLabel-
|
|
1
|
+
import{u as c,b as o,c as r,j as n}from"./vendor-query-B2UbickB.js";import{d as i}from"./index-B7lEd0cY.js";import{R as l,a7 as p}from"./vendor-icons-Dj2F0Jrb.js";function b(e){return c({queryKey:["agent-subscriptions",e],queryFn:()=>i(`/agents/${e}/subscriptions`),enabled:!!e})}function g(){const e=o();return r({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=o();return r({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=o();return r({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 y={task:"text-blue-400",workflow:"text-accent",escalation:"text-amber-400",activity:"text-cyan-400",knowledge:"text-violet-400",agent:"text-emerald-400",app:"text-rose-400",milestone:"text-violet-400"};function q({topic:e}){const t=e.split("."),s=t[0]==="system"?t[1]:t[0],a=y[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-[11px] 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-[11px] font-mono text-text-secondary",children:[n.jsx(p,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5}),e]})}export{C,q as E,g as a,f as b,h as c,b as u};
|
|
2
|
+
//# sourceMappingURL=CronLabel-DeNm1I4r.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CronLabel-
|
|
1
|
+
{"version":3,"file":"CronLabel-DeNm1I4r.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-blue-400',\n workflow: 'text-accent',\n escalation: 'text-amber-400',\n activity: 'text-cyan-400',\n knowledge: 'text-violet-400',\n agent: 'text-emerald-400',\n app: 'text-rose-400',\n milestone: 'text-violet-400',\n};\n\ninterface EventTopicPillProps {\n topic: string;\n}\n\nexport function EventTopicPill({ topic }: EventTopicPillProps) {\n const parts = topic.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n const iconColor = CATEGORY_COLORS[category] ?? 'text-text-quaternary';\n // Show category.action for system events (e.g., workflow.completed)\n const shortTopic = parts[0] === 'system'\n ? `${parts[1]}.${parts[parts.length - 1]}`\n : parts.slice(-2).join('.');\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Radio className={`w-2.5 h-2.5 shrink-0 ${iconColor}`} strokeWidth={1.5} />\n {shortTopic}\n </span>\n );\n}\n","import { Clock } from 'lucide-react';\n\ninterface CronLabelProps {\n cron: string;\n}\n\n/**\n * Universal cron expression display — Clock icon + monotype text.\n * Used everywhere a cron schedule is rendered.\n */\nexport function CronLabel({ cron }: CronLabelProps) {\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Clock className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {cron}\n </span>\n );\n}\n"],"names":["useAgentSubscriptions","agentId","useQuery","apiFetch","useCreateSubscription","queryClient","useQueryClient","useMutation","body","_","vars","useUpdateSubscription","subId","useDeleteSubscription","CATEGORY_COLORS","EventTopicPill","topic","parts","category","iconColor","shortTopic","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,gBACZ,SAAY,cACZ,WAAY,iBACZ,SAAY,gBACZ,UAAY,kBACZ,MAAY,mBACZ,IAAY,gBACZ,UAAY,iBACd,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,2EACd,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,2EACd,SAAA,CAAAC,EAAAA,IAACI,EAAA,CAAM,UAAU,4CAA4C,YAAa,IAAK,EAC9ED,CAAA,EACH,CAEJ"}
|
package/dashboard/dist/assets/{CustomDurationPicker-Dy4NBqhZ.js → CustomDurationPicker-C2OH9YcV.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,j as i}from"./vendor-query-B2UbickB.js";import{u as x}from"./index-
|
|
2
|
-
//# sourceMappingURL=CustomDurationPicker-
|
|
1
|
+
import{a as u,j as i}from"./vendor-query-B2UbickB.js";import{u as x}from"./index-B7lEd0cY.js";import{D as d,f as v}from"./constants-BHkpVaqx.js";function j(){const{data:e}=x();return u.useMemo(()=>{var n;return(((n=e==null?void 0:e.escalation)==null?void 0:n.claimDurations)??d).map(a=>({value:String(a),label:v(a)}))},[e])}const f=[{value:1,label:"minutes"},{value:60,label:"hours"}];function C({onChange:e,compact:r,autoFocus:n,"data-testid":a="custom-duration-input"}){const[l,m]=u.useState(""),[s,c]=u.useState(1);u.useEffect(()=>{const t=parseInt(l);e(t>0?t*s:0)},[l,s,e]);const o=r?"text-xs":"text-sm",p=r?"w-16":"w-20";return i.jsxs("div",{className:"flex items-center gap-2","data-testid":a,children:[i.jsx("input",{type:"number",min:1,max:s===60?24:1440,value:l,onChange:t=>m(t.target.value),placeholder:s===60?"hrs":"min",className:`input ${o} ${p} text-center`,autoFocus:n,"data-testid":`${a}-quantity`}),i.jsx("select",{value:s,onChange:t=>c(parseInt(t.target.value)),className:`select ${o} py-1`,"data-testid":`${a}-unit`,children:f.map(t=>i.jsx("option",{value:t.value,children:t.label},t.value))})]})}export{C,j as u};
|
|
2
|
+
//# sourceMappingURL=CustomDurationPicker-C2OH9YcV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomDurationPicker-
|
|
1
|
+
{"version":3,"file":"CustomDurationPicker-C2OH9YcV.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxs","jsx","e","u"],"mappings":"iJAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,KAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAW,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKP,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWW,GAAMV,EAAYU,EAAE,OAAO,KAAK,EAC3C,YAAaR,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,CAAA,EAExBW,EAAAA,IAAC,SAAA,CACC,MAAOP,EACP,SAAWQ,GAAMP,EAAc,SAASO,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUJ,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKkB,GACVF,EAAAA,IAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,KAAgC,CAChD,CAAA,CAAA,CACH,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as n,j as l}from"./vendor-query-B2UbickB.js";import{
|
|
2
|
-
//# sourceMappingURL=DropZone-
|
|
1
|
+
import{a as n,j as l}from"./vendor-query-B2UbickB.js";import{aH as D}from"./vendor-icons-Dj2F0Jrb.js";function v(r,c){const p=c.split(",").map(e=>e.trim());for(const e of p)if(e.startsWith(".")&&r.name.toLowerCase().endsWith(e.toLowerCase())||e===r.type||e.endsWith("/*")&&r.type.startsWith(e.slice(0,-1)))return!0;return!1}function j({onDrop:r,children:c,label:p="Drop files here",accept:e,disabled:i}){const[u,f]=n.useState(!1),s=n.useRef(0),d=n.useCallback(t=>{t.preventDefault(),t.stopPropagation(),s.current++,i||f(!0)},[i]),g=n.useCallback(t=>{t.preventDefault(),t.stopPropagation(),s.current--,s.current<=0&&(s.current=0,f(!1))},[]),x=n.useCallback(t=>{t.preventDefault(),t.stopPropagation()},[]),h=n.useCallback(t=>{if(t.preventDefault(),t.stopPropagation(),s.current=0,f(!1),i)return;const o=Array.from(t.dataTransfer.files);if(console.debug("[DropZone] dropped files:",o.map(a=>({name:a.name,type:a.type,size:a.size}))),e){const a=o.filter(m=>v(m,e));console.debug("[DropZone] after accept filter:",a.length,"of",o.length),a.length?r(a):console.warn("[DropZone] no files matched accept pattern:",e)}else o.length&&r(o)},[r,e,i]);return l.jsxs("div",{className:"relative",onDragEnter:d,onDragLeave:g,onDragOver:x,onDrop:h,children:[c,u&&l.jsx("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none",style:{background:"rgba(var(--color-surface-rgb, 255 255 255) / 0.85)"},children:l.jsxs("div",{className:"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40",children:[l.jsx(D,{className:"w-8 h-8 text-text-tertiary"}),l.jsx("p",{className:"text-xs text-text-secondary",children:p})]})})]})}export{j as D};
|
|
2
|
+
//# sourceMappingURL=DropZone-Dwpgbueb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropZone-
|
|
1
|
+
{"version":3,"file":"DropZone-Dwpgbueb.js","sources":["../../src/components/common/DropZone.tsx"],"sourcesContent":["import { useState, useCallback, useRef, type DragEvent, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\ninterface DropZoneProps {\n onDrop: (files: File[]) => void;\n children: ReactNode;\n label?: string;\n accept?: string;\n disabled?: boolean;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const patterns = accept.split(',').map(s => s.trim());\n for (const pattern of patterns) {\n if (pattern.startsWith('.') && file.name.toLowerCase().endsWith(pattern.toLowerCase())) return true;\n if (pattern === file.type) return true;\n if (pattern.endsWith('/*') && file.type.startsWith(pattern.slice(0, -1))) return true;\n }\n return false;\n}\n\nexport function DropZone({ onDrop, children, label = 'Drop files here', accept, disabled }: DropZoneProps) {\n const [dragOver, setDragOver] = useState(false);\n const dragCounter = useRef(0);\n\n const handleDragEnter = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current++;\n if (!disabled) setDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current--;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setDragOver(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n console.debug('[DropZone] dropped files:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n\n if (accept) {\n const filtered = files.filter(f => matchesAccept(f, accept));\n console.debug('[DropZone] after accept filter:', filtered.length, 'of', files.length);\n if (filtered.length) onDrop(filtered);\n else console.warn('[DropZone] no files matched accept pattern:', accept);\n } else {\n if (files.length) onDrop(files);\n }\n }, [onDrop, accept, disabled]);\n\n return (\n <div\n className=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n {dragOver && (\n <div className=\"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none\"\n style={{ background: 'rgba(var(--color-surface-rgb, 255 255 255) / 0.85)' }}\n >\n <div className=\"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40\">\n <UploadCloud className=\"w-8 h-8 text-text-tertiary\" />\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["matchesAccept","file","accept","patterns","s","pattern","DropZone","onDrop","children","label","disabled","dragOver","setDragOver","useState","dragCounter","useRef","handleDragEnter","useCallback","e","handleDragLeave","handleDragOver","handleDrop","files","f","filtered","jsxs","jsx","UploadCloud"],"mappings":"sGAWA,SAASA,EAAcC,EAAYC,EAAyB,CAC1D,MAAMC,EAAWD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,EACpD,UAAWC,KAAWF,EAGpB,GAFIE,EAAQ,WAAW,GAAG,GAAKJ,EAAK,KAAK,YAAA,EAAc,SAASI,EAAQ,YAAA,CAAa,GACjFA,IAAYJ,EAAK,MACjBI,EAAQ,SAAS,IAAI,GAAKJ,EAAK,KAAK,WAAWI,EAAQ,MAAM,EAAG,EAAE,CAAC,EAAG,MAAO,GAEnF,MAAO,EACT,CAEO,SAASC,EAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,MAAAC,EAAQ,kBAAmB,OAAAP,EAAQ,SAAAQ,GAA2B,CACzG,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAcC,EAAAA,OAAO,CAAC,EAEtBC,EAAkBC,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACPJ,GAAUE,EAAY,EAAI,CACjC,EAAG,CAACF,CAAQ,CAAC,EAEPS,EAAkBF,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACRA,EAAY,SAAW,IACzBA,EAAY,QAAU,EACtBF,EAAY,EAAK,EAErB,EAAG,CAAA,CAAE,EAECQ,EAAiBH,cAAaC,GAAiB,CACnDA,EAAE,eAAA,EACFA,EAAE,gBAAA,CACJ,EAAG,CAAA,CAAE,EAECG,EAAaJ,cAAaC,GAAiB,CAK/C,GAJAA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,QAAU,EACtBF,EAAY,EAAK,EACbF,EAAU,OAEd,MAAMY,EAAQ,MAAM,KAAKJ,EAAE,aAAa,KAAK,EAG7C,GAFA,QAAQ,MAAM,4BAA6BI,EAAM,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAMA,EAAE,IAAA,EAAO,CAAC,EAErGrB,EAAQ,CACV,MAAMsB,EAAWF,EAAM,UAAYtB,EAAcuB,EAAGrB,CAAM,CAAC,EAC3D,QAAQ,MAAM,kCAAmCsB,EAAS,OAAQ,KAAMF,EAAM,MAAM,EAChFE,EAAS,OAAQjB,EAAOiB,CAAQ,EAC/B,QAAQ,KAAK,8CAA+CtB,CAAM,CACzE,MACMoB,EAAM,QAAQf,EAAOe,CAAK,CAElC,EAAG,CAACf,EAAQL,EAAQQ,CAAQ,CAAC,EAE7B,OACEe,EAAAA,KAAC,MAAA,CACC,UAAU,WACV,YAAaT,EACb,YAAaG,EACb,WAAYC,EACZ,OAAQC,EAEP,SAAA,CAAAb,EACAG,GACCe,EAAAA,IAAC,MAAA,CAAI,UAAU,sGACb,MAAO,CAAE,WAAY,oDAAA,EAErB,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAY,UAAU,4BAAA,CAA6B,EACpDD,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAjB,CAAA,CAAM,CAAA,CAAA,CACpD,CAAA,CAAA,CACF,CAAA,CAAA,CAIR"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as s,j as n}from"./vendor-query-B2UbickB.js";import{A as p,y as f}from"./index-
|
|
2
|
-
//# sourceMappingURL=ElapsedCell-
|
|
1
|
+
import{a as s,j as n}from"./vendor-query-B2UbickB.js";import{A as p,y as f}from"./index-B7lEd0cY.js";function D({startDate:r,endDate:o,isLive:e}){const[l,c]=s.useState(Date.now);s.useEffect(()=>{if(!e)return;const u=setInterval(()=>c(Date.now()),1e3);return()=>clearInterval(u)},[e]);const i=new Date(r).getTime(),m=o?new Date(o).getTime():l,t=Math.max(0,m-i),a=p(t),x=s.useMemo(()=>[{label:"ms",value:String(t)},{label:"sec",value:`${(t/1e3).toFixed(3)}s`},{label:"text",value:a}],[t,a]);return n.jsx(f,{options:x,children:n.jsx("span",{className:`text-xs ${e?"text-status-active":"text-text-tertiary"}`,children:a})})}export{D as E};
|
|
2
|
+
//# sourceMappingURL=ElapsedCell-WdzqA0dR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElapsedCell-
|
|
1
|
+
{"version":3,"file":"ElapsedCell-WdzqA0dR.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsx","DateTooltip"],"mappings":"qGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,IAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,EAAAA,IAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,CACH,EACF,CAEJ"}
|
package/dashboard/dist/assets/{EscalationsOverview-Cv5UvuHI.js → EscalationsOverview-BIEeflEV.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{i as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=EscalationsOverview-
|
|
1
|
+
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{i as u}from"./index-B7lEd0cY.js";import{e as p}from"./useEventHooks-Cd1GM1NG.js";import{P as b}from"./PageHeader-Bnt2iQQa.js";import{S as n}from"./StatCard-DlgF0CJC.js";import{c as j}from"./vendor-react-CXumBFUA.js";import"./vendor-icons-Dj2F0Jrb.js";const v=[{label:"1h",value:"1h"},{label:"24h",value:"24h"},{label:"7d",value:"7d"},{label:"30d",value:"30d"}];function c({value:i,colorClass:r,onClick:o}){return i===0?e.jsx("span",{className:"text-text-tertiary",children:"0"}):e.jsx("button",{onClick:o,className:`${r} hover:underline tabular-nums font-medium`,children:i})}function $(){var d,x;p();const i=j(),[r,o]=m.useState("24h"),{data:s}=u(r),l=t=>{const h=new URLSearchParams(t).toString();i(`/escalations/available${h?`?${h}`:""}`)},a="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxs("div",{children:[e.jsx(b,{title:"Escalations",docsHash:"#docs:dashboard.md:escalations-overview"}),e.jsx("div",{className:"flex items-center gap-1 mb-6",children:v.map(t=>e.jsx("button",{onClick:()=>o(t.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${r===t.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:t.label},t.value))}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsx(n,{label:"Open",value:(s==null?void 0:s.pending)??"—",colorClass:"text-status-pending",onClick:()=>l()}),e.jsx(n,{label:"Claimed",value:(s==null?void 0:s.claimed)??"—",colorClass:"text-status-active",onClick:()=>l()}),e.jsx(n,{label:"Created",value:(s==null?void 0:s.created)??"—",onClick:()=>l()}),e.jsx(n,{label:"Resolved",value:(s==null?void 0:s.resolved)??"—",colorClass:"text-status-success",onClick:()=>l()})]}),(((d=s==null?void 0:s.by_role)==null?void 0:d.length)??0)>0&&e.jsx("div",{className:"mb-8",children:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:a,children:"Role"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Pending"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Claimed"})]})}),e.jsx("tbody",{children:s.by_role.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>l({role:t.role}),className:"hover:text-accent hover:underline",children:t.role})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.pending,colorClass:"text-status-pending",onClick:()=>l({role:t.role})})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.claimed,colorClass:"text-status-active",onClick:()=>l({role:t.role})})})]},t.role))})]})}),(((x=s==null?void 0:s.by_type)==null?void 0:x.length)??0)>0&&e.jsx("div",{children:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:a,children:"Type"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Pending"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Claimed"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Resolved"})]})}),e.jsx("tbody",{children:s.by_type.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>l({type:t.type}),className:"hover:text-accent hover:underline",children:t.type})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.pending,colorClass:"text-status-pending",onClick:()=>l({type:t.type})})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.claimed,colorClass:"text-status-active",onClick:()=>l({type:t.type})})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.resolved,colorClass:"text-status-success",onClick:()=>l({type:t.type})})})]},t.type))})]})}),s&&s.by_role.length===0&&s.by_type.length===0&&e.jsx("div",{className:"py-16 text-center",children:e.jsxs("p",{className:"text-sm text-text-tertiary",children:["No escalation activity in the last ",r]})})]})}export{$ as EscalationsOverview};
|
|
2
|
+
//# sourceMappingURL=EscalationsOverview-BIEeflEV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EscalationsOverview-Cv5UvuHI.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" docsHash=\"#docs:dashboard.md:escalations-overview\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsx","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","jsxs","StatCard","_a","row","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EscalationsOverview-BIEeflEV.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" docsHash=\"#docs:dashboard.md:escalations-overview\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsx","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","jsxs","StatCard","_a","row","_b"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o,j as t}from"./vendor-query-B2UbickB.js";import{F as C,b as f}from"./FilterBar-Ck4K4rzu.js";import{f as $,C as T}from"./index-
|
|
2
|
-
//# sourceMappingURL=EventTable-
|
|
1
|
+
import{a as o,j as t}from"./vendor-query-B2UbickB.js";import{F as C,b as f}from"./FilterBar-Ck4K4rzu.js";import{f as $,C as T}from"./index-B7lEd0cY.js";import{E as F}from"./SwimlaneTimeline-BZmad7WQ.js";const D=new Set(["activity_task_scheduled","timer_started","child_workflow_execution_started","signal_wait_started"]),P=new Set(["activity_task_completed","activity_task_failed","timer_fired","child_workflow_execution_completed","child_workflow_execution_failed","workflow_execution_signaled"]);function O(l){const a=new Set;for(const i of l)P.has(i.event_type)&&i.attributes.timeline_key&&a.add(i.attributes.timeline_key);return a}function Y({events:l,childTasks:a}){const[i,_]=o.useState(""),[c,h]=o.useState(""),[x,y]=o.useState("asc"),[u,d]=o.useState(new Set),g=[...new Set(l.map(e=>e.category))].sort(),b=[...new Set(l.map(e=>e.event_type))].sort(),w=O(l),v=e=>{if(e.duration_ms!==null||!D.has(e.event_type))return!1;const s=e.attributes.timeline_key;return!(s&&w.has(s))};let n=l;i&&(n=n.filter(e=>e.category===i)),c&&(n=n.filter(e=>e.event_type===c)),n=[...n].sort((e,s)=>x==="asc"?e.event_id-s.event_id:s.event_id-e.event_id);const j=e=>{switch(e){case"activity":return"bg-blue-500";case"signal":return"bg-emerald-500";case"timer":return"bg-status-warning";case"child_workflow":return"bg-violet-500";default:return"bg-text-tertiary"}},k=e=>{const s=e.event_type;if(e.attributes.activity_type)return`${s} — ${e.attributes.activity_type}`;if(e.attributes.signal_name)return`${s} — ${e.attributes.signal_name}`;if(e.attributes.child_workflow_id){const r=e.attributes.child_workflow_id,S=r.length>24?`${r.slice(0,24)}...`:r;return`${s} — ${S}`}return s},N=e=>{if(!(a!=null&&a.length))return;const s=e.attributes.activity_type;if(s)return a.find(r=>r.workflow_type===s)},p=e=>{d(s=>{const r=new Set(s);return r.has(e)?r.delete(e):r.add(e),r})},m=n.length>0&&n.every(e=>u.has(e.event_id)),E=()=>{d(m?new Set:new Set(n.map(e=>e.event_id)))};return t.jsxs("div",{children:[t.jsxs("div",{className:"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3",children:[t.jsxs("div",{className:"flex items-center gap-4",children:[t.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:["Events (",n.length,")"]}),n.length>0&&t.jsx("button",{onClick:E,className:"text-[10px] text-accent hover:underline",children:m?"Collapse all":"Expand all"})]}),t.jsxs(C,{children:[t.jsx(f,{label:"Category",value:i,onChange:_,options:g.map(e=>({value:e,label:e}))}),t.jsx(f,{label:"Type",value:c,onChange:h,options:b.map(e=>({value:e,label:e}))}),t.jsx("button",{onClick:()=>y(e=>e==="asc"?"desc":"asc"),className:"btn-ghost text-xs",children:x==="asc"?"Oldest first":"Newest first"})]})]}),t.jsx("div",{children:n.length===0?t.jsx("div",{className:"px-6 py-8 text-center",children:t.jsx("p",{className:"text-sm text-text-tertiary",children:"No events match the current filters"})}):n.map(e=>{const s=u.has(e.event_id),r=v(e);return t.jsxs("div",{className:"border-b border-surface-border last:border-b-0",children:[t.jsxs("div",{className:"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200",onClick:()=>p(e.event_id),children:[t.jsx("span",{className:`text-[10px] text-text-tertiary transition-transform duration-300 ${s?"rotate-90":""}`,children:"▶"}),t.jsx("span",{className:"text-xs font-mono text-text-tertiary w-8 shrink-0",children:e.event_id}),t.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${j(e.category)}`}),t.jsx("span",{className:"text-sm text-text-primary flex-1 truncate",children:k(e)}),t.jsx("span",{className:"text-xs font-mono text-text-tertiary shrink-0",children:r?t.jsxs("span",{className:"inline-flex items-center gap-1 text-status-warning",children:[t.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"}),"Pending"]}):e.duration_ms!==null?$(e.duration_ms):"--"}),t.jsx("time",{className:"text-[10px] font-mono text-text-tertiary shrink-0",children:new Date(e.event_time).toLocaleTimeString()})]}),t.jsx(T,{open:s&&!!e.attributes,children:t.jsx("div",{className:"px-6 pb-4 pl-16",children:t.jsx(F,{event:e,childTask:N(e),pending:r,onClose:()=>p(e.event_id)})})})]},e.event_id)})})]})}export{Y as E};
|
|
2
|
+
//# sourceMappingURL=EventTable-NIhWP__B.js.map
|