@hotmeshio/long-tail 0.3.2 → 0.4.0
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/build/api/agents.d.ts +1 -1
- package/build/api/agents.js +1 -1
- package/build/api/controlplane.d.ts +33 -0
- package/build/api/controlplane.js +46 -0
- package/build/bin/ltc.js +16 -0
- package/build/lib/cli/commands/streams.d.ts +20 -0
- package/build/lib/cli/commands/streams.js +134 -0
- package/build/lib/db/schemas/003_agents.sql +1 -2
- package/build/lib/db/schemas/004_agent_subscriptions.sql +1 -1
- package/build/routes/agents.js +3 -3
- package/build/routes/controlplane.js +28 -0
- package/build/sdk/index.d.ts +1 -0
- package/build/sdk/index.js +1 -0
- package/build/services/agent/index.d.ts +2 -3
- package/build/services/agent/index.js +5 -12
- package/build/services/agent/sql.d.ts +3 -4
- package/build/services/agent/sql.js +16 -20
- package/build/services/agent/subscription-sql.d.ts +1 -1
- package/build/services/agent/subscription-sql.js +1 -1
- package/build/services/agent/trigger-registry.js +1 -1
- package/build/services/controlplane/index.d.ts +9 -1
- package/build/services/controlplane/index.js +39 -0
- package/build/services/controlplane/stream-messages-sql.d.ts +21 -0
- package/build/services/controlplane/stream-messages-sql.js +108 -0
- package/build/services/controlplane/types.d.ts +44 -0
- package/build/services/cron/index.js +5 -5
- package/build/services/export/post-process.js +14 -6
- package/build/services/mcp-runs/execution-builder.js +9 -4
- package/build/services/topics/index.js +1 -4
- package/build/services/topics/sql.d.ts +2 -2
- package/build/services/topics/sql.js +9 -2
- package/build/services/topics/system-topics.js +2 -3
- package/build/start/workers.js +11 -14
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/agent.d.ts +1 -1
- package/dashboard/dist/assets/AdminDashboard-CR0FtTE6.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js.map → AdminDashboard-CR0FtTE6.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-BVypgq9m.js +13 -0
- package/dashboard/dist/assets/AgentConfigPage-BVypgq9m.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-D64ath8c.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-D64ath8c.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-j-zblMNR.js +2 -0
- package/dashboard/dist/assets/AgentsPage-j-zblMNR.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DmUid1h0.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-DdrzePy4.js.map → AvailableEscalationsPage-DmUid1h0.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-DCScT8BN.js +2 -0
- package/dashboard/dist/assets/{BotPicker-kKBifD1w.js.map → BotPicker-DCScT8BN.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-g5iUvHRL.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-g5iUvHRL.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-Dj1YOsVG.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js.map → CollapsibleSection-Dj1YOsVG.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
- package/dashboard/dist/assets/{CopyableId-B4CL12pv.js.map → CopyableId-DmLF-RqZ.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-Dvb4QelY.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-Dvb4QelY.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-sk1BkcJd.js +2 -0
- package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js.map → CronLabel-sk1BkcJd.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-C0MV2Q06.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js.map → CustomDurationPicker-C0MV2Q06.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-D9yuBv0w.js +2 -0
- package/dashboard/dist/assets/{DataTable-J5R6mepB.js.map → DataTable-D9yuBv0w.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-DN8uwUtf.js +2 -0
- package/dashboard/dist/assets/{DropZone-DwNj3GiG.js.map → DropZone-DN8uwUtf.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-CFXhhKKc.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js.map → ElapsedCell-CFXhhKKc.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
- package/dashboard/dist/assets/{EmptyState-BXGvOADa.js.map → EmptyState-BcsfPq9T.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-BEuUFGwC.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js.map → EscalationsOverview-BEuUFGwC.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-DcwVWOKb.js +2 -0
- package/dashboard/dist/assets/{EventTable-CvJ98E8s.js.map → EventTable-DcwVWOKb.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-CWCP1v1O.js +2 -0
- package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js.map → EventTopicPill-CWCP1v1O.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BH-F5ws9.js +2 -0
- package/dashboard/dist/assets/HomePage-BH-F5ws9.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-CUxJlz__.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js.map → ListToolbar-CUxJlz__.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-O8XrOzy0.js +2 -0
- package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js.map → McpOverview-O8XrOzy0.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DhiR0Xrx.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js.map → McpQueryDetailPage-DhiR0Xrx.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-Czot0nfl.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js.map → McpQueryPage-Czot0nfl.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-B1kNnD_t.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js.map → McpRunDetailPage-B1kNnD_t.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-QUY3pWp9.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-QUY3pWp9.js.map +1 -0
- package/dashboard/dist/assets/Modal-DEODGeqx.js +2 -0
- package/dashboard/dist/assets/{Modal-C6k6_5KB.js.map → Modal-DEODGeqx.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-BG1Q9qZk.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-e5N3_dVl.js.map → OperatorDashboard-BG1Q9qZk.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DlzOOM4Y.js +2 -0
- package/dashboard/dist/assets/{PageHeader-COcgWWf-.js.map → PageHeader-DlzOOM4Y.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-C5cZ3IOO.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js.map → PageHeaderWithStats-C5cZ3IOO.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-DS1AwTso.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js.map → ProcessDetailPage-DS1AwTso.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-CAmVcn1P.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js.map → ProcessesListPage-CAmVcn1P.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-BZaUpkHg.js +2 -0
- package/dashboard/dist/assets/{RolePill-CHwys1f9.js.map → RolePill-BZaUpkHg.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-CFdIXfmv.js +2 -0
- package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js.map → RolesPage-CFdIXfmv.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
- package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BGww9lta.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js.map → RunAsSelector-BGww9lta.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-DfS3pfon.js +2 -0
- package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js.map → ServerName-DfS3pfon.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
- package/dashboard/dist/assets/{StatCard-OKzRSSx4.js.map → StatCard-DlgF0CJC.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js.map → StatusBadge-XQlNFwmH.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js.map → StickyPagination-F9FZsRy9.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-C2hGjy0V.js +2 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js.map → SwimlaneTimeline-C2hGjy0V.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-D21mrQx6.js +2 -0
- package/dashboard/dist/assets/{TagInput-BGxXKiWD.js.map → TagInput-D21mrQx6.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-B49WQj8W.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-B49WQj8W.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-D8UMH1rd.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js.map → TaskQueuePill-D8UMH1rd.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-CJB-EvKX.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js.map → TasksListPage-CJB-EvKX.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-CnjY3XDt.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js.map → TimeAgo-CnjY3XDt.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-u1YA8eA3.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js.map → TimestampCell-u1YA8eA3.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-Dmcwmqh2.js +2 -0
- package/dashboard/dist/assets/{ToolPill-DdLN3JOT.js.map → ToolPill-Dmcwmqh2.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-B1T4Hk0t.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js.map → ToolTestPanel-B1T4Hk0t.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-ClibbST4.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-ClibbST4.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-KjODhitc.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js.map → TopicsPage-KjODhitc.js.map} +1 -1
- package/dashboard/dist/assets/UserName-DVqimwsO.js +2 -0
- package/dashboard/dist/assets/{UserName-CLbusknU.js.map → UserName-DVqimwsO.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DYNPy7Gk.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js.map → WorkflowExecutionPage-DYNPy7Gk.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-h43nlUmM.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js.map → WorkflowPill-h43nlUmM.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-DdJm6X7x.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BWiUNvyl.js.map → WorkflowsDashboard-DdJm6X7x.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-CBOYkfpD.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js.map → WorkflowsOverview-CBOYkfpD.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BZnD_hMw.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-CLebf2eL.js.map → YamlWorkflowsPage-BZnD_hMw.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dga6NU7U.js → agents-oHMkS1GD.js} +2 -2
- package/dashboard/dist/assets/agents-oHMkS1GD.js.map +1 -0
- package/dashboard/dist/assets/{bots-CtU4i4OQ.js → bots-BispbsY3.js} +2 -2
- package/dashboard/dist/assets/{bots-CtU4i4OQ.js.map → bots-BispbsY3.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BVoALhbL.js → controlplane-CIbrx5rX.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BVoALhbL.js.map → controlplane-CIbrx5rX.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-Dh_0iVTH.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js.map → escalation-columns-Dh_0iVTH.js.map} +1 -1
- package/dashboard/dist/assets/escalation-qhj4TxA3.js +2 -0
- package/dashboard/dist/assets/{escalation-_N5GfuIi.js.map → escalation-qhj4TxA3.js.map} +1 -1
- package/dashboard/dist/assets/helpers-BYw1qqKV.js +2 -0
- package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js.map → helpers-BYw1qqKV.js.map} +1 -1
- package/dashboard/dist/assets/index-B9t_vpam.js +2 -0
- package/dashboard/dist/assets/{index-Dpjguclc.js.map → index-B9t_vpam.js.map} +1 -1
- package/dashboard/dist/assets/index-Bh9g-EOF.js +2 -0
- package/dashboard/dist/assets/{index-CS61sh5q.js.map → index-Bh9g-EOF.js.map} +1 -1
- package/dashboard/dist/assets/index-BhhWCADo.js +63 -0
- package/dashboard/dist/assets/index-BhhWCADo.js.map +1 -0
- package/dashboard/dist/assets/index-Bn-VSH41.js +2 -0
- package/dashboard/dist/assets/index-Bn-VSH41.js.map +1 -0
- package/dashboard/dist/assets/index-C2yJWps6.js +6 -0
- package/dashboard/dist/assets/{index-B9ealjkt.js.map → index-C2yJWps6.js.map} +1 -1
- package/dashboard/dist/assets/index-C4W1_Rfk.js +5 -0
- package/dashboard/dist/assets/{index-CtbG3UN-.js.map → index-C4W1_Rfk.js.map} +1 -1
- package/dashboard/dist/assets/index-CEF3Idec.js +2 -0
- package/dashboard/dist/assets/{index-6Kd78p_v.js.map → index-CEF3Idec.js.map} +1 -1
- package/dashboard/dist/assets/index-CHxvfc97.css +1 -0
- package/dashboard/dist/assets/index-CVRVw3g_.js +2 -0
- package/dashboard/dist/assets/{index-dM-OgCY3.js.map → index-CVRVw3g_.js.map} +1 -1
- package/dashboard/dist/assets/index-CY3EhrEA.js +2 -0
- package/dashboard/dist/assets/{index-QicYdUsl.js.map → index-CY3EhrEA.js.map} +1 -1
- package/dashboard/dist/assets/index-D-q2lzup.js +2 -0
- package/dashboard/dist/assets/{index-DWUunWxh.js.map → index-D-q2lzup.js.map} +1 -1
- package/dashboard/dist/assets/index-D6YjH5uG.js +15 -0
- package/dashboard/dist/assets/{index-BYwPVJv0.js.map → index-D6YjH5uG.js.map} +1 -1
- package/dashboard/dist/assets/index-ht5r_7jQ.js +2 -0
- package/dashboard/dist/assets/index-ht5r_7jQ.js.map +1 -0
- package/dashboard/dist/assets/index-zHicKKh9.js +2 -0
- package/dashboard/dist/assets/{index-D_H_Prht.js.map → index-zHicKKh9.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DJlebU82.js → knowledge-B23TU6JN.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DJlebU82.js.map → knowledge-B23TU6JN.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CsLJ5SRm.js → mcp-Cew_Sb-Q.js} +2 -2
- package/dashboard/dist/assets/{mcp-CsLJ5SRm.js.map → mcp-Cew_Sb-Q.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js → mcp-query-So0Oz5Lx.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js.map → mcp-query-So0Oz5Lx.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js → mcp-runs-4176y3SA.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js.map → mcp-runs-4176y3SA.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-CqBbWsJx.js +2 -0
- package/dashboard/dist/assets/{namespaces-iRejH3_A.js.map → namespaces-CqBbWsJx.js.map} +1 -1
- package/dashboard/dist/assets/{roles-3Jm5KtKc.js → roles-BTxMgLE6.js} +2 -2
- package/dashboard/dist/assets/{roles-3Jm5KtKc.js.map → roles-BTxMgLE6.js.map} +1 -1
- package/dashboard/dist/assets/settings-CtQNxacL.js +2 -0
- package/dashboard/dist/assets/{settings-DmN2I-c6.js.map → settings-CtQNxacL.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Cc-QoITQ.js → tasks-CIRlUTbo.js} +2 -2
- package/dashboard/dist/assets/{tasks-Cc-QoITQ.js.map → tasks-CIRlUTbo.js.map} +1 -1
- package/dashboard/dist/assets/{topics-p8anbgi0.js → topics-C8YmK_j2.js} +2 -2
- package/dashboard/dist/assets/topics-C8YmK_j2.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js → useEventHooks-BvMUy36X.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js.map → useEventHooks-BvMUy36X.js.map} +1 -1
- package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js → useExpandedRows-CkcEntB-.js} +2 -2
- package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js.map → useExpandedRows-CkcEntB-.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js → useFilterParams-DZCAaBC7.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js.map → useFilterParams-DZCAaBC7.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js → useYamlActivityEvents-DLEzqv-z.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js.map → useYamlActivityEvents-DLEzqv-z.js.map} +1 -1
- package/dashboard/dist/assets/{users-oXOlnold.js → users-C_bD6mzW.js} +2 -2
- package/dashboard/dist/assets/{users-oXOlnold.js.map → users-C_bD6mzW.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CBOM6Es0.js → vendor-icons-DY1ctJgc.js} +111 -101
- package/dashboard/dist/assets/vendor-icons-DY1ctJgc.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js +22 -0
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Yq7cK-vR.js → workflows-DFR0-hI3.js} +2 -2
- package/dashboard/dist/assets/{workflows-Yq7cK-vR.js.map → workflows-DFR0-hI3.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js → yaml-workflows-wXURdyjP.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js.map → yaml-workflows-wXURdyjP.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/agents.md +1 -1
- package/docs/api/http/agents.md +5 -7
- package/docs/api/http/controlplane.md +193 -0
- package/docs/api/sdk/agents.md +5 -5
- package/docs/api/sdk/controlplane.md +36 -0
- package/docs/dashboard.md +13 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +0 -2
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +0 -2
- package/dashboard/dist/assets/BotPicker-kKBifD1w.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-kYTBL7dT.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-CcaAapMl.js +0 -2
- package/dashboard/dist/assets/CopyableId-B4CL12pv.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-D1VAlwid.js +0 -2
- package/dashboard/dist/assets/CronLabel-DRmO5rH0.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +0 -2
- package/dashboard/dist/assets/DataTable-J5R6mepB.js +0 -2
- package/dashboard/dist/assets/DropZone-DwNj3GiG.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-ChyMzl9n.js +0 -2
- package/dashboard/dist/assets/EmptyState-BXGvOADa.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-DM6zmE4g.js +0 -2
- package/dashboard/dist/assets/EventTable-CvJ98E8s.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-CB_rIGlL.js +0 -2
- package/dashboard/dist/assets/FilterBar-Bdssa-Xn.js +0 -2
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js +0 -2
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-jy8NL6ll.js +0 -2
- package/dashboard/dist/assets/McpOverview-xkaKuHbX.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-D5ICn6cR.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-C46fzfm5.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js.map +0 -1
- package/dashboard/dist/assets/Modal-C6k6_5KB.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +0 -2
- package/dashboard/dist/assets/PageHeader-COcgWWf-.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-C0PCY3aJ.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-BQCsYMpM.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-iyPsmlhm.js +0 -2
- package/dashboard/dist/assets/RolePill-CHwys1f9.js +0 -2
- package/dashboard/dist/assets/RolesPage-Bmc3XaUk.js +0 -2
- package/dashboard/dist/assets/RowActions-Bs4PF-Gd.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DXzAr2WW.js +0 -2
- package/dashboard/dist/assets/ServerName-BIdLC1Ay.js +0 -2
- package/dashboard/dist/assets/StatCard-OKzRSSx4.js +0 -2
- package/dashboard/dist/assets/StatusBadge-CQlF46RR.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CP7eycjI.js +0 -2
- package/dashboard/dist/assets/StickyPagination-CGk8VAKt.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-MEUPc3yJ.js +0 -2
- package/dashboard/dist/assets/TagInput-BGxXKiWD.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-bw8ieKsf.js +0 -2
- package/dashboard/dist/assets/TasksListPage-D1INzcrA.js +0 -2
- package/dashboard/dist/assets/TimeAgo-CywLVIBA.js +0 -2
- package/dashboard/dist/assets/TimestampCell-B4Pc6f3A.js +0 -2
- package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-DusbUka5.js +0 -2
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +0 -2
- package/dashboard/dist/assets/UserName-CLbusknU.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-C61R-3Gg.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-7vt2F6wR.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-DA2ZOs7D.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +0 -2
- package/dashboard/dist/assets/agents-Dga6NU7U.js.map +0 -1
- package/dashboard/dist/assets/escalation-_N5GfuIi.js +0 -2
- package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js +0 -2
- package/dashboard/dist/assets/helpers-Dz2U3Ctb.js +0 -2
- package/dashboard/dist/assets/index-6Kd78p_v.js +0 -2
- package/dashboard/dist/assets/index-B9ealjkt.js +0 -6
- package/dashboard/dist/assets/index-BIUHY2Jz.css +0 -1
- package/dashboard/dist/assets/index-BWHDW_CF.js +0 -2
- package/dashboard/dist/assets/index-BWHDW_CF.js.map +0 -1
- package/dashboard/dist/assets/index-BYwPVJv0.js +0 -15
- package/dashboard/dist/assets/index-CCOSf1PY.js +0 -281
- package/dashboard/dist/assets/index-CCOSf1PY.js.map +0 -1
- package/dashboard/dist/assets/index-CS61sh5q.js +0 -2
- package/dashboard/dist/assets/index-CtbG3UN-.js +0 -5
- package/dashboard/dist/assets/index-DWUunWxh.js +0 -2
- package/dashboard/dist/assets/index-D_H_Prht.js +0 -2
- package/dashboard/dist/assets/index-Dpjguclc.js +0 -2
- package/dashboard/dist/assets/index-QicYdUsl.js +0 -2
- package/dashboard/dist/assets/index-dM-OgCY3.js +0 -2
- package/dashboard/dist/assets/namespaces-iRejH3_A.js +0 -2
- package/dashboard/dist/assets/settings-DmN2I-c6.js +0 -2
- package/dashboard/dist/assets/topics-p8anbgi0.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +0 -26
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvailableEscalationsPage-DdrzePy4.js","sources":["../../src/components/common/modal/BulkActionBar.tsx","../../src/components/common/modal/BulkAssignModal.tsx","../../src/components/common/modal/BulkTriageModal.tsx","../../src/pages/operator/helpers.ts","../../src/pages/operator/ClaimModal.tsx","../../src/pages/operator/AvailableEscalationsPage.tsx"],"sourcesContent":["import { PRIORITY_OPTIONS } from '../../../lib/constants';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface BulkActionBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n onSetPriority: (priority: 1 | 2 | 3 | 4) => void;\n onClaim: (durationMinutes: number) => void;\n onAssign: () => void;\n onEscalate: (targetRole: string) => void;\n onTriage: () => void;\n isPriorityPending: boolean;\n isClaimPending: boolean;\n isAssignPending: boolean;\n isEscalatePending: boolean;\n isTriagePending: boolean;\n availableRoles: string[];\n}\n\nconst anyPending = (props: BulkActionBarProps) =>\n props.isPriorityPending || props.isClaimPending || props.isAssignPending || props.isEscalatePending || props.isTriagePending;\n\nexport function BulkActionBar(props: BulkActionBarProps) {\n const disabled = anyPending(props);\n const claimDurations = useClaimDurations();\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {props.selectedCount} selected\n </span>\n\n <div className=\"w-px h-5 bg-surface-border\" />\n\n {/* Priority */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onSetPriority(parseInt(e.target.value) as 1 | 2 | 3 | 4);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Priority...</option>\n {PRIORITY_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Claim */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onClaim(parseInt(e.target.value));\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Claim for...</option>\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Assign */}\n <button\n onClick={props.onAssign}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isAssignPending ? 'Assigning...' : 'Assign to...'}\n </button>\n\n {/* Escalate */}\n {props.availableRoles.length > 0 && (\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onEscalate(e.target.value);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Escalate to...</option>\n {props.availableRoles.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n )}\n\n {/* Triage */}\n <button\n onClick={props.onTriage}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isTriagePending ? 'Triaging...' : 'Triage'}\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Clear */}\n <button\n onClick={props.onClearSelection}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n\n {disabled && (\n <span className=\"text-xs text-text-tertiary animate-pulse\">Processing...</span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Modal } from './Modal';\nimport { CustomDurationPicker } from '../form/CustomDurationPicker';\nimport { useUsers } from '../../../api/users';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\nimport type { LTUserRecord } from '../../../api/types';\n\ninterface BulkAssignModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n /** Distinct roles of the selected escalations; scopes user list for admins */\n selectedRoles: string[];\n onSubmit: (targetUserId: string, durationMinutes: number) => void;\n isPending: boolean;\n}\n\nexport function BulkAssignModal({\n open,\n onClose,\n selectedCount,\n selectedRoles,\n onSubmit,\n isPending,\n}: BulkAssignModalProps) {\n const { isSuperAdmin } = useAuth();\n const claimDurations = useClaimDurations();\n const [step, setStep] = useState<'user' | 'duration'>('user');\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [search, setSearch] = useState('');\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n // Admins with a single role: scope to that role. Otherwise show all active users.\n const roleFilter =\n !isSuperAdmin && selectedRoles.length === 1 ? selectedRoles[0] : undefined;\n\n const { data: usersData, isLoading: usersLoading } = useUsers({\n role: roleFilter,\n status: 'active',\n limit: 200,\n });\n\n const filteredUsers = useMemo(() => {\n const users = usersData?.users ?? [];\n if (!search.trim()) return users;\n const q = search.toLowerCase();\n return users.filter(\n (u) =>\n u.display_name?.toLowerCase().includes(q) ||\n u.email?.toLowerCase().includes(q),\n );\n }, [usersData?.users, search]);\n\n const handleClose = () => {\n setStep('user');\n setSelectedUser(null);\n setSearch('');\n setDuration('30');\n setCustomMinutes(0);\n onClose();\n };\n\n const handleSelectUser = (user: LTUserRecord) => {\n setSelectedUser(user);\n setStep('duration');\n };\n\n const handleBack = () => {\n setStep('user');\n };\n\n const handleSubmit = () => {\n if (!selectedUser) return;\n const minutes = duration === 'custom' ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onSubmit(selectedUser.id, minutes);\n };\n\n return (\n <Modal open={open} onClose={handleClose} title=\"Assign Escalations\">\n <div className=\"space-y-4\">\n {step === 'user' && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Select a user to assign{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedCount}\n </span>{' '}\n escalation(s) to:\n </p>\n\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search by name or email...\"\n className=\"input text-xs w-full\"\n autoFocus\n />\n\n <div className=\"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border\">\n {usersLoading && (\n <p className=\"text-xs text-text-tertiary p-3\">\n Loading users...\n </p>\n )}\n {!usersLoading && filteredUsers.length === 0 && (\n <p className=\"text-xs text-text-tertiary p-3\">\n No users found\n </p>\n )}\n {filteredUsers.map((user) => (\n <button\n key={user.id}\n onClick={() => handleSelectUser(user)}\n className=\"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors\"\n >\n <p className=\"text-xs font-medium text-text-primary\">\n {user.display_name || user.external_id}\n </p>\n {user.email && (\n <p className=\"text-[10px] text-text-tertiary\">\n {user.email}\n </p>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-end pt-2\">\n <button onClick={handleClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n </div>\n </>\n )}\n\n {step === 'duration' && selectedUser && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Assign to{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedUser.display_name || selectedUser.external_id}\n </span>{' '}\n for:\n </p>\n\n <select\n value={duration}\n onChange={(e) => { setDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {duration === 'custom' && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={handleBack} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Assigning...' : 'Assign'}\n </button>\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Modal } from './Modal';\n\ninterface BulkTriageModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n onSubmit: (hint?: string) => void;\n isPending: boolean;\n}\n\nexport function BulkTriageModal({\n open,\n onClose,\n selectedCount,\n onSubmit,\n isPending,\n}: BulkTriageModalProps) {\n const [hint, setHint] = useState('');\n\n const handleSubmit = () => {\n onSubmit(hint || undefined);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Submit for AI Triage\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Submit <span className=\"font-medium text-text-primary\">{selectedCount}</span> escalation(s)\n for AI triage? The triage orchestrator will take over resolution.\n </p>\n\n <div>\n <label className=\"text-xs font-medium text-text-secondary block mb-1\">\n Triage hint <span className=\"text-text-tertiary\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={hint}\n onChange={(e) => setHint(e.target.value)}\n placeholder=\"e.g., image_orientation\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Guides the triage workflow on what remediation to apply\n </p>\n </div>\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Submitting...' : 'Submit for Triage'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\n\n/**\n * Create a bulk-action handler that calls a mutation and clears selection on success.\n */\nfunction bulkHandler<TData, TVariables>(\n mutation: UseMutationResult<TData, Error, TVariables>,\n clearSelection: () => void,\n afterSuccess?: () => void,\n) {\n return (variables: TVariables) => {\n mutation.mutate(variables, {\n onSuccess: () => {\n clearSelection();\n afterSuccess?.();\n },\n });\n };\n}\n\nexport function createBulkHandlers(deps: {\n selectedIds: Set<string>;\n clearSelection: () => void;\n setPriority: UseMutationResult<{ updated: number }, Error, { ids: string[]; priority: 1 | 2 | 3 | 4 }>;\n bulkClaim: UseMutationResult<{ claimed: number; skipped: number }, Error, { ids: string[]; durationMinutes: number }>;\n bulkEscalate: UseMutationResult<{ updated: number }, Error, { ids: string[]; targetRole: string }>;\n bulkTriage: UseMutationResult<{ triaged: number }, Error, { ids: string[]; hint?: string }>;\n bulkAssign: UseMutationResult<{ assigned: number; skipped: number }, Error, { ids: string[]; targetUserId: string; durationMinutes: number }>;\n closeTriageModal: () => void;\n closeAssignModal: () => void;\n}) {\n const ids = () => [...deps.selectedIds];\n\n const handleSetPriority = (priority: 1 | 2 | 3 | 4) => {\n bulkHandler(\n deps.setPriority,\n deps.clearSelection,\n )({ ids: ids(), priority });\n };\n\n const handleBulkClaim = (durationMinutes: number) => {\n bulkHandler(\n deps.bulkClaim,\n deps.clearSelection,\n )({ ids: ids(), durationMinutes });\n };\n\n const handleBulkEscalate = (targetRole: string) => {\n bulkHandler(\n deps.bulkEscalate,\n deps.clearSelection,\n )({ ids: ids(), targetRole });\n };\n\n const handleBulkTriage = (hint?: string) => {\n bulkHandler(\n deps.bulkTriage,\n deps.clearSelection,\n deps.closeTriageModal,\n )({ ids: ids(), hint });\n };\n\n const handleBulkAssign = (targetUserId: string, durationMinutes: number) => {\n bulkHandler(\n deps.bulkAssign,\n deps.clearSelection,\n deps.closeAssignModal,\n )({ ids: ids(), targetUserId, durationMinutes });\n };\n\n return { handleSetPriority, handleBulkClaim, handleBulkEscalate, handleBulkTriage, handleBulkAssign };\n}\n","import { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\n title=\"Claim Escalation\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Claim <span className=\"font-medium text-text-primary\">{claimTarget?.type}</span> for:\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { onDurationChange(e.target.value); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {claimDuration === 'custom' && (\n <CustomDurationPicker onChange={onCustomClaimChange} autoFocus />\n )}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\n useEscalationTypes,\n useClaimEscalation,\n useSetEscalationPriority,\n useBulkClaimEscalations,\n useBulkAssignEscalations,\n useBulkEscalateToRole,\n useBulkTriageEscalations,\n} from '../../api/escalations';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { BulkActionBar } from '../../components/common/modal/BulkActionBar';\nimport { BulkAssignModal } from '../../components/common/modal/BulkAssignModal';\nimport { BulkTriageModal } from '../../components/common/modal/BulkTriageModal';\nimport { useClaimDurations } from '../../hooks/useClaimDurations';\nimport { Lock } from 'lucide-react';\nimport { ESCALATION_COLUMNS, EscalationFilterBar } from './escalation-columns';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user, isSuperAdmin } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available' },\n });\n const claimDurations = useClaimDurations();\n const [claimTarget, setClaimTarget] = useState<LTEscalationRecord | null>(null);\n const [claimDuration, setClaimDuration] = useState('30');\n const [customClaimMinutes, setCustomClaimMinutes] = useState(0);\n const onCustomClaimChange = useCallback((m: number) => setCustomClaimMinutes(m), []);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [triageModalOpen, setTriageModalOpen] = useState(false);\n const [assignModalOpen, setAssignModalOpen] = useState(false);\n\n const claim = useClaimEscalation();\n const setPriority = useSetEscalationPriority();\n const bulkClaim = useBulkClaimEscalations();\n const bulkAssign = useBulkAssignEscalations();\n const bulkEscalate = useBulkEscalateToRole();\n const bulkTriage = useBulkTriageEscalations();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n // Clear selections on filter/page changes\n useEffect(() => {\n setSelectedIds(new Set());\n }, [filters.role, filters.type, filters.priority, filters.status, pagination.page, pagination.pageSize]);\n\n const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const apiStatus = statusFilter === 'claimed' ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n };\n\n const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const now = new Date();\n const rawEscalations = data?.escalations ?? [];\n const escalations = statusFilter === 'claimed'\n ? rawEscalations.filter((e) => e.assigned_to && e.assigned_until && new Date(e.assigned_until) > now)\n : rawEscalations;\n const total = statusFilter === 'claimed'\n ? escalations.length\n : data?.total ?? 0;\n const canBulkManage = isSuperAdmin || user?.roles.some((r) => r.type === 'admin');\n\n const selectedRoles = useMemo(() => {\n const roles = new Set<string>();\n for (const esc of escalations) {\n if (selectedIds.has(esc.id)) roles.add(esc.role);\n }\n return [...roles];\n }, [escalations, selectedIds]);\n\n const clearSelection = useCallback(() => setSelectedIds(new Set()), []);\n\n const handleClaim = () => {\n if (!claimTarget) return;\n const minutes = claimDuration === 'custom' ? customClaimMinutes : parseInt(claimDuration);\n if (!minutes || minutes <= 0) return;\n claim.mutate(\n { id: claimTarget.id, durationMinutes: minutes },\n {\n onSuccess: () => {\n setClaimTarget(null);\n navigate(`/escalations/detail/${claimTarget.id}`);\n },\n },\n );\n };\n\n const {\n handleSetPriority,\n handleBulkClaim,\n handleBulkEscalate,\n handleBulkTriage,\n handleBulkAssign,\n } = createBulkHandlers({\n selectedIds,\n clearSelection,\n setPriority,\n bulkClaim,\n bulkEscalate,\n bulkTriage,\n bulkAssign,\n closeTriageModal: () => setTriageModalOpen(false),\n closeAssignModal: () => setAssignModalOpen(false),\n });\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleAll = () => {\n if (selectedIds.size === escalations.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(escalations.map((e) => e.id)));\n }\n };\n\n const columns: Column<LTEscalationRecord>[] = [\n canBulkManage ? {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={escalations.length > 0 && selectedIds.size === escalations.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row: LTEscalationRecord) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(row.id)}\n onChange={(e) => {\n e.stopPropagation();\n toggleSelect(row.id);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n } : {\n key: 'spacer',\n label: '',\n render: () => null,\n className: 'w-10',\n },\n ...ESCALATION_COLUMNS,\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Lock}\n title=\"Claim escalation\"\n onClick={() => setClaimTarget(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"All Escalations\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {selectedIds.size > 0 && (\n <BulkActionBar\n selectedCount={selectedIds.size}\n onClearSelection={() => setSelectedIds(new Set())}\n onSetPriority={handleSetPriority}\n onClaim={handleBulkClaim}\n onAssign={() => setAssignModalOpen(true)}\n onEscalate={handleBulkEscalate}\n onTriage={() => setTriageModalOpen(true)}\n isPriorityPending={setPriority.isPending}\n isClaimPending={bulkClaim.isPending}\n isAssignPending={bulkAssign.isPending}\n isEscalatePending={bulkEscalate.isPending}\n isTriagePending={bulkTriage.isPending}\n availableRoles={rolesData?.roles ?? []}\n />\n )}\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={escalations}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/available' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No available escalations'}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\n\n <BulkTriageModal\n open={triageModalOpen}\n onClose={() => setTriageModalOpen(false)}\n selectedCount={selectedIds.size}\n onSubmit={handleBulkTriage}\n isPending={bulkTriage.isPending}\n />\n\n <BulkAssignModal\n open={assignModalOpen}\n onClose={() => setAssignModalOpen(false)}\n selectedCount={selectedIds.size}\n selectedRoles={selectedRoles}\n onSubmit={handleBulkAssign}\n isPending={bulkAssign.isPending}\n />\n </div>\n );\n}\n"],"names":["anyPending","props","BulkActionBar","disabled","claimDurations","useClaimDurations","jsxDEV","e","PRIORITY_OPTIONS","opt","role","BulkAssignModal","open","onClose","selectedCount","selectedRoles","onSubmit","isPending","isSuperAdmin","useAuth","step","setStep","useState","selectedUser","setSelectedUser","search","setSearch","duration","setDuration","customMinutes","setCustomMinutes","onCustomChange","useCallback","m","roleFilter","usersData","usersLoading","useUsers","filteredUsers","useMemo","users","q","u","_a","_b","handleClose","handleSelectUser","user","handleBack","handleSubmit","minutes","Modal","Fragment","CustomDurationPicker","BulkTriageModal","hint","setHint","bulkHandler","mutation","clearSelection","afterSuccess","variables","createBulkHandlers","deps","ids","priority","durationMinutes","targetRole","targetUserId","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","now","rawEscalations","escalations","total","canBulkManage","r","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AvailableEscalationsPage-DmUid1h0.js","sources":["../../src/components/common/modal/BulkActionBar.tsx","../../src/components/common/modal/BulkAssignModal.tsx","../../src/components/common/modal/BulkTriageModal.tsx","../../src/pages/operator/helpers.ts","../../src/pages/operator/ClaimModal.tsx","../../src/pages/operator/AvailableEscalationsPage.tsx"],"sourcesContent":["import { PRIORITY_OPTIONS } from '../../../lib/constants';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface BulkActionBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n onSetPriority: (priority: 1 | 2 | 3 | 4) => void;\n onClaim: (durationMinutes: number) => void;\n onAssign: () => void;\n onEscalate: (targetRole: string) => void;\n onTriage: () => void;\n isPriorityPending: boolean;\n isClaimPending: boolean;\n isAssignPending: boolean;\n isEscalatePending: boolean;\n isTriagePending: boolean;\n availableRoles: string[];\n}\n\nconst anyPending = (props: BulkActionBarProps) =>\n props.isPriorityPending || props.isClaimPending || props.isAssignPending || props.isEscalatePending || props.isTriagePending;\n\nexport function BulkActionBar(props: BulkActionBarProps) {\n const disabled = anyPending(props);\n const claimDurations = useClaimDurations();\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {props.selectedCount} selected\n </span>\n\n <div className=\"w-px h-5 bg-surface-border\" />\n\n {/* Priority */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onSetPriority(parseInt(e.target.value) as 1 | 2 | 3 | 4);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Priority...</option>\n {PRIORITY_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Claim */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onClaim(parseInt(e.target.value));\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Claim for...</option>\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Assign */}\n <button\n onClick={props.onAssign}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isAssignPending ? 'Assigning...' : 'Assign to...'}\n </button>\n\n {/* Escalate */}\n {props.availableRoles.length > 0 && (\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onEscalate(e.target.value);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Escalate to...</option>\n {props.availableRoles.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n )}\n\n {/* Triage */}\n <button\n onClick={props.onTriage}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isTriagePending ? 'Triaging...' : 'Triage'}\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Clear */}\n <button\n onClick={props.onClearSelection}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n\n {disabled && (\n <span className=\"text-xs text-text-tertiary animate-pulse\">Processing...</span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Modal } from './Modal';\nimport { CustomDurationPicker } from '../form/CustomDurationPicker';\nimport { useUsers } from '../../../api/users';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\nimport type { LTUserRecord } from '../../../api/types';\n\ninterface BulkAssignModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n /** Distinct roles of the selected escalations; scopes user list for admins */\n selectedRoles: string[];\n onSubmit: (targetUserId: string, durationMinutes: number) => void;\n isPending: boolean;\n}\n\nexport function BulkAssignModal({\n open,\n onClose,\n selectedCount,\n selectedRoles,\n onSubmit,\n isPending,\n}: BulkAssignModalProps) {\n const { isSuperAdmin } = useAuth();\n const claimDurations = useClaimDurations();\n const [step, setStep] = useState<'user' | 'duration'>('user');\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [search, setSearch] = useState('');\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n // Admins with a single role: scope to that role. Otherwise show all active users.\n const roleFilter =\n !isSuperAdmin && selectedRoles.length === 1 ? selectedRoles[0] : undefined;\n\n const { data: usersData, isLoading: usersLoading } = useUsers({\n role: roleFilter,\n status: 'active',\n limit: 200,\n });\n\n const filteredUsers = useMemo(() => {\n const users = usersData?.users ?? [];\n if (!search.trim()) return users;\n const q = search.toLowerCase();\n return users.filter(\n (u) =>\n u.display_name?.toLowerCase().includes(q) ||\n u.email?.toLowerCase().includes(q),\n );\n }, [usersData?.users, search]);\n\n const handleClose = () => {\n setStep('user');\n setSelectedUser(null);\n setSearch('');\n setDuration('30');\n setCustomMinutes(0);\n onClose();\n };\n\n const handleSelectUser = (user: LTUserRecord) => {\n setSelectedUser(user);\n setStep('duration');\n };\n\n const handleBack = () => {\n setStep('user');\n };\n\n const handleSubmit = () => {\n if (!selectedUser) return;\n const minutes = duration === 'custom' ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onSubmit(selectedUser.id, minutes);\n };\n\n return (\n <Modal open={open} onClose={handleClose} title=\"Assign Escalations\">\n <div className=\"space-y-4\">\n {step === 'user' && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Select a user to assign{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedCount}\n </span>{' '}\n escalation(s) to:\n </p>\n\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search by name or email...\"\n className=\"input text-xs w-full\"\n autoFocus\n />\n\n <div className=\"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border\">\n {usersLoading && (\n <p className=\"text-xs text-text-tertiary p-3\">\n Loading users...\n </p>\n )}\n {!usersLoading && filteredUsers.length === 0 && (\n <p className=\"text-xs text-text-tertiary p-3\">\n No users found\n </p>\n )}\n {filteredUsers.map((user) => (\n <button\n key={user.id}\n onClick={() => handleSelectUser(user)}\n className=\"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors\"\n >\n <p className=\"text-xs font-medium text-text-primary\">\n {user.display_name || user.external_id}\n </p>\n {user.email && (\n <p className=\"text-[10px] text-text-tertiary\">\n {user.email}\n </p>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-end pt-2\">\n <button onClick={handleClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n </div>\n </>\n )}\n\n {step === 'duration' && selectedUser && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Assign to{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedUser.display_name || selectedUser.external_id}\n </span>{' '}\n for:\n </p>\n\n <select\n value={duration}\n onChange={(e) => { setDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {duration === 'custom' && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={handleBack} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Assigning...' : 'Assign'}\n </button>\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Modal } from './Modal';\n\ninterface BulkTriageModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n onSubmit: (hint?: string) => void;\n isPending: boolean;\n}\n\nexport function BulkTriageModal({\n open,\n onClose,\n selectedCount,\n onSubmit,\n isPending,\n}: BulkTriageModalProps) {\n const [hint, setHint] = useState('');\n\n const handleSubmit = () => {\n onSubmit(hint || undefined);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Submit for AI Triage\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Submit <span className=\"font-medium text-text-primary\">{selectedCount}</span> escalation(s)\n for AI triage? The triage orchestrator will take over resolution.\n </p>\n\n <div>\n <label className=\"text-xs font-medium text-text-secondary block mb-1\">\n Triage hint <span className=\"text-text-tertiary\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={hint}\n onChange={(e) => setHint(e.target.value)}\n placeholder=\"e.g., image_orientation\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Guides the triage workflow on what remediation to apply\n </p>\n </div>\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Submitting...' : 'Submit for Triage'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\n\n/**\n * Create a bulk-action handler that calls a mutation and clears selection on success.\n */\nfunction bulkHandler<TData, TVariables>(\n mutation: UseMutationResult<TData, Error, TVariables>,\n clearSelection: () => void,\n afterSuccess?: () => void,\n) {\n return (variables: TVariables) => {\n mutation.mutate(variables, {\n onSuccess: () => {\n clearSelection();\n afterSuccess?.();\n },\n });\n };\n}\n\nexport function createBulkHandlers(deps: {\n selectedIds: Set<string>;\n clearSelection: () => void;\n setPriority: UseMutationResult<{ updated: number }, Error, { ids: string[]; priority: 1 | 2 | 3 | 4 }>;\n bulkClaim: UseMutationResult<{ claimed: number; skipped: number }, Error, { ids: string[]; durationMinutes: number }>;\n bulkEscalate: UseMutationResult<{ updated: number }, Error, { ids: string[]; targetRole: string }>;\n bulkTriage: UseMutationResult<{ triaged: number }, Error, { ids: string[]; hint?: string }>;\n bulkAssign: UseMutationResult<{ assigned: number; skipped: number }, Error, { ids: string[]; targetUserId: string; durationMinutes: number }>;\n closeTriageModal: () => void;\n closeAssignModal: () => void;\n}) {\n const ids = () => [...deps.selectedIds];\n\n const handleSetPriority = (priority: 1 | 2 | 3 | 4) => {\n bulkHandler(\n deps.setPriority,\n deps.clearSelection,\n )({ ids: ids(), priority });\n };\n\n const handleBulkClaim = (durationMinutes: number) => {\n bulkHandler(\n deps.bulkClaim,\n deps.clearSelection,\n )({ ids: ids(), durationMinutes });\n };\n\n const handleBulkEscalate = (targetRole: string) => {\n bulkHandler(\n deps.bulkEscalate,\n deps.clearSelection,\n )({ ids: ids(), targetRole });\n };\n\n const handleBulkTriage = (hint?: string) => {\n bulkHandler(\n deps.bulkTriage,\n deps.clearSelection,\n deps.closeTriageModal,\n )({ ids: ids(), hint });\n };\n\n const handleBulkAssign = (targetUserId: string, durationMinutes: number) => {\n bulkHandler(\n deps.bulkAssign,\n deps.clearSelection,\n deps.closeAssignModal,\n )({ ids: ids(), targetUserId, durationMinutes });\n };\n\n return { handleSetPriority, handleBulkClaim, handleBulkEscalate, handleBulkTriage, handleBulkAssign };\n}\n","import { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\n title=\"Claim Escalation\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Claim <span className=\"font-medium text-text-primary\">{claimTarget?.type}</span> for:\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { onDurationChange(e.target.value); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {claimDuration === 'custom' && (\n <CustomDurationPicker onChange={onCustomClaimChange} autoFocus />\n )}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\n useEscalationTypes,\n useClaimEscalation,\n useSetEscalationPriority,\n useBulkClaimEscalations,\n useBulkAssignEscalations,\n useBulkEscalateToRole,\n useBulkTriageEscalations,\n} from '../../api/escalations';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { BulkActionBar } from '../../components/common/modal/BulkActionBar';\nimport { BulkAssignModal } from '../../components/common/modal/BulkAssignModal';\nimport { BulkTriageModal } from '../../components/common/modal/BulkTriageModal';\nimport { useClaimDurations } from '../../hooks/useClaimDurations';\nimport { Lock } from 'lucide-react';\nimport { ESCALATION_COLUMNS, EscalationFilterBar } from './escalation-columns';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user, isSuperAdmin } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available' },\n });\n const claimDurations = useClaimDurations();\n const [claimTarget, setClaimTarget] = useState<LTEscalationRecord | null>(null);\n const [claimDuration, setClaimDuration] = useState('30');\n const [customClaimMinutes, setCustomClaimMinutes] = useState(0);\n const onCustomClaimChange = useCallback((m: number) => setCustomClaimMinutes(m), []);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [triageModalOpen, setTriageModalOpen] = useState(false);\n const [assignModalOpen, setAssignModalOpen] = useState(false);\n\n const claim = useClaimEscalation();\n const setPriority = useSetEscalationPriority();\n const bulkClaim = useBulkClaimEscalations();\n const bulkAssign = useBulkAssignEscalations();\n const bulkEscalate = useBulkEscalateToRole();\n const bulkTriage = useBulkTriageEscalations();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n // Clear selections on filter/page changes\n useEffect(() => {\n setSelectedIds(new Set());\n }, [filters.role, filters.type, filters.priority, filters.status, pagination.page, pagination.pageSize]);\n\n const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const apiStatus = statusFilter === 'claimed' ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n };\n\n const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const now = new Date();\n const rawEscalations = data?.escalations ?? [];\n const escalations = statusFilter === 'claimed'\n ? rawEscalations.filter((e) => e.assigned_to && e.assigned_until && new Date(e.assigned_until) > now)\n : rawEscalations;\n const total = statusFilter === 'claimed'\n ? escalations.length\n : data?.total ?? 0;\n const canBulkManage = isSuperAdmin || user?.roles.some((r) => r.type === 'admin');\n\n const selectedRoles = useMemo(() => {\n const roles = new Set<string>();\n for (const esc of escalations) {\n if (selectedIds.has(esc.id)) roles.add(esc.role);\n }\n return [...roles];\n }, [escalations, selectedIds]);\n\n const clearSelection = useCallback(() => setSelectedIds(new Set()), []);\n\n const handleClaim = () => {\n if (!claimTarget) return;\n const minutes = claimDuration === 'custom' ? customClaimMinutes : parseInt(claimDuration);\n if (!minutes || minutes <= 0) return;\n claim.mutate(\n { id: claimTarget.id, durationMinutes: minutes },\n {\n onSuccess: () => {\n setClaimTarget(null);\n navigate(`/escalations/detail/${claimTarget.id}`);\n },\n },\n );\n };\n\n const {\n handleSetPriority,\n handleBulkClaim,\n handleBulkEscalate,\n handleBulkTriage,\n handleBulkAssign,\n } = createBulkHandlers({\n selectedIds,\n clearSelection,\n setPriority,\n bulkClaim,\n bulkEscalate,\n bulkTriage,\n bulkAssign,\n closeTriageModal: () => setTriageModalOpen(false),\n closeAssignModal: () => setAssignModalOpen(false),\n });\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleAll = () => {\n if (selectedIds.size === escalations.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(escalations.map((e) => e.id)));\n }\n };\n\n const columns: Column<LTEscalationRecord>[] = [\n canBulkManage ? {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={escalations.length > 0 && selectedIds.size === escalations.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row: LTEscalationRecord) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(row.id)}\n onChange={(e) => {\n e.stopPropagation();\n toggleSelect(row.id);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n } : {\n key: 'spacer',\n label: '',\n render: () => null,\n className: 'w-10',\n },\n ...ESCALATION_COLUMNS,\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Lock}\n title=\"Claim escalation\"\n onClick={() => setClaimTarget(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"All Escalations\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {selectedIds.size > 0 && (\n <BulkActionBar\n selectedCount={selectedIds.size}\n onClearSelection={() => setSelectedIds(new Set())}\n onSetPriority={handleSetPriority}\n onClaim={handleBulkClaim}\n onAssign={() => setAssignModalOpen(true)}\n onEscalate={handleBulkEscalate}\n onTriage={() => setTriageModalOpen(true)}\n isPriorityPending={setPriority.isPending}\n isClaimPending={bulkClaim.isPending}\n isAssignPending={bulkAssign.isPending}\n isEscalatePending={bulkEscalate.isPending}\n isTriagePending={bulkTriage.isPending}\n availableRoles={rolesData?.roles ?? []}\n />\n )}\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={escalations}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/available' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No available escalations'}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\n\n <BulkTriageModal\n open={triageModalOpen}\n onClose={() => setTriageModalOpen(false)}\n selectedCount={selectedIds.size}\n onSubmit={handleBulkTriage}\n isPending={bulkTriage.isPending}\n />\n\n <BulkAssignModal\n open={assignModalOpen}\n onClose={() => setAssignModalOpen(false)}\n selectedCount={selectedIds.size}\n selectedRoles={selectedRoles}\n onSubmit={handleBulkAssign}\n isPending={bulkAssign.isPending}\n />\n </div>\n );\n}\n"],"names":["anyPending","props","BulkActionBar","disabled","claimDurations","useClaimDurations","jsxs","jsx","e","PRIORITY_OPTIONS","opt","role","BulkAssignModal","open","onClose","selectedCount","selectedRoles","onSubmit","isPending","isSuperAdmin","useAuth","step","setStep","useState","selectedUser","setSelectedUser","search","setSearch","duration","setDuration","customMinutes","setCustomMinutes","onCustomChange","useCallback","m","roleFilter","usersData","usersLoading","useUsers","filteredUsers","useMemo","users","q","u","_a","_b","handleClose","handleSelectUser","user","handleBack","handleSubmit","minutes","Modal","Fragment","CustomDurationPicker","BulkTriageModal","hint","setHint","bulkHandler","mutation","clearSelection","afterSuccess","variables","createBulkHandlers","deps","ids","priority","durationMinutes","targetRole","targetUserId","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","now","rawEscalations","escalations","total","canBulkManage","r","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as j}from"./bots-BispbsY3.js";import{a as d,X as N,a8 as u,j as y,N as p}from"./vendor-icons-DY1ctJgc.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(N,{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(y,{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-DCScT8BN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BotPicker-
|
|
1
|
+
{"version":3,"file":"BotPicker-DCScT8BN.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{u as N,a as p,j as e}from"./vendor-query-B2UbickB.js";import{b as y}from"./index-BhhWCADo.js";import{T as g}from"./ToolTestPanel-B1T4Hk0t.js";import{T as b}from"./ToolPill-Dmcwmqh2.js";import{S as w}from"./ServerName-DfS3pfon.js";import{P as k}from"./PageHeader-DlzOOM4Y.js";import{aG as v,B as C,g as S,aH as T,aI as I,D as q,ar as A,ac as P,v as $,aJ as L,P as O}from"./vendor-icons-DY1ctJgc.js";import"./vendor-react-CX88sFS5.js";import"./mcp-Cew_Sb-Q.js";import"./RunAsSelector-BGww9lta.js";import"./BotPicker-DCScT8BN.js";import"./bots-BispbsY3.js";function E(){return N({queryKey:["capabilities"],queryFn:()=>y("/capabilities")})}const u={Communication:{icon:$,color:"text-blue-400"},Analysis:{icon:P,color:"text-violet-400"},Media:{icon:A,color:"text-pink-400"},Data:{icon:q,color:"text-emerald-400"},Automation:{icon:I,color:"text-amber-400"},Development:{icon:T,color:"text-cyan-400"},System:{icon:S,color:"text-red-400"},Reference:{icon:C,color:"text-text-tertiary"},Other:{icon:v,color:"text-text-tertiary"}};function Y(){const{data:a,isLoading:c}=E(),[i,m]=p.useState(""),[r,x]=p.useState(null),[l,h]=p.useState(null),d=(a==null?void 0:a.categories)??[],j=(a==null?void 0:a.totalTools)??0,f=p.useMemo(()=>{let s=d;if(r&&(s=s.filter(n=>n.name===r)),!i.trim())return s;const o=i.toLowerCase();return s.map(n=>({...n,tools:n.tools.filter(t=>t.name.toLowerCase().includes(o)||t.description.toLowerCase().includes(o)||t.serverName.toLowerCase().includes(o))})).filter(n=>n.tools.length>0)},[d,i,r]);return e.jsxs("div",{children:[e.jsx(k,{title:"Capabilities"}),!c&&d.length>0&&e.jsxs("div",{className:"flex items-center gap-5 mb-10",children:[e.jsxs("button",{onClick:()=>x(null),className:`flex flex-col items-center gap-1 transition-colors ${r===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(v,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),d.map(s=>{const o=u[s.name]??u.Other,n=o.icon,t=r===s.name;return e.jsxs("button",{onClick:()=>x(t?null:s.name),className:`flex flex-col items-center gap-1 transition-colors ${t?o.color:"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(n,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:s.name})]},s.name)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx(L,{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:i,onChange:s=>m(s.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:"flex gap-0",children:[e.jsx("div",{className:`${l?"flex-1 min-w-0":"w-full"} transition-all`,children:c?e.jsx("div",{className:"animate-pulse space-y-6",children:[1,2,3].map(s=>e.jsxs("div",{children:[e.jsx("div",{className:"h-5 bg-surface-sunken rounded w-32 mb-4"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-full"}),e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-3/4"})]})]},s))}):f.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:i||r?"No capabilities match your filter.":"No capabilities registered yet."}):e.jsx("div",{className:"space-y-10",children:f.map(s=>{const o=u[s.name]??u.Other,n=o.icon;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border",children:[e.jsx(n,{className:`w-4.5 h-4.5 ${o.color}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:s.name}),e.jsx("span",{className:"text-xs text-text-quaternary",children:s.tools.length})]}),e.jsx("div",{className:"space-y-0.5",children:s.tools.map(t=>e.jsx(D,{tool:t,onTry:()=>h({serverId:t.serverId,serverName:t.serverName,tool:{name:t.name,description:t.description,inputSchema:t.inputSchema}})},`${t.serverId}-${t.name}`))})]},s.name)})})}),l&&e.jsx("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsx(g,{serverId:l.serverId,serverName:l.serverName,tool:l.tool,onClose:()=>h(null)})})]})]})}function D({tool:a,onTry:c}){var m;const i=Object.keys(((m=a.inputSchema)==null?void 0:m.properties)??{});return e.jsxs("button",{onClick:c,className:"group w-full py-2 px-2 rounded-md hover:bg-surface-hover transition-colors text-left flex gap-4 items-start",children:[e.jsx("div",{className:"w-56 shrink-0",children:e.jsx(b,{name:a.name,size:"md"})}),e.jsx("div",{className:"w-44 shrink-0 pt-0.5",children:i.length>0&&e.jsx("p",{className:"text-[9px] font-mono text-text-quaternary/70 leading-relaxed",children:i.map((r,x)=>x<i.length-1?e.jsxs("span",{children:[e.jsxs("span",{className:"whitespace-nowrap",children:[r," ·"]})," "]},r):e.jsx("span",{children:r},r))})}),e.jsx("p",{className:"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5",children:a.description}),e.jsxs("div",{className:"shrink-0 flex items-center gap-1.5 pt-0.5",children:[e.jsx(w,{name:a.serverName,serverId:a.serverId}),e.jsx(O,{className:"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity"})]})]})}export{Y as CapabilitiesPage};
|
|
2
|
+
//# sourceMappingURL=CapabilitiesPage-g5iUvHRL.js.map
|
package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-g5iUvHRL.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CapabilitiesPage-Ch5qY0I7.js","sources":["../../src/api/capabilities.ts","../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface CapabilityTool {\n name: string;\n description: string;\n inputSchema: Record<string, any>;\n serverName: string;\n serverId: string;\n}\n\nexport interface CapabilityCategory {\n name: string;\n tools: CapabilityTool[];\n}\n\nexport interface CapabilitiesResponse {\n categories: CapabilityCategory[];\n totalTools: number;\n}\n\nexport function useCapabilities() {\n return useQuery<CapabilitiesResponse>({\n queryKey: ['capabilities'],\n queryFn: () => apiFetch('/capabilities'),\n });\n}\n","import { useState, useMemo } from 'react';\nimport {\n Search, Play,\n MessageSquare, Eye, Database, Cog, Code2, Shield, BookOpen,\n LayoutGrid, Image,\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 icons + colors ─────────────────────────────────────────────────\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 [tryTool, setTryTool] = 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 // Filter by active category + search term\n const filtered = useMemo(() => {\n let cats = categories;\n if (activeCategory) {\n cats = cats.filter((c) => c.name === activeCategory);\n }\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 {/* Filter row: category icons + 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 <div className=\"flex gap-0\">\n {/* Main content */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {isLoading ? (\n <div className=\"animate-pulse space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-5 bg-surface-sunken rounded w-32 mb-4\" />\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-surface-sunken rounded w-full\" />\n <div className=\"h-4 bg-surface-sunken rounded w-3/4\" />\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-4 pb-2 border-b border-surface-border\">\n <Icon className={`w-4.5 h-4.5 ${meta.color}`} strokeWidth={1.5} />\n <h2 className=\"text-sm 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=\"space-y-0.5\">\n {category.tools.map((tool) => (\n <ToolRow\n key={`${tool.serverId}-${tool.name}`}\n tool={tool}\n\n onTry={() =>\n setTryTool({\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 {/* Try tool panel — sticky right sidebar */}\n {tryTool && (\n <div className=\"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto\">\n <ToolTestPanel\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n onClose={() => setTryTool(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ── Tool Row ────────────────────────────────────────────────────────────────\n\nfunction ToolRow({\n tool,\n onTry,\n}: {\n tool: CapabilityTool;\n onTry: () => void;\n}) {\n const params = Object.keys(tool.inputSchema?.properties ?? {});\n\n return (\n <button\n onClick={onTry}\n className=\"group w-full py-2 px-2 rounded-md hover:bg-surface-hover transition-colors text-left flex gap-4 items-start\"\n >\n {/* Col 1: tool name — wider */}\n <div className=\"w-56 shrink-0\">\n <ToolPill name={tool.name} size=\"md\" />\n </div>\n {/* Col 2: params — inline with middot delimiter */}\n <div className=\"w-44 shrink-0 pt-0.5\">\n {params.length > 0 && (\n <p className=\"text-[9px] font-mono text-text-quaternary/70 leading-relaxed\">\n {params.map((p, i) => i < params.length - 1\n ? <span key={p}><span className=\"whitespace-nowrap\">{p} ·</span> </span>\n : <span key={p}>{p}</span>\n )}\n </p>\n )}\n </div>\n {/* Col 3: description — takes remaining */}\n <p className=\"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5\">{tool.description}</p>\n {/* Col 4: server */}\n <div className=\"shrink-0 flex items-center gap-1.5 pt-0.5\">\n <ServerName name={tool.serverName} serverId={tool.serverId} />\n <Play className=\"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </button>\n );\n}\n"],"names":["useCapabilities","useQuery","apiFetch","CATEGORY_META","MessageSquare","Eye","Image","Database","Cog","Code2","Shield","BookOpen","LayoutGrid","CapabilitiesPage","data","isLoading","search","setSearch","useState","activeCategory","setActiveCategory","tryTool","setTryTool","categories","totalTools","filtered","useMemo","cats","c","q","cat","t","jsxDEV","PageHeader","meta","Icon","isActive","Search","e","i","category","tool","ToolRow","ToolTestPanel","onTry","params","_a","ToolPill","p","ServerName","Play"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CapabilitiesPage-g5iUvHRL.js","sources":["../../src/api/capabilities.ts","../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface CapabilityTool {\n name: string;\n description: string;\n inputSchema: Record<string, any>;\n serverName: string;\n serverId: string;\n}\n\nexport interface CapabilityCategory {\n name: string;\n tools: CapabilityTool[];\n}\n\nexport interface CapabilitiesResponse {\n categories: CapabilityCategory[];\n totalTools: number;\n}\n\nexport function useCapabilities() {\n return useQuery<CapabilitiesResponse>({\n queryKey: ['capabilities'],\n queryFn: () => apiFetch('/capabilities'),\n });\n}\n","import { useState, useMemo } from 'react';\nimport {\n Search, Play,\n MessageSquare, Eye, Database, Cog, Code2, Shield, BookOpen,\n LayoutGrid, Image,\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 icons + colors ─────────────────────────────────────────────────\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 [tryTool, setTryTool] = 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 // Filter by active category + search term\n const filtered = useMemo(() => {\n let cats = categories;\n if (activeCategory) {\n cats = cats.filter((c) => c.name === activeCategory);\n }\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 {/* Filter row: category icons + 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 <div className=\"flex gap-0\">\n {/* Main content */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {isLoading ? (\n <div className=\"animate-pulse space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-5 bg-surface-sunken rounded w-32 mb-4\" />\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-surface-sunken rounded w-full\" />\n <div className=\"h-4 bg-surface-sunken rounded w-3/4\" />\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-4 pb-2 border-b border-surface-border\">\n <Icon className={`w-4.5 h-4.5 ${meta.color}`} strokeWidth={1.5} />\n <h2 className=\"text-sm 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=\"space-y-0.5\">\n {category.tools.map((tool) => (\n <ToolRow\n key={`${tool.serverId}-${tool.name}`}\n tool={tool}\n\n onTry={() =>\n setTryTool({\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 {/* Try tool panel — sticky right sidebar */}\n {tryTool && (\n <div className=\"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto\">\n <ToolTestPanel\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n onClose={() => setTryTool(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ── Tool Row ────────────────────────────────────────────────────────────────\n\nfunction ToolRow({\n tool,\n onTry,\n}: {\n tool: CapabilityTool;\n onTry: () => void;\n}) {\n const params = Object.keys(tool.inputSchema?.properties ?? {});\n\n return (\n <button\n onClick={onTry}\n className=\"group w-full py-2 px-2 rounded-md hover:bg-surface-hover transition-colors text-left flex gap-4 items-start\"\n >\n {/* Col 1: tool name — wider */}\n <div className=\"w-56 shrink-0\">\n <ToolPill name={tool.name} size=\"md\" />\n </div>\n {/* Col 2: params — inline with middot delimiter */}\n <div className=\"w-44 shrink-0 pt-0.5\">\n {params.length > 0 && (\n <p className=\"text-[9px] font-mono text-text-quaternary/70 leading-relaxed\">\n {params.map((p, i) => i < params.length - 1\n ? <span key={p}><span className=\"whitespace-nowrap\">{p} ·</span> </span>\n : <span key={p}>{p}</span>\n )}\n </p>\n )}\n </div>\n {/* Col 3: description — takes remaining */}\n <p className=\"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5\">{tool.description}</p>\n {/* Col 4: server */}\n <div className=\"shrink-0 flex items-center gap-1.5 pt-0.5\">\n <ServerName name={tool.serverName} serverId={tool.serverId} />\n <Play className=\"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </button>\n );\n}\n"],"names":["useCapabilities","useQuery","apiFetch","CATEGORY_META","MessageSquare","Eye","Image","Database","Cog","Code2","Shield","BookOpen","LayoutGrid","CapabilitiesPage","data","isLoading","search","setSearch","useState","activeCategory","setActiveCategory","tryTool","setTryTool","categories","totalTools","filtered","useMemo","cats","c","q","cat","jsx","PageHeader","jsxs","meta","Icon","isActive","Search","e","i","category","tool","ToolRow","ToolTestPanel","onTry","params","_a","ToolPill","p","ServerName","Play"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-BhhWCADo.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-Dj1YOsVG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleSection-
|
|
1
|
+
{"version":3,"file":"CollapsibleSection-Dj1YOsVG.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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./vendor-query-B2UbickB.js";import{M as l}from"./Modal-DEODGeqx.js";function d({open:r,onClose:t,onConfirm:x,title:c,description:i,isPending:s,error:a}){return e.jsx(l,{open:r,onClose:t,title:c,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:i}),a&&e.jsx("p",{className:"text-xs text-status-error",children:a.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:t,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:x,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:s,children:s?"Deleting...":"Delete"})]})]})})}export{d as C};
|
|
2
|
+
//# sourceMappingURL=ConfirmDeleteModal-dOxidrSR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDeleteModal-
|
|
1
|
+
{"version":3,"file":"ConfirmDeleteModal-dOxidrSR.js","sources":["../../src/components/common/modal/ConfirmDeleteModal.tsx"],"sourcesContent":["import { Modal } from './Modal';\nimport type { ReactNode } from 'react';\n\ninterface ConfirmDeleteModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description: ReactNode;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmDeleteModal({\n open,\n onClose,\n onConfirm,\n title,\n description,\n isPending,\n error,\n}: ConfirmDeleteModalProps) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{description}</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n"],"names":["ConfirmDeleteModal","open","onClose","onConfirm","title","description","isPending","error","jsx","Modal","jsxs"],"mappings":"uFAaO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,OACEC,EAAAA,IAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAE,EACnC,SAAAM,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,EAAY,EACvDE,GAASC,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,QAAQ,EAClEE,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASN,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAM,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,UAAU,gGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as x,j as t}from"./vendor-query-B2UbickB.js";import{c as d}from"./vendor-react-CX88sFS5.js";function m({label:o,value:r,href:e,external:c}){const[n,s]=x.useState(!1),p=d();if(!r)return null;const i=a=>{a.stopPropagation(),navigator.clipboard.writeText(r),s(!0),setTimeout(()=>s(!1),1500)},l=a=>{a.stopPropagation(),e&&(c?window.open(e,"_blank","noopener,noreferrer"):p(e))};return t.jsxs("div",{className:"text-left group relative",children:[t.jsx("span",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:o}),t.jsxs("span",{className:"flex items-center gap-1 mt-0.5",children:[t.jsx("button",{onClick:i,title:`Copy ${o}`,className:"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors truncate max-w-[280px]",children:r}),t.jsx("button",{onClick:i,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:`w-3 h-3 transition-colors ${n?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:n?t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e&&t.jsx("button",{onClick:l,title:`View ${o}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:t.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})})})]})]})}export{m as C};
|
|
2
|
+
//# sourceMappingURL=CopyableId-DmLF-RqZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyableId-
|
|
1
|
+
{"version":3,"file":"CopyableId-DmLF-RqZ.js","sources":["../../src/components/common/display/CopyableId.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\ninterface CopyableIdProps {\n label: string;\n value: string | null | undefined;\n href?: string;\n external?: boolean;\n}\n\nexport function CopyableId({ label, value, href, external }: CopyableIdProps) {\n const [copied, setCopied] = useState(false);\n const navigate = useNavigate();\n if (!value) return null;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNavigate = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) return;\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n navigate(href);\n }\n };\n\n return (\n <div className=\"text-left group relative\">\n <span className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">{label}</span>\n <span className=\"flex items-center gap-1 mt-0.5\">\n <button\n onClick={handleCopy}\n title={`Copy ${label}`}\n className=\"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors truncate max-w-[280px]\"\n >\n {value}\n </button>\n <button onClick={handleCopy} title=\"Copy\" className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-text-primary'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n {href && (\n <button onClick={handleNavigate} title={`View ${label}`} className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n )}\n </span>\n </div>\n );\n}\n"],"names":["CopyableId","label","value","href","external","copied","setCopied","useState","navigate","useNavigate","handleCopy","e","handleNavigate","jsxs","jsx"],"mappings":"qGAUO,SAASA,EAAW,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,EAAM,SAAAC,GAA6B,CAC5E,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAWC,EAAA,EACjB,GAAI,CAACP,EAAO,OAAO,KAEnB,MAAMQ,EAAcC,GAAwB,CAC1CA,EAAE,gBAAA,EACF,UAAU,UAAU,UAAUT,CAAK,EACnCI,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,IAAI,CACzC,EAEMM,EAAkBD,GAAwB,CAC9CA,EAAE,gBAAA,EACGR,IACDC,EACF,OAAO,KAAKD,EAAM,SAAU,qBAAqB,EAEjDK,EAASL,CAAI,EAEjB,EAEA,OACEU,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,sEAAuE,SAAAb,EAAM,EAC7FY,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,QAASJ,EACT,MAAO,QAAQT,CAAK,GACpB,UAAU,2GAET,SAAAC,CAAA,CAAA,QAEF,SAAA,CAAO,QAASQ,EAAY,MAAM,OAAO,UAAU,sEAClD,SAAAI,EAAAA,IAAC,OAAI,UAAW,6BAA6BT,EAAS,sBAAwB,4CAA4C,GAAI,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC9L,WACGS,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,iBAAiB,EACtEA,MAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uIAAuI,EAElM,CAAA,CACF,EACCX,GACCW,EAAAA,IAAC,SAAA,CAAO,QAASF,EAAgB,MAAO,QAAQX,CAAK,GAAI,UAAU,sEACjE,SAAAa,EAAAA,IAAC,MAAA,CAAI,UAAU,+CAA+C,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC/H,SAAAA,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,CAAuI,EAC9L,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{z as y,A as N,O as p,B as f}from"./index-BhhWCADo.js";import{P as C}from"./PageHeader-DlzOOM4Y.js";import{T as k}from"./TimeAgo-CnjY3XDt.js";import{C as A}from"./ConfirmDeleteModal-dOxidrSR.js";import{Y as w,j as P,ag as O,o as T}from"./vendor-icons-DY1ctJgc.js";import"./vendor-react-CX88sFS5.js";import"./Modal-DEODGeqx.js";const o={anthropic:{name:"Anthropic",helpText:'Run "claude setup-token" for an OAuth token, or use an API key from console.anthropic.com.',placeholder:"sk-ant-oat01-... or sk-ant-api03-..."},openai:{name:"OpenAI",helpText:"Create an API key at platform.openai.com/api-keys.",placeholder:"sk-..."},google:{name:"Google",helpText:"Connect your Google account for Gmail, Calendar, and Drive access.",placeholder:"",oauth:!0}};function G(){var d,x;const{data:r,isLoading:m}=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)})},g=t=>`/api/auth/oauth/connect/${t}?token=${encodeURIComponent(f()||"")}&returnTo=/credentials`;return e.jsxs("div",{children:[e.jsx(C,{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(w,{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,v])=>e.jsx("option",{value:t,children:v.name},t))}),e.jsx(P,{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:g(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(k,{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(T,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(A,{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{G as CredentialsPage};
|
|
2
|
+
//# sourceMappingURL=CredentialsPage-Dvb4QelY.js.map
|
package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-Dvb4QelY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsPage-D1VAlwid.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';\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 `/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","getToken","jsxDEV","PageHeader","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-Dvb4QelY.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';\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 `/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","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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"}
|