@hotmeshio/long-tail 0.4.3 → 0.4.5
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/agent-subscriptions.js +14 -0
- package/build/api/settings.js +4 -0
- package/build/lib/db/index.d.ts +1 -7
- package/build/lib/db/schemas/008_capability_reaction.sql +12 -0
- package/build/lib/db/schemas/009_file_topic_category.sql +10 -0
- package/build/lib/events/index.d.ts +9 -0
- package/build/lib/events/index.js +18 -0
- package/build/lib/events/nats.d.ts +15 -1
- package/build/lib/events/nats.js +46 -2
- package/build/lib/events/publish.d.ts +10 -0
- package/build/lib/events/publish.js +28 -0
- package/build/modules/config.d.ts +1 -7
- package/build/services/agent/index.js +14 -0
- package/build/services/agent/subscription-sql.d.ts +3 -3
- package/build/services/agent/subscription-sql.js +7 -5
- package/build/services/agent/subscriptions.d.ts +3 -1
- package/build/services/agent/subscriptions.js +6 -0
- package/build/services/agent/trigger-registry.d.ts +2 -0
- package/build/services/agent/trigger-registry.js +55 -8
- package/build/services/topics/system-topics.js +29 -0
- package/build/services/yaml-workflow/deployer.d.ts +1 -1
- package/build/services/yaml-workflow/deployer.js +2 -2
- package/build/services/yaml-workflow/invoke.d.ts +2 -0
- package/build/services/yaml-workflow/invoke.js +5 -1
- package/build/start/adapters.js +11 -9
- package/build/start/config.js +4 -0
- package/build/start/workers.js +15 -3
- package/build/system/index.js +16 -0
- package/build/system/mcp-servers/file-storage.js +18 -0
- package/build/system/workflows/capability-invoke/activities.d.ts +12 -0
- package/build/system/workflows/capability-invoke/activities.js +14 -0
- package/build/system/workflows/capability-invoke/index.d.ts +14 -0
- package/build/system/workflows/capability-invoke/index.js +74 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/events.d.ts +13 -1
- package/build/types/startup.d.ts +7 -0
- package/dashboard/dist/assets/AdminDashboard-ntLz5Pro.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Dr5wTIZT.js.map → AdminDashboard-ntLz5Pro.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js +2 -0
- package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-bdPqEzbx.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-UzjXcO3W.js.map → AvailableEscalationsPage-bdPqEzbx.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-CYfFMpkY.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CM-_u73k.js.map → BotPicker-CYfFMpkY.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js.map +1 -0
- package/dashboard/dist/assets/CollapsibleSection-DU5KAtQ-.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-CnPKa7df.js.map → CollapsibleSection-DU5KAtQ-.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-_hW5Vc05.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-_hW5Vc05.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DiWqv41D.js +2 -0
- package/dashboard/dist/assets/CopyableId-DiWqv41D.js.map +1 -0
- package/dashboard/dist/assets/CredentialsPage-CmbwypSF.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-CImIzra4.js.map → CredentialsPage-CmbwypSF.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-nycfAefc.js +2 -0
- package/dashboard/dist/assets/CronLabel-nycfAefc.js.map +1 -0
- package/dashboard/dist/assets/CustomDurationPicker-gNZRBaHg.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-5JzEgS7I.js.map → CustomDurationPicker-gNZRBaHg.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-DGerT2ZM.js +2 -0
- package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-DGerT2ZM.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-vNcqMd05.js +2 -0
- package/dashboard/dist/assets/{DropZone-BEW3jBzf.js.map → DropZone-vNcqMd05.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-CdvQbtve.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-B79BF5Mj.js.map → ElapsedCell-CdvQbtve.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-DMldv8c5.js +2 -0
- package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-DMldv8c5.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-BNENCL_2.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-QvWvbpx3.js.map → EscalationsOverview-BNENCL_2.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-BqDAyXyc.js +2 -0
- package/dashboard/dist/assets/{EventTable-DAclQwfr.js.map → EventTable-BqDAyXyc.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-CnHFBglc.js +2 -0
- package/dashboard/dist/assets/{EventTopicPill-By-6sXDp.js.map → EventTopicPill-CnHFBglc.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-TYiTtUgv.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-TYiTtUgv.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-fterfLKH.js +2 -0
- package/dashboard/dist/assets/{HomePage-DVOi7rR1.js.map → HomePage-fterfLKH.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-BO5Igi6v.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-Bntl2hex.js.map → ListToolbar-BO5Igi6v.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-BQokGg0z.js +2 -0
- package/dashboard/dist/assets/{McpOverview-B-xSYPJj.js.map → McpOverview-BQokGg0z.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-0WOp2n_j.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-Cq71BzjB.js.map → McpQueryDetailPage-0WOp2n_j.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-DUey_h9J.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-Dfz87aZF.js.map → McpQueryPage-DUey_h9J.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-B3R6KZ61.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-MUYvUYqz.js.map → McpRunsPage-B3R6KZ61.js.map} +1 -1
- package/dashboard/dist/assets/Modal-Qe8lW7gQ.js +2 -0
- package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-Qe8lW7gQ.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-dldvzjcg.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-Rih1SZrn.js.map → OperatorDashboard-dldvzjcg.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DF4BeEm4.js +2 -0
- package/dashboard/dist/assets/{PageHeader-Bo0SpcCK.js.map → PageHeader-DF4BeEm4.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-BQZw6BgA.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-7K5BdhOj.js.map → PageHeaderWithStats-BQZw6BgA.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-DMyB3WLZ.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-DMyB3WLZ.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-Beo-QVL-.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-BMkWCjqD.js.map → ProcessDetailPage-Beo-QVL-.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-C_ars8gp.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-vZjUSc7S.js.map → ProcessesListPage-C_ars8gp.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-DrBZ7JJj.js +2 -0
- package/dashboard/dist/assets/{RolePill-BDzPFQUv.js.map → RolePill-DrBZ7JJj.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-DgSXFFGL.js +2 -0
- package/dashboard/dist/assets/{RolesPage-kjeAsj3_.js.map → RolesPage-DgSXFFGL.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-QcakGbVA.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-QcakGbVA.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CYMeZwrM.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DC4SLtTq.js.map → RunAsSelector-CYMeZwrM.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-D5NKD06M.js +2 -0
- package/dashboard/dist/assets/{ServerName-CEOFF7UG.js.map → ServerName-D5NKD06M.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-PZQmmCHK.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-PZQmmCHK.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-ME2R6a7K.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-ME2R6a7K.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CDDVahOz.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CDDVahOz.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-Ddy93Q5I.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-Ddy93Q5I.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js.map +1 -0
- package/dashboard/dist/assets/TagInput-B45Dm3IW.js +2 -0
- package/dashboard/dist/assets/{TagInput-VBY0xIwb.js.map → TagInput-B45Dm3IW.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-BJRUjVDv.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-DZykFijh.js.map → TaskQueuePill-BJRUjVDv.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-Czu08px3.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-69ZWCaCP.js.map → TasksListPage-Czu08px3.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-CJ56IUy6.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CttiZG0k.js.map → TimeAgo-CJ56IUy6.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-QtcYZ9Jx.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-CYFbEhqc.js.map → TimestampCell-QtcYZ9Jx.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DpDv3FwI.js +2 -0
- package/dashboard/dist/assets/{ToolPill-RP2Tvlrx.js.map → ToolPill-DpDv3FwI.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js.map +1 -0
- package/dashboard/dist/assets/TopicDetailPage-DwShZbh9.js +9 -0
- package/dashboard/dist/assets/{TopicDetailPage-Aq4-6GLl.js.map → TopicDetailPage-DwShZbh9.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-DKXlpZl_.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-BYFKjRY_.js.map → TopicsPage-DKXlpZl_.js.map} +1 -1
- package/dashboard/dist/assets/UserName-zlR1so37.js +2 -0
- package/dashboard/dist/assets/{UserName-C4_T5-rI.js.map → UserName-zlR1so37.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BlAPZbQZ.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-_LMWc-OC.js.map → WorkflowsDashboard-BlAPZbQZ.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-NnPi6rwS.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DFrfw554.js.map → WorkflowsOverview-NnPi6rwS.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-C4mZum6x.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-CZzGwfol.js.map → YamlWorkflowsPage-C4mZum6x.js.map} +1 -1
- package/dashboard/dist/assets/{agents-CsKILVSU.js → agents-B5wvILeV.js} +2 -2
- package/dashboard/dist/assets/{agents-CsKILVSU.js.map → agents-B5wvILeV.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BzEs6Q9L.js → bots-BPlouRDm.js} +2 -2
- package/dashboard/dist/assets/{bots-BzEs6Q9L.js.map → bots-BPlouRDm.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-DkvRG09b.js +2 -0
- package/dashboard/dist/assets/capabilities-DkvRG09b.js.map +1 -0
- package/dashboard/dist/assets/{controlplane-COYEIIAz.js → controlplane-0m_rA-UW.js} +2 -2
- package/dashboard/dist/assets/{controlplane-COYEIIAz.js.map → controlplane-0m_rA-UW.js.map} +1 -1
- package/dashboard/dist/assets/escalation-CfIAIUg2.js +2 -0
- package/dashboard/dist/assets/{escalation-BZjS2202.js.map → escalation-CfIAIUg2.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CLIdxlbe.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-DtRVmPSB.js.map → escalation-columns-CLIdxlbe.js.map} +1 -1
- package/dashboard/dist/assets/helpers-prGqC38M.js +2 -0
- package/dashboard/dist/assets/{helpers-BngVEys5.js.map → helpers-prGqC38M.js.map} +1 -1
- package/dashboard/dist/assets/index-4T7Z_gQ4.js +281 -0
- package/dashboard/dist/assets/index-4T7Z_gQ4.js.map +1 -0
- package/dashboard/dist/assets/index-BPxglOYm.css +1 -0
- package/dashboard/dist/assets/index-BR3SwTNI.js +2 -0
- package/dashboard/dist/assets/{index-COgyD_H2.js.map → index-BR3SwTNI.js.map} +1 -1
- package/dashboard/dist/assets/index-BWKIigEk.js +2 -0
- package/dashboard/dist/assets/{index-Byp8BDPs.js.map → index-BWKIigEk.js.map} +1 -1
- package/dashboard/dist/assets/index-BgVuyWhi.js +15 -0
- package/dashboard/dist/assets/{index-DykjJxzr.js.map → index-BgVuyWhi.js.map} +1 -1
- package/dashboard/dist/assets/index-C0sDEKdo.js +2 -0
- package/dashboard/dist/assets/{index-DxMNiFPS.js.map → index-C0sDEKdo.js.map} +1 -1
- package/dashboard/dist/assets/index-C2MJzu6J.js +2 -0
- package/dashboard/dist/assets/{index-ByxH4qQ-.js.map → index-C2MJzu6J.js.map} +1 -1
- package/dashboard/dist/assets/index-CFoddJDr.js +6 -0
- package/dashboard/dist/assets/{index-BCsShN2l.js.map → index-CFoddJDr.js.map} +1 -1
- package/dashboard/dist/assets/index-CrMxD5Ib.js +6 -0
- package/dashboard/dist/assets/index-CrMxD5Ib.js.map +1 -0
- package/dashboard/dist/assets/index-CuY5hPYB.js +2 -0
- package/dashboard/dist/assets/{index-Bq5MSkCL.js.map → index-CuY5hPYB.js.map} +1 -1
- package/dashboard/dist/assets/index-CwkJBn87.js +2 -0
- package/dashboard/dist/assets/{index-R61-yG56.js.map → index-CwkJBn87.js.map} +1 -1
- package/dashboard/dist/assets/index-DeL84Cag.js +2 -0
- package/dashboard/dist/assets/{index-xgl431mG.js.map → index-DeL84Cag.js.map} +1 -1
- package/dashboard/dist/assets/index-DqeLbz6j.js +2 -0
- package/dashboard/dist/assets/{index-ABsZZf_U.js.map → index-DqeLbz6j.js.map} +1 -1
- package/dashboard/dist/assets/index-P9huxx3-.js +2 -0
- package/dashboard/dist/assets/{index-BwivT39P.js.map → index-P9huxx3-.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DhCbDgy4.js → knowledge-CUZxyRCO.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DhCbDgy4.js.map → knowledge-CUZxyRCO.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-xh7T0I-f.js → mcp-B5VQPoF3.js} +2 -2
- package/dashboard/dist/assets/{mcp-xh7T0I-f.js.map → mcp-B5VQPoF3.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-il3CfU3U.js → mcp-query-Ba5Zj3yg.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-il3CfU3U.js.map → mcp-query-Ba5Zj3yg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js → mcp-runs-CAiEr5Fc.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js.map → mcp-runs-CAiEr5Fc.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-sVr5scma.js +2 -0
- package/dashboard/dist/assets/{namespaces-BBTvHnRF.js.map → namespaces-sVr5scma.js.map} +1 -1
- package/dashboard/dist/assets/{roles-D7bx5FAM.js → roles-E_bA4e0f.js} +2 -2
- package/dashboard/dist/assets/{roles-D7bx5FAM.js.map → roles-E_bA4e0f.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BgxRbhVM.js → tasks-CL6Gv8jB.js} +2 -2
- package/dashboard/dist/assets/{tasks-BgxRbhVM.js.map → tasks-CL6Gv8jB.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CTtCboHe.js → topics-DbtPHERP.js} +2 -2
- package/dashboard/dist/assets/{topics-CTtCboHe.js.map → topics-DbtPHERP.js.map} +1 -1
- package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
- package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-C6c618cj.js +2 -0
- package/dashboard/dist/assets/useEventHooks-C6c618cj.js.map +1 -0
- 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-CSMX9He5.js → useYamlActivityEvents-eK7kIUdh.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js.map → useYamlActivityEvents-eK7kIUdh.js.map} +1 -1
- package/dashboard/dist/assets/{users-CyF-5WLI.js → users-CCHSIAxt.js} +2 -2
- package/dashboard/dist/assets/{users-CyF-5WLI.js.map → users-CCHSIAxt.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js → vendor-icons-D8-ZINAH.js} +3 -3
- package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js.map → vendor-icons-D8-ZINAH.js.map} +1 -1
- 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-Bf4_w24H.js → workflows-BNbocg_9.js} +2 -2
- package/dashboard/dist/assets/{workflows-Bf4_w24H.js.map → workflows-BNbocg_9.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js → yaml-workflows-Cu1FUwrc.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js.map → yaml-workflows-Cu1FUwrc.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/agents.md +9 -9
- package/docs/api/http/agents.md +12 -10
- package/docs/api/http/settings.md +4 -0
- package/docs/api/sdk/agents.md +4 -2
- package/docs/api/sdk/settings.md +2 -1
- package/docs/dashboard.md +1 -1
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-Dr5wTIZT.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-CvuF8--H.js +0 -2
- package/dashboard/dist/assets/AgentsPage-CvuF8--H.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-UzjXcO3W.js +0 -2
- package/dashboard/dist/assets/BotPicker-CM-_u73k.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js.map +0 -1
- package/dashboard/dist/assets/CollapsibleSection-CnPKa7df.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/CopyableId-DmLF-RqZ.js.map +0 -1
- package/dashboard/dist/assets/CredentialsPage-CImIzra4.js +0 -2
- package/dashboard/dist/assets/CronLabel-5HPAmciI.js +0 -2
- package/dashboard/dist/assets/CronLabel-5HPAmciI.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-5JzEgS7I.js +0 -2
- package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
- package/dashboard/dist/assets/DropZone-BEW3jBzf.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-B79BF5Mj.js +0 -2
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-QvWvbpx3.js +0 -2
- package/dashboard/dist/assets/EventTable-DAclQwfr.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-By-6sXDp.js +0 -2
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/HomePage-DVOi7rR1.js +0 -2
- package/dashboard/dist/assets/ListToolbar-Bntl2hex.js +0 -2
- package/dashboard/dist/assets/McpOverview-B-xSYPJj.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-Cq71BzjB.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-Dfz87aZF.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-MUYvUYqz.js +0 -2
- package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Rih1SZrn.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bo0SpcCK.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-7K5BdhOj.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-BMkWCjqD.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-vZjUSc7S.js +0 -2
- package/dashboard/dist/assets/RolePill-BDzPFQUv.js +0 -2
- package/dashboard/dist/assets/RolesPage-kjeAsj3_.js +0 -2
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DC4SLtTq.js +0 -2
- package/dashboard/dist/assets/ServerName-CEOFF7UG.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-MUUXgT3o.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js.map +0 -1
- package/dashboard/dist/assets/TagInput-VBY0xIwb.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-DZykFijh.js +0 -2
- package/dashboard/dist/assets/TasksListPage-69ZWCaCP.js +0 -2
- package/dashboard/dist/assets/TimeAgo-CttiZG0k.js +0 -2
- package/dashboard/dist/assets/TimestampCell-CYFbEhqc.js +0 -2
- package/dashboard/dist/assets/ToolPill-RP2Tvlrx.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-Aq4-6GLl.js +0 -9
- package/dashboard/dist/assets/TopicsPage-BYFKjRY_.js +0 -2
- package/dashboard/dist/assets/UserName-C4_T5-rI.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-_LMWc-OC.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-DFrfw554.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CZzGwfol.js +0 -2
- package/dashboard/dist/assets/escalation-BZjS2202.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DtRVmPSB.js +0 -2
- package/dashboard/dist/assets/helpers-BngVEys5.js +0 -2
- package/dashboard/dist/assets/index-ABsZZf_U.js +0 -2
- package/dashboard/dist/assets/index-BCsShN2l.js +0 -6
- package/dashboard/dist/assets/index-Bq5MSkCL.js +0 -2
- package/dashboard/dist/assets/index-BwivT39P.js +0 -2
- package/dashboard/dist/assets/index-Byp8BDPs.js +0 -2
- package/dashboard/dist/assets/index-ByxH4qQ-.js +0 -2
- package/dashboard/dist/assets/index-COgyD_H2.js +0 -2
- package/dashboard/dist/assets/index-DXEYynKO.css +0 -1
- package/dashboard/dist/assets/index-DcpCR9c_.js +0 -63
- package/dashboard/dist/assets/index-DcpCR9c_.js.map +0 -1
- package/dashboard/dist/assets/index-DuPY59Yu.js +0 -5
- package/dashboard/dist/assets/index-DuPY59Yu.js.map +0 -1
- package/dashboard/dist/assets/index-DxMNiFPS.js +0 -2
- package/dashboard/dist/assets/index-DykjJxzr.js +0 -15
- package/dashboard/dist/assets/index-R61-yG56.js +0 -2
- package/dashboard/dist/assets/index-xgl431mG.js +0 -2
- package/dashboard/dist/assets/namespaces-BBTvHnRF.js +0 -2
- package/dashboard/dist/assets/settings-nt6qyR1S.js +0 -2
- package/dashboard/dist/assets/settings-nt6qyR1S.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js +0 -2
- package/dashboard/dist/assets/useEventHooks-CkJOmbF-.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DxMNiFPS.js","sources":["../../src/pages/knowledge/KnowledgeEntryView.tsx","../../src/pages/knowledge/CreateEntryModal.tsx","../../src/pages/knowledge/KnowledgePage.tsx"],"sourcesContent":["import { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { Trash2 } from 'lucide-react';\nimport { useGetKnowledge, useDeleteKnowledge, useStoreKnowledge, useSetKnowledgeField, useRemoveKnowledgeField } from '../../api/knowledge';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { TagInput } from '../../components/common/form/TagInput';\n\ninterface KnowledgeEntryViewProps {\n domain: string;\n entryKey: string;\n onDeleted: () => void;\n}\n\ntype EditingCell = { field: string; column: 'field' | 'value' } | null;\n\nfunction formatValue(val: unknown): string {\n if (val === null || val === undefined) return '';\n if (typeof val === 'string') return val;\n return JSON.stringify(val, null, 2);\n}\n\nfunction parseValue(raw: string): { value: unknown; looksLikeJson: boolean; parsedOk: boolean } {\n const trimmed = raw.trim();\n if (!trimmed) return { value: '', looksLikeJson: false, parsedOk: false };\n const looksLikeJson = trimmed.startsWith('{') || trimmed.startsWith('[');\n try {\n return { value: JSON.parse(trimmed), looksLikeJson, parsedOk: true };\n } catch {\n return { value: trimmed, looksLikeJson, parsedOk: false };\n }\n}\n\nfunction isSimple(val: unknown): boolean {\n if (typeof val === 'string') {\n const t = val.trim();\n // Strings that look like JSON render as structured\n if ((t.startsWith('{') && t.endsWith('}')) || (t.startsWith('[') && t.endsWith(']'))) return false;\n return true;\n }\n return typeof val === 'number' || typeof val === 'boolean' || val === null;\n}\n\nfunction AutoTextarea({ value, onChange, onKeyDown, placeholder, mono }: {\n value: string;\n onChange: (v: string) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n placeholder?: string;\n mono?: boolean;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n ref.current.style.height = 'auto';\n ref.current.style.height = `${ref.current.scrollHeight}px`;\n ref.current.focus();\n }\n }, [value]);\n\n return (\n <textarea\n ref={ref}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n rows={1}\n className={`w-full bg-transparent text-xs text-text-primary resize-none outline-none p-0 ${mono ? 'font-mono' : ''}`}\n style={{ minHeight: '1.5em' }}\n />\n );\n}\n\nexport function KnowledgeEntryView({ domain, entryKey, onDeleted }: KnowledgeEntryViewProps) {\n const { data: entry, isLoading, refetch } = useGetKnowledge(domain, entryKey);\n const deleteMutation = useDeleteKnowledge();\n const storeMutation = useStoreKnowledge();\n const setFieldMutation = useSetKnowledgeField();\n const removeFieldMutation = useRemoveKnowledgeField();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editing, setEditing] = useState<EditingCell>(null);\n const [draft, setDraft] = useState('');\n const [ghostField, setGhostField] = useState('');\n const [ghostValue, setGhostValue] = useState('');\n const [pendingRemove, setPendingRemove] = useState<string | null>(null);\n const [jsonHint, setJsonHint] = useState<string | null>(null);\n const [editingTags, setEditingTags] = useState(false);\n\n const data = entry?.data as Record<string, unknown> | undefined;\n const allFields = data ? Object.entries(data) : [];\n\n // Ghost field input doubles as a filter — if text is entered but not yet saved,\n // narrow the visible rows to matching field names\n const fields = useMemo(() => {\n const q = ghostField.trim().toLowerCase();\n if (!q) return allFields;\n return allFields.filter(([field]) => field.toLowerCase().includes(q));\n }, [allFields, ghostField]);\n\n const originalValue = useCallback((field: string, column: 'field' | 'value'): string => {\n if (column === 'field') return field;\n return formatValue(data?.[field]);\n }, [data]);\n\n const isDirty = editing\n ? draft !== originalValue(editing.field, editing.column)\n : false;\n\n function startEdit(field: string, column: 'field' | 'value') {\n setEditing({ field, column });\n setDraft(originalValue(field, column));\n setPendingRemove(null);\n }\n\n function cancelEdit() {\n setEditing(null);\n setDraft('');\n }\n\n function showJsonHint() {\n setJsonHint('Invalid JSON — saved as text');\n setTimeout(() => setJsonHint(null), 4000);\n }\n\n async function commitEdit() {\n if (!editing || !data) return;\n const { field, column } = editing;\n\n if (column === 'value') {\n const { value: parsed, looksLikeJson, parsedOk } = parseValue(draft);\n if (looksLikeJson && !parsedOk) showJsonHint();\n // Use setField for surgical update — preserves siblings\n await setFieldMutation.mutateAsync({ domain, key: entryKey, path: field, value: parsed });\n } else {\n // Rename: remove old field, set new field\n const newName = draft.trim();\n if (!newName || newName === field) { cancelEdit(); return; }\n const val = data[field];\n await removeFieldMutation.mutateAsync({ domain, key: entryKey, path: field });\n await setFieldMutation.mutateAsync({ domain, key: entryKey, path: newName, value: val });\n }\n\n setEditing(null);\n setDraft('');\n refetch();\n }\n\n async function removeField(field: string) {\n await removeFieldMutation.mutateAsync({ domain, key: entryKey, path: field });\n setPendingRemove(null);\n setEditing(null);\n refetch();\n }\n\n async function saveTags(tags: string[]) {\n await storeMutation.mutateAsync({\n domain,\n key: entryKey,\n data: data || {},\n tags,\n replace: true,\n });\n refetch();\n }\n\n async function commitGhostRow() {\n const name = ghostField.trim();\n if (!name) return;\n const { value, looksLikeJson, parsedOk } = parseValue(ghostValue);\n if (looksLikeJson && !parsedOk) showJsonHint();\n const updated = { ...data, [name]: value || '' };\n await storeMutation.mutateAsync({ domain, key: entryKey, data: updated });\n setGhostField('');\n setGhostValue('');\n refetch();\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n cancelEdit();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n commitEdit();\n }\n }\n\n function handleGhostKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n setGhostField('');\n setGhostValue('');\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n commitGhostRow();\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-3 mt-4\">\n <div className=\"h-4 bg-surface-sunken rounded w-1/3\" />\n <div className=\"h-48 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!entry || entry.found === false) {\n return <p className=\"text-sm text-text-tertiary mt-4\">Entry not found.</p>;\n }\n\n return (\n <div>\n {/* Metadata + actions bar */}\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-4 min-h-[28px]\">\n {editingTags ? (\n <div className=\"flex items-center gap-2\">\n <TagInput\n tags={entry.tags || []}\n onChange={(tags) => { saveTags(tags); }}\n placeholder=\"Add tag...\"\n compact\n />\n <button\n onClick={() => setEditingTags(false)}\n className=\"text-[10px] text-text-tertiary hover:text-text-secondary shrink-0\"\n >\n Done\n </button>\n </div>\n ) : (\n <div\n className=\"flex items-center gap-1 cursor-text group\"\n onClick={() => setEditingTags(true)}\n title=\"Click to edit tags\"\n >\n {entry.tags && entry.tags.length > 0 ? (\n entry.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-medium bg-accent/10 text-accent\">\n {tag}\n </span>\n ))\n ) : (\n <span className=\"text-[10px] text-text-tertiary/40 italic group-hover:text-text-tertiary\">add tags...</span>\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-[10px] text-text-tertiary\"><TimeAgo date={entry.updated_at} /></span>\n {confirmDelete ? (\n <span className=\"flex items-center gap-2 text-[10px]\">\n <span className=\"text-status-error\">Delete entry?</span>\n <button\n onClick={async () => {\n try {\n await deleteMutation.mutateAsync({ domain, key: entryKey });\n onDeleted();\n } catch { /* */ }\n }}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n disabled={deleteMutation.isPending}\n >\n {deleteMutation.isPending ? 'Deleting...' : 'Yes'}\n </button>\n <button\n onClick={() => setConfirmDelete(false)}\n className=\"text-text-tertiary hover:text-text-secondary\"\n >\n No\n </button>\n </span>\n ) : (\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"text-text-tertiary/50 hover:text-status-error transition-colors\"\n title=\"Delete entry\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {jsonHint && (\n <div className=\"flex items-center justify-end gap-2 mb-2 px-1\">\n <span className=\"inline-block w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n <span className=\"text-xs text-status-warning\">{jsonHint}</span>\n </div>\n )}\n\n {/* Field/value grid */}\n <table className=\"w-full border-collapse\">\n <thead className=\"sticky top-0 z-10 bg-surface\">\n <tr className=\"text-left text-[10px] uppercase tracking-wider text-text-tertiary border-b border-surface-border\">\n <th className=\"px-3 py-2 font-medium w-[200px] border-r border-surface-border\">Field</th>\n <th className=\"px-3 py-2 font-medium\">Value</th>\n </tr>\n {/* Input row — add new field or filter existing */}\n <tr className=\"border-b border-surface-border bg-surface\">\n <td className=\"px-3 py-2 align-top border-r border-surface-border\">\n <input\n value={ghostField}\n onChange={(e) => setGhostField(e.target.value)}\n onKeyDown={handleGhostKeyDown}\n placeholder={allFields.length ? 'add or filter...' : 'new field'}\n className=\"w-full bg-transparent text-xs text-text-primary placeholder:text-text-tertiary/40 placeholder:italic outline-none p-0\"\n />\n </td>\n <td className=\"px-3 py-2 align-top\">\n <AutoTextarea\n value={ghostValue}\n onChange={setGhostValue}\n onKeyDown={handleGhostKeyDown}\n placeholder=\"value\"\n />\n {ghostField.trim() && (\n <div className=\"flex gap-2 mt-1.5\">\n <button\n onClick={commitGhostRow}\n className=\"text-[10px] font-medium text-accent hover:text-accent-hover\"\n disabled={storeMutation.isPending}\n >\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n <button\n onClick={() => { setGhostField(''); setGhostValue(''); }}\n className=\"text-[10px] text-text-tertiary hover:text-text-secondary\"\n >\n Cancel\n </button>\n </div>\n )}\n </td>\n </tr>\n </thead>\n <tbody>\n {fields.map(([field, value]) => {\n const isEditingField = editing?.field === field && editing.column === 'field';\n const isEditingValue = editing?.field === field && editing.column === 'value';\n const isActive = isEditingField || isEditingValue;\n const isRemoving = pendingRemove === field;\n\n return (\n <tr key={field} className={`border-b border-surface-border ${isRemoving ? 'bg-status-error/10' : isActive ? '' : 'hover:bg-surface-hover/30'}`}>\n {/* Field name cell */}\n <td\n className={`px-3 py-2 align-top border-r cursor-text ${isRemoving ? 'bg-transparent border-r-transparent' : isEditingField ? 'border-r-surface-border bg-accent/5 border-l-2 border-l-accent' : 'border-r-surface-border'}`}\n onClick={() => !isEditingField && !isRemoving && startEdit(field, 'field')}\n >\n {isEditingField ? (\n <div>\n <AutoTextarea value={draft} onChange={setDraft} onKeyDown={handleKeyDown} placeholder=\"field name\" />\n {isDirty && (\n <div className=\"flex gap-2 mt-1.5\">\n <button onClick={commitEdit} className=\"text-[10px] font-medium text-accent hover:text-accent-hover\" disabled={storeMutation.isPending}>\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n <button onClick={cancelEdit} className=\"text-[10px] text-text-tertiary hover:text-text-secondary\">Cancel</button>\n </div>\n )}\n </div>\n ) : (\n <span className=\"text-xs font-medium text-text-secondary break-all\">{field}</span>\n )}\n </td>\n\n {/* Value cell */}\n <td\n className={`px-3 py-2 align-top cursor-text ${isRemoving ? 'bg-transparent' : isEditingValue ? 'bg-accent/5 border-l-2 border-l-accent' : ''}`}\n onClick={() => !isEditingValue && !isRemoving && startEdit(field, 'value')}\n >\n {isRemoving ? (\n <span className=\"flex items-center justify-end gap-2 text-[10px]\">\n <span className=\"text-status-error\">Remove <span className=\"font-medium\">{field}</span>?</span>\n <button\n onClick={(e) => { e.stopPropagation(); removeField(field); }}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n disabled={storeMutation.isPending}\n >\n {storeMutation.isPending ? '...' : 'Yes'}\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); setPendingRemove(null); }}\n className=\"text-text-tertiary hover:text-text-secondary\"\n >\n No\n </button>\n </span>\n ) : isEditingValue ? (\n <div>\n <AutoTextarea\n value={draft}\n onChange={setDraft}\n onKeyDown={handleKeyDown}\n placeholder=\"value (string or JSON)\"\n mono={!isSimple(value)}\n />\n <div className=\"flex gap-2 mt-1.5\">\n {isDirty && (\n <button onClick={commitEdit} className=\"text-[10px] font-medium text-accent hover:text-accent-hover\" disabled={storeMutation.isPending}>\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n )}\n <button onClick={cancelEdit} className=\"text-[10px] text-text-tertiary hover:text-text-secondary\">Cancel</button>\n <button\n onClick={(e) => { e.stopPropagation(); setPendingRemove(field); }}\n className=\"text-[10px] text-status-error/50 hover:text-status-error ml-auto\"\n >\n Remove\n </button>\n </div>\n </div>\n ) : (\n isSimple(value) ? (\n <p className=\"text-xs text-text-primary break-words whitespace-pre-wrap\">{String(value)}</p>\n ) : (\n <pre className=\"text-xs text-text-primary font-mono whitespace-pre-wrap break-words\">\n {typeof value === 'string' ? value : JSON.stringify(value, null, 2)}\n </pre>\n )\n )}\n </td>\n </tr>\n );\n })}\n\n </tbody>\n </table>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStoreKnowledge, useListDomains } from '../../api/knowledge';\n\ninterface CreateEntryModalProps {\n open: boolean;\n onClose: () => void;\n onCreated?: (domain: string, key: string) => void;\n /** Pre-fill data from a dropped JSON file */\n prefillData?: Record<string, unknown>;\n /** Pre-fill domain from current navigation */\n prefillDomain?: string;\n}\n\nexport function CreateEntryModal({ open, onClose, onCreated, prefillData, prefillDomain }: CreateEntryModalProps) {\n const { data: domainsData } = useListDomains();\n const storeMutation = useStoreKnowledge();\n const [domain, setDomain] = useState(prefillDomain || '');\n const [key, setKey] = useState('');\n const [dataInput, setDataInput] = useState(prefillData ? JSON.stringify(prefillData, null, 2) : '{}');\n const [tags, setTags] = useState('');\n const [error, setError] = useState('');\n\n const domains = (domainsData?.domains ?? []).map((d: any) => d.domain);\n\n // Sync prefill props → state when they change (e.g., JSON drop)\n useEffect(() => {\n if (open) {\n setDataInput(prefillData ? JSON.stringify(prefillData, null, 2) : '{}');\n setDomain(prefillDomain || '');\n setKey('');\n setTags('');\n setError('');\n }\n }, [open, prefillData, prefillDomain]);\n\n if (!open) return null;\n\n const handleSubmit = async () => {\n setError('');\n if (!domain.trim()) { setError('Domain is required'); return; }\n if (!key.trim()) { setError('Key is required'); return; }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(dataInput);\n if (typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error();\n } catch {\n setError('Data must be a valid JSON object');\n return;\n }\n try {\n await storeMutation.mutateAsync({\n domain: domain.trim(),\n key: key.trim(),\n data: parsed,\n tags: tags ? tags.split(',').map(t => t.trim()).filter(Boolean) : [],\n });\n onCreated?.(domain.trim(), key.trim());\n onClose();\n } catch (err: any) {\n setError(err.message);\n }\n };\n\n return createPortal(\n <>\n <div className=\"fixed inset-0 z-40 bg-black/30\" onClick={onClose} />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-6 overflow-y-auto\">\n <div className=\"bg-surface-raised border border-surface-border rounded-lg shadow-lg w-full max-w-md max-h-[85vh] flex flex-col\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-surface-border\">\n <h3 className=\"text-sm font-medium text-text-primary\">New Knowledge Entry</h3>\n <button onClick={onClose} className=\"text-text-tertiary hover:text-text-primary\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"px-5 py-4 space-y-4 overflow-y-auto flex-1 min-h-0\">\n {/* Domain */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Domain</label>\n <input\n type=\"text\"\n list=\"domain-list\"\n value={domain}\n onChange={(e) => setDomain(e.target.value)}\n placeholder=\"e.g., screenshots, config, emails\"\n className=\"input text-xs w-full\"\n />\n <datalist id=\"domain-list\">\n {domains.map((d: string) => <option key={d} value={d} />)}\n </datalist>\n </div>\n\n {/* Key */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Key</label>\n <input\n type=\"text\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g., homepage, user-profile, report-2026\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {/* Data */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Data (JSON)</label>\n <textarea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={8}\n className=\"input-json w-full max-h-[30vh]\"\n />\n </div>\n\n {/* Tags */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags (comma-separated)</label>\n <input\n type=\"text\"\n value={tags}\n onChange={(e) => setTags(e.target.value)}\n placeholder=\"e.g., important, review, 401k\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {error && <p className=\"text-xs text-status-error\">{error}</p>}\n </div>\n\n <div className=\"flex justify-end gap-2 px-5 py-3 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Cancel</button>\n <button\n onClick={handleSubmit}\n disabled={storeMutation.isPending}\n className=\"btn-primary text-xs\"\n >\n {storeMutation.isPending ? 'Creating...' : 'Create Entry'}\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n );\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ChevronRight, Brain, Database, Table2, Plus } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterInput } from '../../components/common/data/FilterBar';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { DropZone } from '../../components/common/DropZone';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { useListDomains, useListKnowledge } from '../../api/knowledge';\nimport { KnowledgeEntryView } from './KnowledgeEntryView';\nimport { CreateEntryModal } from './CreateEntryModal';\n\nconst PAGE_SIZE = 50;\n\nexport function KnowledgePage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const domain = searchParams.get('domain') || '';\n const entryKey = searchParams.get('key') || '';\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(PAGE_SIZE);\n const [showCreate, setShowCreate] = useState(false);\n const [prefillData, setPrefillData] = useState<Record<string, unknown> | undefined>();\n\n const handleJsonDrop = useCallback((files: File[]) => {\n console.debug('[Knowledge] drop received:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n const jsonFile = files.find(f => f.name.endsWith('.json') || f.type === 'application/json');\n if (!jsonFile) {\n console.warn('[Knowledge] no JSON file found in dropped files');\n return;\n }\n console.debug('[Knowledge] reading:', jsonFile.name);\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const parsed = JSON.parse(reader.result as string);\n if (typeof parsed === 'object' && !Array.isArray(parsed)) {\n console.debug('[Knowledge] parsed object with keys:', Object.keys(parsed));\n setPrefillData(parsed);\n setShowCreate(true);\n } else {\n console.warn('[Knowledge] JSON is not a plain object, got:', Array.isArray(parsed) ? 'array' : typeof parsed);\n }\n } catch (err) {\n console.warn('[Knowledge] JSON parse failed:', err);\n }\n };\n reader.readAsText(jsonFile);\n }, []);\n\n // Debounce search to avoid hammering the API on every keystroke\n useEffect(() => {\n const t = setTimeout(() => {\n setDebouncedSearch(search);\n setPage(1);\n }, 300);\n return () => clearTimeout(t);\n }, [search]);\n\n const offset = (page - 1) * pageSize;\n\n const domainsQuery = useListDomains();\n const entriesQuery = useListKnowledge(domain, {\n search: debouncedSearch || undefined,\n limit: pageSize,\n offset,\n });\n\n const domains = domainsQuery.data?.domains ?? [];\n const entries = entriesQuery.data?.entries ?? [];\n const entriesTotal = entriesQuery.data?.total ?? 0;\n\n // Domains are a small list — client-side filter is fine\n const filteredDomains = useMemo(() => {\n if (!search) return domains;\n const q = search.toLowerCase();\n return domains.filter((d) => d.domain.toLowerCase().includes(q));\n }, [domains, search]);\n\n function navigate(d: string, k?: string) {\n setSearch('');\n setDebouncedSearch('');\n setPage(1);\n const params: Record<string, string> = {};\n if (d) params.domain = d;\n if (k) params.key = k;\n setSearchParams(params);\n }\n\n const level = entryKey ? 'entry' : domain ? 'entries' : 'domains';\n const isLoading = level === 'entries' ? entriesQuery.isLoading : level === 'domains' ? domainsQuery.isLoading : false;\n const totalPages = Math.ceil((level === 'entries' ? entriesTotal : filteredDomains.length) / pageSize);\n\n const entriesApiPath = domain\n ? `/knowledge/entries?domain=${encodeURIComponent(domain)}&limit=${pageSize}&offset=${offset}${debouncedSearch ? `&search=${encodeURIComponent(debouncedSearch)}` : ''}`\n : undefined;\n const domainsApiPath = '/knowledge/domains';\n\n return (\n <DropZone onDrop={handleJsonDrop} label=\"Drop a JSON file to create an entry\" accept=\".json,application/json\">\n <div>\n <PageHeader\n title=\"Knowledge\"\n docsHash=\"#docs:dashboard.md:knowledge\"\n actions={\n <button\n onClick={() => { setPrefillData(undefined); setShowCreate(true); }}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n New Entry\n </button>\n }\n />\n\n {/* Breadcrumbs */}\n <nav className=\"flex items-center gap-1 text-sm mb-6 min-h-[28px]\">\n <button\n onClick={() => navigate('')}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n level === 'domains'\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <Brain className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>All Domains</span>\n </button>\n {domain && (\n <>\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <button\n onClick={() => navigate(domain)}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n level === 'entries'\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <Database className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n {domain}\n </button>\n </>\n )}\n {entryKey && (\n <>\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"flex items-center gap-1.5 px-1.5 py-0.5 text-text-primary font-medium\">\n <Table2 className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n {entryKey}\n </span>\n </>\n )}\n </nav>\n\n {/* Level: entry detail */}\n {level === 'entry' ? (\n <KnowledgeEntryView\n domain={domain}\n entryKey={entryKey}\n onDeleted={() => navigate(domain)}\n />\n ) : (\n <>\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => level === 'entries' ? entriesQuery.refetch() : domainsQuery.refetch()}\n isFetching={level === 'entries' ? entriesQuery.isFetching : domainsQuery.isFetching}\n apiPath={level === 'entries' ? entriesApiPath : domainsApiPath}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={domain ? 'Filter by key or tag...' : 'Filter by domain...'}\n />\n </FilterBar>\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-2 mt-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : level === 'domains' ? (\n filteredDomains.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => { setPrefillData(undefined); setShowCreate(true); }}>\n <EmptyState icon={Brain} title={search ? 'No matching domains' : 'No knowledge yet'} description={search ? undefined : 'Create your first entry or drop a JSON file'} />\n </div>\n ) : (\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-[10px] uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium\">Domain</th>\n <th className=\"pb-2 font-medium w-24 text-right\">Entries</th>\n <th className=\"pb-2 pr-2 font-medium w-40 text-right\">Latest</th>\n </tr>\n </thead>\n <tbody>\n {filteredDomains.map((d) => (\n <tr\n key={d.domain}\n onClick={() => navigate(d.domain)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n <Database className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors\">\n {d.domain}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {d.count}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={d.latest} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : (\n entries.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => { setPrefillData(undefined); setShowCreate(true); }}>\n <EmptyState icon={Plus} title={search ? 'No matching entries' : 'No entries in this domain'} description={search ? undefined : 'Add an entry or drop a JSON file'} />\n </div>\n ) : (\n <>\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-[10px] uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium w-[200px]\">Key</th>\n <th className=\"pb-2 font-medium\">Tags</th>\n <th className=\"pb-2 font-medium w-16 text-right\">Fields</th>\n <th className=\"pb-2 pr-2 font-medium w-32 text-right\">Updated</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry) => (\n <tr\n key={entry.key}\n onClick={() => navigate(domain, entry.key)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2 w-[200px]\">\n <span className=\"flex items-center gap-2.5\">\n <Table2 className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors truncate max-w-[160px]\" title={entry.key}>\n {entry.key}\n </span>\n </span>\n </td>\n <td className=\"py-2\">\n <div className=\"flex flex-wrap gap-1\">\n {entry.tags?.slice(0, 5).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center px-1.5 py-0 rounded-full text-[10px] font-medium bg-accent/10 text-accent\"\n >\n {tag}\n </span>\n ))}\n {entry.tags && entry.tags.length > 5 && (\n <span className=\"text-[10px] text-text-tertiary\">\n +{entry.tags.length - 5}\n </span>\n )}\n </div>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {entry.data ? Object.keys(entry.data).length : 0}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={entry.updated_at} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n <StickyPagination\n page={page}\n totalPages={totalPages}\n onPageChange={setPage}\n total={entriesTotal}\n pageSize={pageSize}\n onPageSizeChange={setPageSize}\n />\n </>\n )\n )}\n </>\n )}\n </div>\n\n <CreateEntryModal\n open={showCreate}\n onClose={() => { setShowCreate(false); setPrefillData(undefined); }}\n onCreated={(d, k) => {\n setSearchParams({ domain: d, key: k });\n domainsQuery.refetch();\n }}\n prefillData={prefillData}\n prefillDomain={domain || undefined}\n />\n </DropZone>\n );\n}\n"],"names":["formatValue","val","parseValue","raw","trimmed","looksLikeJson","isSimple","t","AutoTextarea","value","onChange","onKeyDown","placeholder","mono","ref","useRef","useEffect","jsx","e","KnowledgeEntryView","domain","entryKey","onDeleted","entry","isLoading","refetch","useGetKnowledge","deleteMutation","useDeleteKnowledge","storeMutation","useStoreKnowledge","setFieldMutation","useSetKnowledgeField","removeFieldMutation","useRemoveKnowledgeField","confirmDelete","setConfirmDelete","useState","editing","setEditing","draft","setDraft","ghostField","setGhostField","ghostValue","setGhostValue","pendingRemove","setPendingRemove","jsonHint","setJsonHint","editingTags","setEditingTags","data","allFields","fields","useMemo","q","field","originalValue","useCallback","column","isDirty","startEdit","cancelEdit","showJsonHint","commitEdit","parsed","parsedOk","newName","removeField","saveTags","tags","commitGhostRow","name","updated","handleKeyDown","handleGhostKeyDown","jsxs","TagInput","tag","TimeAgo","Trash2","isEditingField","isEditingValue","isActive","isRemoving","CreateEntryModal","open","onClose","onCreated","prefillData","prefillDomain","domainsData","useListDomains","setDomain","key","setKey","dataInput","setDataInput","setTags","error","setError","domains","d","handleSubmit","err","createPortal","Fragment","X","PAGE_SIZE","KnowledgePage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","page","setPage","pageSize","setPageSize","showCreate","setShowCreate","setPrefillData","handleJsonDrop","files","f","jsonFile","reader","offset","domainsQuery","entriesQuery","useListKnowledge","_a","entries","_b","entriesTotal","_c","filteredDomains","navigate","k","params","level","totalPages","entriesApiPath","DropZone","PageHeader","Plus","Brain","ChevronRight","Database","Table2","FilterBar","ListToolbar","FilterInput","_","i","EmptyState","StickyPagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-C0sDEKdo.js","sources":["../../src/pages/knowledge/KnowledgeEntryView.tsx","../../src/pages/knowledge/CreateEntryModal.tsx","../../src/pages/knowledge/KnowledgePage.tsx"],"sourcesContent":["import { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { Trash2 } from 'lucide-react';\nimport { useGetKnowledge, useDeleteKnowledge, useStoreKnowledge, useSetKnowledgeField, useRemoveKnowledgeField } from '../../api/knowledge';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { TagInput } from '../../components/common/form/TagInput';\n\ninterface KnowledgeEntryViewProps {\n domain: string;\n entryKey: string;\n onDeleted: () => void;\n}\n\ntype EditingCell = { field: string; column: 'field' | 'value' } | null;\n\nfunction formatValue(val: unknown): string {\n if (val === null || val === undefined) return '';\n if (typeof val === 'string') return val;\n return JSON.stringify(val, null, 2);\n}\n\nfunction parseValue(raw: string): { value: unknown; looksLikeJson: boolean; parsedOk: boolean } {\n const trimmed = raw.trim();\n if (!trimmed) return { value: '', looksLikeJson: false, parsedOk: false };\n const looksLikeJson = trimmed.startsWith('{') || trimmed.startsWith('[');\n try {\n return { value: JSON.parse(trimmed), looksLikeJson, parsedOk: true };\n } catch {\n return { value: trimmed, looksLikeJson, parsedOk: false };\n }\n}\n\nfunction isSimple(val: unknown): boolean {\n if (typeof val === 'string') {\n const t = val.trim();\n // Strings that look like JSON render as structured\n if ((t.startsWith('{') && t.endsWith('}')) || (t.startsWith('[') && t.endsWith(']'))) return false;\n return true;\n }\n return typeof val === 'number' || typeof val === 'boolean' || val === null;\n}\n\nfunction AutoTextarea({ value, onChange, onKeyDown, placeholder, mono }: {\n value: string;\n onChange: (v: string) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n placeholder?: string;\n mono?: boolean;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n ref.current.style.height = 'auto';\n ref.current.style.height = `${ref.current.scrollHeight}px`;\n ref.current.focus();\n }\n }, [value]);\n\n return (\n <textarea\n ref={ref}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n rows={1}\n className={`w-full bg-transparent text-xs text-text-primary resize-none outline-none p-0 ${mono ? 'font-mono' : ''}`}\n style={{ minHeight: '1.5em' }}\n />\n );\n}\n\nexport function KnowledgeEntryView({ domain, entryKey, onDeleted }: KnowledgeEntryViewProps) {\n const { data: entry, isLoading, refetch } = useGetKnowledge(domain, entryKey);\n const deleteMutation = useDeleteKnowledge();\n const storeMutation = useStoreKnowledge();\n const setFieldMutation = useSetKnowledgeField();\n const removeFieldMutation = useRemoveKnowledgeField();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editing, setEditing] = useState<EditingCell>(null);\n const [draft, setDraft] = useState('');\n const [ghostField, setGhostField] = useState('');\n const [ghostValue, setGhostValue] = useState('');\n const [pendingRemove, setPendingRemove] = useState<string | null>(null);\n const [jsonHint, setJsonHint] = useState<string | null>(null);\n const [editingTags, setEditingTags] = useState(false);\n\n const data = entry?.data as Record<string, unknown> | undefined;\n const allFields = data ? Object.entries(data) : [];\n\n // Ghost field input doubles as a filter — if text is entered but not yet saved,\n // narrow the visible rows to matching field names\n const fields = useMemo(() => {\n const q = ghostField.trim().toLowerCase();\n if (!q) return allFields;\n return allFields.filter(([field]) => field.toLowerCase().includes(q));\n }, [allFields, ghostField]);\n\n const originalValue = useCallback((field: string, column: 'field' | 'value'): string => {\n if (column === 'field') return field;\n return formatValue(data?.[field]);\n }, [data]);\n\n const isDirty = editing\n ? draft !== originalValue(editing.field, editing.column)\n : false;\n\n function startEdit(field: string, column: 'field' | 'value') {\n setEditing({ field, column });\n setDraft(originalValue(field, column));\n setPendingRemove(null);\n }\n\n function cancelEdit() {\n setEditing(null);\n setDraft('');\n }\n\n function showJsonHint() {\n setJsonHint('Invalid JSON — saved as text');\n setTimeout(() => setJsonHint(null), 4000);\n }\n\n async function commitEdit() {\n if (!editing || !data) return;\n const { field, column } = editing;\n\n if (column === 'value') {\n const { value: parsed, looksLikeJson, parsedOk } = parseValue(draft);\n if (looksLikeJson && !parsedOk) showJsonHint();\n // Use setField for surgical update — preserves siblings\n await setFieldMutation.mutateAsync({ domain, key: entryKey, path: field, value: parsed });\n } else {\n // Rename: remove old field, set new field\n const newName = draft.trim();\n if (!newName || newName === field) { cancelEdit(); return; }\n const val = data[field];\n await removeFieldMutation.mutateAsync({ domain, key: entryKey, path: field });\n await setFieldMutation.mutateAsync({ domain, key: entryKey, path: newName, value: val });\n }\n\n setEditing(null);\n setDraft('');\n refetch();\n }\n\n async function removeField(field: string) {\n await removeFieldMutation.mutateAsync({ domain, key: entryKey, path: field });\n setPendingRemove(null);\n setEditing(null);\n refetch();\n }\n\n async function saveTags(tags: string[]) {\n await storeMutation.mutateAsync({\n domain,\n key: entryKey,\n data: data || {},\n tags,\n replace: true,\n });\n refetch();\n }\n\n async function commitGhostRow() {\n const name = ghostField.trim();\n if (!name) return;\n const { value, looksLikeJson, parsedOk } = parseValue(ghostValue);\n if (looksLikeJson && !parsedOk) showJsonHint();\n const updated = { ...data, [name]: value || '' };\n await storeMutation.mutateAsync({ domain, key: entryKey, data: updated });\n setGhostField('');\n setGhostValue('');\n refetch();\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n cancelEdit();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n commitEdit();\n }\n }\n\n function handleGhostKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n setGhostField('');\n setGhostValue('');\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n commitGhostRow();\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-3 mt-4\">\n <div className=\"h-4 bg-surface-sunken rounded w-1/3\" />\n <div className=\"h-48 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!entry || entry.found === false) {\n return <p className=\"text-sm text-text-tertiary mt-4\">Entry not found.</p>;\n }\n\n return (\n <div>\n {/* Metadata + actions bar */}\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-4 min-h-[28px]\">\n {editingTags ? (\n <div className=\"flex items-center gap-2\">\n <TagInput\n tags={entry.tags || []}\n onChange={(tags) => { saveTags(tags); }}\n placeholder=\"Add tag...\"\n compact\n />\n <button\n onClick={() => setEditingTags(false)}\n className=\"text-[10px] text-text-tertiary hover:text-text-secondary shrink-0\"\n >\n Done\n </button>\n </div>\n ) : (\n <div\n className=\"flex items-center gap-1 cursor-text group\"\n onClick={() => setEditingTags(true)}\n title=\"Click to edit tags\"\n >\n {entry.tags && entry.tags.length > 0 ? (\n entry.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-medium bg-accent/10 text-accent\">\n {tag}\n </span>\n ))\n ) : (\n <span className=\"text-[10px] text-text-tertiary/40 italic group-hover:text-text-tertiary\">add tags...</span>\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-[10px] text-text-tertiary\"><TimeAgo date={entry.updated_at} /></span>\n {confirmDelete ? (\n <span className=\"flex items-center gap-2 text-[10px]\">\n <span className=\"text-status-error\">Delete entry?</span>\n <button\n onClick={async () => {\n try {\n await deleteMutation.mutateAsync({ domain, key: entryKey });\n onDeleted();\n } catch { /* */ }\n }}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n disabled={deleteMutation.isPending}\n >\n {deleteMutation.isPending ? 'Deleting...' : 'Yes'}\n </button>\n <button\n onClick={() => setConfirmDelete(false)}\n className=\"text-text-tertiary hover:text-text-secondary\"\n >\n No\n </button>\n </span>\n ) : (\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"text-text-tertiary/50 hover:text-status-error transition-colors\"\n title=\"Delete entry\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {jsonHint && (\n <div className=\"flex items-center justify-end gap-2 mb-2 px-1\">\n <span className=\"inline-block w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n <span className=\"text-xs text-status-warning\">{jsonHint}</span>\n </div>\n )}\n\n {/* Field/value grid */}\n <table className=\"w-full border-collapse\">\n <thead className=\"sticky top-0 z-10 bg-surface\">\n <tr className=\"text-left text-[10px] uppercase tracking-wider text-text-tertiary border-b border-surface-border\">\n <th className=\"px-3 py-2 font-medium w-[200px] border-r border-surface-border\">Field</th>\n <th className=\"px-3 py-2 font-medium\">Value</th>\n </tr>\n {/* Input row — add new field or filter existing */}\n <tr className=\"border-b border-surface-border bg-surface\">\n <td className=\"px-3 py-2 align-top border-r border-surface-border\">\n <input\n value={ghostField}\n onChange={(e) => setGhostField(e.target.value)}\n onKeyDown={handleGhostKeyDown}\n placeholder={allFields.length ? 'add or filter...' : 'new field'}\n className=\"w-full bg-transparent text-xs text-text-primary placeholder:text-text-tertiary/40 placeholder:italic outline-none p-0\"\n />\n </td>\n <td className=\"px-3 py-2 align-top\">\n <AutoTextarea\n value={ghostValue}\n onChange={setGhostValue}\n onKeyDown={handleGhostKeyDown}\n placeholder=\"value\"\n />\n {ghostField.trim() && (\n <div className=\"flex gap-2 mt-1.5\">\n <button\n onClick={commitGhostRow}\n className=\"text-[10px] font-medium text-accent hover:text-accent-hover\"\n disabled={storeMutation.isPending}\n >\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n <button\n onClick={() => { setGhostField(''); setGhostValue(''); }}\n className=\"text-[10px] text-text-tertiary hover:text-text-secondary\"\n >\n Cancel\n </button>\n </div>\n )}\n </td>\n </tr>\n </thead>\n <tbody>\n {fields.map(([field, value]) => {\n const isEditingField = editing?.field === field && editing.column === 'field';\n const isEditingValue = editing?.field === field && editing.column === 'value';\n const isActive = isEditingField || isEditingValue;\n const isRemoving = pendingRemove === field;\n\n return (\n <tr key={field} className={`border-b border-surface-border ${isRemoving ? 'bg-status-error/10' : isActive ? '' : 'hover:bg-surface-hover/30'}`}>\n {/* Field name cell */}\n <td\n className={`px-3 py-2 align-top border-r cursor-text ${isRemoving ? 'bg-transparent border-r-transparent' : isEditingField ? 'border-r-surface-border bg-accent/5 border-l-2 border-l-accent' : 'border-r-surface-border'}`}\n onClick={() => !isEditingField && !isRemoving && startEdit(field, 'field')}\n >\n {isEditingField ? (\n <div>\n <AutoTextarea value={draft} onChange={setDraft} onKeyDown={handleKeyDown} placeholder=\"field name\" />\n {isDirty && (\n <div className=\"flex gap-2 mt-1.5\">\n <button onClick={commitEdit} className=\"text-[10px] font-medium text-accent hover:text-accent-hover\" disabled={storeMutation.isPending}>\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n <button onClick={cancelEdit} className=\"text-[10px] text-text-tertiary hover:text-text-secondary\">Cancel</button>\n </div>\n )}\n </div>\n ) : (\n <span className=\"text-xs font-medium text-text-secondary break-all\">{field}</span>\n )}\n </td>\n\n {/* Value cell */}\n <td\n className={`px-3 py-2 align-top cursor-text ${isRemoving ? 'bg-transparent' : isEditingValue ? 'bg-accent/5 border-l-2 border-l-accent' : ''}`}\n onClick={() => !isEditingValue && !isRemoving && startEdit(field, 'value')}\n >\n {isRemoving ? (\n <span className=\"flex items-center justify-end gap-2 text-[10px]\">\n <span className=\"text-status-error\">Remove <span className=\"font-medium\">{field}</span>?</span>\n <button\n onClick={(e) => { e.stopPropagation(); removeField(field); }}\n className=\"font-medium text-status-error hover:text-status-error/80\"\n disabled={storeMutation.isPending}\n >\n {storeMutation.isPending ? '...' : 'Yes'}\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); setPendingRemove(null); }}\n className=\"text-text-tertiary hover:text-text-secondary\"\n >\n No\n </button>\n </span>\n ) : isEditingValue ? (\n <div>\n <AutoTextarea\n value={draft}\n onChange={setDraft}\n onKeyDown={handleKeyDown}\n placeholder=\"value (string or JSON)\"\n mono={!isSimple(value)}\n />\n <div className=\"flex gap-2 mt-1.5\">\n {isDirty && (\n <button onClick={commitEdit} className=\"text-[10px] font-medium text-accent hover:text-accent-hover\" disabled={storeMutation.isPending}>\n {storeMutation.isPending ? 'Saving...' : 'Save'}\n </button>\n )}\n <button onClick={cancelEdit} className=\"text-[10px] text-text-tertiary hover:text-text-secondary\">Cancel</button>\n <button\n onClick={(e) => { e.stopPropagation(); setPendingRemove(field); }}\n className=\"text-[10px] text-status-error/50 hover:text-status-error ml-auto\"\n >\n Remove\n </button>\n </div>\n </div>\n ) : (\n isSimple(value) ? (\n <p className=\"text-xs text-text-primary break-words whitespace-pre-wrap\">{String(value)}</p>\n ) : (\n <pre className=\"text-xs text-text-primary font-mono whitespace-pre-wrap break-words\">\n {typeof value === 'string' ? value : JSON.stringify(value, null, 2)}\n </pre>\n )\n )}\n </td>\n </tr>\n );\n })}\n\n </tbody>\n </table>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStoreKnowledge, useListDomains } from '../../api/knowledge';\n\ninterface CreateEntryModalProps {\n open: boolean;\n onClose: () => void;\n onCreated?: (domain: string, key: string) => void;\n /** Pre-fill data from a dropped JSON file */\n prefillData?: Record<string, unknown>;\n /** Pre-fill domain from current navigation */\n prefillDomain?: string;\n}\n\nexport function CreateEntryModal({ open, onClose, onCreated, prefillData, prefillDomain }: CreateEntryModalProps) {\n const { data: domainsData } = useListDomains();\n const storeMutation = useStoreKnowledge();\n const [domain, setDomain] = useState(prefillDomain || '');\n const [key, setKey] = useState('');\n const [dataInput, setDataInput] = useState(prefillData ? JSON.stringify(prefillData, null, 2) : '{}');\n const [tags, setTags] = useState('');\n const [error, setError] = useState('');\n\n const domains = (domainsData?.domains ?? []).map((d: any) => d.domain);\n\n // Sync prefill props → state when they change (e.g., JSON drop)\n useEffect(() => {\n if (open) {\n setDataInput(prefillData ? JSON.stringify(prefillData, null, 2) : '{}');\n setDomain(prefillDomain || '');\n setKey('');\n setTags('');\n setError('');\n }\n }, [open, prefillData, prefillDomain]);\n\n if (!open) return null;\n\n const handleSubmit = async () => {\n setError('');\n if (!domain.trim()) { setError('Domain is required'); return; }\n if (!key.trim()) { setError('Key is required'); return; }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(dataInput);\n if (typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error();\n } catch {\n setError('Data must be a valid JSON object');\n return;\n }\n try {\n await storeMutation.mutateAsync({\n domain: domain.trim(),\n key: key.trim(),\n data: parsed,\n tags: tags ? tags.split(',').map(t => t.trim()).filter(Boolean) : [],\n });\n onCreated?.(domain.trim(), key.trim());\n onClose();\n } catch (err: any) {\n setError(err.message);\n }\n };\n\n return createPortal(\n <>\n <div className=\"fixed inset-0 z-40 bg-black/30\" onClick={onClose} />\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-6 overflow-y-auto\">\n <div className=\"bg-surface-raised border border-surface-border rounded-lg shadow-lg w-full max-w-md max-h-[85vh] flex flex-col\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-surface-border\">\n <h3 className=\"text-sm font-medium text-text-primary\">New Knowledge Entry</h3>\n <button onClick={onClose} className=\"text-text-tertiary hover:text-text-primary\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"px-5 py-4 space-y-4 overflow-y-auto flex-1 min-h-0\">\n {/* Domain */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Domain</label>\n <input\n type=\"text\"\n list=\"domain-list\"\n value={domain}\n onChange={(e) => setDomain(e.target.value)}\n placeholder=\"e.g., screenshots, config, emails\"\n className=\"input text-xs w-full\"\n />\n <datalist id=\"domain-list\">\n {domains.map((d: string) => <option key={d} value={d} />)}\n </datalist>\n </div>\n\n {/* Key */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Key</label>\n <input\n type=\"text\"\n value={key}\n onChange={(e) => setKey(e.target.value)}\n placeholder=\"e.g., homepage, user-profile, report-2026\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {/* Data */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Data (JSON)</label>\n <textarea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={8}\n className=\"input-json w-full max-h-[30vh]\"\n />\n </div>\n\n {/* Tags */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags (comma-separated)</label>\n <input\n type=\"text\"\n value={tags}\n onChange={(e) => setTags(e.target.value)}\n placeholder=\"e.g., important, review, 401k\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {error && <p className=\"text-xs text-status-error\">{error}</p>}\n </div>\n\n <div className=\"flex justify-end gap-2 px-5 py-3 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Cancel</button>\n <button\n onClick={handleSubmit}\n disabled={storeMutation.isPending}\n className=\"btn-primary text-xs\"\n >\n {storeMutation.isPending ? 'Creating...' : 'Create Entry'}\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n );\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ChevronRight, Brain, Database, Table2, Plus } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterInput } from '../../components/common/data/FilterBar';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { DropZone } from '../../components/common/DropZone';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { useListDomains, useListKnowledge } from '../../api/knowledge';\nimport { KnowledgeEntryView } from './KnowledgeEntryView';\nimport { CreateEntryModal } from './CreateEntryModal';\n\nconst PAGE_SIZE = 50;\n\nexport function KnowledgePage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const domain = searchParams.get('domain') || '';\n const entryKey = searchParams.get('key') || '';\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(PAGE_SIZE);\n const [showCreate, setShowCreate] = useState(false);\n const [prefillData, setPrefillData] = useState<Record<string, unknown> | undefined>();\n\n const handleJsonDrop = useCallback((files: File[]) => {\n console.debug('[Knowledge] drop received:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n const jsonFile = files.find(f => f.name.endsWith('.json') || f.type === 'application/json');\n if (!jsonFile) {\n console.warn('[Knowledge] no JSON file found in dropped files');\n return;\n }\n console.debug('[Knowledge] reading:', jsonFile.name);\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const parsed = JSON.parse(reader.result as string);\n if (typeof parsed === 'object' && !Array.isArray(parsed)) {\n console.debug('[Knowledge] parsed object with keys:', Object.keys(parsed));\n setPrefillData(parsed);\n setShowCreate(true);\n } else {\n console.warn('[Knowledge] JSON is not a plain object, got:', Array.isArray(parsed) ? 'array' : typeof parsed);\n }\n } catch (err) {\n console.warn('[Knowledge] JSON parse failed:', err);\n }\n };\n reader.readAsText(jsonFile);\n }, []);\n\n // Debounce search to avoid hammering the API on every keystroke\n useEffect(() => {\n const t = setTimeout(() => {\n setDebouncedSearch(search);\n setPage(1);\n }, 300);\n return () => clearTimeout(t);\n }, [search]);\n\n const offset = (page - 1) * pageSize;\n\n const domainsQuery = useListDomains();\n const entriesQuery = useListKnowledge(domain, {\n search: debouncedSearch || undefined,\n limit: pageSize,\n offset,\n });\n\n const domains = domainsQuery.data?.domains ?? [];\n const entries = entriesQuery.data?.entries ?? [];\n const entriesTotal = entriesQuery.data?.total ?? 0;\n\n // Domains are a small list — client-side filter is fine\n const filteredDomains = useMemo(() => {\n if (!search) return domains;\n const q = search.toLowerCase();\n return domains.filter((d) => d.domain.toLowerCase().includes(q));\n }, [domains, search]);\n\n function navigate(d: string, k?: string) {\n setSearch('');\n setDebouncedSearch('');\n setPage(1);\n const params: Record<string, string> = {};\n if (d) params.domain = d;\n if (k) params.key = k;\n setSearchParams(params);\n }\n\n const level = entryKey ? 'entry' : domain ? 'entries' : 'domains';\n const isLoading = level === 'entries' ? entriesQuery.isLoading : level === 'domains' ? domainsQuery.isLoading : false;\n const totalPages = Math.ceil((level === 'entries' ? entriesTotal : filteredDomains.length) / pageSize);\n\n const entriesApiPath = domain\n ? `/knowledge/entries?domain=${encodeURIComponent(domain)}&limit=${pageSize}&offset=${offset}${debouncedSearch ? `&search=${encodeURIComponent(debouncedSearch)}` : ''}`\n : undefined;\n const domainsApiPath = '/knowledge/domains';\n\n return (\n <DropZone onDrop={handleJsonDrop} label=\"Drop a JSON file to create an entry\" accept=\".json,application/json\">\n <div>\n <PageHeader\n title=\"Knowledge\"\n docsHash=\"#docs:dashboard.md:knowledge\"\n actions={\n <button\n onClick={() => { setPrefillData(undefined); setShowCreate(true); }}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n New Entry\n </button>\n }\n />\n\n {/* Breadcrumbs */}\n <nav className=\"flex items-center gap-1 text-sm mb-6 min-h-[28px]\">\n <button\n onClick={() => navigate('')}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n level === 'domains'\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <Brain className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>All Domains</span>\n </button>\n {domain && (\n <>\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <button\n onClick={() => navigate(domain)}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n level === 'entries'\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <Database className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n {domain}\n </button>\n </>\n )}\n {entryKey && (\n <>\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"flex items-center gap-1.5 px-1.5 py-0.5 text-text-primary font-medium\">\n <Table2 className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n {entryKey}\n </span>\n </>\n )}\n </nav>\n\n {/* Level: entry detail */}\n {level === 'entry' ? (\n <KnowledgeEntryView\n domain={domain}\n entryKey={entryKey}\n onDeleted={() => navigate(domain)}\n />\n ) : (\n <>\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => level === 'entries' ? entriesQuery.refetch() : domainsQuery.refetch()}\n isFetching={level === 'entries' ? entriesQuery.isFetching : domainsQuery.isFetching}\n apiPath={level === 'entries' ? entriesApiPath : domainsApiPath}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={domain ? 'Filter by key or tag...' : 'Filter by domain...'}\n />\n </FilterBar>\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-2 mt-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : level === 'domains' ? (\n filteredDomains.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => { setPrefillData(undefined); setShowCreate(true); }}>\n <EmptyState icon={Brain} title={search ? 'No matching domains' : 'No knowledge yet'} description={search ? undefined : 'Create your first entry or drop a JSON file'} />\n </div>\n ) : (\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-[10px] uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium\">Domain</th>\n <th className=\"pb-2 font-medium w-24 text-right\">Entries</th>\n <th className=\"pb-2 pr-2 font-medium w-40 text-right\">Latest</th>\n </tr>\n </thead>\n <tbody>\n {filteredDomains.map((d) => (\n <tr\n key={d.domain}\n onClick={() => navigate(d.domain)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n <Database className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors\">\n {d.domain}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {d.count}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={d.latest} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : (\n entries.length === 0 ? (\n <div className=\"cursor-pointer\" onClick={() => { setPrefillData(undefined); setShowCreate(true); }}>\n <EmptyState icon={Plus} title={search ? 'No matching entries' : 'No entries in this domain'} description={search ? undefined : 'Add an entry or drop a JSON file'} />\n </div>\n ) : (\n <>\n <table className=\"w-full mt-2\">\n <thead>\n <tr className=\"text-left text-[10px] uppercase tracking-wider text-text-tertiary\">\n <th className=\"pb-2 pl-2 font-medium w-[200px]\">Key</th>\n <th className=\"pb-2 font-medium\">Tags</th>\n <th className=\"pb-2 font-medium w-16 text-right\">Fields</th>\n <th className=\"pb-2 pr-2 font-medium w-32 text-right\">Updated</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry) => (\n <tr\n key={entry.key}\n onClick={() => navigate(domain, entry.key)}\n className=\"row-hover cursor-pointer group\"\n >\n <td className=\"py-2 pl-2 w-[200px]\">\n <span className=\"flex items-center gap-2.5\">\n <Table2 className=\"w-4 h-4 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm text-text-primary group-hover:text-accent transition-colors truncate max-w-[160px]\" title={entry.key}>\n {entry.key}\n </span>\n </span>\n </td>\n <td className=\"py-2\">\n <div className=\"flex flex-wrap gap-1\">\n {entry.tags?.slice(0, 5).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center px-1.5 py-0 rounded-full text-[10px] font-medium bg-accent/10 text-accent\"\n >\n {tag}\n </span>\n ))}\n {entry.tags && entry.tags.length > 5 && (\n <span className=\"text-[10px] text-text-tertiary\">\n +{entry.tags.length - 5}\n </span>\n )}\n </div>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {entry.data ? Object.keys(entry.data).length : 0}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={entry.updated_at} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n <StickyPagination\n page={page}\n totalPages={totalPages}\n onPageChange={setPage}\n total={entriesTotal}\n pageSize={pageSize}\n onPageSizeChange={setPageSize}\n />\n </>\n )\n )}\n </>\n )}\n </div>\n\n <CreateEntryModal\n open={showCreate}\n onClose={() => { setShowCreate(false); setPrefillData(undefined); }}\n onCreated={(d, k) => {\n setSearchParams({ domain: d, key: k });\n domainsQuery.refetch();\n }}\n prefillData={prefillData}\n prefillDomain={domain || undefined}\n />\n </DropZone>\n );\n}\n"],"names":["formatValue","val","parseValue","raw","trimmed","looksLikeJson","isSimple","t","AutoTextarea","value","onChange","onKeyDown","placeholder","mono","ref","useRef","useEffect","jsxDEV","e","KnowledgeEntryView","domain","entryKey","onDeleted","entry","isLoading","refetch","useGetKnowledge","deleteMutation","useDeleteKnowledge","storeMutation","useStoreKnowledge","setFieldMutation","useSetKnowledgeField","removeFieldMutation","useRemoveKnowledgeField","confirmDelete","setConfirmDelete","useState","editing","setEditing","draft","setDraft","ghostField","setGhostField","ghostValue","setGhostValue","pendingRemove","setPendingRemove","jsonHint","setJsonHint","editingTags","setEditingTags","data","allFields","fields","useMemo","q","field","originalValue","useCallback","column","isDirty","startEdit","cancelEdit","showJsonHint","commitEdit","parsed","parsedOk","newName","removeField","saveTags","tags","commitGhostRow","name","updated","handleKeyDown","handleGhostKeyDown","TagInput","tag","TimeAgo","Trash2","isEditingField","isEditingValue","isActive","isRemoving","CreateEntryModal","open","onClose","onCreated","prefillData","prefillDomain","domainsData","useListDomains","setDomain","key","setKey","dataInput","setDataInput","setTags","error","setError","domains","d","handleSubmit","err","createPortal","Fragment","X","PAGE_SIZE","KnowledgePage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","page","setPage","pageSize","setPageSize","showCreate","setShowCreate","setPrefillData","handleJsonDrop","files","f","jsonFile","reader","offset","domainsQuery","entriesQuery","useListKnowledge","_a","entries","_b","entriesTotal","_c","filteredDomains","navigate","k","params","level","totalPages","entriesApiPath","DropZone","PageHeader","Plus","Brain","ChevronRight","Database","Table2","FilterBar","ListToolbar","FilterInput","_","i","EmptyState","StickyPagination"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-4T7Z_gQ4.js";import{a as N}from"./vendor-query-DLp59M9_.js";import{u as y,a as R,b as T,c as k}from"./mcp-B5VQPoF3.js";import{E as L}from"./EmptyState-DMldv8c5.js";import{C as z}from"./ConfirmDeleteModal-_hW5Vc05.js";import{P as V}from"./PageHeader-DF4BeEm4.js";import{F,a as I,b as P}from"./FilterBar-TYiTtUgv.js";import{S as _}from"./StickyPagination-Ddy93Q5I.js";import{u as $}from"./useFilterParams-CGRYFw_A.js";import{u as q}from"./useExpandedRows-Cg9iq6Vy.js";import{T as A}from"./ToolTestPanel-BzFOwzd_.js";import{R as B,a as f}from"./RowActions-QcakGbVA.js";import{S as H}from"./StatusBadge-ME2R6a7K.js";import{T as G}from"./ToolPill-DpDv3FwI.js";import{S as J}from"./ServerName-D5NKD06M.js";import{m as O,ah as U,ai as W,J as K,n as Q,P as X}from"./vendor-icons-D8-ZINAH.js";import{c as Y}from"./vendor-react-Co3Y8ikm.js";import"./Modal-Qe8lW7gQ.js";import"./RunAsSelector-CYMeZwrM.js";import"./BotPicker-CYfFMpkY.js";import"./bots-BPlouRDm.js";function Z(a){var s,t;return!!((s=a.metadata)!=null&&s.builtin)||!!((t=a.transport_config)!=null&&t.builtin)}function ee(a,s){var o;if(!s)return!0;const t=s.toLowerCase();return a.name.toLowerCase().includes(t)||(o=a.description)!=null&&o.toLowerCase().includes(t)||(a.tags??[]).some(n=>n.toLowerCase().includes(t))?!0:(a.tool_manifest??[]).some(n=>{var u;return n.name.toLowerCase().includes(t)||((u=n.description)==null?void 0:u.toLowerCase().includes(t))})}function se(a,s){if(!s)return a;const t=s.toLowerCase();return a.filter(m=>{var o;return m.name.toLowerCase().includes(t)||((o=m.description)==null?void 0:o.toLowerCase().includes(t))})}function re({server:a,expanded:s,onToggle:t,onEdit:m,onDelete:o,onTryTool:n,connect:u,disconnect:g,visibleTools:b}){const i=a.tool_manifest??[],v=Z(a),d=a.tags??[];return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("tr",{onClick:i.length>0?t:void 0,className:`group/row border-b border-surface-border/50 transition-colors duration-100 ${i.length>0?"cursor-pointer row-hover":""}`,children:[e.jsxDEV("td",{className:"px-6 py-2.5",children:e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("span",{className:`transition-transform duration-150 ${s?"rotate-90":""} ${i.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsxDEV(O,{size:14},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:52,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:51,columnNumber:13},this),e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(J,{name:a.name,serverId:a.id,short:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:55,columnNumber:15},this),i.length>0&&e.jsxDEV("sup",{className:"text-[9px] font-normal text-accent/70",children:i.length},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:57,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:54,columnNumber:13},this),d.length>0&&e.jsxDEV("div",{className:"flex gap-1 ml-auto shrink-0",children:[d.slice(0,3).map(l=>e.jsxDEV("span",{className:"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded",children:l},l,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:63,columnNumber:19},this)),d.length>3&&e.jsxDEV("span",{className:"text-[9px] text-text-quaternary",title:d.slice(3).join(", "),children:"…"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:68,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:61,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:50,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:49,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28 whitespace-nowrap",children:e.jsxDEV(H,{status:a.status},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:77,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:76,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV(B,{children:[!v&&(a.status==="connected"?e.jsxDEV(f,{icon:U,title:"Disconnect server",onClick:()=>g.mutate(a.id)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:85,columnNumber:17},this):e.jsxDEV(f,{icon:W,title:"Connect server",onClick:()=>u.mutate(a.id),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:91,columnNumber:17},this)),e.jsxDEV(f,{icon:K,title:"Edit server",onClick:m},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:99,columnNumber:13},this),!v&&e.jsxDEV(f,{icon:Q,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:105,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:82,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:81,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:42,columnNumber:7},this),s&&b.map(l=>e.jsxDEV("tr",{onClick:()=>n(l),className:"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15",children:[e.jsxDEV("td",{className:"pl-14 pr-6 py-2.5",children:[e.jsxDEV(G,{name:l.name,size:"md"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:125,columnNumber:13},this),l.description&&e.jsxDEV("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:l.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:127,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:124,columnNumber:11},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:132,columnNumber:11},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV("div",{className:"flex items-center justify-end",children:e.jsxDEV("button",{onClick:p=>{p.stopPropagation(),n(l)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsxDEV(X,{className:"w-3.5 h-3.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:142,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:137,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:136,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:135,columnNumber:11},this)]},l.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:118,columnNumber:9},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:40,columnNumber:5},this)}function je(){const a=Y(),{filters:s,setFilter:t,pagination:m}=$({filters:{status:"",search:"",tag:""}}),{data:o,isLoading:n}=y({status:s.status||void 0,search:s.search||void 0,tags:s.tag||void 0}),u=R(),g=T(),b=k(),[i,v]=N.useState(null),{expandedIds:d,toggle:l}=q("lt:expanded:mcp-servers"),[p,S]=N.useState(null),h=(o==null?void 0:o.servers)??[],D=(o==null?void 0:o.total)??0,M=N.useMemo(()=>{const r=new Set;for(const c of h)for(const E of c.tags??[])r.add(E);return[...r].sort().map(c=>({value:c,label:c}))},[h]),x=N.useMemo(()=>s.search?h.filter(r=>ee(r,s.search)):h,[h,s.search]);N.useEffect(()=>{if(!s.search)return;const r=s.search.toLowerCase();for(const c of x)(c.tool_manifest??[]).some(w=>{var j;return w.name.toLowerCase().includes(r)||((j=w.description)==null?void 0:j.toLowerCase().includes(r))})&&!d.has(c.id)&&l(c.id)},[s.search,x]);const C=()=>{i&&b.mutate(i.id,{onSuccess:()=>v(null)})};return n?e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"MCP Server Tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:87,columnNumber:9},this),e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((r,c)=>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/pages/mcp/servers/McpServersPage.tsx",lineNumber:91,columnNumber:15},this)},c,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:90,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:88,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:86,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"MCP Server Tools",docsHash:"#docs:dashboard.md:mcp-server-tools",actions:e.jsxDEV("button",{onClick:()=>a("/mcp/servers/new"),className:"btn-primary text-xs",children:"Register Server"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:105,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:101,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:114,columnNumber:7},this),e.jsxDEV(F,{children:[e.jsxDEV(I,{label:"Search",value:s.search,onChange:r=>t("search",r),placeholder:"Server or tool name..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:119,columnNumber:9},this),e.jsxDEV(P,{label:"Tag",value:s.tag,onChange:r=>t("tag",r),options:M},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV(P,{label:"Status",value:s.status,onChange:r=>t("status",r),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:131,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:118,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-0 ",children:[e.jsxDEV("div",{className:`${p?"flex-1 min-w-0":"w-full"} transition-all`,children:[x.length===0?e.jsxDEV(L,{title:"No servers found"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:148,columnNumber:13},this):e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:[e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:153,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:156,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-16"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:159,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:152,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:151,columnNumber:15},this),e.jsxDEV("tbody",{children:x.map(r=>e.jsxDEV(re,{server:r,expanded:d.has(r.id),onToggle:()=>l(r.id),onEdit:()=>a(`/mcp/servers/${r.id}`),onDelete:()=>v(r),onTryTool:c=>S({serverId:r.id,serverName:r.name,tool:c}),connect:u,disconnect:g,visibleTools:se(r.tool_manifest??[],s.search)},r.id,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:164,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:162,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:150,columnNumber:13},this),e.jsxDEV(_,{page:m.page,totalPages:m.totalPages(D),onPageChange:m.setPage,total:D,pageSize:m.pageSize,onPageSizeChange:m.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:190,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:146,columnNumber:9},this),p&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsxDEV(A,{serverId:p.serverId,serverName:p.serverName,tool:p.tool,onClose:()=>S(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:203,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:202,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:144,columnNumber:7},this),e.jsxDEV(z,{open:!!i,onClose:()=>v(null),onConfirm:C,title:"Delete MCP Server",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:i==null?void 0:i.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:222,columnNumber:13},this),"? This will remove the server registration."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:220,columnNumber:11},this),isPending:b.isPending,error:b.error},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:214,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:100,columnNumber:5},this)}export{je as McpServersPage};
|
|
2
|
+
//# sourceMappingURL=index-C2MJzu6J.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-ByxH4qQ-.js","sources":["../../src/pages/mcp/servers/helpers.ts","../../src/pages/mcp/servers/ServerRow.tsx","../../src/pages/mcp/servers/McpServersPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../api/types';\n\nexport function isBuiltIn(row: McpServerRecord): boolean {\n return !!(row.metadata as Record<string, unknown> | null)?.builtin\n || !!(row.transport_config as Record<string, unknown> | null)?.builtin;\n}\n\n/** Check if a server or any of its tools match the search term */\nexport function matchesSearch(server: McpServerRecord, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.name.toLowerCase().includes(q)) return true;\n if (server.description?.toLowerCase().includes(q)) return true;\n if ((server.tags ?? []).some((t) => t.toLowerCase().includes(q))) return true;\n const tools = (server.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(tools: McpToolManifest[], search: string): McpToolManifest[] {\n if (!search) return tools;\n const q = search.toLowerCase();\n return tools.filter(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Pencil, Trash2, Plug, Unplug, Play } from 'lucide-react';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport {\n useConnectMcpServer,\n useDisconnectMcpServer,\n} from '../../../api/mcp';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { ToolPill } from '../../../components/common/display/ToolPill';\nimport { ServerName } from '../../../components/common/display/ServerName';\n\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { isBuiltIn } from './helpers';\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onEdit,\n onDelete,\n onTryTool,\n connect,\n disconnect,\n visibleTools,\n}: {\n server: McpServerRecord;\n expanded: boolean;\n onToggle: () => void;\n onEdit: () => void;\n onDelete: () => void;\n onTryTool: (tool: McpToolManifest) => void;\n connect: ReturnType<typeof useConnectMcpServer>;\n disconnect: ReturnType<typeof useDisconnectMcpServer>;\n visibleTools: McpToolManifest[];\n}) {\n const allTools = (server.tool_manifest ?? []) as McpToolManifest[];\n const builtin = isBuiltIn(server);\n const tags = server.tags ?? [];\n\n return (\n <>\n {/* Server header row */}\n <tr\n onClick={allTools.length > 0 ? onToggle : undefined}\n className={`group/row border-b border-surface-border/50 transition-colors duration-100 ${\n allTools.length > 0 ? 'cursor-pointer row-hover' : ''\n }`}\n >\n {/* Name + tags */}\n <td className=\"px-6 py-2.5\">\n <div className=\"flex items-center gap-3\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} ${allTools.length === 0 ? 'opacity-0' : 'text-text-tertiary'}`}>\n <ChevronRight size={14} />\n </span>\n <span className=\"flex items-center gap-1.5\">\n <ServerName name={server.name} serverId={server.id} short={false} />\n {allTools.length > 0 && (\n <sup className=\"text-[9px] font-normal text-accent/70\">{allTools.length}</sup>\n )}\n </span>\n {tags.length > 0 && (\n <div className=\"flex gap-1 ml-auto shrink-0\">\n {tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded\">\n {tag}\n </span>\n ))}\n {tags.length > 3 && (\n <span className=\"text-[9px] text-text-quaternary\" title={tags.slice(3).join(', ')}>…</span>\n )}\n </div>\n )}\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-2.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-2.5 w-16\">\n <RowActionGroup>\n {!builtin && (\n server.status === 'connected' ? (\n <RowAction\n icon={Unplug}\n title=\"Disconnect server\"\n onClick={() => disconnect.mutate(server.id)}\n />\n ) : (\n <RowAction\n icon={Plug}\n title=\"Connect server\"\n onClick={() => connect.mutate(server.id)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )\n )}\n <RowAction\n icon={Pencil}\n title=\"Edit server\"\n onClick={onEdit}\n />\n {!builtin && (\n <RowAction\n icon={Trash2}\n title=\"Delete server\"\n onClick={onDelete}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n )}\n </RowActionGroup>\n </td>\n </tr>\n\n {/* Expanded tool rows — real table rows for column alignment */}\n {expanded && visibleTools.map((tool) => (\n <tr\n key={tool.name}\n onClick={() => onTryTool(tool)}\n className=\"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15\"\n >\n {/* Tool name + description */}\n <td className=\"pl-14 pr-6 py-2.5\">\n <ToolPill name={tool.name} size=\"md\" />\n {tool.description && (\n <p className=\"text-[11px] leading-snug text-text-quaternary mt-0.5\">{tool.description}</p>\n )}\n </td>\n\n {/* Status — empty for tools */}\n <td className=\"px-4 py-2.5 w-28\" />\n\n {/* Actions — play on hover */}\n <td className=\"px-4 py-2.5 w-16\">\n <div className=\"flex items-center justify-end\">\n <button\n onClick={(e) => { e.stopPropagation(); onTryTool(tool); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </div>\n </td>\n </tr>\n ))}\n </>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useMcpServers,\n useConnectMcpServer,\n useDisconnectMcpServer,\n useDeleteMcpServer,\n} from '../../../api/mcp';\nimport { EmptyState } from '../../../components/common/display/EmptyState';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../../hooks/useExpandedRows';\nimport { ToolTestPanel } from '../../../components/common/test/ToolTestPanel';\nimport { matchesSearch, filterTools } from './helpers';\nimport { ServerRow } from './ServerRow';\n\nexport function McpServersPage() {\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '', tag: '' },\n });\n\n const { data, isLoading } = useMcpServers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n tags: filters.tag || undefined,\n });\n const connect = useConnectMcpServer();\n const disconnect = useDisconnectMcpServer();\n const deleteServer = useDeleteMcpServer();\n\n const [confirmDelete, setConfirmDelete] = useState<McpServerRecord | null>(null);\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:mcp-servers');\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n } | null>(null);\n\n const servers = data?.servers ?? [];\n const total = data?.total ?? 0;\n\n // Derive unique tags from current result set for the filter dropdown\n const tagOptions = useMemo(() => {\n const allTags = new Set<string>();\n for (const s of servers) {\n for (const t of s.tags ?? []) allTags.add(t);\n }\n return [...allTags].sort().map((t) => ({ value: t, label: t }));\n }, [servers]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n // Auto-expand servers whose tools match the search (so results are visible)\n useEffect(() => {\n if (!filters.search) return;\n const q = filters.search.toLowerCase();\n for (const s of filteredServers) {\n const tools = (s.tool_manifest ?? []) as McpToolManifest[];\n const hasToolMatch = tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n if (hasToolMatch && !expandedIds.has(s.id)) {\n toggleExpand(s.id);\n }\n }\n }, [filters.search, filteredServers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteServer.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Server Tools\" />\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 </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Server Tools\"\n docsHash=\"#docs:dashboard.md:mcp-server-tools\"\n actions={\n <button\n onClick={() => navigate('/mcp/servers/new')}\n className=\"btn-primary text-xs\"\n >\n Register Server\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name...\"\n />\n <FilterSelect\n label=\"Tag\"\n value={filters.tag}\n onChange={(v) => setFilter('tag', v)}\n options={tagOptions}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'registered', label: 'Registered' },\n { value: 'connected', label: 'Connected' },\n { value: 'error', label: 'Error' },\n { value: 'disconnected', label: 'Disconnected' },\n ]}\n />\n </FilterBar>\n\n <div className={`flex gap-0 ${tryTool ? '' : ''}`}>\n {/* Server list */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No servers found\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-16\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.id}\n server={server}\n expanded={expandedIds.has(server.id)}\n onToggle={() => toggleExpand(server.id)}\n onEdit={() => navigate(`/mcp/servers/${server.id}`)}\n onDelete={() => setConfirmDelete(server)}\n onTryTool={(tool) =>\n setTryTool({\n serverId: server.id,\n serverName: server.name,\n tool,\n })\n }\n connect={connect}\n disconnect={disconnect}\n visibleTools={filterTools(\n (server.tool_manifest ?? []) as McpToolManifest[],\n filters.search,\n )}\n />\n ))}\n </tbody>\n </table>\n )}\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Test panel — slides in from right */}\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\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete MCP Server\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">{confirmDelete?.name}</span>?\n This will remove the server registration.\n </>\n }\n isPending={deleteServer.isPending}\n error={deleteServer.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["isBuiltIn","row","_a","_b","matchesSearch","server","search","q","t","filterTools","tools","ServerRow","expanded","onToggle","onEdit","onDelete","onTryTool","connect","disconnect","visibleTools","allTools","builtin","tags","jsxs","Fragment","jsx","ChevronRight","ServerName","tag","StatusBadge","RowActionGroup","RowAction","Unplug","Plug","Pencil","Trash2","tool","ToolPill","e","Play","McpServersPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","data","isLoading","useMcpServers","useConnectMcpServer","useDisconnectMcpServer","deleteServer","useDeleteMcpServer","confirmDelete","setConfirmDelete","useState","expandedIds","toggleExpand","useExpandedRows","tryTool","setTryTool","servers","total","tagOptions","useMemo","allTags","s","filteredServers","useEffect","handleDelete","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState","StickyPagination","ToolTestPanel","ConfirmDeleteModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-C2MJzu6J.js","sources":["../../src/pages/mcp/servers/helpers.ts","../../src/pages/mcp/servers/ServerRow.tsx","../../src/pages/mcp/servers/McpServersPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../api/types';\n\nexport function isBuiltIn(row: McpServerRecord): boolean {\n return !!(row.metadata as Record<string, unknown> | null)?.builtin\n || !!(row.transport_config as Record<string, unknown> | null)?.builtin;\n}\n\n/** Check if a server or any of its tools match the search term */\nexport function matchesSearch(server: McpServerRecord, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.name.toLowerCase().includes(q)) return true;\n if (server.description?.toLowerCase().includes(q)) return true;\n if ((server.tags ?? []).some((t) => t.toLowerCase().includes(q))) return true;\n const tools = (server.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(tools: McpToolManifest[], search: string): McpToolManifest[] {\n if (!search) return tools;\n const q = search.toLowerCase();\n return tools.filter(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Pencil, Trash2, Plug, Unplug, Play } from 'lucide-react';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport {\n useConnectMcpServer,\n useDisconnectMcpServer,\n} from '../../../api/mcp';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { ToolPill } from '../../../components/common/display/ToolPill';\nimport { ServerName } from '../../../components/common/display/ServerName';\n\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { isBuiltIn } from './helpers';\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onEdit,\n onDelete,\n onTryTool,\n connect,\n disconnect,\n visibleTools,\n}: {\n server: McpServerRecord;\n expanded: boolean;\n onToggle: () => void;\n onEdit: () => void;\n onDelete: () => void;\n onTryTool: (tool: McpToolManifest) => void;\n connect: ReturnType<typeof useConnectMcpServer>;\n disconnect: ReturnType<typeof useDisconnectMcpServer>;\n visibleTools: McpToolManifest[];\n}) {\n const allTools = (server.tool_manifest ?? []) as McpToolManifest[];\n const builtin = isBuiltIn(server);\n const tags = server.tags ?? [];\n\n return (\n <>\n {/* Server header row */}\n <tr\n onClick={allTools.length > 0 ? onToggle : undefined}\n className={`group/row border-b border-surface-border/50 transition-colors duration-100 ${\n allTools.length > 0 ? 'cursor-pointer row-hover' : ''\n }`}\n >\n {/* Name + tags */}\n <td className=\"px-6 py-2.5\">\n <div className=\"flex items-center gap-3\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} ${allTools.length === 0 ? 'opacity-0' : 'text-text-tertiary'}`}>\n <ChevronRight size={14} />\n </span>\n <span className=\"flex items-center gap-1.5\">\n <ServerName name={server.name} serverId={server.id} short={false} />\n {allTools.length > 0 && (\n <sup className=\"text-[9px] font-normal text-accent/70\">{allTools.length}</sup>\n )}\n </span>\n {tags.length > 0 && (\n <div className=\"flex gap-1 ml-auto shrink-0\">\n {tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded\">\n {tag}\n </span>\n ))}\n {tags.length > 3 && (\n <span className=\"text-[9px] text-text-quaternary\" title={tags.slice(3).join(', ')}>…</span>\n )}\n </div>\n )}\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-2.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-2.5 w-16\">\n <RowActionGroup>\n {!builtin && (\n server.status === 'connected' ? (\n <RowAction\n icon={Unplug}\n title=\"Disconnect server\"\n onClick={() => disconnect.mutate(server.id)}\n />\n ) : (\n <RowAction\n icon={Plug}\n title=\"Connect server\"\n onClick={() => connect.mutate(server.id)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )\n )}\n <RowAction\n icon={Pencil}\n title=\"Edit server\"\n onClick={onEdit}\n />\n {!builtin && (\n <RowAction\n icon={Trash2}\n title=\"Delete server\"\n onClick={onDelete}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n )}\n </RowActionGroup>\n </td>\n </tr>\n\n {/* Expanded tool rows — real table rows for column alignment */}\n {expanded && visibleTools.map((tool) => (\n <tr\n key={tool.name}\n onClick={() => onTryTool(tool)}\n className=\"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15\"\n >\n {/* Tool name + description */}\n <td className=\"pl-14 pr-6 py-2.5\">\n <ToolPill name={tool.name} size=\"md\" />\n {tool.description && (\n <p className=\"text-[11px] leading-snug text-text-quaternary mt-0.5\">{tool.description}</p>\n )}\n </td>\n\n {/* Status — empty for tools */}\n <td className=\"px-4 py-2.5 w-28\" />\n\n {/* Actions — play on hover */}\n <td className=\"px-4 py-2.5 w-16\">\n <div className=\"flex items-center justify-end\">\n <button\n onClick={(e) => { e.stopPropagation(); onTryTool(tool); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </div>\n </td>\n </tr>\n ))}\n </>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useMcpServers,\n useConnectMcpServer,\n useDisconnectMcpServer,\n useDeleteMcpServer,\n} from '../../../api/mcp';\nimport { EmptyState } from '../../../components/common/display/EmptyState';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../../hooks/useExpandedRows';\nimport { ToolTestPanel } from '../../../components/common/test/ToolTestPanel';\nimport { matchesSearch, filterTools } from './helpers';\nimport { ServerRow } from './ServerRow';\n\nexport function McpServersPage() {\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '', tag: '' },\n });\n\n const { data, isLoading } = useMcpServers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n tags: filters.tag || undefined,\n });\n const connect = useConnectMcpServer();\n const disconnect = useDisconnectMcpServer();\n const deleteServer = useDeleteMcpServer();\n\n const [confirmDelete, setConfirmDelete] = useState<McpServerRecord | null>(null);\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:mcp-servers');\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n } | null>(null);\n\n const servers = data?.servers ?? [];\n const total = data?.total ?? 0;\n\n // Derive unique tags from current result set for the filter dropdown\n const tagOptions = useMemo(() => {\n const allTags = new Set<string>();\n for (const s of servers) {\n for (const t of s.tags ?? []) allTags.add(t);\n }\n return [...allTags].sort().map((t) => ({ value: t, label: t }));\n }, [servers]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n // Auto-expand servers whose tools match the search (so results are visible)\n useEffect(() => {\n if (!filters.search) return;\n const q = filters.search.toLowerCase();\n for (const s of filteredServers) {\n const tools = (s.tool_manifest ?? []) as McpToolManifest[];\n const hasToolMatch = tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n if (hasToolMatch && !expandedIds.has(s.id)) {\n toggleExpand(s.id);\n }\n }\n }, [filters.search, filteredServers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteServer.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Server Tools\" />\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 </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Server Tools\"\n docsHash=\"#docs:dashboard.md:mcp-server-tools\"\n actions={\n <button\n onClick={() => navigate('/mcp/servers/new')}\n className=\"btn-primary text-xs\"\n >\n Register Server\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name...\"\n />\n <FilterSelect\n label=\"Tag\"\n value={filters.tag}\n onChange={(v) => setFilter('tag', v)}\n options={tagOptions}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'registered', label: 'Registered' },\n { value: 'connected', label: 'Connected' },\n { value: 'error', label: 'Error' },\n { value: 'disconnected', label: 'Disconnected' },\n ]}\n />\n </FilterBar>\n\n <div className={`flex gap-0 ${tryTool ? '' : ''}`}>\n {/* Server list */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No servers found\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-16\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.id}\n server={server}\n expanded={expandedIds.has(server.id)}\n onToggle={() => toggleExpand(server.id)}\n onEdit={() => navigate(`/mcp/servers/${server.id}`)}\n onDelete={() => setConfirmDelete(server)}\n onTryTool={(tool) =>\n setTryTool({\n serverId: server.id,\n serverName: server.name,\n tool,\n })\n }\n connect={connect}\n disconnect={disconnect}\n visibleTools={filterTools(\n (server.tool_manifest ?? []) as McpToolManifest[],\n filters.search,\n )}\n />\n ))}\n </tbody>\n </table>\n )}\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Test panel — slides in from right */}\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\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete MCP Server\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">{confirmDelete?.name}</span>?\n This will remove the server registration.\n </>\n }\n isPending={deleteServer.isPending}\n error={deleteServer.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["isBuiltIn","row","_a","_b","matchesSearch","server","search","q","t","filterTools","tools","ServerRow","expanded","onToggle","onEdit","onDelete","onTryTool","connect","disconnect","visibleTools","allTools","builtin","tags","jsxDEV","Fragment","ChevronRight","ServerName","tag","StatusBadge","RowActionGroup","RowAction","Unplug","Plug","Pencil","Trash2","tool","ToolPill","e","Play","McpServersPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","data","isLoading","useMcpServers","useConnectMcpServer","useDisconnectMcpServer","deleteServer","useDeleteMcpServer","confirmDelete","setConfirmDelete","useState","expandedIds","toggleExpand","useExpandedRows","tryTool","setTryTool","servers","total","tagOptions","useMemo","allTags","s","filteredServers","useEffect","handleDelete","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState","StickyPagination","ToolTestPanel","ConfirmDeleteModal"],"mappings":"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"}
|