@flexkit/studio 0.2.37 → 0.2.38

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 (75) hide show
  1. package/dist/{chat-page-XYQOQPMW.js → chat-page-DW3FP4UZ.js} +3 -3
  2. package/dist/{chat-page-XYQOQPMW.js.map → chat-page-DW3FP4UZ.js.map} +1 -1
  3. package/dist/{chunk-RX6QUDLZ.js → chunk-32B35YDF.js} +3 -3
  4. package/dist/{chunk-RX6QUDLZ.js.map → chunk-32B35YDF.js.map} +1 -1
  5. package/dist/{chunk-U4DUXPZV.js → chunk-377TM7UG.js} +2 -2
  6. package/dist/{chunk-U4DUXPZV.js.map → chunk-377TM7UG.js.map} +1 -1
  7. package/dist/{chunk-ND2RTUMM.js → chunk-3GXM5SSM.js} +3 -3
  8. package/dist/{chunk-ND2RTUMM.js.map → chunk-3GXM5SSM.js.map} +1 -1
  9. package/dist/{chunk-UULPCFWK.js → chunk-4OGLWOO3.js} +3 -3
  10. package/dist/{chunk-UULPCFWK.js.map → chunk-4OGLWOO3.js.map} +1 -1
  11. package/dist/{chunk-RGISZNQ2.js → chunk-6J3ZIVDQ.js} +2 -2
  12. package/dist/{chunk-RGISZNQ2.js.map → chunk-6J3ZIVDQ.js.map} +1 -1
  13. package/dist/chunk-AQBULUC2.js +10 -0
  14. package/dist/chunk-AQBULUC2.js.map +1 -0
  15. package/dist/{chunk-337GX2BR.js → chunk-CCVE7GGO.js} +2 -2
  16. package/dist/{chunk-337GX2BR.js.map → chunk-CCVE7GGO.js.map} +1 -1
  17. package/dist/{chunk-OWY5BQER.js → chunk-DSZJXMN5.js} +2 -2
  18. package/dist/{chunk-OWY5BQER.js.map → chunk-DSZJXMN5.js.map} +1 -1
  19. package/dist/{chunk-DO32GATF.js → chunk-GORBKX24.js} +3 -3
  20. package/dist/{chunk-DO32GATF.js.map → chunk-GORBKX24.js.map} +1 -1
  21. package/dist/{chunk-CRTUZ22E.js → chunk-GSKQHFQM.js} +3 -3
  22. package/dist/{chunk-CRTUZ22E.js.map → chunk-GSKQHFQM.js.map} +1 -1
  23. package/dist/{chunk-36YXPN42.js → chunk-IJECATW3.js} +2 -2
  24. package/dist/{chunk-36YXPN42.js.map → chunk-IJECATW3.js.map} +1 -1
  25. package/dist/{chunk-CC2U7ASG.js → chunk-INZZOKRC.js} +3 -3
  26. package/dist/{chunk-CC2U7ASG.js.map → chunk-INZZOKRC.js.map} +1 -1
  27. package/dist/{chunk-KOM7G7WT.js → chunk-IUWDNPMY.js} +2 -2
  28. package/dist/{chunk-KOM7G7WT.js.map → chunk-IUWDNPMY.js.map} +1 -1
  29. package/dist/{chunk-6NRMVVU4.js → chunk-JUWAKQPE.js} +3 -3
  30. package/dist/{chunk-6NRMVVU4.js.map → chunk-JUWAKQPE.js.map} +1 -1
  31. package/dist/{chunk-XV4QJKOJ.js → chunk-KV4OGH5U.js} +2 -2
  32. package/dist/{chunk-XV4QJKOJ.js.map → chunk-KV4OGH5U.js.map} +1 -1
  33. package/dist/{chunk-AQSL5HBZ.js → chunk-LMJEP4VR.js} +2 -2
  34. package/dist/{chunk-AQSL5HBZ.js.map → chunk-LMJEP4VR.js.map} +1 -1
  35. package/dist/{chunk-PNGPE7QM.js → chunk-UOTVVZPA.js} +3 -3
  36. package/dist/{chunk-PNGPE7QM.js.map → chunk-UOTVVZPA.js.map} +1 -1
  37. package/dist/{chunk-BHHLWGZ4.js → chunk-WYVXSLB7.js} +2 -2
  38. package/dist/{chunk-BHHLWGZ4.js.map → chunk-WYVXSLB7.js.map} +1 -1
  39. package/dist/{entry-6EWYXIS5.js → entry-G2R3W5NU.js} +2 -2
  40. package/dist/{entry-6EWYXIS5.js.map → entry-G2R3W5NU.js.map} +1 -1
  41. package/dist/index.js +2 -2
  42. package/dist/{list-GBM53HFN.js → list-IRTUEW55.js} +2 -2
  43. package/dist/{list-GBM53HFN.js.map → list-IRTUEW55.js.map} +1 -1
  44. package/dist/{list-N5W7G3LD.js → list-LVXMUJHP.js} +3 -3
  45. package/dist/{list-N5W7G3LD.js.map → list-LVXMUJHP.js.map} +1 -1
  46. package/dist/{pages-HPR3UHT7.js → pages-HJHR7DFO.js} +3 -3
  47. package/dist/{pages-HPR3UHT7.js.map → pages-HJHR7DFO.js.map} +1 -1
  48. package/dist/{plugin-pages-VDRT7RLY.js → plugin-pages-ZO3TLUYW.js} +2 -2
  49. package/dist/{plugin-pages-VDRT7RLY.js.map → plugin-pages-ZO3TLUYW.js.map} +1 -1
  50. package/dist/{project-selector-RRG52TSX.js → project-selector-OXDEHTJ5.js} +2 -2
  51. package/dist/{project-selector-RRG52TSX.js.map → project-selector-OXDEHTJ5.js.map} +1 -1
  52. package/dist/record-links-SZQUATM6.js +2 -0
  53. package/dist/{record-links-CI4OJPWW.js.map → record-links-SZQUATM6.js.map} +1 -1
  54. package/dist/{root-JFYE2JRJ.js → root-4ATHF5ZZ.js} +2 -2
  55. package/dist/{root-JFYE2JRJ.js.map → root-4ATHF5ZZ.js.map} +1 -1
  56. package/dist/{root-DF2BNGOF.js → root-BIUU3CXY.js} +3 -3
  57. package/dist/{root-DF2BNGOF.js.map → root-BIUU3CXY.js.map} +1 -1
  58. package/dist/{root-RGAV2YAF.js → root-BRIEXCDH.js} +2 -2
  59. package/dist/{root-RGAV2YAF.js.map → root-BRIEXCDH.js.map} +1 -1
  60. package/dist/{root-KF6EFGM6.js → root-E4GIVJYA.js} +3 -3
  61. package/dist/{root-KF6EFGM6.js.map → root-E4GIVJYA.js.map} +1 -1
  62. package/dist/{root-IXK2ESCS.js → root-MMGPZ4ZF.js} +3 -3
  63. package/dist/{root-IXK2ESCS.js.map → root-MMGPZ4ZF.js.map} +1 -1
  64. package/dist/{root-LUWJS7SQ.js → root-P537YXFS.js} +2 -2
  65. package/dist/{root-LUWJS7SQ.js.map → root-P537YXFS.js.map} +1 -1
  66. package/dist/{search-DQLC3XDJ.js → search-57W7MXQ3.js} +2 -2
  67. package/dist/{search-DQLC3XDJ.js.map → search-57W7MXQ3.js.map} +1 -1
  68. package/dist/{skills-pages-Q4YUDTC2.js → skills-pages-LUOBTEAP.js} +2 -2
  69. package/dist/{skills-pages-Q4YUDTC2.js.map → skills-pages-LUOBTEAP.js.map} +1 -1
  70. package/dist/{source-J3ZCTEWZ.js → source-CJPY5PTU.js} +2 -2
  71. package/dist/{source-J3ZCTEWZ.js.map → source-CJPY5PTU.js.map} +1 -1
  72. package/package.json +4 -4
  73. package/dist/chunk-ZV7I5RUM.js +0 -10
  74. package/dist/chunk-ZV7I5RUM.js.map +0 -1
  75. package/dist/record-links-CI4OJPWW.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","EntityKnowledgeButton","lazy","m","EntityGraphButton","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2","isKnowledgeLinkableEntity","Suspense"],"mappings":"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","file":"chunk-PNGPE7QM.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { lazy, Suspense, useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\nimport { isKnowledgeLinkableEntity } from '../apps/knowledge/knowledge';\n\n// Loaded on demand: the Knowledge module should only download when a list of\n// a linkable entity is in view, the way the record drawer loads its panel.\nconst EntityKnowledgeButton = lazy(() =>\n import('../apps/knowledge/record-links').then((m) => ({ default: m.EntityKnowledgeButton }))\n);\nconst EntityGraphButton = lazy(() => import('../apps/graph/entry').then((m) => ({ default: m.EntityGraphButton })));\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(apolloClient, getEntityListQueryName(entityName, schema), idsToDelete);\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n {entityName && isKnowledgeLinkableEntity(entityName) ? (\n <Suspense fallback={null}>\n <EntityKnowledgeButton entityName={entityName} />\n </Suspense>\n ) : null}\n {entityName ? (\n <Suspense fallback={null}>\n <EntityGraphButton entityName={entityName} selectedIds={selectedIds} />\n </Suspense>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","EntityKnowledgeButton","lazy","m","EntityGraphButton","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2","isKnowledgeLinkableEntity","Suspense"],"mappings":"82BA0BO,SAASA,EAAAA,CAA2B,CACzC,UAAA,CAAAC,GAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,GAAA,CAAAC,GAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,CAAE,SAAA,CAAW,IAAA,CAAM,OAAA,CAAS,IAAK,CAC7C,CAAA,CAAiD,CAC/C,IAAMC,CAAAA,CAAiBC,CAAAA,EAAY,CAC7BC,CAAAA,CAAYC,CAAAA,EAAa,CAEzBC,CAAAA,CAAWN,GAAAA,CAAI,QAAA,CAAS,GAAA,CAGxBO,CAAAA,CAAAA,CAAaN,CAAAA,CAAQ,SAAA,EAAa,IAAA,GAASG,CAAAA,CAC3CI,CAAAA,CAAUP,CAAAA,CAAQ,OAAA,EAAW,IAAA,CAEnC,SAASQ,GAAAA,EAAmB,CAC1BP,CAAAA,CAAe,CAAE,IAAA,CAAM,YAAA,CAAc,OAAA,CAAS,CAAE,SAAAI,CAAAA,CAAU,gBAAA,CAAAP,CAAiB,CAAE,CAAC,EAChF,CAEA,SAASW,CAAAA,EAAqB,CAC5BR,CAAAA,CAAe,CAAE,IAAA,CAAM,cAAA,CAAgB,OAAA,CAAS,CAAE,QAAA,CAAAI,CAAAA,CAAU,UAAA,CAAAR,GAAW,CAAE,CAAC,EAC5E,CAEA,OACEa,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACZ,QAAA,CAAA,CAAAH,CAAAA,EACCG,IAAAA,CAACC,EAAA,CAAO,SAAA,CAAU,sCAAA,CAAuC,OAAA,CAASH,GAAAA,CAAY,OAAA,CAAQ,OAAA,CACpF,QAAA,CAAA,CAAAI,GAAAA,CAACC,UAAAA,CAAA,CAAW,SAAA,CAAU,eAAA,CAAgB,CAAA,CACtCD,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAa,QAAA,CAAA,MAAA,CAAI,CAAA,CAAA,CACnC,CAAA,CAEDN,CAAAA,EAAa,CAACC,CAAAA,EACbG,IAAAA,CAACC,CAAAA,CAAA,CAAO,SAAA,CAAU,sCAAA,CAAuC,OAAA,CAASF,CAAAA,CAAc,OAAA,CAAQ,QACtF,QAAA,CAAA,CAAAG,GAAAA,CAACE,UAAAA,CAAA,CAAW,SAAA,CAAU,eAAA,CAAgB,CAAA,CACtCF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAa,QAAA,CAAA,QAAA,CAAM,CAAA,CAAA,CACrC,CAAA,CAEDL,CAAAA,EAAWD,CAAAA,EACVI,IAAAA,CAACK,CAAAA,CAAA,CACC,QAAA,CAAA,CAAAH,GAAAA,CAACI,CAAAA,CAAA,CAAoB,OAAA,CAAO,IAAA,CAC1B,QAAA,CAAAN,IAAAA,CAACC,CAAAA,CAAA,CAAO,SAAA,CAAU,8BAAA,CAA+B,OAAA,CAAQ,QACvD,QAAA,CAAA,CAAAC,GAAAA,CAACK,QAAAA,CAAA,CAAS,SAAA,CAAU,eAAA,CAAgB,CAAA,CACpCL,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAa,QAAA,CAAA,oBAAA,CAAkB,CAAA,CAAA,CACjD,CAAA,CACF,CAAA,CACAF,IAAAA,CAACQ,CAAAA,CAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,WAAA,CACzC,QAAA,CAAA,CAAAR,IAAAA,CAACS,GAAAA,CAAA,CAAiB,OAAA,CAASX,GAAAA,CACzB,QAAA,CAAA,CAAAI,GAAAA,CAACC,UAAAA,CAAA,CAAW,UAAU,uBAAA,CAAwB,CAAA,CAAE,MAAA,CAAA,CAElD,CAAA,CACAD,GAAAA,CAACQ,CAAAA,CAAA,EAAsB,CAAA,CACvBV,IAAAA,CAACS,GAAAA,CAAA,CAAiB,SAAA,CAAU,qBAAA,CAAsB,OAAA,CAASV,CAAAA,CACzD,QAAA,CAAA,CAAAG,GAAAA,CAACE,UAAAA,CAAA,CAAW,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAAE,QAAA,CAAA,CAElD,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CCnEO,SAASO,CAAAA,CAA4B,CAAE,KAAA,CAAAC,GAAM,CAAA,CAAkD,CACpG,OACEZ,IAAAA,CAACK,CAAAA,CAAA,CACC,UAAAH,GAAAA,CAACI,CAAAA,CAAA,CAAoB,OAAA,CAAO,IAAA,CAC1B,QAAA,CAAAN,IAAAA,CAACC,CAAAA,CAAA,CAAO,SAAA,CAAU,6BAAA,CAA8B,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAA,CAChE,QAAA,CAAA,CAAAC,IAACW,SAAAA,CAAA,CAAU,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAAE,MAAA,CAAA,CAEjD,CAAA,CACF,CAAA,CACAb,IAAAA,CAACQ,CAAAA,CAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,cAAA,CACzC,QAAA,CAAA,CAAAN,GAAAA,CAACY,CAAAA,CAAA,CAAkB,QAAA,CAAA,gBAAA,CAAc,CAAA,CACjCZ,GAAAA,CAACQ,CAAAA,CAAA,EAAsB,CAAA,CACtBE,GAAAA,CACE,aAAA,EAAc,CACd,MAAA,CAAQG,CAAAA,EAAW,OAAOA,CAAAA,CAAO,WAAe,GAAA,EAAeA,CAAAA,CAAO,UAAA,EAAY,CAAA,CAClF,GAAA,CAAKA,CAAAA,EAEFb,GAAAA,CAACc,CAAAA,CAAA,CACC,OAAA,CAASD,CAAAA,CAAO,YAAA,EAAa,CAC7B,SAAA,CAAU,YAAA,CAEV,eAAA,CAAkBE,CAAAA,EAAU,CAC1BF,CAAAA,CAAO,gBAAA,CAAiB,CAAA,CAAQE,CAAM,EACxC,CAAA,CAEC,QAAA,CAAAF,CAAAA,CAAO,EAAA,CAAA,CALHA,CAAAA,CAAO,EAMd,CAEH,CAAA,CAAA,CACL,GACF,CAEJ,CCzBA,IAAMG,EAAAA,CAAwBC,IAAAA,CAAK,IACjC,OAAO,4BAAgC,CAAA,CAAE,KAAMC,CAAAA,GAAO,CAAE,OAAA,CAASA,CAAAA,CAAE,qBAAsB,CAAA,CAAE,CAC7F,CAAA,CACMC,EAAAA,CAAoBF,IAAAA,CAAK,IAAM,OAAO,qBAAqB,CAAA,CAAE,IAAA,CAAMC,CAAAA,GAAO,CAAE,OAAA,CAASA,CAAAA,CAAE,iBAAkB,CAAA,CAAE,CAAC,CAAA,CAS3G,SAASE,EAAAA,CAAwB,CACtC,UAAA,CAAAnC,CAAAA,CACA,WAAA,CAAAoC,GAAAA,CAAc,KAAA,CACd,QAAA,CAAAC,GAAAA,CACA,KAAA,CAAAZ,CACF,CAAA,CAA8C,CAC5C,IAAMrB,GAAAA,CAAiBC,CAAAA,EAAY,CAC7BiC,CAAAA,CAAcC,CAAAA,EAAe,CAC7BC,CAAAA,CAAaC,GAAAA,EAAc,CAC3BC,CAAAA,CAAeC,eAAAA,GACf,CAAE,cAAA,CAAAC,GAAAA,CAAgB,gBAAA,CAAAC,CAAiB,CAAA,CAAIC,CAAAA,EAAU,CACjDC,GAAAA,CAASH,GAAAA,EAAgB,MAAA,EAAU,EAAC,CACpCI,CAAAA,CAASJ,GAAAA,EAAgB,MAAA,CACzB,CAACK,EAAAA,CAAaC,EAAAA,CAAaC,EAAU,CAAA,CAAIC,GAAAA,EAAkB,CAC3D,CAACC,GAAAA,CAAYC,CAAa,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAC5CjD,CAAAA,CAAYC,CAAAA,GAIZiD,CAAAA,CAAwB/B,CAAAA,CAAM,mBAAA,EAAoB,CAAE,IAAA,CAAK,GAAA,CAAKvB,CAAAA,EAAQA,CAAAA,CAAI,QAAA,CAAS,GAAa,CAAA,CAEtG,SAASuD,EAAAA,EAAqB,CAC5BrD,GAAAA,CAAe,CAAE,IAAA,CAAM,WAAA,CAAa,OAAA,CAAS,CAAE,UAAA,CAAAJ,CAAW,CAAE,CAAC,EAC/D,CAEA,SAAS0D,EAAAA,CAAkB5B,CAAAA,CAAqB,CAC9CQ,CAAAA,CAAY,CAAE,KAAM,UAAA,CAAY,OAAA,CAAS,CAAE,SAAA,CAAWO,CAAAA,CAAkB,KAAA,CAAOf,CAAM,CAAE,CAAC,EAC1F,CAEA,eAAe6B,EAAAA,CAAeC,CAAAA,CAA8B,CAC1D,GAAIA,EAAI,MAAA,GAAW,CAAA,CACjB,OAGF,IAAMC,CAAAA,CAAWC,CAAAA,CAAwB9D,CAAAA,CAAY+C,GAAAA,CAAQa,CAAG,CAAA,CAEhE,MAAM,IAAI,OAAA,CAAc,CAACG,EAAAA,CAASC,EAAAA,GAAW,CAC3Cd,EAAAA,CAAYe,GAAAA;AAAA,QAAA,EACRJ,CAAQ;AAAA,MAAA,CACX,CAAA,CAEDV,GAAW,CACT,SAAA,CAAW,CAAE,KAAA,CAAOe,GAAAA,CAAqBN,CAAG,CAAE,CAAA,CAC9C,OAAOO,CAAAA,CAAkD,CACvD,QAAWC,EAAAA,IAAMR,CAAAA,CACfO,EAAM,KAAA,CAAM,CAAE,GAAAC,EAAG,CAAC,EAEtB,CAAA,CACA,WAAA,CAAa,IAAM,CACjBL,EAAAA,GACF,CAAA,CACA,OAAA,CAAUM,GAAiB,CACzBL,EAAAA,CAAOK,CAAK,EACd,CACF,CAAC,CAAA,CAEDpB,EAAAA,CAAY,IAAI,EAClB,CAAC,EACH,CAEA,SAASqB,EAAAA,EAA0B,CACjC,IAAMC,CAAAA,CAAYvE,IAAe,QAAA,CAAW,OAAA,CAAUA,EAAW,WAAA,EAAY,CAE7EI,IAAe,CACb,IAAA,CAAM,cACN,OAAA,CAAS,CACP,QAAS,CACP,WAAA,CAAa,UAAUoD,CAAAA,CAAY,MAAM,IAAIe,CAAS,CAAA,EAAGf,EAAY,MAAA,CAAS,CAAA,CAAI,IAAM,EAAE,CAAA,CAAA,CAC1F,cACEA,CAAAA,CAAY,MAAA,CAAS,EACjB,CAAA,6CAAA,EAAgDe,CAAS,uCACzD,CAAA,6CAAA,EAAgDA,CAAS,0CAC/D,iBAAA,CAAmB,QAAA,CACnB,kBAAmB,QAAA,CACnB,aAAA,CAAe,IAAA,CACf,kBAAA,CAAoB,SAAY,CAC9BjB,EAAc,IAAI,CAAA,CAElB,GAAI,CACF,IAAMkB,EAAc,CAAC,GAAGhB,CAAW,CAAA,CAEnC,MAAMG,GAAea,CAAW,CAAA,CAEhC/C,EAAM,iBAAA,EAAkB,CAExB,MAAMgD,GAAAA,CAA0B/B,CAAAA,CAAcgC,IAAuB1E,CAAAA,CAAY+C,GAAM,EAAGyB,CAAW,CAAA,CACrGG,MAAM,OAAA,CAAQH,CAAAA,CAAY,OAAS,CAAA,CAAI,6BAAA,CAAgC,4BAA4B,EACrG,CAAA,KAAQ,CACNG,KAAAA,CAAM,KAAA,CAAM,kCAAkC,EAChD,CAAA,OAAE,CACArB,CAAAA,CAAc,KAAK,EACrB,CACF,CAAA,CACA,kBAAA,CAAoB,IAAM,CAE1B,CACF,CACF,CACF,CAAC,EACH,CAEA,OACEzC,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,gDAAA,CACZ,UAAAmC,CAAAA,EAAUA,CAAAA,CAAO,OAAS,CAAA,CACzBnC,IAAAA,CAAC+D,EAAA,CACC,YAAA,CAAcpC,EAAW,KAAA,CACzB,aAAA,CAAgBV,GAAU,CACxB4B,EAAAA,CAAkB5B,CAAK,EACzB,CAAA,CACA,MAAOU,CAAAA,CAAW,KAAA,CAElB,UAAA3B,IAAAA,CAACgE,GAAAA,CAAA,CAAc,SAAA,CAAU,UAAA,CAAW,EAAA,CAAG,SAAA,CAAU,IAAA,CAAK,IAAA,CACpD,UAAA9D,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,0BAAA,CAA2B,QAAA,CAAA,QAAA,CAAM,EACjDA,GAAAA,CAAC+D,GAAAA,CAAA,CAEK,QAAA,CAAA,CAAAC,IAAAA,CAAKC,OAAOxC,CAAAA,CAAW,KAAA,EAAS,GAAI,MAAM,CAAC,EAAEQ,CAAM,CAAA,EAAyC,OAC1F,KAAA,CAER,CAAA,CAAA,CACF,EACAjC,GAAAA,CAACkE,GAAAA,CAAA,CACE,QAAA,CAAAjC,CAAAA,CAAO,IAAKkC,CAAAA,EACXnE,GAAAA,CAACoE,IAAA,CAAgC,KAAA,CAAOD,EAAU,IAAA,CAC/C,QAAA,CAAAA,EAAU,KAAA,CAAA,CADIA,CAAAA,CAAU,IAE3B,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CACJnE,GAAAA,CAACS,EAAA,CAAqB,KAAA,CAAOC,EAAO,CAAA,CACnCY,GAAAA,CACCtB,IAACD,CAAAA,CAAA,CACC,aAAW,QAAA,CACX,SAAA,CAAU,SACV,QAAA,CAAUuC,GAAAA,EAAcjB,IACxB,OAAA,CAASC,GAAAA,CACT,KAAK,SAAA,CACL,OAAA,CAAQ,UAER,QAAA,CAAAtB,GAAAA,CAACqE,UAAA,CAAU,SAAA,CAAWhD,IAAc,iBAAA,CAAoB,MAAA,CAAW,EACrE,CAAA,CACE,IAAA,CACJrB,IAACsE,GAAAA,CAAA,CAAkB,MAAO5D,CAAAA,CAAO,CAAA,CAAA,CACnC,EACC+B,CAAAA,CAAY,MAAA,CAAS,EACpBzC,GAAAA,CAACuE,EAAAA,CAAA,CAAkB,QAAA,CAAU,CAAChF,CAAAA,CAC5B,SAAAO,IAAAA,CAACC,CAAAA,CAAA,CACC,SAAA,CAAU,2BAAA,CACV,SAAUuC,GAAAA,EAAc,CAAC/C,EACzB,OAAA,CAASgE,EAAAA,CACT,KAAK,IAAA,CACL,OAAA,CAAQ,cAEP,QAAA,CAAA,CAAAjB,GAAAA,CACCtC,IAACwE,OAAAA,CAAA,CAAQ,UAAU,uCAAA,CAAwC,CAAA,CAE3DxE,IAACyE,MAAAA,CAAA,CAAO,UAAU,uBAAA,CAAwB,CAAA,CAC1C,WACOhC,CAAAA,CAAY,MAAA,CAAO,KAC9B,CAAA,CACF,CAAA,CACE,KACHxD,CAAAA,EAAcyF,CAAAA,CAA0BzF,CAAU,CAAA,CACjDe,GAAAA,CAAC2E,SAAA,CAAS,QAAA,CAAU,IAAA,CAClB,QAAA,CAAA3E,GAAAA,CAACgB,EAAAA,CAAA,CAAsB,UAAA,CAAY/B,CAAAA,CAAY,EACjD,CAAA,CACE,IAAA,CACHA,EACCe,GAAAA,CAAC2E,QAAAA,CAAA,CAAS,QAAA,CAAU,IAAA,CAClB,SAAA3E,GAAAA,CAACmB,EAAAA,CAAA,CAAkB,UAAA,CAAYlC,CAAAA,CAAY,YAAawD,CAAAA,CAAa,CAAA,CACvE,CAAA,CACE,IAAA,CACJzC,GAAAA,CAACuE,EAAAA,CAAA,CAAkB,QAAA,CAAU,CAAChF,EAC5B,QAAA,CAAAS,GAAAA,CAACD,EAAA,CACC,SAAA,CAAU,oBACV,QAAA,CAAUuC,GAAAA,EAAc,CAAC/C,CAAAA,CACzB,OAAA,CAASmD,GACT,IAAA,CAAK,IAAA,CACL,QAAQ,SAAA,CACT,QAAA,CAAA,QAAA,CAED,CAAA,CACF,CAAA,CAAA,CACF,CAEJ","file":"chunk-UOTVVZPA.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { lazy, Suspense, useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\nimport { isKnowledgeLinkableEntity } from '../apps/knowledge/knowledge';\n\n// Loaded on demand: the Knowledge module should only download when a list of\n// a linkable entity is in view, the way the record drawer loads its panel.\nconst EntityKnowledgeButton = lazy(() =>\n import('../apps/knowledge/record-links').then((m) => ({ default: m.EntityKnowledgeButton }))\n);\nconst EntityGraphButton = lazy(() => import('../apps/graph/entry').then((m) => ({ default: m.EntityGraphButton })));\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(apolloClient, getEntityListQueryName(entityName, schema), idsToDelete);\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n {entityName && isKnowledgeLinkableEntity(entityName) ? (\n <Suspense fallback={null}>\n <EntityKnowledgeButton entityName={entityName} />\n </Suspense>\n ) : null}\n {entityName ? (\n <Suspense fallback={null}>\n <EntityGraphButton entityName={entityName} selectedIds={selectedIds} />\n </Suspense>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {e,c,b,a,g,h as h$1,m,k as k$2,n}from'./chunk-36YXPN42.js';import {e as e$3}from'./chunk-337GX2BR.js';import {b as b$2}from'./chunk-DSLPTDZX.js';import {j as j$1}from'./chunk-UULPCFWK.js';import {c as c$4}from'./chunk-OWY5BQER.js';import {t,s,u,q as q$2,v,k as k$1,i,o as o$1,r as r$1,p as p$2}from'./chunk-7KLXWCDS.js';import {s as s$3,b as b$5}from'./chunk-DO32GATF.js';import {f}from'./chunk-CC2U7ASG.js';import {ja,o,p as p$1,q as q$1,r,s as s$2,t as t$3,ma}from'./chunk-RULCANNM.js';import {t as t$1}from'./chunk-A4DPLZZF.js';import {b as b$4}from'./chunk-G5N6HEPW.js';import {b as b$1,c as c$3,e as e$2,f as f$1,g as g$1,h,j}from'./chunk-5JUG4BEF.js';import {k,p,q,s as s$1,t as t$2}from'./chunk-S7Z6KKIN.js';import {a as a$1,b as b$3,c as c$2,e as e$1}from'./chunk-N33S7BSG.js';import {c as c$1}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useDeferredValue}from'react';import {BookOpenTextIcon,PaperclipIcon,ChevronRightIcon,LayersIcon,XIcon,PlusIcon,Unlink2Icon,LoaderCircle,SearchIcon}from'lucide-react';import {Link}from'react-router-dom';import H from'swr';import Qe from'swr/infinite';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Be=50;function fe({disabled:n,label:l,onClick:o}){return jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx(c$1,{"aria-label":l,className:"fk:size-7 fk:shrink-0",disabled:n,size:"icon",variant:"ghost",onClick:o,children:jsx(Unlink2Icon,{className:"fk:size-4"})})}),jsx(e$1,{children:l})]})}function Xe({api:n$1,attachedIds:l,onAttached:o,onOpenChange:a,open:s,projectId:u,target:r,targetLabel:c$1}){let[p$1,h]=useState(""),m$1=useDeferredValue(p$1.trim()),[y,f]=useState(null),b$1=(k,K)=>!s||K&&!K.hasMore?null:c(u).sources({limit:Be,offset:k*Be,search:m$1||void 0}),{data:v,error:w,isLoading:x,setSize:i$1,size:d}=Qe(b$1,b,{keepPreviousData:true}),g=useMemo(()=>r$1(v?.flatMap(k=>k.sources)??[],l),[l,v]),L=v?.[v.length-1]?.hasMore??false,C=v!==void 0&&d>v.length;async function A(k){f(k.id);try{let K=await n$1.linkSource(k.id,r);ma.success(K.linked?`Attached "${k.title}".`:`"${k.title}" was already attached.`),o(k),a(!1);}catch(K){ma.error(h$1(K,"The document could not be attached."));}finally{f(null);}}let R;return w?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):x&&!v?R=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-3 fk:py-2",children:[jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"})]}):g.length===0&&!L?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground",children:m$1?"No documents match your search.":"Every document is attached already, or there are none yet. Add documents in Knowledge first."}):R=jsxs("ul",{className:"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2",children:[g.map(k=>{let K=k$1(k),B=y===k.id;return jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle",disabled:y!==null,type:"button",onClick:()=>{A(k);},children:[jsx(m,{source:k}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:k.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(k)," \xB7 ",K.detail]})]}),B?jsx(LoaderCircle,{className:"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground"}):jsx(k$2,{label:K.label,tone:K.tone})]})},k.id)}),L&&!C?jsx("li",{"aria-hidden":true,children:jsx(n,{onVisible:()=>{i$1(k=>k+1);}})}):null,C?jsx("li",{className:"fk:flex fk:justify-center fk:py-2",children:jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin fk:text-muted-foreground"})}):null]}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg",children:[jsxs(q,{children:[jsx(s$1,{children:"Attach a document"}),jsx(t$2,{children:r.recordId===void 0?`Documents attached to every ${c$1} are searched before the rest of Knowledge when a question is about one of them, or about ${c$1} in general.`:`Documents attached to ${c$1} are searched before the rest of Knowledge when a question is about it.`})]}),jsxs("div",{className:"fk:relative",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(b$4,{"aria-label":"Search documents",autoFocus:true,className:"fk:pl-8",placeholder:"Search documents by title",value:p$1,onChange:k=>h(k.target.value)})]}),R]})})}function re({projectId:n,renderAction:l,sources:o}){return jsx("ul",{className:"fk:flex fk:flex-col fk:gap-1 fk:-mx-2",children:o.map(a=>{let s=k$1(a);return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle",children:[jsxs(Link,{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2",to:o$1(n,a.id),children:[jsx(m,{source:a}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(a)," \xB7 ",s.detail]})]})]}),jsx(k$2,{label:s.label,tone:s.tone}),l?.(a)]},a.id)})})}function yt({entityName:n}){let{api:l,projectId:o}=e(),{currentProject:a$1}=f(),[s$1,u$1]=useState(false),r=t(a$1?.schema??[],n),c$2=!!r&&s(n),{data:p,error:h}=H(o&&c$2?c(o).entitySources(n):null,b);if(!l||!o||!r||!c$2||h instanceof a&&h.status===404)return null;let m=p?.sources.length??0;return jsxs(Fragment,{children:[jsxs(c$1,{"aria-label":`Knowledge for every ${u(r)}`,className:"fk:mr-2 fk:h-8","data-knowledge-entity-button":true,size:"sm",variant:"outline",onClick:()=>u$1(true),children:[jsx(BookOpenTextIcon,{}),"Knowledge",m>0?jsx(b$1,{className:"fk:corner-squircle",variant:"secondary",children:m}):null]}),jsx(Ue,{api:l,entityLabel:u(r),entityName:n,open:s$1,projectId:o,onOpenChange:u$1})]})}function Ue({api:n,entityLabel:l,entityName:o,onOpenChange:a,open:s,projectId:u}){let r=b$2(),[c$2,p$1]=useState(false),[h,m]=useState(null),{data:y,error:f,isLoading:b$3,mutate:v}=H(c(u).entitySources(o),b),w=y?.sources??[],x=useMemo(()=>({entity:o}),[o]);async function i(g$1){m(g$1.id);try{await n.unlinkSource(g$1.id,x),ma.success(`"${g$1.title}" no longer applies to every ${l}.`),await v({sources:w.filter(L=>L.id!==g$1.id)},{revalidate:!1}),g();}catch(L){ma.error(h$1(L,"The document could not be detached."));}finally{m(null);}}let d;return f?d=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):b$3&&!y?d=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):w.length===0?d=jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["No documents apply to every ",l," yet. Attach a guide, a policy or a spec that holds for all of them and the agent searches it first when asked about any ",l,", or about ",l," in general."]}):d=jsx(re,{projectId:u,sources:w,renderAction:g=>r?jsx(fe,{disabled:h!==null,label:`Detach ${g.title}`,onClick:()=>{i(g);}}):null}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg","data-knowledge-entity-dialog":true,children:[jsxs(q,{children:[jsxs(s$1,{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenTextIcon,{className:"fk:size-4 fk:text-muted-foreground"}),"Knowledge for every ",l,y?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:w.length}):null]}),jsxs(t$2,{children:["Documents attached here apply to every ",l,"; each record can hold its own on top."]})]}),jsx("div",{className:"fk:max-h-80 fk:overflow-y-auto",children:d}),jsx("div",{className:"fk:flex fk:justify-end",children:jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>p$1(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})})}),jsx(Xe,{api:n,attachedIds:w.map(g=>g.id),open:c$2,projectId:u,target:x,targetLabel:l,onAttached:g$1=>{v({sources:w.some(L=>L.id===g$1.id)?w:[...w,g$1]},{revalidate:false}),g();},onOpenChange:p$1})]})})}function bt({entityName:n,recordId:l,recordLabel:o$1}){let{api:a$2,projectId:s$1}=e(),{currentProject:u$1}=f(),r=b$2(),[c$2,p]=useState(false),[h,m]=useState(false),[y,f$1]=useState(null),b$3=useMemo(()=>({entity:n,recordId:l}),[n,l]),v=t(u$1?.schema??[],n),w=v?u(v):n,x=s(n),{data:i,error:d,isLoading:g$1,mutate:L}=H(s$1&&x?c(s$1).recordSources(b$3):null,b);if(!a$2||!s$1||!x||d instanceof a&&d.status===404)return null;let C=i?.sources??[],A=i?.inherited??[],R=C.map(N=>N.id),k=a$2;async function K(N){f$1(N.id);try{await k.unlinkSource(N.id,b$3),ma.success(`Detached "${N.title}".`),await L({sources:C.filter($=>$.id!==N.id),inherited:A},{revalidate:!1}),g();}catch($){ma.error(h$1($,"The document could not be detached."));}finally{f$1(null);}}let B;return d?B=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The attached documents could not be loaded."}):g$1&&!i?B=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):B=jsxs("div",{className:"fk:flex fk:flex-col fk:gap-4",children:[C.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:A.length>0?"No documents attached to this record itself; the ones below apply to every record of its type.":"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record."}):jsx(re,{projectId:s$1,sources:C,renderAction:N=>r?jsx(fe,{disabled:y!==null,label:`Detach ${N.title}`,onClick:()=>{K(N);}}):null}),A.length>0?jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1","data-knowledge-inherited":true,children:[jsxs("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:["Applies to every ",w]}),jsx(re,{projectId:s$1,sources:A})]}):null]}),jsx(a$1,{children:jsxs(o,{className:`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${c$2?"fk:h-1/2":""}`,"data-knowledge-record-panel":true,open:c$2,onOpenChange:p,children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2",children:[jsx(p$1,{asChild:true,children:jsxs("button",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring",type:"button",children:[jsx(ChevronRightIcon,{className:`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${c$2?"fk:rotate-90":""}`}),jsx(BookOpenTextIcon,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"}),"Knowledge",i?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:C.length+A.length}):null]})}),c$2?jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>m(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})}):null]}),jsx(q$1,{className:"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6",children:B}),jsx(Xe,{api:a$2,attachedIds:R,open:h,projectId:s$1,target:b$3,targetLabel:o$1||`this ${n}`,onAttached:N=>{L({sources:C.some($=>$.id===N.id)?C:[...C,N],inherited:A.filter($=>$.id!==N.id)},{revalidate:false}),g();},onOpenChange:m})]})})}function Ze(n,l,o){let{scope:a}=c$4(),s=n.links.map(r=>r.recordId),{data:u}=e$3({entityNamePlural:n.entityPlural,schema:l,scope:a,selection:"display",includeCount:false,variables:{where:{_id:{in:s}},limit:s.length}});return useMemo(()=>{let r={};for(let c of u??[]){let p=c[o.name];typeof p=="string"&&p.trim()&&(r[c._id]=p);}return r},[u,o])}function Ye(n){let{currentProject:l}=f(),o=useMemo(()=>l?.schema??[],[l]),a=s$3(o,n.group.entityPlural),s=b$5(a);return !a||!s?jsx(Je,{...n,entityLabel:a?u(a):n.group.entityPlural,labels:{}}):jsx(et,{...n,displayAttribute:s,schema:o,entityLabel:u(a)})}function et({displayAttribute:n,entityLabel:l,schema:o,...a}){let s=Ze(a.group,o,n);return jsx(Je,{...a,entityLabel:l,labels:s})}function Je({canMutate:n,detachingKey:l,entityLabel:o,group:a,labels:s,onDetach:u}){let r=j$1();return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1",children:[jsx("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:o}),jsx("ul",{className:"fk:flex fk:flex-col fk:-mx-2",children:a.links.map(c=>{let p=p$2(c,s[c.recordId]),h=`${c.entity}:${c.recordId}`;return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle",children:[jsx("button",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2",title:c.recordId,type:"button",onClick:()=>r({type:"EditEntity",payload:{entityId:c.recordId,entityNamePlural:a.entityPlural}}),children:p}),n?jsx(fe,{disabled:l!==null,label:`Detach from ${p}`,onClick:()=>u(c)}):null]},h)})})]})}function vt({api:n,projectId:l,source:o}){let a=b$2(),[s,u$1]=useState(null),{data:r,error:c$1,isLoading:p,mutate:h}=H(c(l).links(o.id),b),m=useMemo(()=>r?.links??[],[r]),y=useMemo(()=>r?.entities??[],[r]),f=useMemo(()=>q$2(m),[m]);async function b$3(i){u$1(`${i.entity}:${i.recordId}`);try{await n.unlinkSource(o.id,{entity:i.entity,recordId:i.recordId}),ma.success("Detached."),await h({links:m.filter(d=>d.entity!==i.entity||d.recordId!==i.recordId),entities:y},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function v(i){u$1(`${i.entity}:*`);try{await n.unlinkSource(o.id,{entity:i.entity}),ma.success("Detached."),await h({links:m,entities:y.filter(d=>d.entity!==i.entity)},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function w(i){u$1(`${i.name}:+`);try{let d=await n.linkSource(o.id,{entity:i.name});ma.success(d.linked?`Applies to every ${u(i)} now.`:`Already applied to every ${u(i)}.`),await h({links:m,entities:y.some(g=>g.entity===i.name)?y:[...y,{entity:i.name,entityPlural:i.plural}]},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be attached."));}finally{u$1(null);}}let x;return c$1?x=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The linked records could not be loaded."}):p&&!r?x=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-6 fk:w-1/2"}),jsx(t$1,{className:"fk:h-6 fk:w-1/3"})]}):f.length===0?x=jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:'Not attached to any record. Open a record in the Desk and use "Attach document" so the agent searches this document before the rest of Knowledge when asked about that record.'}):x=jsx("div",{className:"fk:flex fk:flex-col fk:gap-4",children:f.map(i=>jsx(Ye,{canMutate:a,detachingKey:s,group:i,onDetach:d=>{b$3(d);}},i.entityPlural))}),jsxs(Fragment,{children:[jsx(tt,{busy:s!==null,canMutate:a,entities:y,isLoading:p&&!r,onAttach:i=>{w(i);},onDetach:i=>{v(i);}}),jsxs("div",{className:"fk:mt-2 fk:flex fk:items-center fk:gap-2",children:[jsx(PaperclipIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Linked records"}),m.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:m.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"When a question is about one of these records, the agent searches this document before the rest."}),x]})}function tt({busy:n,canMutate:l,entities:o,isLoading:a,onAttach:s,onDetach:u$1}){let{currentProject:r$1}=f(),c=useMemo(()=>r$1?.schema??[],[r$1]),[p,h$1]=useState(false),m=useMemo(()=>v(c,o),[o,c]),y=f=>{let b=t(c,f.entity);return b?u(b):f.entityPlural};return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3","data-knowledge-applies-to":true,children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LayersIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Applies to"}),o.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:o.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every record of that type, and for questions about the type in general."}),a?jsx(t$1,{className:"fk:h-7 fk:w-1/3"}):jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[o.map(f=>{let b=y(f);return jsxs(b$1,{className:"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle",variant:"secondary",children:[jsx("span",{className:"fk:capitalize",children:b}),l?jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx("button",{"aria-label":`No longer apply to every ${b}`,className:"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50",disabled:n,type:"button",onClick:()=>u$1(f),children:jsx(XIcon,{className:"fk:size-3"})})}),jsxs(e$1,{children:["No longer apply to every ",b]})]}):null]},f.entity)}),jsxs(r,{open:p,onOpenChange:h$1,children:[jsx(ja,{disabled:!l,children:jsx(s$2,{asChild:true,children:jsxs(c$1,{className:"fk:h-7",disabled:!l||m.length===0,size:"sm",variant:"outline",children:[jsx(PlusIcon,{}),"Add entity type"]})})}),jsx(t$3,{align:"start",className:"fk:w-64 fk:p-0",children:jsxs(c$3,{children:[jsx(e$2,{placeholder:"Search entity types"}),jsxs(f$1,{children:[jsx(g$1,{children:"No entity type matches."}),jsx(h,{children:m.map(f=>jsx(j,{keywords:[u(f),f.name,f.plural],value:f.name,onSelect:()=>{h$1(false),s(f);},children:jsx("span",{className:"fk:capitalize",children:u(f)})},f.name))})]})]})})]})]})]})}export{yt as a,bt as b,vt as c};//# sourceMappingURL=chunk-BHHLWGZ4.js.map
2
- //# sourceMappingURL=chunk-BHHLWGZ4.js.map
1
+ import'./index.css';import {e,c,b,a,g,h as h$1,m,k as k$2,n}from'./chunk-IJECATW3.js';import {e as e$3}from'./chunk-CCVE7GGO.js';import {b as b$2}from'./chunk-DSLPTDZX.js';import {j as j$1}from'./chunk-4OGLWOO3.js';import {c as c$4}from'./chunk-DSZJXMN5.js';import {t,s,u,q as q$2,v,k as k$1,i,o as o$1,r as r$1,p as p$2}from'./chunk-7KLXWCDS.js';import {s as s$3,b as b$5}from'./chunk-GORBKX24.js';import {f}from'./chunk-INZZOKRC.js';import {ja,o,p as p$1,q as q$1,r,s as s$2,t as t$3,ma}from'./chunk-RULCANNM.js';import {t as t$1}from'./chunk-A4DPLZZF.js';import {b as b$4}from'./chunk-G5N6HEPW.js';import {b as b$1,c as c$3,e as e$2,f as f$1,g as g$1,h,j}from'./chunk-5JUG4BEF.js';import {k,p,q,s as s$1,t as t$2}from'./chunk-S7Z6KKIN.js';import {a as a$1,b as b$3,c as c$2,e as e$1}from'./chunk-N33S7BSG.js';import {c as c$1}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useDeferredValue}from'react';import {BookOpenTextIcon,PaperclipIcon,ChevronRightIcon,LayersIcon,XIcon,PlusIcon,Unlink2Icon,LoaderCircle,SearchIcon}from'lucide-react';import {Link}from'react-router-dom';import H from'swr';import Qe from'swr/infinite';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Be=50;function fe({disabled:n,label:l,onClick:o}){return jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx(c$1,{"aria-label":l,className:"fk:size-7 fk:shrink-0",disabled:n,size:"icon",variant:"ghost",onClick:o,children:jsx(Unlink2Icon,{className:"fk:size-4"})})}),jsx(e$1,{children:l})]})}function Xe({api:n$1,attachedIds:l,onAttached:o,onOpenChange:a,open:s,projectId:u,target:r,targetLabel:c$1}){let[p$1,h]=useState(""),m$1=useDeferredValue(p$1.trim()),[y,f]=useState(null),b$1=(k,K)=>!s||K&&!K.hasMore?null:c(u).sources({limit:Be,offset:k*Be,search:m$1||void 0}),{data:v,error:w,isLoading:x,setSize:i$1,size:d}=Qe(b$1,b,{keepPreviousData:true}),g=useMemo(()=>r$1(v?.flatMap(k=>k.sources)??[],l),[l,v]),L=v?.[v.length-1]?.hasMore??false,C=v!==void 0&&d>v.length;async function A(k){f(k.id);try{let K=await n$1.linkSource(k.id,r);ma.success(K.linked?`Attached "${k.title}".`:`"${k.title}" was already attached.`),o(k),a(!1);}catch(K){ma.error(h$1(K,"The document could not be attached."));}finally{f(null);}}let R;return w?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):x&&!v?R=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-3 fk:py-2",children:[jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"})]}):g.length===0&&!L?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground",children:m$1?"No documents match your search.":"Every document is attached already, or there are none yet. Add documents in Knowledge first."}):R=jsxs("ul",{className:"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2",children:[g.map(k=>{let K=k$1(k),B=y===k.id;return jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle",disabled:y!==null,type:"button",onClick:()=>{A(k);},children:[jsx(m,{source:k}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:k.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(k)," \xB7 ",K.detail]})]}),B?jsx(LoaderCircle,{className:"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground"}):jsx(k$2,{label:K.label,tone:K.tone})]})},k.id)}),L&&!C?jsx("li",{"aria-hidden":true,children:jsx(n,{onVisible:()=>{i$1(k=>k+1);}})}):null,C?jsx("li",{className:"fk:flex fk:justify-center fk:py-2",children:jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin fk:text-muted-foreground"})}):null]}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg",children:[jsxs(q,{children:[jsx(s$1,{children:"Attach a document"}),jsx(t$2,{children:r.recordId===void 0?`Documents attached to every ${c$1} are searched before the rest of Knowledge when a question is about one of them, or about ${c$1} in general.`:`Documents attached to ${c$1} are searched before the rest of Knowledge when a question is about it.`})]}),jsxs("div",{className:"fk:relative",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(b$4,{"aria-label":"Search documents",autoFocus:true,className:"fk:pl-8",placeholder:"Search documents by title",value:p$1,onChange:k=>h(k.target.value)})]}),R]})})}function re({projectId:n,renderAction:l,sources:o}){return jsx("ul",{className:"fk:flex fk:flex-col fk:gap-1 fk:-mx-2",children:o.map(a=>{let s=k$1(a);return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle",children:[jsxs(Link,{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2",to:o$1(n,a.id),children:[jsx(m,{source:a}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(a)," \xB7 ",s.detail]})]})]}),jsx(k$2,{label:s.label,tone:s.tone}),l?.(a)]},a.id)})})}function yt({entityName:n}){let{api:l,projectId:o}=e(),{currentProject:a$1}=f(),[s$1,u$1]=useState(false),r=t(a$1?.schema??[],n),c$2=!!r&&s(n),{data:p,error:h}=H(o&&c$2?c(o).entitySources(n):null,b);if(!l||!o||!r||!c$2||h instanceof a&&h.status===404)return null;let m=p?.sources.length??0;return jsxs(Fragment,{children:[jsxs(c$1,{"aria-label":`Knowledge for every ${u(r)}`,className:"fk:mr-2 fk:h-8","data-knowledge-entity-button":true,size:"sm",variant:"outline",onClick:()=>u$1(true),children:[jsx(BookOpenTextIcon,{}),"Knowledge",m>0?jsx(b$1,{className:"fk:corner-squircle",variant:"secondary",children:m}):null]}),jsx(Ue,{api:l,entityLabel:u(r),entityName:n,open:s$1,projectId:o,onOpenChange:u$1})]})}function Ue({api:n,entityLabel:l,entityName:o,onOpenChange:a,open:s,projectId:u}){let r=b$2(),[c$2,p$1]=useState(false),[h,m]=useState(null),{data:y,error:f,isLoading:b$3,mutate:v}=H(c(u).entitySources(o),b),w=y?.sources??[],x=useMemo(()=>({entity:o}),[o]);async function i(g$1){m(g$1.id);try{await n.unlinkSource(g$1.id,x),ma.success(`"${g$1.title}" no longer applies to every ${l}.`),await v({sources:w.filter(L=>L.id!==g$1.id)},{revalidate:!1}),g();}catch(L){ma.error(h$1(L,"The document could not be detached."));}finally{m(null);}}let d;return f?d=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):b$3&&!y?d=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):w.length===0?d=jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["No documents apply to every ",l," yet. Attach a guide, a policy or a spec that holds for all of them and the agent searches it first when asked about any ",l,", or about ",l," in general."]}):d=jsx(re,{projectId:u,sources:w,renderAction:g=>r?jsx(fe,{disabled:h!==null,label:`Detach ${g.title}`,onClick:()=>{i(g);}}):null}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg","data-knowledge-entity-dialog":true,children:[jsxs(q,{children:[jsxs(s$1,{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenTextIcon,{className:"fk:size-4 fk:text-muted-foreground"}),"Knowledge for every ",l,y?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:w.length}):null]}),jsxs(t$2,{children:["Documents attached here apply to every ",l,"; each record can hold its own on top."]})]}),jsx("div",{className:"fk:max-h-80 fk:overflow-y-auto",children:d}),jsx("div",{className:"fk:flex fk:justify-end",children:jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>p$1(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})})}),jsx(Xe,{api:n,attachedIds:w.map(g=>g.id),open:c$2,projectId:u,target:x,targetLabel:l,onAttached:g$1=>{v({sources:w.some(L=>L.id===g$1.id)?w:[...w,g$1]},{revalidate:false}),g();},onOpenChange:p$1})]})})}function bt({entityName:n,recordId:l,recordLabel:o$1}){let{api:a$2,projectId:s$1}=e(),{currentProject:u$1}=f(),r=b$2(),[c$2,p]=useState(false),[h,m]=useState(false),[y,f$1]=useState(null),b$3=useMemo(()=>({entity:n,recordId:l}),[n,l]),v=t(u$1?.schema??[],n),w=v?u(v):n,x=s(n),{data:i,error:d,isLoading:g$1,mutate:L}=H(s$1&&x?c(s$1).recordSources(b$3):null,b);if(!a$2||!s$1||!x||d instanceof a&&d.status===404)return null;let C=i?.sources??[],A=i?.inherited??[],R=C.map(N=>N.id),k=a$2;async function K(N){f$1(N.id);try{await k.unlinkSource(N.id,b$3),ma.success(`Detached "${N.title}".`),await L({sources:C.filter($=>$.id!==N.id),inherited:A},{revalidate:!1}),g();}catch($){ma.error(h$1($,"The document could not be detached."));}finally{f$1(null);}}let B;return d?B=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The attached documents could not be loaded."}):g$1&&!i?B=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):B=jsxs("div",{className:"fk:flex fk:flex-col fk:gap-4",children:[C.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:A.length>0?"No documents attached to this record itself; the ones below apply to every record of its type.":"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record."}):jsx(re,{projectId:s$1,sources:C,renderAction:N=>r?jsx(fe,{disabled:y!==null,label:`Detach ${N.title}`,onClick:()=>{K(N);}}):null}),A.length>0?jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1","data-knowledge-inherited":true,children:[jsxs("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:["Applies to every ",w]}),jsx(re,{projectId:s$1,sources:A})]}):null]}),jsx(a$1,{children:jsxs(o,{className:`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${c$2?"fk:h-1/2":""}`,"data-knowledge-record-panel":true,open:c$2,onOpenChange:p,children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2",children:[jsx(p$1,{asChild:true,children:jsxs("button",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring",type:"button",children:[jsx(ChevronRightIcon,{className:`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${c$2?"fk:rotate-90":""}`}),jsx(BookOpenTextIcon,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"}),"Knowledge",i?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:C.length+A.length}):null]})}),c$2?jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>m(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})}):null]}),jsx(q$1,{className:"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6",children:B}),jsx(Xe,{api:a$2,attachedIds:R,open:h,projectId:s$1,target:b$3,targetLabel:o$1||`this ${n}`,onAttached:N=>{L({sources:C.some($=>$.id===N.id)?C:[...C,N],inherited:A.filter($=>$.id!==N.id)},{revalidate:false}),g();},onOpenChange:m})]})})}function Ze(n,l,o){let{scope:a}=c$4(),s=n.links.map(r=>r.recordId),{data:u}=e$3({entityNamePlural:n.entityPlural,schema:l,scope:a,selection:"display",includeCount:false,variables:{where:{_id:{in:s}},limit:s.length}});return useMemo(()=>{let r={};for(let c of u??[]){let p=c[o.name];typeof p=="string"&&p.trim()&&(r[c._id]=p);}return r},[u,o])}function Ye(n){let{currentProject:l}=f(),o=useMemo(()=>l?.schema??[],[l]),a=s$3(o,n.group.entityPlural),s=b$5(a);return !a||!s?jsx(Je,{...n,entityLabel:a?u(a):n.group.entityPlural,labels:{}}):jsx(et,{...n,displayAttribute:s,schema:o,entityLabel:u(a)})}function et({displayAttribute:n,entityLabel:l,schema:o,...a}){let s=Ze(a.group,o,n);return jsx(Je,{...a,entityLabel:l,labels:s})}function Je({canMutate:n,detachingKey:l,entityLabel:o,group:a,labels:s,onDetach:u}){let r=j$1();return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1",children:[jsx("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:o}),jsx("ul",{className:"fk:flex fk:flex-col fk:-mx-2",children:a.links.map(c=>{let p=p$2(c,s[c.recordId]),h=`${c.entity}:${c.recordId}`;return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle",children:[jsx("button",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2",title:c.recordId,type:"button",onClick:()=>r({type:"EditEntity",payload:{entityId:c.recordId,entityNamePlural:a.entityPlural}}),children:p}),n?jsx(fe,{disabled:l!==null,label:`Detach from ${p}`,onClick:()=>u(c)}):null]},h)})})]})}function vt({api:n,projectId:l,source:o}){let a=b$2(),[s,u$1]=useState(null),{data:r,error:c$1,isLoading:p,mutate:h}=H(c(l).links(o.id),b),m=useMemo(()=>r?.links??[],[r]),y=useMemo(()=>r?.entities??[],[r]),f=useMemo(()=>q$2(m),[m]);async function b$3(i){u$1(`${i.entity}:${i.recordId}`);try{await n.unlinkSource(o.id,{entity:i.entity,recordId:i.recordId}),ma.success("Detached."),await h({links:m.filter(d=>d.entity!==i.entity||d.recordId!==i.recordId),entities:y},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function v(i){u$1(`${i.entity}:*`);try{await n.unlinkSource(o.id,{entity:i.entity}),ma.success("Detached."),await h({links:m,entities:y.filter(d=>d.entity!==i.entity)},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function w(i){u$1(`${i.name}:+`);try{let d=await n.linkSource(o.id,{entity:i.name});ma.success(d.linked?`Applies to every ${u(i)} now.`:`Already applied to every ${u(i)}.`),await h({links:m,entities:y.some(g=>g.entity===i.name)?y:[...y,{entity:i.name,entityPlural:i.plural}]},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be attached."));}finally{u$1(null);}}let x;return c$1?x=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The linked records could not be loaded."}):p&&!r?x=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-6 fk:w-1/2"}),jsx(t$1,{className:"fk:h-6 fk:w-1/3"})]}):f.length===0?x=jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:'Not attached to any record. Open a record in the Desk and use "Attach document" so the agent searches this document before the rest of Knowledge when asked about that record.'}):x=jsx("div",{className:"fk:flex fk:flex-col fk:gap-4",children:f.map(i=>jsx(Ye,{canMutate:a,detachingKey:s,group:i,onDetach:d=>{b$3(d);}},i.entityPlural))}),jsxs(Fragment,{children:[jsx(tt,{busy:s!==null,canMutate:a,entities:y,isLoading:p&&!r,onAttach:i=>{w(i);},onDetach:i=>{v(i);}}),jsxs("div",{className:"fk:mt-2 fk:flex fk:items-center fk:gap-2",children:[jsx(PaperclipIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Linked records"}),m.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:m.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"When a question is about one of these records, the agent searches this document before the rest."}),x]})}function tt({busy:n,canMutate:l,entities:o,isLoading:a,onAttach:s,onDetach:u$1}){let{currentProject:r$1}=f(),c=useMemo(()=>r$1?.schema??[],[r$1]),[p,h$1]=useState(false),m=useMemo(()=>v(c,o),[o,c]),y=f=>{let b=t(c,f.entity);return b?u(b):f.entityPlural};return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3","data-knowledge-applies-to":true,children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LayersIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Applies to"}),o.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:o.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every record of that type, and for questions about the type in general."}),a?jsx(t$1,{className:"fk:h-7 fk:w-1/3"}):jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[o.map(f=>{let b=y(f);return jsxs(b$1,{className:"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle",variant:"secondary",children:[jsx("span",{className:"fk:capitalize",children:b}),l?jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx("button",{"aria-label":`No longer apply to every ${b}`,className:"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50",disabled:n,type:"button",onClick:()=>u$1(f),children:jsx(XIcon,{className:"fk:size-3"})})}),jsxs(e$1,{children:["No longer apply to every ",b]})]}):null]},f.entity)}),jsxs(r,{open:p,onOpenChange:h$1,children:[jsx(ja,{disabled:!l,children:jsx(s$2,{asChild:true,children:jsxs(c$1,{className:"fk:h-7",disabled:!l||m.length===0,size:"sm",variant:"outline",children:[jsx(PlusIcon,{}),"Add entity type"]})})}),jsx(t$3,{align:"start",className:"fk:w-64 fk:p-0",children:jsxs(c$3,{children:[jsx(e$2,{placeholder:"Search entity types"}),jsxs(f$1,{children:[jsx(g$1,{children:"No entity type matches."}),jsx(h,{children:m.map(f=>jsx(j,{keywords:[u(f),f.name,f.plural],value:f.name,onSelect:()=>{h$1(false),s(f);},children:jsx("span",{className:"fk:capitalize",children:u(f)})},f.name))})]})]})})]})]})]})}export{yt as a,bt as b,vt as c};//# sourceMappingURL=chunk-WYVXSLB7.js.map
2
+ //# sourceMappingURL=chunk-WYVXSLB7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/record-links.tsx"],"names":["PICKER_PAGE_SIZE","DetachButton","disabled","label","onClick","jsxs","Tooltip","jsx","TooltipTrigger","Button","Unlink2Icon","TooltipContent","AttachDocumentDialog","api","attachedIds","onAttached","onOpenChange","open","projectId","target","targetLabel","search","setSearch","useState","deferredSearch","useDeferredValue","attachingId","setAttachingId","getPageKey","pageIndex","previousPage","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","candidates","useMemo","getAttachableSources","page","hasMore","isLoadingMore","attach","source","result","toast","attachError","describeApiError","body","Skeleton","status","summarizeKnowledgeStatus","isAttaching","SourceIcon","getKnowledgeKindLabel","LoaderCircle","StatusBadge","InfiniteScrollSentinel","current","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","SearchIcon","Input","event","SourceRows","renderAction","sources","Link","getKnowledgeSourcePath","EntityKnowledgeButton","entityName","useProjectKnowledge","currentProject","useConfig","isOpen","setIsOpen","entitySchema","findEntityByName","isLinkable","isKnowledgeLinkableEntity","data","useSWR","FetcherError","count","Fragment","getEntityLinkLabel","BookOpenTextIcon","Badge","EntityKnowledgeDialog","entityLabel","canMutate","useCanMutate","isPickerOpen","setIsPickerOpen","detachingId","setDetachingId","mutate","detach","entry","invalidateKnowledgeLinks","detachError","PermissionTooltip","PaperclipIcon","RecordKnowledgePanel","recordId","recordLabel","record","inherited","knowledgeApi","TooltipProvider","Collapsible","CollapsibleTrigger","ChevronRightIcon","CollapsibleContent","useRecordLabels","group","schema","displayAttribute","scope","useAppContext","ids","link","useEntityQuery","labels","item","value","LinkedRecordGroup","props","getEntitySchema","getDisplayAttribute","LinkedRecordRows","ResolvedLinkedRecordGroup","detachingKey","onDetach","dispatch","useDispatch","getKnowledgeLinkLabel","key","LinkedRecordsSection","setDetachingKey","links","entities","groups","groupKnowledgeLinks","detachEntity","attachEntity","entity","AppliesToEntities","busy","onAttach","getLinkableEntities","labelOf","LayersIcon","XIcon","Popover","PopoverTrigger","PlusIcon","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem"],"mappings":"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","file":"chunk-BHHLWGZ4.js","sourcesContent":["import type { JSX } from 'react';\nimport { useDeferredValue, useMemo, useState } from 'react';\nimport {\n BookOpenTextIcon,\n ChevronRightIcon,\n LayersIcon,\n LoaderCircle,\n PaperclipIcon,\n PlusIcon,\n SearchIcon,\n Unlink2Icon,\n XIcon,\n} from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { getDisplayAttribute } from '../../core/get-display-attribute';\nimport type { Attribute, Entity } from '../../core/types';\nimport { useCanMutate } from '../../core/permissions';\nimport { useDispatch } from '../../entities/actions-context';\nimport { getEntitySchema } from '../../graphql-client/queries';\nimport type { MappedEntityItem } from '../../graphql-client/types';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n Badge,\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n PermissionTooltip,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Skeleton,\n toast,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, FetcherError, knowledgePaths, type KnowledgeApi } from './api';\nimport {\n findEntityByName,\n getAttachableSources,\n getEntityLinkLabel,\n getKnowledgeKindLabel,\n getKnowledgeLinkLabel,\n getKnowledgeSourcePath,\n getLinkableEntities,\n groupKnowledgeLinks,\n isKnowledgeLinkableEntity,\n summarizeKnowledgeStatus,\n type KnowledgeEntityLink,\n type KnowledgeEntitySources,\n type KnowledgeLink,\n type KnowledgeLinkGroup,\n type KnowledgeLinksList,\n type KnowledgeLinkTarget,\n type KnowledgeRecordRef,\n type KnowledgeRecordSources,\n type KnowledgeSource,\n type KnowledgeSourcesList,\n} from './knowledge';\nimport {\n describeApiError,\n InfiniteScrollSentinel,\n invalidateKnowledgeLinks,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst PICKER_PAGE_SIZE = 50;\n\nfunction DetachButton({\n disabled,\n label,\n onClick,\n}: {\n disabled: boolean;\n label: string;\n onClick: () => void;\n}): JSX.Element {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n className=\"fk:size-7 fk:shrink-0\"\n disabled={disabled}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onClick}\n >\n <Unlink2Icon className=\"fk:size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n/**\n * The picker behind \"Attach document\": the project's documents, searched by\n * title, minus the ones already attached. Picking one links it right away.\n */\nfunction AttachDocumentDialog({\n api,\n attachedIds,\n onAttached,\n onOpenChange,\n open,\n projectId,\n target,\n targetLabel,\n}: {\n api: KnowledgeApi;\n attachedIds: string[];\n onAttached: (_source: KnowledgeSource) => void;\n onOpenChange: (_open: boolean) => void;\n open: boolean;\n projectId: string;\n /** A record, or an entity type when it names no record. */\n target: KnowledgeLinkTarget;\n /** How the target is called in the dialog copy: a record title, or an entity label. */\n targetLabel: string;\n}): JSX.Element {\n const [search, setSearch] = useState('');\n const deferredSearch = useDeferredValue(search.trim());\n const [attachingId, setAttachingId] = useState<string | null>(null);\n const getPageKey = (pageIndex: number, previousPage: KnowledgeSourcesList | null): string | null => {\n if (!open || (previousPage && !previousPage.hasMore)) {\n return null;\n }\n\n return knowledgePaths(projectId).sources({\n limit: PICKER_PAGE_SIZE,\n offset: pageIndex * PICKER_PAGE_SIZE,\n search: deferredSearch || undefined,\n });\n };\n // Paged like the document list: the attached ones are hidden client-side,\n // so a record with many documents attached must be able to reach the next page.\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgeSourcesList>(getPageKey, fetcher, { keepPreviousData: true });\n const candidates = useMemo(\n () => getAttachableSources(pages?.flatMap((page) => page.sources) ?? [], attachedIds),\n [attachedIds, pages]\n );\n const hasMore = pages?.[pages.length - 1]?.hasMore ?? false;\n const isLoadingMore = pages !== undefined && size > pages.length;\n\n async function attach(source: KnowledgeSource): Promise<void> {\n setAttachingId(source.id);\n\n try {\n const result = await api.linkSource(source.id, target);\n\n toast.success(result.linked ? `Attached \"${source.title}\".` : `\"${source.title}\" was already attached.`);\n onAttached(source);\n onOpenChange(false);\n } catch (attachError) {\n toast.error(describeApiError(attachError, 'The document could not be attached.'));\n } finally {\n setAttachingId(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:py-6 fk:text-center fk:text-sm fk:text-destructive\">The documents could not be loaded.</p>;\n } else if (isLoading && !pages) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-3 fk:py-2\">\n <Skeleton className=\"fk:h-10 fk:w-full\" />\n <Skeleton className=\"fk:h-10 fk:w-full\" />\n <Skeleton className=\"fk:h-10 fk:w-full\" />\n </div>\n );\n } else if (candidates.length === 0 && !hasMore) {\n body = (\n <p className=\"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {deferredSearch\n ? 'No documents match your search.'\n : 'Every document is attached already, or there are none yet. Add documents in Knowledge first.'}\n </p>\n );\n } else {\n body = (\n <ul className=\"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2\">\n {candidates.map((source) => {\n const status = summarizeKnowledgeStatus(source);\n const isAttaching = attachingId === source.id;\n\n return (\n <li key={source.id}>\n <button\n className=\"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle\"\n disabled={attachingId !== null}\n type=\"button\"\n onClick={() => void attach(source)}\n >\n <SourceIcon source={source} />\n <span className=\"fk:min-w-0 fk:flex-1\">\n <span className=\"fk:block fk:truncate fk:text-sm fk:font-medium\">{source.title}</span>\n <span className=\"fk:block fk:truncate fk:text-xs fk:text-muted-foreground\">\n {getKnowledgeKindLabel(source)} · {status.detail}\n </span>\n </span>\n {isAttaching ? (\n <LoaderCircle className=\"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground\" />\n ) : (\n <StatusBadge label={status.label} tone={status.tone} />\n )}\n </button>\n </li>\n );\n })}\n {hasMore && !isLoadingMore ? (\n <li aria-hidden>\n <InfiniteScrollSentinel onVisible={() => void setSize((current) => current + 1)} />\n </li>\n ) : null}\n {isLoadingMore ? (\n <li className=\"fk:flex fk:justify-center fk:py-2\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin fk:text-muted-foreground\" />\n </li>\n ) : null}\n </ul>\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"fk:sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Attach a document</DialogTitle>\n <DialogDescription>\n {target.recordId === undefined\n ? `Documents attached to every ${targetLabel} are searched before the rest of Knowledge when a question is about one of them, or about ${targetLabel} in general.`\n : `Documents attached to ${targetLabel} are searched before the rest of Knowledge when a question is about it.`}\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative\">\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 autoFocus\n className=\"fk:pl-8\"\n placeholder=\"Search documents by title\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n {body}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Document rows shared by the record panel and the entity dialog: icon, title, kind and status, plus an optional action. */\nfunction SourceRows({\n projectId,\n renderAction,\n sources,\n}: {\n projectId: string;\n renderAction?: (_source: KnowledgeSource) => JSX.Element | null;\n sources: KnowledgeSource[];\n}): JSX.Element {\n return (\n <ul className=\"fk:flex fk:flex-col fk:gap-1 fk:-mx-2\">\n {sources.map((source) => {\n const status = summarizeKnowledgeStatus(source);\n\n return (\n <li\n className=\"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle\"\n key={source.id}\n >\n <Link\n className=\"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2\"\n to={getKnowledgeSourcePath(projectId, source.id)}\n >\n <SourceIcon source={source} />\n <span className=\"fk:min-w-0 fk:flex-1\">\n <span className=\"fk:block fk:truncate fk:text-sm fk:font-medium\">{source.title}</span>\n <span className=\"fk:block fk:truncate fk:text-xs fk:text-muted-foreground\">\n {getKnowledgeKindLabel(source)} · {status.detail}\n </span>\n </span>\n </Link>\n <StatusBadge label={status.label} tone={status.tone} />\n {renderAction?.(source)}\n </li>\n );\n })}\n </ul>\n );\n}\n\n/**\n * The documents attached to every record of an entity type, behind a button\n * in the Desk list toolbar: open them, attach another, detach one. Only the\n * project's own entities qualify, and the button stays out while the schema\n * is unknown.\n */\nexport function EntityKnowledgeButton({ entityName }: { entityName: string }): JSX.Element | null {\n const { api, projectId } = useProjectKnowledge();\n const { currentProject } = useConfig();\n const [isOpen, setIsOpen] = useState(false);\n const entitySchema = findEntityByName(currentProject?.schema ?? [], entityName);\n const isLinkable = Boolean(entitySchema) && isKnowledgeLinkableEntity(entityName);\n const { data, error } = useSWR<KnowledgeEntitySources>(\n projectId && isLinkable ? knowledgePaths(projectId).entitySources(entityName) : null,\n fetcher\n );\n\n if (!api || !projectId || !entitySchema || !isLinkable || (error instanceof FetcherError && error.status === 404)) {\n return null;\n }\n\n const count = data?.sources.length ?? 0;\n\n return (\n <>\n <Button\n aria-label={`Knowledge for every ${getEntityLinkLabel(entitySchema)}`}\n className=\"fk:mr-2 fk:h-8\"\n data-knowledge-entity-button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setIsOpen(true)}\n >\n <BookOpenTextIcon />\n Knowledge\n {count > 0 ? (\n <Badge className=\"fk:corner-squircle\" variant=\"secondary\">\n {count}\n </Badge>\n ) : null}\n </Button>\n <EntityKnowledgeDialog\n api={api}\n entityLabel={getEntityLinkLabel(entitySchema)}\n entityName={entityName}\n open={isOpen}\n projectId={projectId}\n onOpenChange={setIsOpen}\n />\n </>\n );\n}\n\nfunction EntityKnowledgeDialog({\n api,\n entityLabel,\n entityName,\n onOpenChange,\n open,\n projectId,\n}: {\n api: KnowledgeApi;\n entityLabel: string;\n entityName: string;\n onOpenChange: (_open: boolean) => void;\n open: boolean;\n projectId: string;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const [detachingId, setDetachingId] = useState<string | null>(null);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeEntitySources>(\n knowledgePaths(projectId).entitySources(entityName),\n fetcher\n );\n const sources = data?.sources ?? [];\n const target = useMemo<KnowledgeLinkTarget>(() => ({ entity: entityName }), [entityName]);\n\n async function detach(source: KnowledgeSource): Promise<void> {\n setDetachingId(source.id);\n\n try {\n await api.unlinkSource(source.id, target);\n toast.success(`\"${source.title}\" no longer applies to every ${entityLabel}.`);\n await mutate({ sources: sources.filter((entry) => entry.id !== source.id) }, { revalidate: false });\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingId(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:text-sm fk:text-destructive\">The documents could not be loaded.</p>;\n } else if (isLoading && !data) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-9 fk:w-full\" />\n <Skeleton className=\"fk:h-9 fk:w-2/3\" />\n </div>\n );\n } else if (sources.length === 0) {\n body = (\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n No documents apply to every {entityLabel} yet. Attach a guide, a policy or a spec that holds for all of them and\n the agent searches it first when asked about any {entityLabel}, or about {entityLabel} in general.\n </p>\n );\n } else {\n body = (\n <SourceRows\n projectId={projectId}\n sources={sources}\n renderAction={(source) =>\n canMutate ? (\n <DetachButton\n disabled={detachingId !== null}\n label={`Detach ${source.title}`}\n onClick={() => void detach(source)}\n />\n ) : null\n }\n />\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"fk:sm:max-w-lg\" data-knowledge-entity-dialog>\n <DialogHeader>\n <DialogTitle className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenTextIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n Knowledge for every {entityLabel}\n {data ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {sources.length}\n </Badge>\n ) : null}\n </DialogTitle>\n <DialogDescription>\n Documents attached here apply to every {entityLabel}; each record can hold its own on top.\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:max-h-80 fk:overflow-y-auto\">{body}</div>\n <div className=\"fk:flex fk:justify-end\">\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" variant=\"outline\" onClick={() => setIsPickerOpen(true)}>\n <PaperclipIcon />\n Attach document\n </Button>\n </PermissionTooltip>\n </div>\n <AttachDocumentDialog\n api={api}\n attachedIds={sources.map((source) => source.id)}\n open={isPickerOpen}\n projectId={projectId}\n target={target}\n targetLabel={entityLabel}\n onAttached={(source) => {\n // \"Already attached\" (a stale picker in another tab) must not list the document twice.\n void mutate(\n { sources: sources.some((entry) => entry.id === source.id) ? sources : [...sources, source] },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n }}\n onOpenChange={setIsPickerOpen}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\n/**\n * The documents attached to one record, pinned under the record form in the\n * Desk as a collapsible panel: open them, attach another, detach one. The\n * agent searches these before the rest of Knowledge when a question is about this record.\n */\nexport function RecordKnowledgePanel({\n entityName,\n recordId,\n recordLabel,\n}: {\n entityName: string;\n recordId: string;\n recordLabel: string;\n}): JSX.Element | null {\n const { api, projectId } = useProjectKnowledge();\n const { currentProject } = useConfig();\n const canMutate = useCanMutate();\n const [isOpen, setIsOpen] = useState(false);\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const [detachingId, setDetachingId] = useState<string | null>(null);\n const record = useMemo<KnowledgeRecordRef>(() => ({ entity: entityName, recordId }), [entityName, recordId]);\n const entitySchema = findEntityByName(currentProject?.schema ?? [], entityName);\n const entityLabel = entitySchema ? getEntityLinkLabel(entitySchema) : entityName;\n // Built-in entities (assets, tags) are not something a document is about, so they are not even asked.\n const isLinkable = isKnowledgeLinkableEntity(entityName);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeRecordSources>(\n projectId && isLinkable ? knowledgePaths(projectId).recordSources(record) : null,\n fetcher\n );\n\n if (!api || !projectId || !isLinkable) {\n return null;\n }\n\n // The platform answers 404 for an entity it does not know, which can\n // happen while a schema change is still deploying; the panel then stays out of the way.\n if (error instanceof FetcherError && error.status === 404) {\n return null;\n }\n\n const sources = data?.sources ?? [];\n const inherited = data?.inherited ?? [];\n const attachedIds = sources.map((source) => source.id);\n const knowledgeApi = api;\n\n async function detach(source: KnowledgeSource): Promise<void> {\n setDetachingId(source.id);\n\n try {\n await knowledgeApi.unlinkSource(source.id, record);\n toast.success(`Detached \"${source.title}\".`);\n // The global invalidation below revalidates this key too; one refetch is enough.\n await mutate({ sources: sources.filter((entry) => entry.id !== source.id), inherited }, { revalidate: false });\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingId(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:text-sm fk:text-destructive\">The attached documents could not be loaded.</p>;\n } else if (isLoading && !data) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-9 fk:w-full\" />\n <Skeleton className=\"fk:h-9 fk:w-2/3\" />\n </div>\n );\n } else {\n body = (\n <div className=\"fk:flex fk:flex-col fk:gap-4\">\n {sources.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n {inherited.length > 0\n ? 'No documents attached to this record itself; the ones below apply to every record of its type.'\n : \"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record.\"}\n </p>\n ) : (\n <SourceRows\n projectId={projectId}\n sources={sources}\n renderAction={(source) =>\n canMutate ? (\n <DetachButton\n disabled={detachingId !== null}\n label={`Detach ${source.title}`}\n onClick={() => void detach(source)}\n />\n ) : null\n }\n />\n )}\n {inherited.length > 0 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-1\" data-knowledge-inherited>\n <span className=\"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground\">\n Applies to every {entityLabel}\n </span>\n <SourceRows projectId={projectId} sources={inherited} />\n </div>\n ) : null}\n </div>\n );\n }\n\n // The record drawer is mounted by the actions manager outside any app, so\n // it carries no tooltip provider of its own. The panel is a flex child of\n // the drawer: collapsed it is one row, open it claims half the height and\n // scrolls inside, so the form above stays visible and scrollable.\n return (\n <TooltipProvider>\n <Collapsible\n className={`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${isOpen ? 'fk:h-1/2' : ''}`}\n data-knowledge-record-panel\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2\">\n <CollapsibleTrigger asChild>\n <button\n className=\"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring\"\n type=\"button\"\n >\n <ChevronRightIcon\n className={`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${isOpen ? 'fk:rotate-90' : ''}`}\n />\n <BookOpenTextIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n Knowledge\n {data ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {sources.length + inherited.length}\n </Badge>\n ) : null}\n </button>\n </CollapsibleTrigger>\n {isOpen ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" variant=\"outline\" onClick={() => setIsPickerOpen(true)}>\n <PaperclipIcon />\n Attach document\n </Button>\n </PermissionTooltip>\n ) : null}\n </div>\n <CollapsibleContent className=\"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6\">\n {body}\n </CollapsibleContent>\n <AttachDocumentDialog\n api={api}\n attachedIds={attachedIds}\n open={isPickerOpen}\n projectId={projectId}\n target={record}\n targetLabel={recordLabel || `this ${entityName}`}\n onAttached={(source) => {\n // A document that applied to the whole type now hangs on the record itself; one that\n // was already attached (a stale picker in another tab) is not listed twice.\n void mutate(\n {\n sources: sources.some((entry) => entry.id === source.id) ? sources : [...sources, source],\n inherited: inherited.filter((entry) => entry.id !== source.id),\n },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n }}\n onOpenChange={setIsPickerOpen}\n />\n </Collapsible>\n </TooltipProvider>\n );\n}\n\ntype RecordLabels = { [recordId: string]: string };\n\n/**\n * Resolves the labels of one entity's linked records with a single display\n * query. The platform only names records whose display attribute it can read\n * from the node; a space-scoped one lives on other nodes, so the Studio asks\n * the data itself, the way the Desk grid does. Only called for a deployed entity.\n */\nfunction useRecordLabels(group: KnowledgeLinkGroup, schema: Entity[], displayAttribute: Attribute): RecordLabels {\n const { scope } = useAppContext();\n const ids = group.links.map((link) => link.recordId);\n const { data } = useEntityQuery({\n entityNamePlural: group.entityPlural,\n schema,\n scope,\n selection: 'display',\n includeCount: false,\n variables: { where: { _id: { in: ids } }, limit: ids.length },\n });\n\n return useMemo(() => {\n const labels: RecordLabels = {};\n\n for (const item of (data ?? []) as MappedEntityItem[]) {\n const value = item[displayAttribute.name];\n\n if (typeof value === 'string' && value.trim()) {\n labels[item._id] = value;\n }\n }\n\n return labels;\n }, [data, displayAttribute]);\n}\n\ninterface LinkedRecordGroupProps {\n canMutate: boolean;\n detachingKey: string | null;\n group: KnowledgeLinkGroup;\n onDetach: (_link: KnowledgeLink) => void;\n}\n\nfunction LinkedRecordGroup(props: LinkedRecordGroupProps): JSX.Element {\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const entitySchema = getEntitySchema(schema, props.group.entityPlural);\n const displayAttribute = getDisplayAttribute(entitySchema);\n\n // The query builder throws for an entity it does not know or that has no\n // attributes yet, which can happen between a deploy and the next schema\n // load; such a group shows what the platform knew.\n if (!entitySchema || !displayAttribute) {\n return (\n <LinkedRecordRows\n {...props}\n entityLabel={entitySchema ? getEntityLinkLabel(entitySchema) : props.group.entityPlural}\n labels={{}}\n />\n );\n }\n\n return (\n <ResolvedLinkedRecordGroup\n {...props}\n displayAttribute={displayAttribute}\n schema={schema}\n entityLabel={getEntityLinkLabel(entitySchema)}\n />\n );\n}\n\nfunction ResolvedLinkedRecordGroup({\n displayAttribute,\n entityLabel,\n schema,\n ...props\n}: LinkedRecordGroupProps & { displayAttribute: Attribute; entityLabel: string; schema: Entity[] }): JSX.Element {\n const labels = useRecordLabels(props.group, schema, displayAttribute);\n\n return <LinkedRecordRows {...props} entityLabel={entityLabel} labels={labels} />;\n}\n\nfunction LinkedRecordRows({\n canMutate,\n detachingKey,\n entityLabel,\n group,\n labels,\n onDetach,\n}: LinkedRecordGroupProps & { entityLabel: string; labels: RecordLabels }): JSX.Element {\n const dispatch = useDispatch();\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-1\">\n <span className=\"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground\">\n {entityLabel}\n </span>\n <ul className=\"fk:flex fk:flex-col fk:-mx-2\">\n {group.links.map((link) => {\n const label = getKnowledgeLinkLabel(link, labels[link.recordId]);\n const key = `${link.entity}:${link.recordId}`;\n\n return (\n <li\n className=\"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle\"\n key={key}\n >\n <button\n className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2\"\n title={link.recordId}\n type=\"button\"\n onClick={() =>\n dispatch({\n type: 'EditEntity',\n payload: { entityId: link.recordId, entityNamePlural: group.entityPlural },\n })\n }\n >\n {label}\n </button>\n {canMutate ? (\n <DetachButton\n disabled={detachingKey !== null}\n label={`Detach from ${label}`}\n onClick={() => onDetach(link)}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/**\n * The records a document is attached to, on the document page. Attaching\n * happens from the record's side in the Desk, where the record is in view.\n */\nexport function LinkedRecordsSection({\n api,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [detachingKey, setDetachingKey] = useState<string | null>(null);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeLinksList>(\n knowledgePaths(projectId).links(source.id),\n fetcher\n );\n const links = useMemo(() => data?.links ?? [], [data]);\n const entities = useMemo(() => data?.entities ?? [], [data]);\n const groups = useMemo(() => groupKnowledgeLinks(links), [links]);\n\n async function detach(link: KnowledgeLink): Promise<void> {\n setDetachingKey(`${link.entity}:${link.recordId}`);\n\n try {\n await api.unlinkSource(source.id, { entity: link.entity, recordId: link.recordId });\n toast.success('Detached.');\n await mutate(\n {\n links: links.filter((entry) => entry.entity !== link.entity || entry.recordId !== link.recordId),\n entities,\n },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingKey(null);\n }\n }\n\n async function detachEntity(link: KnowledgeEntityLink): Promise<void> {\n setDetachingKey(`${link.entity}:*`);\n\n try {\n await api.unlinkSource(source.id, { entity: link.entity });\n toast.success('Detached.');\n await mutate(\n { links, entities: entities.filter((entry) => entry.entity !== link.entity) },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingKey(null);\n }\n }\n\n async function attachEntity(entity: Entity): Promise<void> {\n setDetachingKey(`${entity.name}:+`);\n\n try {\n const result = await api.linkSource(source.id, { entity: entity.name });\n\n toast.success(\n result.linked\n ? `Applies to every ${getEntityLinkLabel(entity)} now.`\n : `Already applied to every ${getEntityLinkLabel(entity)}.`\n );\n await mutate(\n {\n links,\n entities: entities.some((entry) => entry.entity === entity.name)\n ? entities\n : [...entities, { entity: entity.name, entityPlural: entity.plural }],\n },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n } catch (attachError) {\n toast.error(describeApiError(attachError, 'The document could not be attached.'));\n } finally {\n setDetachingKey(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:text-sm fk:text-destructive\">The linked records could not be loaded.</p>;\n } else if (isLoading && !data) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-6 fk:w-1/2\" />\n <Skeleton className=\"fk:h-6 fk:w-1/3\" />\n </div>\n );\n } else if (groups.length === 0) {\n body = (\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n Not attached to any record. Open a record in the Desk and use \"Attach document\" so the agent searches this\n document before the rest of Knowledge when asked about that record.\n </p>\n );\n } else {\n body = (\n <div className=\"fk:flex fk:flex-col fk:gap-4\">\n {groups.map((group) => (\n <LinkedRecordGroup\n canMutate={canMutate}\n detachingKey={detachingKey}\n group={group}\n key={group.entityPlural}\n onDetach={(link) => void detach(link)}\n />\n ))}\n </div>\n );\n }\n\n return (\n <>\n <AppliesToEntities\n busy={detachingKey !== null}\n canMutate={canMutate}\n entities={entities}\n isLoading={isLoading && !data}\n onAttach={(entity) => void attachEntity(entity)}\n onDetach={(link) => void detachEntity(link)}\n />\n <div className=\"fk:mt-2 fk:flex fk:items-center fk:gap-2\">\n <PaperclipIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">Linked records</h3>\n {links.length > 0 ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {links.length}\n </Badge>\n ) : null}\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n When a question is about one of these records, the agent searches this document before the rest.\n </p>\n {body}\n </>\n );\n}\n\n/**\n * The entity types a document applies to, on the document page: chips for\n * the current ones, and a picker over the project's remaining entities. A\n * document attached to a type is searched first for any record of it.\n */\nfunction AppliesToEntities({\n busy,\n canMutate,\n entities,\n isLoading,\n onAttach,\n onDetach,\n}: {\n /** An attach or detach is in flight: no second one until it answers. */\n busy: boolean;\n canMutate: boolean;\n entities: KnowledgeEntityLink[];\n isLoading: boolean;\n onAttach: (_entity: Entity) => void;\n onDetach: (_link: KnowledgeEntityLink) => void;\n}): JSX.Element {\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const candidates = useMemo(() => getLinkableEntities(schema, entities), [entities, schema]);\n const labelOf = (link: KnowledgeEntityLink): string => {\n const entity = findEntityByName(schema, link.entity);\n\n return entity ? getEntityLinkLabel(entity) : link.entityPlural;\n };\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\" data-knowledge-applies-to>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <LayersIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">Applies to</h3>\n {entities.length > 0 ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {entities.length}\n </Badge>\n ) : null}\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every\n record of that type, and for questions about the type in general.\n </p>\n {isLoading ? (\n <Skeleton className=\"fk:h-7 fk:w-1/3\" />\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n {entities.map((link) => {\n const label = labelOf(link);\n\n return (\n <Badge\n className=\"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle\"\n key={link.entity}\n variant=\"secondary\"\n >\n <span className=\"fk:capitalize\">{label}</span>\n {canMutate ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label={`No longer apply to every ${label}`}\n className=\"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50\"\n disabled={busy}\n type=\"button\"\n onClick={() => onDetach(link)}\n >\n <XIcon className=\"fk:size-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>No longer apply to every {label}</TooltipContent>\n </Tooltip>\n ) : null}\n </Badge>\n );\n })}\n <Popover open={isPickerOpen} onOpenChange={setIsPickerOpen}>\n <PermissionTooltip disabled={!canMutate}>\n <PopoverTrigger asChild>\n <Button className=\"fk:h-7\" disabled={!canMutate || candidates.length === 0} size=\"sm\" variant=\"outline\">\n <PlusIcon />\n Add entity type\n </Button>\n </PopoverTrigger>\n </PermissionTooltip>\n <PopoverContent align=\"start\" className=\"fk:w-64 fk:p-0\">\n <Command>\n <CommandInput placeholder=\"Search entity types\" />\n <CommandList>\n <CommandEmpty>No entity type matches.</CommandEmpty>\n <CommandGroup>\n {candidates.map((entity) => (\n <CommandItem\n key={entity.name}\n keywords={[getEntityLinkLabel(entity), entity.name, entity.plural]}\n value={entity.name}\n onSelect={() => {\n setIsPickerOpen(false);\n onAttach(entity);\n }}\n >\n <span className=\"fk:capitalize\">{getEntityLinkLabel(entity)}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/record-links.tsx"],"names":["PICKER_PAGE_SIZE","DetachButton","disabled","label","onClick","jsxs","Tooltip","jsx","TooltipTrigger","Button","Unlink2Icon","TooltipContent","AttachDocumentDialog","api","attachedIds","onAttached","onOpenChange","open","projectId","target","targetLabel","search","setSearch","useState","deferredSearch","useDeferredValue","attachingId","setAttachingId","getPageKey","pageIndex","previousPage","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","candidates","useMemo","getAttachableSources","page","hasMore","isLoadingMore","attach","source","result","toast","attachError","describeApiError","body","Skeleton","status","summarizeKnowledgeStatus","isAttaching","SourceIcon","getKnowledgeKindLabel","LoaderCircle","StatusBadge","InfiniteScrollSentinel","current","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","SearchIcon","Input","event","SourceRows","renderAction","sources","Link","getKnowledgeSourcePath","EntityKnowledgeButton","entityName","useProjectKnowledge","currentProject","useConfig","isOpen","setIsOpen","entitySchema","findEntityByName","isLinkable","isKnowledgeLinkableEntity","data","useSWR","FetcherError","count","Fragment","getEntityLinkLabel","BookOpenTextIcon","Badge","EntityKnowledgeDialog","entityLabel","canMutate","useCanMutate","isPickerOpen","setIsPickerOpen","detachingId","setDetachingId","mutate","detach","entry","invalidateKnowledgeLinks","detachError","PermissionTooltip","PaperclipIcon","RecordKnowledgePanel","recordId","recordLabel","record","inherited","knowledgeApi","TooltipProvider","Collapsible","CollapsibleTrigger","ChevronRightIcon","CollapsibleContent","useRecordLabels","group","schema","displayAttribute","scope","useAppContext","ids","link","useEntityQuery","labels","item","value","LinkedRecordGroup","props","getEntitySchema","getDisplayAttribute","LinkedRecordRows","ResolvedLinkedRecordGroup","detachingKey","onDetach","dispatch","useDispatch","getKnowledgeLinkLabel","key","LinkedRecordsSection","setDetachingKey","links","entities","groups","groupKnowledgeLinks","detachEntity","attachEntity","entity","AppliesToEntities","busy","onAttach","getLinkableEntities","labelOf","LayersIcon","XIcon","Popover","PopoverTrigger","PlusIcon","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem"],"mappings":"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","file":"chunk-WYVXSLB7.js","sourcesContent":["import type { JSX } from 'react';\nimport { useDeferredValue, useMemo, useState } from 'react';\nimport {\n BookOpenTextIcon,\n ChevronRightIcon,\n LayersIcon,\n LoaderCircle,\n PaperclipIcon,\n PlusIcon,\n SearchIcon,\n Unlink2Icon,\n XIcon,\n} from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { getDisplayAttribute } from '../../core/get-display-attribute';\nimport type { Attribute, Entity } from '../../core/types';\nimport { useCanMutate } from '../../core/permissions';\nimport { useDispatch } from '../../entities/actions-context';\nimport { getEntitySchema } from '../../graphql-client/queries';\nimport type { MappedEntityItem } from '../../graphql-client/types';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n Badge,\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n PermissionTooltip,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Skeleton,\n toast,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, FetcherError, knowledgePaths, type KnowledgeApi } from './api';\nimport {\n findEntityByName,\n getAttachableSources,\n getEntityLinkLabel,\n getKnowledgeKindLabel,\n getKnowledgeLinkLabel,\n getKnowledgeSourcePath,\n getLinkableEntities,\n groupKnowledgeLinks,\n isKnowledgeLinkableEntity,\n summarizeKnowledgeStatus,\n type KnowledgeEntityLink,\n type KnowledgeEntitySources,\n type KnowledgeLink,\n type KnowledgeLinkGroup,\n type KnowledgeLinksList,\n type KnowledgeLinkTarget,\n type KnowledgeRecordRef,\n type KnowledgeRecordSources,\n type KnowledgeSource,\n type KnowledgeSourcesList,\n} from './knowledge';\nimport {\n describeApiError,\n InfiniteScrollSentinel,\n invalidateKnowledgeLinks,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst PICKER_PAGE_SIZE = 50;\n\nfunction DetachButton({\n disabled,\n label,\n onClick,\n}: {\n disabled: boolean;\n label: string;\n onClick: () => void;\n}): JSX.Element {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n className=\"fk:size-7 fk:shrink-0\"\n disabled={disabled}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onClick}\n >\n <Unlink2Icon className=\"fk:size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n/**\n * The picker behind \"Attach document\": the project's documents, searched by\n * title, minus the ones already attached. Picking one links it right away.\n */\nfunction AttachDocumentDialog({\n api,\n attachedIds,\n onAttached,\n onOpenChange,\n open,\n projectId,\n target,\n targetLabel,\n}: {\n api: KnowledgeApi;\n attachedIds: string[];\n onAttached: (_source: KnowledgeSource) => void;\n onOpenChange: (_open: boolean) => void;\n open: boolean;\n projectId: string;\n /** A record, or an entity type when it names no record. */\n target: KnowledgeLinkTarget;\n /** How the target is called in the dialog copy: a record title, or an entity label. */\n targetLabel: string;\n}): JSX.Element {\n const [search, setSearch] = useState('');\n const deferredSearch = useDeferredValue(search.trim());\n const [attachingId, setAttachingId] = useState<string | null>(null);\n const getPageKey = (pageIndex: number, previousPage: KnowledgeSourcesList | null): string | null => {\n if (!open || (previousPage && !previousPage.hasMore)) {\n return null;\n }\n\n return knowledgePaths(projectId).sources({\n limit: PICKER_PAGE_SIZE,\n offset: pageIndex * PICKER_PAGE_SIZE,\n search: deferredSearch || undefined,\n });\n };\n // Paged like the document list: the attached ones are hidden client-side,\n // so a record with many documents attached must be able to reach the next page.\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgeSourcesList>(getPageKey, fetcher, { keepPreviousData: true });\n const candidates = useMemo(\n () => getAttachableSources(pages?.flatMap((page) => page.sources) ?? [], attachedIds),\n [attachedIds, pages]\n );\n const hasMore = pages?.[pages.length - 1]?.hasMore ?? false;\n const isLoadingMore = pages !== undefined && size > pages.length;\n\n async function attach(source: KnowledgeSource): Promise<void> {\n setAttachingId(source.id);\n\n try {\n const result = await api.linkSource(source.id, target);\n\n toast.success(result.linked ? `Attached \"${source.title}\".` : `\"${source.title}\" was already attached.`);\n onAttached(source);\n onOpenChange(false);\n } catch (attachError) {\n toast.error(describeApiError(attachError, 'The document could not be attached.'));\n } finally {\n setAttachingId(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:py-6 fk:text-center fk:text-sm fk:text-destructive\">The documents could not be loaded.</p>;\n } else if (isLoading && !pages) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-3 fk:py-2\">\n <Skeleton className=\"fk:h-10 fk:w-full\" />\n <Skeleton className=\"fk:h-10 fk:w-full\" />\n <Skeleton className=\"fk:h-10 fk:w-full\" />\n </div>\n );\n } else if (candidates.length === 0 && !hasMore) {\n body = (\n <p className=\"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {deferredSearch\n ? 'No documents match your search.'\n : 'Every document is attached already, or there are none yet. Add documents in Knowledge first.'}\n </p>\n );\n } else {\n body = (\n <ul className=\"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2\">\n {candidates.map((source) => {\n const status = summarizeKnowledgeStatus(source);\n const isAttaching = attachingId === source.id;\n\n return (\n <li key={source.id}>\n <button\n className=\"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle\"\n disabled={attachingId !== null}\n type=\"button\"\n onClick={() => void attach(source)}\n >\n <SourceIcon source={source} />\n <span className=\"fk:min-w-0 fk:flex-1\">\n <span className=\"fk:block fk:truncate fk:text-sm fk:font-medium\">{source.title}</span>\n <span className=\"fk:block fk:truncate fk:text-xs fk:text-muted-foreground\">\n {getKnowledgeKindLabel(source)} · {status.detail}\n </span>\n </span>\n {isAttaching ? (\n <LoaderCircle className=\"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground\" />\n ) : (\n <StatusBadge label={status.label} tone={status.tone} />\n )}\n </button>\n </li>\n );\n })}\n {hasMore && !isLoadingMore ? (\n <li aria-hidden>\n <InfiniteScrollSentinel onVisible={() => void setSize((current) => current + 1)} />\n </li>\n ) : null}\n {isLoadingMore ? (\n <li className=\"fk:flex fk:justify-center fk:py-2\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin fk:text-muted-foreground\" />\n </li>\n ) : null}\n </ul>\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"fk:sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Attach a document</DialogTitle>\n <DialogDescription>\n {target.recordId === undefined\n ? `Documents attached to every ${targetLabel} are searched before the rest of Knowledge when a question is about one of them, or about ${targetLabel} in general.`\n : `Documents attached to ${targetLabel} are searched before the rest of Knowledge when a question is about it.`}\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative\">\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 autoFocus\n className=\"fk:pl-8\"\n placeholder=\"Search documents by title\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n {body}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Document rows shared by the record panel and the entity dialog: icon, title, kind and status, plus an optional action. */\nfunction SourceRows({\n projectId,\n renderAction,\n sources,\n}: {\n projectId: string;\n renderAction?: (_source: KnowledgeSource) => JSX.Element | null;\n sources: KnowledgeSource[];\n}): JSX.Element {\n return (\n <ul className=\"fk:flex fk:flex-col fk:gap-1 fk:-mx-2\">\n {sources.map((source) => {\n const status = summarizeKnowledgeStatus(source);\n\n return (\n <li\n className=\"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle\"\n key={source.id}\n >\n <Link\n className=\"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2\"\n to={getKnowledgeSourcePath(projectId, source.id)}\n >\n <SourceIcon source={source} />\n <span className=\"fk:min-w-0 fk:flex-1\">\n <span className=\"fk:block fk:truncate fk:text-sm fk:font-medium\">{source.title}</span>\n <span className=\"fk:block fk:truncate fk:text-xs fk:text-muted-foreground\">\n {getKnowledgeKindLabel(source)} · {status.detail}\n </span>\n </span>\n </Link>\n <StatusBadge label={status.label} tone={status.tone} />\n {renderAction?.(source)}\n </li>\n );\n })}\n </ul>\n );\n}\n\n/**\n * The documents attached to every record of an entity type, behind a button\n * in the Desk list toolbar: open them, attach another, detach one. Only the\n * project's own entities qualify, and the button stays out while the schema\n * is unknown.\n */\nexport function EntityKnowledgeButton({ entityName }: { entityName: string }): JSX.Element | null {\n const { api, projectId } = useProjectKnowledge();\n const { currentProject } = useConfig();\n const [isOpen, setIsOpen] = useState(false);\n const entitySchema = findEntityByName(currentProject?.schema ?? [], entityName);\n const isLinkable = Boolean(entitySchema) && isKnowledgeLinkableEntity(entityName);\n const { data, error } = useSWR<KnowledgeEntitySources>(\n projectId && isLinkable ? knowledgePaths(projectId).entitySources(entityName) : null,\n fetcher\n );\n\n if (!api || !projectId || !entitySchema || !isLinkable || (error instanceof FetcherError && error.status === 404)) {\n return null;\n }\n\n const count = data?.sources.length ?? 0;\n\n return (\n <>\n <Button\n aria-label={`Knowledge for every ${getEntityLinkLabel(entitySchema)}`}\n className=\"fk:mr-2 fk:h-8\"\n data-knowledge-entity-button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setIsOpen(true)}\n >\n <BookOpenTextIcon />\n Knowledge\n {count > 0 ? (\n <Badge className=\"fk:corner-squircle\" variant=\"secondary\">\n {count}\n </Badge>\n ) : null}\n </Button>\n <EntityKnowledgeDialog\n api={api}\n entityLabel={getEntityLinkLabel(entitySchema)}\n entityName={entityName}\n open={isOpen}\n projectId={projectId}\n onOpenChange={setIsOpen}\n />\n </>\n );\n}\n\nfunction EntityKnowledgeDialog({\n api,\n entityLabel,\n entityName,\n onOpenChange,\n open,\n projectId,\n}: {\n api: KnowledgeApi;\n entityLabel: string;\n entityName: string;\n onOpenChange: (_open: boolean) => void;\n open: boolean;\n projectId: string;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const [detachingId, setDetachingId] = useState<string | null>(null);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeEntitySources>(\n knowledgePaths(projectId).entitySources(entityName),\n fetcher\n );\n const sources = data?.sources ?? [];\n const target = useMemo<KnowledgeLinkTarget>(() => ({ entity: entityName }), [entityName]);\n\n async function detach(source: KnowledgeSource): Promise<void> {\n setDetachingId(source.id);\n\n try {\n await api.unlinkSource(source.id, target);\n toast.success(`\"${source.title}\" no longer applies to every ${entityLabel}.`);\n await mutate({ sources: sources.filter((entry) => entry.id !== source.id) }, { revalidate: false });\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingId(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:text-sm fk:text-destructive\">The documents could not be loaded.</p>;\n } else if (isLoading && !data) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-9 fk:w-full\" />\n <Skeleton className=\"fk:h-9 fk:w-2/3\" />\n </div>\n );\n } else if (sources.length === 0) {\n body = (\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n No documents apply to every {entityLabel} yet. Attach a guide, a policy or a spec that holds for all of them and\n the agent searches it first when asked about any {entityLabel}, or about {entityLabel} in general.\n </p>\n );\n } else {\n body = (\n <SourceRows\n projectId={projectId}\n sources={sources}\n renderAction={(source) =>\n canMutate ? (\n <DetachButton\n disabled={detachingId !== null}\n label={`Detach ${source.title}`}\n onClick={() => void detach(source)}\n />\n ) : null\n }\n />\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"fk:sm:max-w-lg\" data-knowledge-entity-dialog>\n <DialogHeader>\n <DialogTitle className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenTextIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n Knowledge for every {entityLabel}\n {data ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {sources.length}\n </Badge>\n ) : null}\n </DialogTitle>\n <DialogDescription>\n Documents attached here apply to every {entityLabel}; each record can hold its own on top.\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:max-h-80 fk:overflow-y-auto\">{body}</div>\n <div className=\"fk:flex fk:justify-end\">\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" variant=\"outline\" onClick={() => setIsPickerOpen(true)}>\n <PaperclipIcon />\n Attach document\n </Button>\n </PermissionTooltip>\n </div>\n <AttachDocumentDialog\n api={api}\n attachedIds={sources.map((source) => source.id)}\n open={isPickerOpen}\n projectId={projectId}\n target={target}\n targetLabel={entityLabel}\n onAttached={(source) => {\n // \"Already attached\" (a stale picker in another tab) must not list the document twice.\n void mutate(\n { sources: sources.some((entry) => entry.id === source.id) ? sources : [...sources, source] },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n }}\n onOpenChange={setIsPickerOpen}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\n/**\n * The documents attached to one record, pinned under the record form in the\n * Desk as a collapsible panel: open them, attach another, detach one. The\n * agent searches these before the rest of Knowledge when a question is about this record.\n */\nexport function RecordKnowledgePanel({\n entityName,\n recordId,\n recordLabel,\n}: {\n entityName: string;\n recordId: string;\n recordLabel: string;\n}): JSX.Element | null {\n const { api, projectId } = useProjectKnowledge();\n const { currentProject } = useConfig();\n const canMutate = useCanMutate();\n const [isOpen, setIsOpen] = useState(false);\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const [detachingId, setDetachingId] = useState<string | null>(null);\n const record = useMemo<KnowledgeRecordRef>(() => ({ entity: entityName, recordId }), [entityName, recordId]);\n const entitySchema = findEntityByName(currentProject?.schema ?? [], entityName);\n const entityLabel = entitySchema ? getEntityLinkLabel(entitySchema) : entityName;\n // Built-in entities (assets, tags) are not something a document is about, so they are not even asked.\n const isLinkable = isKnowledgeLinkableEntity(entityName);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeRecordSources>(\n projectId && isLinkable ? knowledgePaths(projectId).recordSources(record) : null,\n fetcher\n );\n\n if (!api || !projectId || !isLinkable) {\n return null;\n }\n\n // The platform answers 404 for an entity it does not know, which can\n // happen while a schema change is still deploying; the panel then stays out of the way.\n if (error instanceof FetcherError && error.status === 404) {\n return null;\n }\n\n const sources = data?.sources ?? [];\n const inherited = data?.inherited ?? [];\n const attachedIds = sources.map((source) => source.id);\n const knowledgeApi = api;\n\n async function detach(source: KnowledgeSource): Promise<void> {\n setDetachingId(source.id);\n\n try {\n await knowledgeApi.unlinkSource(source.id, record);\n toast.success(`Detached \"${source.title}\".`);\n // The global invalidation below revalidates this key too; one refetch is enough.\n await mutate({ sources: sources.filter((entry) => entry.id !== source.id), inherited }, { revalidate: false });\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingId(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:text-sm fk:text-destructive\">The attached documents could not be loaded.</p>;\n } else if (isLoading && !data) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-9 fk:w-full\" />\n <Skeleton className=\"fk:h-9 fk:w-2/3\" />\n </div>\n );\n } else {\n body = (\n <div className=\"fk:flex fk:flex-col fk:gap-4\">\n {sources.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n {inherited.length > 0\n ? 'No documents attached to this record itself; the ones below apply to every record of its type.'\n : \"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record.\"}\n </p>\n ) : (\n <SourceRows\n projectId={projectId}\n sources={sources}\n renderAction={(source) =>\n canMutate ? (\n <DetachButton\n disabled={detachingId !== null}\n label={`Detach ${source.title}`}\n onClick={() => void detach(source)}\n />\n ) : null\n }\n />\n )}\n {inherited.length > 0 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-1\" data-knowledge-inherited>\n <span className=\"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground\">\n Applies to every {entityLabel}\n </span>\n <SourceRows projectId={projectId} sources={inherited} />\n </div>\n ) : null}\n </div>\n );\n }\n\n // The record drawer is mounted by the actions manager outside any app, so\n // it carries no tooltip provider of its own. The panel is a flex child of\n // the drawer: collapsed it is one row, open it claims half the height and\n // scrolls inside, so the form above stays visible and scrollable.\n return (\n <TooltipProvider>\n <Collapsible\n className={`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${isOpen ? 'fk:h-1/2' : ''}`}\n data-knowledge-record-panel\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2\">\n <CollapsibleTrigger asChild>\n <button\n className=\"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring\"\n type=\"button\"\n >\n <ChevronRightIcon\n className={`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${isOpen ? 'fk:rotate-90' : ''}`}\n />\n <BookOpenTextIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n Knowledge\n {data ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {sources.length + inherited.length}\n </Badge>\n ) : null}\n </button>\n </CollapsibleTrigger>\n {isOpen ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={!canMutate} size=\"sm\" variant=\"outline\" onClick={() => setIsPickerOpen(true)}>\n <PaperclipIcon />\n Attach document\n </Button>\n </PermissionTooltip>\n ) : null}\n </div>\n <CollapsibleContent className=\"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6\">\n {body}\n </CollapsibleContent>\n <AttachDocumentDialog\n api={api}\n attachedIds={attachedIds}\n open={isPickerOpen}\n projectId={projectId}\n target={record}\n targetLabel={recordLabel || `this ${entityName}`}\n onAttached={(source) => {\n // A document that applied to the whole type now hangs on the record itself; one that\n // was already attached (a stale picker in another tab) is not listed twice.\n void mutate(\n {\n sources: sources.some((entry) => entry.id === source.id) ? sources : [...sources, source],\n inherited: inherited.filter((entry) => entry.id !== source.id),\n },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n }}\n onOpenChange={setIsPickerOpen}\n />\n </Collapsible>\n </TooltipProvider>\n );\n}\n\ntype RecordLabels = { [recordId: string]: string };\n\n/**\n * Resolves the labels of one entity's linked records with a single display\n * query. The platform only names records whose display attribute it can read\n * from the node; a space-scoped one lives on other nodes, so the Studio asks\n * the data itself, the way the Desk grid does. Only called for a deployed entity.\n */\nfunction useRecordLabels(group: KnowledgeLinkGroup, schema: Entity[], displayAttribute: Attribute): RecordLabels {\n const { scope } = useAppContext();\n const ids = group.links.map((link) => link.recordId);\n const { data } = useEntityQuery({\n entityNamePlural: group.entityPlural,\n schema,\n scope,\n selection: 'display',\n includeCount: false,\n variables: { where: { _id: { in: ids } }, limit: ids.length },\n });\n\n return useMemo(() => {\n const labels: RecordLabels = {};\n\n for (const item of (data ?? []) as MappedEntityItem[]) {\n const value = item[displayAttribute.name];\n\n if (typeof value === 'string' && value.trim()) {\n labels[item._id] = value;\n }\n }\n\n return labels;\n }, [data, displayAttribute]);\n}\n\ninterface LinkedRecordGroupProps {\n canMutate: boolean;\n detachingKey: string | null;\n group: KnowledgeLinkGroup;\n onDetach: (_link: KnowledgeLink) => void;\n}\n\nfunction LinkedRecordGroup(props: LinkedRecordGroupProps): JSX.Element {\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const entitySchema = getEntitySchema(schema, props.group.entityPlural);\n const displayAttribute = getDisplayAttribute(entitySchema);\n\n // The query builder throws for an entity it does not know or that has no\n // attributes yet, which can happen between a deploy and the next schema\n // load; such a group shows what the platform knew.\n if (!entitySchema || !displayAttribute) {\n return (\n <LinkedRecordRows\n {...props}\n entityLabel={entitySchema ? getEntityLinkLabel(entitySchema) : props.group.entityPlural}\n labels={{}}\n />\n );\n }\n\n return (\n <ResolvedLinkedRecordGroup\n {...props}\n displayAttribute={displayAttribute}\n schema={schema}\n entityLabel={getEntityLinkLabel(entitySchema)}\n />\n );\n}\n\nfunction ResolvedLinkedRecordGroup({\n displayAttribute,\n entityLabel,\n schema,\n ...props\n}: LinkedRecordGroupProps & { displayAttribute: Attribute; entityLabel: string; schema: Entity[] }): JSX.Element {\n const labels = useRecordLabels(props.group, schema, displayAttribute);\n\n return <LinkedRecordRows {...props} entityLabel={entityLabel} labels={labels} />;\n}\n\nfunction LinkedRecordRows({\n canMutate,\n detachingKey,\n entityLabel,\n group,\n labels,\n onDetach,\n}: LinkedRecordGroupProps & { entityLabel: string; labels: RecordLabels }): JSX.Element {\n const dispatch = useDispatch();\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-1\">\n <span className=\"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground\">\n {entityLabel}\n </span>\n <ul className=\"fk:flex fk:flex-col fk:-mx-2\">\n {group.links.map((link) => {\n const label = getKnowledgeLinkLabel(link, labels[link.recordId]);\n const key = `${link.entity}:${link.recordId}`;\n\n return (\n <li\n className=\"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle\"\n key={key}\n >\n <button\n className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2\"\n title={link.recordId}\n type=\"button\"\n onClick={() =>\n dispatch({\n type: 'EditEntity',\n payload: { entityId: link.recordId, entityNamePlural: group.entityPlural },\n })\n }\n >\n {label}\n </button>\n {canMutate ? (\n <DetachButton\n disabled={detachingKey !== null}\n label={`Detach from ${label}`}\n onClick={() => onDetach(link)}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/**\n * The records a document is attached to, on the document page. Attaching\n * happens from the record's side in the Desk, where the record is in view.\n */\nexport function LinkedRecordsSection({\n api,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [detachingKey, setDetachingKey] = useState<string | null>(null);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeLinksList>(\n knowledgePaths(projectId).links(source.id),\n fetcher\n );\n const links = useMemo(() => data?.links ?? [], [data]);\n const entities = useMemo(() => data?.entities ?? [], [data]);\n const groups = useMemo(() => groupKnowledgeLinks(links), [links]);\n\n async function detach(link: KnowledgeLink): Promise<void> {\n setDetachingKey(`${link.entity}:${link.recordId}`);\n\n try {\n await api.unlinkSource(source.id, { entity: link.entity, recordId: link.recordId });\n toast.success('Detached.');\n await mutate(\n {\n links: links.filter((entry) => entry.entity !== link.entity || entry.recordId !== link.recordId),\n entities,\n },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingKey(null);\n }\n }\n\n async function detachEntity(link: KnowledgeEntityLink): Promise<void> {\n setDetachingKey(`${link.entity}:*`);\n\n try {\n await api.unlinkSource(source.id, { entity: link.entity });\n toast.success('Detached.');\n await mutate(\n { links, entities: entities.filter((entry) => entry.entity !== link.entity) },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n } catch (detachError) {\n toast.error(describeApiError(detachError, 'The document could not be detached.'));\n } finally {\n setDetachingKey(null);\n }\n }\n\n async function attachEntity(entity: Entity): Promise<void> {\n setDetachingKey(`${entity.name}:+`);\n\n try {\n const result = await api.linkSource(source.id, { entity: entity.name });\n\n toast.success(\n result.linked\n ? `Applies to every ${getEntityLinkLabel(entity)} now.`\n : `Already applied to every ${getEntityLinkLabel(entity)}.`\n );\n await mutate(\n {\n links,\n entities: entities.some((entry) => entry.entity === entity.name)\n ? entities\n : [...entities, { entity: entity.name, entityPlural: entity.plural }],\n },\n { revalidate: false }\n );\n void invalidateKnowledgeLinks();\n } catch (attachError) {\n toast.error(describeApiError(attachError, 'The document could not be attached.'));\n } finally {\n setDetachingKey(null);\n }\n }\n\n let body: JSX.Element;\n\n if (error) {\n body = <p className=\"fk:text-sm fk:text-destructive\">The linked records could not be loaded.</p>;\n } else if (isLoading && !data) {\n body = (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-6 fk:w-1/2\" />\n <Skeleton className=\"fk:h-6 fk:w-1/3\" />\n </div>\n );\n } else if (groups.length === 0) {\n body = (\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n Not attached to any record. Open a record in the Desk and use \"Attach document\" so the agent searches this\n document before the rest of Knowledge when asked about that record.\n </p>\n );\n } else {\n body = (\n <div className=\"fk:flex fk:flex-col fk:gap-4\">\n {groups.map((group) => (\n <LinkedRecordGroup\n canMutate={canMutate}\n detachingKey={detachingKey}\n group={group}\n key={group.entityPlural}\n onDetach={(link) => void detach(link)}\n />\n ))}\n </div>\n );\n }\n\n return (\n <>\n <AppliesToEntities\n busy={detachingKey !== null}\n canMutate={canMutate}\n entities={entities}\n isLoading={isLoading && !data}\n onAttach={(entity) => void attachEntity(entity)}\n onDetach={(link) => void detachEntity(link)}\n />\n <div className=\"fk:mt-2 fk:flex fk:items-center fk:gap-2\">\n <PaperclipIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">Linked records</h3>\n {links.length > 0 ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {links.length}\n </Badge>\n ) : null}\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n When a question is about one of these records, the agent searches this document before the rest.\n </p>\n {body}\n </>\n );\n}\n\n/**\n * The entity types a document applies to, on the document page: chips for\n * the current ones, and a picker over the project's remaining entities. A\n * document attached to a type is searched first for any record of it.\n */\nfunction AppliesToEntities({\n busy,\n canMutate,\n entities,\n isLoading,\n onAttach,\n onDetach,\n}: {\n /** An attach or detach is in flight: no second one until it answers. */\n busy: boolean;\n canMutate: boolean;\n entities: KnowledgeEntityLink[];\n isLoading: boolean;\n onAttach: (_entity: Entity) => void;\n onDetach: (_link: KnowledgeEntityLink) => void;\n}): JSX.Element {\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const candidates = useMemo(() => getLinkableEntities(schema, entities), [entities, schema]);\n const labelOf = (link: KnowledgeEntityLink): string => {\n const entity = findEntityByName(schema, link.entity);\n\n return entity ? getEntityLinkLabel(entity) : link.entityPlural;\n };\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\" data-knowledge-applies-to>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <LayersIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">Applies to</h3>\n {entities.length > 0 ? (\n <Badge className=\"fk:corner-squircle\" variant=\"outline\">\n {entities.length}\n </Badge>\n ) : null}\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every\n record of that type, and for questions about the type in general.\n </p>\n {isLoading ? (\n <Skeleton className=\"fk:h-7 fk:w-1/3\" />\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n {entities.map((link) => {\n const label = labelOf(link);\n\n return (\n <Badge\n className=\"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle\"\n key={link.entity}\n variant=\"secondary\"\n >\n <span className=\"fk:capitalize\">{label}</span>\n {canMutate ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label={`No longer apply to every ${label}`}\n className=\"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50\"\n disabled={busy}\n type=\"button\"\n onClick={() => onDetach(link)}\n >\n <XIcon className=\"fk:size-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>No longer apply to every {label}</TooltipContent>\n </Tooltip>\n ) : null}\n </Badge>\n );\n })}\n <Popover open={isPickerOpen} onOpenChange={setIsPickerOpen}>\n <PermissionTooltip disabled={!canMutate}>\n <PopoverTrigger asChild>\n <Button className=\"fk:h-7\" disabled={!canMutate || candidates.length === 0} size=\"sm\" variant=\"outline\">\n <PlusIcon />\n Add entity type\n </Button>\n </PopoverTrigger>\n </PermissionTooltip>\n <PopoverContent align=\"start\" className=\"fk:w-64 fk:p-0\">\n <Command>\n <CommandInput placeholder=\"Search entity types\" />\n <CommandList>\n <CommandEmpty>No entity type matches.</CommandEmpty>\n <CommandGroup>\n {candidates.map((entity) => (\n <CommandItem\n key={entity.name}\n keywords={[getEntityLinkLabel(entity), entity.name, entity.plural]}\n value={entity.name}\n onSelect={() => {\n setIsPickerOpen(false);\n onAttach(entity);\n }}\n >\n <span className=\"fk:capitalize\">{getEntityLinkLabel(entity)}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {g,e,x}from'./chunk-6NRMVVU4.js';import'./chunk-DO32GATF.js';import {f}from'./chunk-CC2U7ASG.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import {b,c,e as e$1,a}from'./chunk-N33S7BSG.js';import {c as c$1}from'./chunk-X3SHNHHM.js';import {Waypoints}from'lucide-react';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';function S({entityName:n,selectedIds:t}){let{currentProjectId:i,currentProjectSchema:r}=f(),l=useNavigate(),e$2=g(r,n);if(!i||!e$2||e(e$2).length===0)return null;let a=t.length>0?`Open ${t.length} in Graph`:"Open in Graph";return jsxs(b,{children:[jsx(c,{asChild:true,children:jsxs(c$1,{"aria-label":a,className:"fk:mr-2 fk:h-8",onClick:()=>l(x(i,{entity:n,ids:t})),size:"sm",variant:"outline",children:[jsx(Waypoints,{className:"fk:size-4",strokeWidth:1.5}),t.length>0?`Graph (${t.length})`:"Graph"]})}),jsx(e$1,{children:t.length>0?"Show the selected records and their relationships":"Explore these records as a graph"})]})}function B({entityName:n,recordId:t,onNavigate:i}){let{currentProjectId:r,currentProjectSchema:l}=f(),e$2=useNavigate(),a$1=g(l,n);return !r||!a$1||!t||e(a$1).length===0?null:jsx(a,{children:jsxs(b,{children:[jsx(c,{asChild:true,children:jsx(c$1,{"aria-label":"View in Graph",className:"fk:h-9 fk:w-9",onClick:()=>{e$2(x(r,{entity:n,ids:[t]})),i?.();},size:"icon",variant:"outline",children:jsx(Waypoints,{className:"fk:size-4",strokeWidth:1.5})})}),jsx(e$1,{children:"View in Graph"})]})})}export{S as EntityGraphButton,B as RecordGraphButton};//# sourceMappingURL=entry-6EWYXIS5.js.map
2
- //# sourceMappingURL=entry-6EWYXIS5.js.map
1
+ import'./index.css';import {g,e,x}from'./chunk-JUWAKQPE.js';import'./chunk-GORBKX24.js';import {f}from'./chunk-INZZOKRC.js';import'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import'./chunk-RULCANNM.js';import'./chunk-A4DPLZZF.js';import'./chunk-G5N6HEPW.js';import'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import {b,c,e as e$1,a}from'./chunk-N33S7BSG.js';import {c as c$1}from'./chunk-X3SHNHHM.js';import {Waypoints}from'lucide-react';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';function S({entityName:n,selectedIds:t}){let{currentProjectId:i,currentProjectSchema:r}=f(),l=useNavigate(),e$2=g(r,n);if(!i||!e$2||e(e$2).length===0)return null;let a=t.length>0?`Open ${t.length} in Graph`:"Open in Graph";return jsxs(b,{children:[jsx(c,{asChild:true,children:jsxs(c$1,{"aria-label":a,className:"fk:mr-2 fk:h-8",onClick:()=>l(x(i,{entity:n,ids:t})),size:"sm",variant:"outline",children:[jsx(Waypoints,{className:"fk:size-4",strokeWidth:1.5}),t.length>0?`Graph (${t.length})`:"Graph"]})}),jsx(e$1,{children:t.length>0?"Show the selected records and their relationships":"Explore these records as a graph"})]})}function B({entityName:n,recordId:t,onNavigate:i}){let{currentProjectId:r,currentProjectSchema:l}=f(),e$2=useNavigate(),a$1=g(l,n);return !r||!a$1||!t||e(a$1).length===0?null:jsx(a,{children:jsxs(b,{children:[jsx(c,{asChild:true,children:jsx(c$1,{"aria-label":"View in Graph",className:"fk:h-9 fk:w-9",onClick:()=>{e$2(x(r,{entity:n,ids:[t]})),i?.();},size:"icon",variant:"outline",children:jsx(Waypoints,{className:"fk:size-4",strokeWidth:1.5})})}),jsx(e$1,{children:"View in Graph"})]})})}export{S as EntityGraphButton,B as RecordGraphButton};//# sourceMappingURL=entry-G2R3W5NU.js.map
2
+ //# sourceMappingURL=entry-G2R3W5NU.js.map