@hotmeshio/long-tail 0.3.0 → 0.3.2
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/topics.d.ts +22 -0
- package/build/api/topics.js +104 -0
- package/build/index.d.ts +3 -1
- package/build/index.js +7 -2
- package/build/lib/db/schemas/001_schema.sql +3 -3
- package/build/lib/db/schemas/006_agent_sub_unique.sql +1 -0
- package/build/lib/db/schemas/007_topic_catalog.sql +27 -0
- package/build/routes/index.js +2 -0
- package/build/routes/topics.d.ts +2 -0
- package/build/routes/topics.js +90 -0
- package/build/services/topics/index.d.ts +77 -0
- package/build/services/topics/index.js +116 -0
- package/build/services/topics/sql.d.ts +10 -0
- package/build/services/topics/sql.js +80 -0
- package/build/services/topics/system-topics.d.ts +11 -0
- package/build/services/topics/system-topics.js +270 -0
- package/build/start/workers.js +5 -0
- package/build/system/mcp-servers/events.js +73 -1
- package/build/system/seed/tool-manifests-events.d.ts +75 -0
- package/build/system/seed/tool-manifests-events.js +27 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +2 -2
- package/build/types/startup.d.ts +27 -0
- package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Bb6zouF5.js.map → AdminDashboard-CbeSejVX.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +13 -0
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +4 -0
- package/dashboard/dist/assets/{AgentDetailPage-WwA573u9.js.map → AgentDetailPage-Dbx2t-Uk.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-BZkZ_hXN.js.map → AgentsPage-Bz61Nl-x.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-C-Df3ZsZ.js.map → AvailableEscalationsPage-DdrzePy4.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-kKBifD1w.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CwfVVWxh.js.map → BotPicker-kKBifD1w.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DJEQ_5dV.js.map → CapabilitiesPage-Ch5qY0I7.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-kYTBL7dT.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-DaFQGU6S.js.map → CollapsibleSection-kYTBL7dT.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-CcaAapMl.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-CcaAapMl.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-B4CL12pv.js +2 -0
- package/dashboard/dist/assets/{CopyableId-DmLF-RqZ.js.map → CopyableId-B4CL12pv.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-D1VAlwid.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-D-tkqdhu.js.map → CredentialsPage-D1VAlwid.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-DRmO5rH0.js +2 -0
- package/dashboard/dist/assets/{CronLabel-C6iCjsXd.js.map → CronLabel-DRmO5rH0.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker--wCtBkmT.js.map → CustomDurationPicker-C06QDDir.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-J5R6mepB.js +2 -0
- package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-J5R6mepB.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-DwNj3GiG.js +2 -0
- package/dashboard/dist/assets/{DropZone-2mGyDo1P.js.map → DropZone-DwNj3GiG.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-ChyMzl9n.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-DKoH0bqR.js.map → ElapsedCell-ChyMzl9n.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-BXGvOADa.js +2 -0
- package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-BXGvOADa.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-DM6zmE4g.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-C6A4Q9Ne.js.map → EscalationsOverview-DM6zmE4g.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CvJ98E8s.js +2 -0
- package/dashboard/dist/assets/{EventTable-DWxH0vMp.js.map → EventTable-CvJ98E8s.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-CB_rIGlL.js +2 -0
- package/dashboard/dist/assets/{EventTopicPill-BUxxvpNg.js.map → EventTopicPill-CB_rIGlL.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-Bdssa-Xn.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-Bdssa-Xn.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js +2 -0
- package/dashboard/dist/assets/{HomePage-Tlu1j8fK.js.map → HomePage-BuZkdXZt.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-jy8NL6ll.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DuON-br0.js.map → ListToolbar-jy8NL6ll.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-xkaKuHbX.js +2 -0
- package/dashboard/dist/assets/{McpOverview-byott48x.js.map → McpOverview-xkaKuHbX.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-D5ICn6cR.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-ieZPpcPn.js.map → McpQueryDetailPage-D5ICn6cR.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-C46fzfm5.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-BOO0ACYO.js.map → McpQueryPage-C46fzfm5.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-Di8s7-u9.js.map → McpRunDetailPage-Znsl4Yc-.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-DdUVqUFi.js.map → McpRunsPage-DT-armx5.js.map} +1 -1
- package/dashboard/dist/assets/Modal-C6k6_5KB.js +2 -0
- package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-C6k6_5KB.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-oGmDbNYv.js.map → OperatorDashboard-e5N3_dVl.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-COcgWWf-.js +2 -0
- package/dashboard/dist/assets/{PageHeader-DLjHNYHX.js.map → PageHeader-COcgWWf-.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-C0PCY3aJ.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-Oljg3n4j.js.map → PageHeaderWithStats-C0PCY3aJ.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-BQCsYMpM.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-BQCsYMpM.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-Da-miMYZ.js.map → ProcessDetailPage-C03LOgI0.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-iyPsmlhm.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-CW-2yFw_.js.map → ProcessesListPage-iyPsmlhm.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-CHwys1f9.js +2 -0
- package/dashboard/dist/assets/{RolePill-Bp10-WfX.js.map → RolePill-CHwys1f9.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-Bmc3XaUk.js +2 -0
- package/dashboard/dist/assets/{RolesPage-Bg_hEu9H.js.map → RolesPage-Bmc3XaUk.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-Bs4PF-Gd.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Bs4PF-Gd.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-DXzAr2WW.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-hYP59xHH.js.map → RunAsSelector-DXzAr2WW.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-BIdLC1Ay.js +2 -0
- package/dashboard/dist/assets/{ServerName-C9lUCFYb.js.map → ServerName-BIdLC1Ay.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-OKzRSSx4.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-OKzRSSx4.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-CQlF46RR.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-CQlF46RR.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CP7eycjI.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CP7eycjI.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-CGk8VAKt.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CGk8VAKt.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-MEUPc3yJ.js +2 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-2JHwAM2f.js.map → SwimlaneTimeline-MEUPc3yJ.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-BGxXKiWD.js +2 -0
- package/dashboard/dist/assets/{TagInput-Dkljw_WI.js.map → TagInput-BGxXKiWD.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-bw8ieKsf.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-DPwm25Cc.js.map → TaskQueuePill-bw8ieKsf.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-D1INzcrA.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-kCH4r-70.js.map → TasksListPage-D1INzcrA.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-CywLVIBA.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-RPbch7Te.js.map → TimeAgo-CywLVIBA.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-B4Pc6f3A.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-Dgpl-lKv.js.map → TimestampCell-B4Pc6f3A.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +2 -0
- package/dashboard/dist/assets/{ToolPill-D_DIWFJ5.js.map → ToolPill-DdLN3JOT.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-DusbUka5.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-D1TWdZQi.js.map → ToolTestPanel-DusbUka5.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +2 -0
- package/dashboard/dist/assets/TopicsPage-DbtrnQON.js.map +1 -0
- package/dashboard/dist/assets/UserName-CLbusknU.js +2 -0
- package/dashboard/dist/assets/{UserName-BXZGXJsU.js.map → UserName-CLbusknU.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-C61R-3Gg.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-DWlNYb2M.js.map → WorkflowExecutionPage-C61R-3Gg.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-7vt2F6wR.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-BbgVTGgI.js.map → WorkflowPill-7vt2F6wR.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-Dgq8RcD6.js.map → WorkflowsDashboard-BWiUNvyl.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-DA2ZOs7D.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DnInrUPO.js.map → WorkflowsOverview-DA2ZOs7D.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-z1Z9J-mc.js.map → YamlWorkflowsPage-CLebf2eL.js.map} +1 -1
- package/dashboard/dist/assets/{agents-C9RLPt1z.js → agents-Dga6NU7U.js} +2 -2
- package/dashboard/dist/assets/{agents-C9RLPt1z.js.map → agents-Dga6NU7U.js.map} +1 -1
- package/dashboard/dist/assets/{bots-zyUDnQhH.js → bots-CtU4i4OQ.js} +2 -2
- package/dashboard/dist/assets/{bots-zyUDnQhH.js.map → bots-CtU4i4OQ.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-v-5KV6pl.js → controlplane-BVoALhbL.js} +2 -2
- package/dashboard/dist/assets/{controlplane-v-5KV6pl.js.map → controlplane-BVoALhbL.js.map} +1 -1
- package/dashboard/dist/assets/escalation-_N5GfuIi.js +2 -0
- package/dashboard/dist/assets/{escalation-BseAikei.js.map → escalation-_N5GfuIi.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-Cs2CkkEs.js.map → escalation-columns-CoTmTpHp.js.map} +1 -1
- package/dashboard/dist/assets/helpers-Dz2U3Ctb.js +2 -0
- package/dashboard/dist/assets/{helpers-DVICI_VA.js.map → helpers-Dz2U3Ctb.js.map} +1 -1
- package/dashboard/dist/assets/index-6Kd78p_v.js +2 -0
- package/dashboard/dist/assets/{index-BzBZo8Sn.js.map → index-6Kd78p_v.js.map} +1 -1
- package/dashboard/dist/assets/index-B9ealjkt.js +6 -0
- package/dashboard/dist/assets/{index-CPpNn3z2.js.map → index-B9ealjkt.js.map} +1 -1
- package/dashboard/dist/assets/index-BIUHY2Jz.css +1 -0
- package/dashboard/dist/assets/index-BWHDW_CF.js +2 -0
- package/dashboard/dist/assets/{index-XCEX7Zof.js.map → index-BWHDW_CF.js.map} +1 -1
- package/dashboard/dist/assets/index-BYwPVJv0.js +15 -0
- package/dashboard/dist/assets/{index-M17tP_HX.js.map → index-BYwPVJv0.js.map} +1 -1
- package/dashboard/dist/assets/index-CCOSf1PY.js +281 -0
- package/dashboard/dist/assets/index-CCOSf1PY.js.map +1 -0
- package/dashboard/dist/assets/index-CS61sh5q.js +2 -0
- package/dashboard/dist/assets/{index-BP76o_S8.js.map → index-CS61sh5q.js.map} +1 -1
- package/dashboard/dist/assets/index-CtbG3UN-.js +5 -0
- package/dashboard/dist/assets/{index-DVFm5329.js.map → index-CtbG3UN-.js.map} +1 -1
- package/dashboard/dist/assets/index-DWUunWxh.js +2 -0
- package/dashboard/dist/assets/{index-DyqdoZPY.js.map → index-DWUunWxh.js.map} +1 -1
- package/dashboard/dist/assets/index-D_H_Prht.js +2 -0
- package/dashboard/dist/assets/{index-C0TSBQw8.js.map → index-D_H_Prht.js.map} +1 -1
- package/dashboard/dist/assets/index-Dpjguclc.js +2 -0
- package/dashboard/dist/assets/{index-DDFK1A8T.js.map → index-Dpjguclc.js.map} +1 -1
- package/dashboard/dist/assets/index-QicYdUsl.js +2 -0
- package/dashboard/dist/assets/{index-tK8lfgAj.js.map → index-QicYdUsl.js.map} +1 -1
- package/dashboard/dist/assets/index-dM-OgCY3.js +2 -0
- package/dashboard/dist/assets/{index-D2tDlpuv.js.map → index-dM-OgCY3.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-BhK8xuod.js → knowledge-DJlebU82.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BhK8xuod.js.map → knowledge-DJlebU82.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CWFliwjc.js → mcp-CsLJ5SRm.js} +2 -2
- package/dashboard/dist/assets/{mcp-CWFliwjc.js.map → mcp-CsLJ5SRm.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-Dm7_m5Fi.js → mcp-query-WNK1ItRV.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-Dm7_m5Fi.js.map → mcp-query-WNK1ItRV.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-aBDudwEi.js → mcp-runs-DtTTsuPH.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-aBDudwEi.js.map → mcp-runs-DtTTsuPH.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-iRejH3_A.js +2 -0
- package/dashboard/dist/assets/{namespaces-C45c4uoO.js.map → namespaces-iRejH3_A.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BMAzzeHR.js → roles-3Jm5KtKc.js} +2 -2
- package/dashboard/dist/assets/{roles-BMAzzeHR.js.map → roles-3Jm5KtKc.js.map} +1 -1
- package/dashboard/dist/assets/settings-DmN2I-c6.js +2 -0
- package/dashboard/dist/assets/{settings-D0v7RI3o.js.map → settings-DmN2I-c6.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DwEUQ6my.js → tasks-Cc-QoITQ.js} +2 -2
- package/dashboard/dist/assets/{tasks-DwEUQ6my.js.map → tasks-Cc-QoITQ.js.map} +1 -1
- package/dashboard/dist/assets/topics-p8anbgi0.js +2 -0
- package/dashboard/dist/assets/topics-p8anbgi0.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-BccPxFR6.js → useEventHooks-VaJ52jMm.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BccPxFR6.js.map → useEventHooks-VaJ52jMm.js.map} +1 -1
- package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
- package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BBioXSKA.js → useYamlActivityEvents-BU4Uhksl.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BBioXSKA.js.map → useYamlActivityEvents-BU4Uhksl.js.map} +1 -1
- package/dashboard/dist/assets/{users-CCHT00of.js → users-oXOlnold.js} +2 -2
- package/dashboard/dist/assets/{users-CCHT00of.js.map → users-oXOlnold.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-E6836lXZ.js → vendor-icons-CBOM6Es0.js} +100 -95
- package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DNZf6Pmq.js → workflows-Yq7cK-vR.js} +2 -2
- package/dashboard/dist/assets/{workflows-DNZf6Pmq.js.map → workflows-Yq7cK-vR.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BKZdGciI.js → yaml-workflows-Ch53yD43.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BKZdGciI.js.map → yaml-workflows-Ch53yD43.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/agents.md +6 -0
- package/docs/api/http/topics.md +164 -0
- package/docs/api/sdk/topics.md +204 -0
- package/docs/dashboard.md +22 -0
- package/docs/events.md +7 -0
- package/docs/sdk.md +15 -0
- package/docs/topics.md +154 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-Bb6zouF5.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-DqHEK73E.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-DqHEK73E.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-WwA573u9.js +0 -4
- package/dashboard/dist/assets/AgentsPage-BZkZ_hXN.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-C-Df3ZsZ.js +0 -2
- package/dashboard/dist/assets/BotPicker-CwfVVWxh.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-DJEQ_5dV.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-DaFQGU6S.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-D-tkqdhu.js +0 -2
- package/dashboard/dist/assets/CronLabel-C6iCjsXd.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker--wCtBkmT.js +0 -2
- package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
- package/dashboard/dist/assets/DropZone-2mGyDo1P.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-DKoH0bqR.js +0 -2
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-C6A4Q9Ne.js +0 -2
- package/dashboard/dist/assets/EventTable-DWxH0vMp.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +0 -2
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/HomePage-Tlu1j8fK.js +0 -2
- package/dashboard/dist/assets/ListToolbar-DuON-br0.js +0 -2
- package/dashboard/dist/assets/McpOverview-byott48x.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-ieZPpcPn.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-BOO0ACYO.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-Di8s7-u9.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DdUVqUFi.js +0 -2
- package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-oGmDbNYv.js +0 -2
- package/dashboard/dist/assets/PageHeader-DLjHNYHX.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-Oljg3n4j.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-Da-miMYZ.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CW-2yFw_.js +0 -2
- package/dashboard/dist/assets/RolePill-Bp10-WfX.js +0 -2
- package/dashboard/dist/assets/RolesPage-Bg_hEu9H.js +0 -2
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-hYP59xHH.js +0 -2
- package/dashboard/dist/assets/ServerName-C9lUCFYb.js +0 -2
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-2JHwAM2f.js +0 -2
- package/dashboard/dist/assets/TagInput-Dkljw_WI.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage--9FEVeTB.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage--9FEVeTB.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-DPwm25Cc.js +0 -2
- package/dashboard/dist/assets/TasksListPage-kCH4r-70.js +0 -2
- package/dashboard/dist/assets/TimeAgo-RPbch7Te.js +0 -2
- package/dashboard/dist/assets/TimestampCell-Dgpl-lKv.js +0 -2
- package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-D1TWdZQi.js +0 -2
- package/dashboard/dist/assets/UserName-BXZGXJsU.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DWlNYb2M.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-Dgq8RcD6.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-DnInrUPO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-z1Z9J-mc.js +0 -2
- package/dashboard/dist/assets/escalation-BseAikei.js +0 -2
- package/dashboard/dist/assets/escalation-columns-Cs2CkkEs.js +0 -2
- package/dashboard/dist/assets/helpers-DVICI_VA.js +0 -2
- package/dashboard/dist/assets/index-BMIU7Im5.js +0 -63
- package/dashboard/dist/assets/index-BMIU7Im5.js.map +0 -1
- package/dashboard/dist/assets/index-BP76o_S8.js +0 -2
- package/dashboard/dist/assets/index-BciXgS35.css +0 -1
- package/dashboard/dist/assets/index-BzBZo8Sn.js +0 -2
- package/dashboard/dist/assets/index-C0TSBQw8.js +0 -2
- package/dashboard/dist/assets/index-CPpNn3z2.js +0 -6
- package/dashboard/dist/assets/index-D2tDlpuv.js +0 -2
- package/dashboard/dist/assets/index-DDFK1A8T.js +0 -2
- package/dashboard/dist/assets/index-DVFm5329.js +0 -5
- package/dashboard/dist/assets/index-DyqdoZPY.js +0 -2
- package/dashboard/dist/assets/index-M17tP_HX.js +0 -15
- package/dashboard/dist/assets/index-XCEX7Zof.js +0 -2
- package/dashboard/dist/assets/index-tK8lfgAj.js +0 -2
- package/dashboard/dist/assets/namespaces-C45c4uoO.js +0 -2
- package/dashboard/dist/assets/settings-D0v7RI3o.js +0 -2
- package/dashboard/dist/assets/vendor-icons-E6836lXZ.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as g,j as e}from"./index-CCOSf1PY.js";import{u as v,a as d}from"./vendor-query-DLp59M9_.js";import{T as C}from"./ToolTestPanel-DusbUka5.js";import{T as P}from"./ToolPill-DdLN3JOT.js";import{S as E}from"./ServerName-BIdLC1Ay.js";import{P as D}from"./PageHeader-COcgWWf-.js";import{aD as x,B as j,aE as V,aF as y,aG as w,aw as k,an as S,a8 as T,t as q,aH as I,P as A}from"./vendor-icons-CBOM6Es0.js";import"./vendor-react-Co3Y8ikm.js";import"./mcp-CsLJ5SRm.js";import"./RunAsSelector-DXzAr2WW.js";import"./BotPicker-kKBifD1w.js";import"./bots-CtU4i4OQ.js";function $(){return v({queryKey:["capabilities"],queryFn:()=>g("/capabilities")})}const u={Communication:{icon:q,color:"text-blue-400"},Analysis:{icon:T,color:"text-violet-400"},Media:{icon:S,color:"text-pink-400"},Data:{icon:k,color:"text-emerald-400"},Automation:{icon:w,color:"text-amber-400"},Development:{icon:y,color:"text-cyan-400"},System:{icon:V,color:"text-red-400"},Reference:{icon:j,color:"text-text-tertiary"},Other:{icon:x,color:"text-text-tertiary"}};function Y(){const{data:s,isLoading:c}=$(),[r,m]=d.useState(""),[t,n]=d.useState(null),[o,N]=d.useState(null),b=(s==null?void 0:s.categories)??[],f=(s==null?void 0:s.totalTools)??0,h=d.useMemo(()=>{let a=b;if(t&&(a=a.filter(l=>l.name===t)),!r.trim())return a;const p=r.toLowerCase();return a.map(l=>({...l,tools:l.tools.filter(i=>i.name.toLowerCase().includes(p)||i.description.toLowerCase().includes(p)||i.serverName.toLowerCase().includes(p))})).filter(l=>l.tools.length>0)},[b,r,t]);return e.jsxDEV("div",{children:[e.jsxDEV(D,{title:"Capabilities"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:66,columnNumber:7},this),!c&&b.length>0&&e.jsxDEV("div",{className:"flex items-center gap-5 mb-10",children:[e.jsxDEV("button",{onClick:()=>n(null),className:`flex flex-col items-center gap-1 transition-colors ${t===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsxDEV(x,{className:"w-5 h-5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:77,columnNumber:13},this),e.jsxDEV("span",{className:"text-[9px] font-medium",children:"All"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:78,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:71,columnNumber:11},this),b.map(a=>{const p=u[a.name]??u.Other,l=p.icon,i=t===a.name;return e.jsxDEV("button",{onClick:()=>n(i?null:a.name),className:`flex flex-col items-center gap-1 transition-colors ${i?p.color:"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsxDEV(l,{className:"w-5 h-5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:92,columnNumber:17},this),e.jsxDEV("span",{className:"text-[9px] font-medium",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:93,columnNumber:17},this)]},a.name,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:85,columnNumber:15},this)}),e.jsxDEV("span",{className:"flex-1"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:97,columnNumber:11},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV(I,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:99,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:r,onChange:a=>m(a.target.value),placeholder:`Search ${f} 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"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:100,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:98,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:70,columnNumber:9},this),e.jsxDEV("div",{className:"flex gap-0",children:[e.jsxDEV("div",{className:`${o?"flex-1 min-w-0":"w-full"} transition-all`,children:c?e.jsxDEV("div",{className:"animate-pulse space-y-6",children:[1,2,3].map(a=>e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"h-5 bg-surface-sunken rounded w-32 mb-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:118,columnNumber:19},this),e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:120,columnNumber:21},this),e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-3/4"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:121,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:119,columnNumber:19},this)]},a,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:117,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:115,columnNumber:13},this):h.length===0?e.jsxDEV("p",{className:"text-sm text-text-tertiary mt-8",children:r||t?"No capabilities match your filter.":"No capabilities registered yet."},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:127,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-10",children:h.map(a=>{const p=u[a.name]??u.Other,l=p.icon;return e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border",children:[e.jsxDEV(l,{className:`w-4.5 h-4.5 ${p.color}`,strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:138,columnNumber:23},this),e.jsxDEV("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:139,columnNumber:23},this),e.jsxDEV("span",{className:"text-xs text-text-quaternary",children:a.tools.length},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:140,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:137,columnNumber:21},this),e.jsxDEV("div",{className:"space-y-0.5",children:a.tools.map(i=>e.jsxDEV(L,{tool:i,onTry:()=>N({serverId:i.serverId,serverName:i.serverName,tool:{name:i.name,description:i.description,inputSchema:i.inputSchema}})},`${i.serverId}-${i.name}`,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:144,columnNumber:25},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:142,columnNumber:21},this)]},a.name,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:136,columnNumber:19},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:131,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:113,columnNumber:9},this),o&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsxDEV(C,{serverId:o.serverId,serverName:o.serverName,tool:o.tool,onClose:()=>N(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:168,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:167,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:111,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:65,columnNumber:5},this)}function L({tool:s,onTry:c}){var m;const r=Object.keys(((m=s.inputSchema)==null?void 0:m.properties)??{});return e.jsxDEV("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.jsxDEV("div",{className:"w-56 shrink-0",children:e.jsxDEV(P,{name:s.name,size:"md"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:199,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:198,columnNumber:7},this),e.jsxDEV("div",{className:"w-44 shrink-0 pt-0.5",children:r.length>0&&e.jsxDEV("p",{className:"text-[9px] font-mono text-text-quaternary/70 leading-relaxed",children:r.map((t,n)=>n<r.length-1?e.jsxDEV("span",{children:[e.jsxDEV("span",{className:"whitespace-nowrap",children:[t," ·"]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:206,columnNumber:31},this)," "]},t,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:206,columnNumber:17},this):e.jsxDEV("span",{children:t},t,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:207,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:204,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:202,columnNumber:7},this),e.jsxDEV("p",{className:"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5",children:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:213,columnNumber:7},this),e.jsxDEV("div",{className:"shrink-0 flex items-center gap-1.5 pt-0.5",children:[e.jsxDEV(E,{name:s.serverName,serverId:s.serverId},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:216,columnNumber:9},this),e.jsxDEV(A,{className:"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity"},void 0,!1,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:217,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:215,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/capabilities/CapabilitiesPage.tsx",lineNumber:193,columnNumber:5},this)}export{Y as CapabilitiesPage};
|
|
2
|
+
//# sourceMappingURL=CapabilitiesPage-Ch5qY0I7.js.map
|
package/dashboard/dist/assets/{CapabilitiesPage-DJEQ_5dV.js.map → CapabilitiesPage-Ch5qY0I7.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CapabilitiesPage-DJEQ_5dV.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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"}
|
|
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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,C as i}from"./index-CCOSf1PY.js";function m({title:t,sectionKey:s,isCollapsed:o,onToggle:l,contentClassName:a,children:n}){return e.jsxDEV("div",{children:[e.jsxDEV("button",{onClick:()=>l(s),className:"flex items-center gap-3 w-full group/section",children:[e.jsxDEV("svg",{className:`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${o?"":"rotate-90"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:34,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:30,columnNumber:9},this),e.jsxDEV("span",{className:`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${o?"text-text-tertiary":"text-text-secondary"}`,children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:36,columnNumber:9},this),e.jsxDEV("span",{className:"flex-1 border-b border-surface-border"},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:39,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:26,columnNumber:7},this),e.jsxDEV(i,{open:!o,children:e.jsxDEV("div",{className:a??"mt-4 ml-7",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:42,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:41,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:25,columnNumber:5},this)}export{m as C};
|
|
2
|
+
//# sourceMappingURL=CollapsibleSection-kYTBL7dT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleSection-
|
|
1
|
+
{"version":3,"file":"CollapsibleSection-kYTBL7dT.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","jsxDEV","Collapsible"],"mappings":"+CAOO,SAASA,EAAmB,CACjC,MAAAC,EACA,WAAAC,EACA,YAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,SAAAC,CACF,EAQG,CACD,gBACG,MAAA,CACC,SAAA,CAAAC,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMH,EAASF,CAAU,EAClC,UAAU,+CAEV,SAAA,CAAAK,EAAAA,OAAC,MAAA,CACC,UAAW,6GAA8GJ,EAA4B,GAAd,WAAgB,GACvJ,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAEnE,kBAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAArD,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoE,CAAA,EAJtE,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAMAI,EAAAA,OAAC,QAAK,UAAW,kFAAkFJ,EAAc,qBAAuB,qBAAqB,GAC1J,SAAAF,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EACAM,EAAAA,OAAC,OAAA,CAAK,UAAU,uCAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAwD,CAAA,CAAA,EAb1D,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAeAA,EAAAA,OAACC,EAAA,CAAY,KAAM,CAACL,EAClB,kBAAC,MAAA,CAAI,UAAWE,GAAoB,YAAc,SAAAC,CAAA,EAAlD,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2D,CAAA,EAD7D,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAlBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAmBA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-CCOSf1PY.js";import{M as r}from"./Modal-C6k6_5KB.js";function c({open:a,onClose:o,onConfirm:t,title:l,description:n,isPending:m,error:s}){return e.jsxDEV(r,{open:a,onClose:o,title:l,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:26,columnNumber:9},this),s&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.message},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:27,columnNumber:19},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:o,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:29,columnNumber:11},this),e.jsxDEV("button",{onClick:t,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:m,children:m?"Deleting...":"Delete"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:28,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:25,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:24,columnNumber:5},this)}export{c as C};
|
|
2
|
+
//# sourceMappingURL=ConfirmDeleteModal-CcaAapMl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDeleteModal-
|
|
1
|
+
{"version":3,"file":"ConfirmDeleteModal-CcaAapMl.js","sources":["../../src/components/common/modal/ConfirmDeleteModal.tsx"],"sourcesContent":["import { Modal } from './Modal';\nimport type { ReactNode } from 'react';\n\ninterface ConfirmDeleteModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description: ReactNode;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmDeleteModal({\n open,\n onClose,\n onConfirm,\n title,\n description,\n isPending,\n error,\n}: ConfirmDeleteModalProps) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{description}</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n"],"names":["ConfirmDeleteModal","open","onClose","onConfirm","title","description","isPending","error","jsxDEV","Modal"],"mappings":"gFAaO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,OACEC,EAAAA,OAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAE,EACnC,SAAAI,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAwD,EACvDE,GAASC,EAAAA,OAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,SAAhD,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwD,EAClEA,EAAAA,OAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAASN,EAAS,UAAU,wBAAwB,SAAA,UAA5D,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAM,EAAAA,OAAC,SAAA,CACC,QAASL,EACT,UAAU,gGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,EAL/B,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAWA,CAAA,CAAA,EAdF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAeA,CAAA,EAhBF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-CCOSf1PY.js";import{a as c}from"./vendor-query-DLp59M9_.js";import{c as d}from"./vendor-react-Co3Y8ikm.js";function h({label:t,value:a,href:o,external:l}){const[n,i]=c.useState(!1),m=d();if(!a)return null;const r=s=>{s.stopPropagation(),navigator.clipboard.writeText(a),i(!0),setTimeout(()=>i(!1),1500)},p=s=>{s.stopPropagation(),o&&(l?window.open(o,"_blank","noopener,noreferrer"):m(o))};return e.jsxDEV("div",{className:"text-left group relative",children:[e.jsxDEV("span",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:35,columnNumber:7},this),e.jsxDEV("span",{className:"flex items-center gap-1 mt-0.5",children:[e.jsxDEV("button",{onClick:r,title:`Copy ${t}`,className:"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors truncate max-w-[280px]",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:37,columnNumber:9},this),e.jsxDEV("button",{onClick:r,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:e.jsxDEV("svg",{className:`w-3 h-3 transition-colors ${n?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:n?e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:47,columnNumber:17},this):e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:48,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:45,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:44,columnNumber:9},this),o&&e.jsxDEV("button",{onClick:p,title:`View ${t}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:e.jsxDEV("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:55,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:54,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:53,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:36,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:34,columnNumber:5},this)}export{h as C};
|
|
2
|
+
//# sourceMappingURL=CopyableId-B4CL12pv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyableId-
|
|
1
|
+
{"version":3,"file":"CopyableId-B4CL12pv.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","jsxDEV"],"mappings":"sIAUO,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,OAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAU,sEAAuE,SAAAZ,CAAA,EAAvF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA6F,EAC7FY,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,QAASH,EACT,MAAO,QAAQT,CAAK,GACpB,UAAU,2GAET,SAAAC,CAAA,EALH,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAOAW,SAAC,SAAA,CAAO,QAASH,EAAY,MAAM,OAAO,UAAU,sEAClD,SAAAG,EAAAA,OAAC,MAAA,CAAI,UAAW,6BAA6BR,EAAS,sBAAwB,4CAA4C,GAAI,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC9L,SAAAA,EACGQ,EAAAA,OAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAAA,EAArD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsE,WACrE,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,EAArD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA4L,CAAA,EAHlM,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAKA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAOA,EACCV,GACCU,EAAAA,OAAC,SAAA,CAAO,QAASD,EAAgB,MAAO,QAAQX,CAAK,GAAI,UAAU,sEACjE,SAAAY,EAAAA,OAAC,OAAI,UAAU,+CAA+C,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC/H,SAAAA,SAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,EAArD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA4L,CAAA,EAD9L,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAIA,CAAA,CAAA,EArBJ,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAuBA,CAAA,CAAA,EAzBF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA0BA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{A as v,B as C,j as e,O as p,E as P}from"./index-CCOSf1PY.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{P as D}from"./PageHeader-COcgWWf-.js";import{T as E}from"./TimeAgo-CywLVIBA.js";import{C as j}from"./ConfirmDeleteModal-CcaAapMl.js";import{O as V,h as y,ac as k,m as A}from"./vendor-icons-CBOM6Es0.js";import"./vendor-react-Co3Y8ikm.js";import"./Modal-C6k6_5KB.js";const d={anthropic:{name:"Anthropic",helpText:'Run "claude setup-token" for an OAuth token, or use an API key from console.anthropic.com.',placeholder:"sk-ant-oat01-... or sk-ant-api03-..."},openai:{name:"OpenAI",helpText:"Create an API key at platform.openai.com/api-keys.",placeholder:"sk-..."},google:{name:"Google",helpText:"Connect your Google account for Gmail, Calendar, and Drive access.",placeholder:"",oauth:!0}};function G(){var m,c;const{data:r,isLoading:u}=v(),i=C(),[a,l]=n.useState(null),[b,g]=n.useState(!1),[t,h]=n.useState("anthropic"),o=(r==null?void 0:r.connections)??[],N=()=>{a&&i.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},x=s=>`/api/auth/oauth/connect/${s}?token=${encodeURIComponent(P()||"")}&returnTo=/credentials`;return e.jsxDEV("div",{children:[e.jsxDEV(D,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxDEV("button",{onClick:()=>g(s=>!s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(V,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:64,columnNumber:13},this),"Add Credential"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:60,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:56,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6",children:"Manage credentials used by tools when invoked on your behalf. Each credential is encrypted at rest and resolved automatically during tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:70,columnNumber:7},this),b&&e.jsxDEV("div",{className:"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3",children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:79,columnNumber:13},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV("select",{value:t,onChange:s=>h(s.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(d).map(([s,f])=>e.jsxDEV("option",{value:s,children:f.name},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:87,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:81,columnNumber:15},this),e.jsxDEV(y,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:90,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:80,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:78,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:(m=d[t])==null?void 0:m.helpText},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:93,columnNumber:11},this),e.jsxDEV("a",{href:x(t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(p,{provider:t,className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:100,columnNumber:13},this),"Connect ",(c=d[t])==null?void 0:c.name]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:96,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:77,columnNumber:9},this),u?e.jsxDEV("div",{className:"animate-pulse space-y-3",children:[1,2].map(s=>e.jsxDEV("div",{className:"h-16 bg-surface-sunken rounded"},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:110,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:108,columnNumber:9},this):o.length===0?e.jsxDEV("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsxDEV(k,{className:"w-10 h-10 mx-auto mb-3 opacity-40"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:115,columnNumber:11},this),e.jsxDEV("p",{className:"text-sm",children:"No credentials registered."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:116,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:117,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:114,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-2",children:o.map(s=>e.jsxDEV("div",{className:"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md",children:[e.jsxDEV(p,{provider:s.provider,className:"w-6 h-6 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:126,columnNumber:15},this),e.jsxDEV("div",{className:"flex-1 min-w-0",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:"text-sm text-text-primary font-medium capitalize",children:s.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:130,columnNumber:19},this),s.label!=="default"&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:s.label},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:134,columnNumber:21},this),s.credential_type&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:s.credential_type},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:139,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:129,columnNumber:17},this),e.jsxDEV("div",{className:"flex items-center gap-3 mt-0.5",children:[s.email&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:s.email},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:146,columnNumber:21},this),s.expires_at&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsxDEV(E,{date:s.expires_at},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:150,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:149,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:144,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:128,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>l({provider:s.provider,label:s.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsxDEV(A,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:161,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:156,columnNumber:15},this)]},`${s.provider}-${s.label}`,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:122,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:120,columnNumber:9},this),e.jsxDEV(j,{open:!!a,onClose:()=>l(null),onConfirm:N,title:"Revoke Credential",description:e.jsxDEV(e.Fragment,{children:["Revoke the"," ",e.jsxDEV("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:176,columnNumber:13},this),(a==null?void 0:a.label)!=="default"&&e.jsxDEV(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:180,columnNumber:15},this)," ","credential? Tools will no longer be able to use this credential."]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:174,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:168,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:55,columnNumber:5},this)}export{G as CredentialsPage};
|
|
2
|
+
//# sourceMappingURL=CredentialsPage-D1VAlwid.js.map
|
package/dashboard/dist/assets/{CredentialsPage-D-tkqdhu.js.map → CredentialsPage-D1VAlwid.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsPage-D-tkqdhu.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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"}
|
|
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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as o,b as i,c as r}from"./vendor-query-DLp59M9_.js";import{b as n,j as a}from"./index-CCOSf1PY.js";import{a1 as c}from"./vendor-icons-CBOM6Es0.js";function b(e){return o({queryKey:["agent-subscriptions",e],queryFn:()=>n(`/agents/${e}/subscriptions`),enabled:!!e})}function y(){const e=i();return r({mutationFn:({agentId:t,...s})=>n(`/agents/${t}/subscriptions`,{method:"POST",body:JSON.stringify(s)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function d(){const e=i();return r({mutationFn:({agentId:t,subId:s,...u})=>n(`/agents/${t}/subscriptions/${s}`,{method:"PUT",body:JSON.stringify(u)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]})}})}function f(){const e=i();return r({mutationFn:({agentId:t,subId:s})=>n(`/agents/${t}/subscriptions/${s}`,{method:"DELETE"}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function g({cron:e}){return a.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[a.jsxDEV(c,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CronLabel.tsx",lineNumber:14,columnNumber:7},this),e]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CronLabel.tsx",lineNumber:13,columnNumber:5},this)}export{g as C,y as a,d as b,f as c,b as u};
|
|
2
|
+
//# sourceMappingURL=CronLabel-DRmO5rH0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CronLabel-
|
|
1
|
+
{"version":3,"file":"CronLabel-DRmO5rH0.js","sources":["../../src/api/agent-subscriptions.ts","../../src/components/common/display/CronLabel.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface AgentSubscription {\n id: string;\n agent_id: string;\n topic: string;\n filter?: Record<string, any>;\n reaction_type: 'durable' | 'pipeline' | 'mcp_query';\n workflow_type?: string;\n pipeline_id?: string;\n mcp_prompt?: string;\n input_mapping: Record<string, any>;\n execute_as?: string;\n enabled: boolean;\n created_at: string;\n updated_at: string;\n}\n\ninterface SubscriptionListResponse {\n subscriptions: AgentSubscription[];\n}\n\nexport function useAgentSubscriptions(agentId: string | null) {\n return useQuery<SubscriptionListResponse>({\n queryKey: ['agent-subscriptions', agentId],\n queryFn: () => apiFetch(`/agents/${agentId}/subscriptions`),\n enabled: !!agentId,\n });\n}\n\nexport function useCreateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n\nexport function useUpdateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string; subId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, subId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n },\n });\n}\n\nexport function useDeleteSubscription() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean }, Error, { agentId: string; subId: string }>({\n mutationFn: ({ agentId, subId }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, { method: 'DELETE' }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n","import { Clock } from 'lucide-react';\n\ninterface CronLabelProps {\n cron: string;\n}\n\n/**\n * Universal cron expression display — Clock icon + monotype text.\n * Used everywhere a cron schedule is rendered.\n */\nexport function CronLabel({ cron }: CronLabelProps) {\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Clock className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {cron}\n </span>\n );\n}\n"],"names":["useAgentSubscriptions","agentId","useQuery","apiFetch","useCreateSubscription","queryClient","useQueryClient","useMutation","body","_","vars","useUpdateSubscription","subId","useDeleteSubscription","CronLabel","cron","jsxDEV","Clock"],"mappings":"4JAuBO,SAASA,EAAsBC,EAAwB,CAC5D,OAAOC,EAAmC,CACxC,SAAU,CAAC,sBAAuBD,CAAO,EACzC,QAAS,IAAME,EAAS,WAAWF,CAAO,gBAAgB,EAC1D,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAwF,CAC7F,WAAY,CAAC,CAAE,QAAAN,EAAS,GAAGO,KACzBL,EAAS,WAAWF,CAAO,iBAAkB,CAC3C,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAuG,CAC5G,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,EAAO,GAAGJ,CAAA,IAChCL,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CACpD,OAAQ,MACR,KAAM,KAAK,UAAUJ,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,CACnF,CAAA,CACD,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMR,EAAcC,EAAA,EACpB,OAAOC,EAA6E,CAClF,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,KACtBT,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CAAE,OAAQ,SAAU,EAC5E,UAAW,CAACH,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CC5DO,SAASS,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEC,EAAAA,OAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAA,SAACC,EAAA,CAAM,UAAU,4CAA4C,YAAa,GAAA,EAA1E,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA+E,EAC9EF,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as i}from"./vendor-query-DLp59M9_.js";import{u as d}from"./settings-DmN2I-c6.js";import{D as f,f as x}from"./constants-BHkpVaqx.js";import{j as n}from"./index-CCOSf1PY.js";function C(){const{data:e}=d();return i.useMemo(()=>{var o;return(((o=e==null?void 0:e.escalation)==null?void 0:o.claimDurations)??f).map(a=>({value:String(a),label:x(a)}))},[e])}const b=[{value:1,label:"minutes"},{value:60,label:"hours"}];function E({onChange:e,compact:r,autoFocus:o,"data-testid":a="custom-duration-input"}){const[m,l]=i.useState(""),[s,c]=i.useState(1);i.useEffect(()=>{const t=parseInt(m);e(t>0?t*s:0)},[m,s,e]);const u=r?"text-xs":"text-sm",p=r?"w-16":"w-20";return n.jsxDEV("div",{className:"flex items-center gap-2","data-testid":a,children:[n.jsxDEV("input",{type:"number",min:1,max:s===60?24:1440,value:m,onChange:t=>l(t.target.value),placeholder:s===60?"hrs":"min",className:`input ${u} ${p} text-center`,autoFocus:o,"data-testid":`${a}-quantity`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:37,columnNumber:7},this),n.jsxDEV("select",{value:s,onChange:t=>c(parseInt(t.target.value)),className:`select ${u} py-1`,"data-testid":`${a}-unit`,children:b.map(t=>n.jsxDEV("option",{value:t.value,children:t.label},t.value,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:55,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:48,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:36,columnNumber:5},this)}export{E as C,C as u};
|
|
2
|
+
//# sourceMappingURL=CustomDurationPicker-C06QDDir.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomDurationPicker
|
|
1
|
+
{"version":3,"file":"CustomDurationPicker-C06QDDir.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxDEV","e","u"],"mappings":"qLAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,OAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAU,EAAAA,OAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKN,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWU,GAAMT,EAAYS,EAAE,OAAO,KAAK,EAC3C,YAAaP,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,EATxB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAWAU,EAAAA,OAAC,SAAA,CACC,MAAON,EACP,SAAWO,GAAMN,EAAc,SAASM,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUH,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKiB,GACVF,EAAAA,OAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,MAAf,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,CAChD,CAAA,EARH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EArBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-CCOSf1PY.js";import{E as N}from"./EmptyState-BXGvOADa.js";function x({active:s,direction:r}){return e.jsxDEV("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${s?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${s&&r==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:35,columnNumber:5},this)}function v({columns:s,data:r,keyFn:i,onRowClick:m,activeRowKey:c,rowClassName:d,isLoading:u,emptyMessage:b="No records found",sort:o,onSort:p,inline:h}){return u?e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,t)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:67,columnNumber:13},this)},t,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:64,columnNumber:7},this):r.length?e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:s.map(a=>{const t=a.sortable&&p,n=(o==null?void 0:o.sort_by)===a.key;return e.jsxDEV("th",{onClick:t?()=>p(a.key):void 0,className:`${h?"":"sticky top-[2.75rem] z-10 "}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${a.className??""} ${t?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxDEV("span",{className:"inline-flex items-center gap-1",children:[a.label,t&&e.jsxDEV(x,{active:n,direction:n?o.order:"desc"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:97,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:94,columnNumber:17},this)},a.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:87,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:81,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:80,columnNumber:7},this),e.jsxDEV("tbody",{children:r.map((a,t)=>{const n=c!=null&&i(a)===c;return e.jsxDEV("tr",{onClick:m?()=>m(a):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${m?"cursor-pointer row-hover":""} ${n?"bg-accent/5 border-l-2 border-l-accent":""} ${d?d(a):""}`,children:s.map(l=>e.jsxDEV("td",{className:`px-6 py-2.5 text-sm ${l.className??""}`,children:l.render(a,t)},l.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:117,columnNumber:15},this))},i(a),!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:109,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:105,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:79,columnNumber:5},this):b?e.jsxDEV(N,{title:b},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:75,columnNumber:27},this):null}export{v as D};
|
|
2
|
+
//# sourceMappingURL=DataTable-J5R6mepB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable-
|
|
1
|
+
{"version":3,"file":"DataTable-J5R6mepB.js","sources":["../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport type { SortState } from '../../../hooks/useFilterParams';\n\nexport interface Column<T> {\n key: string;\n label: string | ReactNode;\n render: (row: T, index: number) => ReactNode;\n className?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyFn: (row: T) => string;\n onRowClick?: (row: T) => void;\n /** Highlight the row whose keyFn matches this value. */\n activeRowKey?: string | null;\n /** Optional per-row class name for custom styling (e.g., engine vs worker tint). */\n rowClassName?: (row: T) => string;\n isLoading?: boolean;\n emptyMessage?: string;\n /** Current sort state — pass to show active sort indicator. */\n sort?: SortState;\n /** Called when a sortable column header is clicked. */\n onSort?: (column: string) => void;\n /** Disable the sticky header (useful when nested inside collapsible sections). */\n inline?: boolean;\n}\n\nfunction SortIcon({ active, direction }: { active: boolean; direction: 'asc' | 'desc' }) {\n return (\n <svg\n className={`w-3 h-3 shrink-0 transition-all duration-150 ${\n active ? 'text-accent opacity-100' : 'opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary'\n } ${active && direction === 'asc' ? 'rotate-180' : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function DataTable<T>({\n columns,\n data,\n keyFn,\n onRowClick,\n activeRowKey,\n rowClassName,\n isLoading,\n emptyMessage = 'No records found',\n sort,\n onSort,\n inline,\n}: DataTableProps<T>) {\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (!data.length) {\n return emptyMessage ? <EmptyState title={emptyMessage} /> : null;\n }\n\n return (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n {columns.map((col) => {\n const isSortable = col.sortable && onSort;\n const isActive = sort?.sort_by === col.key;\n\n return (\n <th\n key={col.key}\n onClick={isSortable ? () => onSort(col.key) : undefined}\n className={`${inline ? '' : 'sticky top-[2.75rem] z-10 '}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.className ?? ''} ${\n isSortable ? 'cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors' : ''\n }`}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSortable && (\n <SortIcon active={isActive} direction={isActive ? sort.order : 'desc'} />\n )}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <tr\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`group/row border-b last:border-b-0 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'bg-accent/5 border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={`px-6 py-2.5 text-sm ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"],"names":["SortIcon","active","direction","jsxDEV","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","col","isSortable","isActive","row","index","EmptyState"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as l}from"./index-CCOSf1PY.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{av as b}from"./vendor-icons-CBOM6Es0.js";function g(t,c){const p=c.split(",").map(e=>e.trim());for(const e of p)if(e.startsWith(".")&&t.name.toLowerCase().endsWith(e.toLowerCase())||e===t.type||e.endsWith("/*")&&t.type.startsWith(e.slice(0,-1)))return!0;return!1}function E({onDrop:t,children:c,label:p="Drop files here",accept:e,disabled:i}){const[u,m]=n.useState(!1),a=n.useRef(0),f=n.useCallback(r=>{r.preventDefault(),r.stopPropagation(),a.current++,i||m(!0)},[i]),d=n.useCallback(r=>{r.preventDefault(),r.stopPropagation(),a.current--,a.current<=0&&(a.current=0,m(!1))},[]),h=n.useCallback(r=>{r.preventDefault(),r.stopPropagation()},[]),x=n.useCallback(r=>{if(r.preventDefault(),r.stopPropagation(),a.current=0,m(!1),i)return;const s=Array.from(r.dataTransfer.files);if(console.debug("[DropZone] dropped files:",s.map(o=>({name:o.name,type:o.type,size:o.size}))),e){const o=s.filter(D=>g(D,e));console.debug("[DropZone] after accept filter:",o.length,"of",s.length),o.length?t(o):console.warn("[DropZone] no files matched accept pattern:",e)}else s.length&&t(s)},[t,e,i]);return l.jsxDEV("div",{className:"relative",onDragEnter:f,onDragLeave:d,onDragOver:h,onDrop:x,children:[c,u&&l.jsxDEV("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none",style:{background:"rgba(var(--color-surface-rgb, 255 255 255) / 0.85)"},children:l.jsxDEV("div",{className:"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40",children:[l.jsxDEV(b,{className:"w-8 h-8 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:82,columnNumber:13},this),l.jsxDEV("p",{className:"text-xs text-text-secondary",children:p},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:83,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:81,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:78,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:69,columnNumber:5},this)}export{E as D};
|
|
2
|
+
//# sourceMappingURL=DropZone-DwNj3GiG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropZone-
|
|
1
|
+
{"version":3,"file":"DropZone-DwNj3GiG.js","sources":["../../src/components/common/DropZone.tsx"],"sourcesContent":["import { useState, useCallback, useRef, type DragEvent, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\ninterface DropZoneProps {\n onDrop: (files: File[]) => void;\n children: ReactNode;\n label?: string;\n accept?: string;\n disabled?: boolean;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const patterns = accept.split(',').map(s => s.trim());\n for (const pattern of patterns) {\n if (pattern.startsWith('.') && file.name.toLowerCase().endsWith(pattern.toLowerCase())) return true;\n if (pattern === file.type) return true;\n if (pattern.endsWith('/*') && file.type.startsWith(pattern.slice(0, -1))) return true;\n }\n return false;\n}\n\nexport function DropZone({ onDrop, children, label = 'Drop files here', accept, disabled }: DropZoneProps) {\n const [dragOver, setDragOver] = useState(false);\n const dragCounter = useRef(0);\n\n const handleDragEnter = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current++;\n if (!disabled) setDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current--;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setDragOver(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n console.debug('[DropZone] dropped files:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n\n if (accept) {\n const filtered = files.filter(f => matchesAccept(f, accept));\n console.debug('[DropZone] after accept filter:', filtered.length, 'of', files.length);\n if (filtered.length) onDrop(filtered);\n else console.warn('[DropZone] no files matched accept pattern:', accept);\n } else {\n if (files.length) onDrop(files);\n }\n }, [onDrop, accept, disabled]);\n\n return (\n <div\n className=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n {dragOver && (\n <div className=\"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none\"\n style={{ background: 'rgba(var(--color-surface-rgb, 255 255 255) / 0.85)' }}\n >\n <div className=\"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40\">\n <UploadCloud className=\"w-8 h-8 text-text-tertiary\" />\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["matchesAccept","file","accept","patterns","s","pattern","DropZone","onDrop","children","label","disabled","dragOver","setDragOver","useState","dragCounter","useRef","handleDragEnter","useCallback","e","handleDragLeave","handleDragOver","handleDrop","files","f","filtered","jsxDEV","UploadCloud"],"mappings":"uIAWA,SAASA,EAAcC,EAAYC,EAAyB,CAC1D,MAAMC,EAAWD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,EACpD,UAAWC,KAAWF,EAGpB,GAFIE,EAAQ,WAAW,GAAG,GAAKJ,EAAK,KAAK,YAAA,EAAc,SAASI,EAAQ,YAAA,CAAa,GACjFA,IAAYJ,EAAK,MACjBI,EAAQ,SAAS,IAAI,GAAKJ,EAAK,KAAK,WAAWI,EAAQ,MAAM,EAAG,EAAE,CAAC,EAAG,MAAO,GAEnF,MAAO,EACT,CAEO,SAASC,EAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,MAAAC,EAAQ,kBAAmB,OAAAP,EAAQ,SAAAQ,GAA2B,CACzG,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAcC,EAAAA,OAAO,CAAC,EAEtBC,EAAkBC,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACPJ,GAAUE,EAAY,EAAI,CACjC,EAAG,CAACF,CAAQ,CAAC,EAEPS,EAAkBF,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACRA,EAAY,SAAW,IACzBA,EAAY,QAAU,EACtBF,EAAY,EAAK,EAErB,EAAG,CAAA,CAAE,EAECQ,EAAiBH,cAAaC,GAAiB,CACnDA,EAAE,eAAA,EACFA,EAAE,gBAAA,CACJ,EAAG,CAAA,CAAE,EAECG,EAAaJ,cAAaC,GAAiB,CAK/C,GAJAA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,QAAU,EACtBF,EAAY,EAAK,EACbF,EAAU,OAEd,MAAMY,EAAQ,MAAM,KAAKJ,EAAE,aAAa,KAAK,EAG7C,GAFA,QAAQ,MAAM,4BAA6BI,EAAM,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAMA,EAAE,IAAA,EAAO,CAAC,EAErGrB,EAAQ,CACV,MAAMsB,EAAWF,EAAM,UAAYtB,EAAcuB,EAAGrB,CAAM,CAAC,EAC3D,QAAQ,MAAM,kCAAmCsB,EAAS,OAAQ,KAAMF,EAAM,MAAM,EAChFE,EAAS,OAAQjB,EAAOiB,CAAQ,EAC/B,QAAQ,KAAK,8CAA+CtB,CAAM,CACzE,MACMoB,EAAM,QAAQf,EAAOe,CAAK,CAElC,EAAG,CAACf,EAAQL,EAAQQ,CAAQ,CAAC,EAE7B,OACEe,EAAAA,OAAC,MAAA,CACC,UAAU,WACV,YAAaT,EACb,YAAaG,EACb,WAAYC,EACZ,OAAQC,EAEP,SAAA,CAAAb,EACAG,GACCc,EAAAA,OAAC,MAAA,CAAI,UAAU,sGACb,MAAO,CAAE,WAAY,oDAAA,EAErB,SAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAA,EAAAA,OAACC,EAAA,CAAY,UAAU,4BAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EACpDD,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAhB,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAkD,CAAA,CAAA,EAFpD,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAOA,CAAA,EAhBJ,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAoBJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{z as x,j as l,x as d}from"./index-CCOSf1PY.js";import{a}from"./vendor-query-DLp59M9_.js";function E({startDate:n,endDate:o,isLive:t}){const[r,m]=a.useState(Date.now);a.useEffect(()=>{if(!t)return;const u=setInterval(()=>m(Date.now()),1e3);return()=>clearInterval(u)},[t]);const c=new Date(n).getTime(),i=o?new Date(o).getTime():r,e=Math.max(0,i-c),s=x(e),p=a.useMemo(()=>[{label:"ms",value:String(e)},{label:"sec",value:`${(e/1e3).toFixed(3)}s`},{label:"text",value:s}],[e,s]);return l.jsxDEV(d,{options:p,children:l.jsxDEV("span",{className:`text-xs ${t?"text-status-active":"text-text-tertiary"}`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:38,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:37,columnNumber:5},this)}export{E};
|
|
2
|
+
//# sourceMappingURL=ElapsedCell-ChyMzl9n.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElapsedCell-
|
|
1
|
+
{"version":3,"file":"ElapsedCell-ChyMzl9n.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsxDEV","DateTooltip"],"mappings":"gGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,OAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,SAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-CCOSf1PY.js";function o({title:m="No data",description:t,icon:s}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20",children:[s&&e.jsxDEV("div",{className:"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4",children:e.jsxDEV(s,{className:"w-5 h-5 text-accent/50"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:16,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:15,columnNumber:9},this),e.jsxDEV("p",{className:"text-sm text-text-secondary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:19,columnNumber:7},this),t&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:21,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:13,columnNumber:5},this)}export{o as E};
|
|
2
|
+
//# sourceMappingURL=EmptyState-BXGvOADa.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState-
|
|
1
|
+
{"version":3,"file":"EmptyState-BXGvOADa.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\n\nexport function EmptyState({\n title = 'No data',\n description,\n icon: Icon,\n}: {\n title?: string;\n description?: string;\n icon?: LucideIcon;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n {Icon && (\n <div className=\"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4\">\n <Icon className=\"w-5 h-5 text-accent/50\" />\n </div>\n )}\n <p className=\"text-sm text-text-secondary\">{title}</p>\n {description && (\n <p className=\"text-xs text-text-tertiary mt-1\">{description}</p>\n )}\n </div>\n );\n}\n"],"names":["EmptyState","title","description","Icon","jsxDEV"],"mappings":"wCAEO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,EACA,KAAMC,CACR,EAIG,CACD,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kDACZ,SAAA,CAAAD,YACE,MAAA,CAAI,UAAU,gFACb,SAAAC,SAACD,EAAA,CAAK,UAAU,wBAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAyC,CAAA,EAD3C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAEFC,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAkD,EACjDC,GACCE,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAF,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4D,CAAA,CAAA,EARhE,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{h as u,j as e}from"./index-CCOSf1PY.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{e as v}from"./useEventHooks-VaJ52jMm.js";import{P as N}from"./PageHeader-COcgWWf-.js";import{S as c}from"./StatCard-OKzRSSx4.js";import{c as h}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-CBOM6Es0.js";const x=[{label:"1h",value:"1h"},{label:"24h",value:"24h"},{label:"7d",value:"7d"},{label:"30d",value:"30d"}];function i({value:o,colorClass:l,onClick:n}){return o===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:31,columnNumber:12},this):e.jsxDEV("button",{onClick:n,className:`${l} hover:underline tabular-nums font-medium`,children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:34,columnNumber:5},this)}function w(){var m,d;v();const o=h(),[l,n]=b.useState("24h"),{data:s}=u(l),r=a=>{const p=new URLSearchParams(a).toString();o(`/escalations/available${p?`?${p}`:""}`)},t="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(N,{title:"Escalations",docsHash:"#docs:dashboard.md:escalations-overview"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:61,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-1 mb-6",children:x.map(a=>e.jsxDEV("button",{onClick:()=>n(a.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${l===a.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:64,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(c,{label:"Open",value:(s==null?void 0:s.pending)??"—",colorClass:"text-status-pending",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV(c,{label:"Claimed",value:(s==null?void 0:s.claimed)??"—",colorClass:"text-status-active",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:83,columnNumber:9},this),e.jsxDEV(c,{label:"Created",value:(s==null?void 0:s.created)??"—",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:84,columnNumber:9},this),e.jsxDEV(c,{label:"Resolved",value:(s==null?void 0:s.resolved)??"—",colorClass:"text-status-success",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:85,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:81,columnNumber:7},this),(((m=s==null?void 0:s.by_role)==null?void 0:m.length)??0)>0&&e.jsxDEV("div",{className:"mb-8",children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:94,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:95,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:96,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:93,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_role.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({role:a.role}),className:"hover:text-accent hover:underline",children:a.role},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:103,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:102,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:111,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:110,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:118,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:117,columnNumber:19},this)]},a.role,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:101,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:99,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:91,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:90,columnNumber:9},this),(((d=s==null?void 0:s.by_type)==null?void 0:d.length)??0)>0&&e.jsxDEV("div",{children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:137,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:138,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:139,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Resolved"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:140,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:136,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:135,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_type.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({type:a.type}),className:"hover:text-accent hover:underline",children:a.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:147,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:146,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:155,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:154,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:162,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:161,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.resolved,colorClass:"text-status-success",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:169,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:168,columnNumber:19},this)]},a.type,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:145,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:143,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:134,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:133,columnNumber:9},this),s&&s.by_role.length===0&&s.by_type.length===0&&e.jsxDEV("div",{className:"py-16 text-center",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No escalation activity in the last ",l]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:185,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:184,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:60,columnNumber:5},this)}export{w as EscalationsOverview};
|
|
2
|
+
//# sourceMappingURL=EscalationsOverview-DM6zmE4g.js.map
|