@hotmeshio/long-tail 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/agents.d.ts +1 -1
- package/build/api/agents.js +1 -1
- package/build/api/controlplane.d.ts +33 -0
- package/build/api/controlplane.js +46 -0
- package/build/bin/ltc.js +16 -0
- package/build/lib/cli/commands/streams.d.ts +20 -0
- package/build/lib/cli/commands/streams.js +134 -0
- package/build/lib/db/schemas/001_schema.sql +3 -3
- package/build/lib/db/schemas/003_agents.sql +1 -2
- package/build/lib/db/schemas/004_agent_subscriptions.sql +1 -1
- package/build/lib/db/schemas/006_agent_sub_unique.sql +1 -0
- package/build/routes/agents.js +3 -3
- package/build/routes/controlplane.js +28 -0
- package/build/sdk/index.d.ts +1 -0
- package/build/sdk/index.js +1 -0
- package/build/services/agent/index.d.ts +2 -3
- package/build/services/agent/index.js +5 -12
- package/build/services/agent/sql.d.ts +3 -4
- package/build/services/agent/sql.js +16 -20
- package/build/services/agent/subscription-sql.d.ts +1 -1
- package/build/services/agent/subscription-sql.js +1 -1
- package/build/services/agent/trigger-registry.js +1 -1
- package/build/services/controlplane/index.d.ts +9 -1
- package/build/services/controlplane/index.js +39 -0
- package/build/services/controlplane/stream-messages-sql.d.ts +21 -0
- package/build/services/controlplane/stream-messages-sql.js +109 -0
- package/build/services/controlplane/types.d.ts +44 -0
- package/build/services/cron/index.js +5 -5
- package/build/services/export/post-process.js +14 -6
- package/build/services/mcp-runs/execution-builder.js +9 -4
- package/build/services/topics/index.js +1 -4
- package/build/services/topics/sql.d.ts +2 -2
- package/build/services/topics/sql.js +9 -2
- package/build/services/topics/system-topics.js +2 -3
- package/build/start/workers.js +11 -14
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/agent.d.ts +1 -1
- package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js → AdminDashboard-BBWJAsjl.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js.map → AdminDashboard-BBWJAsjl.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CFJNOrlg.js → AgentConfigPage-Br2O6NDa.js} +3 -3
- package/dashboard/dist/assets/AgentConfigPage-Br2O6NDa.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-DjgOR62z.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DjgOR62z.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-CASVGEvY.js +2 -0
- package/dashboard/dist/assets/AgentsPage-CASVGEvY.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-Dl9ZmjKA.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-DdrzePy4.js.map → AvailableEscalationsPage-Dl9ZmjKA.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-kKBifD1w.js → BotPicker-wEoqL3HR.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-kKBifD1w.js.map → BotPicker-wEoqL3HR.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DYkx5aa4.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-DYkx5aa4.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js → CollapsibleSection-DN1aF5HO.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js.map → CollapsibleSection-DN1aF5HO.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js → ConfirmDeleteModal-v8ufrnX5.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js.map → ConfirmDeleteModal-v8ufrnX5.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-B4CL12pv.js → CopyableId-D94R2n6C.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-B4CL12pv.js.map → CopyableId-D94R2n6C.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js → CredentialsPage-CSSjAEx6.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-CSSjAEx6.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js → CronLabel-fYpkTnEd.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js.map → CronLabel-fYpkTnEd.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js → CustomDurationPicker-CSarfbO1.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js.map → CustomDurationPicker-CSarfbO1.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-J5R6mepB.js → DataTable-VKt4pvC-.js} +2 -2
- package/dashboard/dist/assets/{DataTable-J5R6mepB.js.map → DataTable-VKt4pvC-.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-DwNj3GiG.js → DropZone-Bl4j-AID.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DwNj3GiG.js.map → DropZone-Bl4j-AID.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js → ElapsedCell-Y4UmrII0.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js.map → ElapsedCell-Y4UmrII0.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BXGvOADa.js → EmptyState-Di6_NfbP.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BXGvOADa.js.map → EmptyState-Di6_NfbP.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js → EscalationsOverview-D0Ry84FE.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js.map → EscalationsOverview-D0Ry84FE.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CvJ98E8s.js → EventTable-BzPleN3Y.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CvJ98E8s.js.map → EventTable-BzPleN3Y.js.map} +1 -1
- package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js → EventTopicPill-DCqcr7N7.js} +2 -2
- package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js.map → EventTopicPill-DCqcr7N7.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js → FilterBar-BoRQss2J.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js.map → FilterBar-BoRQss2J.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-CGH_dYSo.js +2 -0
- package/dashboard/dist/assets/HomePage-CGH_dYSo.js.map +1 -0
- package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js → ListToolbar-BMWttsi2.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js.map → ListToolbar-BMWttsi2.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js → McpOverview-DpC-BbBV.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js.map → McpOverview-DpC-BbBV.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js → McpQueryDetailPage-CZSzX-cI.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js.map → McpQueryDetailPage-CZSzX-cI.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js → McpQueryPage-B4KsvBGo.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js.map → McpQueryPage-B4KsvBGo.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js → McpRunDetailPage-_owlNUzp.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js.map → McpRunDetailPage-_owlNUzp.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-C3A1fU3h.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-C3A1fU3h.js.map +1 -0
- package/dashboard/dist/assets/{Modal-C6k6_5KB.js → Modal-IsEbA4rW.js} +2 -2
- package/dashboard/dist/assets/{Modal-C6k6_5KB.js.map → Modal-IsEbA4rW.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-B8MOtt_p.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-e5N3_dVl.js.map → OperatorDashboard-B8MOtt_p.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-COcgWWf-.js → PageHeader-C4DNgZKA.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-COcgWWf-.js.map → PageHeader-C4DNgZKA.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js → PageHeaderWithStats-Fy6tGBaa.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js.map → PageHeaderWithStats-Fy6tGBaa.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js → PriorityBadge-kSpsF-Zm.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js.map → PriorityBadge-kSpsF-Zm.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js → ProcessDetailPage-CZjjs4jE.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js.map → ProcessDetailPage-CZjjs4jE.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js → ProcessesListPage-Ds7y71o8.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js.map → ProcessesListPage-Ds7y71o8.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-CHwys1f9.js → RolePill-DmdF9L9Q.js} +2 -2
- package/dashboard/dist/assets/{RolePill-CHwys1f9.js.map → RolePill-DmdF9L9Q.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js → RolesPage-CCmK38yn.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js.map → RolesPage-CCmK38yn.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js → RowActions-uGuPBEWb.js} +2 -2
- package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js.map → RowActions-uGuPBEWb.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js → RunAsSelector-BsO-uSh9.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js.map → RunAsSelector-BsO-uSh9.js.map} +1 -1
- package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js → ServerName-BHl8nLOV.js} +2 -2
- package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js.map → ServerName-BHl8nLOV.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-OKzRSSx4.js → StatCard-DI4ZQ-Zi.js} +2 -2
- package/dashboard/dist/assets/{StatCard-OKzRSSx4.js.map → StatCard-DI4ZQ-Zi.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js → StatusBadge-TV20Ulgl.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js.map → StatusBadge-TV20Ulgl.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js → StepIndicator-ziIED3Pz.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js.map → StepIndicator-ziIED3Pz.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js → StickyPagination-CXBDS1ka.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js.map → StickyPagination-CXBDS1ka.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js → SwimlaneTimeline-Dc_a4-D5.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js.map → SwimlaneTimeline-Dc_a4-D5.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-BGxXKiWD.js → TagInput-BYEjEPsa.js} +2 -2
- package/dashboard/dist/assets/{TagInput-BGxXKiWD.js.map → TagInput-BYEjEPsa.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-pN5BXzYA.js → TaskDetailPage-Cu0XLEA4.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-pN5BXzYA.js.map → TaskDetailPage-Cu0XLEA4.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js → TaskQueuePill-yBqQ-piu.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js.map → TaskQueuePill-yBqQ-piu.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js → TasksListPage-Dl0quVgM.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js.map → TasksListPage-Dl0quVgM.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js → TimeAgo-BAs-HL55.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js.map → TimeAgo-BAs-HL55.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js → TimestampCell-zFm6ze1U.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js.map → TimestampCell-zFm6ze1U.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DiM3hgAB.js +2 -0
- package/dashboard/dist/assets/{ToolPill-DdLN3JOT.js.map → ToolPill-DiM3hgAB.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js → ToolTestPanel-C3vWUW2p.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js.map → ToolTestPanel-C3vWUW2p.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-wjwRE5eI.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-wjwRE5eI.js.map +1 -0
- package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js → TopicsPage-D3AONwHP.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js.map → TopicsPage-D3AONwHP.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CLbusknU.js → UserName-0vrAWvND.js} +2 -2
- package/dashboard/dist/assets/{UserName-CLbusknU.js.map → UserName-0vrAWvND.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js → WorkflowExecutionPage-CBbWToVN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js.map → WorkflowExecutionPage-CBbWToVN.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js → WorkflowPill-C7jE0e1g.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js.map → WorkflowPill-C7jE0e1g.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-1GVHYLlw.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BWiUNvyl.js.map → WorkflowsDashboard-1GVHYLlw.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js → WorkflowsOverview-2POOJzat.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js.map → WorkflowsOverview-2POOJzat.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BcRKxz3P.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-CLebf2eL.js.map → YamlWorkflowsPage-BcRKxz3P.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dga6NU7U.js → agents-Bd6SNUID.js} +2 -2
- package/dashboard/dist/assets/agents-Bd6SNUID.js.map +1 -0
- package/dashboard/dist/assets/{bots-CtU4i4OQ.js → bots-DEsg-T8t.js} +2 -2
- package/dashboard/dist/assets/{bots-CtU4i4OQ.js.map → bots-DEsg-T8t.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BVoALhbL.js → controlplane-B3m1kIWb.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BVoALhbL.js.map → controlplane-B3m1kIWb.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-_N5GfuIi.js → escalation-CJQPC0gm.js} +2 -2
- package/dashboard/dist/assets/{escalation-_N5GfuIi.js.map → escalation-CJQPC0gm.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js → escalation-columns-DEE62U3_.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js.map → escalation-columns-DEE62U3_.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js → helpers-BveI_035.js} +2 -2
- package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js.map → helpers-BveI_035.js.map} +1 -1
- package/dashboard/dist/assets/index-B7zv_NKJ.js +2 -0
- package/dashboard/dist/assets/index-B7zv_NKJ.js.map +1 -0
- package/dashboard/dist/assets/index-BVVdr9s0.js +2 -0
- package/dashboard/dist/assets/{index-6Kd78p_v.js.map → index-BVVdr9s0.js.map} +1 -1
- package/dashboard/dist/assets/{index-D_H_Prht.js → index-BXIwxi_u.js} +2 -2
- package/dashboard/dist/assets/{index-D_H_Prht.js.map → index-BXIwxi_u.js.map} +1 -1
- package/dashboard/dist/assets/{index-B9ealjkt.js → index-CEPo8tn_.js} +2 -2
- package/dashboard/dist/assets/{index-B9ealjkt.js.map → index-CEPo8tn_.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYwPVJv0.js → index-CTKfvoGj.js} +2 -2
- package/dashboard/dist/assets/{index-BYwPVJv0.js.map → index-CTKfvoGj.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dpjguclc.js → index-CZVprWC6.js} +2 -2
- package/dashboard/dist/assets/{index-Dpjguclc.js.map → index-CZVprWC6.js.map} +1 -1
- package/dashboard/dist/assets/{index-CtbG3UN-.js → index-ChNwlMdo.js} +2 -2
- package/dashboard/dist/assets/{index-CtbG3UN-.js.map → index-ChNwlMdo.js.map} +1 -1
- package/dashboard/dist/assets/{index-QicYdUsl.js → index-Cpq83bZq.js} +2 -2
- package/dashboard/dist/assets/{index-QicYdUsl.js.map → index-Cpq83bZq.js.map} +1 -1
- package/dashboard/dist/assets/{index-CS61sh5q.js → index-Csts1D-x.js} +2 -2
- package/dashboard/dist/assets/{index-CS61sh5q.js.map → index-Csts1D-x.js.map} +1 -1
- package/dashboard/dist/assets/{index-dM-OgCY3.js → index-D4v-EUTe.js} +2 -2
- package/dashboard/dist/assets/{index-dM-OgCY3.js.map → index-D4v-EUTe.js.map} +1 -1
- package/dashboard/dist/assets/{index-DWUunWxh.js → index-DI36hw6W.js} +2 -2
- package/dashboard/dist/assets/{index-DWUunWxh.js.map → index-DI36hw6W.js.map} +1 -1
- package/dashboard/dist/assets/{index-CCOSf1PY.js → index-MnRuwfHN.js} +59 -59
- package/dashboard/dist/assets/index-MnRuwfHN.js.map +1 -0
- package/dashboard/dist/assets/index-dp_Q2Hha.css +1 -0
- package/dashboard/dist/assets/{index-BWHDW_CF.js → index-wQaJXZYX.js} +2 -2
- package/dashboard/dist/assets/{index-BWHDW_CF.js.map → index-wQaJXZYX.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DJlebU82.js → knowledge-krdvn5bg.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DJlebU82.js.map → knowledge-krdvn5bg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CsLJ5SRm.js → mcp-BTZ2ex4x.js} +2 -2
- package/dashboard/dist/assets/{mcp-CsLJ5SRm.js.map → mcp-BTZ2ex4x.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js → mcp-query-BzqJu709.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js.map → mcp-query-BzqJu709.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js → mcp-runs-BBUaY28a.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js.map → mcp-runs-BBUaY28a.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-iRejH3_A.js → namespaces-DJVfgGst.js} +2 -2
- package/dashboard/dist/assets/{namespaces-iRejH3_A.js.map → namespaces-DJVfgGst.js.map} +1 -1
- package/dashboard/dist/assets/{roles-3Jm5KtKc.js → roles-DogkRzK2.js} +2 -2
- package/dashboard/dist/assets/{roles-3Jm5KtKc.js.map → roles-DogkRzK2.js.map} +1 -1
- package/dashboard/dist/assets/{settings-DmN2I-c6.js → settings-D2sLRpie.js} +2 -2
- package/dashboard/dist/assets/{settings-DmN2I-c6.js.map → settings-D2sLRpie.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Cc-QoITQ.js → tasks-CIuWkHLG.js} +2 -2
- package/dashboard/dist/assets/{tasks-Cc-QoITQ.js.map → tasks-CIuWkHLG.js.map} +1 -1
- package/dashboard/dist/assets/{topics-p8anbgi0.js → topics-DxMDwZFs.js} +2 -2
- package/dashboard/dist/assets/topics-DxMDwZFs.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js → useEventHooks-xXspN8_9.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js.map → useEventHooks-xXspN8_9.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js → useYamlActivityEvents-2hdnnML7.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js.map → useYamlActivityEvents-2hdnnML7.js.map} +1 -1
- package/dashboard/dist/assets/{users-oXOlnold.js → users-DWQ-ojf9.js} +2 -2
- package/dashboard/dist/assets/{users-oXOlnold.js.map → users-DWQ-ojf9.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CBOM6Es0.js → vendor-icons-YdqUbzg6.js} +110 -100
- package/dashboard/dist/assets/vendor-icons-YdqUbzg6.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Yq7cK-vR.js → workflows-BvGU8_fj.js} +2 -2
- package/dashboard/dist/assets/{workflows-Yq7cK-vR.js.map → workflows-BvGU8_fj.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js → yaml-workflows-DNgb7krQ.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js.map → yaml-workflows-DNgb7krQ.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/agents.md +1 -1
- package/docs/api/http/agents.md +5 -7
- package/docs/api/http/controlplane.md +193 -0
- package/docs/api/sdk/agents.md +5 -5
- package/docs/api/sdk/controlplane.md +36 -0
- package/docs/dashboard.md +13 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +0 -2
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +0 -2
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js +0 -2
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +0 -2
- package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +0 -2
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +0 -2
- package/dashboard/dist/assets/agents-Dga6NU7U.js.map +0 -1
- package/dashboard/dist/assets/index-6Kd78p_v.js +0 -2
- package/dashboard/dist/assets/index-BIUHY2Jz.css +0 -1
- package/dashboard/dist/assets/index-CCOSf1PY.js.map +0 -1
- package/dashboard/dist/assets/topics-p8anbgi0.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-6Kd78p_v.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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"}
|
|
1
|
+
{"version":3,"file":"index-BVVdr9s0.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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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./index-CCOSf1PY.js";import{a as v}from"./vendor-query-DLp59M9_.js";import{d as B,e as H,f as $,g as z}from"./mcp-CsLJ5SRm.js";import{S as O}from"./StepIndicator-CP7eycjI.js";import{P as U}from"./PageHeader-COcgWWf-.js";import{T as J}from"./TagInput-BGxXKiWD.js";import{X as Y,z as q,ae as K,af as X}from"./vendor-icons-CBOM6Es0.js";import{e as G,c as W,f as Q}from"./vendor-react-Co3Y8ikm.js";const _={name:"",description:"",mode:"network",transport_type:"sse",command:"",args:"",env_vars:"{}",url:"",auto_connect:!1,tags:[],compile_hints:"",credential_providers:[],discovered_tools:null};function Z(s){const a=s.transport_config??{},t=!!a.builtin;let r="network";return t?r="in-process":s.transport_type==="stdio"&&(r="local-process"),{name:s.name,description:s.description??"",mode:r,transport_type:s.transport_type,command:a.command??"",args:(a.args??[]).join(", "),env_vars:a.env?JSON.stringify(a.env,null,2):"{}",url:a.url??"",auto_connect:s.auto_connect,tags:s.tags??[],compile_hints:s.compile_hints??"",credential_providers:s.credential_providers??[],discovered_tools:s.tool_manifest??null}}function R(s){let a={};return s.mode==="local-process"?a={command:s.command.trim(),args:s.args.split(",").map(t=>t.trim()).filter(Boolean),env:s.env_vars.trim()?JSON.parse(s.env_vars):void 0}:s.mode==="network"&&(a={url:s.url.trim()}),{name:s.name.trim(),description:s.description.trim()||void 0,transport_type:s.mode==="local-process"?"stdio":s.transport_type,transport_config:a,auto_connect:s.auto_connect,tags:s.tags,compile_hints:s.compile_hints.trim()||void 0,credential_providers:s.credential_providers.length>0?s.credential_providers:void 0}}const P=["Transport","Discovery","Test","Review"];function C(s,a){return s===1?!(!a.name.trim()||a.mode==="network"&&!a.url.trim()||a.mode==="local-process"&&!a.command.trim()):!0}const p="label",N="hint",ee=[{value:"in-process",label:"In-Process",hint:"Built-in server running inside the app"},{value:"network",label:"Network Service",hint:"Remote server via SSE or Streamable HTTP"},{value:"local-process",label:"Local Process",hint:"Spawn a local command via stdio"}];function se({form:s,set:a,isBuiltin:t}){return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Connection Mode"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:21,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-3 gap-3 mt-1",children:ee.map(r=>{const n=s.mode===r.value,l=t&&r.value!=="in-process";return e.jsxDEV("button",{type:"button",disabled:l,onClick:()=>{a("mode",r.value),r.value==="local-process"&&a("transport_type","stdio"),r.value==="network"&&a("transport_type","sse")},className:`text-left p-3 rounded-md border transition-colors ${n?"border-accent bg-accent/5":l?"border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed":"border-surface-border hover:border-text-tertiary cursor-pointer"}`,children:[e.jsxDEV("span",{className:`text-xs font-medium ${n?"text-accent":"text-text-primary"}`,children:r.label},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:44,columnNumber:17},this),e.jsxDEV("span",{className:"block text-[10px] text-text-tertiary mt-0.5",children:r.hint},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:47,columnNumber:17},this)]},r.value,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:27,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:57,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:s.name,onChange:r=>a("name",r.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full",disabled:t},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:56,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:68,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:s.description,onChange:r=>a("description",r.target.value),placeholder:"Optional description",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:55,columnNumber:7},this),s.mode==="in-process"&&e.jsxDEV("div",{children:e.jsxDEV("p",{className:N,children:"This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:82,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:81,columnNumber:9},this),s.mode==="network"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Server URL"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.url,onChange:r=>a("url",r.target.value),placeholder:"https://mcp-server.example.com/sse",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:93,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:91,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Transport Protocol"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:102,columnNumber:13},this),e.jsxDEV("div",{className:"flex gap-2 mt-1",children:["sse","streamable-http"].map(r=>e.jsxDEV("button",{type:"button",onClick:()=>a("transport_type",r),className:`px-3 py-1.5 text-xs rounded-md border transition-colors ${s.transport_type===r?"border-accent bg-accent/5 text-accent font-medium":"border-surface-border text-text-secondary hover:border-text-tertiary"}`,children:r==="sse"?"SSE":"Streamable HTTP"},r,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:105,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:103,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:101,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:90,columnNumber:9},this),s.mode==="local-process"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Command"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:127,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.command,onChange:r=>a("command",r.target.value),placeholder:"e.g., npx",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:128,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:126,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Arguments (comma-separated)"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:137,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.args,onChange:r=>a("args",r.target.value),placeholder:"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:138,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:136,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Environment Variables (JSON)"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:147,columnNumber:13},this),e.jsxDEV("textarea",{value:s.env_vars,onChange:r=>a("env_vars",r.target.value),className:"input-json w-full",rows:3,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:148,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:146,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:s.auto_connect,onChange:r=>a("auto_connect",r.target.checked),className:"w-4 h-4 rounded border-border accent-accent"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:161,columnNumber:9},this),e.jsxDEV("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:167,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:160,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:18,columnNumber:5},this)}function ae({form:s,set:a}){const[t,r]=v.useState(""),n=i=>{const c=i.trim().toLowerCase();c&&!s.credential_providers.includes(c)&&a("credential_providers",[...s.credential_providers,c]),r("")},l=i=>{a("credential_providers",s.credential_providers.filter(c=>c!==i))},d=i=>{i.key==="Enter"||i.key===","?(i.preventDefault(),n(t)):i.key==="Backspace"&&!t&&s.credential_providers.length>0&&l(s.credential_providers[s.credential_providers.length-1])};return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:40,columnNumber:9},this),e.jsxDEV(J,{tags:s.tags,onChange:i=>a("tags",i),placeholder:"Add tag (e.g., database, analytics)..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:41,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:39,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Compile Hints"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:53,columnNumber:9},this),e.jsxDEV("textarea",{value:s.compile_hints,onChange:i=>a("compile_hints",i.target.value),placeholder:"Guidance for the workflow compiler when generating YAML from this server's tools...",className:"input text-xs w-full leading-relaxed",rows:4,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:62,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:52,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Credential Providers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:69,columnNumber:9},this),e.jsxDEV("div",{className:"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary",children:[s.credential_providers.map(i=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[i,e.jsxDEV("button",{type:"button",onClick:()=>l(i),className:"hover:text-status-error transition-colors",children:e.jsxDEV(Y,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:82,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:77,columnNumber:15},this)]},i,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:72,columnNumber:13},this)),e.jsxDEV("input",{type:"text",value:t,onChange:i=>r(i.target.value),onKeyDown:d,onBlur:()=>{t.trim()&&n(t)},placeholder:s.credential_providers.length===0?"Add provider (e.g., github, slack)...":"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:86,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:70,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:96,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:68,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:37,columnNumber:5},this)}function re({form:s,set:a}){const t=B(),r=s.mode==="in-process",n=()=>{const i=R(s);t.mutate({transport_type:i.transport_type,transport_config:i.transport_config},{onSuccess:c=>{c.success&&a("discovered_tools",c.tools)}})},l=t.data,d=s.discovered_tools??(l==null?void 0:l.tools)??[];return e.jsxDEV("div",{className:"space-y-5",children:r?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"In-process servers connect lazily on first tool call. No connection test needed."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:37,columnNumber:11},this),s.discovered_tools&&s.discovered_tools.length>0&&e.jsxDEV("div",{className:"mt-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-2",children:[s.discovered_tools.length," tool",s.discovered_tools.length!==1?"s":""," cached from last connection"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:42,columnNumber:15},this),e.jsxDEV(k,{tools:s.discovered_tools},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:45,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:41,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:36,columnNumber:9},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("button",{type:"button",onClick:n,disabled:t.isPending,className:"btn-primary text-xs",children:t.isPending?e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(q,{className:"w-3 h-3 animate-spin"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:60,columnNumber:19},this),"Connecting..."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:59,columnNumber:17},this):"Test Connection"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:52,columnNumber:13},this),(l==null?void 0:l.success)&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-success",children:[e.jsxDEV(K,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:69,columnNumber:17},this),"Connected — ",d.length," tool",d.length!==1?"s":""," discovered"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:68,columnNumber:15},this),l&&!l.success&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-error",children:[e.jsxDEV(X,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:75,columnNumber:17},this),l.error||"Connection failed"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:74,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:51,columnNumber:11},this),d.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-2",children:"Discovered tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:83,columnNumber:15},this),e.jsxDEV(k,{tools:d},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:84,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:82,columnNumber:13},this),e.jsxDEV("p",{className:N,children:"Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:88,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:50,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:34,columnNumber:5},this)}function k({tools:s}){return e.jsxDEV("div",{className:"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border",children:s.map(a=>e.jsxDEV("div",{className:"px-3 py-2",children:[e.jsxDEV("span",{className:"text-xs font-medium text-text-primary font-mono",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:102,columnNumber:11},this),a.description&&e.jsxDEV("span",{className:"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2",children:a.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:104,columnNumber:13},this)]},a.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:101,columnNumber:9},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:99,columnNumber:5},this)}const te={"in-process":"In-Process",network:"Network Service","local-process":"Local Process"},ie={stdio:"stdio",sse:"SSE","streamable-http":"Streamable HTTP"};function le({form:s}){const a=s.discovered_tools??[];return e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV(m,{label:"Name",value:s.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:25,columnNumber:7},this),s.description&&e.jsxDEV(m,{label:"Description",value:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:26,columnNumber:28},this),e.jsxDEV(m,{label:"Mode",value:te[s.mode]??s.mode},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:27,columnNumber:7},this),s.mode==="network"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(m,{label:"Transport",value:ie[s.transport_type]??s.transport_type},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:31,columnNumber:11},this),e.jsxDEV(m,{label:"URL",value:s.url,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:30,columnNumber:9},this),s.mode==="local-process"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(m,{label:"Command",value:s.command,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:37,columnNumber:11},this),s.args&&e.jsxDEV(m,{label:"Args",value:s.args,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:38,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:36,columnNumber:9},this),e.jsxDEV(m,{label:"Auto-connect",value:s.auto_connect?"Yes":"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:42,columnNumber:7},this),s.tags.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:46,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.tags.map(t=>e.jsxDEV("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:t},t,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:49,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:45,columnNumber:9},this),s.credential_providers.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Credential Providers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:59,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.credential_providers.map(t=>e.jsxDEV("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:t},t,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:62,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:58,columnNumber:9},this),s.compile_hints&&e.jsxDEV(m,{label:"Compile Hints",value:s.compile_hints},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:70,columnNumber:30},this),a.length>0&&e.jsxDEV(m,{label:"Discovered Tools",value:`${a.length} tool${a.length!==1?"s":""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:73,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:24,columnNumber:5},this)}function m({label:s,value:a,mono:t}){return e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:82,columnNumber:7},this),e.jsxDEV("p",{className:`text-xs text-text-primary mt-0.5 ${t?"font-mono":""}`,children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:83,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:81,columnNumber:5},this)}function be(){var y,T,w;const{serverId:s}=G(),a=!s,t=W(),{data:r,isLoading:n}=H(s??""),l=$(),d=z(),[i,c]=v.useState(_),[f,S]=v.useState(!1),[M,D]=v.useState(""),[L,E]=Q(),o=parseInt(L.get("step")||"1",10),x=v.useCallback(u=>{E(b=>{const h=new URLSearchParams(b);return h.set("step",String(u)),h},{replace:!1})},[E]);v.useEffect(()=>{if(!f){if(a){c(_),S(!0);return}r&&(c(Z(r)),S(!0))}},[r,a,f]);const g=(u,b)=>c(h=>({...h,[u]:b})),I=!!((y=r==null?void 0:r.transport_config)!=null&&y.builtin),A=()=>{D("");const u=R(i);r?d.mutate({id:r.id,...u},{onSuccess:()=>t("/mcp/servers")}):l.mutate(u,{onSuccess:()=>t("/mcp/servers"),onError:b=>D(b.message)})};if(!a&&n)return e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV("div",{className:"h-60 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:83,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:81,columnNumber:7},this);if(!a&&!r&&!n)return e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"Server not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:89,columnNumber:12},this);const F=o===P.length,j=l.isPending||d.isPending,V=M||((T=l.error)==null?void 0:T.message)||((w=d.error)==null?void 0:w.message);return e.jsxDEV("div",{children:[e.jsxDEV(U,{title:a?"Register MCP Server":(r==null?void 0:r.name)??""},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:98,columnNumber:7},this),e.jsxDEV("div",{className:"max-w-3xl",children:[e.jsxDEV(O,{steps:P,currentStep:o-1,onStepClick:u=>x(u+1)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:101,columnNumber:9},this),e.jsxDEV("div",{className:"min-h-[360px] py-2",children:[o===1&&e.jsxDEV(se,{form:i,set:g,isBuiltin:I},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:104,columnNumber:26},this),o===2&&e.jsxDEV(ae,{form:i,set:g},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:105,columnNumber:26},this),o===3&&e.jsxDEV(re,{form:i,set:g},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:106,columnNumber:26},this),o===4&&e.jsxDEV(le,{form:i},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:107,columnNumber:26},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:103,columnNumber:9},this),V&&e.jsxDEV("p",{className:"text-xs text-status-error mt-4",children:V},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:111,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsxDEV("div",{children:o>1&&e.jsxDEV("button",{onClick:()=>x(o-1),className:"btn-secondary text-xs",children:"Back"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:118,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:116,columnNumber:11},this),e.jsxDEV("div",{className:"flex gap-3",children:[e.jsxDEV("button",{onClick:()=>t("/mcp/servers"),className:"btn-ghost text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:124,columnNumber:13},this),F?e.jsxDEV("button",{onClick:A,disabled:!C(o,i)||j,className:"btn-primary text-xs",children:j?"Saving...":r?"Save":"Register"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:128,columnNumber:15},this):e.jsxDEV("button",{onClick:()=>x(o+1),disabled:!C(o,i),className:"btn-primary text-xs",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:136,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:123,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:115,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:100,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:97,columnNumber:5},this)}export{be as McpServerDetailPage};
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as e}from"./index-MnRuwfHN.js";import{a as v}from"./vendor-query-DLp59M9_.js";import{d as B,e as H,f as $,g as O}from"./mcp-BTZ2ex4x.js";import{S as U}from"./StepIndicator-ziIED3Pz.js";import{P as z}from"./PageHeader-C4DNgZKA.js";import{T as J}from"./TagInput-BYEjEPsa.js";import{X as Y,J as q,ai as K,aj as X}from"./vendor-icons-YdqUbzg6.js";import{e as G,c as W,f as Q}from"./vendor-react-Co3Y8ikm.js";const _={name:"",description:"",mode:"network",transport_type:"sse",command:"",args:"",env_vars:"{}",url:"",auto_connect:!1,tags:[],compile_hints:"",credential_providers:[],discovered_tools:null};function Z(s){const a=s.transport_config??{},t=!!a.builtin;let r="network";return t?r="in-process":s.transport_type==="stdio"&&(r="local-process"),{name:s.name,description:s.description??"",mode:r,transport_type:s.transport_type,command:a.command??"",args:(a.args??[]).join(", "),env_vars:a.env?JSON.stringify(a.env,null,2):"{}",url:a.url??"",auto_connect:s.auto_connect,tags:s.tags??[],compile_hints:s.compile_hints??"",credential_providers:s.credential_providers??[],discovered_tools:s.tool_manifest??null}}function R(s){let a={};return s.mode==="local-process"?a={command:s.command.trim(),args:s.args.split(",").map(t=>t.trim()).filter(Boolean),env:s.env_vars.trim()?JSON.parse(s.env_vars):void 0}:s.mode==="network"&&(a={url:s.url.trim()}),{name:s.name.trim(),description:s.description.trim()||void 0,transport_type:s.mode==="local-process"?"stdio":s.transport_type,transport_config:a,auto_connect:s.auto_connect,tags:s.tags,compile_hints:s.compile_hints.trim()||void 0,credential_providers:s.credential_providers.length>0?s.credential_providers:void 0}}const P=["Transport","Discovery","Test","Review"];function C(s,a){return s===1?!(!a.name.trim()||a.mode==="network"&&!a.url.trim()||a.mode==="local-process"&&!a.command.trim()):!0}const p="label",N="hint",ee=[{value:"in-process",label:"In-Process",hint:"Built-in server running inside the app"},{value:"network",label:"Network Service",hint:"Remote server via SSE or Streamable HTTP"},{value:"local-process",label:"Local Process",hint:"Spawn a local command via stdio"}];function se({form:s,set:a,isBuiltin:t}){return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Connection Mode"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:21,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-3 gap-3 mt-1",children:ee.map(r=>{const n=s.mode===r.value,l=t&&r.value!=="in-process";return e.jsxDEV("button",{type:"button",disabled:l,onClick:()=>{a("mode",r.value),r.value==="local-process"&&a("transport_type","stdio"),r.value==="network"&&a("transport_type","sse")},className:`text-left p-3 rounded-md border transition-colors ${n?"border-accent bg-accent/5":l?"border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed":"border-surface-border hover:border-text-tertiary cursor-pointer"}`,children:[e.jsxDEV("span",{className:`text-xs font-medium ${n?"text-accent":"text-text-primary"}`,children:r.label},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:44,columnNumber:17},this),e.jsxDEV("span",{className:"block text-[10px] text-text-tertiary mt-0.5",children:r.hint},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:47,columnNumber:17},this)]},r.value,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:27,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:57,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:s.name,onChange:r=>a("name",r.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full",disabled:t},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:56,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:68,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:s.description,onChange:r=>a("description",r.target.value),placeholder:"Optional description",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:55,columnNumber:7},this),s.mode==="in-process"&&e.jsxDEV("div",{children:e.jsxDEV("p",{className:N,children:"This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:82,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:81,columnNumber:9},this),s.mode==="network"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Server URL"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.url,onChange:r=>a("url",r.target.value),placeholder:"https://mcp-server.example.com/sse",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:93,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:91,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Transport Protocol"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:102,columnNumber:13},this),e.jsxDEV("div",{className:"flex gap-2 mt-1",children:["sse","streamable-http"].map(r=>e.jsxDEV("button",{type:"button",onClick:()=>a("transport_type",r),className:`px-3 py-1.5 text-xs rounded-md border transition-colors ${s.transport_type===r?"border-accent bg-accent/5 text-accent font-medium":"border-surface-border text-text-secondary hover:border-text-tertiary"}`,children:r==="sse"?"SSE":"Streamable HTTP"},r,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:105,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:103,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:101,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:90,columnNumber:9},this),s.mode==="local-process"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Command"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:127,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.command,onChange:r=>a("command",r.target.value),placeholder:"e.g., npx",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:128,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:126,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Arguments (comma-separated)"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:137,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.args,onChange:r=>a("args",r.target.value),placeholder:"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:138,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:136,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Environment Variables (JSON)"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:147,columnNumber:13},this),e.jsxDEV("textarea",{value:s.env_vars,onChange:r=>a("env_vars",r.target.value),className:"input-json w-full",rows:3,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:148,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:146,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:s.auto_connect,onChange:r=>a("auto_connect",r.target.checked),className:"w-4 h-4 rounded border-border accent-accent"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:161,columnNumber:9},this),e.jsxDEV("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:167,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:160,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:18,columnNumber:5},this)}function ae({form:s,set:a}){const[t,r]=v.useState(""),n=i=>{const c=i.trim().toLowerCase();c&&!s.credential_providers.includes(c)&&a("credential_providers",[...s.credential_providers,c]),r("")},l=i=>{a("credential_providers",s.credential_providers.filter(c=>c!==i))},d=i=>{i.key==="Enter"||i.key===","?(i.preventDefault(),n(t)):i.key==="Backspace"&&!t&&s.credential_providers.length>0&&l(s.credential_providers[s.credential_providers.length-1])};return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:40,columnNumber:9},this),e.jsxDEV(J,{tags:s.tags,onChange:i=>a("tags",i),placeholder:"Add tag (e.g., database, analytics)..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:41,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:39,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Compile Hints"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:53,columnNumber:9},this),e.jsxDEV("textarea",{value:s.compile_hints,onChange:i=>a("compile_hints",i.target.value),placeholder:"Guidance for the workflow compiler when generating YAML from this server's tools...",className:"input text-xs w-full leading-relaxed",rows:4,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:62,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:52,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Credential Providers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:69,columnNumber:9},this),e.jsxDEV("div",{className:"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary",children:[s.credential_providers.map(i=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[i,e.jsxDEV("button",{type:"button",onClick:()=>l(i),className:"hover:text-status-error transition-colors",children:e.jsxDEV(Y,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:82,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:77,columnNumber:15},this)]},i,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:72,columnNumber:13},this)),e.jsxDEV("input",{type:"text",value:t,onChange:i=>r(i.target.value),onKeyDown:d,onBlur:()=>{t.trim()&&n(t)},placeholder:s.credential_providers.length===0?"Add provider (e.g., github, slack)...":"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:86,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:70,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:96,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:68,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:37,columnNumber:5},this)}function re({form:s,set:a}){const t=B(),r=s.mode==="in-process",n=()=>{const i=R(s);t.mutate({transport_type:i.transport_type,transport_config:i.transport_config},{onSuccess:c=>{c.success&&a("discovered_tools",c.tools)}})},l=t.data,d=s.discovered_tools??(l==null?void 0:l.tools)??[];return e.jsxDEV("div",{className:"space-y-5",children:r?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"In-process servers connect lazily on first tool call. No connection test needed."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:37,columnNumber:11},this),s.discovered_tools&&s.discovered_tools.length>0&&e.jsxDEV("div",{className:"mt-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-2",children:[s.discovered_tools.length," tool",s.discovered_tools.length!==1?"s":""," cached from last connection"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:42,columnNumber:15},this),e.jsxDEV(k,{tools:s.discovered_tools},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:45,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:41,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:36,columnNumber:9},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("button",{type:"button",onClick:n,disabled:t.isPending,className:"btn-primary text-xs",children:t.isPending?e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(q,{className:"w-3 h-3 animate-spin"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:60,columnNumber:19},this),"Connecting..."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:59,columnNumber:17},this):"Test Connection"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:52,columnNumber:13},this),(l==null?void 0:l.success)&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-success",children:[e.jsxDEV(K,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:69,columnNumber:17},this),"Connected — ",d.length," tool",d.length!==1?"s":""," discovered"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:68,columnNumber:15},this),l&&!l.success&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-error",children:[e.jsxDEV(X,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:75,columnNumber:17},this),l.error||"Connection failed"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:74,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:51,columnNumber:11},this),d.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-2",children:"Discovered tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:83,columnNumber:15},this),e.jsxDEV(k,{tools:d},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:84,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:82,columnNumber:13},this),e.jsxDEV("p",{className:N,children:"Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:88,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:50,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:34,columnNumber:5},this)}function k({tools:s}){return e.jsxDEV("div",{className:"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border",children:s.map(a=>e.jsxDEV("div",{className:"px-3 py-2",children:[e.jsxDEV("span",{className:"text-xs font-medium text-text-primary font-mono",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:102,columnNumber:11},this),a.description&&e.jsxDEV("span",{className:"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2",children:a.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:104,columnNumber:13},this)]},a.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:101,columnNumber:9},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:99,columnNumber:5},this)}const te={"in-process":"In-Process",network:"Network Service","local-process":"Local Process"},ie={stdio:"stdio",sse:"SSE","streamable-http":"Streamable HTTP"};function le({form:s}){const a=s.discovered_tools??[];return e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV(m,{label:"Name",value:s.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:25,columnNumber:7},this),s.description&&e.jsxDEV(m,{label:"Description",value:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:26,columnNumber:28},this),e.jsxDEV(m,{label:"Mode",value:te[s.mode]??s.mode},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:27,columnNumber:7},this),s.mode==="network"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(m,{label:"Transport",value:ie[s.transport_type]??s.transport_type},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:31,columnNumber:11},this),e.jsxDEV(m,{label:"URL",value:s.url,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:30,columnNumber:9},this),s.mode==="local-process"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(m,{label:"Command",value:s.command,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:37,columnNumber:11},this),s.args&&e.jsxDEV(m,{label:"Args",value:s.args,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:38,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:36,columnNumber:9},this),e.jsxDEV(m,{label:"Auto-connect",value:s.auto_connect?"Yes":"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:42,columnNumber:7},this),s.tags.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:46,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.tags.map(t=>e.jsxDEV("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:t},t,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:49,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:45,columnNumber:9},this),s.credential_providers.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Credential Providers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:59,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.credential_providers.map(t=>e.jsxDEV("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:t},t,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:62,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:58,columnNumber:9},this),s.compile_hints&&e.jsxDEV(m,{label:"Compile Hints",value:s.compile_hints},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:70,columnNumber:30},this),a.length>0&&e.jsxDEV(m,{label:"Discovered Tools",value:`${a.length} tool${a.length!==1?"s":""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:73,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:24,columnNumber:5},this)}function m({label:s,value:a,mono:t}){return e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:82,columnNumber:7},this),e.jsxDEV("p",{className:`text-xs text-text-primary mt-0.5 ${t?"font-mono":""}`,children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:83,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:81,columnNumber:5},this)}function be(){var y,T,w;const{serverId:s}=G(),a=!s,t=W(),{data:r,isLoading:n}=H(s??""),l=$(),d=O(),[i,c]=v.useState(_),[f,S]=v.useState(!1),[M,D]=v.useState(""),[L,E]=Q(),o=parseInt(L.get("step")||"1",10),x=v.useCallback(u=>{E(b=>{const h=new URLSearchParams(b);return h.set("step",String(u)),h},{replace:!1})},[E]);v.useEffect(()=>{if(!f){if(a){c(_),S(!0);return}r&&(c(Z(r)),S(!0))}},[r,a,f]);const g=(u,b)=>c(h=>({...h,[u]:b})),I=!!((y=r==null?void 0:r.transport_config)!=null&&y.builtin),A=()=>{D("");const u=R(i);r?d.mutate({id:r.id,...u},{onSuccess:()=>t("/mcp/servers")}):l.mutate(u,{onSuccess:()=>t("/mcp/servers"),onError:b=>D(b.message)})};if(!a&&n)return e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV("div",{className:"h-60 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:83,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:81,columnNumber:7},this);if(!a&&!r&&!n)return e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"Server not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:89,columnNumber:12},this);const F=o===P.length,j=l.isPending||d.isPending,V=M||((T=l.error)==null?void 0:T.message)||((w=d.error)==null?void 0:w.message);return e.jsxDEV("div",{children:[e.jsxDEV(z,{title:a?"Register MCP Server":(r==null?void 0:r.name)??""},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:98,columnNumber:7},this),e.jsxDEV("div",{className:"max-w-3xl",children:[e.jsxDEV(U,{steps:P,currentStep:o-1,onStepClick:u=>x(u+1)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:101,columnNumber:9},this),e.jsxDEV("div",{className:"min-h-[360px] py-2",children:[o===1&&e.jsxDEV(se,{form:i,set:g,isBuiltin:I},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:104,columnNumber:26},this),o===2&&e.jsxDEV(ae,{form:i,set:g},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:105,columnNumber:26},this),o===3&&e.jsxDEV(re,{form:i,set:g},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:106,columnNumber:26},this),o===4&&e.jsxDEV(le,{form:i},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:107,columnNumber:26},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:103,columnNumber:9},this),V&&e.jsxDEV("p",{className:"text-xs text-status-error mt-4",children:V},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:111,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsxDEV("div",{children:o>1&&e.jsxDEV("button",{onClick:()=>x(o-1),className:"btn-secondary text-xs",children:"Back"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:118,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:116,columnNumber:11},this),e.jsxDEV("div",{className:"flex gap-3",children:[e.jsxDEV("button",{onClick:()=>t("/mcp/servers"),className:"btn-ghost text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:124,columnNumber:13},this),F?e.jsxDEV("button",{onClick:A,disabled:!C(o,i)||j,className:"btn-primary text-xs",children:j?"Saving...":r?"Save":"Register"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:128,columnNumber:15},this):e.jsxDEV("button",{onClick:()=>x(o+1),disabled:!C(o,i),className:"btn-primary text-xs",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:136,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:123,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:115,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:100,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:97,columnNumber:5},this)}export{be as McpServerDetailPage};
|
|
2
|
+
//# sourceMappingURL=index-BXIwxi_u.js.map
|