@flexkit/studio 0.2.32 → 0.2.33

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 (153) hide show
  1. package/dist/activity-nav-button-ZHQOZBCC.js +2 -0
  2. package/dist/{activity-nav-button-E4I4YC3X.js.map → activity-nav-button-ZHQOZBCC.js.map} +1 -1
  3. package/dist/astro.js +1 -1
  4. package/dist/chat-page-LR7XC2US.js +4 -0
  5. package/dist/{chat-page-7UB3BMBF.js.map → chat-page-LR7XC2US.js.map} +1 -1
  6. package/dist/chunk-2MVQXXY7.js +4 -0
  7. package/dist/{chunk-R2O4WC3H.js.map → chunk-2MVQXXY7.js.map} +1 -1
  8. package/dist/{chunk-ERCVR23U.js → chunk-36DLIVZF.js} +2 -2
  9. package/dist/{chunk-ERCVR23U.js.map → chunk-36DLIVZF.js.map} +1 -1
  10. package/dist/chunk-3SY46ERM.js +2 -0
  11. package/dist/chunk-3SY46ERM.js.map +1 -0
  12. package/dist/chunk-4ZWQ44NZ.js +2 -0
  13. package/dist/{chunk-2NXQF2F7.js.map → chunk-4ZWQ44NZ.js.map} +1 -1
  14. package/dist/chunk-5JUG4BEF.js +2 -0
  15. package/dist/chunk-5JUG4BEF.js.map +1 -0
  16. package/dist/chunk-6I7D2JBA.js +3 -0
  17. package/dist/chunk-6I7D2JBA.js.map +1 -0
  18. package/dist/chunk-7ODGH7G2.js +2 -0
  19. package/dist/{chunk-5LGIALCK.js.map → chunk-7ODGH7G2.js.map} +1 -1
  20. package/dist/{chunk-SZEGGBOC.js → chunk-A4DPLZZF.js} +2 -2
  21. package/dist/{chunk-SZEGGBOC.js.map → chunk-A4DPLZZF.js.map} +1 -1
  22. package/dist/{chunk-C4XLDODU.js → chunk-C2KPTRYM.js} +3 -1
  23. package/dist/chunk-C3OHXPJV.js +2 -0
  24. package/dist/chunk-C3OHXPJV.js.map +1 -0
  25. package/dist/{chunk-KR27GOH6.js → chunk-CFYO546Y.js} +3 -3
  26. package/dist/{chunk-KR27GOH6.js.map → chunk-CFYO546Y.js.map} +1 -1
  27. package/dist/chunk-DHE6PO3V.js +2 -0
  28. package/dist/{chunk-5AJXR47U.js.map → chunk-DHE6PO3V.js.map} +1 -1
  29. package/dist/{chunk-V7C4EHK3.js → chunk-DSLPTDZX.js} +2 -2
  30. package/dist/{chunk-V7C4EHK3.js.map → chunk-DSLPTDZX.js.map} +1 -1
  31. package/dist/chunk-HSGUVQXU.js +10 -0
  32. package/dist/{chunk-JAPZBEBZ.js.map → chunk-HSGUVQXU.js.map} +1 -1
  33. package/dist/{chunk-EMFHKTAV.js → chunk-K3HW6YWS.js} +2 -2
  34. package/dist/{chunk-EMFHKTAV.js.map → chunk-K3HW6YWS.js.map} +1 -1
  35. package/dist/chunk-L5T56MRH.js +7 -0
  36. package/dist/chunk-L5T56MRH.js.map +1 -0
  37. package/dist/chunk-MBBE4RND.js +3 -0
  38. package/dist/chunk-MBBE4RND.js.map +1 -0
  39. package/dist/{chunk-USNXQOMJ.js → chunk-N33S7BSG.js} +2 -2
  40. package/dist/{chunk-USNXQOMJ.js.map → chunk-N33S7BSG.js.map} +1 -1
  41. package/dist/{chunk-KN7OJFEX.js → chunk-N52JTYBJ.js} +2 -2
  42. package/dist/{chunk-KN7OJFEX.js.map → chunk-N52JTYBJ.js.map} +1 -1
  43. package/dist/{chunk-AY2RXJWS.js → chunk-NFEQBTIW.js} +2 -2
  44. package/dist/{chunk-AY2RXJWS.js.map → chunk-NFEQBTIW.js.map} +1 -1
  45. package/dist/chunk-RFUMT6ZR.js +2 -0
  46. package/dist/{chunk-JWJJZVP3.js.map → chunk-RFUMT6ZR.js.map} +1 -1
  47. package/dist/{chunk-GSGPULRL.js → chunk-RLVHUIFC.js} +2 -2
  48. package/dist/{chunk-GSGPULRL.js.map → chunk-RLVHUIFC.js.map} +1 -1
  49. package/dist/chunk-S26WK6RF.js +2 -0
  50. package/dist/{chunk-54AXLGAK.js.map → chunk-S26WK6RF.js.map} +1 -1
  51. package/dist/{chunk-ONB3FWK5.js → chunk-S7VNSSIK.js} +2 -2
  52. package/dist/{chunk-ONB3FWK5.js.map → chunk-S7VNSSIK.js.map} +1 -1
  53. package/dist/chunk-S7Z6KKIN.js +2 -0
  54. package/dist/chunk-S7Z6KKIN.js.map +1 -0
  55. package/dist/{chunk-2NQ2RZ2M.js → chunk-U5XZWEPO.js} +3 -3
  56. package/dist/{chunk-2NQ2RZ2M.js.map → chunk-U5XZWEPO.js.map} +1 -1
  57. package/dist/chunk-UB22GYFK.js +2 -0
  58. package/dist/{chunk-MRHZN4G4.js.map → chunk-UB22GYFK.js.map} +1 -1
  59. package/dist/chunk-VUZ7GHSO.js +7 -0
  60. package/dist/{chunk-NNISUDZX.js.map → chunk-VUZ7GHSO.js.map} +1 -1
  61. package/dist/chunk-X3SHNHHM.js +2 -0
  62. package/dist/chunk-X3SHNHHM.js.map +1 -0
  63. package/dist/{chunk-XV7U33XQ.js → chunk-YKM3FUGK.js} +3 -3
  64. package/dist/{chunk-XV7U33XQ.js.map → chunk-YKM3FUGK.js.map} +1 -1
  65. package/dist/electron.js +1 -1
  66. package/dist/{entry-CA2QAEHN.js → entry-ROTT3ZDN.js} +2 -2
  67. package/dist/{entry-CA2QAEHN.js.map → entry-ROTT3ZDN.js.map} +1 -1
  68. package/dist/index.d.ts +10 -1
  69. package/dist/index.js +7 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/list-N4E3VXM5.js +3 -0
  72. package/dist/{list-Q2KAEJ26.js.map → list-N4E3VXM5.js.map} +1 -1
  73. package/dist/list-RCTHBJOK.js +2 -0
  74. package/dist/{list-UMMVRYVD.js.map → list-RCTHBJOK.js.map} +1 -1
  75. package/dist/nextjs.js +1 -1
  76. package/dist/pages-XUJGIHQI.js +5 -0
  77. package/dist/{pages-KZ66JVNU.js.map → pages-XUJGIHQI.js.map} +1 -1
  78. package/dist/plugin-pages-FEQILAQR.js +2 -0
  79. package/dist/{plugin-pages-SR2WSUKZ.js.map → plugin-pages-FEQILAQR.js.map} +1 -1
  80. package/dist/project-selector-U64ROZ5D.js +2 -0
  81. package/dist/project-selector-U64ROZ5D.js.map +1 -0
  82. package/dist/record-links-HO4SEHOA.js +2 -0
  83. package/dist/{record-links-3WZGSVFU.js.map → record-links-HO4SEHOA.js.map} +1 -1
  84. package/dist/root-BUXIQKA5.js +14 -0
  85. package/dist/{root-LFJ5BQSY.js.map → root-BUXIQKA5.js.map} +1 -1
  86. package/dist/root-CCUROZVR.js +2 -0
  87. package/dist/{root-6QTQUYK4.js.map → root-CCUROZVR.js.map} +1 -1
  88. package/dist/root-GQL3P63Z.js +31 -0
  89. package/dist/{root-7BUVDOMV.js.map → root-GQL3P63Z.js.map} +1 -1
  90. package/dist/root-KXY4A6DW.js +2 -0
  91. package/dist/{root-2VBLPRG7.js.map → root-KXY4A6DW.js.map} +1 -1
  92. package/dist/root-MLEJUEMJ.js +23 -0
  93. package/dist/{root-FZLKYL5W.js.map → root-MLEJUEMJ.js.map} +1 -1
  94. package/dist/root-VA3E6HEY.js +2 -0
  95. package/dist/{root-OXS3QQX6.js.map → root-VA3E6HEY.js.map} +1 -1
  96. package/dist/search-YY4GQQRM.js +2 -0
  97. package/dist/{search-AZK3Q2KX.js.map → search-YY4GQQRM.js.map} +1 -1
  98. package/dist/skills-pages-SAOZTUOH.js +2 -0
  99. package/dist/{skills-pages-7IYBJ4QI.js.map → skills-pages-SAOZTUOH.js.map} +1 -1
  100. package/dist/source-2S24MZ5D.js +2 -0
  101. package/dist/{source-4BP5PJ2N.js.map → source-2S24MZ5D.js.map} +1 -1
  102. package/dist/spec-renderer-ZSIVMKVE.js +2 -0
  103. package/dist/{spec-renderer-3GAVSV52.js.map → spec-renderer-ZSIVMKVE.js.map} +1 -1
  104. package/dist/tanstack-start.js +1 -1
  105. package/dist/ui.js +1 -1
  106. package/dist/user-nav-ZH63YHX7.js +2 -0
  107. package/dist/{user-nav-OWTTAXZS.js.map → user-nav-ZH63YHX7.js.map} +1 -1
  108. package/package.json +4 -4
  109. package/dist/activity-nav-button-E4I4YC3X.js +0 -2
  110. package/dist/chat-page-7UB3BMBF.js +0 -4
  111. package/dist/chunk-2NXQF2F7.js +0 -2
  112. package/dist/chunk-32ZU4MLE.js +0 -2
  113. package/dist/chunk-32ZU4MLE.js.map +0 -1
  114. package/dist/chunk-54AXLGAK.js +0 -2
  115. package/dist/chunk-5AJXR47U.js +0 -2
  116. package/dist/chunk-5LGIALCK.js +0 -2
  117. package/dist/chunk-6NRQMG26.js +0 -2
  118. package/dist/chunk-6NRQMG26.js.map +0 -1
  119. package/dist/chunk-AKQ6ELDX.js +0 -2
  120. package/dist/chunk-AKQ6ELDX.js.map +0 -1
  121. package/dist/chunk-DGIY4SKN.js +0 -7
  122. package/dist/chunk-DGIY4SKN.js.map +0 -1
  123. package/dist/chunk-HDOIOXMP.js +0 -2
  124. package/dist/chunk-HDOIOXMP.js.map +0 -1
  125. package/dist/chunk-HZOD2HOF.js +0 -3
  126. package/dist/chunk-HZOD2HOF.js.map +0 -1
  127. package/dist/chunk-JAPZBEBZ.js +0 -10
  128. package/dist/chunk-JWJJZVP3.js +0 -2
  129. package/dist/chunk-MRHZN4G4.js +0 -2
  130. package/dist/chunk-NNISUDZX.js +0 -7
  131. package/dist/chunk-O2QMYUPS.js +0 -2
  132. package/dist/chunk-O2QMYUPS.js.map +0 -1
  133. package/dist/chunk-R2O4WC3H.js +0 -4
  134. package/dist/chunk-WPCPL2TQ.js +0 -3
  135. package/dist/chunk-WPCPL2TQ.js.map +0 -1
  136. package/dist/list-Q2KAEJ26.js +0 -3
  137. package/dist/list-UMMVRYVD.js +0 -2
  138. package/dist/pages-KZ66JVNU.js +0 -5
  139. package/dist/plugin-pages-SR2WSUKZ.js +0 -2
  140. package/dist/project-selector-72VM6SUI.js +0 -2
  141. package/dist/project-selector-72VM6SUI.js.map +0 -1
  142. package/dist/record-links-3WZGSVFU.js +0 -2
  143. package/dist/root-2VBLPRG7.js +0 -2
  144. package/dist/root-6QTQUYK4.js +0 -2
  145. package/dist/root-7BUVDOMV.js +0 -31
  146. package/dist/root-FZLKYL5W.js +0 -23
  147. package/dist/root-LFJ5BQSY.js +0 -14
  148. package/dist/root-OXS3QQX6.js +0 -2
  149. package/dist/search-AZK3Q2KX.js +0 -2
  150. package/dist/skills-pages-7IYBJ4QI.js +0 -2
  151. package/dist/source-4BP5PJ2N.js +0 -2
  152. package/dist/spec-renderer-3GAVSV52.js +0 -2
  153. package/dist/user-nav-OWTTAXZS.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/api.ts","../src/apps/knowledge/shared.tsx"],"names":["KnowledgeApiError","status","message","code","FetcherError","fetcher","url","response","knowledgePaths","projectId","basePath","entity","sourceId","jobId","from","to","recordId","options","limit","offset","search","params","trimmedSearch","isKnowledgeListKey","key","isKnowledgeLinkKey","readError","fallback","data","createKnowledgeApi","request","init","requestInit","register","body","file","tokenResponse","tokenData","put","title","filename","target","patch","STATUS_TONE_CLASSES","useProjectKnowledge","currentProjectId","useConfig","useMemo","invalidateKnowledgeLists","mutateGlobal","invalidateKnowledgeLinks","describeApiError","error","announceRegistered","result","name","toast","PageMessage","children","jsx","StatusBadge","label","tone","jsxs","Badge","LoaderCircle","FILE_ICONS","Document","Docx","Html","Pdf","Pptx","Txt","KnowledgeTypeIcon","className","size","source","format","getKnowledgeFormat","Icon","SourceIcon","InfiniteScrollSentinel","onVisible","sentinelRef","useRef","onVisibleRef","useEffect","node","observer","entries","entry","SourceActionsMenu","isBusy","onOpen","onRemoved","trigger","api","canMutate","useCanMutate","isConfirmingRemoval","setIsConfirmingRemoval","useState","isRemoving","setIsRemoving","knowledgeApi","remove","removeError","Fragment","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVerticalIcon","DropdownMenuContent","DropdownMenuItem","DownloadIcon","ExternalLinkIcon","DropdownMenuSeparator","Trash2Icon","DropdownMenuLabel","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","event"],"mappings":"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","file":"chunk-GSGPULRL.js","sourcesContent":["import { put } from '@vercel/blob/client';\nimport type {\n KnowledgeJob,\n KnowledgeLinkTarget,\n KnowledgeRecordRef,\n KnowledgeSource,\n KnowledgeSourcePatch,\n KnowledgeSourceStatus,\n RegisterKnowledgeSourceResult,\n} from './knowledge';\n\n/** The platform refused a knowledge request; `code` lets the UI tailor the message. */\nexport class KnowledgeApiError extends Error {\n code: string | null;\n status: number;\n\n constructor(status: number, message: string, code: string | null = null) {\n super(message);\n this.name = 'KnowledgeApiError';\n this.code = code;\n this.status = status;\n }\n}\n\nexport interface ProjectSpace {\n code: string;\n id: string;\n label: string;\n}\n\nexport interface KnowledgeApi {\n /** Uploads a document to the file store, then registers it; resolves once indexing is queued or the file was already there. */\n addFile: (_file: File, _options?: { signal?: AbortSignal }) => Promise<RegisterKnowledgeSourceResult>;\n addUrl: (_input: { title?: string; url: string }) => Promise<RegisterKnowledgeSourceResult>;\n /** Promotes a file the caller attached to a chat: the platform copies it into the knowledge folder. */\n addChatAttachment: (_input: { filename: string; url: string }) => Promise<RegisterKnowledgeSourceResult>;\n deleteSource: (_sourceId: string) => Promise<{ deleted: true }>;\n /** Attaches the document to a record, or to every record of an entity type; `linked` is false when it already was. */\n linkSource: (_sourceId: string, _target: KnowledgeLinkTarget) => Promise<{ linked: boolean }>;\n reingestSource: (_sourceId: string) => Promise<{ job: KnowledgeJob }>;\n unlinkSource: (_sourceId: string, _target: KnowledgeLinkTarget) => Promise<{ unlinked: boolean }>;\n updateSource: (_sourceId: string, _patch: KnowledgeSourcePatch) => Promise<{ source: KnowledgeSource }>;\n}\n\nexport class FetcherError extends Error {\n status: number;\n\n constructor(status: number, message = 'Request failed') {\n super(message);\n this.name = 'FetcherError';\n this.status = status;\n }\n}\n\nexport const fetcher = async <T>(url: string): Promise<T> => {\n const response = await fetch(url, { credentials: 'include' });\n\n if (!response.ok) {\n throw new FetcherError(response.status);\n }\n\n return (await response.json()) as T;\n};\n\nexport function knowledgePaths(projectId: string): {\n /** The documents attached to every record of an entity type. */\n entitySources: (_entity: string) => string;\n /** The original file of an uploaded document, served under its name. */\n file: (_sourceId: string) => string;\n job: (_jobId: string) => string;\n /** The records a document is attached to, and the entity types it applies to. */\n links: (_sourceId: string) => string;\n passages: (_sourceId: string, _options: { from: number; to: number }) => string;\n /** The documents attached to a record. */\n recordSources: (_record: KnowledgeRecordRef) => string;\n source: (_sourceId: string) => string;\n sources: (_options?: { limit?: number; offset?: number; search?: string; status?: KnowledgeSourceStatus }) => string;\n spaces: string;\n} {\n const basePath = `/api/flexkit/${projectId}/knowledge`;\n\n return {\n entitySources: (entity) => `${basePath}/entities/${encodeURIComponent(entity)}/sources`,\n file: (sourceId) => `${basePath}/sources/${encodeURIComponent(sourceId)}/file`,\n job: (jobId) => `${basePath}/jobs/${encodeURIComponent(jobId)}`,\n links: (sourceId) => `${basePath}/sources/${encodeURIComponent(sourceId)}/links`,\n passages: (sourceId, { from, to }) =>\n `${basePath}/sources/${encodeURIComponent(sourceId)}/passages?from=${String(from)}&to=${String(to)}`,\n recordSources: ({ entity, recordId }) =>\n `${basePath}/records/${encodeURIComponent(entity)}/${encodeURIComponent(recordId)}/sources`,\n source: (sourceId) => `${basePath}/sources/${encodeURIComponent(sourceId)}`,\n sources: (options = {}) => {\n const { limit = 25, offset = 0, search, status } = options;\n const params = new URLSearchParams({ limit: limit.toString(), offset: offset.toString() });\n const trimmedSearch = search?.trim();\n\n if (trimmedSearch) {\n params.set('q', trimmedSearch);\n }\n\n if (status) {\n params.set('status', status);\n }\n\n return `${basePath}/sources?${params.toString()}`;\n },\n spaces: `/api/flexkit/${projectId}/spaces`,\n };\n}\n\n/** Whether an SWR key is a page of the document list, whatever its filters. */\nexport function isKnowledgeListKey(key: unknown): boolean {\n return typeof key === 'string' && key.includes('/knowledge/sources?');\n}\n\n/** Whether an SWR key lists the documents of a record or an entity type, or the links of a document. */\nexport function isKnowledgeLinkKey(key: unknown): boolean {\n return (\n typeof key === 'string' &&\n (key.includes('/knowledge/records/') ||\n key.includes('/knowledge/entities/') ||\n (key.includes('/knowledge/sources/') && key.endsWith('/links')))\n );\n}\n\nasync function readError(response: Response, fallback: string): Promise<KnowledgeApiError> {\n let data: { code?: string; error?: string } = {};\n\n try {\n data = (await response.json()) as { code?: string; error?: string };\n } catch {\n // Non-JSON error bodies keep the fallback message.\n }\n\n return new KnowledgeApiError(response.status, data.error ? String(data.error) : fallback, data.code ?? null);\n}\n\nexport function createKnowledgeApi(projectId: string): KnowledgeApi {\n const basePath = `/api/flexkit/${projectId}/knowledge`;\n\n async function request<T>(url: string, init: RequestInit & { fallback: string }): Promise<T> {\n const { fallback, ...requestInit } = init;\n const response = await fetch(url, {\n credentials: 'include',\n headers: { 'Content-Type': 'application/json', ...(requestInit.headers ?? {}) },\n ...requestInit,\n });\n\n if (!response.ok) {\n throw await readError(response, fallback);\n }\n\n return (await response.json()) as T;\n }\n\n function register(body: Record<string, unknown>): Promise<RegisterKnowledgeSourceResult> {\n return request<RegisterKnowledgeSourceResult>(`${basePath}/sources`, {\n body: JSON.stringify(body),\n fallback: 'The document could not be added.',\n method: 'POST',\n });\n }\n\n return {\n addFile: async (file, options) => {\n // The platform issues a token pinned to one pathname, type and size; the\n // browser writes the bytes to the store itself, so a 20 MB document never\n // crosses the API function body limit. Registration then hashes the blob.\n const tokenResponse = await fetch(`${basePath}/uploads`, {\n body: JSON.stringify({ filename: file.name, mediaType: file.type || null, sizeBytes: file.size }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n signal: options?.signal,\n });\n\n if (!tokenResponse.ok) {\n throw await readError(tokenResponse, 'The file could not be uploaded.');\n }\n\n const tokenData = (await tokenResponse.json()) as { mediaType?: string; pathname?: string; token?: string };\n\n if (!tokenData.pathname || !tokenData.token || !tokenData.mediaType) {\n throw new KnowledgeApiError(tokenResponse.status, 'The file could not be uploaded.');\n }\n\n await put(tokenData.pathname, file, {\n abortSignal: options?.signal,\n access: 'public',\n contentType: tokenData.mediaType,\n token: tokenData.token,\n });\n\n return register({ kind: 'upload', pathname: tokenData.pathname });\n },\n addUrl: ({ title, url }) => register({ kind: 'url', url, ...(title ? { title } : {}) }),\n addChatAttachment: ({ filename, url }) => register({ filename, kind: 'chat-attachment', url }),\n deleteSource: (sourceId) =>\n request<{ deleted: true }>(`${basePath}/sources/${encodeURIComponent(sourceId)}`, {\n fallback: 'The document could not be removed.',\n method: 'DELETE',\n }),\n linkSource: (sourceId, target) =>\n request<{ linked: boolean }>(`${basePath}/sources/${encodeURIComponent(sourceId)}/links`, {\n body: JSON.stringify(target),\n fallback: 'The document could not be attached.',\n method: 'POST',\n }),\n reingestSource: (sourceId) =>\n request<{ job: KnowledgeJob }>(`${basePath}/sources/${encodeURIComponent(sourceId)}/reingest`, {\n fallback: 'The document could not be re-indexed.',\n method: 'POST',\n }),\n unlinkSource: (sourceId, { entity, recordId }) =>\n request<{ unlinked: boolean }>(\n `${basePath}/sources/${encodeURIComponent(sourceId)}/links/${encodeURIComponent(entity)}${\n recordId === undefined ? '' : `/${encodeURIComponent(recordId)}`\n }`,\n { fallback: 'The document could not be detached.', method: 'DELETE' }\n ),\n updateSource: (sourceId, patch) =>\n request<{ source: KnowledgeSource }>(`${basePath}/sources/${encodeURIComponent(sourceId)}`, {\n body: JSON.stringify(patch),\n fallback: 'The document could not be updated.',\n method: 'PATCH',\n }),\n };\n}\n","import type { JSX, MouseEvent } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { DownloadIcon, EllipsisVerticalIcon, ExternalLinkIcon, LoaderCircle, Trash2Icon } from 'lucide-react';\nimport { mutate as mutateGlobal } from 'swr';\n// File type icons: Untitled UI's free file icons, Solid variant. The set is\n// published as the MIT package `@untitledui/file-icons`; the page below shows\n// every icon and offers each as SVG or JSX should another format need one.\n// https://www.untitledui.com/resources/file-icons\nimport { Document } from '@untitledui/file-icons/dist/solid/document.mjs';\nimport { Docx } from '@untitledui/file-icons/dist/solid/docx.mjs';\nimport { Html } from '@untitledui/file-icons/dist/solid/html.mjs';\nimport { Pdf } from '@untitledui/file-icons/dist/solid/pdf.mjs';\nimport { Pptx } from '@untitledui/file-icons/dist/solid/pptx.mjs';\nimport { Txt } from '@untitledui/file-icons/dist/solid/txt.mjs';\nimport { useConfig } from '../../core/config/config-context';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n toast,\n} from '../../ui';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../../ui/primitives/alert-dialog';\nimport {\n createKnowledgeApi,\n isKnowledgeLinkKey,\n isKnowledgeListKey,\n KnowledgeApiError,\n knowledgePaths,\n type KnowledgeApi,\n} from './api';\nimport {\n getKnowledgeFormat,\n type KnowledgeFileIcon,\n type KnowledgeSource,\n type KnowledgeStatusTone,\n type RegisterKnowledgeSourceResult,\n} from './knowledge';\n\nconst STATUS_TONE_CLASSES: { [tone in KnowledgeStatusTone]: string } = {\n busy: 'fk:bg-amber-500/15 fk:text-amber-700 fk:dark:text-amber-400',\n error: 'fk:bg-destructive/15 fk:text-destructive',\n muted: 'fk:bg-muted fk:text-muted-foreground',\n ready: 'fk:bg-emerald-500/15 fk:text-emerald-700 fk:dark:text-emerald-400',\n};\n\nexport function useProjectKnowledge(): { api: KnowledgeApi | null; projectId: string | undefined } {\n const { currentProjectId } = useConfig();\n const api = useMemo(() => (currentProjectId ? createKnowledgeApi(currentProjectId) : null), [currentProjectId]);\n\n return { api, projectId: currentProjectId };\n}\n\n/** Drops every cached page of the document list, so the next visit fetches it afresh. */\nexport function invalidateKnowledgeLists(): Promise<unknown> {\n return mutateGlobal(isKnowledgeListKey, undefined, { revalidate: true });\n}\n\n/** Drops every cached link listing (a record's documents, a document's records) after a link changed. */\nexport function invalidateKnowledgeLinks(): Promise<unknown> {\n return mutateGlobal(isKnowledgeLinkKey, undefined, { revalidate: true });\n}\n\nexport function describeApiError(error: unknown, fallback: string): string {\n if (error instanceof KnowledgeApiError) {\n return error.message;\n }\n\n return error instanceof Error ? error.message : fallback;\n}\n\n/** What the user hears once a document was registered. */\nexport function announceRegistered(result: RegisterKnowledgeSourceResult, name: string): void {\n if (result.duplicate) {\n toast.info(`\"${result.source.title}\" is already in Knowledge.`);\n\n return;\n }\n\n toast.success(`Added ${name}. Indexing starts now.`);\n}\n\nexport function PageMessage({ children }: { children: string }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n {children}\n </div>\n );\n}\n\nexport function StatusBadge({ label, tone }: { label: string; tone: KnowledgeStatusTone }): JSX.Element {\n return (\n <Badge className={`fk:border-none fk:corner-squircle ${STATUS_TONE_CLASSES[tone]}`} variant=\"outline\">\n {tone === 'busy' ? <LoaderCircle className=\"fk:size-3 fk:animate-spin\" /> : null}\n {label}\n </Badge>\n );\n}\n\nconst FILE_ICONS: { [icon in KnowledgeFileIcon]: typeof Pdf } = {\n document: Document,\n docx: Docx,\n html: Html,\n pdf: Pdf,\n pptx: Pptx,\n txt: Txt,\n};\n\n/** The document's format as its file icon; the format's name is what a screen reader hears. */\nexport function KnowledgeTypeIcon({\n className = '',\n size = 24,\n source,\n}: {\n className?: string;\n size?: number;\n source: Pick<KnowledgeSource, 'kind' | 'mimeType'>;\n}): JSX.Element {\n const format = getKnowledgeFormat(source);\n const Icon = FILE_ICONS[format.icon];\n\n return (\n <span\n aria-label={format.label}\n className={`fk:flex fk:shrink-0 fk:items-center fk:justify-center ${className}`}\n data-knowledge-type={format.icon}\n role=\"img\"\n >\n <Icon size={size} />\n </span>\n );\n}\n\n/** The larger file icon of the document page and the record panel: the same icon as the list, at 40px. */\nexport function SourceIcon({ source }: { source: Pick<KnowledgeSource, 'kind' | 'mimeType'> }): JSX.Element {\n return <KnowledgeTypeIcon size={40} source={source} />;\n}\n\nexport function InfiniteScrollSentinel({ onVisible }: { onVisible: () => void }): JSX.Element {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const onVisibleRef = useRef(onVisible);\n\n onVisibleRef.current = onVisible;\n\n useEffect(() => {\n const node = sentinelRef.current;\n\n if (!node) {\n return;\n }\n\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onVisibleRef.current();\n }\n });\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return <div aria-hidden className=\"fk:h-px\" ref={sentinelRef} />;\n}\n\n/**\n * The actions of one document, behind a three-dots button: open (lists\n * only), download the original file (web pages open their address instead)\n * and remove, behind one confirmation. The list and the document page share\n * it so the copy, the download link and the busy rules stay the same.\n */\nexport function SourceActionsMenu({\n isBusy = false,\n onOpen,\n onRemoved,\n source,\n trigger = 'row',\n}: {\n /** Another action on the document is in flight; removing waits for it. */\n isBusy?: boolean;\n /** Offered as the first item when given (the document page is already open). */\n onOpen?: () => void;\n /** The document is gone: drop it from the list, or leave its page. The list invalidation is done here. */\n onRemoved: () => void;\n source: KnowledgeSource;\n /** How the button looks: a quiet icon in a row or card, an outlined one next to page actions. */\n trigger?: 'row' | 'page';\n}): JSX.Element | null {\n const { api, projectId } = useProjectKnowledge();\n const canMutate = useCanMutate();\n const [isConfirmingRemoval, setIsConfirmingRemoval] = useState(false);\n const [isRemoving, setIsRemoving] = useState(false);\n\n if (!api || !projectId) {\n return null;\n }\n\n const knowledgeApi = api;\n\n async function remove(): Promise<void> {\n setIsRemoving(true);\n\n try {\n await knowledgeApi.deleteSource(source.id);\n toast.success(`Removed \"${source.title}\".`);\n setIsConfirmingRemoval(false);\n onRemoved();\n void invalidateKnowledgeLists();\n } catch (removeError) {\n toast.error(describeApiError(removeError, 'The document could not be removed.'));\n } finally {\n setIsRemoving(false);\n }\n }\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${source.title}`}\n className={trigger === 'row' ? 'fk:size-8 fk:shrink-0 fk:text-muted-foreground' : undefined}\n data-knowledge-menu\n size=\"icon-sm\"\n variant={trigger === 'row' ? 'ghost' : 'outline'}\n >\n <EllipsisVerticalIcon className=\"fk:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onOpen ? <DropdownMenuItem onSelect={onOpen}>Open</DropdownMenuItem> : null}\n {source.path ? (\n <DropdownMenuItem asChild>\n <a href={knowledgePaths(projectId).file(source.id)}>\n <DownloadIcon />\n Download\n </a>\n </DropdownMenuItem>\n ) : null}\n {source.originUrl ? (\n <DropdownMenuItem asChild>\n <a href={source.originUrl} rel=\"noreferrer\" target=\"_blank\">\n <ExternalLinkIcon />\n Open page\n </a>\n </DropdownMenuItem>\n ) : null}\n {onOpen || source.path || source.originUrl ? <DropdownMenuSeparator /> : null}\n <DropdownMenuItem\n disabled={!canMutate || isBusy}\n variant=\"destructive\"\n onSelect={() => setIsConfirmingRemoval(true)}\n >\n <Trash2Icon />\n Remove\n </DropdownMenuItem>\n {canMutate ? null : (\n <DropdownMenuLabel className=\"fk:max-w-56 fk:whitespace-normal fk:text-xs fk:font-normal fk:text-muted-foreground\">\n Your member role cannot remove documents.\n </DropdownMenuLabel>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n <AlertDialog open={isConfirmingRemoval} onOpenChange={setIsConfirmingRemoval}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remove this document?</AlertDialogTitle>\n <AlertDialogDescription>\n \"{source.title}\" and its indexed passages are deleted for everyone. Answers the agent gave earlier keep\n their citations, but the document can no longer be opened.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isRemoving}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n disabled={isRemoving}\n onClick={(event: MouseEvent) => {\n event.preventDefault();\n void remove();\n }}\n >\n {isRemoving ? <LoaderCircle className=\"fk:animate-spin\" /> : null}\n Remove document\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/api.ts","../src/apps/knowledge/shared.tsx"],"names":["KnowledgeApiError","status","message","code","FetcherError","fetcher","url","response","knowledgePaths","projectId","basePath","entity","sourceId","jobId","from","to","recordId","options","limit","offset","search","params","trimmedSearch","isKnowledgeListKey","key","isKnowledgeLinkKey","readError","fallback","data","createKnowledgeApi","request","init","requestInit","register","body","file","tokenResponse","tokenData","put","title","filename","target","patch","STATUS_TONE_CLASSES","useProjectKnowledge","currentProjectId","useConfig","useMemo","invalidateKnowledgeLists","mutateGlobal","invalidateKnowledgeLinks","describeApiError","error","announceRegistered","result","name","toast","PageMessage","children","jsx","StatusBadge","label","tone","jsxs","Badge","LoaderCircle","FILE_ICONS","Document","Docx","Html","Pdf","Pptx","Txt","KnowledgeTypeIcon","className","size","source","format","getKnowledgeFormat","Icon","SourceIcon","InfiniteScrollSentinel","onVisible","sentinelRef","useRef","onVisibleRef","useEffect","node","observer","entries","entry","SourceActionsMenu","isBusy","onOpen","onRemoved","trigger","api","canMutate","useCanMutate","isConfirmingRemoval","setIsConfirmingRemoval","useState","isRemoving","setIsRemoving","knowledgeApi","remove","removeError","Fragment","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVerticalIcon","DropdownMenuContent","DropdownMenuItem","DownloadIcon","ExternalLinkIcon","DropdownMenuSeparator","Trash2Icon","DropdownMenuLabel","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","event"],"mappings":"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","file":"chunk-RLVHUIFC.js","sourcesContent":["import { put } from '@vercel/blob/client';\nimport type {\n KnowledgeJob,\n KnowledgeLinkTarget,\n KnowledgeRecordRef,\n KnowledgeSource,\n KnowledgeSourcePatch,\n KnowledgeSourceStatus,\n RegisterKnowledgeSourceResult,\n} from './knowledge';\n\n/** The platform refused a knowledge request; `code` lets the UI tailor the message. */\nexport class KnowledgeApiError extends Error {\n code: string | null;\n status: number;\n\n constructor(status: number, message: string, code: string | null = null) {\n super(message);\n this.name = 'KnowledgeApiError';\n this.code = code;\n this.status = status;\n }\n}\n\nexport interface ProjectSpace {\n code: string;\n id: string;\n label: string;\n}\n\nexport interface KnowledgeApi {\n /** Uploads a document to the file store, then registers it; resolves once indexing is queued or the file was already there. */\n addFile: (_file: File, _options?: { signal?: AbortSignal }) => Promise<RegisterKnowledgeSourceResult>;\n addUrl: (_input: { title?: string; url: string }) => Promise<RegisterKnowledgeSourceResult>;\n /** Promotes a file the caller attached to a chat: the platform copies it into the knowledge folder. */\n addChatAttachment: (_input: { filename: string; url: string }) => Promise<RegisterKnowledgeSourceResult>;\n deleteSource: (_sourceId: string) => Promise<{ deleted: true }>;\n /** Attaches the document to a record, or to every record of an entity type; `linked` is false when it already was. */\n linkSource: (_sourceId: string, _target: KnowledgeLinkTarget) => Promise<{ linked: boolean }>;\n reingestSource: (_sourceId: string) => Promise<{ job: KnowledgeJob }>;\n unlinkSource: (_sourceId: string, _target: KnowledgeLinkTarget) => Promise<{ unlinked: boolean }>;\n updateSource: (_sourceId: string, _patch: KnowledgeSourcePatch) => Promise<{ source: KnowledgeSource }>;\n}\n\nexport class FetcherError extends Error {\n status: number;\n\n constructor(status: number, message = 'Request failed') {\n super(message);\n this.name = 'FetcherError';\n this.status = status;\n }\n}\n\nexport const fetcher = async <T>(url: string): Promise<T> => {\n const response = await fetch(url, { credentials: 'include' });\n\n if (!response.ok) {\n throw new FetcherError(response.status);\n }\n\n return (await response.json()) as T;\n};\n\nexport function knowledgePaths(projectId: string): {\n /** The documents attached to every record of an entity type. */\n entitySources: (_entity: string) => string;\n /** The original file of an uploaded document, served under its name. */\n file: (_sourceId: string) => string;\n job: (_jobId: string) => string;\n /** The records a document is attached to, and the entity types it applies to. */\n links: (_sourceId: string) => string;\n passages: (_sourceId: string, _options: { from: number; to: number }) => string;\n /** The documents attached to a record. */\n recordSources: (_record: KnowledgeRecordRef) => string;\n source: (_sourceId: string) => string;\n sources: (_options?: { limit?: number; offset?: number; search?: string; status?: KnowledgeSourceStatus }) => string;\n spaces: string;\n} {\n const basePath = `/api/flexkit/${projectId}/knowledge`;\n\n return {\n entitySources: (entity) => `${basePath}/entities/${encodeURIComponent(entity)}/sources`,\n file: (sourceId) => `${basePath}/sources/${encodeURIComponent(sourceId)}/file`,\n job: (jobId) => `${basePath}/jobs/${encodeURIComponent(jobId)}`,\n links: (sourceId) => `${basePath}/sources/${encodeURIComponent(sourceId)}/links`,\n passages: (sourceId, { from, to }) =>\n `${basePath}/sources/${encodeURIComponent(sourceId)}/passages?from=${String(from)}&to=${String(to)}`,\n recordSources: ({ entity, recordId }) =>\n `${basePath}/records/${encodeURIComponent(entity)}/${encodeURIComponent(recordId)}/sources`,\n source: (sourceId) => `${basePath}/sources/${encodeURIComponent(sourceId)}`,\n sources: (options = {}) => {\n const { limit = 25, offset = 0, search, status } = options;\n const params = new URLSearchParams({ limit: limit.toString(), offset: offset.toString() });\n const trimmedSearch = search?.trim();\n\n if (trimmedSearch) {\n params.set('q', trimmedSearch);\n }\n\n if (status) {\n params.set('status', status);\n }\n\n return `${basePath}/sources?${params.toString()}`;\n },\n spaces: `/api/flexkit/${projectId}/spaces`,\n };\n}\n\n/** Whether an SWR key is a page of the document list, whatever its filters. */\nexport function isKnowledgeListKey(key: unknown): boolean {\n return typeof key === 'string' && key.includes('/knowledge/sources?');\n}\n\n/** Whether an SWR key lists the documents of a record or an entity type, or the links of a document. */\nexport function isKnowledgeLinkKey(key: unknown): boolean {\n return (\n typeof key === 'string' &&\n (key.includes('/knowledge/records/') ||\n key.includes('/knowledge/entities/') ||\n (key.includes('/knowledge/sources/') && key.endsWith('/links')))\n );\n}\n\nasync function readError(response: Response, fallback: string): Promise<KnowledgeApiError> {\n let data: { code?: string; error?: string } = {};\n\n try {\n data = (await response.json()) as { code?: string; error?: string };\n } catch {\n // Non-JSON error bodies keep the fallback message.\n }\n\n return new KnowledgeApiError(response.status, data.error ? String(data.error) : fallback, data.code ?? null);\n}\n\nexport function createKnowledgeApi(projectId: string): KnowledgeApi {\n const basePath = `/api/flexkit/${projectId}/knowledge`;\n\n async function request<T>(url: string, init: RequestInit & { fallback: string }): Promise<T> {\n const { fallback, ...requestInit } = init;\n const response = await fetch(url, {\n credentials: 'include',\n headers: { 'Content-Type': 'application/json', ...(requestInit.headers ?? {}) },\n ...requestInit,\n });\n\n if (!response.ok) {\n throw await readError(response, fallback);\n }\n\n return (await response.json()) as T;\n }\n\n function register(body: Record<string, unknown>): Promise<RegisterKnowledgeSourceResult> {\n return request<RegisterKnowledgeSourceResult>(`${basePath}/sources`, {\n body: JSON.stringify(body),\n fallback: 'The document could not be added.',\n method: 'POST',\n });\n }\n\n return {\n addFile: async (file, options) => {\n // The platform issues a token pinned to one pathname, type and size; the\n // browser writes the bytes to the store itself, so a 20 MB document never\n // crosses the API function body limit. Registration then hashes the blob.\n const tokenResponse = await fetch(`${basePath}/uploads`, {\n body: JSON.stringify({ filename: file.name, mediaType: file.type || null, sizeBytes: file.size }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n signal: options?.signal,\n });\n\n if (!tokenResponse.ok) {\n throw await readError(tokenResponse, 'The file could not be uploaded.');\n }\n\n const tokenData = (await tokenResponse.json()) as { mediaType?: string; pathname?: string; token?: string };\n\n if (!tokenData.pathname || !tokenData.token || !tokenData.mediaType) {\n throw new KnowledgeApiError(tokenResponse.status, 'The file could not be uploaded.');\n }\n\n await put(tokenData.pathname, file, {\n abortSignal: options?.signal,\n access: 'public',\n contentType: tokenData.mediaType,\n token: tokenData.token,\n });\n\n return register({ kind: 'upload', pathname: tokenData.pathname });\n },\n addUrl: ({ title, url }) => register({ kind: 'url', url, ...(title ? { title } : {}) }),\n addChatAttachment: ({ filename, url }) => register({ filename, kind: 'chat-attachment', url }),\n deleteSource: (sourceId) =>\n request<{ deleted: true }>(`${basePath}/sources/${encodeURIComponent(sourceId)}`, {\n fallback: 'The document could not be removed.',\n method: 'DELETE',\n }),\n linkSource: (sourceId, target) =>\n request<{ linked: boolean }>(`${basePath}/sources/${encodeURIComponent(sourceId)}/links`, {\n body: JSON.stringify(target),\n fallback: 'The document could not be attached.',\n method: 'POST',\n }),\n reingestSource: (sourceId) =>\n request<{ job: KnowledgeJob }>(`${basePath}/sources/${encodeURIComponent(sourceId)}/reingest`, {\n fallback: 'The document could not be re-indexed.',\n method: 'POST',\n }),\n unlinkSource: (sourceId, { entity, recordId }) =>\n request<{ unlinked: boolean }>(\n `${basePath}/sources/${encodeURIComponent(sourceId)}/links/${encodeURIComponent(entity)}${\n recordId === undefined ? '' : `/${encodeURIComponent(recordId)}`\n }`,\n { fallback: 'The document could not be detached.', method: 'DELETE' }\n ),\n updateSource: (sourceId, patch) =>\n request<{ source: KnowledgeSource }>(`${basePath}/sources/${encodeURIComponent(sourceId)}`, {\n body: JSON.stringify(patch),\n fallback: 'The document could not be updated.',\n method: 'PATCH',\n }),\n };\n}\n","import type { JSX, MouseEvent } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { DownloadIcon, EllipsisVerticalIcon, ExternalLinkIcon, LoaderCircle, Trash2Icon } from 'lucide-react';\nimport { mutate as mutateGlobal } from 'swr';\n// File type icons: Untitled UI's free file icons, Solid variant. The set is\n// published as the MIT package `@untitledui/file-icons`; the page below shows\n// every icon and offers each as SVG or JSX should another format need one.\n// https://www.untitledui.com/resources/file-icons\nimport { Document } from '@untitledui/file-icons/dist/solid/document.mjs';\nimport { Docx } from '@untitledui/file-icons/dist/solid/docx.mjs';\nimport { Html } from '@untitledui/file-icons/dist/solid/html.mjs';\nimport { Pdf } from '@untitledui/file-icons/dist/solid/pdf.mjs';\nimport { Pptx } from '@untitledui/file-icons/dist/solid/pptx.mjs';\nimport { Txt } from '@untitledui/file-icons/dist/solid/txt.mjs';\nimport { useConfig } from '../../core/config/config-context';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n toast,\n} from '../../ui';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../../ui/primitives/alert-dialog';\nimport {\n createKnowledgeApi,\n isKnowledgeLinkKey,\n isKnowledgeListKey,\n KnowledgeApiError,\n knowledgePaths,\n type KnowledgeApi,\n} from './api';\nimport {\n getKnowledgeFormat,\n type KnowledgeFileIcon,\n type KnowledgeSource,\n type KnowledgeStatusTone,\n type RegisterKnowledgeSourceResult,\n} from './knowledge';\n\nconst STATUS_TONE_CLASSES: { [tone in KnowledgeStatusTone]: string } = {\n busy: 'fk:bg-amber-500/15 fk:text-amber-700 fk:dark:text-amber-400',\n error: 'fk:bg-destructive/15 fk:text-destructive',\n muted: 'fk:bg-muted fk:text-muted-foreground',\n ready: 'fk:bg-emerald-500/15 fk:text-emerald-700 fk:dark:text-emerald-400',\n};\n\nexport function useProjectKnowledge(): { api: KnowledgeApi | null; projectId: string | undefined } {\n const { currentProjectId } = useConfig();\n const api = useMemo(() => (currentProjectId ? createKnowledgeApi(currentProjectId) : null), [currentProjectId]);\n\n return { api, projectId: currentProjectId };\n}\n\n/** Drops every cached page of the document list, so the next visit fetches it afresh. */\nexport function invalidateKnowledgeLists(): Promise<unknown> {\n return mutateGlobal(isKnowledgeListKey, undefined, { revalidate: true });\n}\n\n/** Drops every cached link listing (a record's documents, a document's records) after a link changed. */\nexport function invalidateKnowledgeLinks(): Promise<unknown> {\n return mutateGlobal(isKnowledgeLinkKey, undefined, { revalidate: true });\n}\n\nexport function describeApiError(error: unknown, fallback: string): string {\n if (error instanceof KnowledgeApiError) {\n return error.message;\n }\n\n return error instanceof Error ? error.message : fallback;\n}\n\n/** What the user hears once a document was registered. */\nexport function announceRegistered(result: RegisterKnowledgeSourceResult, name: string): void {\n if (result.duplicate) {\n toast.info(`\"${result.source.title}\" is already in Knowledge.`);\n\n return;\n }\n\n toast.success(`Added ${name}. Indexing starts now.`);\n}\n\nexport function PageMessage({ children }: { children: string }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n {children}\n </div>\n );\n}\n\nexport function StatusBadge({ label, tone }: { label: string; tone: KnowledgeStatusTone }): JSX.Element {\n return (\n <Badge className={`fk:border-none fk:corner-squircle ${STATUS_TONE_CLASSES[tone]}`} variant=\"outline\">\n {tone === 'busy' ? <LoaderCircle className=\"fk:size-3 fk:animate-spin\" /> : null}\n {label}\n </Badge>\n );\n}\n\nconst FILE_ICONS: { [icon in KnowledgeFileIcon]: typeof Pdf } = {\n document: Document,\n docx: Docx,\n html: Html,\n pdf: Pdf,\n pptx: Pptx,\n txt: Txt,\n};\n\n/** The document's format as its file icon; the format's name is what a screen reader hears. */\nexport function KnowledgeTypeIcon({\n className = '',\n size = 24,\n source,\n}: {\n className?: string;\n size?: number;\n source: Pick<KnowledgeSource, 'kind' | 'mimeType'>;\n}): JSX.Element {\n const format = getKnowledgeFormat(source);\n const Icon = FILE_ICONS[format.icon];\n\n return (\n <span\n aria-label={format.label}\n className={`fk:flex fk:shrink-0 fk:items-center fk:justify-center ${className}`}\n data-knowledge-type={format.icon}\n role=\"img\"\n >\n <Icon size={size} />\n </span>\n );\n}\n\n/** The larger file icon of the document page and the record panel: the same icon as the list, at 40px. */\nexport function SourceIcon({ source }: { source: Pick<KnowledgeSource, 'kind' | 'mimeType'> }): JSX.Element {\n return <KnowledgeTypeIcon size={40} source={source} />;\n}\n\nexport function InfiniteScrollSentinel({ onVisible }: { onVisible: () => void }): JSX.Element {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const onVisibleRef = useRef(onVisible);\n\n onVisibleRef.current = onVisible;\n\n useEffect(() => {\n const node = sentinelRef.current;\n\n if (!node) {\n return;\n }\n\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onVisibleRef.current();\n }\n });\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return <div aria-hidden className=\"fk:h-px\" ref={sentinelRef} />;\n}\n\n/**\n * The actions of one document, behind a three-dots button: open (lists\n * only), download the original file (web pages open their address instead)\n * and remove, behind one confirmation. The list and the document page share\n * it so the copy, the download link and the busy rules stay the same.\n */\nexport function SourceActionsMenu({\n isBusy = false,\n onOpen,\n onRemoved,\n source,\n trigger = 'row',\n}: {\n /** Another action on the document is in flight; removing waits for it. */\n isBusy?: boolean;\n /** Offered as the first item when given (the document page is already open). */\n onOpen?: () => void;\n /** The document is gone: drop it from the list, or leave its page. The list invalidation is done here. */\n onRemoved: () => void;\n source: KnowledgeSource;\n /** How the button looks: a quiet icon in a row or card, an outlined one next to page actions. */\n trigger?: 'row' | 'page';\n}): JSX.Element | null {\n const { api, projectId } = useProjectKnowledge();\n const canMutate = useCanMutate();\n const [isConfirmingRemoval, setIsConfirmingRemoval] = useState(false);\n const [isRemoving, setIsRemoving] = useState(false);\n\n if (!api || !projectId) {\n return null;\n }\n\n const knowledgeApi = api;\n\n async function remove(): Promise<void> {\n setIsRemoving(true);\n\n try {\n await knowledgeApi.deleteSource(source.id);\n toast.success(`Removed \"${source.title}\".`);\n setIsConfirmingRemoval(false);\n onRemoved();\n void invalidateKnowledgeLists();\n } catch (removeError) {\n toast.error(describeApiError(removeError, 'The document could not be removed.'));\n } finally {\n setIsRemoving(false);\n }\n }\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${source.title}`}\n className={trigger === 'row' ? 'fk:size-8 fk:shrink-0 fk:text-muted-foreground' : undefined}\n data-knowledge-menu\n size=\"icon-sm\"\n variant={trigger === 'row' ? 'ghost' : 'outline'}\n >\n <EllipsisVerticalIcon className=\"fk:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onOpen ? <DropdownMenuItem onSelect={onOpen}>Open</DropdownMenuItem> : null}\n {source.path ? (\n <DropdownMenuItem asChild>\n <a href={knowledgePaths(projectId).file(source.id)}>\n <DownloadIcon />\n Download\n </a>\n </DropdownMenuItem>\n ) : null}\n {source.originUrl ? (\n <DropdownMenuItem asChild>\n <a href={source.originUrl} rel=\"noreferrer\" target=\"_blank\">\n <ExternalLinkIcon />\n Open page\n </a>\n </DropdownMenuItem>\n ) : null}\n {onOpen || source.path || source.originUrl ? <DropdownMenuSeparator /> : null}\n <DropdownMenuItem\n disabled={!canMutate || isBusy}\n variant=\"destructive\"\n onSelect={() => setIsConfirmingRemoval(true)}\n >\n <Trash2Icon />\n Remove\n </DropdownMenuItem>\n {canMutate ? null : (\n <DropdownMenuLabel className=\"fk:max-w-56 fk:whitespace-normal fk:text-xs fk:font-normal fk:text-muted-foreground\">\n Your member role cannot remove documents.\n </DropdownMenuLabel>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n <AlertDialog open={isConfirmingRemoval} onOpenChange={setIsConfirmingRemoval}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remove this document?</AlertDialogTitle>\n <AlertDialogDescription>\n \"{source.title}\" and its indexed passages are deleted for everyone. Answers the agent gave earlier keep\n their citations, but the document can no longer be opened.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isRemoving}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n disabled={isRemoving}\n onClick={(event: MouseEvent) => {\n event.preventDefault();\n void remove();\n }}\n >\n {isRemoving ? <LoaderCircle className=\"fk:animate-spin\" /> : null}\n Remove document\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {r,s,t}from'./chunk-L5T56MRH.js';import {l,b,c as c$1,e,f,g,h,j,i}from'./chunk-5JUG4BEF.js';import {c,a}from'./chunk-X3SHNHHM.js';import {CirclePlus,Check}from'lucide-react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function w({column:s$1,title:i$1,options:d}){let r$1=new Set(s$1?.getFilterValue());return jsxs(r,{children:[jsx(s,{asChild:true,children:jsxs(c,{variant:"outline",size:"sm",className:"fk:h-8 fk:border-dashed",children:[jsx(CirclePlus,{className:"fk:mr-2 fk:h-4 fk:w-4"}),i$1,r$1?.size>0&&jsxs(Fragment,{children:[jsx(l,{orientation:"vertical",className:"fk:mx-2 fk:h-4"}),jsx(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle",children:r$1.size}),jsx("div",{className:"fk:space-x-1 fk:lg:flex",children:r$1.size>2?jsxs(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle",children:[r$1.size," selected"]}):d.filter(a=>r$1.has(a.value)).map(a=>jsx(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle",children:a.label},a.value))})]})]})}),jsx(t,{className:"fk:w-50 fk:p-0",align:"start",children:jsxs(c$1,{children:[jsx(e,{placeholder:i$1}),jsxs(f,{children:[jsx(g,{children:"No results found."}),jsx(h,{children:d.map(a$1=>{let m=r$1.has(a$1.value);return jsxs(j,{onSelect:()=>{m?r$1.delete(a$1.value):r$1.add(a$1.value);let c=Array.from(r$1);s$1?.setFilterValue(c.length?c:void 0);},children:[jsx("div",{className:a("fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle",m?"fk:bg-primary fk:text-primary-foreground":"fk:opacity-50 fk:[&_svg]:invisible"),children:jsx(Check,{className:a("fk:size-3.5",m?"fk:text-primary-foreground":"fk:text-muted-foreground")})}),a$1.icon&&jsx(a$1.icon,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground"}),jsx("span",{children:a$1.label})]},a$1.value)})}),r$1.size>0&&jsxs(Fragment,{children:[jsx(i,{}),jsx(h,{children:jsx(j,{onSelect:()=>s$1?.setFilterValue(void 0),className:"fk:justify-center fk:text-center",children:"Clear filters"})})]})]})]})})]})}export{w as a};//# sourceMappingURL=chunk-S26WK6RF.js.map
2
+ //# sourceMappingURL=chunk-S26WK6RF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data-grid/data-table-faceted-filter.tsx"],"names":["DataTableFacetedFilter","column","title","options","selectedValues","jsxs","Popover","jsx","PopoverTrigger","Button","CirclePlusIcon","Fragment","Separator","Badge","option","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","filterValues","cn","CheckIcon","CommandSeparator"],"mappings":"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","file":"chunk-54AXLGAK.js","sourcesContent":["import * as React from 'react';\nimport { Check as CheckIcon, CirclePlus as CirclePlusIcon } from 'lucide-react';\nimport { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport { Badge } from '../ui/primitives/badge';\nimport { Button } from '../ui/primitives/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../ui/primitives/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/primitives/popover';\nimport { Separator } from '../ui/primitives/separator';\n\ninterface DataTableFacetedFilterProps<TData, TValue> {\n column?: Column<TData, TValue>;\n title?: string;\n options: {\n label: string;\n value: string;\n icon?: React.ComponentType<{ className?: string }>;\n }[];\n}\n\nexport function DataTableFacetedFilter<TData, TValue>({\n column,\n title,\n options,\n}: DataTableFacetedFilterProps<TData, TValue>) {\n const selectedValues = new Set(column?.getFilterValue() as string[]);\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"fk:h-8 fk:border-dashed\">\n <CirclePlusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n {title}\n {selectedValues?.size > 0 && (\n <>\n <Separator orientation=\"vertical\" className=\"fk:mx-2 fk:h-4\" />\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle\">\n {selectedValues.size}\n </Badge>\n <div className=\"fk:space-x-1 fk:lg:flex\">\n {selectedValues.size > 2 ? (\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {selectedValues.size} selected\n </Badge>\n ) : (\n options\n .filter((option) => selectedValues.has(option.value))\n .map((option) => (\n <Badge variant=\"secondary\" key={option.value} className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {option.label}\n </Badge>\n ))\n )}\n </div>\n </>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"fk:w-50 fk:p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={title} />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = selectedValues.has(option.value);\n return (\n <CommandItem\n key={option.value}\n onSelect={() => {\n if (isSelected) {\n selectedValues.delete(option.value);\n } else {\n selectedValues.add(option.value);\n }\n const filterValues = Array.from(selectedValues);\n column?.setFilterValue(filterValues.length ? filterValues : undefined);\n }}\n >\n <div\n className={cn(\n 'fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle',\n isSelected ? 'fk:bg-primary fk:text-primary-foreground' : 'fk:opacity-50 fk:[&_svg]:invisible'\n )}\n >\n <CheckIcon\n className={cn(\n 'fk:size-3.5',\n isSelected ? 'fk:text-primary-foreground' : 'fk:text-muted-foreground'\n )}\n />\n </div>\n {option.icon && <option.icon className=\"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground\" />}\n <span>{option.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n {selectedValues.size > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => column?.setFilterValue(undefined)}\n className=\"fk:justify-center fk:text-center\"\n >\n Clear filters\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/data-grid/data-table-faceted-filter.tsx"],"names":["DataTableFacetedFilter","column","title","options","selectedValues","jsxs","Popover","jsx","PopoverTrigger","Button","CirclePlusIcon","Fragment","Separator","Badge","option","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","filterValues","cn","CheckIcon","CommandSeparator"],"mappings":"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","file":"chunk-S26WK6RF.js","sourcesContent":["import * as React from 'react';\nimport { Check as CheckIcon, CirclePlus as CirclePlusIcon } from 'lucide-react';\nimport { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport { Badge } from '../ui/primitives/badge';\nimport { Button } from '../ui/primitives/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../ui/primitives/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/primitives/popover';\nimport { Separator } from '../ui/primitives/separator';\n\ninterface DataTableFacetedFilterProps<TData, TValue> {\n column?: Column<TData, TValue>;\n title?: string;\n options: {\n label: string;\n value: string;\n icon?: React.ComponentType<{ className?: string }>;\n }[];\n}\n\nexport function DataTableFacetedFilter<TData, TValue>({\n column,\n title,\n options,\n}: DataTableFacetedFilterProps<TData, TValue>) {\n const selectedValues = new Set(column?.getFilterValue() as string[]);\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"fk:h-8 fk:border-dashed\">\n <CirclePlusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n {title}\n {selectedValues?.size > 0 && (\n <>\n <Separator orientation=\"vertical\" className=\"fk:mx-2 fk:h-4\" />\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle\">\n {selectedValues.size}\n </Badge>\n <div className=\"fk:space-x-1 fk:lg:flex\">\n {selectedValues.size > 2 ? (\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {selectedValues.size} selected\n </Badge>\n ) : (\n options\n .filter((option) => selectedValues.has(option.value))\n .map((option) => (\n <Badge variant=\"secondary\" key={option.value} className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {option.label}\n </Badge>\n ))\n )}\n </div>\n </>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"fk:w-50 fk:p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={title} />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = selectedValues.has(option.value);\n return (\n <CommandItem\n key={option.value}\n onSelect={() => {\n if (isSelected) {\n selectedValues.delete(option.value);\n } else {\n selectedValues.add(option.value);\n }\n const filterValues = Array.from(selectedValues);\n column?.setFilterValue(filterValues.length ? filterValues : undefined);\n }}\n >\n <div\n className={cn(\n 'fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle',\n isSelected ? 'fk:bg-primary fk:text-primary-foreground' : 'fk:opacity-50 fk:[&_svg]:invisible'\n )}\n >\n <CheckIcon\n className={cn(\n 'fk:size-3.5',\n isSelected ? 'fk:text-primary-foreground' : 'fk:text-muted-foreground'\n )}\n />\n </div>\n {option.icon && <option.icon className=\"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground\" />}\n <span>{option.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n {selectedValues.size > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => column?.setFilterValue(undefined)}\n className=\"fk:justify-center fk:text-center\"\n >\n Clear filters\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {q as q$1,o,r}from'./chunk-KR27GOH6.js';import {f}from'./chunk-HZOD2HOF.js';import {d}from'./chunk-WPCPL2TQ.js';import {useCallback}from'react';import {toast}from'sonner';import {useApolloClient}from'@apollo/client/react';function E(i){let{currentProjectSchema:t}=f();return useCallback(a=>{t&&q$1(o(i,t),a);},[i,t])}var g=["image/jpeg","image/png","image/webp","image/vnd.microsoft.icon","image/bmp","image/gif","image/tiff","image/svg+xml","image/avif","image/heic","image/heif","image/heic-sequence","image/heif-sequence","image/apng","audio/aac","audio/mpeg","audio/wav","audio/webm","audio/midi","audio/x-midi","audio/ogg","video/x-msvideo","video/mp4","video/mpeg","video/webm","video/quicktime","video/ogg","video/mp2t","video/3gpp","video/3gpp2","application/x-7z-compressed","application/zip","application/vnd.amazon.ebook","application/octet-stream","application/epub+zip","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-fontobject","application/gzip","application/x-gzip","application/java-archive","application/json","application/ld+json","text/javascript","application/vnd.oasis.opendocument.presentation","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.text","application/ogg","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.rar","application/x-tar","application/vnd.visio","application/xhtml+xml","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/xml"];function F(i,t){if(!i.type)return true;let a=t?t.split(",").map(e=>e.trim()).filter(Boolean):g;return a.length===0?true:a.some(e=>e.endsWith("/*")?i.type.startsWith(e.slice(0,-1)):i.type===e)}async function x(i,t){let a=new URLSearchParams({filename:i.name}),e=await fetch(`${d(t).assets}?${a.toString()}`,{method:"POST",headers:{"Content-Type":i.type||"application/octet-stream"},body:i});if(!e.ok)throw new Error(`Upload failed for ${i.name}`);let n=await e.json(),o={_id:n._id,path:n.path??"",originalFilename:n.originalFilename??i.name,size:n.size??i.size,mimeType:n.mimeType??i.type,lqip:n.lqip??"",width:n.width??0,height:n.height??0};return {pathname:o.path,lqip:o.lqip||void 0,originalFilename:o.originalFilename,size:o.size,mimeType:o.mimeType,width:o.width||void 0,height:o.height||void 0,_id:o._id,asset:o}}async function h(i,t){let{projectId:a,accept:e,maxBytes:n=4*1024*1024,onUploadStart:o}=t,l=[];for(let p of Array.from(i)){if(p.size>n){toast.error(`File size too big (max ${(n/(1024*1024)).toFixed(0)}MB): ${p.name}`);continue}if(!F(p,e)){toast.error(`Unsupported file type: ${p.name}`);continue}l.push(p);}if(l.length===0)return [];o?.();try{let p=await Promise.all(l.map(async f=>x(f,a)));return p.length>0&&toast.success(`Uploaded ${p.length} file${p.length>1?"s":""}`),p}catch(p){return console.error(p),toast.error("Upload failed. Please try again."),[]}}async function b(i){let{accept:t,multiple:a=true}=i,e=document.createElement("input");e.type="file",e.accept=t??g.join(","),e.multiple=a,e.style.display="none",document.body.appendChild(e);try{let n=await new Promise(o=>{e.addEventListener("change",()=>o(e.files),{once:!0}),e.addEventListener("cancel",()=>o(null),{once:!0}),e.click();});return !n||n.length===0?[]:h(n,i)}finally{document.body.removeChild(e);}}function q(){let i=useApolloClient();return useCallback(async t=>{let a=t.files?await h(t.files,t):await b(t);return a.length>0&&await r(i,"GetAssets").catch(e=>{console.error("Error refreshing asset lists after upload:",e);}),a},[i])}export{E as a,x as b,q as c};//# sourceMappingURL=chunk-ONB3FWK5.js.map
2
- //# sourceMappingURL=chunk-ONB3FWK5.js.map
1
+ import'./index.css';import {q as q$1,o,r}from'./chunk-CFYO546Y.js';import {f}from'./chunk-6I7D2JBA.js';import {d}from'./chunk-MBBE4RND.js';import {useCallback}from'react';import {toast}from'sonner';import {useApolloClient}from'@apollo/client/react';function E(i){let{currentProjectSchema:t}=f();return useCallback(a=>{t&&q$1(o(i,t),a);},[i,t])}var g=["image/jpeg","image/png","image/webp","image/vnd.microsoft.icon","image/bmp","image/gif","image/tiff","image/svg+xml","image/avif","image/heic","image/heif","image/heic-sequence","image/heif-sequence","image/apng","audio/aac","audio/mpeg","audio/wav","audio/webm","audio/midi","audio/x-midi","audio/ogg","video/x-msvideo","video/mp4","video/mpeg","video/webm","video/quicktime","video/ogg","video/mp2t","video/3gpp","video/3gpp2","application/x-7z-compressed","application/zip","application/vnd.amazon.ebook","application/octet-stream","application/epub+zip","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-fontobject","application/gzip","application/x-gzip","application/java-archive","application/json","application/ld+json","text/javascript","application/vnd.oasis.opendocument.presentation","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.text","application/ogg","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.rar","application/x-tar","application/vnd.visio","application/xhtml+xml","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/xml"];function F(i,t){if(!i.type)return true;let a=t?t.split(",").map(e=>e.trim()).filter(Boolean):g;return a.length===0?true:a.some(e=>e.endsWith("/*")?i.type.startsWith(e.slice(0,-1)):i.type===e)}async function x(i,t){let a=new URLSearchParams({filename:i.name}),e=await fetch(`${d(t).assets}?${a.toString()}`,{method:"POST",headers:{"Content-Type":i.type||"application/octet-stream"},body:i});if(!e.ok)throw new Error(`Upload failed for ${i.name}`);let n=await e.json(),o={_id:n._id,path:n.path??"",originalFilename:n.originalFilename??i.name,size:n.size??i.size,mimeType:n.mimeType??i.type,lqip:n.lqip??"",width:n.width??0,height:n.height??0};return {pathname:o.path,lqip:o.lqip||void 0,originalFilename:o.originalFilename,size:o.size,mimeType:o.mimeType,width:o.width||void 0,height:o.height||void 0,_id:o._id,asset:o}}async function h(i,t){let{projectId:a,accept:e,maxBytes:n=4*1024*1024,onUploadStart:o}=t,l=[];for(let p of Array.from(i)){if(p.size>n){toast.error(`File size too big (max ${(n/(1024*1024)).toFixed(0)}MB): ${p.name}`);continue}if(!F(p,e)){toast.error(`Unsupported file type: ${p.name}`);continue}l.push(p);}if(l.length===0)return [];o?.();try{let p=await Promise.all(l.map(async f=>x(f,a)));return p.length>0&&toast.success(`Uploaded ${p.length} file${p.length>1?"s":""}`),p}catch(p){return console.error(p),toast.error("Upload failed. Please try again."),[]}}async function b(i){let{accept:t,multiple:a=true}=i,e=document.createElement("input");e.type="file",e.accept=t??g.join(","),e.multiple=a,e.style.display="none",document.body.appendChild(e);try{let n=await new Promise(o=>{e.addEventListener("change",()=>o(e.files),{once:!0}),e.addEventListener("cancel",()=>o(null),{once:!0}),e.click();});return !n||n.length===0?[]:h(n,i)}finally{document.body.removeChild(e);}}function q(){let i=useApolloClient();return useCallback(async t=>{let a=t.files?await h(t.files,t):await b(t);return a.length>0&&await r(i,"GetAssets").catch(e=>{console.error("Error refreshing asset lists after upload:",e);}),a},[i])}export{E as a,x as b,q as c};//# sourceMappingURL=chunk-S7VNSSIK.js.map
2
+ //# sourceMappingURL=chunk-S7VNSSIK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-ONB3FWK5.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-S7VNSSIK.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a,c}from'./chunk-X3SHNHHM.js';import {Select,Dialog}from'radix-ui';import {ChevronDownIcon,CheckIcon,ChevronUpIcon,XIcon}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';function h({...e}){return jsx(Select.Root,{"data-slot":"select",...e})}function D({...e}){return jsx(Select.Group,{"data-slot":"select-group",...e})}function w({...e}){return jsx(Select.Value,{"data-slot":"select-value",...e})}function R({className:e,size:t="default",children:n,...f}){return jsxs(Select.Trigger,{"data-slot":"select-trigger","data-size":t,className:a("fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-2 fk:rounded-md fk:border fk:border-input fk:bg-background fk:px-3 fk:py-2 fk:text-sm fk:whitespace-nowrap fk:shadow-xs fk:transition-[color,box-shadow] fk:outline-none fk:focus-visible:border-ring fk:focus-visible:ring-[3px] fk:focus-visible:ring-ring/50 fk:disabled:cursor-not-allowed fk:disabled:opacity-50 fk:aria-invalid:border-destructive fk:aria-invalid:ring-destructive/20 fk:data-placeholder:text-muted-foreground fk:data-[size=default]:h-9 fk:data-[size=sm]:h-8 fk:*:data-[slot=select-value]:line-clamp-1 fk:*:data-[slot=select-value]:flex fk:*:data-[slot=select-value]:items-center fk:*:data-[slot=select-value]:gap-2 fk:hover:bg-accent fk:dark:aria-invalid:ring-destructive/40 fk:*[_svg]:pointer-events-none fk:*[_svg]:shrink-0 fk:*[_svg:not([class*='size-'])]:size-4 fk:*[_svg:not([class*='text-'])]:text-muted-foreground fk:corner-squircle",e),...f,children:[n,jsx(Select.Icon,{asChild:true,children:jsx(ChevronDownIcon,{className:"fk:size-4 fk:opacity-50"})})]})}function z({className:e,children:t,position:n="item-aligned",align:f="center",...p}){return jsx(Select.Portal,{children:jsxs(Select.Content,{"data-slot":"select-content",className:a("fk:relative fk:z-50 fk:max-h-(--radix-select-content-available-height) fk:min-w-[8rem] fk:origin-(--radix-select-content-transform-origin) fk:overflow-x-hidden fk:overflow-y-auto fk:rounded-md fk:border fk:bg-popover fk:text-popover-foreground fk:shadow-md fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle",n==="popper"&&"fk:data-[side=bottom]:translate-y-1 fk:data-[side=left]:-translate-x-1 fk:data-[side=right]:translate-x-1 fk:data-[side=top]:-translate-y-1",e),position:n,align:f,...p,children:[jsx(g,{}),jsx(Select.Viewport,{className:a("fk:p-1",n==="popper"&&"fk:h-(--radix-select-trigger-height) fk:w-full fk:min-w-(--radix-select-trigger-width) fk:scroll-my-1"),children:t}),jsx(v,{})]})})}function N({className:e,...t}){return jsx(Select.Label,{"data-slot":"select-label",className:a("fk:px-2 fk:py-1.5 fk:text-xs fk:text-muted-foreground",e),...t})}function I({className:e,children:t,...n}){return jsxs(Select.Item,{"data-slot":"select-item",className:a("fk:relative fk:flex fk:w-full fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-8 fk:pl-2 fk:text-sm fk:outline-hidden fk:select-none fk:hover:bg-accent fk:hover:text-accent-foreground fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-[disabled]:pointer-events-none fk:data-[disabled]:opacity-50 fk:*[_svg]:pointer-events-none fk:*[_svg]:shrink-0 fk:*[_svg:not([class*='size-'])]:size-4 fk:*[_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 fk:corner-squircle",e),...n,children:[jsx("span",{"data-slot":"select-item-indicator",className:"fk:absolute fk:right-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center",children:jsx(Select.ItemIndicator,{children:jsx(CheckIcon,{className:"fk:size-4"})})}),jsx(Select.ItemText,{children:t})]})}function B({className:e,...t}){return jsx(Select.Separator,{"data-slot":"select-separator",className:a("fk:pointer-events-none fk:-mx-1 fk:my-1 fk:h-px fk:bg-border",e),...t})}function g({className:e,...t}){return jsx(Select.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:a("fk:flex fk:cursor-default fk:items-center fk:justify-center fk:py-1",e),...t,children:jsx(ChevronUpIcon,{className:"size-4"})})}function v({className:e,...t}){return jsx(Select.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:a("fk:flex fk:cursor-default fk:items-center fk:justify-center fk:py-1",e),...t,children:jsx(ChevronDownIcon,{className:"size-4"})})}function G({...e}){return jsx(Dialog.Root,{"data-slot":"dialog",...e})}function L({...e}){return jsx(Dialog.Trigger,{"data-slot":"dialog-trigger",...e})}function x({...e}){return jsx(Dialog.Portal,{"data-slot":"dialog-portal",...e})}function O({...e}){return jsx(Dialog.Close,{"data-slot":"dialog-close",...e})}function b({className:e,...t}){return jsx(Dialog.Overlay,{"data-slot":"dialog-overlay",className:a("fk:fixed fk:inset-0 fk:z-50 fk:bg-black/50 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0",e),...t})}function F({className:e,children:t,showCloseButton:n=true,...f}){return jsxs(x,{"data-slot":"dialog-portal",children:[jsx(b,{}),jsxs(Dialog.Content,{"data-slot":"dialog-content",className:a("fk:fixed fk:top-[50%] fk:left-[50%] fk:z-50 fk:grid fk:w-full fk:max-w-[calc(100%-2rem)] fk:translate-x-[-50%] fk:translate-y-[-50%] fk:gap-4 fk:rounded-lg fk:border fk:bg-background fk:p-6 fk:shadow-lg fk:duration-200 fk:outline-none fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:sm:max-w-lg fk:corner-squircle",e),...f,children:[t,n&&jsxs(Dialog.Close,{"data-slot":"dialog-close",className:"fk:absolute fk:top-4 fk:right-4 fk:rounded-xs fk:opacity-70 fk:ring-offset-background fk:transition-opacity fk:hover:opacity-100 fk:focus:ring-2 fk:focus:ring-ring fk:focus:ring-offset-2 fk:focus:outline-hidden fk:disabled:pointer-events-none fk:data-[state=open]:bg-accent fk:data-[state=open]:text-muted-foreground fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle",children:[jsx(XIcon,{}),jsx("span",{className:"fk:sr-only",children:"Close"})]})]})]})}function H({className:e,...t}){return jsx("div",{"data-slot":"dialog-header",className:a("fk:flex fk:flex-col fk:gap-2 fk:text-center fk:sm:text-left",e),...t})}function X({className:e,showCloseButton:t=false,children:n,...f}){return jsxs("div",{"data-slot":"dialog-footer",className:a("fk:flex fk:flex-col-reverse fk:gap-2 fk:sm:flex-row fk:sm:justify-end",e),...f,children:[n,t&&jsx(Dialog.Close,{asChild:true,children:jsx(c,{variant:"outline",children:"Close"})})]})}function A({className:e,...t}){return jsx(Dialog.Title,{"data-slot":"dialog-title",className:a("fk:text-lg fk:leading-none fk:font-semibold fk:text-left",e),...t})}function E({className:e,...t}){return jsx(Dialog.Description,{"data-slot":"dialog-description",className:a("fk:text-sm fk:text-muted-foreground fk:text-left",e),...t})}export{h as a,D as b,w as c,R as d,z as e,N as f,I as g,B as h,g as i,v as j,G as k,L as l,x as m,O as n,b as o,F as p,H as q,X as r,A as s,E as t};//# sourceMappingURL=chunk-S7Z6KKIN.js.map
2
+ //# sourceMappingURL=chunk-S7Z6KKIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/primitives/select.tsx","../src/ui/primitives/dialog.tsx"],"names":["Select","props","jsx","SelectPrimitive","SelectGroup","SelectValue","SelectTrigger","className","size","children","jsxs","cn","ChevronDownIcon","SelectContent","position","align","SelectScrollUpButton","SelectScrollDownButton","SelectLabel","SelectItem","CheckIcon","SelectSeparator","ChevronUpIcon","Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","DialogContent","showCloseButton","XIcon","DialogHeader","DialogFooter","Button","DialogTitle","DialogDescription"],"mappings":"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","file":"chunk-S7Z6KKIN.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Select as SelectPrimitive } from 'radix-ui';\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: 'sm' | 'default';\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-2 fk:rounded-md fk:border fk:border-input fk:bg-background fk:px-3 fk:py-2 fk:text-sm fk:whitespace-nowrap fk:shadow-xs fk:transition-[color,box-shadow] fk:outline-none fk:focus-visible:border-ring fk:focus-visible:ring-[3px] fk:focus-visible:ring-ring/50 fk:disabled:cursor-not-allowed fk:disabled:opacity-50 fk:aria-invalid:border-destructive fk:aria-invalid:ring-destructive/20 fk:data-placeholder:text-muted-foreground fk:data-[size=default]:h-9 fk:data-[size=sm]:h-8 fk:*:data-[slot=select-value]:line-clamp-1 fk:*:data-[slot=select-value]:flex fk:*:data-[slot=select-value]:items-center fk:*:data-[slot=select-value]:gap-2 fk:hover:bg-accent fk:dark:aria-invalid:ring-destructive/40 fk:*[_svg]:pointer-events-none fk:*[_svg]:shrink-0 fk:*[_svg:not([class*='size-'])]:size-4 fk:*[_svg:not([class*='text-'])]:text-muted-foreground fk:corner-squircle\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"fk:size-4 fk:opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'item-aligned',\n align = 'center',\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n 'fk:relative fk:z-50 fk:max-h-(--radix-select-content-available-height) fk:min-w-[8rem] fk:origin-(--radix-select-content-transform-origin) fk:overflow-x-hidden fk:overflow-y-auto fk:rounded-md fk:border fk:bg-popover fk:text-popover-foreground fk:shadow-md fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle',\n position === 'popper' &&\n 'fk:data-[side=bottom]:translate-y-1 fk:data-[side=left]:-translate-x-1 fk:data-[side=right]:translate-x-1 fk:data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'fk:p-1',\n position === 'popper' &&\n 'fk:h-(--radix-select-trigger-height) fk:w-full fk:min-w-(--radix-select-trigger-width) fk:scroll-my-1'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('fk:px-2 fk:py-1.5 fk:text-xs fk:text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"fk:relative fk:flex fk:w-full fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-8 fk:pl-2 fk:text-sm fk:outline-hidden fk:select-none fk:hover:bg-accent fk:hover:text-accent-foreground fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-[disabled]:pointer-events-none fk:data-[disabled]:opacity-50 fk:*[_svg]:pointer-events-none fk:*[_svg]:shrink-0 fk:*[_svg:not([class*='size-'])]:size-4 fk:*[_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 fk:corner-squircle\",\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"fk:absolute fk:right-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"fk:size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('fk:pointer-events-none fk:-mx-1 fk:my-1 fk:h-px fk:bg-border', className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn('fk:flex fk:cursor-default fk:items-center fk:justify-center fk:py-1', className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn('fk:flex fk:cursor-default fk:items-center fk:justify-center fk:py-1', className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","'use client';\n\nimport * as React from 'react';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { XIcon } from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport { Button } from './button';\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fk:fixed fk:inset-0 fk:z-50 fk:bg-black/50 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'fk:fixed fk:top-[50%] fk:left-[50%] fk:z-50 fk:grid fk:w-full fk:max-w-[calc(100%-2rem)] fk:translate-x-[-50%] fk:translate-y-[-50%] fk:gap-4 fk:rounded-lg fk:border fk:bg-background fk:p-6 fk:shadow-lg fk:duration-200 fk:outline-none fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:sm:max-w-lg fk:corner-squircle',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"fk:absolute fk:top-4 fk:right-4 fk:rounded-xs fk:opacity-70 fk:ring-offset-background fk:transition-opacity fk:hover:opacity-100 fk:focus:ring-2 fk:focus:ring-ring fk:focus:ring-offset-2 fk:focus:outline-hidden fk:disabled:pointer-events-none fk:data-[state=open]:bg-accent fk:data-[state=open]:text-muted-foreground fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle\"\n >\n <XIcon />\n <span className=\"fk:sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('fk:flex fk:flex-col fk:gap-2 fk:text-center fk:sm:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n showCloseButton?: boolean;\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('fk:flex fk:flex-col-reverse fk:gap-2 fk:sm:flex-row fk:sm:justify-end', className)}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n );\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('fk:text-lg fk:leading-none fk:font-semibold fk:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('fk:text-sm fk:text-muted-foreground fk:text-left', className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n"]}
@@ -1,4 +1,4 @@
1
- import'./index.css';import {a}from'./chunk-HKN6BX5U.js';import {c}from'./chunk-WPCPL2TQ.js';import {b,c as c$1}from'./chunk-5CVDMZUI.js';import {useState,useEffect}from'react';var d="0.2.32",L={current:d,latest:d,isCurrent:true};function le(){let e=b(),[t,r]=useState(null);return useEffect(()=>{if(e)return e.onUpdateDownloaded(o=>{r(o.version);})},[e]),e?t===null?{current:e.version,latest:e.version,isCurrent:true}:{current:e.version,latest:t,isCurrent:false,upgrade:()=>e.installUpdate()}:L}var U="flexkit:telemetry",V="flexkit:error-reporting",B=/^(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)$|\.(localhost|test|local)$/i;function M(e){return e.override==="on"?true:e.override==="off"||!e.hosted||e.domain!=="flexkit.io"||e.version==="0.0.0"?false:e.isDesktop||!B.test(e.hostname)}function Y(){try{let e=a();return e?.getItem(U)??e?.getItem(V)??null}catch{return null}}function k({hosted:e}){return typeof window>"u"?false:M({hosted:e,isDesktop:!!b(),domain:c$1,hostname:window.location.hostname,version:d,override:Y()})}async function v(e,t,{keepalive:r=false}={}){return (await fetch(e,{body:t,credentials:"same-origin",headers:{"Content-Type":"application/json"},keepalive:r,method:"POST"})).status}var f={componentStack:4e3,message:2e3,name:200,path:500,stack:8e3,userAgent:500},$=10,G=6e4,K=50,z=5e3,R=/^[a-z0-9]{1,64}$/;function g(e,t){return e.length>t?e.slice(0,t):e}function J(e){let t=e;try{/^[a-z][a-z0-9+.-]*:/i.test(e)&&(t=new URL(e).pathname);}catch{}return g(t.split(/[?#]/)[0]??"",f.path)}function H(e){if(e instanceof Error)return {name:e.name||"Error",message:typeof e.message=="string"?e.message:"",stack:typeof e.stack=="string"?e.stack:void 0};if(typeof e=="string")return {name:"Error",message:e};if(e==null)return {name:"Error",message:`Non-Error thrown: ${String(e)}`};if(typeof e=="object"){let t=e.constructor?.name;return {name:"Error",message:`Non-Error thrown: ${typeof t=="string"&&t?t:"object"}`}}return {name:"Error",message:`Non-Error thrown: ${typeof e}`}}var X=[/ResizeObserver loop (limit exceeded|completed with undelivered notifications)/i,/^Script error\.?$/i,/The (operation|user) (was )?aborted/i,/signal is aborted without reason/i],A=/\b(chrome|moz|safari(-web)?|ms-browser)-extension:\/\//i,F=/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;function Z(e){return e.replace(F,"<email>")}function q(e,t){return e.name==="AbortError"||X.some(r=>r.test(e.message))||t&&A.test(t)?true:!!(e.stack&&A.test(e.stack))}function W(e,t){let r=H(e);if(q(r,t.sourceUrl))return null;let o={source:t.source,name:g(r.name,f.name),message:g(Z(r.message),f.message),occurredAt:(t.now??new Date).toISOString()};return r.stack&&(o.stack=g(r.stack,f.stack)),t.componentStack&&(o.componentStack=g(t.componentStack,f.componentStack)),t.path&&(o.path=J(t.path)),t.projectId&&R.test(t.projectId)&&(o.projectId=t.projectId),o}function Q(e){return `${e.name}
1
+ import'./index.css';import {a}from'./chunk-HKN6BX5U.js';import {c}from'./chunk-MBBE4RND.js';import {b,c as c$1}from'./chunk-5CVDMZUI.js';import {useState,useEffect}from'react';var d="0.2.33",L={current:d,latest:d,isCurrent:true};function le(){let e=b(),[t,r]=useState(null);return useEffect(()=>{if(e)return e.onUpdateDownloaded(o=>{r(o.version);})},[e]),e?t===null?{current:e.version,latest:e.version,isCurrent:true}:{current:e.version,latest:t,isCurrent:false,upgrade:()=>e.installUpdate()}:L}var U="flexkit:telemetry",V="flexkit:error-reporting",B=/^(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)$|\.(localhost|test|local)$/i;function M(e){return e.override==="on"?true:e.override==="off"||!e.hosted||e.domain!=="flexkit.io"||e.version==="0.0.0"?false:e.isDesktop||!B.test(e.hostname)}function Y(){try{let e=a();return e?.getItem(U)??e?.getItem(V)??null}catch{return null}}function k({hosted:e}){return typeof window>"u"?false:M({hosted:e,isDesktop:!!b(),domain:c$1,hostname:window.location.hostname,version:d,override:Y()})}async function v(e,t,{keepalive:r=false}={}){return (await fetch(e,{body:t,credentials:"same-origin",headers:{"Content-Type":"application/json"},keepalive:r,method:"POST"})).status}var f={componentStack:4e3,message:2e3,name:200,path:500,stack:8e3,userAgent:500},$=10,G=6e4,K=50,z=5e3,R=/^[a-z0-9]{1,64}$/;function g(e,t){return e.length>t?e.slice(0,t):e}function J(e){let t=e;try{/^[a-z][a-z0-9+.-]*:/i.test(e)&&(t=new URL(e).pathname);}catch{}return g(t.split(/[?#]/)[0]??"",f.path)}function H(e){if(e instanceof Error)return {name:e.name||"Error",message:typeof e.message=="string"?e.message:"",stack:typeof e.stack=="string"?e.stack:void 0};if(typeof e=="string")return {name:"Error",message:e};if(e==null)return {name:"Error",message:`Non-Error thrown: ${String(e)}`};if(typeof e=="object"){let t=e.constructor?.name;return {name:"Error",message:`Non-Error thrown: ${typeof t=="string"&&t?t:"object"}`}}return {name:"Error",message:`Non-Error thrown: ${typeof e}`}}var X=[/ResizeObserver loop (limit exceeded|completed with undelivered notifications)/i,/^Script error\.?$/i,/The (operation|user) (was )?aborted/i,/signal is aborted without reason/i],A=/\b(chrome|moz|safari(-web)?|ms-browser)-extension:\/\//i,F=/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;function Z(e){return e.replace(F,"<email>")}function q(e,t){return e.name==="AbortError"||X.some(r=>r.test(e.message))||t&&A.test(t)?true:!!(e.stack&&A.test(e.stack))}function W(e,t){let r=H(e);if(q(r,t.sourceUrl))return null;let o={source:t.source,name:g(r.name,f.name),message:g(Z(r.message),f.message),occurredAt:(t.now??new Date).toISOString()};return r.stack&&(o.stack=g(r.stack,f.stack)),t.componentStack&&(o.componentStack=g(t.componentStack,f.componentStack)),t.path&&(o.path=J(t.path)),t.projectId&&R.test(t.projectId)&&(o.projectId=t.projectId),o}function Q(e){return `${e.name}
2
2
  ${e.message}
3
- ${e.stack??""}`}var ee=new TextEncoder;function P(e){return ee.encode(e).length}function te(e,t,r=G){let o=P(JSON.stringify({app:e,errors:[]})),s=[];for(let i of t.slice(0,$)){let n=P(JSON.stringify(i))+(s.length?1:0);if(o+n>r)break;o+=n,s.push(i);}return s.length===0?null:{body:JSON.stringify({app:e,errors:s}),count:s.length}}function re({app:e,send:t,getPath:r,now:o=()=>new Date,setTimer:s=(n,u)=>setTimeout(n,u),clearTimer:i=n=>clearTimeout(n)}){let n=[],u=new Set,_=0,y=null,a=null,E=false;function T(){a===null&&n.length>0&&!E&&(a=s(()=>{a=null,x();},z));}function D(l){let S=te(e,n);return S?(n.splice(0,S.count),t(S.body,{unloading:l}).then(p=>{(p===401||p===403||p===429)&&(E=true,n.length=0);}).catch(()=>{}),n.length>0):(n.shift(),n.length>0)}function x({unloading:l=false}={}){try{if(E)return;a!==null&&l&&(i(a),a=null),n.length>0&&D(l),T();}catch{}}return {report(l,S){try{if(E||_>=K)return;let p=W(l,{...S,now:o(),path:r?.(),projectId:y});if(!p)return;let b=Q(p);if(u.has(b))return;u.add(b),_+=1,n.push(p),T();}catch{}},setProjectId(l){y=l;},flush:x,pending:()=>n,dispose(){a!==null&&(i(a),a=null),E=true,n.length=0;}}}var ne=async(e,{unloading:t})=>{let r=c.clientErrors;if(t&&!b()&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{if(navigator.sendBeacon(r,new Blob([e],{type:"text/plain"})))return null}catch{}return v(r,e,{keepalive:t})},m=null;function we(e,{source:t="manual",componentStack:r}={}){m?.report(e,{source:t,componentStack:r});}function Re(e){m?.setProjectId(e);}function _e({hosted:e}){if(typeof window>"u"||m)return ()=>{};if(!k({hosted:e}))return ()=>{};let t=b(),r=re({app:{platform:t?"desktop":"web",version:d,userAgent:g(navigator.userAgent,f.userAgent)},send:ne,getPath:()=>window.location.pathname});function o(n){r.report(n.error??n.message,{source:"window",sourceUrl:n.filename});}function s(n){r.report(n.reason,{source:"unhandledrejection"});}function i(){r.flush({unloading:true});}return window.addEventListener("error",o),window.addEventListener("unhandledrejection",s),window.addEventListener("pagehide",i),m=r,()=>{window.removeEventListener("error",o),window.removeEventListener("unhandledrejection",s),window.removeEventListener("pagehide",i),r.flush({unloading:true}),r.dispose(),m===r&&(m=null);}}function oe(e){return e.event==="graph_opened"?`graph_opened:${e.projectId}`:e.event}function ie(e){let t=new Set,r=new Set;return {track(o,{onDelivered:s}={}){let i=oe(o);if(t.has(i)||r.has(i))return;t.add(i);let n=u=>{t.delete(i),u!==null&&u>=200&&u<300&&(r.add(i),s?.());};try{e(JSON.stringify(o)).then(n,()=>n(null));}catch{n(null);}}}}var w=null;function Oe(e){e.event==="graph_opened"&&!R.test(e.projectId)||w?.track(e);}var C="flexkit:desktop-launch-recorded";function se(e){try{return sessionStorage.getItem(e)==="1"}catch{return false}}function ae(e){try{sessionStorage.setItem(e,"1");}catch{}}function Ae({hosted:e}){if(!k({hosted:e}))return ()=>{};let t=ie(o=>v(c.productEvents,o,{keepalive:true})),r=b();return w=t,r&&!se(C)&&t.track({appVersion:r.version,event:"desktop_app_opened",os:r.platform},{onDelivered:()=>ae(C)}),()=>{w===t&&(w=null);}}export{le as a,we as b,Re as c,_e as d,Oe as e,Ae as f};//# sourceMappingURL=chunk-2NQ2RZ2M.js.map
4
- //# sourceMappingURL=chunk-2NQ2RZ2M.js.map
3
+ ${e.stack??""}`}var ee=new TextEncoder;function P(e){return ee.encode(e).length}function te(e,t,r=G){let o=P(JSON.stringify({app:e,errors:[]})),s=[];for(let i of t.slice(0,$)){let n=P(JSON.stringify(i))+(s.length?1:0);if(o+n>r)break;o+=n,s.push(i);}return s.length===0?null:{body:JSON.stringify({app:e,errors:s}),count:s.length}}function re({app:e,send:t,getPath:r,now:o=()=>new Date,setTimer:s=(n,u)=>setTimeout(n,u),clearTimer:i=n=>clearTimeout(n)}){let n=[],u=new Set,_=0,y=null,a=null,E=false;function T(){a===null&&n.length>0&&!E&&(a=s(()=>{a=null,x();},z));}function D(l){let S=te(e,n);return S?(n.splice(0,S.count),t(S.body,{unloading:l}).then(p=>{(p===401||p===403||p===429)&&(E=true,n.length=0);}).catch(()=>{}),n.length>0):(n.shift(),n.length>0)}function x({unloading:l=false}={}){try{if(E)return;a!==null&&l&&(i(a),a=null),n.length>0&&D(l),T();}catch{}}return {report(l,S){try{if(E||_>=K)return;let p=W(l,{...S,now:o(),path:r?.(),projectId:y});if(!p)return;let b=Q(p);if(u.has(b))return;u.add(b),_+=1,n.push(p),T();}catch{}},setProjectId(l){y=l;},flush:x,pending:()=>n,dispose(){a!==null&&(i(a),a=null),E=true,n.length=0;}}}var ne=async(e,{unloading:t})=>{let r=c.clientErrors;if(t&&!b()&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{if(navigator.sendBeacon(r,new Blob([e],{type:"text/plain"})))return null}catch{}return v(r,e,{keepalive:t})},m=null;function we(e,{source:t="manual",componentStack:r}={}){m?.report(e,{source:t,componentStack:r});}function Re(e){m?.setProjectId(e);}function _e({hosted:e}){if(typeof window>"u"||m)return ()=>{};if(!k({hosted:e}))return ()=>{};let t=b(),r=re({app:{platform:t?"desktop":"web",version:d,userAgent:g(navigator.userAgent,f.userAgent)},send:ne,getPath:()=>window.location.pathname});function o(n){r.report(n.error??n.message,{source:"window",sourceUrl:n.filename});}function s(n){r.report(n.reason,{source:"unhandledrejection"});}function i(){r.flush({unloading:true});}return window.addEventListener("error",o),window.addEventListener("unhandledrejection",s),window.addEventListener("pagehide",i),m=r,()=>{window.removeEventListener("error",o),window.removeEventListener("unhandledrejection",s),window.removeEventListener("pagehide",i),r.flush({unloading:true}),r.dispose(),m===r&&(m=null);}}function oe(e){return e.event==="graph_opened"?`graph_opened:${e.projectId}`:e.event}function ie(e){let t=new Set,r=new Set;return {track(o,{onDelivered:s}={}){let i=oe(o);if(t.has(i)||r.has(i))return;t.add(i);let n=u=>{t.delete(i),u!==null&&u>=200&&u<300&&(r.add(i),s?.());};try{e(JSON.stringify(o)).then(n,()=>n(null));}catch{n(null);}}}}var w=null;function Oe(e){e.event==="graph_opened"&&!R.test(e.projectId)||w?.track(e);}var C="flexkit:desktop-launch-recorded";function se(e){try{return sessionStorage.getItem(e)==="1"}catch{return false}}function ae(e){try{sessionStorage.setItem(e,"1");}catch{}}function Ae({hosted:e}){if(!k({hosted:e}))return ()=>{};let t=ie(o=>v(c.productEvents,o,{keepalive:true})),r=b();return w=t,r&&!se(C)&&t.track({appVersion:r.version,event:"desktop_app_opened",os:r.platform},{onDelivered:()=>ae(C)}),()=>{w===t&&(w=null);}}export{le as a,we as b,Re as c,_e as d,Oe as e,Ae as f};//# sourceMappingURL=chunk-U5XZWEPO.js.map
4
+ //# sourceMappingURL=chunk-U5XZWEPO.js.map