@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.
- package/build/api/settings.js +0 -3
- package/build/api/yaml-workflows/crud.js +25 -5
- package/build/index.d.ts +1 -1
- package/build/lib/db/schemas/schemas/001_schema.sql +485 -0
- package/build/lib/db/schemas/schemas/002_seed.sql +92 -0
- package/build/lib/events/socketio.d.ts +12 -0
- package/build/lib/events/socketio.js +24 -1
- package/build/routes/index.js +2 -0
- package/build/routes/nats-credentials.d.ts +2 -0
- package/build/routes/nats-credentials.js +22 -0
- package/build/services/yaml-workflow/workers/register.js +4 -2
- package/build/start/adapters.js +4 -1
- package/build/start/socket-auth.d.ts +13 -0
- package/build/start/socket-auth.js +32 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js → AdminDashboard-Bprul9Eb.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js.map → AdminDashboard-Bprul9Eb.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js → AvailableEscalationsPage-H_z5mC10.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js.map → AvailableEscalationsPage-H_z5mC10.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js → BotPicker-DcvILNUf.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js.map → BotPicker-DcvILNUf.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js → CollapsibleSection-BWPbzgEe.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js.map → CollapsibleSection-BWPbzgEe.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js → ConfirmDeleteModal-Cy6KVLfC.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js.map → ConfirmDeleteModal-Cy6KVLfC.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js → CopyableId-CRED8hvk.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js.map → CopyableId-CRED8hvk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js → CredentialsPage-BUdvxiE3.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js.map → CredentialsPage-BUdvxiE3.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js → CustomDurationPicker-eOk2EqQ5.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js.map → CustomDurationPicker-eOk2EqQ5.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-DXSUbA26.js → DataTable-bd2PTBJd.js} +2 -2
- package/dashboard/dist/assets/{DataTable-DXSUbA26.js.map → DataTable-bd2PTBJd.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js → ElapsedCell-BGo8vyus.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js.map → ElapsedCell-BGo8vyus.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js → EmptyState-BygtU-Rh.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js.map → EmptyState-BygtU-Rh.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js → EscalationsOverview-DUEcN5MP.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js.map → EscalationsOverview-DUEcN5MP.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-BMJAPkMi.js → EventTable-CmFhswLW.js} +2 -2
- package/dashboard/dist/assets/{EventTable-BMJAPkMi.js.map → EventTable-CmFhswLW.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js → FilterBar-BQNzsd3A.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js.map → FilterBar-BQNzsd3A.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js → ListToolbar-OWOn-HiC.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js.map → ListToolbar-OWOn-HiC.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js → McpOverview-OkEzvClD.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js.map → McpOverview-OkEzvClD.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js → McpQueryDetailPage-C6Ih5sC_.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js.map → McpQueryDetailPage-C6Ih5sC_.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js → McpQueryPage-BAuOf5TL.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js.map → McpQueryPage-BAuOf5TL.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js → McpRunDetailPage-DMeiG4i_.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js.map → McpRunDetailPage-DMeiG4i_.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js → McpRunsPage-CG3cNJh8.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js.map → McpRunsPage-CG3cNJh8.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-yyhUeKoA.js → Modal-Dir9Rlnx.js} +2 -2
- package/dashboard/dist/assets/{Modal-yyhUeKoA.js.map → Modal-Dir9Rlnx.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js → OperatorDashboard-OqWC6Azy.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js.map → OperatorDashboard-OqWC6Azy.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js → PageHeader-FJIemmrC.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js.map → PageHeader-FJIemmrC.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js → PageHeaderWithStats-Br5y9qNO.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js.map → PageHeaderWithStats-Br5y9qNO.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js → PriorityBadge-C7D5d_HY.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js.map → PriorityBadge-C7D5d_HY.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js → ProcessDetailPage-DZIP6grw.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js.map → ProcessDetailPage-DZIP6grw.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js → ProcessesListPage-BQoPYkeB.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js.map → ProcessesListPage-BQoPYkeB.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-DxbJMfJu.js → RolePill-D6nMxMvp.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DxbJMfJu.js.map → RolePill-D6nMxMvp.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CYHRo21-.js → RolesPage-CwLnJFhy.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CYHRo21-.js.map → RolesPage-CwLnJFhy.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-DurFwIwe.js → RowActions-JqgAB0p3.js} +2 -2
- package/dashboard/dist/assets/{RowActions-DurFwIwe.js.map → RowActions-JqgAB0p3.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js → RunAsSelector-KAlKtitB.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js.map → RunAsSelector-KAlKtitB.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-CKplpK3w.js → StatCard-B-WLhOaH.js} +2 -2
- package/dashboard/dist/assets/{StatCard-CKplpK3w.js.map → StatCard-B-WLhOaH.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js → StatusBadge-DVCf2ncM.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js.map → StatusBadge-DVCf2ncM.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js → StepIndicator-D9Xvdf18.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js.map → StepIndicator-D9Xvdf18.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js → StickyPagination-CJHMzYJj.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js.map → StickyPagination-CJHMzYJj.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js → SwimlaneTimeline-YiXPDyEL.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js.map → SwimlaneTimeline-YiXPDyEL.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js → TagInput-DcPnUnSJ.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js.map → TagInput-DcPnUnSJ.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js → TaskDetailPage-DftmYWD7.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js.map → TaskDetailPage-DftmYWD7.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js → TaskQueuePill-BzduBqwy.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js.map → TaskQueuePill-BzduBqwy.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js → TasksListPage-DeewV4Gp.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js.map → TasksListPage-DeewV4Gp.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js → TimeAgo-DJZq-e4R.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js.map → TimeAgo-DJZq-e4R.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js → TimestampCell-Dx5uwGfS.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js.map → TimestampCell-Dx5uwGfS.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-OPg-nkRa.js → UserName-CnGk7MgL.js} +2 -2
- package/dashboard/dist/assets/{UserName-OPg-nkRa.js.map → UserName-CnGk7MgL.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js → WorkflowExecutionPage-CPQ0fIwf.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js.map → WorkflowExecutionPage-CPQ0fIwf.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js → WorkflowPill-BrD5d1AG.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js.map → WorkflowPill-BrD5d1AG.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js → WorkflowsDashboard-BzjhABZP.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js.map → WorkflowsDashboard-BzjhABZP.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js → WorkflowsOverview-lBp2E6rN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js.map → WorkflowsOverview-lBp2E6rN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js → YamlWorkflowsPage-C_MkAp2i.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js.map → YamlWorkflowsPage-C_MkAp2i.js.map} +1 -1
- package/dashboard/dist/assets/{bots-Dqos20NE.js → bots-fc_O_YIq.js} +2 -2
- package/dashboard/dist/assets/{bots-Dqos20NE.js.map → bots-fc_O_YIq.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-A0CsbvNV.js → escalation-BYhLYHBz.js} +2 -2
- package/dashboard/dist/assets/{escalation-A0CsbvNV.js.map → escalation-BYhLYHBz.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js → escalation-columns-DjJyuC1g.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js.map → escalation-columns-DjJyuC1g.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-CmznCuAx.js → helpers-CQG3Rh2y.js} +2 -2
- package/dashboard/dist/assets/{helpers-CmznCuAx.js.map → helpers-CQG3Rh2y.js.map} +1 -1
- package/dashboard/dist/assets/{index-C8-UaN4N.js → index-2nBhR7Dg.js} +2 -2
- package/dashboard/dist/assets/{index-C8-UaN4N.js.map → index-2nBhR7Dg.js.map} +1 -1
- package/dashboard/dist/assets/{index-DZHNte4o.js → index-4IUoh_hd.js} +2 -2
- package/dashboard/dist/assets/{index-DZHNte4o.js.map → index-4IUoh_hd.js.map} +1 -1
- package/dashboard/dist/assets/{index-BIeYV5QK.js → index-B2CqPzLK.js} +2 -2
- package/dashboard/dist/assets/{index-BIeYV5QK.js.map → index-B2CqPzLK.js.map} +1 -1
- package/dashboard/dist/assets/{index-ZjOUzWhc.js → index-B78xalb4.js} +2 -2
- package/dashboard/dist/assets/{index-ZjOUzWhc.js.map → index-B78xalb4.js.map} +1 -1
- package/dashboard/dist/assets/{index-CjxHCVxl.js → index-BI8r69O_.js} +2 -2
- package/dashboard/dist/assets/{index-CjxHCVxl.js.map → index-BI8r69O_.js.map} +1 -1
- package/dashboard/dist/assets/{index-t5frSddy.js → index-CUqCBBZG.js} +2 -2
- package/dashboard/dist/assets/{index-t5frSddy.js.map → index-CUqCBBZG.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cr0Rqsj7.js → index-D51PaQZY.js} +2 -2
- package/dashboard/dist/assets/{index-Cr0Rqsj7.js.map → index-D51PaQZY.js.map} +1 -1
- package/dashboard/dist/assets/{index-XGOmZ117.js → index-DNtXXy1o.js} +2 -2
- package/dashboard/dist/assets/{index-XGOmZ117.js.map → index-DNtXXy1o.js.map} +1 -1
- package/dashboard/dist/assets/{index-VnYkWW8r.js → index-DR4qQvlW.js} +2 -2
- package/dashboard/dist/assets/{index-VnYkWW8r.js.map → index-DR4qQvlW.js.map} +1 -1
- package/dashboard/dist/assets/{index-CAj5LT9H.js → index-Dh0PCbR-.js} +2 -2
- package/dashboard/dist/assets/{index-CAj5LT9H.js.map → index-Dh0PCbR-.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYwD3kHN.js → index-KYpLvJKB.js} +2 -2
- package/dashboard/dist/assets/{index-BYwD3kHN.js.map → index-KYpLvJKB.js.map} +1 -1
- package/dashboard/dist/assets/{index-puKKZ5l8.js → index-sNrqYt0Q.js} +53 -53
- package/dashboard/dist/assets/index-sNrqYt0Q.js.map +1 -0
- package/dashboard/dist/assets/{mcp-DrWymhSu.js → mcp-D2XfRh8v.js} +2 -2
- package/dashboard/dist/assets/{mcp-DrWymhSu.js.map → mcp-D2XfRh8v.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js → mcp-query-CIx_mIC7.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js.map → mcp-query-CIx_mIC7.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js → mcp-runs-C9_J4LIH.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js.map → mcp-runs-C9_J4LIH.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js → namespaces-BwMljx6f.js} +2 -2
- package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js.map → namespaces-BwMljx6f.js.map} +1 -1
- package/dashboard/dist/assets/{roles-2v1Kc7BJ.js → roles-Bd_sTV6I.js} +2 -2
- package/dashboard/dist/assets/{roles-2v1Kc7BJ.js.map → roles-Bd_sTV6I.js.map} +1 -1
- package/dashboard/dist/assets/{settings-DTQNp6tH.js → settings-BCb8eFyA.js} +2 -2
- package/dashboard/dist/assets/{settings-DTQNp6tH.js.map → settings-BCb8eFyA.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CS1rgG1s.js → tasks-Bq54qGGq.js} +2 -2
- package/dashboard/dist/assets/{tasks-CS1rgG1s.js.map → tasks-Bq54qGGq.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js → useEventHooks-BTbGf536.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js.map → useEventHooks-BTbGf536.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js → useYamlActivityEvents-CsYP09W5.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js.map → useYamlActivityEvents-CsYP09W5.js.map} +1 -1
- package/dashboard/dist/assets/{users-DYsdQ7Md.js → users-BTBhafGc.js} +2 -2
- package/dashboard/dist/assets/{users-DYsdQ7Md.js.map → users-BTBhafGc.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-2QAXh3UD.js → workflows-BkzA4ahe.js} +2 -2
- package/dashboard/dist/assets/{workflows-2QAXh3UD.js.map → workflows-BkzA4ahe.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js → yaml-workflows-Cs0EYp0F.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js.map → yaml-workflows-Cs0EYp0F.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/index-puKKZ5l8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-BIeYV5QK.js","sources":["../../src/api/files.ts","../../src/pages/files/FileBreadcrumbs.tsx","../../src/pages/files/FilePreviewContent.tsx","../../src/pages/files/FileListViews.tsx","../../src/pages/files/FilePreviewPanel.tsx","../../src/pages/files/FilesPage.tsx"],"sourcesContent":["import { useQuery, useMutation } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface FileEntry {\n path: string;\n size: number;\n modified_at: string;\n}\n\nexport interface BrowseResponse {\n files: FileEntry[];\n directories: string[];\n nextToken?: string;\n}\n\nexport interface FileMetadata {\n path: string;\n size: number;\n modified_at: string;\n content_type: string;\n}\n\nexport interface SignedUrlResponse {\n url: string;\n expiresAt: string;\n}\n\nexport function useFileBrowse(prefix: string, pageSize = 100, continuationToken?: string) {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n params.set('pageSize', String(pageSize));\n if (continuationToken) params.set('continuationToken', continuationToken);\n const qs = params.toString();\n\n return useQuery<BrowseResponse>({\n queryKey: ['fileBrowse', prefix, pageSize, continuationToken],\n queryFn: () => apiFetch(`/file-browser/browse?${qs}`),\n });\n}\n\nexport function useFileMetadata(filePath: string | null) {\n return useQuery<FileMetadata>({\n queryKey: ['fileMetadata', filePath],\n queryFn: () => apiFetch(`/file-browser/metadata/${filePath}`),\n enabled: !!filePath,\n });\n}\n\nexport function useGenerateSignedUrl() {\n return useMutation<SignedUrlResponse, Error, { path: string; expiresIn: number }>({\n mutationFn: (data) =>\n apiFetch('/file-browser/signed-url', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n });\n}\n\nexport function useDeleteFile() {\n return useMutation<{ deleted: boolean; path: string }, Error, string>({\n mutationFn: (filePath) =>\n apiFetch(`/file-browser/delete/${filePath}`, { method: 'DELETE' }),\n });\n}\n\nexport function getFilePreviewUrl(filePath: string): string {\n return `/api/files/${filePath.replace(/^\\/+/, '')}`;\n}\n\nexport function getFileDownloadUrl(filePath: string): string {\n return `/api/file-browser/download/${filePath.replace(/^\\/+/, '')}`;\n}\n","import { ChevronRight, FolderOpen } from 'lucide-react';\n\ninterface FileBreadcrumbsProps {\n prefix: string;\n onNavigate: (prefix: string) => void;\n}\n\nexport function FileBreadcrumbs({ prefix, onNavigate }: FileBreadcrumbsProps) {\n const segments = prefix ? prefix.replace(/\\/+$/, '').split('/').filter(Boolean) : [];\n\n return (\n <nav className=\"flex items-center gap-1 text-sm mb-6 min-h-[28px]\">\n <button\n onClick={() => onNavigate('')}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n segments.length === 0\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <FolderOpen className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>Files</span>\n </button>\n\n {segments.map((segment, i) => {\n const isLast = i === segments.length - 1;\n const targetPrefix = segments.slice(0, i + 1).join('/') + '/';\n return (\n <span key={targetPrefix} className=\"flex items-center gap-1\">\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <button\n onClick={() => onNavigate(targetPrefix)}\n className={`px-1.5 py-0.5 rounded transition-colors ${\n isLast\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {segment}\n </button>\n </span>\n );\n })}\n </nav>\n );\n}\n","import { useState } from 'react';\nimport { Copy, Check } from 'lucide-react';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\n\ninterface FileMetadata {\n path: string;\n content_type: string;\n size: number;\n modified_at: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function fileName(filePath: string): string {\n return filePath.split('/').pop() || filePath;\n}\n\nexport function MetaRow({ label, value, mono, children }: {\n label: string;\n value?: string;\n mono?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div>\n <dt className=\"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5\">{label}</dt>\n <dd className={`text-sm text-text-secondary ${mono ? 'font-mono text-xs break-all' : ''}`}>\n {children || value}\n </dd>\n </div>\n );\n}\n\nexport function TextPreview({ url }: { url: string }) {\n const [content, setContent] = useState<string | null>(null);\n const [error, setError] = useState(false);\n\n if (content === null && !error) {\n fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error();\n return res.text();\n })\n .then((text) => setContent(text.slice(0, 100_000)))\n .catch(() => setError(true));\n }\n\n if (error) return <p className=\"text-xs text-text-tertiary\">Could not load preview</p>;\n if (content === null) {\n return <div className=\"animate-pulse h-32 bg-surface-sunken rounded\" />;\n }\n\n return (\n <pre className=\"font-mono text-xs text-text-secondary bg-surface-sunken rounded-md p-3 overflow-x-auto max-h-[400px] overflow-y-auto whitespace-pre-wrap break-words\">\n {content}\n </pre>\n );\n}\n\nexport function FileMetadataDisplay({ metadata }: {\n metadata: FileMetadata;\n}) {\n const [copied, setCopied] = useState<string | null>(null);\n\n async function copyToClipboard(text: string, label: string) {\n await navigator.clipboard.writeText(text);\n setCopied(label);\n setTimeout(() => setCopied(null), 2000);\n }\n\n return (\n <div className=\"space-y-3\">\n <div>\n <dt className=\"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5\">Path</dt>\n <dd\n onClick={() => copyToClipboard(metadata.path, 'path')}\n className=\"group flex items-center gap-1.5 text-xs font-mono text-text-secondary break-all cursor-pointer hover:text-text-primary transition-colors\"\n title=\"Click to copy\"\n >\n <span className=\"flex-1\">{metadata.path}</span>\n {copied === 'path'\n ? <Check className=\"w-3.5 h-3.5 text-status-success shrink-0\" />\n : <Copy className=\"w-3.5 h-3.5 opacity-0 group-hover:opacity-100 text-text-tertiary shrink-0 transition-opacity\" />}\n </dd>\n </div>\n <MetaRow label=\"Type\" value={metadata.content_type} />\n <MetaRow label=\"Size\" value={formatSize(metadata.size)} />\n <MetaRow label=\"Modified\">\n <TimeAgo date={metadata.modified_at} />\n </MetaRow>\n </div>\n );\n}\n\nexport async function triggerDownload(url: string, name: string) {\n const res = await fetch(url);\n const blob = await res.blob();\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = name;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(blobUrl);\n}\n","import {\n Folder,\n File,\n Image,\n FileText,\n FileJson2,\n FileSpreadsheet,\n} from 'lucide-react';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { getFilePreviewUrl } from '../../api/files';\n\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function fileIcon(filePath: string) {\n const ext = filePath.split('.').pop()?.toLowerCase() || '';\n if (['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'].includes(ext)) {\n return <Image className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['json'].includes(ext)) {\n return <FileJson2 className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['csv', 'xlsx', 'xls'].includes(ext)) {\n return <FileSpreadsheet className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['txt', 'md', 'html', 'xml', 'yaml', 'yml', 'css', 'js', 'ts'].includes(ext)) {\n return <FileText className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n return <File className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n}\n\nexport function isImagePath(filePath: string): boolean {\n const ext = filePath.split('.').pop()?.toLowerCase() || '';\n return ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'].includes(ext);\n}\n\nexport function dirName(dirPath: string): string {\n const stripped = dirPath.replace(/\\/+$/, '');\n return stripped.split('/').pop() || stripped;\n}\n\nexport function fileNameFromPath(filePath: string): string {\n return filePath.split('/').pop() || filePath;\n}\n\ninterface ViewProps {\n directories: string[];\n files: Array<{ path: string; size: number; modified_at: string }>;\n onNavigate: (prefix: string) => void;\n onSelect: (path: string) => void;\n selectedFile: string | null;\n}\n\nexport function ListView({ directories, files, onNavigate, onSelect, selectedFile }: ViewProps) {\n return (\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\">Name</th>\n <th className=\"pb-2 font-medium w-24 text-right\">Size</th>\n <th className=\"pb-2 pr-2 font-medium w-40 text-right\">Modified</th>\n </tr>\n </thead>\n <tbody>\n {directories.map((dir) => (\n <tr\n key={dir}\n onClick={() => onNavigate(dir)}\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 <Folder 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 {dirName(dir)}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-tertiary\">—</td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-tertiary\">—</td>\n </tr>\n ))}\n {files.map((file) => (\n <tr\n key={file.path}\n onClick={() => onSelect(file.path)}\n className={`row-hover cursor-pointer group ${\n selectedFile === file.path ? 'bg-surface-hover' : ''\n }`}\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n {fileIcon(file.path)}\n <span className=\"text-sm text-text-primary truncate\">\n {fileNameFromPath(file.path)}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {formatSize(file.size)}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={file.modified_at} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nexport function GridView({ directories, files, onNavigate, onSelect, selectedFile }: ViewProps) {\n return (\n <div className=\"mt-4\">\n {/* Directories as compact list */}\n {directories.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mb-6\">\n {directories.map((dir) => (\n <button\n key={dir}\n onClick={() => onNavigate(dir)}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-md text-sm text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <Folder className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>{dirName(dir)}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* Files as thumbnail grid */}\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3\">\n {files.map((file) => {\n const isImg = isImagePath(file.path);\n return (\n <button\n key={file.path}\n onClick={() => onSelect(file.path)}\n className={`group text-left rounded-lg overflow-hidden transition-all ${\n selectedFile === file.path\n ? 'ring-2 ring-accent/40 bg-surface-hover'\n : 'hover:bg-surface-hover'\n }`}\n >\n <div className=\"aspect-square bg-surface-sunken flex items-center justify-center overflow-hidden\">\n {isImg ? (\n <img\n src={getFilePreviewUrl(file.path)}\n alt={fileNameFromPath(file.path)}\n loading=\"lazy\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-text-tertiary\">\n {fileIcon(file.path)}\n <span className=\"text-[10px] uppercase tracking-wider\">\n {file.path.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n </div>\n <div className=\"px-2 py-1.5\">\n <p className=\"text-xs text-text-primary truncate\" title={fileNameFromPath(file.path)}>\n {fileNameFromPath(file.path)}\n </p>\n <p className=\"text-[10px] text-text-tertiary tabular-nums\">\n {formatSize(file.size)}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport {\n X,\n Download,\n ExternalLink,\n Link,\n Check,\n Trash2,\n} from 'lucide-react';\nimport { useFileMetadata, getFilePreviewUrl, useGenerateSignedUrl, useDeleteFile } from '../../api/files';\nimport { fileName, triggerDownload, TextPreview, FileMetadataDisplay } from './FilePreviewContent';\nimport { isImagePath } from './FileListViews';\n\ninterface FilePreviewPanelProps {\n filePath: string;\n onClose: () => void;\n onDeleted?: () => void;\n}\n\nconst EXPIRY_OPTIONS = [\n { label: '1 hour', value: 3600 },\n { label: '6 hours', value: 21600 },\n { label: '24 hours', value: 86400 },\n { label: '7 days', value: 604800 },\n { label: '30 days', value: 2592000 },\n];\n\nexport function FilePreviewPanel({ filePath, onClose, onDeleted }: FilePreviewPanelProps) {\n const { data: metadata, isLoading } = useFileMetadata(filePath);\n const signedUrlMutation = useGenerateSignedUrl();\n const deleteMutation = useDeleteFile();\n const [showShareMenu, setShowShareMenu] = useState(false);\n const [copied, setCopied] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const previewUrl = getFilePreviewUrl(filePath);\n const isImage = metadata?.content_type?.startsWith('image/') || isImagePath(filePath);\n const isText = metadata?.content_type?.startsWith('text/') || metadata?.content_type === 'application/json';\n const isPdf = metadata?.content_type === 'application/pdf';\n\n async function handleDownload() {\n try {\n const result = await signedUrlMutation.mutateAsync({ path: filePath, expiresIn: 3600 });\n const fullUrl = result.url.startsWith('http')\n ? result.url\n : `${window.location.origin}${result.url}`;\n triggerDownload(fullUrl, fileName(filePath));\n } catch {\n // handled by mutation state\n }\n }\n\n async function handleShare(expiresIn: number) {\n setShowShareMenu(false);\n try {\n const result = await signedUrlMutation.mutateAsync({ path: filePath, expiresIn });\n const fullUrl = result.url.startsWith('http')\n ? result.url\n : `${window.location.origin}${result.url}`;\n await navigator.clipboard.writeText(fullUrl);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // handled by mutation state\n }\n }\n\n return (\n <>\n {/* Fullscreen — opens image in a new tab */}\n\n {/* Panel */}\n <div className=\"w-[380px] shrink-0 border-l border-surface-border bg-surface overflow-y-auto\">\n {/* Header */}\n <div className=\"sticky top-0 bg-surface z-10 px-5 pt-5 pb-3 border-b border-surface-border\">\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"text-sm font-medium text-text-primary truncate pr-2\" title={fileName(filePath)}>\n {fileName(filePath)}\n </h3>\n <button onClick={onClose} className=\"text-text-tertiary hover:text-text-primary shrink-0\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 flex-wrap\">\n <button\n onClick={handleDownload}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Download\"\n >\n <Download className=\"w-3.5 h-3.5\" />\n <span>Download</span>\n </button>\n\n <a\n href={previewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Open in new tab\"\n >\n <ExternalLink className=\"w-3.5 h-3.5\" />\n <span>Open</span>\n </a>\n\n <div className=\"relative\">\n <button\n onClick={() => setShowShareMenu((v) => !v)}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Share with signed URL\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Link className=\"w-3.5 h-3.5\" />}\n <span>{copied ? 'Copied' : 'Share'}</span>\n </button>\n {showShareMenu && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg py-1 z-20 min-w-[120px]\">\n {EXPIRY_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => handleShare(opt.value)}\n className=\"w-full text-left px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover hover:text-text-primary transition-colors\"\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs text-status-error/70 hover:text-status-error\"\n title=\"Delete file\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n <span>Delete</span>\n </button>\n </div>\n\n {/* Delete confirmation */}\n {confirmDelete && (\n <div className=\"mt-3 p-3 bg-status-error/5 border border-status-error/20 rounded-md\">\n <p className=\"text-xs text-text-primary mb-2\">\n Permanently delete <span className=\"font-medium\">{fileName(filePath)}</span>? This cannot be undone.\n </p>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setConfirmDelete(false)}\n className=\"btn-secondary text-xs\"\n disabled={deleteMutation.isPending}\n >\n Cancel\n </button>\n <button\n onClick={async () => {\n try {\n await deleteMutation.mutateAsync(filePath);\n setConfirmDelete(false);\n onDeleted?.();\n } catch {\n // error shown below\n }\n }}\n className=\"btn-primary text-xs !bg-status-error hover:!bg-status-error/90\"\n disabled={deleteMutation.isPending}\n >\n {deleteMutation.isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n {deleteMutation.isError && (\n <p className=\"text-xs text-status-error mt-2\">{deleteMutation.error.message}</p>\n )}\n </div>\n )}\n\n {signedUrlMutation.isError && (\n <p className=\"text-xs text-status-error mt-2\">{signedUrlMutation.error.message}</p>\n )}\n </div>\n\n {/* Preview area */}\n <div className=\"p-5\">\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n <div className=\"h-48 bg-surface-sunken rounded\" />\n <div className=\"h-4 bg-surface-sunken rounded w-2/3\" />\n </div>\n ) : (\n <>\n {isImage && (\n <div\n className=\"mb-5 rounded-md border border-surface-border bg-surface-sunken overflow-hidden\"\n style={{ maxHeight: '400px' }}\n >\n <img\n src={previewUrl}\n alt={fileName(filePath)}\n className=\"w-full object-cover object-top\"\n style={{ maxHeight: '400px' }}\n />\n </div>\n )}\n\n {isText && (\n <div className=\"mb-5\">\n <TextPreview url={previewUrl} />\n </div>\n )}\n\n {isPdf && (\n <div className=\"mb-5 p-4 bg-surface-sunken rounded-md text-center\">\n <a\n href={previewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent hover:text-accent-hover text-sm font-medium\"\n >\n Open PDF in new tab\n </a>\n </div>\n )}\n\n {metadata && (\n <FileMetadataDisplay metadata={metadata} />\n )}\n </>\n )}\n </div>\n </div>\n </>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n ChevronLeft,\n ChevronRight,\n} 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 { EmptyState } from '../../components/common/display/EmptyState';\nimport { useFileBrowse } from '../../api/files';\nimport { FileBreadcrumbs } from './FileBreadcrumbs';\nimport { FilePreviewPanel } from './FilePreviewPanel';\nimport { ListView } from './FileListViews';\n\nconst PAGE_SIZES = [25, 50, 100, 200];\n\nexport function FilesPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const prefix = searchParams.get('prefix') || '';\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n const [pageSize, setPageSize] = useState(100);\n const [tokenStack, setTokenStack] = useState<string[]>([]);\n const [currentToken, setCurrentToken] = useState<string | undefined>();\n\n // Debounce search — refines the prefix sent to S3\n useEffect(() => {\n const t = setTimeout(() => {\n setDebouncedSearch(search);\n setCurrentToken(undefined);\n setTokenStack([]);\n }, 300);\n return () => clearTimeout(t);\n }, [search]);\n\n const effectivePrefix = debouncedSearch\n ? `${prefix}${debouncedSearch}`\n : prefix;\n\n const { data, isLoading, isFetching, refetch } = useFileBrowse(effectivePrefix, pageSize, currentToken);\n\n const directories = data?.directories ?? [];\n const files = data?.files ?? [];\n const nextToken = data?.nextToken;\n\n const navigateTo = useCallback((newPrefix: string) => {\n setSearch('');\n setDebouncedSearch('');\n setSelectedFile(null);\n setCurrentToken(undefined);\n setTokenStack([]);\n if (newPrefix) {\n setSearchParams({ prefix: newPrefix });\n } else {\n setSearchParams({});\n }\n }, [setSearchParams]);\n\n function goNextPage() {\n if (!nextToken) return;\n setTokenStack((prev) => [...prev, currentToken || '']);\n setCurrentToken(nextToken);\n }\n\n function goPrevPage() {\n if (tokenStack.length === 0) return;\n const prev = [...tokenStack];\n const token = prev.pop()!;\n setTokenStack(prev);\n setCurrentToken(token || undefined);\n }\n\n function changePageSize(size: number) {\n setPageSize(size);\n setCurrentToken(undefined);\n setTokenStack([]);\n }\n\n const isEmpty = directories.length === 0 && files.length === 0;\n const pageNum = tokenStack.length + 1;\n const hasNextPage = !!nextToken;\n const hasPrevPage = tokenStack.length > 0;\n\n const apiPath = `/file-browser/browse?prefix=${encodeURIComponent(effectivePrefix)}&pageSize=${pageSize}${currentToken ? `&continuationToken=${encodeURIComponent(currentToken)}` : ''}`;\n\n return (\n <div className=\"flex gap-0\">\n {/* Main content */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <PageHeader title=\"Files\" />\n\n <FileBreadcrumbs prefix={prefix} onNavigate={navigateTo} />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={apiPath}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder=\"Filter by prefix...\"\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 ) : isEmpty ? (\n <EmptyState title={search ? 'No matching files' : 'This directory is empty'} />\n ) : (\n <ListView\n directories={directories}\n files={files}\n onNavigate={navigateTo}\n onSelect={setSelectedFile}\n selectedFile={selectedFile}\n />\n )}\n\n {/* Cursor-based pagination */}\n {(hasPrevPage || hasNextPage || files.length > 0) && (\n <div className=\"flex items-center justify-between pt-4 pb-2\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n Page {pageNum} · {files.length + directories.length} items\n </p>\n <select\n value={pageSize}\n onChange={(e) => changePageSize(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZES.map((size) => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n </div>\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={goPrevPage}\n disabled={!hasPrevPage}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1\"\n >\n <ChevronLeft className=\"w-3.5 h-3.5\" />\n Previous\n </button>\n <button\n onClick={goNextPage}\n disabled={!hasNextPage}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1\"\n >\n Next\n <ChevronRight className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Preview panel */}\n {selectedFile && (\n <FilePreviewPanel\n filePath={selectedFile}\n onClose={() => setSelectedFile(null)}\n onDeleted={() => { setSelectedFile(null); refetch(); }}\n />\n )}\n </div>\n );\n}\n"],"names":["useFileBrowse","prefix","pageSize","continuationToken","params","qs","useQuery","apiFetch","useFileMetadata","filePath","useGenerateSignedUrl","useMutation","data","useDeleteFile","getFilePreviewUrl","FileBreadcrumbs","onNavigate","segments","jsxDEV","FolderOpen","segment","i","isLast","targetPrefix","ChevronRight","formatSize","bytes","fileName","MetaRow","label","value","mono","children","TextPreview","url","content","setContent","useState","error","setError","res","text","FileMetadataDisplay","metadata","copied","setCopied","copyToClipboard","Check","Copy","TimeAgo","triggerDownload","name","blob","blobUrl","a","fileIcon","ext","_a","Image","FileJson2","FileSpreadsheet","FileText","File","isImagePath","dirName","dirPath","stripped","fileNameFromPath","ListView","directories","files","onSelect","selectedFile","dir","Folder","file","EXPIRY_OPTIONS","FilePreviewPanel","onClose","onDeleted","isLoading","signedUrlMutation","deleteMutation","showShareMenu","setShowShareMenu","confirmDelete","setConfirmDelete","previewUrl","isImage","isText","_b","isPdf","handleDownload","result","fullUrl","handleShare","expiresIn","Fragment","X","Download","ExternalLink","v","Link","opt","Trash2","PAGE_SIZES","FilesPage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","setSelectedFile","setPageSize","tokenStack","setTokenStack","currentToken","setCurrentToken","useEffect","t","effectivePrefix","isFetching","refetch","nextToken","navigateTo","useCallback","newPrefix","goNextPage","prev","goPrevPage","token","changePageSize","size","isEmpty","pageNum","hasNextPage","hasPrevPage","apiPath","PageHeader","FilterBar","ListToolbar","FilterInput","_","EmptyState","e","ChevronLeft"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-B2CqPzLK.js","sources":["../../src/api/files.ts","../../src/pages/files/FileBreadcrumbs.tsx","../../src/pages/files/FilePreviewContent.tsx","../../src/pages/files/FileListViews.tsx","../../src/pages/files/FilePreviewPanel.tsx","../../src/pages/files/FilesPage.tsx"],"sourcesContent":["import { useQuery, useMutation } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface FileEntry {\n path: string;\n size: number;\n modified_at: string;\n}\n\nexport interface BrowseResponse {\n files: FileEntry[];\n directories: string[];\n nextToken?: string;\n}\n\nexport interface FileMetadata {\n path: string;\n size: number;\n modified_at: string;\n content_type: string;\n}\n\nexport interface SignedUrlResponse {\n url: string;\n expiresAt: string;\n}\n\nexport function useFileBrowse(prefix: string, pageSize = 100, continuationToken?: string) {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n params.set('pageSize', String(pageSize));\n if (continuationToken) params.set('continuationToken', continuationToken);\n const qs = params.toString();\n\n return useQuery<BrowseResponse>({\n queryKey: ['fileBrowse', prefix, pageSize, continuationToken],\n queryFn: () => apiFetch(`/file-browser/browse?${qs}`),\n });\n}\n\nexport function useFileMetadata(filePath: string | null) {\n return useQuery<FileMetadata>({\n queryKey: ['fileMetadata', filePath],\n queryFn: () => apiFetch(`/file-browser/metadata/${filePath}`),\n enabled: !!filePath,\n });\n}\n\nexport function useGenerateSignedUrl() {\n return useMutation<SignedUrlResponse, Error, { path: string; expiresIn: number }>({\n mutationFn: (data) =>\n apiFetch('/file-browser/signed-url', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n });\n}\n\nexport function useDeleteFile() {\n return useMutation<{ deleted: boolean; path: string }, Error, string>({\n mutationFn: (filePath) =>\n apiFetch(`/file-browser/delete/${filePath}`, { method: 'DELETE' }),\n });\n}\n\nexport function getFilePreviewUrl(filePath: string): string {\n return `/api/files/${filePath.replace(/^\\/+/, '')}`;\n}\n\nexport function getFileDownloadUrl(filePath: string): string {\n return `/api/file-browser/download/${filePath.replace(/^\\/+/, '')}`;\n}\n","import { ChevronRight, FolderOpen } from 'lucide-react';\n\ninterface FileBreadcrumbsProps {\n prefix: string;\n onNavigate: (prefix: string) => void;\n}\n\nexport function FileBreadcrumbs({ prefix, onNavigate }: FileBreadcrumbsProps) {\n const segments = prefix ? prefix.replace(/\\/+$/, '').split('/').filter(Boolean) : [];\n\n return (\n <nav className=\"flex items-center gap-1 text-sm mb-6 min-h-[28px]\">\n <button\n onClick={() => onNavigate('')}\n className={`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${\n segments.length === 0\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <FolderOpen className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>Files</span>\n </button>\n\n {segments.map((segment, i) => {\n const isLast = i === segments.length - 1;\n const targetPrefix = segments.slice(0, i + 1).join('/') + '/';\n return (\n <span key={targetPrefix} className=\"flex items-center gap-1\">\n <ChevronRight className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <button\n onClick={() => onNavigate(targetPrefix)}\n className={`px-1.5 py-0.5 rounded transition-colors ${\n isLast\n ? 'text-text-primary font-medium'\n : 'text-text-secondary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {segment}\n </button>\n </span>\n );\n })}\n </nav>\n );\n}\n","import { useState } from 'react';\nimport { Copy, Check } from 'lucide-react';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\n\ninterface FileMetadata {\n path: string;\n content_type: string;\n size: number;\n modified_at: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function fileName(filePath: string): string {\n return filePath.split('/').pop() || filePath;\n}\n\nexport function MetaRow({ label, value, mono, children }: {\n label: string;\n value?: string;\n mono?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div>\n <dt className=\"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5\">{label}</dt>\n <dd className={`text-sm text-text-secondary ${mono ? 'font-mono text-xs break-all' : ''}`}>\n {children || value}\n </dd>\n </div>\n );\n}\n\nexport function TextPreview({ url }: { url: string }) {\n const [content, setContent] = useState<string | null>(null);\n const [error, setError] = useState(false);\n\n if (content === null && !error) {\n fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error();\n return res.text();\n })\n .then((text) => setContent(text.slice(0, 100_000)))\n .catch(() => setError(true));\n }\n\n if (error) return <p className=\"text-xs text-text-tertiary\">Could not load preview</p>;\n if (content === null) {\n return <div className=\"animate-pulse h-32 bg-surface-sunken rounded\" />;\n }\n\n return (\n <pre className=\"font-mono text-xs text-text-secondary bg-surface-sunken rounded-md p-3 overflow-x-auto max-h-[400px] overflow-y-auto whitespace-pre-wrap break-words\">\n {content}\n </pre>\n );\n}\n\nexport function FileMetadataDisplay({ metadata }: {\n metadata: FileMetadata;\n}) {\n const [copied, setCopied] = useState<string | null>(null);\n\n async function copyToClipboard(text: string, label: string) {\n await navigator.clipboard.writeText(text);\n setCopied(label);\n setTimeout(() => setCopied(null), 2000);\n }\n\n return (\n <div className=\"space-y-3\">\n <div>\n <dt className=\"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5\">Path</dt>\n <dd\n onClick={() => copyToClipboard(metadata.path, 'path')}\n className=\"group flex items-center gap-1.5 text-xs font-mono text-text-secondary break-all cursor-pointer hover:text-text-primary transition-colors\"\n title=\"Click to copy\"\n >\n <span className=\"flex-1\">{metadata.path}</span>\n {copied === 'path'\n ? <Check className=\"w-3.5 h-3.5 text-status-success shrink-0\" />\n : <Copy className=\"w-3.5 h-3.5 opacity-0 group-hover:opacity-100 text-text-tertiary shrink-0 transition-opacity\" />}\n </dd>\n </div>\n <MetaRow label=\"Type\" value={metadata.content_type} />\n <MetaRow label=\"Size\" value={formatSize(metadata.size)} />\n <MetaRow label=\"Modified\">\n <TimeAgo date={metadata.modified_at} />\n </MetaRow>\n </div>\n );\n}\n\nexport async function triggerDownload(url: string, name: string) {\n const res = await fetch(url);\n const blob = await res.blob();\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = name;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(blobUrl);\n}\n","import {\n Folder,\n File,\n Image,\n FileText,\n FileJson2,\n FileSpreadsheet,\n} from 'lucide-react';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { getFilePreviewUrl } from '../../api/files';\n\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function fileIcon(filePath: string) {\n const ext = filePath.split('.').pop()?.toLowerCase() || '';\n if (['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'].includes(ext)) {\n return <Image className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['json'].includes(ext)) {\n return <FileJson2 className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['csv', 'xlsx', 'xls'].includes(ext)) {\n return <FileSpreadsheet className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n if (['txt', 'md', 'html', 'xml', 'yaml', 'yml', 'css', 'js', 'ts'].includes(ext)) {\n return <FileText className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n }\n return <File className=\"w-4 h-4 text-accent/60\" strokeWidth={1.5} />;\n}\n\nexport function isImagePath(filePath: string): boolean {\n const ext = filePath.split('.').pop()?.toLowerCase() || '';\n return ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'].includes(ext);\n}\n\nexport function dirName(dirPath: string): string {\n const stripped = dirPath.replace(/\\/+$/, '');\n return stripped.split('/').pop() || stripped;\n}\n\nexport function fileNameFromPath(filePath: string): string {\n return filePath.split('/').pop() || filePath;\n}\n\ninterface ViewProps {\n directories: string[];\n files: Array<{ path: string; size: number; modified_at: string }>;\n onNavigate: (prefix: string) => void;\n onSelect: (path: string) => void;\n selectedFile: string | null;\n}\n\nexport function ListView({ directories, files, onNavigate, onSelect, selectedFile }: ViewProps) {\n return (\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\">Name</th>\n <th className=\"pb-2 font-medium w-24 text-right\">Size</th>\n <th className=\"pb-2 pr-2 font-medium w-40 text-right\">Modified</th>\n </tr>\n </thead>\n <tbody>\n {directories.map((dir) => (\n <tr\n key={dir}\n onClick={() => onNavigate(dir)}\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 <Folder 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 {dirName(dir)}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-tertiary\">—</td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-tertiary\">—</td>\n </tr>\n ))}\n {files.map((file) => (\n <tr\n key={file.path}\n onClick={() => onSelect(file.path)}\n className={`row-hover cursor-pointer group ${\n selectedFile === file.path ? 'bg-surface-hover' : ''\n }`}\n >\n <td className=\"py-2 pl-2\">\n <span className=\"flex items-center gap-2.5\">\n {fileIcon(file.path)}\n <span className=\"text-sm text-text-primary truncate\">\n {fileNameFromPath(file.path)}\n </span>\n </span>\n </td>\n <td className=\"py-2 text-right text-xs text-text-secondary tabular-nums\">\n {formatSize(file.size)}\n </td>\n <td className=\"py-2 pr-2 text-right text-xs text-text-secondary\">\n <TimeAgo date={file.modified_at} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nexport function GridView({ directories, files, onNavigate, onSelect, selectedFile }: ViewProps) {\n return (\n <div className=\"mt-4\">\n {/* Directories as compact list */}\n {directories.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mb-6\">\n {directories.map((dir) => (\n <button\n key={dir}\n onClick={() => onNavigate(dir)}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-md text-sm text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <Folder className=\"w-4 h-4 text-accent/75\" strokeWidth={1.5} />\n <span>{dirName(dir)}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* Files as thumbnail grid */}\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3\">\n {files.map((file) => {\n const isImg = isImagePath(file.path);\n return (\n <button\n key={file.path}\n onClick={() => onSelect(file.path)}\n className={`group text-left rounded-lg overflow-hidden transition-all ${\n selectedFile === file.path\n ? 'ring-2 ring-accent/40 bg-surface-hover'\n : 'hover:bg-surface-hover'\n }`}\n >\n <div className=\"aspect-square bg-surface-sunken flex items-center justify-center overflow-hidden\">\n {isImg ? (\n <img\n src={getFilePreviewUrl(file.path)}\n alt={fileNameFromPath(file.path)}\n loading=\"lazy\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-text-tertiary\">\n {fileIcon(file.path)}\n <span className=\"text-[10px] uppercase tracking-wider\">\n {file.path.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n </div>\n <div className=\"px-2 py-1.5\">\n <p className=\"text-xs text-text-primary truncate\" title={fileNameFromPath(file.path)}>\n {fileNameFromPath(file.path)}\n </p>\n <p className=\"text-[10px] text-text-tertiary tabular-nums\">\n {formatSize(file.size)}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport {\n X,\n Download,\n ExternalLink,\n Link,\n Check,\n Trash2,\n} from 'lucide-react';\nimport { useFileMetadata, getFilePreviewUrl, useGenerateSignedUrl, useDeleteFile } from '../../api/files';\nimport { fileName, triggerDownload, TextPreview, FileMetadataDisplay } from './FilePreviewContent';\nimport { isImagePath } from './FileListViews';\n\ninterface FilePreviewPanelProps {\n filePath: string;\n onClose: () => void;\n onDeleted?: () => void;\n}\n\nconst EXPIRY_OPTIONS = [\n { label: '1 hour', value: 3600 },\n { label: '6 hours', value: 21600 },\n { label: '24 hours', value: 86400 },\n { label: '7 days', value: 604800 },\n { label: '30 days', value: 2592000 },\n];\n\nexport function FilePreviewPanel({ filePath, onClose, onDeleted }: FilePreviewPanelProps) {\n const { data: metadata, isLoading } = useFileMetadata(filePath);\n const signedUrlMutation = useGenerateSignedUrl();\n const deleteMutation = useDeleteFile();\n const [showShareMenu, setShowShareMenu] = useState(false);\n const [copied, setCopied] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const previewUrl = getFilePreviewUrl(filePath);\n const isImage = metadata?.content_type?.startsWith('image/') || isImagePath(filePath);\n const isText = metadata?.content_type?.startsWith('text/') || metadata?.content_type === 'application/json';\n const isPdf = metadata?.content_type === 'application/pdf';\n\n async function handleDownload() {\n try {\n const result = await signedUrlMutation.mutateAsync({ path: filePath, expiresIn: 3600 });\n const fullUrl = result.url.startsWith('http')\n ? result.url\n : `${window.location.origin}${result.url}`;\n triggerDownload(fullUrl, fileName(filePath));\n } catch {\n // handled by mutation state\n }\n }\n\n async function handleShare(expiresIn: number) {\n setShowShareMenu(false);\n try {\n const result = await signedUrlMutation.mutateAsync({ path: filePath, expiresIn });\n const fullUrl = result.url.startsWith('http')\n ? result.url\n : `${window.location.origin}${result.url}`;\n await navigator.clipboard.writeText(fullUrl);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // handled by mutation state\n }\n }\n\n return (\n <>\n {/* Fullscreen — opens image in a new tab */}\n\n {/* Panel */}\n <div className=\"w-[380px] shrink-0 border-l border-surface-border bg-surface overflow-y-auto\">\n {/* Header */}\n <div className=\"sticky top-0 bg-surface z-10 px-5 pt-5 pb-3 border-b border-surface-border\">\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"text-sm font-medium text-text-primary truncate pr-2\" title={fileName(filePath)}>\n {fileName(filePath)}\n </h3>\n <button onClick={onClose} className=\"text-text-tertiary hover:text-text-primary shrink-0\">\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 flex-wrap\">\n <button\n onClick={handleDownload}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Download\"\n >\n <Download className=\"w-3.5 h-3.5\" />\n <span>Download</span>\n </button>\n\n <a\n href={previewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Open in new tab\"\n >\n <ExternalLink className=\"w-3.5 h-3.5\" />\n <span>Open</span>\n </a>\n\n <div className=\"relative\">\n <button\n onClick={() => setShowShareMenu((v) => !v)}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs\"\n title=\"Share with signed URL\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Link className=\"w-3.5 h-3.5\" />}\n <span>{copied ? 'Copied' : 'Share'}</span>\n </button>\n {showShareMenu && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg py-1 z-20 min-w-[120px]\">\n {EXPIRY_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n onClick={() => handleShare(opt.value)}\n className=\"w-full text-left px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover hover:text-text-primary transition-colors\"\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs text-status-error/70 hover:text-status-error\"\n title=\"Delete file\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n <span>Delete</span>\n </button>\n </div>\n\n {/* Delete confirmation */}\n {confirmDelete && (\n <div className=\"mt-3 p-3 bg-status-error/5 border border-status-error/20 rounded-md\">\n <p className=\"text-xs text-text-primary mb-2\">\n Permanently delete <span className=\"font-medium\">{fileName(filePath)}</span>? This cannot be undone.\n </p>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setConfirmDelete(false)}\n className=\"btn-secondary text-xs\"\n disabled={deleteMutation.isPending}\n >\n Cancel\n </button>\n <button\n onClick={async () => {\n try {\n await deleteMutation.mutateAsync(filePath);\n setConfirmDelete(false);\n onDeleted?.();\n } catch {\n // error shown below\n }\n }}\n className=\"btn-primary text-xs !bg-status-error hover:!bg-status-error/90\"\n disabled={deleteMutation.isPending}\n >\n {deleteMutation.isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n {deleteMutation.isError && (\n <p className=\"text-xs text-status-error mt-2\">{deleteMutation.error.message}</p>\n )}\n </div>\n )}\n\n {signedUrlMutation.isError && (\n <p className=\"text-xs text-status-error mt-2\">{signedUrlMutation.error.message}</p>\n )}\n </div>\n\n {/* Preview area */}\n <div className=\"p-5\">\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n <div className=\"h-48 bg-surface-sunken rounded\" />\n <div className=\"h-4 bg-surface-sunken rounded w-2/3\" />\n </div>\n ) : (\n <>\n {isImage && (\n <div\n className=\"mb-5 rounded-md border border-surface-border bg-surface-sunken overflow-hidden\"\n style={{ maxHeight: '400px' }}\n >\n <img\n src={previewUrl}\n alt={fileName(filePath)}\n className=\"w-full object-cover object-top\"\n style={{ maxHeight: '400px' }}\n />\n </div>\n )}\n\n {isText && (\n <div className=\"mb-5\">\n <TextPreview url={previewUrl} />\n </div>\n )}\n\n {isPdf && (\n <div className=\"mb-5 p-4 bg-surface-sunken rounded-md text-center\">\n <a\n href={previewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent hover:text-accent-hover text-sm font-medium\"\n >\n Open PDF in new tab\n </a>\n </div>\n )}\n\n {metadata && (\n <FileMetadataDisplay metadata={metadata} />\n )}\n </>\n )}\n </div>\n </div>\n </>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n ChevronLeft,\n ChevronRight,\n} 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 { EmptyState } from '../../components/common/display/EmptyState';\nimport { useFileBrowse } from '../../api/files';\nimport { FileBreadcrumbs } from './FileBreadcrumbs';\nimport { FilePreviewPanel } from './FilePreviewPanel';\nimport { ListView } from './FileListViews';\n\nconst PAGE_SIZES = [25, 50, 100, 200];\n\nexport function FilesPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const prefix = searchParams.get('prefix') || '';\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n const [pageSize, setPageSize] = useState(100);\n const [tokenStack, setTokenStack] = useState<string[]>([]);\n const [currentToken, setCurrentToken] = useState<string | undefined>();\n\n // Debounce search — refines the prefix sent to S3\n useEffect(() => {\n const t = setTimeout(() => {\n setDebouncedSearch(search);\n setCurrentToken(undefined);\n setTokenStack([]);\n }, 300);\n return () => clearTimeout(t);\n }, [search]);\n\n const effectivePrefix = debouncedSearch\n ? `${prefix}${debouncedSearch}`\n : prefix;\n\n const { data, isLoading, isFetching, refetch } = useFileBrowse(effectivePrefix, pageSize, currentToken);\n\n const directories = data?.directories ?? [];\n const files = data?.files ?? [];\n const nextToken = data?.nextToken;\n\n const navigateTo = useCallback((newPrefix: string) => {\n setSearch('');\n setDebouncedSearch('');\n setSelectedFile(null);\n setCurrentToken(undefined);\n setTokenStack([]);\n if (newPrefix) {\n setSearchParams({ prefix: newPrefix });\n } else {\n setSearchParams({});\n }\n }, [setSearchParams]);\n\n function goNextPage() {\n if (!nextToken) return;\n setTokenStack((prev) => [...prev, currentToken || '']);\n setCurrentToken(nextToken);\n }\n\n function goPrevPage() {\n if (tokenStack.length === 0) return;\n const prev = [...tokenStack];\n const token = prev.pop()!;\n setTokenStack(prev);\n setCurrentToken(token || undefined);\n }\n\n function changePageSize(size: number) {\n setPageSize(size);\n setCurrentToken(undefined);\n setTokenStack([]);\n }\n\n const isEmpty = directories.length === 0 && files.length === 0;\n const pageNum = tokenStack.length + 1;\n const hasNextPage = !!nextToken;\n const hasPrevPage = tokenStack.length > 0;\n\n const apiPath = `/file-browser/browse?prefix=${encodeURIComponent(effectivePrefix)}&pageSize=${pageSize}${currentToken ? `&continuationToken=${encodeURIComponent(currentToken)}` : ''}`;\n\n return (\n <div className=\"flex gap-0\">\n {/* Main content */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <PageHeader title=\"Files\" />\n\n <FileBreadcrumbs prefix={prefix} onNavigate={navigateTo} />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={apiPath}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder=\"Filter by prefix...\"\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 ) : isEmpty ? (\n <EmptyState title={search ? 'No matching files' : 'This directory is empty'} />\n ) : (\n <ListView\n directories={directories}\n files={files}\n onNavigate={navigateTo}\n onSelect={setSelectedFile}\n selectedFile={selectedFile}\n />\n )}\n\n {/* Cursor-based pagination */}\n {(hasPrevPage || hasNextPage || files.length > 0) && (\n <div className=\"flex items-center justify-between pt-4 pb-2\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n Page {pageNum} · {files.length + directories.length} items\n </p>\n <select\n value={pageSize}\n onChange={(e) => changePageSize(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZES.map((size) => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n </div>\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={goPrevPage}\n disabled={!hasPrevPage}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1\"\n >\n <ChevronLeft className=\"w-3.5 h-3.5\" />\n Previous\n </button>\n <button\n onClick={goNextPage}\n disabled={!hasNextPage}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1\"\n >\n Next\n <ChevronRight className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Preview panel */}\n {selectedFile && (\n <FilePreviewPanel\n filePath={selectedFile}\n onClose={() => setSelectedFile(null)}\n onDeleted={() => { setSelectedFile(null); refetch(); }}\n />\n )}\n </div>\n );\n}\n"],"names":["useFileBrowse","prefix","pageSize","continuationToken","params","qs","useQuery","apiFetch","useFileMetadata","filePath","useGenerateSignedUrl","useMutation","data","useDeleteFile","getFilePreviewUrl","FileBreadcrumbs","onNavigate","segments","jsxDEV","FolderOpen","segment","i","isLast","targetPrefix","ChevronRight","formatSize","bytes","fileName","MetaRow","label","value","mono","children","TextPreview","url","content","setContent","useState","error","setError","res","text","FileMetadataDisplay","metadata","copied","setCopied","copyToClipboard","Check","Copy","TimeAgo","triggerDownload","name","blob","blobUrl","a","fileIcon","ext","_a","Image","FileJson2","FileSpreadsheet","FileText","File","isImagePath","dirName","dirPath","stripped","fileNameFromPath","ListView","directories","files","onSelect","selectedFile","dir","Folder","file","EXPIRY_OPTIONS","FilePreviewPanel","onClose","onDeleted","isLoading","signedUrlMutation","deleteMutation","showShareMenu","setShowShareMenu","confirmDelete","setConfirmDelete","previewUrl","isImage","isText","_b","isPdf","handleDownload","result","fullUrl","handleShare","expiresIn","Fragment","X","Download","ExternalLink","v","Link","opt","Trash2","PAGE_SIZES","FilesPage","searchParams","setSearchParams","useSearchParams","search","setSearch","debouncedSearch","setDebouncedSearch","setSelectedFile","setPageSize","tokenStack","setTokenStack","currentToken","setCurrentToken","useEffect","t","effectivePrefix","isFetching","refetch","nextToken","navigateTo","useCallback","newPrefix","goNextPage","prev","goPrevPage","token","changePageSize","size","isEmpty","pageNum","hasNextPage","hasPrevPage","apiPath","PageHeader","FilterBar","ListToolbar","FilterInput","_","EmptyState","e","ChevronLeft"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as j,j as e}from"./index-puKKZ5l8.js";import{u as H,b as W,c as M,a as i}from"./vendor-query-DLp59M9_.js";import{P as ie}from"./PageHeader-CZ9a8cpr.js";import{F as oe,a as de}from"./FilterBar-DbVbCzH2.js";import{L as me}from"./ListToolbar-0XNuXj0M.js";import{S as ce}from"./StickyPagination-B2jYvU3-.js";import{E as X}from"./EmptyState-Dep92Wkg.js";import{T as G}from"./TimeAgo-B5LXB2aj.js";import{T as ue}from"./TagInput-CypDZ6Kl.js";import{l as ge,e as pe,k as ee,as as ae,at as se}from"./vendor-icons-CWl44VA6.js";import{f as he}from"./vendor-react-Co3Y8ikm.js";function be(){return H({queryKey:["knowledge","domains"],queryFn:()=>j("/knowledge/domains")})}function xe(t,a){var o;const n=new URLSearchParams;n.set("domain",t),(o=a==null?void 0:a.tags)!=null&&o.length&&n.set("tags",a.tags.join(",")),a!=null&&a.search&&n.set("search",a.search),(a==null?void 0:a.limit)!=null&&n.set("limit",String(a.limit)),(a==null?void 0:a.offset)!=null&&n.set("offset",String(a.offset));const l=n.toString();return H({queryKey:["knowledge",t,a==null?void 0:a.tags,a==null?void 0:a.search,a==null?void 0:a.limit,a==null?void 0:a.offset],queryFn:()=>j(`/knowledge/entries?${l}`),enabled:!!t})}function Ne(t,a){const n=new URLSearchParams;t&&n.set("domain",t),a&&n.set("key",a);const l=n.toString();return H({queryKey:["knowledge",t,a],queryFn:()=>j(`/knowledge/entry?${l}`),enabled:!!t&&!!a})}function fe(){const t=W();return M({mutationFn:a=>j("/knowledge/entry",{method:"POST",body:JSON.stringify(a)}),onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function we(){const t=W();return M({mutationFn:a=>j("/knowledge/field",{method:"PUT",body:JSON.stringify(a)}),onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function Ee(){const t=W();return M({mutationFn:({domain:a,key:n,path:l})=>{const o=new URLSearchParams({domain:a,key:n,path:l});return j(`/knowledge/field?${o}`,{method:"DELETE"})},onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function ke(){const t=W();return M({mutationFn:({domain:a,key:n})=>{const l=new URLSearchParams({domain:a,key:n});return j(`/knowledge/entry?${l}`,{method:"DELETE"})},onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function ye(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t,null,2)}function te(t){const a=t.trim();if(!a)return{value:"",looksLikeJson:!1,parsedOk:!1};const n=a.startsWith("{")||a.startsWith("[");try{return{value:JSON.parse(a),looksLikeJson:n,parsedOk:!0}}catch{return{value:a,looksLikeJson:n,parsedOk:!1}}}function ne(t){if(typeof t=="string"){const a=t.trim();return!(a.startsWith("{")&&a.endsWith("}")||a.startsWith("[")&&a.endsWith("]"))}return typeof t=="number"||typeof t=="boolean"||t===null}function U({value:t,onChange:a,onKeyDown:n,placeholder:l,mono:o}){const c=i.useRef(null);return i.useEffect(()=>{c.current&&(c.current.style.height="auto",c.current.style.height=`${c.current.scrollHeight}px`,c.current.focus())},[t]),e.jsxDEV("textarea",{ref:c,value:t,onChange:w=>a(w.target.value),onKeyDown:n,placeholder:l,rows:1,className:`w-full bg-transparent text-xs text-text-primary resize-none outline-none p-0 ${o?"font-mono":""}`,style:{minHeight:"1.5em"}},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:60,columnNumber:5},this)}function ve({domain:t,entryKey:a,onDeleted:n}){const{data:l,isLoading:o,refetch:c}=Ne(t,a),w=ke(),u=fe(),L=we(),P=Ee(),[V,A]=i.useState(!1),[m,E]=i.useState(null),[x,k]=i.useState(""),[v,D]=i.useState(""),[S,N]=i.useState(""),[p,C]=i.useState(null),[$,O]=i.useState(null),[I,T]=i.useState(!1),g=l==null?void 0:l.data,K=g?Object.entries(g):[],r=i.useMemo(()=>{const s=v.trim().toLowerCase();return s?K.filter(([d])=>d.toLowerCase().includes(s)):K},[K,v]),h=i.useCallback((s,d)=>d==="field"?s:ye(g==null?void 0:g[s]),[g]),y=m?x!==h(m.field,m.column):!1;function z(s,d){E({field:s,column:d}),k(h(s,d)),C(null)}function J(){E(null),k("")}function _(){O("Invalid JSON — saved as text"),setTimeout(()=>O(null),4e3)}async function Q(){if(!m||!g)return;const{field:s,column:d}=m;if(d==="value"){const{value:b,looksLikeJson:f,parsedOk:q}=te(x);f&&!q&&_(),await L.mutateAsync({domain:t,key:a,path:s,value:b})}else{const b=x.trim();if(!b||b===s){J();return}const f=g[s];await P.mutateAsync({domain:t,key:a,path:s}),await L.mutateAsync({domain:t,key:a,path:b,value:f})}E(null),k(""),c()}async function re(s){await P.mutateAsync({domain:t,key:a,path:s}),C(null),E(null),c()}async function le(s){await u.mutateAsync({domain:t,key:a,data:g||{},tags:s,replace:!0}),c()}async function B(){const s=v.trim();if(!s)return;const{value:d,looksLikeJson:b,parsedOk:f}=te(S);b&&!f&&_();const q={...g,[s]:d||""};await u.mutateAsync({domain:t,key:a,data:q}),D(""),N(""),c()}function Y(s){s.key==="Escape"?J():s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&(s.preventDefault(),Q())}function Z(s){s.key==="Escape"?(D(""),N("")):s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&(s.preventDefault(),B())}return o?e.jsxDEV("div",{className:"animate-pulse space-y-3 mt-4",children:[e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-1/3"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:200,columnNumber:9},this),e.jsxDEV("div",{className:"h-48 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:201,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:199,columnNumber:7},this):!l||l.found===!1?e.jsxDEV("p",{className:"text-sm text-text-tertiary mt-4",children:"Entry not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:207,columnNumber:12},this):e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-4",children:[e.jsxDEV("div",{className:"flex items-center gap-4 min-h-[28px]",children:I?e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(ue,{tags:l.tags||[],onChange:s=>{le(s)},placeholder:"Add tag...",compact:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:217,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>T(!1),className:"text-[10px] text-text-tertiary hover:text-text-secondary shrink-0",children:"Done"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:223,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:216,columnNumber:13},this):e.jsxDEV("div",{className:"flex items-center gap-1 cursor-text group",onClick:()=>T(!0),title:"Click to edit tags",children:l.tags&&l.tags.length>0?l.tags.map(s=>e.jsxDEV("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-medium bg-accent/10 text-accent",children:s},s,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:238,columnNumber:19},this)):e.jsxDEV("span",{className:"text-[10px] text-text-tertiary/40 italic group-hover:text-text-tertiary",children:"add tags..."},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:243,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:231,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:214,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:e.jsxDEV(G,{date:l.updated_at},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:249,columnNumber:60},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:249,columnNumber:11},this),V?e.jsxDEV("span",{className:"flex items-center gap-2 text-[10px]",children:[e.jsxDEV("span",{className:"text-status-error",children:"Delete entry?"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:252,columnNumber:15},this),e.jsxDEV("button",{onClick:async()=>{try{await w.mutateAsync({domain:t,key:a}),n()}catch{}},className:"font-medium text-status-error hover:text-status-error/80",disabled:w.isPending,children:w.isPending?"Deleting...":"Yes"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:253,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>A(!1),className:"text-text-tertiary hover:text-text-secondary",children:"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:265,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:251,columnNumber:13},this):e.jsxDEV("button",{onClick:()=>A(!0),className:"text-text-tertiary/50 hover:text-status-error transition-colors",title:"Delete entry",children:e.jsxDEV(ge,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:278,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:273,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:248,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:213,columnNumber:7},this),$&&e.jsxDEV("div",{className:"flex items-center justify-end gap-2 mb-2 px-1",children:[e.jsxDEV("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:286,columnNumber:11},this),e.jsxDEV("span",{className:"text-xs text-status-warning",children:$},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:287,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:285,columnNumber:9},this),e.jsxDEV("table",{className:"w-full border-collapse",children:[e.jsxDEV("thead",{className:"sticky top-0 z-10 bg-surface",children:[e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary border-b border-surface-border",children:[e.jsxDEV("th",{className:"px-3 py-2 font-medium w-[200px] border-r border-surface-border",children:"Field"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:295,columnNumber:13},this),e.jsxDEV("th",{className:"px-3 py-2 font-medium",children:"Value"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:296,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:294,columnNumber:11},this),e.jsxDEV("tr",{className:"border-b border-surface-border bg-surface",children:[e.jsxDEV("td",{className:"px-3 py-2 align-top border-r border-surface-border",children:e.jsxDEV("input",{value:v,onChange:s=>D(s.target.value),onKeyDown:Z,placeholder:K.length?"add or filter...":"new field",className:"w-full bg-transparent text-xs text-text-primary placeholder:text-text-tertiary/40 placeholder:italic outline-none p-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:301,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:300,columnNumber:13},this),e.jsxDEV("td",{className:"px-3 py-2 align-top",children:[e.jsxDEV(U,{value:S,onChange:N,onKeyDown:Z,placeholder:"value"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:310,columnNumber:15},this),v.trim()&&e.jsxDEV("div",{className:"flex gap-2 mt-1.5",children:[e.jsxDEV("button",{onClick:B,className:"text-[10px] font-medium text-accent hover:text-accent-hover",disabled:u.isPending,children:u.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:318,columnNumber:19},this),e.jsxDEV("button",{onClick:()=>{D(""),N("")},className:"text-[10px] text-text-tertiary hover:text-text-secondary",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:325,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:317,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:309,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:299,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:293,columnNumber:9},this),e.jsxDEV("tbody",{children:r.map(([s,d])=>{const b=(m==null?void 0:m.field)===s&&m.column==="field",f=(m==null?void 0:m.field)===s&&m.column==="value",q=b||f,F=p===s;return e.jsxDEV("tr",{className:`border-b border-surface-border ${F?"bg-status-error/10":q?"":"hover:bg-surface-hover/30"}`,children:[e.jsxDEV("td",{className:`px-3 py-2 align-top border-r cursor-text ${F?"bg-transparent border-r-transparent":b?"border-r-surface-border bg-accent/5 border-l-2 border-l-accent":"border-r-surface-border"}`,onClick:()=>!b&&!F&&z(s,"field"),children:b?e.jsxDEV("div",{children:[e.jsxDEV(U,{value:x,onChange:k,onKeyDown:Y,placeholder:"field name"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:352,columnNumber:23},this),y&&e.jsxDEV("div",{className:"flex gap-2 mt-1.5",children:[e.jsxDEV("button",{onClick:Q,className:"text-[10px] font-medium text-accent hover:text-accent-hover",disabled:u.isPending,children:u.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:355,columnNumber:27},this),e.jsxDEV("button",{onClick:J,className:"text-[10px] text-text-tertiary hover:text-text-secondary",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:358,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:354,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:351,columnNumber:21},this):e.jsxDEV("span",{className:"text-xs font-medium text-text-secondary break-all",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:363,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:346,columnNumber:17},this),e.jsxDEV("td",{className:`px-3 py-2 align-top cursor-text ${F?"bg-transparent":f?"bg-accent/5 border-l-2 border-l-accent":""}`,onClick:()=>!f&&!F&&z(s,"value"),children:F?e.jsxDEV("span",{className:"flex items-center justify-end gap-2 text-[10px]",children:[e.jsxDEV("span",{className:"text-status-error",children:["Remove ",e.jsxDEV("span",{className:"font-medium",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:374,columnNumber:66},this),"?"]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:374,columnNumber:23},this),e.jsxDEV("button",{onClick:R=>{R.stopPropagation(),re(s)},className:"font-medium text-status-error hover:text-status-error/80",disabled:u.isPending,children:u.isPending?"...":"Yes"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:375,columnNumber:23},this),e.jsxDEV("button",{onClick:R=>{R.stopPropagation(),C(null)},className:"text-text-tertiary hover:text-text-secondary",children:"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:382,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:373,columnNumber:21},this):f?e.jsxDEV("div",{children:[e.jsxDEV(U,{value:x,onChange:k,onKeyDown:Y,placeholder:"value (string or JSON)",mono:!ne(d)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:391,columnNumber:23},this),e.jsxDEV("div",{className:"flex gap-2 mt-1.5",children:[y&&e.jsxDEV("button",{onClick:Q,className:"text-[10px] font-medium text-accent hover:text-accent-hover",disabled:u.isPending,children:u.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:400,columnNumber:27},this),e.jsxDEV("button",{onClick:J,className:"text-[10px] text-text-tertiary hover:text-text-secondary",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:404,columnNumber:25},this),e.jsxDEV("button",{onClick:R=>{R.stopPropagation(),C(s)},className:"text-[10px] text-status-error/50 hover:text-status-error ml-auto",children:"Remove"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:405,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:398,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:390,columnNumber:21},this):ne(d)?e.jsxDEV("p",{className:"text-xs text-text-primary break-words whitespace-pre-wrap",children:String(d)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:415,columnNumber:23},this):e.jsxDEV("pre",{className:"text-xs text-text-primary font-mono whitespace-pre-wrap break-words",children:typeof d=="string"?d:JSON.stringify(d,null,2)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:417,columnNumber:23},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:368,columnNumber:17},this)]},s,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:344,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:336,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:292,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:211,columnNumber:5},this)}const Ve=50;function Ae(){var T,g,K;const[t,a]=he(),n=t.get("domain")||"",l=t.get("key")||"",[o,c]=i.useState(""),[w,u]=i.useState(""),[L,P]=i.useState(1),[V,A]=i.useState(Ve);i.useEffect(()=>{const r=setTimeout(()=>{u(o),P(1)},300);return()=>clearTimeout(r)},[o]);const m=(L-1)*V,E=be(),x=xe(n,{search:w||void 0,limit:V,offset:m}),k=((T=E.data)==null?void 0:T.domains)??[],v=((g=x.data)==null?void 0:g.entries)??[],D=((K=x.data)==null?void 0:K.total)??0,S=i.useMemo(()=>{if(!o)return k;const r=o.toLowerCase();return k.filter(h=>h.domain.toLowerCase().includes(r))},[k,o]);function N(r,h){c(""),u(""),P(1);const y={};r&&(y.domain=r),h&&(y.key=h),a(y)}const p=l?"entry":n?"entries":"domains",C=p==="entries"?x.isLoading:p==="domains"?E.isLoading:!1,$=Math.ceil((p==="entries"?D:S.length)/V),O=n?`/knowledge/entries?domain=${encodeURIComponent(n)}&limit=${V}&offset=${m}${w?`&search=${encodeURIComponent(w)}`:""}`:void 0;return e.jsxDEV("div",{children:[e.jsxDEV(ie,{title:"Knowledge"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:74,columnNumber:7},this),e.jsxDEV("nav",{className:"flex items-center gap-1 text-sm mb-6 min-h-[28px]",children:[e.jsxDEV("button",{onClick:()=>N(""),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${p==="domains"?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsxDEV(pe,{className:"w-4 h-4 text-accent/75",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:86,columnNumber:11},this),e.jsxDEV("span",{children:"Knowledge"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:87,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:78,columnNumber:9},this),n&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(ee,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:91,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>N(n),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${p==="entries"?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsxDEV(ae,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:100,columnNumber:15},this),n]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:92,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:90,columnNumber:11},this),l&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(ee,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:107,columnNumber:13},this),e.jsxDEV("span",{className:"flex items-center gap-1.5 px-1.5 py-0.5 text-text-primary font-medium",children:[e.jsxDEV(se,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:109,columnNumber:15},this),l]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:108,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:106,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:77,columnNumber:7},this),p==="entry"?e.jsxDEV(ve,{domain:n,entryKey:l,onDeleted:()=>N(n)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:118,columnNumber:9},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(oe,{actions:e.jsxDEV(me,{onRefresh:()=>p==="entries"?x.refetch():E.refetch(),isFetching:p==="entries"?x.isFetching:E.isFetching,apiPath:p==="entries"?O:"/knowledge/domains"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:126,columnNumber:13},this),children:e.jsxDEV(de,{label:"Search",value:o,onChange:c,placeholder:n?"Filter by key or tag...":"Filter by domain..."},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:132,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:125,columnNumber:11},this),C?e.jsxDEV("div",{className:"animate-pulse space-y-2 mt-4",children:Array.from({length:6}).map((r,h)=>e.jsxDEV("div",{className:"h-10 bg-surface-sunken rounded"},h,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:143,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:141,columnNumber:13},this):p==="domains"?S.length===0?e.jsxDEV(X,{title:o?"No matching domains":"No knowledge domains yet"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:148,columnNumber:15},this):e.jsxDEV("table",{className:"w-full mt-2",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsxDEV("th",{className:"pb-2 pl-2 font-medium",children:"Domain"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:153,columnNumber:21},this),e.jsxDEV("th",{className:"pb-2 font-medium w-24 text-right",children:"Entries"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:154,columnNumber:21},this),e.jsxDEV("th",{className:"pb-2 pr-2 font-medium w-40 text-right",children:"Latest"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:155,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:152,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:151,columnNumber:17},this),e.jsxDEV("tbody",{children:S.map(r=>e.jsxDEV("tr",{onClick:()=>N(r.domain),className:"row-hover cursor-pointer group",children:[e.jsxDEV("td",{className:"py-2 pl-2",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[e.jsxDEV(ae,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:167,columnNumber:27},this),e.jsxDEV("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors",children:r.domain},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:168,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:166,columnNumber:25},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:165,columnNumber:23},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:r.count},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:173,columnNumber:23},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsxDEV(G,{date:r.latest},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:177,columnNumber:25},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:176,columnNumber:23},this)]},r.domain,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:160,columnNumber:21},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:158,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:150,columnNumber:15},this):v.length===0?e.jsxDEV(X,{title:o?"No matching entries":"No entries in this domain"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:186,columnNumber:15},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("table",{className:"w-full mt-2",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsxDEV("th",{className:"pb-2 pl-2 font-medium w-[200px]",children:"Key"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:192,columnNumber:23},this),e.jsxDEV("th",{className:"pb-2 font-medium",children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:193,columnNumber:23},this),e.jsxDEV("th",{className:"pb-2 font-medium w-16 text-right",children:"Fields"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:194,columnNumber:23},this),e.jsxDEV("th",{className:"pb-2 pr-2 font-medium w-32 text-right",children:"Updated"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:195,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:191,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:190,columnNumber:19},this),e.jsxDEV("tbody",{children:v.map(r=>{var h;return e.jsxDEV("tr",{onClick:()=>N(n,r.key),className:"row-hover cursor-pointer group",children:[e.jsxDEV("td",{className:"py-2 pl-2 w-[200px]",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[e.jsxDEV(se,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:207,columnNumber:29},this),e.jsxDEV("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors truncate max-w-[160px]",title:r.key,children:r.key},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:208,columnNumber:29},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:206,columnNumber:27},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:205,columnNumber:25},this),e.jsxDEV("td",{className:"py-2",children:e.jsxDEV("div",{className:"flex flex-wrap gap-1",children:[(h=r.tags)==null?void 0:h.slice(0,5).map(y=>e.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0 rounded-full text-[10px] font-medium bg-accent/10 text-accent",children:y},y,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:216,columnNumber:31},this)),r.tags&&r.tags.length>5&&e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:["+",r.tags.length-5]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:224,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:214,columnNumber:27},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:213,columnNumber:25},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:r.data?Object.keys(r.data).length:0},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:230,columnNumber:25},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsxDEV(G,{date:r.updated_at},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:234,columnNumber:27},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:233,columnNumber:25},this)]},r.key,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:200,columnNumber:23},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:198,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:189,columnNumber:17},this),e.jsxDEV(ce,{page:L,totalPages:$,onPageChange:P,total:D,pageSize:V,onPageSizeChange:A},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:241,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:188,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:124,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:73,columnNumber:5},this)}export{Ae as KnowledgePage};
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{b as j,j as e}from"./index-sNrqYt0Q.js";import{u as H,b as W,c as M,a as i}from"./vendor-query-DLp59M9_.js";import{P as ie}from"./PageHeader-FJIemmrC.js";import{F as oe,a as de}from"./FilterBar-BQNzsd3A.js";import{L as me}from"./ListToolbar-OWOn-HiC.js";import{S as ce}from"./StickyPagination-CJHMzYJj.js";import{E as X}from"./EmptyState-BygtU-Rh.js";import{T as G}from"./TimeAgo-DJZq-e4R.js";import{T as ue}from"./TagInput-DcPnUnSJ.js";import{l as ge,e as pe,k as ee,as as ae,at as se}from"./vendor-icons-CWl44VA6.js";import{f as he}from"./vendor-react-Co3Y8ikm.js";function be(){return H({queryKey:["knowledge","domains"],queryFn:()=>j("/knowledge/domains")})}function xe(t,a){var o;const n=new URLSearchParams;n.set("domain",t),(o=a==null?void 0:a.tags)!=null&&o.length&&n.set("tags",a.tags.join(",")),a!=null&&a.search&&n.set("search",a.search),(a==null?void 0:a.limit)!=null&&n.set("limit",String(a.limit)),(a==null?void 0:a.offset)!=null&&n.set("offset",String(a.offset));const l=n.toString();return H({queryKey:["knowledge",t,a==null?void 0:a.tags,a==null?void 0:a.search,a==null?void 0:a.limit,a==null?void 0:a.offset],queryFn:()=>j(`/knowledge/entries?${l}`),enabled:!!t})}function Ne(t,a){const n=new URLSearchParams;t&&n.set("domain",t),a&&n.set("key",a);const l=n.toString();return H({queryKey:["knowledge",t,a],queryFn:()=>j(`/knowledge/entry?${l}`),enabled:!!t&&!!a})}function fe(){const t=W();return M({mutationFn:a=>j("/knowledge/entry",{method:"POST",body:JSON.stringify(a)}),onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function we(){const t=W();return M({mutationFn:a=>j("/knowledge/field",{method:"PUT",body:JSON.stringify(a)}),onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function Ee(){const t=W();return M({mutationFn:({domain:a,key:n,path:l})=>{const o=new URLSearchParams({domain:a,key:n,path:l});return j(`/knowledge/field?${o}`,{method:"DELETE"})},onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function ke(){const t=W();return M({mutationFn:({domain:a,key:n})=>{const l=new URLSearchParams({domain:a,key:n});return j(`/knowledge/entry?${l}`,{method:"DELETE"})},onSuccess:()=>{t.invalidateQueries({queryKey:["knowledge"]})}})}function ye(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t,null,2)}function te(t){const a=t.trim();if(!a)return{value:"",looksLikeJson:!1,parsedOk:!1};const n=a.startsWith("{")||a.startsWith("[");try{return{value:JSON.parse(a),looksLikeJson:n,parsedOk:!0}}catch{return{value:a,looksLikeJson:n,parsedOk:!1}}}function ne(t){if(typeof t=="string"){const a=t.trim();return!(a.startsWith("{")&&a.endsWith("}")||a.startsWith("[")&&a.endsWith("]"))}return typeof t=="number"||typeof t=="boolean"||t===null}function U({value:t,onChange:a,onKeyDown:n,placeholder:l,mono:o}){const c=i.useRef(null);return i.useEffect(()=>{c.current&&(c.current.style.height="auto",c.current.style.height=`${c.current.scrollHeight}px`,c.current.focus())},[t]),e.jsxDEV("textarea",{ref:c,value:t,onChange:w=>a(w.target.value),onKeyDown:n,placeholder:l,rows:1,className:`w-full bg-transparent text-xs text-text-primary resize-none outline-none p-0 ${o?"font-mono":""}`,style:{minHeight:"1.5em"}},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:60,columnNumber:5},this)}function ve({domain:t,entryKey:a,onDeleted:n}){const{data:l,isLoading:o,refetch:c}=Ne(t,a),w=ke(),u=fe(),L=we(),P=Ee(),[V,A]=i.useState(!1),[m,E]=i.useState(null),[x,k]=i.useState(""),[v,D]=i.useState(""),[S,N]=i.useState(""),[p,C]=i.useState(null),[$,O]=i.useState(null),[I,T]=i.useState(!1),g=l==null?void 0:l.data,K=g?Object.entries(g):[],r=i.useMemo(()=>{const s=v.trim().toLowerCase();return s?K.filter(([d])=>d.toLowerCase().includes(s)):K},[K,v]),h=i.useCallback((s,d)=>d==="field"?s:ye(g==null?void 0:g[s]),[g]),y=m?x!==h(m.field,m.column):!1;function z(s,d){E({field:s,column:d}),k(h(s,d)),C(null)}function J(){E(null),k("")}function _(){O("Invalid JSON — saved as text"),setTimeout(()=>O(null),4e3)}async function Q(){if(!m||!g)return;const{field:s,column:d}=m;if(d==="value"){const{value:b,looksLikeJson:f,parsedOk:q}=te(x);f&&!q&&_(),await L.mutateAsync({domain:t,key:a,path:s,value:b})}else{const b=x.trim();if(!b||b===s){J();return}const f=g[s];await P.mutateAsync({domain:t,key:a,path:s}),await L.mutateAsync({domain:t,key:a,path:b,value:f})}E(null),k(""),c()}async function re(s){await P.mutateAsync({domain:t,key:a,path:s}),C(null),E(null),c()}async function le(s){await u.mutateAsync({domain:t,key:a,data:g||{},tags:s,replace:!0}),c()}async function B(){const s=v.trim();if(!s)return;const{value:d,looksLikeJson:b,parsedOk:f}=te(S);b&&!f&&_();const q={...g,[s]:d||""};await u.mutateAsync({domain:t,key:a,data:q}),D(""),N(""),c()}function Y(s){s.key==="Escape"?J():s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&(s.preventDefault(),Q())}function Z(s){s.key==="Escape"?(D(""),N("")):s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&(s.preventDefault(),B())}return o?e.jsxDEV("div",{className:"animate-pulse space-y-3 mt-4",children:[e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-1/3"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:200,columnNumber:9},this),e.jsxDEV("div",{className:"h-48 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:201,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:199,columnNumber:7},this):!l||l.found===!1?e.jsxDEV("p",{className:"text-sm text-text-tertiary mt-4",children:"Entry not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:207,columnNumber:12},this):e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-4",children:[e.jsxDEV("div",{className:"flex items-center gap-4 min-h-[28px]",children:I?e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(ue,{tags:l.tags||[],onChange:s=>{le(s)},placeholder:"Add tag...",compact:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:217,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>T(!1),className:"text-[10px] text-text-tertiary hover:text-text-secondary shrink-0",children:"Done"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:223,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:216,columnNumber:13},this):e.jsxDEV("div",{className:"flex items-center gap-1 cursor-text group",onClick:()=>T(!0),title:"Click to edit tags",children:l.tags&&l.tags.length>0?l.tags.map(s=>e.jsxDEV("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-medium bg-accent/10 text-accent",children:s},s,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:238,columnNumber:19},this)):e.jsxDEV("span",{className:"text-[10px] text-text-tertiary/40 italic group-hover:text-text-tertiary",children:"add tags..."},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:243,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:231,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:214,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:e.jsxDEV(G,{date:l.updated_at},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:249,columnNumber:60},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:249,columnNumber:11},this),V?e.jsxDEV("span",{className:"flex items-center gap-2 text-[10px]",children:[e.jsxDEV("span",{className:"text-status-error",children:"Delete entry?"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:252,columnNumber:15},this),e.jsxDEV("button",{onClick:async()=>{try{await w.mutateAsync({domain:t,key:a}),n()}catch{}},className:"font-medium text-status-error hover:text-status-error/80",disabled:w.isPending,children:w.isPending?"Deleting...":"Yes"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:253,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>A(!1),className:"text-text-tertiary hover:text-text-secondary",children:"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:265,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:251,columnNumber:13},this):e.jsxDEV("button",{onClick:()=>A(!0),className:"text-text-tertiary/50 hover:text-status-error transition-colors",title:"Delete entry",children:e.jsxDEV(ge,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:278,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:273,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:248,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:213,columnNumber:7},this),$&&e.jsxDEV("div",{className:"flex items-center justify-end gap-2 mb-2 px-1",children:[e.jsxDEV("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:286,columnNumber:11},this),e.jsxDEV("span",{className:"text-xs text-status-warning",children:$},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:287,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:285,columnNumber:9},this),e.jsxDEV("table",{className:"w-full border-collapse",children:[e.jsxDEV("thead",{className:"sticky top-0 z-10 bg-surface",children:[e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary border-b border-surface-border",children:[e.jsxDEV("th",{className:"px-3 py-2 font-medium w-[200px] border-r border-surface-border",children:"Field"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:295,columnNumber:13},this),e.jsxDEV("th",{className:"px-3 py-2 font-medium",children:"Value"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:296,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:294,columnNumber:11},this),e.jsxDEV("tr",{className:"border-b border-surface-border bg-surface",children:[e.jsxDEV("td",{className:"px-3 py-2 align-top border-r border-surface-border",children:e.jsxDEV("input",{value:v,onChange:s=>D(s.target.value),onKeyDown:Z,placeholder:K.length?"add or filter...":"new field",className:"w-full bg-transparent text-xs text-text-primary placeholder:text-text-tertiary/40 placeholder:italic outline-none p-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:301,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:300,columnNumber:13},this),e.jsxDEV("td",{className:"px-3 py-2 align-top",children:[e.jsxDEV(U,{value:S,onChange:N,onKeyDown:Z,placeholder:"value"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:310,columnNumber:15},this),v.trim()&&e.jsxDEV("div",{className:"flex gap-2 mt-1.5",children:[e.jsxDEV("button",{onClick:B,className:"text-[10px] font-medium text-accent hover:text-accent-hover",disabled:u.isPending,children:u.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:318,columnNumber:19},this),e.jsxDEV("button",{onClick:()=>{D(""),N("")},className:"text-[10px] text-text-tertiary hover:text-text-secondary",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:325,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:317,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:309,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:299,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:293,columnNumber:9},this),e.jsxDEV("tbody",{children:r.map(([s,d])=>{const b=(m==null?void 0:m.field)===s&&m.column==="field",f=(m==null?void 0:m.field)===s&&m.column==="value",q=b||f,F=p===s;return e.jsxDEV("tr",{className:`border-b border-surface-border ${F?"bg-status-error/10":q?"":"hover:bg-surface-hover/30"}`,children:[e.jsxDEV("td",{className:`px-3 py-2 align-top border-r cursor-text ${F?"bg-transparent border-r-transparent":b?"border-r-surface-border bg-accent/5 border-l-2 border-l-accent":"border-r-surface-border"}`,onClick:()=>!b&&!F&&z(s,"field"),children:b?e.jsxDEV("div",{children:[e.jsxDEV(U,{value:x,onChange:k,onKeyDown:Y,placeholder:"field name"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:352,columnNumber:23},this),y&&e.jsxDEV("div",{className:"flex gap-2 mt-1.5",children:[e.jsxDEV("button",{onClick:Q,className:"text-[10px] font-medium text-accent hover:text-accent-hover",disabled:u.isPending,children:u.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:355,columnNumber:27},this),e.jsxDEV("button",{onClick:J,className:"text-[10px] text-text-tertiary hover:text-text-secondary",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:358,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:354,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:351,columnNumber:21},this):e.jsxDEV("span",{className:"text-xs font-medium text-text-secondary break-all",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:363,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:346,columnNumber:17},this),e.jsxDEV("td",{className:`px-3 py-2 align-top cursor-text ${F?"bg-transparent":f?"bg-accent/5 border-l-2 border-l-accent":""}`,onClick:()=>!f&&!F&&z(s,"value"),children:F?e.jsxDEV("span",{className:"flex items-center justify-end gap-2 text-[10px]",children:[e.jsxDEV("span",{className:"text-status-error",children:["Remove ",e.jsxDEV("span",{className:"font-medium",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:374,columnNumber:66},this),"?"]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:374,columnNumber:23},this),e.jsxDEV("button",{onClick:R=>{R.stopPropagation(),re(s)},className:"font-medium text-status-error hover:text-status-error/80",disabled:u.isPending,children:u.isPending?"...":"Yes"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:375,columnNumber:23},this),e.jsxDEV("button",{onClick:R=>{R.stopPropagation(),C(null)},className:"text-text-tertiary hover:text-text-secondary",children:"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:382,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:373,columnNumber:21},this):f?e.jsxDEV("div",{children:[e.jsxDEV(U,{value:x,onChange:k,onKeyDown:Y,placeholder:"value (string or JSON)",mono:!ne(d)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:391,columnNumber:23},this),e.jsxDEV("div",{className:"flex gap-2 mt-1.5",children:[y&&e.jsxDEV("button",{onClick:Q,className:"text-[10px] font-medium text-accent hover:text-accent-hover",disabled:u.isPending,children:u.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:400,columnNumber:27},this),e.jsxDEV("button",{onClick:J,className:"text-[10px] text-text-tertiary hover:text-text-secondary",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:404,columnNumber:25},this),e.jsxDEV("button",{onClick:R=>{R.stopPropagation(),C(s)},className:"text-[10px] text-status-error/50 hover:text-status-error ml-auto",children:"Remove"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:405,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:398,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:390,columnNumber:21},this):ne(d)?e.jsxDEV("p",{className:"text-xs text-text-primary break-words whitespace-pre-wrap",children:String(d)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:415,columnNumber:23},this):e.jsxDEV("pre",{className:"text-xs text-text-primary font-mono whitespace-pre-wrap break-words",children:typeof d=="string"?d:JSON.stringify(d,null,2)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:417,columnNumber:23},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:368,columnNumber:17},this)]},s,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:344,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:336,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:292,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgeEntryView.tsx",lineNumber:211,columnNumber:5},this)}const Ve=50;function Ae(){var T,g,K;const[t,a]=he(),n=t.get("domain")||"",l=t.get("key")||"",[o,c]=i.useState(""),[w,u]=i.useState(""),[L,P]=i.useState(1),[V,A]=i.useState(Ve);i.useEffect(()=>{const r=setTimeout(()=>{u(o),P(1)},300);return()=>clearTimeout(r)},[o]);const m=(L-1)*V,E=be(),x=xe(n,{search:w||void 0,limit:V,offset:m}),k=((T=E.data)==null?void 0:T.domains)??[],v=((g=x.data)==null?void 0:g.entries)??[],D=((K=x.data)==null?void 0:K.total)??0,S=i.useMemo(()=>{if(!o)return k;const r=o.toLowerCase();return k.filter(h=>h.domain.toLowerCase().includes(r))},[k,o]);function N(r,h){c(""),u(""),P(1);const y={};r&&(y.domain=r),h&&(y.key=h),a(y)}const p=l?"entry":n?"entries":"domains",C=p==="entries"?x.isLoading:p==="domains"?E.isLoading:!1,$=Math.ceil((p==="entries"?D:S.length)/V),O=n?`/knowledge/entries?domain=${encodeURIComponent(n)}&limit=${V}&offset=${m}${w?`&search=${encodeURIComponent(w)}`:""}`:void 0;return e.jsxDEV("div",{children:[e.jsxDEV(ie,{title:"Knowledge"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:74,columnNumber:7},this),e.jsxDEV("nav",{className:"flex items-center gap-1 text-sm mb-6 min-h-[28px]",children:[e.jsxDEV("button",{onClick:()=>N(""),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${p==="domains"?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsxDEV(pe,{className:"w-4 h-4 text-accent/75",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:86,columnNumber:11},this),e.jsxDEV("span",{children:"Knowledge"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:87,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:78,columnNumber:9},this),n&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(ee,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:91,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>N(n),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${p==="entries"?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsxDEV(ae,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:100,columnNumber:15},this),n]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:92,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:90,columnNumber:11},this),l&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(ee,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:107,columnNumber:13},this),e.jsxDEV("span",{className:"flex items-center gap-1.5 px-1.5 py-0.5 text-text-primary font-medium",children:[e.jsxDEV(se,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:109,columnNumber:15},this),l]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:108,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:106,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:77,columnNumber:7},this),p==="entry"?e.jsxDEV(ve,{domain:n,entryKey:l,onDeleted:()=>N(n)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:118,columnNumber:9},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(oe,{actions:e.jsxDEV(me,{onRefresh:()=>p==="entries"?x.refetch():E.refetch(),isFetching:p==="entries"?x.isFetching:E.isFetching,apiPath:p==="entries"?O:"/knowledge/domains"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:126,columnNumber:13},this),children:e.jsxDEV(de,{label:"Search",value:o,onChange:c,placeholder:n?"Filter by key or tag...":"Filter by domain..."},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:132,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:125,columnNumber:11},this),C?e.jsxDEV("div",{className:"animate-pulse space-y-2 mt-4",children:Array.from({length:6}).map((r,h)=>e.jsxDEV("div",{className:"h-10 bg-surface-sunken rounded"},h,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:143,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:141,columnNumber:13},this):p==="domains"?S.length===0?e.jsxDEV(X,{title:o?"No matching domains":"No knowledge domains yet"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:148,columnNumber:15},this):e.jsxDEV("table",{className:"w-full mt-2",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsxDEV("th",{className:"pb-2 pl-2 font-medium",children:"Domain"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:153,columnNumber:21},this),e.jsxDEV("th",{className:"pb-2 font-medium w-24 text-right",children:"Entries"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:154,columnNumber:21},this),e.jsxDEV("th",{className:"pb-2 pr-2 font-medium w-40 text-right",children:"Latest"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:155,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:152,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:151,columnNumber:17},this),e.jsxDEV("tbody",{children:S.map(r=>e.jsxDEV("tr",{onClick:()=>N(r.domain),className:"row-hover cursor-pointer group",children:[e.jsxDEV("td",{className:"py-2 pl-2",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[e.jsxDEV(ae,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:167,columnNumber:27},this),e.jsxDEV("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors",children:r.domain},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:168,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:166,columnNumber:25},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:165,columnNumber:23},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:r.count},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:173,columnNumber:23},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsxDEV(G,{date:r.latest},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:177,columnNumber:25},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:176,columnNumber:23},this)]},r.domain,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:160,columnNumber:21},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:158,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:150,columnNumber:15},this):v.length===0?e.jsxDEV(X,{title:o?"No matching entries":"No entries in this domain"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:186,columnNumber:15},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("table",{className:"w-full mt-2",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsxDEV("th",{className:"pb-2 pl-2 font-medium w-[200px]",children:"Key"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:192,columnNumber:23},this),e.jsxDEV("th",{className:"pb-2 font-medium",children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:193,columnNumber:23},this),e.jsxDEV("th",{className:"pb-2 font-medium w-16 text-right",children:"Fields"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:194,columnNumber:23},this),e.jsxDEV("th",{className:"pb-2 pr-2 font-medium w-32 text-right",children:"Updated"},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:195,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:191,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:190,columnNumber:19},this),e.jsxDEV("tbody",{children:v.map(r=>{var h;return e.jsxDEV("tr",{onClick:()=>N(n,r.key),className:"row-hover cursor-pointer group",children:[e.jsxDEV("td",{className:"py-2 pl-2 w-[200px]",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[e.jsxDEV(se,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:207,columnNumber:29},this),e.jsxDEV("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors truncate max-w-[160px]",title:r.key,children:r.key},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:208,columnNumber:29},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:206,columnNumber:27},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:205,columnNumber:25},this),e.jsxDEV("td",{className:"py-2",children:e.jsxDEV("div",{className:"flex flex-wrap gap-1",children:[(h=r.tags)==null?void 0:h.slice(0,5).map(y=>e.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0 rounded-full text-[10px] font-medium bg-accent/10 text-accent",children:y},y,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:216,columnNumber:31},this)),r.tags&&r.tags.length>5&&e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:["+",r.tags.length-5]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:224,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:214,columnNumber:27},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:213,columnNumber:25},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:r.data?Object.keys(r.data).length:0},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:230,columnNumber:25},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsxDEV(G,{date:r.updated_at},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:234,columnNumber:27},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:233,columnNumber:25},this)]},r.key,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:200,columnNumber:23},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:198,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:189,columnNumber:17},this),e.jsxDEV(ce,{page:L,totalPages:$,onPageChange:P,total:D,pageSize:V,onPageSizeChange:A},void 0,!1,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:241,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:188,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:124,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/knowledge/KnowledgePage.tsx",lineNumber:73,columnNumber:5},this)}export{Ae as KnowledgePage};
|
|
2
|
+
//# sourceMappingURL=index-B78xalb4.js.map
|