@flexkit/studio 0.2.22 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/astro.js +1 -1
  2. package/dist/{chat-page-WLKJ3QNZ.js → chat-page-ASH67R6B.js} +3 -3
  3. package/dist/{chat-page-WLKJ3QNZ.js.map → chat-page-ASH67R6B.js.map} +1 -1
  4. package/dist/{chunk-SE4HJCGA.js → chunk-7HBT6L4U.js} +2 -2
  5. package/dist/{chunk-SE4HJCGA.js.map → chunk-7HBT6L4U.js.map} +1 -1
  6. package/dist/{chunk-QTFFVG7C.js → chunk-7HEARTFH.js} +2 -2
  7. package/dist/{chunk-QTFFVG7C.js.map → chunk-7HEARTFH.js.map} +1 -1
  8. package/dist/{chunk-UCHWUGRT.js → chunk-AMUTDCI7.js} +3 -3
  9. package/dist/{chunk-UCHWUGRT.js.map → chunk-AMUTDCI7.js.map} +1 -1
  10. package/dist/{chunk-GGC75EMC.js → chunk-C4XLDODU.js} +2 -0
  11. package/dist/{chunk-YXUEPR7K.js → chunk-CAMLITJT.js} +3 -3
  12. package/dist/{chunk-YXUEPR7K.js.map → chunk-CAMLITJT.js.map} +1 -1
  13. package/dist/{chunk-K2KW6UYG.js → chunk-CJHMUEOB.js} +2 -2
  14. package/dist/{chunk-K2KW6UYG.js.map → chunk-CJHMUEOB.js.map} +1 -1
  15. package/dist/{chunk-MHVZXDVL.js → chunk-DAM7JM5J.js} +2 -2
  16. package/dist/{chunk-MHVZXDVL.js.map → chunk-DAM7JM5J.js.map} +1 -1
  17. package/dist/{chunk-BM7INZL3.js → chunk-E2NDJLAI.js} +3 -3
  18. package/dist/{chunk-BM7INZL3.js.map → chunk-E2NDJLAI.js.map} +1 -1
  19. package/dist/{chunk-6AI7322C.js → chunk-EYIV4KVY.js} +3 -3
  20. package/dist/{chunk-6AI7322C.js.map → chunk-EYIV4KVY.js.map} +1 -1
  21. package/dist/{chunk-HGXYSP47.js → chunk-FUX7UG36.js} +3 -3
  22. package/dist/{chunk-HGXYSP47.js.map → chunk-FUX7UG36.js.map} +1 -1
  23. package/dist/{chunk-4LVMCUHR.js → chunk-KN7OJFEX.js} +2 -2
  24. package/dist/{chunk-4LVMCUHR.js.map → chunk-KN7OJFEX.js.map} +1 -1
  25. package/dist/{chunk-HBTMGDOM.js → chunk-KQVLLOWJ.js} +2 -2
  26. package/dist/{chunk-HBTMGDOM.js.map → chunk-KQVLLOWJ.js.map} +1 -1
  27. package/dist/{chunk-LIMXKPEK.js → chunk-V7C4EHK3.js} +2 -2
  28. package/dist/{chunk-LIMXKPEK.js.map → chunk-V7C4EHK3.js.map} +1 -1
  29. package/dist/chunk-WPCPL2TQ.js +3 -0
  30. package/dist/chunk-WPCPL2TQ.js.map +1 -0
  31. package/dist/{chunk-UJEDL3IZ.js → chunk-YEWTJHKW.js} +2 -2
  32. package/dist/{chunk-UJEDL3IZ.js.map → chunk-YEWTJHKW.js.map} +1 -1
  33. package/dist/{chunk-RPLKJVDQ.js → chunk-YRPFCYLR.js} +3 -3
  34. package/dist/{chunk-RPLKJVDQ.js.map → chunk-YRPFCYLR.js.map} +1 -1
  35. package/dist/chunk-ZIHC7WWT.js +4 -0
  36. package/dist/chunk-ZIHC7WWT.js.map +1 -0
  37. package/dist/electron.js +1 -1
  38. package/dist/{entry-GWZ7DELK.js → entry-O75LJP6A.js} +2 -2
  39. package/dist/{entry-GWZ7DELK.js.map → entry-O75LJP6A.js.map} +1 -1
  40. package/dist/index.js +8 -10
  41. package/dist/index.js.map +1 -1
  42. package/dist/{list-LMIKCT2W.js → list-R3FH7CYE.js} +2 -2
  43. package/dist/{list-LMIKCT2W.js.map → list-R3FH7CYE.js.map} +1 -1
  44. package/dist/{list-FQZII7QD.js → list-RZROVSNS.js} +3 -3
  45. package/dist/{list-FQZII7QD.js.map → list-RZROVSNS.js.map} +1 -1
  46. package/dist/nextjs.js +1 -1
  47. package/dist/{pages-NKE7FV34.js → pages-NBXY5WPW.js} +3 -3
  48. package/dist/{pages-NKE7FV34.js.map → pages-NBXY5WPW.js.map} +1 -1
  49. package/dist/{plugin-pages-4HTADSK3.js → plugin-pages-IPEYHBKC.js} +2 -2
  50. package/dist/{plugin-pages-4HTADSK3.js.map → plugin-pages-IPEYHBKC.js.map} +1 -1
  51. package/dist/record-links-D5GJWZIK.js +2 -0
  52. package/dist/{record-links-FDWV4X5W.js.map → record-links-D5GJWZIK.js.map} +1 -1
  53. package/dist/{root-GYJGAS22.js → root-3J3XAFUX.js} +2 -2
  54. package/dist/{root-GYJGAS22.js.map → root-3J3XAFUX.js.map} +1 -1
  55. package/dist/{root-ZYUSZZWR.js → root-LWFZRWNO.js} +3 -3
  56. package/dist/{root-ZYUSZZWR.js.map → root-LWFZRWNO.js.map} +1 -1
  57. package/dist/{root-X3V4NC2D.js → root-QKNPDDE4.js} +2 -2
  58. package/dist/{root-X3V4NC2D.js.map → root-QKNPDDE4.js.map} +1 -1
  59. package/dist/root-QRSWWD23.js +14 -0
  60. package/dist/root-QRSWWD23.js.map +1 -0
  61. package/dist/{root-OSXC52GL.js → root-TL5U37VT.js} +2 -2
  62. package/dist/{root-OSXC52GL.js.map → root-TL5U37VT.js.map} +1 -1
  63. package/dist/{root-VL4EM2IS.js → root-XXHLLKQS.js} +3 -3
  64. package/dist/{root-VL4EM2IS.js.map → root-XXHLLKQS.js.map} +1 -1
  65. package/dist/{search-UW7WE2CS.js → search-KXTZNQCX.js} +2 -2
  66. package/dist/{search-UW7WE2CS.js.map → search-KXTZNQCX.js.map} +1 -1
  67. package/dist/{skills-pages-Q4YSUQVZ.js → skills-pages-CDOGI5ZZ.js} +2 -2
  68. package/dist/{skills-pages-Q4YSUQVZ.js.map → skills-pages-CDOGI5ZZ.js.map} +1 -1
  69. package/dist/{source-PGSWL4DQ.js → source-HTBEV3UC.js} +2 -2
  70. package/dist/{source-PGSWL4DQ.js.map → source-HTBEV3UC.js.map} +1 -1
  71. package/dist/tanstack-start.js +1 -1
  72. package/dist/{user-nav-B37OEVQN.js → user-nav-OWTTAXZS.js} +2 -2
  73. package/dist/{user-nav-B37OEVQN.js.map → user-nav-OWTTAXZS.js.map} +1 -1
  74. package/package.json +6 -6
  75. package/dist/chunk-JIB4PRLH.js +0 -3
  76. package/dist/chunk-JIB4PRLH.js.map +0 -1
  77. package/dist/record-links-FDWV4X5W.js +0 -2
  78. package/dist/root-YDHREGTF.js +0 -14
  79. package/dist/root-YDHREGTF.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import'./index.css';import {c as c$2,a as a$1}from'./chunk-YXUEPR7K.js';import {m as m$2,a,b,d as d$1}from'./chunk-RPLKJVDQ.js';import'./chunk-CAZ6EUR2.js';import'./chunk-2DXR5NJV.js';import {m as m$1,d,s}from'./chunk-UCHWUGRT.js';import'./chunk-LIMXKPEK.js';import {e}from'./chunk-BM7INZL3.js';import {c}from'./chunk-XMOSCJOI.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import {f}from'./chunk-6AI7322C.js';import'./chunk-JIB4PRLH.js';import'./chunk-5CVDMZUI.js';import {O}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$1,c as c$1,e as e$1}from'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useMemo,useCallback}from'react';import {useParams,useLocation,Outlet}from'react-router-dom';import {jsx,jsxs}from'react/jsx-runtime';var m=36,ct=[{_updatedAt:"DESC"},{_id:"DESC"}];function vt(){let{entity:t}=useParams(),{search:a$1}=useLocation(),g=new URLSearchParams(a$1).get("id"),{scope:j}=c(),{schemaErrorMessage:G}=e(),{currentProject:Q}=f(),h=Q?.schema??[],n=m$1(h,t??""),[r,S]=useState([]),[W,B]=useState(0),[O$1,F]=useState(t);t!==O$1&&(F(t),S([]));let k=m$2({attributesSchema:n?.attributes??[],actionsComponent:o=>ut({entityName:n?.name??"",entityNamePlural:t??"",row:o}),checkboxSelect:"multiple",enableColumnSorting:true}),f$1=useMemo(()=>{if(r.length===0)return ct;let o=r.map(({id:u,desc:it})=>({[u]:it?"DESC":"ASC"}));return o.some(u=>"_id"in u)?o:[...o,{_id:"DESC"}]},[r]),y=useMemo(()=>{if(r.length!==0)return d(f$1,n)},[n,f$1,r.length]),H=g?{where:{_id:{eq:g}}}:{offset:0,limit:m,sort:f$1,...y?{where:y}:{}},{isLoading:Y,isLoadingMore:Z,fetchMore:b$2,reload:C,count:i,data:l,isProjectDisabled:$}=s({entityNamePlural:t??"",schema:h,scope:j,variables:H,selection:"list"});function tt(o){S(o);}let N=l?.length??0,et=i>0&&N>0&&N<i,ot=useCallback(()=>{b$2({variables:{offset:0,limit:m}});},[b$2]),nt=useCallback(()=>{B(o=>o+1),C();},[C]),rt=Array(m).fill({}),at=pt(k),s$1=Y&&(l==null||l.length===0);return $?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3",children:jsx(a,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3",children:[jsx(b,{}),jsxs("div",{className:"fk:flex fk:items-center fk:mb-4 fk:gap-2",children:[jsxs(b$1,{children:[jsx(c$1,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:w-4 fk:h-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h2",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:ft(n?.menu?.label??n?.plural??"")}),s$1?null:jsxs("span",{className:"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground",children:[i.toLocaleString()," ",i===1?"record":"records"]})]}),G?null:jsx(d$1,{columns:s$1?at:k,data:s$1?rt:l??[],entityName:n?.name??"",hasMore:et,isLoadingMore:Z,pageSize:m,scrollToTopKey:W,sorting:r,onLoadMore:ot,onSortingChange:tt,toolbarComponent:o=>jsx(c$2,{entityName:n?.name??"",isReloading:s$1,onReload:nt,table:o})}),jsx(Outlet,{})]})}function ft(t){return t.charAt(0).toUpperCase()+t.slice(1)}function ut({entityName:t,entityNamePlural:a,row:d}){return jsx(a$1,{entityName:t,entityNamePlural:a,row:d})}function pt(t$1){return t$1.map(a=>({...a,cell:()=>jsx(t,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}export{vt as List};//# sourceMappingURL=list-LMIKCT2W.js.map
2
- //# sourceMappingURL=list-LMIKCT2W.js.map
1
+ import'./index.css';import {c as c$2,a as a$1}from'./chunk-CAMLITJT.js';import {m as m$2,a,b,d as d$1}from'./chunk-YRPFCYLR.js';import'./chunk-CAZ6EUR2.js';import'./chunk-2DXR5NJV.js';import {m as m$1,d,s}from'./chunk-AMUTDCI7.js';import'./chunk-V7C4EHK3.js';import {e}from'./chunk-E2NDJLAI.js';import {c}from'./chunk-XMOSCJOI.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import {f}from'./chunk-EYIV4KVY.js';import'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import {O}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$1,c as c$1,e as e$1}from'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useMemo,useCallback}from'react';import {useParams,useLocation,Outlet}from'react-router-dom';import {jsx,jsxs}from'react/jsx-runtime';var m=36,ct=[{_updatedAt:"DESC"},{_id:"DESC"}];function vt(){let{entity:t}=useParams(),{search:a$1}=useLocation(),g=new URLSearchParams(a$1).get("id"),{scope:j}=c(),{schemaErrorMessage:G}=e(),{currentProject:Q}=f(),h=Q?.schema??[],n=m$1(h,t??""),[r,S]=useState([]),[W,B]=useState(0),[O$1,F]=useState(t);t!==O$1&&(F(t),S([]));let k=m$2({attributesSchema:n?.attributes??[],actionsComponent:o=>ut({entityName:n?.name??"",entityNamePlural:t??"",row:o}),checkboxSelect:"multiple",enableColumnSorting:true}),f$1=useMemo(()=>{if(r.length===0)return ct;let o=r.map(({id:u,desc:it})=>({[u]:it?"DESC":"ASC"}));return o.some(u=>"_id"in u)?o:[...o,{_id:"DESC"}]},[r]),y=useMemo(()=>{if(r.length!==0)return d(f$1,n)},[n,f$1,r.length]),H=g?{where:{_id:{eq:g}}}:{offset:0,limit:m,sort:f$1,...y?{where:y}:{}},{isLoading:Y,isLoadingMore:Z,fetchMore:b$2,reload:C,count:i,data:l,isProjectDisabled:$}=s({entityNamePlural:t??"",schema:h,scope:j,variables:H,selection:"list"});function tt(o){S(o);}let N=l?.length??0,et=i>0&&N>0&&N<i,ot=useCallback(()=>{b$2({variables:{offset:0,limit:m}});},[b$2]),nt=useCallback(()=>{B(o=>o+1),C();},[C]),rt=Array(m).fill({}),at=pt(k),s$1=Y&&(l==null||l.length===0);return $?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3",children:jsx(a,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3",children:[jsx(b,{}),jsxs("div",{className:"fk:flex fk:items-center fk:mb-4 fk:gap-2",children:[jsxs(b$1,{children:[jsx(c$1,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:w-4 fk:h-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h2",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:ft(n?.menu?.label??n?.plural??"")}),s$1?null:jsxs("span",{className:"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground",children:[i.toLocaleString()," ",i===1?"record":"records"]})]}),G?null:jsx(d$1,{columns:s$1?at:k,data:s$1?rt:l??[],entityName:n?.name??"",hasMore:et,isLoadingMore:Z,pageSize:m,scrollToTopKey:W,sorting:r,onLoadMore:ot,onSortingChange:tt,toolbarComponent:o=>jsx(c$2,{entityName:n?.name??"",isReloading:s$1,onReload:nt,table:o})}),jsx(Outlet,{})]})}function ft(t){return t.charAt(0).toUpperCase()+t.slice(1)}function ut({entityName:t,entityNamePlural:a,row:d}){return jsx(a$1,{entityName:t,entityNamePlural:a,row:d})}function pt(t$1){return t$1.map(a=>({...a,cell:()=>jsx(t,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}export{vt as List};//# sourceMappingURL=list-R3FH7CYE.js.map
2
+ //# sourceMappingURL=list-R3FH7CYE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/desk/list.tsx"],"names":["pageSize","defaultSort","List","entityName","useParams","search","useLocation","entityId","scope","useAppContext","schemaErrorMessage","useGraphQLError","currentProject","useConfig","schema","entitySchema","getEntitySchema","sorting","setSorting","useState","scrollToTopKey","setScrollToTopKey","sortedEntityName","setSortedEntityName","columnsDefinition","useGridColumnsDefinition","row","dataRowActions","graphqlSort","useMemo","primarySort","id","desc","entry","sortNotNullWhere","getSortNotNullWhere","variables","isLoading","isLoadingMore","fetchMore","reload","count","data","isProjectDisabled","useEntityQuery","handleSortingChange","updater","rowsCount","hasMore","handleLoadMore","useCallback","handleReload","key","loadingData","loadingColumns","getLoadingColumns","isInitialLoading","jsx","ProjectDisabled","jsxs","SchemaError","Tooltip","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","capitalize","DataTable","table","DataTableToolbar","Outlet","str","entityNamePlural","DataTableRowActions","columns","column","Skeleton"],"mappings":"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","file":"list-LMIKCT2W.js","sourcesContent":["import { JSX, useCallback, useMemo, useState } from 'react';\nimport { useLocation, useParams, Outlet } from 'react-router-dom';\nimport type { ColumnDef, Row, SortingState, Updater } from '@tanstack/react-table';\nimport { getEntitySchema, getSortNotNullWhere } from '../../graphql-client/queries';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { DataTable } from '../../data-grid/data-table';\nimport { DataTableRowActions } from '../../data-grid/data-table-row-actions';\nimport { DataTableToolbar } from '../../data-grid/data-table-toolbar';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton, SidebarTrigger, Separator, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const { entity: entityName } = useParams();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const entitySchema = getEntitySchema(schema, entityName ?? '');\n const [sorting, setSorting] = useState<SortingState>([]);\n const [scrollToTopKey, setScrollToTopKey] = useState(0);\n const [sortedEntityName, setSortedEntityName] = useState(entityName);\n\n if (entityName !== sortedEntityName) {\n setSortedEntityName(entityName);\n setSorting([]);\n }\n\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: entitySchema?.attributes ?? [],\n actionsComponent: (row) =>\n dataRowActions({ entityName: entitySchema?.name ?? '', entityNamePlural: entityName ?? '', row }),\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n const sortNotNullWhere = useMemo(() => {\n if (sorting.length === 0) {\n return undefined;\n }\n\n return getSortNotNullWhere(graphqlSort, entitySchema);\n }, [entitySchema, graphqlSort, sorting.length]);\n\n const variables = entityId\n ? { where: { _id: { eq: entityId } } }\n : {\n offset: 0,\n limit: pageSize,\n sort: graphqlSort,\n ...(sortNotNullWhere ? { where: sortNotNullWhere } : {}),\n };\n\n const { isLoading, isLoadingMore, fetchMore, reload, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n const rowsCount = data?.length ?? 0;\n const hasMore = count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const handleReload = useCallback(() => {\n setScrollToTopKey((key) => key + 1);\n reload();\n }, [reload]);\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n const isInitialLoading = isLoading && (data == null || data.length === 0);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3\">\n <SchemaError />\n <div className=\"fk:flex fk:items-center fk:mb-4 fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:w-4 fk:h-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {capitalize(entitySchema?.menu?.label ?? entitySchema?.plural ?? '')}\n </h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <DataTable\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : (data ?? [])}\n entityName={entitySchema?.name ?? ''}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n scrollToTopKey={scrollToTopKey}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={entitySchema?.name ?? ''}\n isReloading={isInitialLoading}\n onReload={handleReload}\n table={table}\n />\n )}\n />\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\ntype DataRowActions = {\n entityName: string;\n entityNamePlural: string;\n row: Row<AttributeValue>;\n};\n\nfunction dataRowActions({ entityName, entityNamePlural, row }: DataRowActions): JSX.Element {\n return <DataTableRowActions entityName={entityName} entityNamePlural={entityNamePlural} row={row} />;\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/desk/list.tsx"],"names":["pageSize","defaultSort","List","entityName","useParams","search","useLocation","entityId","scope","useAppContext","schemaErrorMessage","useGraphQLError","currentProject","useConfig","schema","entitySchema","getEntitySchema","sorting","setSorting","useState","scrollToTopKey","setScrollToTopKey","sortedEntityName","setSortedEntityName","columnsDefinition","useGridColumnsDefinition","row","dataRowActions","graphqlSort","useMemo","primarySort","id","desc","entry","sortNotNullWhere","getSortNotNullWhere","variables","isLoading","isLoadingMore","fetchMore","reload","count","data","isProjectDisabled","useEntityQuery","handleSortingChange","updater","rowsCount","hasMore","handleLoadMore","useCallback","handleReload","key","loadingData","loadingColumns","getLoadingColumns","isInitialLoading","jsx","ProjectDisabled","jsxs","SchemaError","Tooltip","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","capitalize","DataTable","table","DataTableToolbar","Outlet","str","entityNamePlural","DataTableRowActions","columns","column","Skeleton"],"mappings":"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","file":"list-R3FH7CYE.js","sourcesContent":["import { JSX, useCallback, useMemo, useState } from 'react';\nimport { useLocation, useParams, Outlet } from 'react-router-dom';\nimport type { ColumnDef, Row, SortingState, Updater } from '@tanstack/react-table';\nimport { getEntitySchema, getSortNotNullWhere } from '../../graphql-client/queries';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { DataTable } from '../../data-grid/data-table';\nimport { DataTableRowActions } from '../../data-grid/data-table-row-actions';\nimport { DataTableToolbar } from '../../data-grid/data-table-toolbar';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton, SidebarTrigger, Separator, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const { entity: entityName } = useParams();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const entitySchema = getEntitySchema(schema, entityName ?? '');\n const [sorting, setSorting] = useState<SortingState>([]);\n const [scrollToTopKey, setScrollToTopKey] = useState(0);\n const [sortedEntityName, setSortedEntityName] = useState(entityName);\n\n if (entityName !== sortedEntityName) {\n setSortedEntityName(entityName);\n setSorting([]);\n }\n\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: entitySchema?.attributes ?? [],\n actionsComponent: (row) =>\n dataRowActions({ entityName: entitySchema?.name ?? '', entityNamePlural: entityName ?? '', row }),\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n const sortNotNullWhere = useMemo(() => {\n if (sorting.length === 0) {\n return undefined;\n }\n\n return getSortNotNullWhere(graphqlSort, entitySchema);\n }, [entitySchema, graphqlSort, sorting.length]);\n\n const variables = entityId\n ? { where: { _id: { eq: entityId } } }\n : {\n offset: 0,\n limit: pageSize,\n sort: graphqlSort,\n ...(sortNotNullWhere ? { where: sortNotNullWhere } : {}),\n };\n\n const { isLoading, isLoadingMore, fetchMore, reload, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n const rowsCount = data?.length ?? 0;\n const hasMore = count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const handleReload = useCallback(() => {\n setScrollToTopKey((key) => key + 1);\n reload();\n }, [reload]);\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n const isInitialLoading = isLoading && (data == null || data.length === 0);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3\">\n <SchemaError />\n <div className=\"fk:flex fk:items-center fk:mb-4 fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:w-4 fk:h-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {capitalize(entitySchema?.menu?.label ?? entitySchema?.plural ?? '')}\n </h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <DataTable\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : (data ?? [])}\n entityName={entitySchema?.name ?? ''}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n scrollToTopKey={scrollToTopKey}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={entitySchema?.name ?? ''}\n isReloading={isInitialLoading}\n onReload={handleReload}\n table={table}\n />\n )}\n />\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\ntype DataRowActions = {\n entityName: string;\n entityNamePlural: string;\n row: Row<AttributeValue>;\n};\n\nfunction dataRowActions({ entityName, entityNamePlural, row }: DataRowActions): JSX.Element {\n return <DataTableRowActions entityName={entityName} entityNamePlural={entityNamePlural} row={row} />;\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n"]}
@@ -1,3 +1,3 @@
1
- import'./index.css';import {a as a$1}from'./chunk-CLCIE5RF.js';import {a}from'./chunk-EMFHKTAV.js';import {e,b as b$1,j as j$1,n,c as c$3,i as i$1,h as h$1,l as l$1,o,k as k$2}from'./chunk-K2KW6UYG.js';import'./chunk-2NXQF2F7.js';import {c}from'./chunk-CAZ6EUR2.js';import {b}from'./chunk-LIMXKPEK.js';import {w,j,d,x,c as c$2,a as a$2,e as e$3,k as k$1,i as i$2,f,g}from'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-6AI7322C.js';import'./chunk-JIB4PRLH.js';import'./chunk-5CVDMZUI.js';import {Tc,Vc,s,c as c$1,d as d$1,na,$,aa,da,ea,ba,O,e as e$2,qa,fa}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v,c as c$5,h,i,k,l,j as j$2,b as b$4}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$3,c as c$4,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useRef,useMemo,useEffect}from'react';import {formatDistance,format}from'date-fns';import {SearchIcon,XIcon,ListIcon,LayoutGridIcon,LinkIcon,UploadIcon,LoaderCircle}from'lucide-react';import {useNavigate,Link}from'react-router-dom';import st from'swr/infinite';import {jsx,jsxs}from'react/jsx-runtime';var He=25,it=3e3,rt=250;function ft(t,a){let[o,s]=useState(t);return useEffect(()=>{let r=setTimeout(()=>s(t),a);return ()=>clearTimeout(r)},[a,t]),o}var dt={failed:"No document failed to index.",processing:"No document is being indexed right now.",ready:"No document is ready yet."};function ct({viewMode:t$1}){let a=["a","b","c","d","e","f"];return t$1==="grid"?jsxs("div",{"aria-busy":"true",className:Oe,children:[jsx("span",{className:"fk:sr-only",children:"Loading documents"}),a.map(o=>jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:p-3 fk:corner-squircle",children:[jsxs("span",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(t,{className:"fk:size-6 fk:rounded-md"}),jsx(t,{className:"fk:h-4 fk:flex-1"})]}),jsx(t,{className:"fk:aspect-[4/3] fk:w-full fk:rounded-lg"})]},o))]}):jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col",children:[jsx("span",{className:"fk:sr-only",children:"Loading documents"}),a.map(o=>jsxs("div",{className:"fk:flex fk:h-12 fk:items-center fk:gap-3 fk:border-b fk:px-3",children:[jsx(t,{className:"fk:size-6 fk:shrink-0 fk:rounded-md"}),jsx(t,{className:"fk:h-4 fk:w-1/3"}),jsx(t,{className:"fk:ml-auto fk:h-4 fk:w-16"}),jsx(t,{className:"fk:hidden fk:h-4 fk:w-24 fk:md:block"})]},o))]})}function kt(t,a){let[o,s]=useState([]),r=useRef(Promise.resolve());function m(p){if(t)for(let f of p){let u=e$3(f);if(u){qa.error(u);continue}let d={id:`${f.name}-${String(Date.now())}-${String(Math.random())}`,name:f.name};s(i=>[...i,d]),r.current=r.current.then(async()=>{try{let i=await t.addFile(f);i$1(i,f.name),a();}catch(i){qa.error(h$1(i,`${f.name} could not be added.`));}finally{s(i=>i.filter(w=>w.id!==d.id));}}).catch(()=>{});}}return {addFiles:m,pending:o}}function ut({api:t,onOpenChange:a,onRegistered:o,open:s$1}){let[r,m]=useState(""),[p,f]=useState(""),[u,d]=useState(""),[i$2,w]=useState(false);function N(){a(false),m(""),f(""),d("");}async function K(c){c.preventDefault();let x=g(r);if("error"in x){d(x.error);return}w(true),d("");try{let E=await t.addUrl({title:p.trim()||void 0,url:x.url});i$1(E,x.url),o(),N();}catch(E){d(h$1(E,"The page could not be added."));}finally{w(false);}}return jsx(c$5,{open:s$1,onOpenChange:c=>c?a(true):N(),children:jsx(h,{children:jsxs("form",{className:"fk:flex fk:flex-col fk:gap-4",onSubmit:c=>{K(c);},children:[jsxs(i,{children:[jsx(k,{children:"Add a web page"}),jsx(l,{children:"The page is fetched and indexed now, and again whenever you re-index it. Only public pages work."})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-url",children:"Address"}),jsx(s,{autoFocus:true,id:"knowledge-url",inputMode:"url",placeholder:"https://example.com/help/returns",value:r,onChange:c=>{m(c.target.value),d("");}})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-url-title",children:"Title (optional)"}),jsx(s,{id:"knowledge-url-title",maxLength:a$2,placeholder:"Defaults to the page address",value:p,onChange:c=>f(c.target.value)})]}),u?jsx("p",{className:"fk:text-sm fk:text-destructive",children:u}):null,jsxs(j$2,{children:[jsx(b$2,{disabled:i$2,size:"sm",type:"button",variant:"outline",onClick:N,children:"Cancel"}),jsxs(b$2,{disabled:i$2||!r.trim(),size:"sm",type:"submit",children:[i$2?jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}):jsx(LinkIcon,{className:"fk:size-4"}),"Add page"]})]})]})})})}var Oe="fk:grid fk:grid-cols-[repeat(auto-fill,minmax(14rem,1fr))] fk:gap-4";function mt(t){return format(new Date(t),"MMM d, yyyy")}function Ue(){return jsx(b$4,{className:"fk:shrink-0 fk:corner-squircle",variant:"outline",children:"Hidden from agent"})}function Ge(){return jsx(b$4,{className:"fk:shrink-0 fk:corner-squircle","data-knowledge-content-match":true,variant:"secondary",children:"In content"})}function pt(t,a){let o=t.target;t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||!t.currentTarget.contains(o)||o.closest("a, button")||a();}function gt({source:t,...a}){let o$1=k$1(t),s=o$1.tone==="ready"?"fk:hidden fk:xl:inline":"fk:hidden fk:md:inline";return jsxs(da,{className:"fk:h-12 fk:cursor-pointer","data-knowledge-row":true,onClick:r=>pt(r,()=>a.onOpen(t)),children:[jsx(fa,{className:"fk:max-w-0 fk:w-full",children:jsxs("span",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-3",children:[jsx(l$1,{source:t}),jsx(Link,{className:"fk:truncate fk:text-sm fk:font-medium fk:hover:underline fk:underline-offset-2 fk:focus-visible:outline-none fk:focus-visible:underline",to:t.id,children:t.title}),t.matchedIn==="content"?jsx(Ge,{}):null,t.agentVisible?null:jsx(Ue,{})]})}),jsx(fa,{className:"fk:whitespace-nowrap",children:jsxs("span",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(k$2,{label:o$1.label,tone:o$1.tone}),jsx("span",{className:`${s} fk:max-w-64 fk:truncate fk:text-xs fk:text-muted-foreground`,title:o$1.detail,children:o$1.detail})]})}),jsx(fa,{className:"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:md:table-cell",children:i$2(t)}),jsx(fa,{className:"fk:hidden fk:whitespace-nowrap fk:text-right fk:tabular-nums fk:text-muted-foreground fk:md:table-cell",children:t.size===null?"\u2014":f(t.size)}),jsx(fa,{className:"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:sm:table-cell",children:jsxs(b$3,{children:[jsx(c$4,{asChild:true,children:jsx("span",{children:mt(t.createdAt)})}),jsxs(e$1,{children:["Updated ",formatDistance(new Date(t.updatedAt),new Date,{addSuffix:true})]})]})}),jsx(fa,{className:"fk:w-12 fk:pr-2 fk:text-right",children:jsx(o,{source:t,onOpen:()=>a.onOpen(t),onRemoved:()=>a.onRemoved(t)})})]})}function ht({sources:t,...a}){return jsxs($,{"data-knowledge-list":true,children:[jsx(aa,{children:jsxs(da,{className:"fk:hover:bg-transparent",children:[jsx(ea,{children:"Name"}),jsx(ea,{children:"Status"}),jsx(ea,{className:"fk:hidden fk:md:table-cell",children:"Type"}),jsx(ea,{className:"fk:hidden fk:text-right fk:md:table-cell",children:"Size"}),jsx(ea,{className:"fk:hidden fk:sm:table-cell",children:"Added"}),jsx(ea,{className:"fk:w-12",children:jsx("span",{className:"fk:sr-only",children:"Actions"})})]})}),jsx(ba,{children:t.map(o=>jsx(gt,{source:o,...a},o.id))})]})}function bt({source:t}){let a=t.preview?.trim();return jsx("div",{className:"fk:relative fk:aspect-[4/3] fk:overflow-hidden fk:rounded-lg fk:bg-muted fk:corner-squircle",children:a?jsxs("div",{"aria-hidden":true,className:"fk:absolute fk:inset-x-4 fk:top-3 fk:bottom-0 fk:overflow-hidden fk:rounded-t-sm fk:bg-background fk:px-3 fk:pt-3 fk:shadow-sm",children:[jsx("p",{className:"fk:whitespace-pre-line fk:text-[9px] fk:leading-[1.45] fk:text-foreground/80 fk:select-none",children:a}),jsx("span",{className:"fk:pointer-events-none fk:absolute fk:inset-x-0 fk:bottom-0 fk:h-10 fk:bg-gradient-to-t fk:from-background fk:to-transparent"})]}):jsx("div",{className:"fk:flex fk:h-full fk:items-center fk:justify-center",children:jsx(l$1,{size:56,source:t})})})}function vt({source:t,...a}){let o$1=k$1(t),s=[i$2(t)];return t.size!==null&&s.push(f(t.size)),s.push(o$1.detail),jsxs("div",{className:"fk:relative fk:flex fk:min-w-0 fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:bg-card fk:p-3 fk:transition-colors fk:hover:bg-accent/60 fk:has-[>a:focus-visible]:ring-2 fk:has-[>a:focus-visible]:ring-ring fk:corner-squircle","data-knowledge-card":true,title:t.title,children:[jsx(Link,{"aria-label":`Open ${t.title}`,className:"fk:absolute fk:inset-0 fk:rounded-xl fk:focus-visible:outline-none fk:corner-squircle",to:t.id}),jsxs("span",{className:"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2",children:[jsx(l$1,{source:t}),jsx("span",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-sm fk:font-medium",children:t.title}),jsx("span",{className:"fk:pointer-events-auto fk:-my-1 fk:-mr-1.5",children:jsx(o,{source:t,onOpen:()=>a.onOpen(t),onRemoved:()=>a.onRemoved(t)})})]}),jsx("span",{className:"fk:pointer-events-none fk:relative",children:jsx(bt,{source:t})}),jsxs("span",{className:"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2",children:[jsx(k$2,{label:o$1.label,tone:o$1.tone}),jsx("span",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-xs fk:text-muted-foreground",children:s.join(" \xB7 ")}),t.matchedIn==="content"?jsx(Ge,{}):null,t.agentVisible?null:jsx(Ue,{})]})]})}function wt({sources:t,...a}){return jsx("div",{className:Oe,"data-knowledge-grid":true,children:t.map(o=>jsx(vt,{source:o,...a},o.id))})}function Nt(){return jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$4,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:"Knowledge"})]})}function Pt(){let{api:t,projectId:a$2}=e(),o=useNavigate(),s$1=b(),r=c(),m=a(),[p,f]=useState(""),u=ft(p.trim(),rt),[d$2,i]=useState(()=>w()),[w$1,N]=useState(false),K=useRef(null),c$4=useRef(null),[x$1,E]=useState(false),Ve=(l,T)=>!a$2||T&&!T.hasMore?null:c$3(a$2).sources({limit:He,offset:l*He,search:u||void 0,status:m}),{data:h,isLoading:Xe,mutate:L,setSize:A,size:Je}=st(Ve,b$1,{refreshInterval:r&&x$1?it:0}),S=useMemo(()=>h?.flatMap(l=>l.sources)??[],[h]),z=h?.[0]?.count??0,qe=h?.[h.length-1]?.hasMore??false,te=h!==void 0&&Je>h.length,$e=Xe&&S.length===0,{addFiles:ne,pending:ae}=kt(t,()=>{L();}),oe=useRef(L);oe.current=L,useEffect(()=>{oe.current();},[]),useEffect(()=>{E(S.some(l=>j(l)));},[S]);let le=useRef(A);if(le.current=A,useEffect(()=>{le.current(1);},[u]),!a$2||!t)return jsx(j$1,{children:"Select a project to manage its knowledge."});function je(l){let T=Array.from(l.target.files??[]);l.target.value="",ne(T);}let P=`No documents yet. Upload ${d} files, or add a public web page, and the agent will search and cite them.`;u?P="No document title or content matches your search.":m&&(P=dt[m]);let se={onOpen:l=>{o(l.id);},onRemoved:l=>{L(T=>T?.map(F=>({...F,count:Math.max(0,F.count-1),sources:F.sources.filter(We=>We.id!==l.id)})),{revalidate:true});}},R=d$2==="grid"?jsx(wt,{sources:S,...se}):jsx(ht,{sources:S,...se});return $e?R=jsx(ct,{viewMode:d$2}):S.length===0&&(R=jsx(Tc,{children:jsx(Vc,{children:P})})),jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsx(Nt,{}),jsx(a$1,{disabled:!s$1,onDropFiles:ne,children:jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:flex fk:w-full fk:flex-col fk:gap-5 fk:py-4 fk:pl-4 fk:pr-6",children:[jsxs("div",{children:[jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:"Documents"}),jsx("p",{className:"fk:mt-1 fk:text-sm fk:text-muted-foreground",children:"Policies, manuals, specs and other reference material for your team and agents. The agent searches them when a question needs them and cites the passage it used."})]}),jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:[jsxs("div",{className:"fk:relative fk:w-full fk:max-w-sm",children:[jsx(SearchIcon,{className:"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground"}),jsx(s,{"aria-label":"Search documents",className:"fk:pl-8 fk:pr-9",placeholder:"Search by title or content\u2026",ref:c$4,value:p,onChange:l=>f(l.target.value)}),p?jsx(b$2,{"aria-label":"Clear search",className:"fk:absolute fk:right-1.5 fk:top-1/2 fk:flex fk:size-6 fk:-translate-y-1/2 fk:items-center fk:justify-center fk:rounded-full fk:bg-transparent fk:text-muted-foreground fk:hover:bg-foreground/10 fk:hover:text-foreground fk:corner-squircle","data-knowledge-clear-search":true,type:"button",onClick:()=>{f(""),c$4.current?.focus();},children:jsx(XIcon,{className:"fk:size-4"})}):null]}),z>0?jsxs("span",{className:"fk:text-sm fk:text-muted-foreground",children:[z.toLocaleString()," ",z===1?"document":"documents"]}):null,jsxs("div",{className:"fk:ml-auto fk:flex fk:items-center fk:gap-2",children:[jsxs(c$1,{"aria-label":"Layout",size:"sm",type:"single",value:d$2,variant:"outline",onValueChange:l=>{(l==="list"||l==="grid")&&(i(l),x(l));},children:[jsx(d$1,{"aria-label":"List layout",value:"list",children:jsx(ListIcon,{className:"fk:size-4"})}),jsx(d$1,{"aria-label":"Grid layout",value:"grid",children:jsx(LayoutGridIcon,{className:"fk:size-4"})})]}),jsx(na,{disabled:!s$1,children:jsxs(b$2,{disabled:!s$1,size:"sm",variant:"outline",onClick:()=>N(true),children:[jsx(LinkIcon,{}),"Add web page"]})}),jsx(na,{disabled:!s$1,children:jsxs(b$2,{disabled:!s$1,size:"sm",onClick:()=>K.current?.click(),children:[jsx(UploadIcon,{}),"Upload documents"]})}),jsx("input",{accept:c$2,className:"fk:hidden",multiple:true,ref:K,type:"file",onChange:je})]})]}),ae.length>0?jsx("div",{className:"fk:flex fk:flex-col fk:gap-1 fk:text-sm fk:text-muted-foreground",children:ae.map(l=>jsxs("span",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Uploading ",l.name,"\u2026"]},l.id))}):null,R,qe&&!te?jsx(n,{onVisible:()=>{A(l=>l+1);}}):null,te?jsxs("div",{className:"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),jsx("span",{children:"Loading more documents..."})]}):null]})})}),jsx(ut,{api:t,open:w$1,onOpenChange:N,onRegistered:()=>{L();}})]})}
2
- export{Pt as List};//# sourceMappingURL=list-FQZII7QD.js.map
3
- //# sourceMappingURL=list-FQZII7QD.js.map
1
+ import'./index.css';import {a as a$1}from'./chunk-CLCIE5RF.js';import {a}from'./chunk-EMFHKTAV.js';import {e,b as b$1,j as j$1,n,c as c$3,i as i$1,h as h$1,l as l$1,o,k as k$2}from'./chunk-CJHMUEOB.js';import'./chunk-2NXQF2F7.js';import {c}from'./chunk-CAZ6EUR2.js';import {b}from'./chunk-V7C4EHK3.js';import {w,j,d,x,c as c$2,a as a$2,e as e$3,k as k$1,i as i$2,f,g}from'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-EYIV4KVY.js';import'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import {Tc,Vc,s,c as c$1,d as d$1,na,$,aa,da,ea,ba,O,e as e$2,qa,fa}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v,c as c$5,h,i,k,l,j as j$2,b as b$4}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$3,c as c$4,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useRef,useMemo,useEffect}from'react';import {formatDistance,format}from'date-fns';import {SearchIcon,XIcon,ListIcon,LayoutGridIcon,LinkIcon,UploadIcon,LoaderCircle}from'lucide-react';import {useNavigate,Link}from'react-router-dom';import st from'swr/infinite';import {jsx,jsxs}from'react/jsx-runtime';var He=25,it=3e3,rt=250;function ft(t,a){let[o,s]=useState(t);return useEffect(()=>{let r=setTimeout(()=>s(t),a);return ()=>clearTimeout(r)},[a,t]),o}var dt={failed:"No document failed to index.",processing:"No document is being indexed right now.",ready:"No document is ready yet."};function ct({viewMode:t$1}){let a=["a","b","c","d","e","f"];return t$1==="grid"?jsxs("div",{"aria-busy":"true",className:Oe,children:[jsx("span",{className:"fk:sr-only",children:"Loading documents"}),a.map(o=>jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:p-3 fk:corner-squircle",children:[jsxs("span",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(t,{className:"fk:size-6 fk:rounded-md"}),jsx(t,{className:"fk:h-4 fk:flex-1"})]}),jsx(t,{className:"fk:aspect-[4/3] fk:w-full fk:rounded-lg"})]},o))]}):jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col",children:[jsx("span",{className:"fk:sr-only",children:"Loading documents"}),a.map(o=>jsxs("div",{className:"fk:flex fk:h-12 fk:items-center fk:gap-3 fk:border-b fk:px-3",children:[jsx(t,{className:"fk:size-6 fk:shrink-0 fk:rounded-md"}),jsx(t,{className:"fk:h-4 fk:w-1/3"}),jsx(t,{className:"fk:ml-auto fk:h-4 fk:w-16"}),jsx(t,{className:"fk:hidden fk:h-4 fk:w-24 fk:md:block"})]},o))]})}function kt(t,a){let[o,s]=useState([]),r=useRef(Promise.resolve());function m(p){if(t)for(let f of p){let u=e$3(f);if(u){qa.error(u);continue}let d={id:`${f.name}-${String(Date.now())}-${String(Math.random())}`,name:f.name};s(i=>[...i,d]),r.current=r.current.then(async()=>{try{let i=await t.addFile(f);i$1(i,f.name),a();}catch(i){qa.error(h$1(i,`${f.name} could not be added.`));}finally{s(i=>i.filter(w=>w.id!==d.id));}}).catch(()=>{});}}return {addFiles:m,pending:o}}function ut({api:t,onOpenChange:a,onRegistered:o,open:s$1}){let[r,m]=useState(""),[p,f]=useState(""),[u,d]=useState(""),[i$2,w]=useState(false);function N(){a(false),m(""),f(""),d("");}async function K(c){c.preventDefault();let x=g(r);if("error"in x){d(x.error);return}w(true),d("");try{let E=await t.addUrl({title:p.trim()||void 0,url:x.url});i$1(E,x.url),o(),N();}catch(E){d(h$1(E,"The page could not be added."));}finally{w(false);}}return jsx(c$5,{open:s$1,onOpenChange:c=>c?a(true):N(),children:jsx(h,{children:jsxs("form",{className:"fk:flex fk:flex-col fk:gap-4",onSubmit:c=>{K(c);},children:[jsxs(i,{children:[jsx(k,{children:"Add a web page"}),jsx(l,{children:"The page is fetched and indexed now, and again whenever you re-index it. Only public pages work."})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-url",children:"Address"}),jsx(s,{autoFocus:true,id:"knowledge-url",inputMode:"url",placeholder:"https://example.com/help/returns",value:r,onChange:c=>{m(c.target.value),d("");}})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-url-title",children:"Title (optional)"}),jsx(s,{id:"knowledge-url-title",maxLength:a$2,placeholder:"Defaults to the page address",value:p,onChange:c=>f(c.target.value)})]}),u?jsx("p",{className:"fk:text-sm fk:text-destructive",children:u}):null,jsxs(j$2,{children:[jsx(b$2,{disabled:i$2,size:"sm",type:"button",variant:"outline",onClick:N,children:"Cancel"}),jsxs(b$2,{disabled:i$2||!r.trim(),size:"sm",type:"submit",children:[i$2?jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}):jsx(LinkIcon,{className:"fk:size-4"}),"Add page"]})]})]})})})}var Oe="fk:grid fk:grid-cols-[repeat(auto-fill,minmax(14rem,1fr))] fk:gap-4";function mt(t){return format(new Date(t),"MMM d, yyyy")}function Ue(){return jsx(b$4,{className:"fk:shrink-0 fk:corner-squircle",variant:"outline",children:"Hidden from agent"})}function Ge(){return jsx(b$4,{className:"fk:shrink-0 fk:corner-squircle","data-knowledge-content-match":true,variant:"secondary",children:"In content"})}function pt(t,a){let o=t.target;t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||!t.currentTarget.contains(o)||o.closest("a, button")||a();}function gt({source:t,...a}){let o$1=k$1(t),s=o$1.tone==="ready"?"fk:hidden fk:xl:inline":"fk:hidden fk:md:inline";return jsxs(da,{className:"fk:h-12 fk:cursor-pointer","data-knowledge-row":true,onClick:r=>pt(r,()=>a.onOpen(t)),children:[jsx(fa,{className:"fk:max-w-0 fk:w-full",children:jsxs("span",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-3",children:[jsx(l$1,{source:t}),jsx(Link,{className:"fk:truncate fk:text-sm fk:font-medium fk:hover:underline fk:underline-offset-2 fk:focus-visible:outline-none fk:focus-visible:underline",to:t.id,children:t.title}),t.matchedIn==="content"?jsx(Ge,{}):null,t.agentVisible?null:jsx(Ue,{})]})}),jsx(fa,{className:"fk:whitespace-nowrap",children:jsxs("span",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(k$2,{label:o$1.label,tone:o$1.tone}),jsx("span",{className:`${s} fk:max-w-64 fk:truncate fk:text-xs fk:text-muted-foreground`,title:o$1.detail,children:o$1.detail})]})}),jsx(fa,{className:"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:md:table-cell",children:i$2(t)}),jsx(fa,{className:"fk:hidden fk:whitespace-nowrap fk:text-right fk:tabular-nums fk:text-muted-foreground fk:md:table-cell",children:t.size===null?"\u2014":f(t.size)}),jsx(fa,{className:"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:sm:table-cell",children:jsxs(b$3,{children:[jsx(c$4,{asChild:true,children:jsx("span",{children:mt(t.createdAt)})}),jsxs(e$1,{children:["Updated ",formatDistance(new Date(t.updatedAt),new Date,{addSuffix:true})]})]})}),jsx(fa,{className:"fk:w-12 fk:pr-2 fk:text-right",children:jsx(o,{source:t,onOpen:()=>a.onOpen(t),onRemoved:()=>a.onRemoved(t)})})]})}function ht({sources:t,...a}){return jsxs($,{"data-knowledge-list":true,children:[jsx(aa,{children:jsxs(da,{className:"fk:hover:bg-transparent",children:[jsx(ea,{children:"Name"}),jsx(ea,{children:"Status"}),jsx(ea,{className:"fk:hidden fk:md:table-cell",children:"Type"}),jsx(ea,{className:"fk:hidden fk:text-right fk:md:table-cell",children:"Size"}),jsx(ea,{className:"fk:hidden fk:sm:table-cell",children:"Added"}),jsx(ea,{className:"fk:w-12",children:jsx("span",{className:"fk:sr-only",children:"Actions"})})]})}),jsx(ba,{children:t.map(o=>jsx(gt,{source:o,...a},o.id))})]})}function bt({source:t}){let a=t.preview?.trim();return jsx("div",{className:"fk:relative fk:aspect-[4/3] fk:overflow-hidden fk:rounded-lg fk:bg-muted fk:corner-squircle",children:a?jsxs("div",{"aria-hidden":true,className:"fk:absolute fk:inset-x-4 fk:top-3 fk:bottom-0 fk:overflow-hidden fk:rounded-t-sm fk:bg-background fk:px-3 fk:pt-3 fk:shadow-sm",children:[jsx("p",{className:"fk:whitespace-pre-line fk:text-[9px] fk:leading-[1.45] fk:text-foreground/80 fk:select-none",children:a}),jsx("span",{className:"fk:pointer-events-none fk:absolute fk:inset-x-0 fk:bottom-0 fk:h-10 fk:bg-gradient-to-t fk:from-background fk:to-transparent"})]}):jsx("div",{className:"fk:flex fk:h-full fk:items-center fk:justify-center",children:jsx(l$1,{size:56,source:t})})})}function vt({source:t,...a}){let o$1=k$1(t),s=[i$2(t)];return t.size!==null&&s.push(f(t.size)),s.push(o$1.detail),jsxs("div",{className:"fk:relative fk:flex fk:min-w-0 fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:bg-card fk:p-3 fk:transition-colors fk:hover:bg-accent/60 fk:has-[>a:focus-visible]:ring-2 fk:has-[>a:focus-visible]:ring-ring fk:corner-squircle","data-knowledge-card":true,title:t.title,children:[jsx(Link,{"aria-label":`Open ${t.title}`,className:"fk:absolute fk:inset-0 fk:rounded-xl fk:focus-visible:outline-none fk:corner-squircle",to:t.id}),jsxs("span",{className:"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2",children:[jsx(l$1,{source:t}),jsx("span",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-sm fk:font-medium",children:t.title}),jsx("span",{className:"fk:pointer-events-auto fk:-my-1 fk:-mr-1.5",children:jsx(o,{source:t,onOpen:()=>a.onOpen(t),onRemoved:()=>a.onRemoved(t)})})]}),jsx("span",{className:"fk:pointer-events-none fk:relative",children:jsx(bt,{source:t})}),jsxs("span",{className:"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2",children:[jsx(k$2,{label:o$1.label,tone:o$1.tone}),jsx("span",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-xs fk:text-muted-foreground",children:s.join(" \xB7 ")}),t.matchedIn==="content"?jsx(Ge,{}):null,t.agentVisible?null:jsx(Ue,{})]})]})}function wt({sources:t,...a}){return jsx("div",{className:Oe,"data-knowledge-grid":true,children:t.map(o=>jsx(vt,{source:o,...a},o.id))})}function Nt(){return jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$4,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:"Knowledge"})]})}function Pt(){let{api:t,projectId:a$2}=e(),o=useNavigate(),s$1=b(),r=c(),m=a(),[p,f]=useState(""),u=ft(p.trim(),rt),[d$2,i]=useState(()=>w()),[w$1,N]=useState(false),K=useRef(null),c$4=useRef(null),[x$1,E]=useState(false),Ve=(l,T)=>!a$2||T&&!T.hasMore?null:c$3(a$2).sources({limit:He,offset:l*He,search:u||void 0,status:m}),{data:h,isLoading:Xe,mutate:L,setSize:A,size:Je}=st(Ve,b$1,{refreshInterval:r&&x$1?it:0}),S=useMemo(()=>h?.flatMap(l=>l.sources)??[],[h]),z=h?.[0]?.count??0,qe=h?.[h.length-1]?.hasMore??false,te=h!==void 0&&Je>h.length,$e=Xe&&S.length===0,{addFiles:ne,pending:ae}=kt(t,()=>{L();}),oe=useRef(L);oe.current=L,useEffect(()=>{oe.current();},[]),useEffect(()=>{E(S.some(l=>j(l)));},[S]);let le=useRef(A);if(le.current=A,useEffect(()=>{le.current(1);},[u]),!a$2||!t)return jsx(j$1,{children:"Select a project to manage its knowledge."});function je(l){let T=Array.from(l.target.files??[]);l.target.value="",ne(T);}let P=`No documents yet. Upload ${d} files, or add a public web page, and the agent will search and cite them.`;u?P="No document title or content matches your search.":m&&(P=dt[m]);let se={onOpen:l=>{o(l.id);},onRemoved:l=>{L(T=>T?.map(F=>({...F,count:Math.max(0,F.count-1),sources:F.sources.filter(We=>We.id!==l.id)})),{revalidate:true});}},R=d$2==="grid"?jsx(wt,{sources:S,...se}):jsx(ht,{sources:S,...se});return $e?R=jsx(ct,{viewMode:d$2}):S.length===0&&(R=jsx(Tc,{children:jsx(Vc,{children:P})})),jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsx(Nt,{}),jsx(a$1,{disabled:!s$1,onDropFiles:ne,children:jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:flex fk:w-full fk:flex-col fk:gap-5 fk:py-4 fk:pl-4 fk:pr-6",children:[jsxs("div",{children:[jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:"Documents"}),jsx("p",{className:"fk:mt-1 fk:text-sm fk:text-muted-foreground",children:"Policies, manuals, specs and other reference material for your team and agents. The agent searches them when a question needs them and cites the passage it used."})]}),jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:[jsxs("div",{className:"fk:relative fk:w-full fk:max-w-sm",children:[jsx(SearchIcon,{className:"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground"}),jsx(s,{"aria-label":"Search documents",className:"fk:pl-8 fk:pr-9",placeholder:"Search by title or content\u2026",ref:c$4,value:p,onChange:l=>f(l.target.value)}),p?jsx(b$2,{"aria-label":"Clear search",className:"fk:absolute fk:right-1.5 fk:top-1/2 fk:flex fk:size-6 fk:-translate-y-1/2 fk:items-center fk:justify-center fk:rounded-full fk:bg-transparent fk:text-muted-foreground fk:hover:bg-foreground/10 fk:hover:text-foreground fk:corner-squircle","data-knowledge-clear-search":true,type:"button",onClick:()=>{f(""),c$4.current?.focus();},children:jsx(XIcon,{className:"fk:size-4"})}):null]}),z>0?jsxs("span",{className:"fk:text-sm fk:text-muted-foreground",children:[z.toLocaleString()," ",z===1?"document":"documents"]}):null,jsxs("div",{className:"fk:ml-auto fk:flex fk:items-center fk:gap-2",children:[jsxs(c$1,{"aria-label":"Layout",size:"sm",type:"single",value:d$2,variant:"outline",onValueChange:l=>{(l==="list"||l==="grid")&&(i(l),x(l));},children:[jsx(d$1,{"aria-label":"List layout",value:"list",children:jsx(ListIcon,{className:"fk:size-4"})}),jsx(d$1,{"aria-label":"Grid layout",value:"grid",children:jsx(LayoutGridIcon,{className:"fk:size-4"})})]}),jsx(na,{disabled:!s$1,children:jsxs(b$2,{disabled:!s$1,size:"sm",variant:"outline",onClick:()=>N(true),children:[jsx(LinkIcon,{}),"Add web page"]})}),jsx(na,{disabled:!s$1,children:jsxs(b$2,{disabled:!s$1,size:"sm",onClick:()=>K.current?.click(),children:[jsx(UploadIcon,{}),"Upload documents"]})}),jsx("input",{accept:c$2,className:"fk:hidden",multiple:true,ref:K,type:"file",onChange:je})]})]}),ae.length>0?jsx("div",{className:"fk:flex fk:flex-col fk:gap-1 fk:text-sm fk:text-muted-foreground",children:ae.map(l=>jsxs("span",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Uploading ",l.name,"\u2026"]},l.id))}):null,R,qe&&!te?jsx(n,{onVisible:()=>{A(l=>l+1);}}):null,te?jsxs("div",{className:"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),jsx("span",{children:"Loading more documents..."})]}):null]})})}),jsx(ut,{api:t,open:w$1,onOpenChange:N,onRegistered:()=>{L();}})]})}
2
+ export{Pt as List};//# sourceMappingURL=list-RZROVSNS.js.map
3
+ //# sourceMappingURL=list-RZROVSNS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/list.tsx"],"names":["KNOWLEDGE_PAGE_SIZE","LIST_POLL_INTERVAL_MS","SEARCH_DEBOUNCE_MS","useDebouncedValue","value","delayMs","debounced","setDebounced","useState","useEffect","timer","EMPTY_BY_FILTER","KnowledgeListSkeleton","viewMode","ids","jsxs","GRID_CLASSES","jsx","id","Skeleton","useKnowledgeUploads","api","onRegistered","pending","setPending","queueRef","useRef","addFiles","files","file","problem","getKnowledgeFileProblem","toast","upload","current","result","announceRegistered","error","describeApiError","entry","AddUrlDialog","onOpenChange","open","setValue","title","setTitle","setError","isSubmitting","setIsSubmitting","close","handleSubmit","event","parsed","parseKnowledgeUrl","submitError","Dialog","next","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","DialogFooter","Button","LoaderCircle","LinkIcon","formatAdded","iso","format","HiddenBadge","Badge","ContentMatchBadge","handleRowClick","target","SourceListRow","source","actions","status","summarizeKnowledgeStatus","detailClass","TableRow","TableCell","KnowledgeTypeIcon","Link","StatusBadge","getKnowledgeKindLabel","formatFileSize","Tooltip","TooltipTrigger","TooltipContent","formatDistance","SourceActionsMenu","SourceTable","sources","Table","TableHeader","TableHead","TableBody","SourcePreview","preview","SourceCard","meta","SourceGrid","ListHeader","SidebarTrigger","Separator","List","projectId","useProjectKnowledge","navigate","useNavigate","canMutate","useCanMutate","isViewing","useIsViewing","useKnowledgeStatusFilter","search","setSearch","query","setViewMode","getStoredKnowledgeViewMode","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","searchInputRef","isBusy","setIsBusy","getSourcesKey","pageIndex","previousPage","knowledgePaths","pages","isLoading","mutate","setSize","size","useSWRInfinite","fetcher","useMemo","page","total","hasMore","isLoadingMore","isInitialLoading","mutateRef","isKnowledgeSourceBusy","setSizeRef","PageMessage","handleFilesPicked","emptyMessage","KNOWLEDGE_FORMATS_LABEL","removed","content","Alert","AlertDescription","AssetDropZone","SearchIcon","XIcon","ToggleGroup","setStoredKnowledgeViewMode","ToggleGroupItem","ListIcon","LayoutGridIcon","PermissionTooltip","UploadIcon","KNOWLEDGE_ACCEPT","InfiniteScrollSentinel"],"mappings":"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","file":"list-FQZII7QD.js","sourcesContent":["import type { ChangeEvent, FormEvent, JSX, MouseEvent } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { format, formatDistance } from 'date-fns';\nimport { LayoutGridIcon, LinkIcon, ListIcon, LoaderCircle, SearchIcon, UploadIcon, XIcon } from 'lucide-react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport useSWRInfinite from 'swr/infinite';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n ToggleGroup,\n ToggleGroupItem,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { AssetDropZone } from '../asset-manager/data-grid/asset-drop-zone';\nimport { fetcher, knowledgePaths, type KnowledgeApi } from './api';\nimport {\n formatFileSize,\n getKnowledgeFileProblem,\n getKnowledgeKindLabel,\n getStoredKnowledgeViewMode,\n isKnowledgeSourceBusy,\n KNOWLEDGE_ACCEPT,\n KNOWLEDGE_FORMATS_LABEL,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n parseKnowledgeUrl,\n setStoredKnowledgeViewMode,\n summarizeKnowledgeStatus,\n type KnowledgeSource,\n type KnowledgeSourcesList,\n type KnowledgeViewMode,\n} from './knowledge';\nimport {\n announceRegistered,\n describeApiError,\n InfiniteScrollSentinel,\n KnowledgeTypeIcon,\n PageMessage,\n SourceActionsMenu,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\nimport { useKnowledgeStatusFilter } from './sidebar';\n\nconst KNOWLEDGE_PAGE_SIZE = 25;\nconst LIST_POLL_INTERVAL_MS = 3_000;\n/** Typing pauses this long before the list asks the platform; each ask now searches the documents' text too. */\nconst SEARCH_DEBOUNCE_MS = 250;\n\nfunction useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n\n return () => clearTimeout(timer);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nconst EMPTY_BY_FILTER = {\n failed: 'No document failed to index.',\n processing: 'No document is being indexed right now.',\n ready: 'No document is ready yet.',\n};\n\nfunction KnowledgeListSkeleton({ viewMode }: { viewMode: KnowledgeViewMode }): JSX.Element {\n const ids = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n if (viewMode === 'grid') {\n return (\n <div aria-busy=\"true\" className={GRID_CLASSES}>\n <span className=\"fk:sr-only\">Loading documents</span>\n {ids.map((id) => (\n <div className=\"fk:flex fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:p-3 fk:corner-squircle\" key={id}>\n <span className=\"fk:flex fk:items-center fk:gap-2\">\n <Skeleton className=\"fk:size-6 fk:rounded-md\" />\n <Skeleton className=\"fk:h-4 fk:flex-1\" />\n </span>\n <Skeleton className=\"fk:aspect-[4/3] fk:w-full fk:rounded-lg\" />\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col\">\n <span className=\"fk:sr-only\">Loading documents</span>\n {ids.map((id) => (\n <div className=\"fk:flex fk:h-12 fk:items-center fk:gap-3 fk:border-b fk:px-3\" key={id}>\n <Skeleton className=\"fk:size-6 fk:shrink-0 fk:rounded-md\" />\n <Skeleton className=\"fk:h-4 fk:w-1/3\" />\n <Skeleton className=\"fk:ml-auto fk:h-4 fk:w-16\" />\n <Skeleton className=\"fk:hidden fk:h-4 fk:w-24 fk:md:block\" />\n </div>\n ))}\n </div>\n );\n}\n\ninterface PendingUpload {\n id: string;\n name: string;\n}\n\n/** Runs file uploads one after another and reports each outcome; the list revalidates after every registration. */\nfunction useKnowledgeUploads(\n api: KnowledgeApi | null,\n onRegistered: () => void\n): {\n addFiles: (_files: File[]) => void;\n pending: PendingUpload[];\n} {\n const [pending, setPending] = useState<PendingUpload[]>([]);\n const queueRef = useRef<Promise<void>>(Promise.resolve());\n\n function addFiles(files: File[]): void {\n if (!api) {\n return;\n }\n\n for (const file of files) {\n const problem = getKnowledgeFileProblem(file);\n\n if (problem) {\n toast.error(problem);\n\n continue;\n }\n\n const upload: PendingUpload = {\n id: `${file.name}-${String(Date.now())}-${String(Math.random())}`,\n name: file.name,\n };\n\n setPending((current) => [...current, upload]);\n queueRef.current = queueRef.current\n .then(async () => {\n try {\n const result = await api.addFile(file);\n\n announceRegistered(result, file.name);\n onRegistered();\n } catch (error) {\n toast.error(describeApiError(error, `${file.name} could not be added.`));\n } finally {\n setPending((current) => current.filter((entry) => entry.id !== upload.id));\n }\n })\n .catch(() => undefined);\n }\n }\n\n return { addFiles, pending };\n}\n\nfunction AddUrlDialog({\n api,\n onOpenChange,\n onRegistered,\n open,\n}: {\n api: KnowledgeApi;\n onOpenChange: (_open: boolean) => void;\n onRegistered: () => void;\n open: boolean;\n}): JSX.Element {\n const [value, setValue] = useState('');\n const [title, setTitle] = useState('');\n const [error, setError] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n function close(): void {\n onOpenChange(false);\n setValue('');\n setTitle('');\n setError('');\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>): Promise<void> {\n event.preventDefault();\n\n const parsed = parseKnowledgeUrl(value);\n\n if ('error' in parsed) {\n setError(parsed.error);\n\n return;\n }\n\n setIsSubmitting(true);\n setError('');\n\n try {\n const result = await api.addUrl({ title: title.trim() || undefined, url: parsed.url });\n\n announceRegistered(result, parsed.url);\n onRegistered();\n close();\n } catch (submitError) {\n setError(describeApiError(submitError, 'The page could not be added.'));\n } finally {\n setIsSubmitting(false);\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : close())}>\n <DialogContent>\n <form className=\"fk:flex fk:flex-col fk:gap-4\" onSubmit={(event) => void handleSubmit(event)}>\n <DialogHeader>\n <DialogTitle>Add a web page</DialogTitle>\n <DialogDescription>\n The page is fetched and indexed now, and again whenever you re-index it. Only public pages work.\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-url\">Address</Label>\n <Input\n autoFocus\n id=\"knowledge-url\"\n inputMode=\"url\"\n placeholder=\"https://example.com/help/returns\"\n value={value}\n onChange={(event) => {\n setValue(event.target.value);\n setError('');\n }}\n />\n </div>\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-url-title\">Title (optional)</Label>\n <Input\n id=\"knowledge-url-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n placeholder=\"Defaults to the page address\"\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n />\n </div>\n {error ? <p className=\"fk:text-sm fk:text-destructive\">{error}</p> : null}\n <DialogFooter>\n <Button disabled={isSubmitting} size=\"sm\" type=\"button\" variant=\"outline\" onClick={close}>\n Cancel\n </Button>\n <Button disabled={isSubmitting || !value.trim()} size=\"sm\" type=\"submit\">\n {isSubmitting ? (\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n ) : (\n <LinkIcon className=\"fk:size-4\" />\n )}\n Add page\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nconst GRID_CLASSES = 'fk:grid fk:grid-cols-[repeat(auto-fill,minmax(14rem,1fr))] fk:gap-4';\n\nfunction formatAdded(iso: string): string {\n return format(new Date(iso), 'MMM d, yyyy');\n}\n\nfunction HiddenBadge(): JSX.Element {\n return (\n <Badge className=\"fk:shrink-0 fk:corner-squircle\" variant=\"outline\">\n Hidden from agent\n </Badge>\n );\n}\n\n/** A search hit whose title does not carry the words: the text inside does. */\nfunction ContentMatchBadge(): JSX.Element {\n return (\n <Badge className=\"fk:shrink-0 fk:corner-squircle\" data-knowledge-content-match variant=\"secondary\">\n In content\n </Badge>\n );\n}\n\ninterface SourceActions {\n onOpen: (_source: KnowledgeSource) => void;\n onRemoved: (_source: KnowledgeSource) => void;\n}\n\ntype SourceItemProps = SourceActions & { source: KnowledgeSource };\n\n/**\n * A plain click on the row opens the document. Clicks that bubbled up from\n * a portal (the menu, the removal dialog), modified clicks (the title link\n * handles new tabs itself) and clicks on the row's own controls are not.\n */\nfunction handleRowClick(event: MouseEvent<HTMLElement>, open: () => void): void {\n const target = event.target as Node;\n\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey ||\n !event.currentTarget.contains(target) ||\n (target as Element).closest('a, button')\n ) {\n return;\n }\n\n open();\n}\n\n/**\n * One line of the list: the type mark, the title as a real link (so it can\n * be opened in a new tab), then the status and facts in columns, like a file\n * manager. The whole row is clickable for the mouse; the link carries the\n * keyboard and assistive tech.\n */\nfunction SourceListRow({ source, ...actions }: SourceItemProps): JSX.Element {\n const status = summarizeKnowledgeStatus(source);\n // What went wrong, or what is happening, matters at every width; the passage count can wait for a wide one.\n const detailClass = status.tone === 'ready' ? 'fk:hidden fk:xl:inline' : 'fk:hidden fk:md:inline';\n\n return (\n <TableRow\n className=\"fk:h-12 fk:cursor-pointer\"\n data-knowledge-row\n onClick={(event) => handleRowClick(event, () => actions.onOpen(source))}\n >\n <TableCell className=\"fk:max-w-0 fk:w-full\">\n <span className=\"fk:flex fk:min-w-0 fk:items-center fk:gap-3\">\n <KnowledgeTypeIcon source={source} />\n <Link\n className=\"fk:truncate fk:text-sm fk:font-medium fk:hover:underline fk:underline-offset-2 fk:focus-visible:outline-none fk:focus-visible:underline\"\n to={source.id}\n >\n {source.title}\n </Link>\n {source.matchedIn === 'content' ? <ContentMatchBadge /> : null}\n {!source.agentVisible ? <HiddenBadge /> : null}\n </span>\n </TableCell>\n <TableCell className=\"fk:whitespace-nowrap\">\n <span className=\"fk:flex fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span\n className={`${detailClass} fk:max-w-64 fk:truncate fk:text-xs fk:text-muted-foreground`}\n title={status.detail}\n >\n {status.detail}\n </span>\n </span>\n </TableCell>\n <TableCell className=\"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:md:table-cell\">\n {getKnowledgeKindLabel(source)}\n </TableCell>\n <TableCell className=\"fk:hidden fk:whitespace-nowrap fk:text-right fk:tabular-nums fk:text-muted-foreground fk:md:table-cell\">\n {source.size === null ? '—' : formatFileSize(source.size)}\n </TableCell>\n <TableCell className=\"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:sm:table-cell\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span>{formatAdded(source.createdAt)}</span>\n </TooltipTrigger>\n <TooltipContent>\n Updated {formatDistance(new Date(source.updatedAt), new Date(), { addSuffix: true })}\n </TooltipContent>\n </Tooltip>\n </TableCell>\n <TableCell className=\"fk:w-12 fk:pr-2 fk:text-right\">\n <SourceActionsMenu\n source={source}\n onOpen={() => actions.onOpen(source)}\n onRemoved={() => actions.onRemoved(source)}\n />\n </TableCell>\n </TableRow>\n );\n}\n\nfunction SourceTable({ sources, ...actions }: SourceActions & { sources: KnowledgeSource[] }): JSX.Element {\n return (\n <Table data-knowledge-list>\n <TableHeader>\n <TableRow className=\"fk:hover:bg-transparent\">\n <TableHead>Name</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"fk:hidden fk:md:table-cell\">Type</TableHead>\n <TableHead className=\"fk:hidden fk:text-right fk:md:table-cell\">Size</TableHead>\n <TableHead className=\"fk:hidden fk:sm:table-cell\">Added</TableHead>\n <TableHead className=\"fk:w-12\">\n <span className=\"fk:sr-only\">Actions</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sources.map((source) => (\n <SourceListRow key={source.id} source={source} {...actions} />\n ))}\n </TableBody>\n </Table>\n );\n}\n\n/**\n * The card's thumbnail: the opening text of the document laid out like a\n * small page, the way a file manager shows the first page. Documents still\n * indexing, or without text, show their type mark instead.\n */\nfunction SourcePreview({ source }: { source: KnowledgeSource }): JSX.Element {\n const preview = source.preview?.trim();\n\n return (\n <div className=\"fk:relative fk:aspect-[4/3] fk:overflow-hidden fk:rounded-lg fk:bg-muted fk:corner-squircle\">\n {preview ? (\n <div\n aria-hidden\n className=\"fk:absolute fk:inset-x-4 fk:top-3 fk:bottom-0 fk:overflow-hidden fk:rounded-t-sm fk:bg-background fk:px-3 fk:pt-3 fk:shadow-sm\"\n >\n <p className=\"fk:whitespace-pre-line fk:text-[9px] fk:leading-[1.45] fk:text-foreground/80 fk:select-none\">\n {preview}\n </p>\n <span className=\"fk:pointer-events-none fk:absolute fk:inset-x-0 fk:bottom-0 fk:h-10 fk:bg-gradient-to-t fk:from-background fk:to-transparent\" />\n </div>\n ) : (\n <div className=\"fk:flex fk:h-full fk:items-center fk:justify-center\">\n <KnowledgeTypeIcon size={56} source={source} />\n </div>\n )}\n </div>\n );\n}\n\nfunction SourceCard({ source, ...actions }: SourceItemProps): JSX.Element {\n const status = summarizeKnowledgeStatus(source);\n const meta = [getKnowledgeKindLabel(source)];\n\n if (source.size !== null) {\n meta.push(formatFileSize(source.size));\n }\n\n meta.push(status.detail);\n\n // A link laid over the card opens the document (so it can be opened in a\n // new tab too); the menu button sits above it. The title tooltip lives on\n // the card itself, which does receive the pointer.\n return (\n <div\n className=\"fk:relative fk:flex fk:min-w-0 fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:bg-card fk:p-3 fk:transition-colors fk:hover:bg-accent/60 fk:has-[>a:focus-visible]:ring-2 fk:has-[>a:focus-visible]:ring-ring fk:corner-squircle\"\n data-knowledge-card\n title={source.title}\n >\n <Link\n aria-label={`Open ${source.title}`}\n className=\"fk:absolute fk:inset-0 fk:rounded-xl fk:focus-visible:outline-none fk:corner-squircle\"\n to={source.id}\n />\n <span className=\"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2\">\n <KnowledgeTypeIcon source={source} />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-sm fk:font-medium\">{source.title}</span>\n <span className=\"fk:pointer-events-auto fk:-my-1 fk:-mr-1.5\">\n <SourceActionsMenu\n source={source}\n onOpen={() => actions.onOpen(source)}\n onRemoved={() => actions.onRemoved(source)}\n />\n </span>\n </span>\n <span className=\"fk:pointer-events-none fk:relative\">\n <SourcePreview source={source} />\n </span>\n <span className=\"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-xs fk:text-muted-foreground\">{meta.join(' · ')}</span>\n {source.matchedIn === 'content' ? <ContentMatchBadge /> : null}\n {!source.agentVisible ? <HiddenBadge /> : null}\n </span>\n </div>\n );\n}\n\nfunction SourceGrid({ sources, ...actions }: SourceActions & { sources: KnowledgeSource[] }): JSX.Element {\n return (\n <div className={GRID_CLASSES} data-knowledge-grid>\n {sources.map((source) => (\n <SourceCard key={source.id} source={source} {...actions} />\n ))}\n </div>\n );\n}\n\nfunction ListHeader(): JSX.Element {\n return (\n <div className=\"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Knowledge</h1>\n </div>\n );\n}\n\nexport function List(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const status = useKnowledgeStatusFilter();\n const [search, setSearch] = useState('');\n const query = useDebouncedValue(search.trim(), SEARCH_DEBOUNCE_MS);\n const [viewMode, setViewMode] = useState<KnowledgeViewMode>(() => getStoredKnowledgeViewMode());\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const [isBusy, setIsBusy] = useState(false);\n const getSourcesKey = (pageIndex: number, previousPage: KnowledgeSourcesList | null): string | null => {\n if (!projectId || (previousPage && !previousPage.hasMore)) {\n return null;\n }\n\n return knowledgePaths(projectId).sources({\n limit: KNOWLEDGE_PAGE_SIZE,\n offset: pageIndex * KNOWLEDGE_PAGE_SIZE,\n search: query || undefined,\n status,\n });\n };\n const {\n data: pages,\n isLoading,\n mutate,\n setSize,\n size,\n } = useSWRInfinite<KnowledgeSourcesList>(getSourcesKey, fetcher, {\n // Rows that are still indexing change on their own; poll while one is in flight and the tab is in front.\n refreshInterval: isViewing && isBusy ? LIST_POLL_INTERVAL_MS : 0,\n });\n const sources = useMemo(() => pages?.flatMap((page) => page.sources) ?? [], [pages]);\n const total = pages?.[0]?.count ?? 0;\n const hasMore = pages?.[pages.length - 1]?.hasMore ?? false;\n const isLoadingMore = pages !== undefined && size > pages.length;\n const isInitialLoading = isLoading && sources.length === 0;\n const { addFiles, pending } = useKnowledgeUploads(api, () => void mutate());\n const mutateRef = useRef(mutate);\n\n mutateRef.current = mutate;\n\n // Coming back from a document page must show what changed there. The\n // infinite hook keeps serving its cached pages otherwise, whatever the\n // mount options.\n useEffect(() => {\n void mutateRef.current();\n }, []);\n\n useEffect(() => {\n setIsBusy(sources.some((source) => isKnowledgeSourceBusy(source)));\n }, [sources]);\n\n // A new search starts from its first page.\n const setSizeRef = useRef(setSize);\n\n setSizeRef.current = setSize;\n\n useEffect(() => {\n void setSizeRef.current(1);\n }, [query]);\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to manage its knowledge.</PageMessage>;\n }\n\n function handleFilesPicked(event: ChangeEvent<HTMLInputElement>): void {\n const files = Array.from(event.target.files ?? []);\n\n event.target.value = '';\n addFiles(files);\n }\n\n let emptyMessage = `No documents yet. Upload ${KNOWLEDGE_FORMATS_LABEL} files, or add a public web page, and the agent will search and cite them.`;\n\n if (query) {\n emptyMessage = 'No document title or content matches your search.';\n } else if (status) {\n emptyMessage = EMPTY_BY_FILTER[status];\n }\n\n const actions: SourceActions = {\n onOpen: (source) => void navigate(source.id),\n // Drop the row at once, then let this hook refetch its pages: the global\n // list invalidation clears other caches but never revalidates an infinite hook.\n onRemoved: (removed) =>\n void mutate(\n (current) =>\n current?.map((page) => ({\n ...page,\n count: Math.max(0, page.count - 1),\n sources: page.sources.filter((entry) => entry.id !== removed.id),\n })),\n { revalidate: true }\n ),\n };\n let content: JSX.Element =\n viewMode === 'grid' ? (\n <SourceGrid sources={sources} {...actions} />\n ) : (\n <SourceTable sources={sources} {...actions} />\n );\n\n if (isInitialLoading) {\n content = <KnowledgeListSkeleton viewMode={viewMode} />;\n } else if (sources.length === 0) {\n content = (\n <Alert>\n <AlertDescription>{emptyMessage}</AlertDescription>\n </Alert>\n );\n }\n\n return (\n <main className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">\n <ListHeader />\n <AssetDropZone disabled={!canMutate} onDropFiles={addFiles}>\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:flex fk:w-full fk:flex-col fk:gap-5 fk:py-4 fk:pl-4 fk:pr-6\">\n <div>\n <h2 className=\"fk:text-2xl fk:font-semibold\">Documents</h2>\n <p className=\"fk:mt-1 fk:text-sm fk:text-muted-foreground\">\n Policies, manuals, specs and other reference material for your team and agents. The agent searches them\n when a question needs them and cites the passage it used.\n </p>\n </div>\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-3\">\n <div className=\"fk:relative fk:w-full fk:max-w-sm\">\n <SearchIcon className=\"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground\" />\n <Input\n aria-label=\"Search documents\"\n className=\"fk:pl-8 fk:pr-9\"\n placeholder=\"Search by title or content…\"\n ref={searchInputRef}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1.5 fk:top-1/2 fk:flex fk:size-6 fk:-translate-y-1/2 fk:items-center fk:justify-center fk:rounded-full fk:bg-transparent fk:text-muted-foreground fk:hover:bg-foreground/10 fk:hover:text-foreground fk:corner-squircle\"\n data-knowledge-clear-search\n type=\"button\"\n onClick={() => {\n setSearch('');\n searchInputRef.current?.focus();\n }}\n >\n <XIcon className=\"fk:size-4\" />\n </Button>\n ) : null}\n </div>\n {total > 0 ? (\n <span className=\"fk:text-sm fk:text-muted-foreground\">\n {total.toLocaleString()} {total === 1 ? 'document' : 'documents'}\n </span>\n ) : null}\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n aria-label=\"Layout\"\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n variant=\"outline\"\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n setViewMode(value);\n setStoredKnowledgeViewMode(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"List layout\" value=\"list\">\n <ListIcon className=\"fk:size-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"Grid layout\" value=\"grid\">\n <LayoutGridIcon className=\"fk:size-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" variant=\"outline\" onClick={() => setIsUrlDialogOpen(true)}>\n <LinkIcon />\n Add web page\n </Button>\n </PermissionTooltip>\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" onClick={() => fileInputRef.current?.click()}>\n <UploadIcon />\n Upload documents\n </Button>\n </PermissionTooltip>\n <input\n accept={KNOWLEDGE_ACCEPT}\n className=\"fk:hidden\"\n multiple\n ref={fileInputRef}\n type=\"file\"\n onChange={handleFilesPicked}\n />\n </div>\n </div>\n {pending.length > 0 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-1 fk:text-sm fk:text-muted-foreground\">\n {pending.map((upload) => (\n <span className=\"fk:flex fk:items-center fk:gap-2\" key={upload.id}>\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Uploading {upload.name}…\n </span>\n ))}\n </div>\n ) : null}\n {content}\n {hasMore && !isLoadingMore ? (\n <InfiniteScrollSentinel onVisible={() => void setSize((current) => current + 1)} />\n ) : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more documents...</span>\n </div>\n ) : null}\n </div>\n </div>\n </AssetDropZone>\n <AddUrlDialog\n api={api}\n open={isUrlDialogOpen}\n onOpenChange={setIsUrlDialogOpen}\n onRegistered={() => void mutate()}\n />\n </main>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/list.tsx"],"names":["KNOWLEDGE_PAGE_SIZE","LIST_POLL_INTERVAL_MS","SEARCH_DEBOUNCE_MS","useDebouncedValue","value","delayMs","debounced","setDebounced","useState","useEffect","timer","EMPTY_BY_FILTER","KnowledgeListSkeleton","viewMode","ids","jsxs","GRID_CLASSES","jsx","id","Skeleton","useKnowledgeUploads","api","onRegistered","pending","setPending","queueRef","useRef","addFiles","files","file","problem","getKnowledgeFileProblem","toast","upload","current","result","announceRegistered","error","describeApiError","entry","AddUrlDialog","onOpenChange","open","setValue","title","setTitle","setError","isSubmitting","setIsSubmitting","close","handleSubmit","event","parsed","parseKnowledgeUrl","submitError","Dialog","next","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","DialogFooter","Button","LoaderCircle","LinkIcon","formatAdded","iso","format","HiddenBadge","Badge","ContentMatchBadge","handleRowClick","target","SourceListRow","source","actions","status","summarizeKnowledgeStatus","detailClass","TableRow","TableCell","KnowledgeTypeIcon","Link","StatusBadge","getKnowledgeKindLabel","formatFileSize","Tooltip","TooltipTrigger","TooltipContent","formatDistance","SourceActionsMenu","SourceTable","sources","Table","TableHeader","TableHead","TableBody","SourcePreview","preview","SourceCard","meta","SourceGrid","ListHeader","SidebarTrigger","Separator","List","projectId","useProjectKnowledge","navigate","useNavigate","canMutate","useCanMutate","isViewing","useIsViewing","useKnowledgeStatusFilter","search","setSearch","query","setViewMode","getStoredKnowledgeViewMode","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","searchInputRef","isBusy","setIsBusy","getSourcesKey","pageIndex","previousPage","knowledgePaths","pages","isLoading","mutate","setSize","size","useSWRInfinite","fetcher","useMemo","page","total","hasMore","isLoadingMore","isInitialLoading","mutateRef","isKnowledgeSourceBusy","setSizeRef","PageMessage","handleFilesPicked","emptyMessage","KNOWLEDGE_FORMATS_LABEL","removed","content","Alert","AlertDescription","AssetDropZone","SearchIcon","XIcon","ToggleGroup","setStoredKnowledgeViewMode","ToggleGroupItem","ListIcon","LayoutGridIcon","PermissionTooltip","UploadIcon","KNOWLEDGE_ACCEPT","InfiniteScrollSentinel"],"mappings":"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","file":"list-RZROVSNS.js","sourcesContent":["import type { ChangeEvent, FormEvent, JSX, MouseEvent } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { format, formatDistance } from 'date-fns';\nimport { LayoutGridIcon, LinkIcon, ListIcon, LoaderCircle, SearchIcon, UploadIcon, XIcon } from 'lucide-react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport useSWRInfinite from 'swr/infinite';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n ToggleGroup,\n ToggleGroupItem,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { AssetDropZone } from '../asset-manager/data-grid/asset-drop-zone';\nimport { fetcher, knowledgePaths, type KnowledgeApi } from './api';\nimport {\n formatFileSize,\n getKnowledgeFileProblem,\n getKnowledgeKindLabel,\n getStoredKnowledgeViewMode,\n isKnowledgeSourceBusy,\n KNOWLEDGE_ACCEPT,\n KNOWLEDGE_FORMATS_LABEL,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n parseKnowledgeUrl,\n setStoredKnowledgeViewMode,\n summarizeKnowledgeStatus,\n type KnowledgeSource,\n type KnowledgeSourcesList,\n type KnowledgeViewMode,\n} from './knowledge';\nimport {\n announceRegistered,\n describeApiError,\n InfiniteScrollSentinel,\n KnowledgeTypeIcon,\n PageMessage,\n SourceActionsMenu,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\nimport { useKnowledgeStatusFilter } from './sidebar';\n\nconst KNOWLEDGE_PAGE_SIZE = 25;\nconst LIST_POLL_INTERVAL_MS = 3_000;\n/** Typing pauses this long before the list asks the platform; each ask now searches the documents' text too. */\nconst SEARCH_DEBOUNCE_MS = 250;\n\nfunction useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n\n return () => clearTimeout(timer);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nconst EMPTY_BY_FILTER = {\n failed: 'No document failed to index.',\n processing: 'No document is being indexed right now.',\n ready: 'No document is ready yet.',\n};\n\nfunction KnowledgeListSkeleton({ viewMode }: { viewMode: KnowledgeViewMode }): JSX.Element {\n const ids = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n if (viewMode === 'grid') {\n return (\n <div aria-busy=\"true\" className={GRID_CLASSES}>\n <span className=\"fk:sr-only\">Loading documents</span>\n {ids.map((id) => (\n <div className=\"fk:flex fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:p-3 fk:corner-squircle\" key={id}>\n <span className=\"fk:flex fk:items-center fk:gap-2\">\n <Skeleton className=\"fk:size-6 fk:rounded-md\" />\n <Skeleton className=\"fk:h-4 fk:flex-1\" />\n </span>\n <Skeleton className=\"fk:aspect-[4/3] fk:w-full fk:rounded-lg\" />\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col\">\n <span className=\"fk:sr-only\">Loading documents</span>\n {ids.map((id) => (\n <div className=\"fk:flex fk:h-12 fk:items-center fk:gap-3 fk:border-b fk:px-3\" key={id}>\n <Skeleton className=\"fk:size-6 fk:shrink-0 fk:rounded-md\" />\n <Skeleton className=\"fk:h-4 fk:w-1/3\" />\n <Skeleton className=\"fk:ml-auto fk:h-4 fk:w-16\" />\n <Skeleton className=\"fk:hidden fk:h-4 fk:w-24 fk:md:block\" />\n </div>\n ))}\n </div>\n );\n}\n\ninterface PendingUpload {\n id: string;\n name: string;\n}\n\n/** Runs file uploads one after another and reports each outcome; the list revalidates after every registration. */\nfunction useKnowledgeUploads(\n api: KnowledgeApi | null,\n onRegistered: () => void\n): {\n addFiles: (_files: File[]) => void;\n pending: PendingUpload[];\n} {\n const [pending, setPending] = useState<PendingUpload[]>([]);\n const queueRef = useRef<Promise<void>>(Promise.resolve());\n\n function addFiles(files: File[]): void {\n if (!api) {\n return;\n }\n\n for (const file of files) {\n const problem = getKnowledgeFileProblem(file);\n\n if (problem) {\n toast.error(problem);\n\n continue;\n }\n\n const upload: PendingUpload = {\n id: `${file.name}-${String(Date.now())}-${String(Math.random())}`,\n name: file.name,\n };\n\n setPending((current) => [...current, upload]);\n queueRef.current = queueRef.current\n .then(async () => {\n try {\n const result = await api.addFile(file);\n\n announceRegistered(result, file.name);\n onRegistered();\n } catch (error) {\n toast.error(describeApiError(error, `${file.name} could not be added.`));\n } finally {\n setPending((current) => current.filter((entry) => entry.id !== upload.id));\n }\n })\n .catch(() => undefined);\n }\n }\n\n return { addFiles, pending };\n}\n\nfunction AddUrlDialog({\n api,\n onOpenChange,\n onRegistered,\n open,\n}: {\n api: KnowledgeApi;\n onOpenChange: (_open: boolean) => void;\n onRegistered: () => void;\n open: boolean;\n}): JSX.Element {\n const [value, setValue] = useState('');\n const [title, setTitle] = useState('');\n const [error, setError] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n function close(): void {\n onOpenChange(false);\n setValue('');\n setTitle('');\n setError('');\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>): Promise<void> {\n event.preventDefault();\n\n const parsed = parseKnowledgeUrl(value);\n\n if ('error' in parsed) {\n setError(parsed.error);\n\n return;\n }\n\n setIsSubmitting(true);\n setError('');\n\n try {\n const result = await api.addUrl({ title: title.trim() || undefined, url: parsed.url });\n\n announceRegistered(result, parsed.url);\n onRegistered();\n close();\n } catch (submitError) {\n setError(describeApiError(submitError, 'The page could not be added.'));\n } finally {\n setIsSubmitting(false);\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : close())}>\n <DialogContent>\n <form className=\"fk:flex fk:flex-col fk:gap-4\" onSubmit={(event) => void handleSubmit(event)}>\n <DialogHeader>\n <DialogTitle>Add a web page</DialogTitle>\n <DialogDescription>\n The page is fetched and indexed now, and again whenever you re-index it. Only public pages work.\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-url\">Address</Label>\n <Input\n autoFocus\n id=\"knowledge-url\"\n inputMode=\"url\"\n placeholder=\"https://example.com/help/returns\"\n value={value}\n onChange={(event) => {\n setValue(event.target.value);\n setError('');\n }}\n />\n </div>\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-url-title\">Title (optional)</Label>\n <Input\n id=\"knowledge-url-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n placeholder=\"Defaults to the page address\"\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n />\n </div>\n {error ? <p className=\"fk:text-sm fk:text-destructive\">{error}</p> : null}\n <DialogFooter>\n <Button disabled={isSubmitting} size=\"sm\" type=\"button\" variant=\"outline\" onClick={close}>\n Cancel\n </Button>\n <Button disabled={isSubmitting || !value.trim()} size=\"sm\" type=\"submit\">\n {isSubmitting ? (\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n ) : (\n <LinkIcon className=\"fk:size-4\" />\n )}\n Add page\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nconst GRID_CLASSES = 'fk:grid fk:grid-cols-[repeat(auto-fill,minmax(14rem,1fr))] fk:gap-4';\n\nfunction formatAdded(iso: string): string {\n return format(new Date(iso), 'MMM d, yyyy');\n}\n\nfunction HiddenBadge(): JSX.Element {\n return (\n <Badge className=\"fk:shrink-0 fk:corner-squircle\" variant=\"outline\">\n Hidden from agent\n </Badge>\n );\n}\n\n/** A search hit whose title does not carry the words: the text inside does. */\nfunction ContentMatchBadge(): JSX.Element {\n return (\n <Badge className=\"fk:shrink-0 fk:corner-squircle\" data-knowledge-content-match variant=\"secondary\">\n In content\n </Badge>\n );\n}\n\ninterface SourceActions {\n onOpen: (_source: KnowledgeSource) => void;\n onRemoved: (_source: KnowledgeSource) => void;\n}\n\ntype SourceItemProps = SourceActions & { source: KnowledgeSource };\n\n/**\n * A plain click on the row opens the document. Clicks that bubbled up from\n * a portal (the menu, the removal dialog), modified clicks (the title link\n * handles new tabs itself) and clicks on the row's own controls are not.\n */\nfunction handleRowClick(event: MouseEvent<HTMLElement>, open: () => void): void {\n const target = event.target as Node;\n\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey ||\n !event.currentTarget.contains(target) ||\n (target as Element).closest('a, button')\n ) {\n return;\n }\n\n open();\n}\n\n/**\n * One line of the list: the type mark, the title as a real link (so it can\n * be opened in a new tab), then the status and facts in columns, like a file\n * manager. The whole row is clickable for the mouse; the link carries the\n * keyboard and assistive tech.\n */\nfunction SourceListRow({ source, ...actions }: SourceItemProps): JSX.Element {\n const status = summarizeKnowledgeStatus(source);\n // What went wrong, or what is happening, matters at every width; the passage count can wait for a wide one.\n const detailClass = status.tone === 'ready' ? 'fk:hidden fk:xl:inline' : 'fk:hidden fk:md:inline';\n\n return (\n <TableRow\n className=\"fk:h-12 fk:cursor-pointer\"\n data-knowledge-row\n onClick={(event) => handleRowClick(event, () => actions.onOpen(source))}\n >\n <TableCell className=\"fk:max-w-0 fk:w-full\">\n <span className=\"fk:flex fk:min-w-0 fk:items-center fk:gap-3\">\n <KnowledgeTypeIcon source={source} />\n <Link\n className=\"fk:truncate fk:text-sm fk:font-medium fk:hover:underline fk:underline-offset-2 fk:focus-visible:outline-none fk:focus-visible:underline\"\n to={source.id}\n >\n {source.title}\n </Link>\n {source.matchedIn === 'content' ? <ContentMatchBadge /> : null}\n {!source.agentVisible ? <HiddenBadge /> : null}\n </span>\n </TableCell>\n <TableCell className=\"fk:whitespace-nowrap\">\n <span className=\"fk:flex fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span\n className={`${detailClass} fk:max-w-64 fk:truncate fk:text-xs fk:text-muted-foreground`}\n title={status.detail}\n >\n {status.detail}\n </span>\n </span>\n </TableCell>\n <TableCell className=\"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:md:table-cell\">\n {getKnowledgeKindLabel(source)}\n </TableCell>\n <TableCell className=\"fk:hidden fk:whitespace-nowrap fk:text-right fk:tabular-nums fk:text-muted-foreground fk:md:table-cell\">\n {source.size === null ? '—' : formatFileSize(source.size)}\n </TableCell>\n <TableCell className=\"fk:hidden fk:whitespace-nowrap fk:text-muted-foreground fk:sm:table-cell\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span>{formatAdded(source.createdAt)}</span>\n </TooltipTrigger>\n <TooltipContent>\n Updated {formatDistance(new Date(source.updatedAt), new Date(), { addSuffix: true })}\n </TooltipContent>\n </Tooltip>\n </TableCell>\n <TableCell className=\"fk:w-12 fk:pr-2 fk:text-right\">\n <SourceActionsMenu\n source={source}\n onOpen={() => actions.onOpen(source)}\n onRemoved={() => actions.onRemoved(source)}\n />\n </TableCell>\n </TableRow>\n );\n}\n\nfunction SourceTable({ sources, ...actions }: SourceActions & { sources: KnowledgeSource[] }): JSX.Element {\n return (\n <Table data-knowledge-list>\n <TableHeader>\n <TableRow className=\"fk:hover:bg-transparent\">\n <TableHead>Name</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"fk:hidden fk:md:table-cell\">Type</TableHead>\n <TableHead className=\"fk:hidden fk:text-right fk:md:table-cell\">Size</TableHead>\n <TableHead className=\"fk:hidden fk:sm:table-cell\">Added</TableHead>\n <TableHead className=\"fk:w-12\">\n <span className=\"fk:sr-only\">Actions</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sources.map((source) => (\n <SourceListRow key={source.id} source={source} {...actions} />\n ))}\n </TableBody>\n </Table>\n );\n}\n\n/**\n * The card's thumbnail: the opening text of the document laid out like a\n * small page, the way a file manager shows the first page. Documents still\n * indexing, or without text, show their type mark instead.\n */\nfunction SourcePreview({ source }: { source: KnowledgeSource }): JSX.Element {\n const preview = source.preview?.trim();\n\n return (\n <div className=\"fk:relative fk:aspect-[4/3] fk:overflow-hidden fk:rounded-lg fk:bg-muted fk:corner-squircle\">\n {preview ? (\n <div\n aria-hidden\n className=\"fk:absolute fk:inset-x-4 fk:top-3 fk:bottom-0 fk:overflow-hidden fk:rounded-t-sm fk:bg-background fk:px-3 fk:pt-3 fk:shadow-sm\"\n >\n <p className=\"fk:whitespace-pre-line fk:text-[9px] fk:leading-[1.45] fk:text-foreground/80 fk:select-none\">\n {preview}\n </p>\n <span className=\"fk:pointer-events-none fk:absolute fk:inset-x-0 fk:bottom-0 fk:h-10 fk:bg-gradient-to-t fk:from-background fk:to-transparent\" />\n </div>\n ) : (\n <div className=\"fk:flex fk:h-full fk:items-center fk:justify-center\">\n <KnowledgeTypeIcon size={56} source={source} />\n </div>\n )}\n </div>\n );\n}\n\nfunction SourceCard({ source, ...actions }: SourceItemProps): JSX.Element {\n const status = summarizeKnowledgeStatus(source);\n const meta = [getKnowledgeKindLabel(source)];\n\n if (source.size !== null) {\n meta.push(formatFileSize(source.size));\n }\n\n meta.push(status.detail);\n\n // A link laid over the card opens the document (so it can be opened in a\n // new tab too); the menu button sits above it. The title tooltip lives on\n // the card itself, which does receive the pointer.\n return (\n <div\n className=\"fk:relative fk:flex fk:min-w-0 fk:flex-col fk:gap-3 fk:rounded-xl fk:border fk:bg-card fk:p-3 fk:transition-colors fk:hover:bg-accent/60 fk:has-[>a:focus-visible]:ring-2 fk:has-[>a:focus-visible]:ring-ring fk:corner-squircle\"\n data-knowledge-card\n title={source.title}\n >\n <Link\n aria-label={`Open ${source.title}`}\n className=\"fk:absolute fk:inset-0 fk:rounded-xl fk:focus-visible:outline-none fk:corner-squircle\"\n to={source.id}\n />\n <span className=\"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2\">\n <KnowledgeTypeIcon source={source} />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-sm fk:font-medium\">{source.title}</span>\n <span className=\"fk:pointer-events-auto fk:-my-1 fk:-mr-1.5\">\n <SourceActionsMenu\n source={source}\n onOpen={() => actions.onOpen(source)}\n onRemoved={() => actions.onRemoved(source)}\n />\n </span>\n </span>\n <span className=\"fk:pointer-events-none fk:relative\">\n <SourcePreview source={source} />\n </span>\n <span className=\"fk:pointer-events-none fk:relative fk:flex fk:min-w-0 fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-xs fk:text-muted-foreground\">{meta.join(' · ')}</span>\n {source.matchedIn === 'content' ? <ContentMatchBadge /> : null}\n {!source.agentVisible ? <HiddenBadge /> : null}\n </span>\n </div>\n );\n}\n\nfunction SourceGrid({ sources, ...actions }: SourceActions & { sources: KnowledgeSource[] }): JSX.Element {\n return (\n <div className={GRID_CLASSES} data-knowledge-grid>\n {sources.map((source) => (\n <SourceCard key={source.id} source={source} {...actions} />\n ))}\n </div>\n );\n}\n\nfunction ListHeader(): JSX.Element {\n return (\n <div className=\"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Knowledge</h1>\n </div>\n );\n}\n\nexport function List(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const status = useKnowledgeStatusFilter();\n const [search, setSearch] = useState('');\n const query = useDebouncedValue(search.trim(), SEARCH_DEBOUNCE_MS);\n const [viewMode, setViewMode] = useState<KnowledgeViewMode>(() => getStoredKnowledgeViewMode());\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const [isBusy, setIsBusy] = useState(false);\n const getSourcesKey = (pageIndex: number, previousPage: KnowledgeSourcesList | null): string | null => {\n if (!projectId || (previousPage && !previousPage.hasMore)) {\n return null;\n }\n\n return knowledgePaths(projectId).sources({\n limit: KNOWLEDGE_PAGE_SIZE,\n offset: pageIndex * KNOWLEDGE_PAGE_SIZE,\n search: query || undefined,\n status,\n });\n };\n const {\n data: pages,\n isLoading,\n mutate,\n setSize,\n size,\n } = useSWRInfinite<KnowledgeSourcesList>(getSourcesKey, fetcher, {\n // Rows that are still indexing change on their own; poll while one is in flight and the tab is in front.\n refreshInterval: isViewing && isBusy ? LIST_POLL_INTERVAL_MS : 0,\n });\n const sources = useMemo(() => pages?.flatMap((page) => page.sources) ?? [], [pages]);\n const total = pages?.[0]?.count ?? 0;\n const hasMore = pages?.[pages.length - 1]?.hasMore ?? false;\n const isLoadingMore = pages !== undefined && size > pages.length;\n const isInitialLoading = isLoading && sources.length === 0;\n const { addFiles, pending } = useKnowledgeUploads(api, () => void mutate());\n const mutateRef = useRef(mutate);\n\n mutateRef.current = mutate;\n\n // Coming back from a document page must show what changed there. The\n // infinite hook keeps serving its cached pages otherwise, whatever the\n // mount options.\n useEffect(() => {\n void mutateRef.current();\n }, []);\n\n useEffect(() => {\n setIsBusy(sources.some((source) => isKnowledgeSourceBusy(source)));\n }, [sources]);\n\n // A new search starts from its first page.\n const setSizeRef = useRef(setSize);\n\n setSizeRef.current = setSize;\n\n useEffect(() => {\n void setSizeRef.current(1);\n }, [query]);\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to manage its knowledge.</PageMessage>;\n }\n\n function handleFilesPicked(event: ChangeEvent<HTMLInputElement>): void {\n const files = Array.from(event.target.files ?? []);\n\n event.target.value = '';\n addFiles(files);\n }\n\n let emptyMessage = `No documents yet. Upload ${KNOWLEDGE_FORMATS_LABEL} files, or add a public web page, and the agent will search and cite them.`;\n\n if (query) {\n emptyMessage = 'No document title or content matches your search.';\n } else if (status) {\n emptyMessage = EMPTY_BY_FILTER[status];\n }\n\n const actions: SourceActions = {\n onOpen: (source) => void navigate(source.id),\n // Drop the row at once, then let this hook refetch its pages: the global\n // list invalidation clears other caches but never revalidates an infinite hook.\n onRemoved: (removed) =>\n void mutate(\n (current) =>\n current?.map((page) => ({\n ...page,\n count: Math.max(0, page.count - 1),\n sources: page.sources.filter((entry) => entry.id !== removed.id),\n })),\n { revalidate: true }\n ),\n };\n let content: JSX.Element =\n viewMode === 'grid' ? (\n <SourceGrid sources={sources} {...actions} />\n ) : (\n <SourceTable sources={sources} {...actions} />\n );\n\n if (isInitialLoading) {\n content = <KnowledgeListSkeleton viewMode={viewMode} />;\n } else if (sources.length === 0) {\n content = (\n <Alert>\n <AlertDescription>{emptyMessage}</AlertDescription>\n </Alert>\n );\n }\n\n return (\n <main className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">\n <ListHeader />\n <AssetDropZone disabled={!canMutate} onDropFiles={addFiles}>\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:flex fk:w-full fk:flex-col fk:gap-5 fk:py-4 fk:pl-4 fk:pr-6\">\n <div>\n <h2 className=\"fk:text-2xl fk:font-semibold\">Documents</h2>\n <p className=\"fk:mt-1 fk:text-sm fk:text-muted-foreground\">\n Policies, manuals, specs and other reference material for your team and agents. The agent searches them\n when a question needs them and cites the passage it used.\n </p>\n </div>\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-3\">\n <div className=\"fk:relative fk:w-full fk:max-w-sm\">\n <SearchIcon className=\"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground\" />\n <Input\n aria-label=\"Search documents\"\n className=\"fk:pl-8 fk:pr-9\"\n placeholder=\"Search by title or content…\"\n ref={searchInputRef}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1.5 fk:top-1/2 fk:flex fk:size-6 fk:-translate-y-1/2 fk:items-center fk:justify-center fk:rounded-full fk:bg-transparent fk:text-muted-foreground fk:hover:bg-foreground/10 fk:hover:text-foreground fk:corner-squircle\"\n data-knowledge-clear-search\n type=\"button\"\n onClick={() => {\n setSearch('');\n searchInputRef.current?.focus();\n }}\n >\n <XIcon className=\"fk:size-4\" />\n </Button>\n ) : null}\n </div>\n {total > 0 ? (\n <span className=\"fk:text-sm fk:text-muted-foreground\">\n {total.toLocaleString()} {total === 1 ? 'document' : 'documents'}\n </span>\n ) : null}\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n aria-label=\"Layout\"\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n variant=\"outline\"\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n setViewMode(value);\n setStoredKnowledgeViewMode(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"List layout\" value=\"list\">\n <ListIcon className=\"fk:size-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"Grid layout\" value=\"grid\">\n <LayoutGridIcon className=\"fk:size-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" variant=\"outline\" onClick={() => setIsUrlDialogOpen(true)}>\n <LinkIcon />\n Add web page\n </Button>\n </PermissionTooltip>\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" onClick={() => fileInputRef.current?.click()}>\n <UploadIcon />\n Upload documents\n </Button>\n </PermissionTooltip>\n <input\n accept={KNOWLEDGE_ACCEPT}\n className=\"fk:hidden\"\n multiple\n ref={fileInputRef}\n type=\"file\"\n onChange={handleFilesPicked}\n />\n </div>\n </div>\n {pending.length > 0 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-1 fk:text-sm fk:text-muted-foreground\">\n {pending.map((upload) => (\n <span className=\"fk:flex fk:items-center fk:gap-2\" key={upload.id}>\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Uploading {upload.name}…\n </span>\n ))}\n </div>\n ) : null}\n {content}\n {hasMore && !isLoadingMore ? (\n <InfiniteScrollSentinel onVisible={() => void setSize((current) => current + 1)} />\n ) : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more documents...</span>\n </div>\n ) : null}\n </div>\n </div>\n </AssetDropZone>\n <AddUrlDialog\n api={api}\n open={isUrlDialogOpen}\n onOpenChange={setIsUrlDialogOpen}\n onRegistered={() => void mutate()}\n />\n </main>\n );\n}\n"]}
package/dist/nextjs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  handleFlexkitRequest
3
- } from "./chunk-GGC75EMC.js";
3
+ } from "./chunk-C4XLDODU.js";
4
4
 
5
5
  // src/auth/nextjs-api.ts
6
6
  function resultToNextResponse(result, NextResponse) {