@hotmeshio/long-tail 0.1.15 → 0.1.16

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.
Files changed (170) hide show
  1. package/build/api/settings.js +0 -3
  2. package/build/api/yaml-workflows/crud.js +25 -5
  3. package/build/index.d.ts +1 -1
  4. package/build/lib/db/schemas/schemas/001_schema.sql +485 -0
  5. package/build/lib/db/schemas/schemas/002_seed.sql +92 -0
  6. package/build/lib/events/socketio.d.ts +12 -0
  7. package/build/lib/events/socketio.js +24 -1
  8. package/build/routes/index.js +2 -0
  9. package/build/routes/nats-credentials.d.ts +2 -0
  10. package/build/routes/nats-credentials.js +22 -0
  11. package/build/services/yaml-workflow/workers/register.js +4 -2
  12. package/build/start/adapters.js +4 -1
  13. package/build/start/socket-auth.d.ts +13 -0
  14. package/build/start/socket-auth.js +32 -0
  15. package/build/tsconfig.tsbuildinfo +1 -1
  16. package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js → AdminDashboard-Bprul9Eb.js} +2 -2
  17. package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js.map → AdminDashboard-Bprul9Eb.js.map} +1 -1
  18. package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js → AvailableEscalationsPage-H_z5mC10.js} +2 -2
  19. package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js.map → AvailableEscalationsPage-H_z5mC10.js.map} +1 -1
  20. package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js → BotPicker-DcvILNUf.js} +2 -2
  21. package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js.map → BotPicker-DcvILNUf.js.map} +1 -1
  22. package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js → CollapsibleSection-BWPbzgEe.js} +2 -2
  23. package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js.map → CollapsibleSection-BWPbzgEe.js.map} +1 -1
  24. package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js → ConfirmDeleteModal-Cy6KVLfC.js} +2 -2
  25. package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js.map → ConfirmDeleteModal-Cy6KVLfC.js.map} +1 -1
  26. package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js → CopyableId-CRED8hvk.js} +2 -2
  27. package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js.map → CopyableId-CRED8hvk.js.map} +1 -1
  28. package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js → CredentialsPage-BUdvxiE3.js} +2 -2
  29. package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js.map → CredentialsPage-BUdvxiE3.js.map} +1 -1
  30. package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js → CustomDurationPicker-eOk2EqQ5.js} +2 -2
  31. package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js.map → CustomDurationPicker-eOk2EqQ5.js.map} +1 -1
  32. package/dashboard/dist/assets/{DataTable-DXSUbA26.js → DataTable-bd2PTBJd.js} +2 -2
  33. package/dashboard/dist/assets/{DataTable-DXSUbA26.js.map → DataTable-bd2PTBJd.js.map} +1 -1
  34. package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js → ElapsedCell-BGo8vyus.js} +2 -2
  35. package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js.map → ElapsedCell-BGo8vyus.js.map} +1 -1
  36. package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js → EmptyState-BygtU-Rh.js} +2 -2
  37. package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js.map → EmptyState-BygtU-Rh.js.map} +1 -1
  38. package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js → EscalationsOverview-DUEcN5MP.js} +2 -2
  39. package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js.map → EscalationsOverview-DUEcN5MP.js.map} +1 -1
  40. package/dashboard/dist/assets/{EventTable-BMJAPkMi.js → EventTable-CmFhswLW.js} +2 -2
  41. package/dashboard/dist/assets/{EventTable-BMJAPkMi.js.map → EventTable-CmFhswLW.js.map} +1 -1
  42. package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js → FilterBar-BQNzsd3A.js} +2 -2
  43. package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js.map → FilterBar-BQNzsd3A.js.map} +1 -1
  44. package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js → ListToolbar-OWOn-HiC.js} +2 -2
  45. package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js.map → ListToolbar-OWOn-HiC.js.map} +1 -1
  46. package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js → McpOverview-OkEzvClD.js} +2 -2
  47. package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js.map → McpOverview-OkEzvClD.js.map} +1 -1
  48. package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js → McpQueryDetailPage-C6Ih5sC_.js} +2 -2
  49. package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js.map → McpQueryDetailPage-C6Ih5sC_.js.map} +1 -1
  50. package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js → McpQueryPage-BAuOf5TL.js} +2 -2
  51. package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js.map → McpQueryPage-BAuOf5TL.js.map} +1 -1
  52. package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js → McpRunDetailPage-DMeiG4i_.js} +2 -2
  53. package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js.map → McpRunDetailPage-DMeiG4i_.js.map} +1 -1
  54. package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js → McpRunsPage-CG3cNJh8.js} +2 -2
  55. package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js.map → McpRunsPage-CG3cNJh8.js.map} +1 -1
  56. package/dashboard/dist/assets/{Modal-yyhUeKoA.js → Modal-Dir9Rlnx.js} +2 -2
  57. package/dashboard/dist/assets/{Modal-yyhUeKoA.js.map → Modal-Dir9Rlnx.js.map} +1 -1
  58. package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js → OperatorDashboard-OqWC6Azy.js} +2 -2
  59. package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js.map → OperatorDashboard-OqWC6Azy.js.map} +1 -1
  60. package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js → PageHeader-FJIemmrC.js} +2 -2
  61. package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js.map → PageHeader-FJIemmrC.js.map} +1 -1
  62. package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js → PageHeaderWithStats-Br5y9qNO.js} +2 -2
  63. package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js.map → PageHeaderWithStats-Br5y9qNO.js.map} +1 -1
  64. package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js → PriorityBadge-C7D5d_HY.js} +2 -2
  65. package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js.map → PriorityBadge-C7D5d_HY.js.map} +1 -1
  66. package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js → ProcessDetailPage-DZIP6grw.js} +2 -2
  67. package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js.map → ProcessDetailPage-DZIP6grw.js.map} +1 -1
  68. package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js → ProcessesListPage-BQoPYkeB.js} +2 -2
  69. package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js.map → ProcessesListPage-BQoPYkeB.js.map} +1 -1
  70. package/dashboard/dist/assets/{RolePill-DxbJMfJu.js → RolePill-D6nMxMvp.js} +2 -2
  71. package/dashboard/dist/assets/{RolePill-DxbJMfJu.js.map → RolePill-D6nMxMvp.js.map} +1 -1
  72. package/dashboard/dist/assets/{RolesPage-CYHRo21-.js → RolesPage-CwLnJFhy.js} +2 -2
  73. package/dashboard/dist/assets/{RolesPage-CYHRo21-.js.map → RolesPage-CwLnJFhy.js.map} +1 -1
  74. package/dashboard/dist/assets/{RowActions-DurFwIwe.js → RowActions-JqgAB0p3.js} +2 -2
  75. package/dashboard/dist/assets/{RowActions-DurFwIwe.js.map → RowActions-JqgAB0p3.js.map} +1 -1
  76. package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js → RunAsSelector-KAlKtitB.js} +2 -2
  77. package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js.map → RunAsSelector-KAlKtitB.js.map} +1 -1
  78. package/dashboard/dist/assets/{StatCard-CKplpK3w.js → StatCard-B-WLhOaH.js} +2 -2
  79. package/dashboard/dist/assets/{StatCard-CKplpK3w.js.map → StatCard-B-WLhOaH.js.map} +1 -1
  80. package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js → StatusBadge-DVCf2ncM.js} +2 -2
  81. package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js.map → StatusBadge-DVCf2ncM.js.map} +1 -1
  82. package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js → StepIndicator-D9Xvdf18.js} +2 -2
  83. package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js.map → StepIndicator-D9Xvdf18.js.map} +1 -1
  84. package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js → StickyPagination-CJHMzYJj.js} +2 -2
  85. package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js.map → StickyPagination-CJHMzYJj.js.map} +1 -1
  86. package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js → SwimlaneTimeline-YiXPDyEL.js} +2 -2
  87. package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js.map → SwimlaneTimeline-YiXPDyEL.js.map} +1 -1
  88. package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js → TagInput-DcPnUnSJ.js} +2 -2
  89. package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js.map → TagInput-DcPnUnSJ.js.map} +1 -1
  90. package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js → TaskDetailPage-DftmYWD7.js} +2 -2
  91. package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js.map → TaskDetailPage-DftmYWD7.js.map} +1 -1
  92. package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js → TaskQueuePill-BzduBqwy.js} +2 -2
  93. package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js.map → TaskQueuePill-BzduBqwy.js.map} +1 -1
  94. package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js → TasksListPage-DeewV4Gp.js} +2 -2
  95. package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js.map → TasksListPage-DeewV4Gp.js.map} +1 -1
  96. package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js → TimeAgo-DJZq-e4R.js} +2 -2
  97. package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js.map → TimeAgo-DJZq-e4R.js.map} +1 -1
  98. package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js → TimestampCell-Dx5uwGfS.js} +2 -2
  99. package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js.map → TimestampCell-Dx5uwGfS.js.map} +1 -1
  100. package/dashboard/dist/assets/{UserName-OPg-nkRa.js → UserName-CnGk7MgL.js} +2 -2
  101. package/dashboard/dist/assets/{UserName-OPg-nkRa.js.map → UserName-CnGk7MgL.js.map} +1 -1
  102. package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js → WorkflowExecutionPage-CPQ0fIwf.js} +2 -2
  103. package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js.map → WorkflowExecutionPage-CPQ0fIwf.js.map} +1 -1
  104. package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js → WorkflowPill-BrD5d1AG.js} +2 -2
  105. package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js.map → WorkflowPill-BrD5d1AG.js.map} +1 -1
  106. package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js → WorkflowsDashboard-BzjhABZP.js} +2 -2
  107. package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js.map → WorkflowsDashboard-BzjhABZP.js.map} +1 -1
  108. package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js → WorkflowsOverview-lBp2E6rN.js} +2 -2
  109. package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js.map → WorkflowsOverview-lBp2E6rN.js.map} +1 -1
  110. package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js → YamlWorkflowsPage-C_MkAp2i.js} +2 -2
  111. package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js.map → YamlWorkflowsPage-C_MkAp2i.js.map} +1 -1
  112. package/dashboard/dist/assets/{bots-Dqos20NE.js → bots-fc_O_YIq.js} +2 -2
  113. package/dashboard/dist/assets/{bots-Dqos20NE.js.map → bots-fc_O_YIq.js.map} +1 -1
  114. package/dashboard/dist/assets/{escalation-A0CsbvNV.js → escalation-BYhLYHBz.js} +2 -2
  115. package/dashboard/dist/assets/{escalation-A0CsbvNV.js.map → escalation-BYhLYHBz.js.map} +1 -1
  116. package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js → escalation-columns-DjJyuC1g.js} +2 -2
  117. package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js.map → escalation-columns-DjJyuC1g.js.map} +1 -1
  118. package/dashboard/dist/assets/{helpers-CmznCuAx.js → helpers-CQG3Rh2y.js} +2 -2
  119. package/dashboard/dist/assets/{helpers-CmznCuAx.js.map → helpers-CQG3Rh2y.js.map} +1 -1
  120. package/dashboard/dist/assets/{index-C8-UaN4N.js → index-2nBhR7Dg.js} +2 -2
  121. package/dashboard/dist/assets/{index-C8-UaN4N.js.map → index-2nBhR7Dg.js.map} +1 -1
  122. package/dashboard/dist/assets/{index-DZHNte4o.js → index-4IUoh_hd.js} +2 -2
  123. package/dashboard/dist/assets/{index-DZHNte4o.js.map → index-4IUoh_hd.js.map} +1 -1
  124. package/dashboard/dist/assets/{index-BIeYV5QK.js → index-B2CqPzLK.js} +2 -2
  125. package/dashboard/dist/assets/{index-BIeYV5QK.js.map → index-B2CqPzLK.js.map} +1 -1
  126. package/dashboard/dist/assets/{index-ZjOUzWhc.js → index-B78xalb4.js} +2 -2
  127. package/dashboard/dist/assets/{index-ZjOUzWhc.js.map → index-B78xalb4.js.map} +1 -1
  128. package/dashboard/dist/assets/{index-CjxHCVxl.js → index-BI8r69O_.js} +2 -2
  129. package/dashboard/dist/assets/{index-CjxHCVxl.js.map → index-BI8r69O_.js.map} +1 -1
  130. package/dashboard/dist/assets/{index-t5frSddy.js → index-CUqCBBZG.js} +2 -2
  131. package/dashboard/dist/assets/{index-t5frSddy.js.map → index-CUqCBBZG.js.map} +1 -1
  132. package/dashboard/dist/assets/{index-Cr0Rqsj7.js → index-D51PaQZY.js} +2 -2
  133. package/dashboard/dist/assets/{index-Cr0Rqsj7.js.map → index-D51PaQZY.js.map} +1 -1
  134. package/dashboard/dist/assets/{index-XGOmZ117.js → index-DNtXXy1o.js} +2 -2
  135. package/dashboard/dist/assets/{index-XGOmZ117.js.map → index-DNtXXy1o.js.map} +1 -1
  136. package/dashboard/dist/assets/{index-VnYkWW8r.js → index-DR4qQvlW.js} +2 -2
  137. package/dashboard/dist/assets/{index-VnYkWW8r.js.map → index-DR4qQvlW.js.map} +1 -1
  138. package/dashboard/dist/assets/{index-CAj5LT9H.js → index-Dh0PCbR-.js} +2 -2
  139. package/dashboard/dist/assets/{index-CAj5LT9H.js.map → index-Dh0PCbR-.js.map} +1 -1
  140. package/dashboard/dist/assets/{index-BYwD3kHN.js → index-KYpLvJKB.js} +2 -2
  141. package/dashboard/dist/assets/{index-BYwD3kHN.js.map → index-KYpLvJKB.js.map} +1 -1
  142. package/dashboard/dist/assets/{index-puKKZ5l8.js → index-sNrqYt0Q.js} +53 -53
  143. package/dashboard/dist/assets/index-sNrqYt0Q.js.map +1 -0
  144. package/dashboard/dist/assets/{mcp-DrWymhSu.js → mcp-D2XfRh8v.js} +2 -2
  145. package/dashboard/dist/assets/{mcp-DrWymhSu.js.map → mcp-D2XfRh8v.js.map} +1 -1
  146. package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js → mcp-query-CIx_mIC7.js} +2 -2
  147. package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js.map → mcp-query-CIx_mIC7.js.map} +1 -1
  148. package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js → mcp-runs-C9_J4LIH.js} +2 -2
  149. package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js.map → mcp-runs-C9_J4LIH.js.map} +1 -1
  150. package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js → namespaces-BwMljx6f.js} +2 -2
  151. package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js.map → namespaces-BwMljx6f.js.map} +1 -1
  152. package/dashboard/dist/assets/{roles-2v1Kc7BJ.js → roles-Bd_sTV6I.js} +2 -2
  153. package/dashboard/dist/assets/{roles-2v1Kc7BJ.js.map → roles-Bd_sTV6I.js.map} +1 -1
  154. package/dashboard/dist/assets/{settings-DTQNp6tH.js → settings-BCb8eFyA.js} +2 -2
  155. package/dashboard/dist/assets/{settings-DTQNp6tH.js.map → settings-BCb8eFyA.js.map} +1 -1
  156. package/dashboard/dist/assets/{tasks-CS1rgG1s.js → tasks-Bq54qGGq.js} +2 -2
  157. package/dashboard/dist/assets/{tasks-CS1rgG1s.js.map → tasks-Bq54qGGq.js.map} +1 -1
  158. package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js → useEventHooks-BTbGf536.js} +2 -2
  159. package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js.map → useEventHooks-BTbGf536.js.map} +1 -1
  160. package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js → useYamlActivityEvents-CsYP09W5.js} +2 -2
  161. package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js.map → useYamlActivityEvents-CsYP09W5.js.map} +1 -1
  162. package/dashboard/dist/assets/{users-DYsdQ7Md.js → users-BTBhafGc.js} +2 -2
  163. package/dashboard/dist/assets/{users-DYsdQ7Md.js.map → users-BTBhafGc.js.map} +1 -1
  164. package/dashboard/dist/assets/{workflows-2QAXh3UD.js → workflows-BkzA4ahe.js} +2 -2
  165. package/dashboard/dist/assets/{workflows-2QAXh3UD.js.map → workflows-BkzA4ahe.js.map} +1 -1
  166. package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js → yaml-workflows-Cs0EYp0F.js} +2 -2
  167. package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js.map → yaml-workflows-Cs0EYp0F.js.map} +1 -1
  168. package/dashboard/dist/index.html +1 -1
  169. package/package.json +1 -1
  170. package/dashboard/dist/assets/index-puKKZ5l8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-ZjOUzWhc.js","sources":["../../src/api/knowledge.ts","../../src/pages/knowledge/KnowledgeEntryView.tsx","../../src/pages/knowledge/KnowledgePage.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface KnowledgeDomain {\n domain: string;\n count: number;\n latest: string;\n}\n\nexport interface KnowledgeEntry {\n id: string;\n domain: string;\n key: string;\n data: Record<string, unknown>;\n tags: string[];\n created_at: string;\n updated_at: string;\n}\n\nexport interface ListDomainsResponse {\n domains: KnowledgeDomain[];\n}\n\nexport interface ListEntriesResponse {\n entries: KnowledgeEntry[];\n total: number;\n}\n\nexport function useListDomains() {\n return useQuery<ListDomainsResponse>({\n queryKey: ['knowledge', 'domains'],\n queryFn: () => apiFetch('/knowledge/domains'),\n });\n}\n\nexport function useListKnowledge(\n domain: string,\n opts?: { tags?: string[]; search?: string; limit?: number; offset?: number },\n) {\n const params = new URLSearchParams();\n params.set('domain', domain);\n if (opts?.tags?.length) params.set('tags', opts.tags.join(','));\n if (opts?.search) params.set('search', opts.search);\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n const qs = params.toString();\n\n return useQuery<ListEntriesResponse>({\n queryKey: ['knowledge', domain, opts?.tags, opts?.search, opts?.limit, opts?.offset],\n queryFn: () => apiFetch(`/knowledge/entries?${qs}`),\n enabled: !!domain,\n });\n}\n\nexport function useGetKnowledge(domain: string, key: string | null) {\n const params = new URLSearchParams();\n if (domain) params.set('domain', domain);\n if (key) params.set('key', key);\n const qs = params.toString();\n\n return useQuery<KnowledgeEntry & { found?: boolean }>({\n queryKey: ['knowledge', domain, key],\n queryFn: () => apiFetch(`/knowledge/entry?${qs}`),\n enabled: !!domain && !!key,\n });\n}\n\nexport function useStoreKnowledge() {\n const queryClient = useQueryClient();\n return useMutation<\n { id: string; domain: string; key: string; created: boolean; updated_at: string },\n Error,\n { domain: string; key: string; data: Record<string, unknown>; tags?: string[]; replace?: boolean }\n >({\n mutationFn: (body) =>\n apiFetch('/knowledge/entry', {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useSetKnowledgeField() {\n const queryClient = useQueryClient();\n return useMutation<\n { id: string; domain: string; key: string; created: boolean; updated_at: string },\n Error,\n { domain: string; key: string; path: string; value: unknown; tags?: string[] }\n >({\n mutationFn: (body) =>\n apiFetch('/knowledge/field', {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useRemoveKnowledgeField() {\n const queryClient = useQueryClient();\n return useMutation<\n { removed: boolean },\n Error,\n { domain: string; key: string; path: string }\n >({\n mutationFn: ({ domain, key, path }) => {\n const params = new URLSearchParams({ domain, key, path });\n return apiFetch(`/knowledge/field?${params}`, { method: 'DELETE' });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useDeleteKnowledge() {\n const queryClient = useQueryClient();\n return useMutation<\n { deleted: boolean; domain: string; key: string },\n Error,\n { domain: string; key: string }\n >({\n mutationFn: ({ domain, key }) => {\n const params = new URLSearchParams({ domain, key });\n return apiFetch(`/knowledge/entry?${params}`, { method: 'DELETE' });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n","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, useMemo, useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ChevronRight, Brain, Database, Table2 } 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 { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { useListDomains, useListKnowledge } from '../../api/knowledge';\nimport { KnowledgeEntryView } from './KnowledgeEntryView';\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\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 <div>\n <PageHeader title=\"Knowledge\" />\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>Knowledge</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 <EmptyState title={search ? 'No matching domains' : 'No knowledge domains yet'} />\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 <EmptyState title={search ? 'No matching entries' : 'No entries in this domain'} />\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}\n"],"names":["useListDomains","useQuery","apiFetch","useListKnowledge","domain","opts","params","_a","qs","useGetKnowledge","key","useStoreKnowledge","queryClient","useQueryClient","useMutation","body","useSetKnowledgeField","useRemoveKnowledgeField","path","useDeleteKnowledge","formatValue","val","parseValue","raw","trimmed","looksLikeJson","isSimple","t","AutoTextarea","value","onChange","onKeyDown","placeholder","mono","ref","useRef","useEffect","jsxDEV","e","KnowledgeEntryView","entryKey","onDeleted","entry","isLoading","refetch","deleteMutation","storeMutation","setFieldMutation","removeFieldMutation","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","PAGE_SIZE","KnowledgePage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","page","setPage","pageSize","setPageSize","offset","domainsQuery","entriesQuery","domains","entries","_b","entriesTotal","_c","filteredDomains","d","navigate","k","level","totalPages","entriesApiPath","PageHeader","Brain","Fragment","ChevronRight","Database","Table2","FilterBar","ListToolbar","FilterInput","_","i","EmptyState","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"index-B78xalb4.js","sources":["../../src/api/knowledge.ts","../../src/pages/knowledge/KnowledgeEntryView.tsx","../../src/pages/knowledge/KnowledgePage.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface KnowledgeDomain {\n domain: string;\n count: number;\n latest: string;\n}\n\nexport interface KnowledgeEntry {\n id: string;\n domain: string;\n key: string;\n data: Record<string, unknown>;\n tags: string[];\n created_at: string;\n updated_at: string;\n}\n\nexport interface ListDomainsResponse {\n domains: KnowledgeDomain[];\n}\n\nexport interface ListEntriesResponse {\n entries: KnowledgeEntry[];\n total: number;\n}\n\nexport function useListDomains() {\n return useQuery<ListDomainsResponse>({\n queryKey: ['knowledge', 'domains'],\n queryFn: () => apiFetch('/knowledge/domains'),\n });\n}\n\nexport function useListKnowledge(\n domain: string,\n opts?: { tags?: string[]; search?: string; limit?: number; offset?: number },\n) {\n const params = new URLSearchParams();\n params.set('domain', domain);\n if (opts?.tags?.length) params.set('tags', opts.tags.join(','));\n if (opts?.search) params.set('search', opts.search);\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n const qs = params.toString();\n\n return useQuery<ListEntriesResponse>({\n queryKey: ['knowledge', domain, opts?.tags, opts?.search, opts?.limit, opts?.offset],\n queryFn: () => apiFetch(`/knowledge/entries?${qs}`),\n enabled: !!domain,\n });\n}\n\nexport function useGetKnowledge(domain: string, key: string | null) {\n const params = new URLSearchParams();\n if (domain) params.set('domain', domain);\n if (key) params.set('key', key);\n const qs = params.toString();\n\n return useQuery<KnowledgeEntry & { found?: boolean }>({\n queryKey: ['knowledge', domain, key],\n queryFn: () => apiFetch(`/knowledge/entry?${qs}`),\n enabled: !!domain && !!key,\n });\n}\n\nexport function useStoreKnowledge() {\n const queryClient = useQueryClient();\n return useMutation<\n { id: string; domain: string; key: string; created: boolean; updated_at: string },\n Error,\n { domain: string; key: string; data: Record<string, unknown>; tags?: string[]; replace?: boolean }\n >({\n mutationFn: (body) =>\n apiFetch('/knowledge/entry', {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useSetKnowledgeField() {\n const queryClient = useQueryClient();\n return useMutation<\n { id: string; domain: string; key: string; created: boolean; updated_at: string },\n Error,\n { domain: string; key: string; path: string; value: unknown; tags?: string[] }\n >({\n mutationFn: (body) =>\n apiFetch('/knowledge/field', {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useRemoveKnowledgeField() {\n const queryClient = useQueryClient();\n return useMutation<\n { removed: boolean },\n Error,\n { domain: string; key: string; path: string }\n >({\n mutationFn: ({ domain, key, path }) => {\n const params = new URLSearchParams({ domain, key, path });\n return apiFetch(`/knowledge/field?${params}`, { method: 'DELETE' });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useDeleteKnowledge() {\n const queryClient = useQueryClient();\n return useMutation<\n { deleted: boolean; domain: string; key: string },\n Error,\n { domain: string; key: string }\n >({\n mutationFn: ({ domain, key }) => {\n const params = new URLSearchParams({ domain, key });\n return apiFetch(`/knowledge/entry?${params}`, { method: 'DELETE' });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n","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, useMemo, useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ChevronRight, Brain, Database, Table2 } 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 { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { useListDomains, useListKnowledge } from '../../api/knowledge';\nimport { KnowledgeEntryView } from './KnowledgeEntryView';\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\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 <div>\n <PageHeader title=\"Knowledge\" />\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>Knowledge</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 <EmptyState title={search ? 'No matching domains' : 'No knowledge domains yet'} />\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 <EmptyState title={search ? 'No matching entries' : 'No entries in this domain'} />\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}\n"],"names":["useListDomains","useQuery","apiFetch","useListKnowledge","domain","opts","params","_a","qs","useGetKnowledge","key","useStoreKnowledge","queryClient","useQueryClient","useMutation","body","useSetKnowledgeField","useRemoveKnowledgeField","path","useDeleteKnowledge","formatValue","val","parseValue","raw","trimmed","looksLikeJson","isSimple","t","AutoTextarea","value","onChange","onKeyDown","placeholder","mono","ref","useRef","useEffect","jsxDEV","e","KnowledgeEntryView","entryKey","onDeleted","entry","isLoading","refetch","deleteMutation","storeMutation","setFieldMutation","removeFieldMutation","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","PAGE_SIZE","KnowledgePage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","page","setPage","pageSize","setPageSize","offset","domainsQuery","entriesQuery","domains","entries","_b","entriesTotal","_c","filteredDomains","d","navigate","k","level","totalPages","entriesApiPath","PageHeader","Brain","Fragment","ChevronRight","Database","Table2","FilterBar","ListToolbar","FilterInput","_","i","EmptyState","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,J as k}from"./index-puKKZ5l8.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{a as z,b as L,u as J,c as F,d as O,e as I}from"./mcp-DrWymhSu.js";import{E as _}from"./EmptyState-Dep92Wkg.js";import{C as $}from"./ConfirmDeleteModal-DCKAPXD3.js";import{P as w}from"./PageHeader-CZ9a8cpr.js";import{F as A,a as q,b as y}from"./FilterBar-DbVbCzH2.js";import{S as B}from"./StickyPagination-B2jYvU3-.js";import{u as U}from"./useFilterParams-CGRYFw_A.js";import{u as G}from"./useExpandedRows-Cg9iq6Vy.js";import{b as W,R as H}from"./RunAsSelector-CNKraP6u.js";import{X as K,a6 as X,P as R,_ as C,a2 as Q,k as Y,aa as Z,ab as ee,z as se,l as re}from"./vendor-icons-CWl44VA6.js";import{L as M,c as ae}from"./vendor-react-Co3Y8ikm.js";import{R as te,a as D}from"./RowActions-DurFwIwe.js";import{S as oe}from"./StatusBadge-Dm0V1dNN.js";import"./Modal-yyhUeKoA.js";import"./BotPicker-DWhn0tr1.js";import"./bots-Dqos20NE.js";function ne({error:r}){const s=r instanceof Error?r.message:"";return s.startsWith("No credential found for provider")?e.jsxDEV("div",{className:"bg-status-warning/10 border border-status-warning/30 rounded-md px-3 py-2 flex items-start gap-2",children:[e.jsxDEV(Q,{size:14,className:"text-status-warning mt-0.5 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:15,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[11px] font-medium text-text-primary mb-0.5",children:"Credential required"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:17,columnNumber:11},this),e.jsxDEV("p",{className:"text-[11px] text-text-secondary mb-1",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:18,columnNumber:11},this),e.jsxDEV(M,{to:"/credentials",className:"text-[11px] text-accent hover:underline inline-flex items-center gap-1",children:["Go to Credentials ",e.jsxDEV(C,{size:10},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:20,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:19,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:16,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:14,columnNumber:7},this):e.jsxDEV("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsxDEV("p",{className:"text-[11px] text-status-error",children:s||"Tool call failed"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:28,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:27,columnNumber:5},this)}function le({data:r}){const s=r==null?void 0:r.result,a=s==null?void 0:s.job_id,l=(s==null?void 0:s.namespace)||"longtail";return a?e.jsxDEV(M,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=${encodeURIComponent(l)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsxDEV(C,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:43,columnNumber:7},this),"View Execution"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:39,columnNumber:5},this):null}function ie({serverId:r,serverName:s,tool:a,onClose:l}){const o=z(),[i,h]=b.useState(!1),[u,p]=b.useState({}),[m,N]=b.useState(""),[c,v]=b.useState(""),[x,E]=b.useState("");b.useEffect(()=>{const n=W(a.inputSchema);p(n),N(JSON.stringify(n,null,2)),h(!1),v(""),o.reset()},[a.name,r]);const g=!!o.data||!!o.error,j=()=>{if(!i)N(JSON.stringify(u,null,2));else try{p(JSON.parse(m))}catch{}h(!i)},T=()=>{v(""),o.reset();let n;if(i)try{n=JSON.parse(m)}catch{v("Invalid JSON");return}else n={...u};o.mutate({serverId:r,toolName:a.name,arguments:n,...x?{execute_as:x}:{}})};return e.jsxDEV("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxDEV("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("p",{className:"text-xs font-medium text-text-primary truncate",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:106,columnNumber:11},this),e.jsxDEV("code",{className:"text-[11px] font-mono text-accent truncate block",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:107,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:105,columnNumber:9},this),e.jsxDEV("button",{onClick:l,className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsxDEV(K,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:110,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:109,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:104,columnNumber:7},this),e.jsxDEV("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:[e.jsxDEV(H,{selected:x,onChange:E},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:116,columnNumber:9},this),a.description&&e.jsxDEV("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:a.description},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:119,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-1",children:[e.jsxDEV("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Request"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:125,columnNumber:13},this),e.jsxDEV("button",{onClick:j,className:"text-[10px] text-accent hover:underline",children:i?"Form view":"JSON view"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:126,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:124,columnNumber:11},this),i?e.jsxDEV("textarea",{value:m,onChange:n=>N(n.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:132,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(u).map(([n,f])=>e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:143,columnNumber:19},this),typeof f=="boolean"?e.jsxDEV("select",{value:String(f),onChange:t=>p({...u,[n]:t.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsxDEV("option",{value:"true",children:"true"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:150,columnNumber:23},this),e.jsxDEV("option",{value:"false",children:"false"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:151,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:145,columnNumber:21},this):typeof f=="object"?e.jsxDEV("textarea",{value:JSON.stringify(f,null,2),onChange:t=>{try{p({...u,[n]:JSON.parse(t.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:154,columnNumber:21},this):e.jsxDEV("input",{type:typeof f=="number"?"number":"text",value:String(f??""),onChange:t=>p({...u,[n]:typeof f=="number"?Number(t.target.value):t.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:160,columnNumber:21},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:142,columnNumber:17},this)),Object.keys(u).length===0&&e.jsxDEV("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:170,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:140,columnNumber:13},this),c&&e.jsxDEV("p",{className:"text-[11px] text-status-error mt-1",children:c},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:174,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:123,columnNumber:9},this),e.jsxDEV("button",{onClick:T,disabled:o.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:o.isPending?"Running...":g?e.jsxDEV(e.Fragment,{children:[e.jsxDEV(X,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:186,columnNumber:15},this)," Re-run"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:186,columnNumber:13},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(R,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:188,columnNumber:15},this)," Run"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:188,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:178,columnNumber:9},this),o.isPending&&e.jsxDEV("div",{className:"animate-pulse",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:195,columnNumber:13},this),e.jsxDEV("div",{className:"h-20 bg-surface-sunken rounded-md"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:196,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:194,columnNumber:11},this),o.data?e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV(k,{data:o.data,label:"Response",defaultCollapsed:!0},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:201,columnNumber:13},this),e.jsxDEV(le,{data:o.data},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:202,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:200,columnNumber:11},this):null,o.error?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:207,columnNumber:13},this),e.jsxDEV(ne,{error:o.error},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:208,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:206,columnNumber:11},this):null]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:115,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:102,columnNumber:5},this)}function me(r){var s,a;return!!((s=r.metadata)!=null&&s.builtin)||!!((a=r.transport_config)!=null&&a.builtin)}function ce(r,s){var o;if(!s)return!0;const a=s.toLowerCase();return r.name.toLowerCase().includes(a)||(o=r.description)!=null&&o.toLowerCase().includes(a)||(r.tags??[]).some(i=>i.toLowerCase().includes(a))?!0:(r.tool_manifest??[]).some(i=>{var h;return i.name.toLowerCase().includes(a)||((h=i.description)==null?void 0:h.toLowerCase().includes(a))})}function pe(r,s){if(!s)return r;const a=s.toLowerCase();return r.filter(l=>{var o;return l.name.toLowerCase().includes(a)||((o=l.description)==null?void 0:o.toLowerCase().includes(a))})}function de({serverId:r,credentialProviders:s}){const{data:a}=L(r);if(s.length===0||!a)return null;const l=a.missing.length===0;return e.jsxDEV("span",{className:`inline-block w-2 h-2 rounded-full shrink-0 ${l?"bg-status-success":"bg-status-warning"}`,title:l?"All credentials registered":`Missing: ${a.missing.join(", ")}`},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:19,columnNumber:5},this)}function ue({server:r,expanded:s,onToggle:a,onEdit:l,onDelete:o,onTryTool:i,connect:h,disconnect:u,visibleTools:p}){const m=r.tool_manifest??[],N=me(r);return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("tr",{onClick:m.length>0?a:void 0,className:`group/row border-b transition-colors duration-100 ${m.length>0?"cursor-pointer row-hover":""}`,children:[e.jsxDEV("td",{className:"px-6 py-3.5",children:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:`transition-transform duration-150 ${s?"rotate-90":""} ${m.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsxDEV(Y,{size:14},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:63,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:62,columnNumber:13},this),e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("p",{className:"text-sm text-text-primary font-medium",children:r.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:66,columnNumber:15},this),(r.tags??[]).length>0&&e.jsxDEV("div",{className:"flex flex-wrap gap-1 mt-0.5",children:r.tags.map(c=>e.jsxDEV("span",{className:"inline-block px-1.5 py-0 text-[9px] font-medium text-text-tertiary bg-surface-sunken rounded",children:c},c,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:70,columnNumber:21},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:68,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:65,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:61,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:60,columnNumber:9},this),e.jsxDEV("td",{className:"px-6 py-3.5 w-28",children:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(oe,{status:r.status},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:86,columnNumber:13},this),e.jsxDEV(de,{serverId:r.id,credentialProviders:r.credential_providers??[]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:87,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:85,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:84,columnNumber:9},this),e.jsxDEV("td",{className:"px-6 py-3.5 w-28",children:e.jsxDEV(te,{children:[!N&&(r.status==="connected"?e.jsxDEV(D,{icon:Z,title:"Disconnect server",onClick:()=>u.mutate(r.id)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:96,columnNumber:17},this):e.jsxDEV(D,{icon:ee,title:"Connect server",onClick:()=>h.mutate(r.id),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:102,columnNumber:17},this)),e.jsxDEV(D,{icon:se,title:"Edit server",onClick:l},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:110,columnNumber:13},this),!N&&e.jsxDEV(D,{icon:re,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:116,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:93,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:92,columnNumber:9},this),e.jsxDEV("td",{className:"w-12 text-center",children:e.jsxDEV("span",{className:"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent",children:m.length},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:128,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:127,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:53,columnNumber:7},this),p.length>0&&e.jsxDEV("tr",{children:e.jsxDEV("td",{colSpan:4,className:"p-0 border-0",children:e.jsxDEV("div",{className:"grid transition-[grid-template-rows] duration-200 ease-in-out",style:{gridTemplateRows:s?"1fr":"0fr"},children:e.jsxDEV("div",{className:"overflow-hidden",children:[p.map(c=>e.jsxDEV("div",{onClick:()=>i(c),className:"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30",children:[e.jsxDEV("div",{className:"flex-1 pl-14 pr-6 py-2 min-w-0",children:[e.jsxDEV("code",{className:"text-xs font-mono text-accent-primary",children:c.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:151,columnNumber:23},this),c.description&&e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5 line-clamp-1",children:c.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:153,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:150,columnNumber:21},this),e.jsxDEV("div",{className:"w-28 px-6 py-2 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:157,columnNumber:21},this),e.jsxDEV("div",{className:"w-28 px-6 py-2 flex justify-end shrink-0",children:e.jsxDEV("button",{onClick:v=>{v.stopPropagation(),i(c)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsxDEV(R,{className:"w-[18px] h-[18px]",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:165,columnNumber:25},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:160,columnNumber:23},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:159,columnNumber:21},this)]},c.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:144,columnNumber:19},this)),e.jsxDEV("div",{className:"h-1 bg-surface-sunken/20"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:170,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:142,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:138,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:137,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:136,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:51,columnNumber:5},this)}function ke(){const r=ae(),{filters:s,setFilter:a,pagination:l}=U({filters:{status:"",search:"",tag:""}}),{data:o,isLoading:i}=J({status:s.status||void 0,search:s.search||void 0,tags:s.tag||void 0}),h=F(),u=O(),p=I(),[m,N]=b.useState(null),{expandedIds:c,toggle:v}=G("lt:expanded:mcp-servers"),[x,E]=b.useState(null),g=(o==null?void 0:o.servers)??[],j=(o==null?void 0:o.total)??0,T=b.useMemo(()=>{const t=new Set;for(const d of g)for(const S of d.tags??[])t.add(S);return[...t].sort().map(d=>({value:d,label:d}))},[g]),n=b.useMemo(()=>s.search?g.filter(t=>ce(t,s.search)):g,[g,s.search]);b.useEffect(()=>{if(!s.search)return;const t=s.search.toLowerCase();for(const d of n)(d.tool_manifest??[]).some(V=>{var P;return V.name.toLowerCase().includes(t)||((P=V.description)==null?void 0:P.toLowerCase().includes(t))})&&!c.has(d.id)&&v(d.id)},[s.search,n]);const f=()=>{m&&p.mutate(m.id,{onSuccess:()=>N(null)})};return i?e.jsxDEV("div",{children:[e.jsxDEV(w,{title:"MCP Server Tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:87,columnNumber:9},this),e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((t,d)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:91,columnNumber:15},this)},d,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:90,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:88,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:86,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(w,{title:"MCP Server Tools",actions:e.jsxDEV("button",{onClick:()=>r("/mcp/servers/new"),className:"btn-primary text-xs",children:"Register Server"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:104,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:101,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:113,columnNumber:7},this),e.jsxDEV(A,{children:[e.jsxDEV(q,{label:"Search",value:s.search,onChange:t=>a("search",t),placeholder:"Server or tool name..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:118,columnNumber:9},this),e.jsxDEV(y,{label:"Tag",value:s.tag,onChange:t=>a("tag",t),options:T},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:124,columnNumber:9},this),e.jsxDEV(y,{label:"Status",value:s.status,onChange:t=>a("status",t),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:130,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:117,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-0 ",children:[e.jsxDEV("div",{className:`${x?"flex-1 min-w-0":"w-full"} transition-all`,children:[n.length===0?e.jsxDEV(_,{title:"No servers found"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:147,columnNumber:13},this):e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:[e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:152,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:155,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:158,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-12"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:159,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:151,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:150,columnNumber:15},this),e.jsxDEV("tbody",{children:n.map(t=>e.jsxDEV(ue,{server:t,expanded:c.has(t.id),onToggle:()=>v(t.id),onEdit:()=>r(`/mcp/servers/${t.id}`),onDelete:()=>N(t),onTryTool:d=>E({serverId:t.id,serverName:t.name,tool:d}),connect:h,disconnect:u,visibleTools:pe(t.tool_manifest??[],s.search)},t.id,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:164,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:162,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:149,columnNumber:13},this),e.jsxDEV(B,{page:l.page,totalPages:l.totalPages(j),onPageChange:l.setPage,total:j,pageSize:l.pageSize,onPageSizeChange:l.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:190,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:145,columnNumber:9},this),x&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]",children:e.jsxDEV(ie,{serverId:x.serverId,serverName:x.serverName,tool:x.tool,onClose:()=>E(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:203,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:202,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:143,columnNumber:7},this),e.jsxDEV($,{open:!!m,onClose:()=>N(null),onConfirm:f,title:"Delete MCP Server",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:m==null?void 0:m.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:222,columnNumber:13},this),"? This will remove the server registration."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:220,columnNumber:11},this),isPending:p.isPending,error:p.error},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:214,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:100,columnNumber:5},this)}export{ke as McpServersPage};
2
- //# sourceMappingURL=index-CjxHCVxl.js.map
1
+ import{j as e,J as k}from"./index-sNrqYt0Q.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{a as z,b as L,u as J,c as F,d as O,e as I}from"./mcp-D2XfRh8v.js";import{E as _}from"./EmptyState-BygtU-Rh.js";import{C as $}from"./ConfirmDeleteModal-Cy6KVLfC.js";import{P as w}from"./PageHeader-FJIemmrC.js";import{F as A,a as q,b as y}from"./FilterBar-BQNzsd3A.js";import{S as B}from"./StickyPagination-CJHMzYJj.js";import{u as U}from"./useFilterParams-CGRYFw_A.js";import{u as G}from"./useExpandedRows-Cg9iq6Vy.js";import{b as W,R as H}from"./RunAsSelector-KAlKtitB.js";import{X as K,a6 as X,P as R,_ as C,a2 as Q,k as Y,aa as Z,ab as ee,z as se,l as re}from"./vendor-icons-CWl44VA6.js";import{L as M,c as ae}from"./vendor-react-Co3Y8ikm.js";import{R as te,a as D}from"./RowActions-JqgAB0p3.js";import{S as oe}from"./StatusBadge-DVCf2ncM.js";import"./Modal-Dir9Rlnx.js";import"./BotPicker-DcvILNUf.js";import"./bots-fc_O_YIq.js";function ne({error:r}){const s=r instanceof Error?r.message:"";return s.startsWith("No credential found for provider")?e.jsxDEV("div",{className:"bg-status-warning/10 border border-status-warning/30 rounded-md px-3 py-2 flex items-start gap-2",children:[e.jsxDEV(Q,{size:14,className:"text-status-warning mt-0.5 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:15,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[11px] font-medium text-text-primary mb-0.5",children:"Credential required"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:17,columnNumber:11},this),e.jsxDEV("p",{className:"text-[11px] text-text-secondary mb-1",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:18,columnNumber:11},this),e.jsxDEV(M,{to:"/credentials",className:"text-[11px] text-accent hover:underline inline-flex items-center gap-1",children:["Go to Credentials ",e.jsxDEV(C,{size:10},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:20,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:19,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:16,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:14,columnNumber:7},this):e.jsxDEV("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsxDEV("p",{className:"text-[11px] text-status-error",children:s||"Tool call failed"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:28,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:27,columnNumber:5},this)}function le({data:r}){const s=r==null?void 0:r.result,a=s==null?void 0:s.job_id,l=(s==null?void 0:s.namespace)||"longtail";return a?e.jsxDEV(M,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=${encodeURIComponent(l)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsxDEV(C,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:43,columnNumber:7},this),"View Execution"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:39,columnNumber:5},this):null}function ie({serverId:r,serverName:s,tool:a,onClose:l}){const o=z(),[i,h]=b.useState(!1),[u,p]=b.useState({}),[m,N]=b.useState(""),[c,v]=b.useState(""),[x,E]=b.useState("");b.useEffect(()=>{const n=W(a.inputSchema);p(n),N(JSON.stringify(n,null,2)),h(!1),v(""),o.reset()},[a.name,r]);const g=!!o.data||!!o.error,j=()=>{if(!i)N(JSON.stringify(u,null,2));else try{p(JSON.parse(m))}catch{}h(!i)},T=()=>{v(""),o.reset();let n;if(i)try{n=JSON.parse(m)}catch{v("Invalid JSON");return}else n={...u};o.mutate({serverId:r,toolName:a.name,arguments:n,...x?{execute_as:x}:{}})};return e.jsxDEV("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxDEV("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("p",{className:"text-xs font-medium text-text-primary truncate",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:106,columnNumber:11},this),e.jsxDEV("code",{className:"text-[11px] font-mono text-accent truncate block",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:107,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:105,columnNumber:9},this),e.jsxDEV("button",{onClick:l,className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsxDEV(K,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:110,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:109,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:104,columnNumber:7},this),e.jsxDEV("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:[e.jsxDEV(H,{selected:x,onChange:E},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:116,columnNumber:9},this),a.description&&e.jsxDEV("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:a.description},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:119,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-1",children:[e.jsxDEV("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Request"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:125,columnNumber:13},this),e.jsxDEV("button",{onClick:j,className:"text-[10px] text-accent hover:underline",children:i?"Form view":"JSON view"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:126,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:124,columnNumber:11},this),i?e.jsxDEV("textarea",{value:m,onChange:n=>N(n.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:132,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(u).map(([n,f])=>e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:143,columnNumber:19},this),typeof f=="boolean"?e.jsxDEV("select",{value:String(f),onChange:t=>p({...u,[n]:t.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsxDEV("option",{value:"true",children:"true"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:150,columnNumber:23},this),e.jsxDEV("option",{value:"false",children:"false"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:151,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:145,columnNumber:21},this):typeof f=="object"?e.jsxDEV("textarea",{value:JSON.stringify(f,null,2),onChange:t=>{try{p({...u,[n]:JSON.parse(t.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:154,columnNumber:21},this):e.jsxDEV("input",{type:typeof f=="number"?"number":"text",value:String(f??""),onChange:t=>p({...u,[n]:typeof f=="number"?Number(t.target.value):t.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:160,columnNumber:21},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:142,columnNumber:17},this)),Object.keys(u).length===0&&e.jsxDEV("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:170,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:140,columnNumber:13},this),c&&e.jsxDEV("p",{className:"text-[11px] text-status-error mt-1",children:c},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:174,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:123,columnNumber:9},this),e.jsxDEV("button",{onClick:T,disabled:o.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:o.isPending?"Running...":g?e.jsxDEV(e.Fragment,{children:[e.jsxDEV(X,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:186,columnNumber:15},this)," Re-run"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:186,columnNumber:13},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(R,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:188,columnNumber:15},this)," Run"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:188,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:178,columnNumber:9},this),o.isPending&&e.jsxDEV("div",{className:"animate-pulse",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:195,columnNumber:13},this),e.jsxDEV("div",{className:"h-20 bg-surface-sunken rounded-md"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:196,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:194,columnNumber:11},this),o.data?e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV(k,{data:o.data,label:"Response",defaultCollapsed:!0},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:201,columnNumber:13},this),e.jsxDEV(le,{data:o.data},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:202,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:200,columnNumber:11},this):null,o.error?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:207,columnNumber:13},this),e.jsxDEV(ne,{error:o.error},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:208,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:206,columnNumber:11},this):null]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:115,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/ToolTestPanel.tsx",lineNumber:102,columnNumber:5},this)}function me(r){var s,a;return!!((s=r.metadata)!=null&&s.builtin)||!!((a=r.transport_config)!=null&&a.builtin)}function ce(r,s){var o;if(!s)return!0;const a=s.toLowerCase();return r.name.toLowerCase().includes(a)||(o=r.description)!=null&&o.toLowerCase().includes(a)||(r.tags??[]).some(i=>i.toLowerCase().includes(a))?!0:(r.tool_manifest??[]).some(i=>{var h;return i.name.toLowerCase().includes(a)||((h=i.description)==null?void 0:h.toLowerCase().includes(a))})}function pe(r,s){if(!s)return r;const a=s.toLowerCase();return r.filter(l=>{var o;return l.name.toLowerCase().includes(a)||((o=l.description)==null?void 0:o.toLowerCase().includes(a))})}function de({serverId:r,credentialProviders:s}){const{data:a}=L(r);if(s.length===0||!a)return null;const l=a.missing.length===0;return e.jsxDEV("span",{className:`inline-block w-2 h-2 rounded-full shrink-0 ${l?"bg-status-success":"bg-status-warning"}`,title:l?"All credentials registered":`Missing: ${a.missing.join(", ")}`},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:19,columnNumber:5},this)}function ue({server:r,expanded:s,onToggle:a,onEdit:l,onDelete:o,onTryTool:i,connect:h,disconnect:u,visibleTools:p}){const m=r.tool_manifest??[],N=me(r);return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("tr",{onClick:m.length>0?a:void 0,className:`group/row border-b transition-colors duration-100 ${m.length>0?"cursor-pointer row-hover":""}`,children:[e.jsxDEV("td",{className:"px-6 py-3.5",children:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:`transition-transform duration-150 ${s?"rotate-90":""} ${m.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsxDEV(Y,{size:14},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:63,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:62,columnNumber:13},this),e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("p",{className:"text-sm text-text-primary font-medium",children:r.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:66,columnNumber:15},this),(r.tags??[]).length>0&&e.jsxDEV("div",{className:"flex flex-wrap gap-1 mt-0.5",children:r.tags.map(c=>e.jsxDEV("span",{className:"inline-block px-1.5 py-0 text-[9px] font-medium text-text-tertiary bg-surface-sunken rounded",children:c},c,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:70,columnNumber:21},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:68,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:65,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:61,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:60,columnNumber:9},this),e.jsxDEV("td",{className:"px-6 py-3.5 w-28",children:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(oe,{status:r.status},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:86,columnNumber:13},this),e.jsxDEV(de,{serverId:r.id,credentialProviders:r.credential_providers??[]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:87,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:85,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:84,columnNumber:9},this),e.jsxDEV("td",{className:"px-6 py-3.5 w-28",children:e.jsxDEV(te,{children:[!N&&(r.status==="connected"?e.jsxDEV(D,{icon:Z,title:"Disconnect server",onClick:()=>u.mutate(r.id)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:96,columnNumber:17},this):e.jsxDEV(D,{icon:ee,title:"Connect server",onClick:()=>h.mutate(r.id),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:102,columnNumber:17},this)),e.jsxDEV(D,{icon:se,title:"Edit server",onClick:l},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:110,columnNumber:13},this),!N&&e.jsxDEV(D,{icon:re,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:116,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:93,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:92,columnNumber:9},this),e.jsxDEV("td",{className:"w-12 text-center",children:e.jsxDEV("span",{className:"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent",children:m.length},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:128,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:127,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:53,columnNumber:7},this),p.length>0&&e.jsxDEV("tr",{children:e.jsxDEV("td",{colSpan:4,className:"p-0 border-0",children:e.jsxDEV("div",{className:"grid transition-[grid-template-rows] duration-200 ease-in-out",style:{gridTemplateRows:s?"1fr":"0fr"},children:e.jsxDEV("div",{className:"overflow-hidden",children:[p.map(c=>e.jsxDEV("div",{onClick:()=>i(c),className:"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30",children:[e.jsxDEV("div",{className:"flex-1 pl-14 pr-6 py-2 min-w-0",children:[e.jsxDEV("code",{className:"text-xs font-mono text-accent-primary",children:c.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:151,columnNumber:23},this),c.description&&e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5 line-clamp-1",children:c.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:153,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:150,columnNumber:21},this),e.jsxDEV("div",{className:"w-28 px-6 py-2 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:157,columnNumber:21},this),e.jsxDEV("div",{className:"w-28 px-6 py-2 flex justify-end shrink-0",children:e.jsxDEV("button",{onClick:v=>{v.stopPropagation(),i(c)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsxDEV(R,{className:"w-[18px] h-[18px]",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:165,columnNumber:25},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:160,columnNumber:23},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:159,columnNumber:21},this)]},c.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:144,columnNumber:19},this)),e.jsxDEV("div",{className:"h-1 bg-surface-sunken/20"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:170,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:142,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:138,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:137,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:136,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:51,columnNumber:5},this)}function ke(){const r=ae(),{filters:s,setFilter:a,pagination:l}=U({filters:{status:"",search:"",tag:""}}),{data:o,isLoading:i}=J({status:s.status||void 0,search:s.search||void 0,tags:s.tag||void 0}),h=F(),u=O(),p=I(),[m,N]=b.useState(null),{expandedIds:c,toggle:v}=G("lt:expanded:mcp-servers"),[x,E]=b.useState(null),g=(o==null?void 0:o.servers)??[],j=(o==null?void 0:o.total)??0,T=b.useMemo(()=>{const t=new Set;for(const d of g)for(const S of d.tags??[])t.add(S);return[...t].sort().map(d=>({value:d,label:d}))},[g]),n=b.useMemo(()=>s.search?g.filter(t=>ce(t,s.search)):g,[g,s.search]);b.useEffect(()=>{if(!s.search)return;const t=s.search.toLowerCase();for(const d of n)(d.tool_manifest??[]).some(V=>{var P;return V.name.toLowerCase().includes(t)||((P=V.description)==null?void 0:P.toLowerCase().includes(t))})&&!c.has(d.id)&&v(d.id)},[s.search,n]);const f=()=>{m&&p.mutate(m.id,{onSuccess:()=>N(null)})};return i?e.jsxDEV("div",{children:[e.jsxDEV(w,{title:"MCP Server Tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:87,columnNumber:9},this),e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((t,d)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:91,columnNumber:15},this)},d,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:90,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:88,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:86,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(w,{title:"MCP Server Tools",actions:e.jsxDEV("button",{onClick:()=>r("/mcp/servers/new"),className:"btn-primary text-xs",children:"Register Server"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:104,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:101,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:113,columnNumber:7},this),e.jsxDEV(A,{children:[e.jsxDEV(q,{label:"Search",value:s.search,onChange:t=>a("search",t),placeholder:"Server or tool name..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:118,columnNumber:9},this),e.jsxDEV(y,{label:"Tag",value:s.tag,onChange:t=>a("tag",t),options:T},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:124,columnNumber:9},this),e.jsxDEV(y,{label:"Status",value:s.status,onChange:t=>a("status",t),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:130,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:117,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-0 ",children:[e.jsxDEV("div",{className:`${x?"flex-1 min-w-0":"w-full"} transition-all`,children:[n.length===0?e.jsxDEV(_,{title:"No servers found"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:147,columnNumber:13},this):e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:[e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:152,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:155,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:158,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-12"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:159,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:151,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:150,columnNumber:15},this),e.jsxDEV("tbody",{children:n.map(t=>e.jsxDEV(ue,{server:t,expanded:c.has(t.id),onToggle:()=>v(t.id),onEdit:()=>r(`/mcp/servers/${t.id}`),onDelete:()=>N(t),onTryTool:d=>E({serverId:t.id,serverName:t.name,tool:d}),connect:h,disconnect:u,visibleTools:pe(t.tool_manifest??[],s.search)},t.id,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:164,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:162,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:149,columnNumber:13},this),e.jsxDEV(B,{page:l.page,totalPages:l.totalPages(j),onPageChange:l.setPage,total:j,pageSize:l.pageSize,onPageSizeChange:l.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:190,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:145,columnNumber:9},this),x&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 h-[calc(100vh-12rem)]",children:e.jsxDEV(ie,{serverId:x.serverId,serverName:x.serverName,tool:x.tool,onClose:()=>E(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:203,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:202,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:143,columnNumber:7},this),e.jsxDEV($,{open:!!m,onClose:()=>N(null),onConfirm:f,title:"Delete MCP Server",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:m==null?void 0:m.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:222,columnNumber:13},this),"? This will remove the server registration."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:220,columnNumber:11},this),isPending:p.isPending,error:p.error},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:214,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:100,columnNumber:5},this)}export{ke as McpServersPage};
2
+ //# sourceMappingURL=index-BI8r69O_.js.map