@flexkit/studio 0.2.24 → 0.2.25

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 (72) hide show
  1. package/dist/{chat-page-A7FG7WTN.js → chat-page-Z7HA3GSH.js} +3 -3
  2. package/dist/{chat-page-A7FG7WTN.js.map → chat-page-Z7HA3GSH.js.map} +1 -1
  3. package/dist/{chunk-3COXA5QH.js → chunk-2XQHISFR.js} +2 -2
  4. package/dist/{chunk-3COXA5QH.js.map → chunk-2XQHISFR.js.map} +1 -1
  5. package/dist/{chunk-SZOEW2TL.js → chunk-D6NOMUTD.js} +7 -7
  6. package/dist/chunk-D6NOMUTD.js.map +1 -0
  7. package/dist/{chunk-JSJZKPXU.js → chunk-IPQYDKPP.js} +3 -3
  8. package/dist/{chunk-JSJZKPXU.js.map → chunk-IPQYDKPP.js.map} +1 -1
  9. package/dist/{chunk-AKW7EKYI.js → chunk-JTUOTP5S.js} +3 -3
  10. package/dist/{chunk-AKW7EKYI.js.map → chunk-JTUOTP5S.js.map} +1 -1
  11. package/dist/{chunk-NO3AH2M3.js → chunk-OCWM45Z2.js} +3 -3
  12. package/dist/{chunk-NO3AH2M3.js.map → chunk-OCWM45Z2.js.map} +1 -1
  13. package/dist/chunk-PJ3ZOCQ3.js +2 -0
  14. package/dist/chunk-PJ3ZOCQ3.js.map +1 -0
  15. package/dist/chunk-QSTWBKPN.js +2 -0
  16. package/dist/chunk-QSTWBKPN.js.map +1 -0
  17. package/dist/{chunk-L3GBAK54.js → chunk-QW6H7OZ6.js} +3 -3
  18. package/dist/{chunk-L3GBAK54.js.map → chunk-QW6H7OZ6.js.map} +1 -1
  19. package/dist/{chunk-NSVX6HEN.js → chunk-SK7C7CGH.js} +3 -3
  20. package/dist/{chunk-NSVX6HEN.js.map → chunk-SK7C7CGH.js.map} +1 -1
  21. package/dist/{chunk-3IUKXOKF.js → chunk-SKHHYRVA.js} +2 -2
  22. package/dist/{chunk-3IUKXOKF.js.map → chunk-SKHHYRVA.js.map} +1 -1
  23. package/dist/{chunk-XV2B3W6Z.js → chunk-SRFTSMZD.js} +3 -3
  24. package/dist/{chunk-XV2B3W6Z.js.map → chunk-SRFTSMZD.js.map} +1 -1
  25. package/dist/{chunk-UBFBXBPG.js → chunk-T7N3WUV2.js} +2 -2
  26. package/dist/{chunk-UBFBXBPG.js.map → chunk-T7N3WUV2.js.map} +1 -1
  27. package/dist/{chunk-HTSMODQB.js → chunk-WO5OQNAN.js} +2 -2
  28. package/dist/{chunk-HTSMODQB.js.map → chunk-WO5OQNAN.js.map} +1 -1
  29. package/dist/{chunk-IQ2F2FFF.js → chunk-X452A7C3.js} +2 -2
  30. package/dist/{chunk-IQ2F2FFF.js.map → chunk-X452A7C3.js.map} +1 -1
  31. package/dist/{entry-RMRLV3NM.js → entry-ZII6ECS5.js} +2 -2
  32. package/dist/{entry-RMRLV3NM.js.map → entry-ZII6ECS5.js.map} +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/{list-GVATECOW.js → list-76SBWKGF.js} +2 -2
  35. package/dist/{list-GVATECOW.js.map → list-76SBWKGF.js.map} +1 -1
  36. package/dist/{list-HR55TZQX.js → list-YIIXASZF.js} +3 -3
  37. package/dist/{list-HR55TZQX.js.map → list-YIIXASZF.js.map} +1 -1
  38. package/dist/pages-N3IGHP7Y.js +5 -0
  39. package/dist/pages-N3IGHP7Y.js.map +1 -0
  40. package/dist/plugin-pages-MLF2FUBT.js +2 -0
  41. package/dist/{plugin-pages-BS2IMNRU.js.map → plugin-pages-MLF2FUBT.js.map} +1 -1
  42. package/dist/record-links-66T2CJRM.js +2 -0
  43. package/dist/{record-links-2QWJFFZF.js.map → record-links-66T2CJRM.js.map} +1 -1
  44. package/dist/{root-JWXXF653.js → root-6Y5RN4PW.js} +3 -3
  45. package/dist/{root-JWXXF653.js.map → root-6Y5RN4PW.js.map} +1 -1
  46. package/dist/{root-E35GZ7SV.js → root-BRC7XSCT.js} +3 -3
  47. package/dist/{root-E35GZ7SV.js.map → root-BRC7XSCT.js.map} +1 -1
  48. package/dist/{root-ZCXGZCUT.js → root-FGVYUZZ6.js} +2 -2
  49. package/dist/{root-ZCXGZCUT.js.map → root-FGVYUZZ6.js.map} +1 -1
  50. package/dist/{root-GAB2SFFF.js → root-MDKGJJB4.js} +2 -2
  51. package/dist/{root-GAB2SFFF.js.map → root-MDKGJJB4.js.map} +1 -1
  52. package/dist/root-RD5VRALH.js +2 -0
  53. package/dist/{root-U52KZQSD.js.map → root-RD5VRALH.js.map} +1 -1
  54. package/dist/{root-54BI6S4V.js → root-UKGHRHON.js} +3 -3
  55. package/dist/{root-54BI6S4V.js.map → root-UKGHRHON.js.map} +1 -1
  56. package/dist/{search-IOYOKT6M.js → search-IM2VPW6O.js} +2 -2
  57. package/dist/{search-IOYOKT6M.js.map → search-IM2VPW6O.js.map} +1 -1
  58. package/dist/skills-pages-LZCCHOJB.js +2 -0
  59. package/dist/skills-pages-LZCCHOJB.js.map +1 -0
  60. package/dist/{source-3YZNNITL.js → source-ZLZHE7TL.js} +2 -2
  61. package/dist/{source-3YZNNITL.js.map → source-ZLZHE7TL.js.map} +1 -1
  62. package/package.json +3 -3
  63. package/dist/chunk-I6Z3WLAX.js +0 -2
  64. package/dist/chunk-I6Z3WLAX.js.map +0 -1
  65. package/dist/chunk-SZOEW2TL.js.map +0 -1
  66. package/dist/pages-OJYYLSI3.js +0 -5
  67. package/dist/pages-OJYYLSI3.js.map +0 -1
  68. package/dist/plugin-pages-BS2IMNRU.js +0 -2
  69. package/dist/record-links-2QWJFFZF.js +0 -2
  70. package/dist/root-U52KZQSD.js +0 -2
  71. package/dist/skills-pages-MA6JLBB4.js +0 -2
  72. package/dist/skills-pages-MA6JLBB4.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/use-studio-version.ts","../src/core/telemetry.ts","../src/core/error/error-reporter.ts","../src/core/analytics/product-events.ts"],"names":["STUDIO_VERSION","WEB_VERSION","useStudioVersion","desktop","getDesktop","downloaded","setDownloaded","useState","useEffect","update","TELEMETRY_STORAGE_KEY","LEGACY_TELEMETRY_STORAGE_KEY","LOCAL_HOSTNAME","isTelemetryEnabled","env","readOverride","storage","getLocalStorage","isStudioTelemetryEnabled","hosted","flexkitDomain","postToUserApi","path","body","keepalive","LIMITS","MAX_ERRORS_PER_REPORT","MAX_REPORT_BYTES","MAX_ERRORS_PER_SESSION","FLUSH_INTERVAL_MS","PROJECT_ID_PATTERN","truncate","value","max","toReportPath","pathOrUrl","describeError","error","constructorName","NOISE_MESSAGES","EXTENSION_URL","EMAIL_ADDRESS","maskMessage","message","isNoiseError","details","sourceUrl","pattern","buildClientError","options","entry","errorKey","encoder","byteLength","buildReportBody","app","queue","maxBytes","size","errors","errorSize","createErrorReporter","send","getPath","now","setTimer","callback","ms","clearTimer","timer","seen","accepted","projectId","stopped","schedule","flush","sendNext","unloading","next","status","key","id","sendReportToBff","url","userApiPaths","installed","reportStudioError","source","componentStack","setErrorReportingProjectId","installErrorReporter","reporter","onError","event","onUnhandledRejection","onPageHide","productEventKey","studioEvent","createProductEventTracker","pending","delivered","onDelivered","settle","tracker","trackStudioEvent","DESKTOP_LAUNCH_STORAGE_KEY","readSessionFlag","writeSessionFlag","installProductEvents","current"],"mappings":"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","file":"chunk-L3GBAK54.js","sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { getDesktop } from './desktop';\n\nexport interface StudioVersion {\n current: string;\n latest: string;\n isCurrent: boolean;\n /** Applies the newer version (the desktop app restarts into it); undefined when there is nothing to apply. */\n upgrade?: () => void;\n}\n\n// `@flexkit/studio`'s own version, inlined at build time; a build without the\n// define (tests, tooling) shows a placeholder.\nexport const STUDIO_VERSION = typeof __STUDIO_VERSION__ === 'string' ? __STUDIO_VERSION__ : '0.0.0';\nconst WEB_VERSION: StudioVersion = { current: STUDIO_VERSION, latest: STUDIO_VERSION, isCurrent: true };\n\n/**\n * The Studio version shown in the app bar. The web Studio is always current\n * (the hosted Studio deploys with the packages); the desktop app reports its\n * own version and the update it has downloaded, if any.\n */\nexport function useStudioVersion(): StudioVersion {\n const desktop = getDesktop();\n const [downloaded, setDownloaded] = useState<string | null>(null);\n\n useEffect(() => {\n if (!desktop) {\n return;\n }\n\n return desktop.onUpdateDownloaded((update) => {\n setDownloaded(update.version);\n });\n }, [desktop]);\n\n if (!desktop) {\n return WEB_VERSION;\n }\n\n if (downloaded === null) {\n return { current: desktop.version, latest: desktop.version, isCurrent: true };\n }\n\n return { current: desktop.version, latest: downloaded, isCurrent: false, upgrade: () => desktop.installUpdate() };\n}\n","import { getDesktop } from './desktop';\nimport { flexkitDomain } from './domains';\nimport { getLocalStorage } from './local-storage';\nimport { STUDIO_VERSION } from './use-studio-version';\n\n/**\n * The on/off decision and the transport shared by the Studio's error reports\n * (core/error/error-reporter.ts) and product events\n * (core/analytics/product-events.ts).\n */\n\n/** Turns error reports and product events on (`on`) or off (`off`) in this browser, whatever the environment. */\nexport const TELEMETRY_STORAGE_KEY = 'flexkit:telemetry';\n/** The key error reporting shipped with; still honoured. */\nexport const LEGACY_TELEMETRY_STORAGE_KEY = 'flexkit:error-reporting';\n\nexport interface TelemetryEnvironment {\n /** The Studio lists the signed-in user's projects (hosted Studio, desktop app). */\n hosted: boolean;\n isDesktop: boolean;\n domain: string;\n hostname: string;\n version: string;\n /** The local storage setting in this browser, if any. */\n override: string | null;\n}\n\nconst LOCAL_HOSTNAME = /^(localhost|127\\.0\\.0\\.1|\\[::1\\]|0\\.0\\.0\\.0)$|\\.(localhost|test|local)$/i;\n\n/**\n * On for the hosted Studio and the desktop app against the production\n * backend, and off in development: a local backend (`flexkit.test`), a local\n * host, or a build without a version. The local storage setting forces it\n * `on` or `off`.\n */\nexport function isTelemetryEnabled(env: TelemetryEnvironment): boolean {\n if (env.override === 'on') {\n return true;\n }\n\n if (env.override === 'off') {\n return false;\n }\n\n if (!env.hosted || env.domain !== 'flexkit.io' || env.version === '0.0.0') {\n return false;\n }\n\n return env.isDesktop || !LOCAL_HOSTNAME.test(env.hostname);\n}\n\nfunction readOverride(): string | null {\n try {\n const storage = getLocalStorage();\n\n return storage?.getItem(TELEMETRY_STORAGE_KEY) ?? storage?.getItem(LEGACY_TELEMETRY_STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n}\n\n/** Whether this Studio sends error reports and product events to Flexkit. */\nexport function isStudioTelemetryEnabled({ hosted }: { hosted: boolean }): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n return isTelemetryEnabled({\n hosted,\n isDesktop: Boolean(getDesktop()),\n domain: flexkitDomain,\n hostname: window.location.hostname,\n version: STUDIO_VERSION,\n override: readOverride(),\n });\n}\n\n/**\n * POSTs JSON to a user-level backend route through the Studio's server proxy,\n * which adds the session. `keepalive` lets the request outlive the page.\n * Returns the response status.\n */\nexport async function postToUserApi(path: string, body: string, { keepalive = false } = {}): Promise<number> {\n const response = await fetch(path, {\n body,\n credentials: 'same-origin',\n headers: { 'Content-Type': 'application/json' },\n keepalive,\n method: 'POST',\n });\n\n return response.status;\n}\n","import { userApiPaths } from '../api-paths';\nimport { getDesktop } from '../desktop';\nimport { STUDIO_VERSION } from '../use-studio-version';\nimport { isStudioTelemetryEnabled, postToUserApi } from '../telemetry';\n\n/**\n * Reports unexpected Studio errors (uncaught errors, unhandled rejections and\n * errors caught by the error boundaries) to Flexkit through the Studio's own\n * BFF (`/api/flexkit/-/client-errors`), which forwards the session so the\n * report is attributed to the signed-in user.\n *\n * Reports carry the error, the Studio path (no query string or hash) and the\n * current project id; never request bodies, form values or record data.\n */\n\nexport type ClientErrorSource = 'window' | 'unhandledrejection' | 'react' | 'manual';\n\nexport interface ClientError {\n source: ClientErrorSource;\n name: string;\n message: string;\n stack?: string;\n componentStack?: string;\n path?: string;\n projectId?: string;\n occurredAt: string;\n}\n\nexport interface ClientErrorApp {\n platform: 'web' | 'desktop';\n version: string;\n userAgent?: string;\n}\n\nexport interface ClientErrorReport {\n app: ClientErrorApp;\n errors: ClientError[];\n}\n\n/** Field limits of the backend schema. */\nconst LIMITS = {\n componentStack: 4_000,\n message: 2_000,\n name: 200,\n path: 500,\n stack: 8_000,\n userAgent: 500,\n} as const;\n\n/** The backend accepts 1 to 10 errors per report. */\nexport const MAX_ERRORS_PER_REPORT = 10;\n/** The backend refuses bodies over 64 KB; `keepalive` requests share a 64 KB budget too. */\nexport const MAX_REPORT_BYTES = 60_000;\n/** Reports kept per page session; anything after that is dropped. */\nexport const MAX_ERRORS_PER_SESSION = 50;\n/** At most one report is sent per interval; errors in between are batched. */\nexport const FLUSH_INTERVAL_MS = 5_000;\n\n/** Kept for callers and tests that name the gate after error reporting. */\nexport {\n isTelemetryEnabled as isErrorReportingEnabled,\n LEGACY_TELEMETRY_STORAGE_KEY as ERROR_REPORTING_STORAGE_KEY,\n type TelemetryEnvironment as ErrorReportingEnvironment,\n} from '../telemetry';\n\nexport const PROJECT_ID_PATTERN = /^[a-z0-9]{1,64}$/;\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max) : value;\n}\n\n/** The pathname of a path or URL, without query string or hash. */\nexport function toReportPath(pathOrUrl: string): string {\n let path = pathOrUrl;\n\n try {\n if (/^[a-z][a-z0-9+.-]*:/i.test(pathOrUrl)) {\n path = new URL(pathOrUrl).pathname;\n }\n } catch {\n // Not a URL; strip by hand below.\n }\n\n return truncate(path.split(/[?#]/)[0] ?? '', LIMITS.path);\n}\n\nexport interface ErrorDetails {\n name: string;\n message: string;\n stack?: string;\n}\n\n/**\n * Name, message and stack of anything thrown. A non-Error value (a rejected\n * promise with a plain object) is described by its type only, so record data\n * someone rejected with never leaves the browser.\n */\nexport function describeError(error: unknown): ErrorDetails {\n if (error instanceof Error) {\n return {\n name: error.name || 'Error',\n message: typeof error.message === 'string' ? error.message : '',\n stack: typeof error.stack === 'string' ? error.stack : undefined,\n };\n }\n\n if (typeof error === 'string') {\n return { name: 'Error', message: error };\n }\n\n if (error === null || error === undefined) {\n return { name: 'Error', message: `Non-Error thrown: ${String(error)}` };\n }\n\n if (typeof error === 'object') {\n const constructorName = (error as { constructor?: { name?: unknown } }).constructor?.name;\n\n return {\n name: 'Error',\n message: `Non-Error thrown: ${typeof constructorName === 'string' && constructorName ? constructorName : 'object'}`,\n };\n }\n\n return { name: 'Error', message: `Non-Error thrown: ${typeof error}` };\n}\n\nconst NOISE_MESSAGES = [\n /ResizeObserver loop (limit exceeded|completed with undelivered notifications)/i,\n // Cross-origin script errors carry nothing to act on.\n /^Script error\\.?$/i,\n /The (operation|user) (was )?aborted/i,\n /signal is aborted without reason/i,\n];\n\nconst EXTENSION_URL = /\\b(chrome|moz|safari(-web)?|ms-browser)-extension:\\/\\//i;\n\nconst EMAIL_ADDRESS = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi;\n\n/** Masks email addresses an error message may quote from a record or form. */\nexport function maskMessage(message: string): string {\n return message.replace(EMAIL_ADDRESS, '<email>');\n}\n\n/** Errors that are not Studio bugs: browser quirks, aborted requests, browser extensions. */\nexport function isNoiseError(details: ErrorDetails, sourceUrl?: string): boolean {\n if (details.name === 'AbortError') {\n return true;\n }\n\n if (NOISE_MESSAGES.some((pattern) => pattern.test(details.message))) {\n return true;\n }\n\n if (sourceUrl && EXTENSION_URL.test(sourceUrl)) {\n return true;\n }\n\n return Boolean(details.stack && EXTENSION_URL.test(details.stack));\n}\n\nexport interface BuildClientErrorOptions {\n source: ClientErrorSource;\n componentStack?: string;\n path?: string;\n projectId?: string | null;\n /** The script the error came from (`ErrorEvent.filename`), checked for browser extensions. */\n sourceUrl?: string;\n now?: Date;\n}\n\n/** The report entry for an error, or null when it is noise. */\nexport function buildClientError(error: unknown, options: BuildClientErrorOptions): ClientError | null {\n const details = describeError(error);\n\n if (isNoiseError(details, options.sourceUrl)) {\n return null;\n }\n\n const entry: ClientError = {\n source: options.source,\n name: truncate(details.name, LIMITS.name),\n message: truncate(maskMessage(details.message), LIMITS.message),\n occurredAt: (options.now ?? new Date()).toISOString(),\n };\n\n if (details.stack) {\n entry.stack = truncate(details.stack, LIMITS.stack);\n }\n\n if (options.componentStack) {\n entry.componentStack = truncate(options.componentStack, LIMITS.componentStack);\n }\n\n if (options.path) {\n entry.path = toReportPath(options.path);\n }\n\n if (options.projectId && PROJECT_ID_PATTERN.test(options.projectId)) {\n entry.projectId = options.projectId;\n }\n\n return entry;\n}\n\n/** Identity of an error within a page session: the same message and stack are reported once. */\nexport function errorKey(error: Pick<ClientError, 'message' | 'name' | 'stack'>): string {\n return `${error.name}\\n${error.message}\\n${error.stack ?? ''}`;\n}\n\nconst encoder = new TextEncoder();\n\nfunction byteLength(value: string): number {\n return encoder.encode(value).length;\n}\n\n/**\n * Takes the errors that fit one report (at most 10 and `maxBytes` of JSON)\n * off the front of the queue. Returns the request body and how many errors it holds.\n */\nexport function buildReportBody(\n app: ClientErrorApp,\n queue: readonly ClientError[],\n maxBytes = MAX_REPORT_BYTES\n): { body: string; count: number } | null {\n // The envelope plus each error once, joined by commas.\n let size = byteLength(JSON.stringify({ app, errors: [] } satisfies ClientErrorReport));\n const errors: ClientError[] = [];\n\n for (const error of queue.slice(0, MAX_ERRORS_PER_REPORT)) {\n const errorSize = byteLength(JSON.stringify(error)) + (errors.length ? 1 : 0);\n\n if (size + errorSize > maxBytes) {\n break;\n }\n\n size += errorSize;\n errors.push(error);\n }\n\n if (errors.length === 0) {\n return null;\n }\n\n return { body: JSON.stringify({ app, errors } satisfies ClientErrorReport), count: errors.length };\n}\n\nexport type SendReport = (body: string, options: { unloading: boolean }) => Promise<number | null>;\n\nexport interface ErrorReporterOptions {\n app: ClientErrorApp;\n send: SendReport;\n /** The current Studio path; only its pathname is sent. */\n getPath?: () => string | undefined;\n now?: () => Date;\n setTimer?: (callback: () => void, ms: number) => unknown;\n clearTimer?: (timer: unknown) => void;\n}\n\nexport interface ErrorReporter {\n report: (error: unknown, options: Omit<BuildClientErrorOptions, 'path' | 'projectId' | 'now'>) => void;\n setProjectId: (projectId: string | null) => void;\n /** Sends the next report now; `unloading` uses a beacon or keepalive request that outlives the page. */\n flush: (options?: { unloading?: boolean }) => void;\n /** Errors waiting to be sent (tests). */\n pending: () => readonly ClientError[];\n dispose: () => void;\n}\n\n/** The queue, dedupe, cap and batching; the transport and the clock are injected. */\nexport function createErrorReporter({\n app,\n send,\n getPath,\n now = () => new Date(),\n setTimer = (callback, ms) => setTimeout(callback, ms),\n clearTimer = (timer) => clearTimeout(timer as ReturnType<typeof setTimeout>),\n}: ErrorReporterOptions): ErrorReporter {\n const queue: ClientError[] = [];\n const seen = new Set<string>();\n let accepted = 0;\n let projectId: string | null = null;\n let timer: unknown = null;\n let stopped = false;\n\n function schedule(): void {\n if (timer === null && queue.length > 0 && !stopped) {\n timer = setTimer(() => {\n timer = null;\n flush();\n }, FLUSH_INTERVAL_MS);\n }\n }\n\n function sendNext(unloading: boolean): boolean {\n const next = buildReportBody(app, queue);\n\n if (!next) {\n // An error that cannot fit a report on its own; drop it.\n queue.shift();\n\n return queue.length > 0;\n }\n\n queue.splice(0, next.count);\n send(next.body, { unloading })\n .then((status) => {\n // Rate limited or not allowed: stop for this page session rather than retry.\n if (status === 401 || status === 403 || status === 429) {\n stopped = true;\n queue.length = 0;\n }\n })\n .catch(() => {\n // Never report the reporter's own failures.\n });\n\n return queue.length > 0;\n }\n\n function flush({ unloading = false }: { unloading?: boolean } = {}): void {\n try {\n if (stopped) {\n return;\n }\n\n if (timer !== null && unloading) {\n clearTimer(timer);\n timer = null;\n }\n\n // One report per flush, also when the page goes away: beacons and\n // keepalive requests share a 64 KB budget, so a second would be refused.\n if (queue.length > 0) {\n sendNext(unloading);\n }\n\n schedule();\n } catch {\n // Error reporting must never break the Studio.\n }\n }\n\n return {\n report(error, options) {\n try {\n if (stopped || accepted >= MAX_ERRORS_PER_SESSION) {\n return;\n }\n\n const entry = buildClientError(error, {\n ...options,\n now: now(),\n path: getPath?.(),\n projectId,\n });\n\n if (!entry) {\n return;\n }\n\n const key = errorKey(entry);\n\n if (seen.has(key)) {\n return;\n }\n\n seen.add(key);\n accepted += 1;\n queue.push(entry);\n schedule();\n } catch {\n // Error reporting must never break the Studio.\n }\n },\n setProjectId(id) {\n projectId = id;\n },\n flush,\n pending: () => queue,\n dispose() {\n if (timer !== null) {\n clearTimer(timer);\n timer = null;\n }\n\n stopped = true;\n queue.length = 0;\n },\n };\n}\n\n/** Sends a report through the BFF; a beacon when the page is going away on the web. */\nexport const sendReportToBff: SendReport = async (body, { unloading }) => {\n const url = userApiPaths.clientErrors;\n\n // A beacon outlives the page. The BFF reads its JSON body like a fetch's\n // and the browser sends the session cookie with it (same origin). The\n // desktop app's BFF only answers script requests, so it uses `keepalive`.\n if (unloading && !getDesktop() && typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\n try {\n // text/plain is CORS-safelisted, so no browser refuses the beacon; the body is still JSON.\n if (navigator.sendBeacon(url, new Blob([body], { type: 'text/plain' }))) {\n return null;\n }\n } catch {\n // Fall back to a keepalive fetch.\n }\n }\n\n return postToUserApi(url, body, { keepalive: unloading });\n};\n\nlet installed: ErrorReporter | null = null;\n\n/** Reports an error caught by the Studio (an error boundary, for example). Does nothing when reporting is off. */\nexport function reportStudioError(\n error: unknown,\n { source = 'manual', componentStack }: { source?: ClientErrorSource; componentStack?: string } = {}\n): void {\n installed?.report(error, { source, componentStack });\n}\n\n/** The project the Studio shows, added to reports; null outside a project. */\nexport function setErrorReportingProjectId(projectId: string | null): void {\n installed?.setProjectId(projectId);\n}\n\n/**\n * Starts reporting uncaught errors and unhandled rejections when reporting is\n * enabled for this environment. Returns the function that stops it.\n */\nexport function installErrorReporter({ hosted }: { hosted: boolean }): () => void {\n if (typeof window === 'undefined' || installed) {\n return () => undefined;\n }\n\n if (!isStudioTelemetryEnabled({ hosted })) {\n return () => undefined;\n }\n\n const desktop = getDesktop();\n\n const reporter = createErrorReporter({\n app: {\n platform: desktop ? 'desktop' : 'web',\n version: STUDIO_VERSION,\n userAgent: truncate(navigator.userAgent, LIMITS.userAgent),\n },\n send: sendReportToBff,\n getPath: () => window.location.pathname,\n });\n\n function onError(event: ErrorEvent): void {\n reporter.report(event.error ?? event.message, { source: 'window', sourceUrl: event.filename });\n }\n\n function onUnhandledRejection(event: PromiseRejectionEvent): void {\n reporter.report(event.reason, { source: 'unhandledrejection' });\n }\n\n function onPageHide(): void {\n reporter.flush({ unloading: true });\n }\n\n window.addEventListener('error', onError);\n window.addEventListener('unhandledrejection', onUnhandledRejection);\n window.addEventListener('pagehide', onPageHide);\n installed = reporter;\n\n return () => {\n window.removeEventListener('error', onError);\n window.removeEventListener('unhandledrejection', onUnhandledRejection);\n window.removeEventListener('pagehide', onPageHide);\n reporter.flush({ unloading: true });\n reporter.dispose();\n\n if (installed === reporter) {\n installed = null;\n }\n };\n}\n","import { userApiPaths } from '../api-paths';\nimport { getDesktop } from '../desktop';\nimport { PROJECT_ID_PATTERN } from '../error/error-reporter';\nimport { isStudioTelemetryEnabled, postToUserApi } from '../telemetry';\n\n/**\n * Product events only the Studio can see, sent to Flexkit through the\n * Studio's own server proxy (`/api/flexkit/-/product-events`) with the\n * session: the Graph app opened, the desktop app launched. They follow the\n * Studio's telemetry setting (see core/telemetry.ts) and carry ids, the\n * desktop app version and the OS only.\n */\nexport type StudioProductEvent =\n | { event: 'graph_opened'; projectId: string }\n | { event: 'desktop_app_opened'; appVersion: string; os: 'darwin' | 'linux' | 'win32' };\n\n/** Identity of an event within a page session; the backend also counts each once per day. */\nexport function productEventKey(studioEvent: StudioProductEvent): string {\n return studioEvent.event === 'graph_opened' ? `graph_opened:${studioEvent.projectId}` : studioEvent.event;\n}\n\n/** Sends the event body; resolves with the response status. */\nexport type SendProductEvent = (body: string) => Promise<number>;\n\nexport interface ProductEventTracker {\n track: (studioEvent: StudioProductEvent, options?: { onDelivered?: () => void }) => void;\n}\n\n/**\n * Sends each event once per page session through `send`. An event counts as\n * sent only once the backend accepted it, so one sent while offline or signed\n * out is sent again next time. Never throws.\n */\nexport function createProductEventTracker(send: SendProductEvent): ProductEventTracker {\n const pending = new Set<string>();\n const delivered = new Set<string>();\n\n return {\n track(studioEvent, { onDelivered } = {}) {\n const key = productEventKey(studioEvent);\n\n if (pending.has(key) || delivered.has(key)) {\n return;\n }\n\n pending.add(key);\n\n const settle = (status: number | null): void => {\n pending.delete(key);\n\n if (status !== null && status >= 200 && status < 300) {\n delivered.add(key);\n onDelivered?.();\n }\n };\n\n try {\n send(JSON.stringify(studioEvent)).then(settle, () => settle(null));\n } catch {\n settle(null);\n }\n },\n };\n}\n\nlet tracker: ProductEventTracker | null = null;\n\n/** Records an event when product events are on (see `installProductEvents`); otherwise does nothing. */\nexport function trackStudioEvent(studioEvent: StudioProductEvent): void {\n if (studioEvent.event === 'graph_opened' && !PROJECT_ID_PATTERN.test(studioEvent.projectId)) {\n return;\n }\n\n tracker?.track(studioEvent);\n}\n\n/** Session storage flag: this desktop app launch was recorded (page reloads keep it, a relaunch does not). */\nexport const DESKTOP_LAUNCH_STORAGE_KEY = 'flexkit:desktop-launch-recorded';\n\nfunction readSessionFlag(key: string): boolean {\n try {\n return sessionStorage.getItem(key) === '1';\n } catch {\n return false;\n }\n}\n\nfunction writeSessionFlag(key: string): void {\n try {\n sessionStorage.setItem(key, '1');\n } catch {\n // Without session storage the backend's once-per-day count still applies.\n }\n}\n\n/**\n * Turns product events on for this environment and records the desktop app\n * launch (once per launch, once the user is signed in). Returns the function\n * that turns them off again.\n */\nexport function installProductEvents({ hosted }: { hosted: boolean }): () => void {\n if (!isStudioTelemetryEnabled({ hosted })) {\n return () => undefined;\n }\n\n const current = createProductEventTracker((body) =>\n postToUserApi(userApiPaths.productEvents, body, { keepalive: true })\n );\n const desktop = getDesktop();\n\n tracker = current;\n\n if (desktop && !readSessionFlag(DESKTOP_LAUNCH_STORAGE_KEY)) {\n current.track(\n { appVersion: desktop.version, event: 'desktop_app_opened', os: desktop.platform },\n { onDelivered: () => writeSessionFlag(DESKTOP_LAUNCH_STORAGE_KEY) }\n );\n }\n\n return () => {\n if (tracker === current) {\n tracker = null;\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/use-studio-version.ts","../src/core/telemetry.ts","../src/core/error/error-reporter.ts","../src/core/analytics/product-events.ts"],"names":["STUDIO_VERSION","WEB_VERSION","useStudioVersion","desktop","getDesktop","downloaded","setDownloaded","useState","useEffect","update","TELEMETRY_STORAGE_KEY","LEGACY_TELEMETRY_STORAGE_KEY","LOCAL_HOSTNAME","isTelemetryEnabled","env","readOverride","storage","getLocalStorage","isStudioTelemetryEnabled","hosted","flexkitDomain","postToUserApi","path","body","keepalive","LIMITS","MAX_ERRORS_PER_REPORT","MAX_REPORT_BYTES","MAX_ERRORS_PER_SESSION","FLUSH_INTERVAL_MS","PROJECT_ID_PATTERN","truncate","value","max","toReportPath","pathOrUrl","describeError","error","constructorName","NOISE_MESSAGES","EXTENSION_URL","EMAIL_ADDRESS","maskMessage","message","isNoiseError","details","sourceUrl","pattern","buildClientError","options","entry","errorKey","encoder","byteLength","buildReportBody","app","queue","maxBytes","size","errors","errorSize","createErrorReporter","send","getPath","now","setTimer","callback","ms","clearTimer","timer","seen","accepted","projectId","stopped","schedule","flush","sendNext","unloading","next","status","key","id","sendReportToBff","url","userApiPaths","installed","reportStudioError","source","componentStack","setErrorReportingProjectId","installErrorReporter","reporter","onError","event","onUnhandledRejection","onPageHide","productEventKey","studioEvent","createProductEventTracker","pending","delivered","onDelivered","settle","tracker","trackStudioEvent","DESKTOP_LAUNCH_STORAGE_KEY","readSessionFlag","writeSessionFlag","installProductEvents","current"],"mappings":"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","file":"chunk-QW6H7OZ6.js","sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { getDesktop } from './desktop';\n\nexport interface StudioVersion {\n current: string;\n latest: string;\n isCurrent: boolean;\n /** Applies the newer version (the desktop app restarts into it); undefined when there is nothing to apply. */\n upgrade?: () => void;\n}\n\n// `@flexkit/studio`'s own version, inlined at build time; a build without the\n// define (tests, tooling) shows a placeholder.\nexport const STUDIO_VERSION = typeof __STUDIO_VERSION__ === 'string' ? __STUDIO_VERSION__ : '0.0.0';\nconst WEB_VERSION: StudioVersion = { current: STUDIO_VERSION, latest: STUDIO_VERSION, isCurrent: true };\n\n/**\n * The Studio version shown in the app bar. The web Studio is always current\n * (the hosted Studio deploys with the packages); the desktop app reports its\n * own version and the update it has downloaded, if any.\n */\nexport function useStudioVersion(): StudioVersion {\n const desktop = getDesktop();\n const [downloaded, setDownloaded] = useState<string | null>(null);\n\n useEffect(() => {\n if (!desktop) {\n return;\n }\n\n return desktop.onUpdateDownloaded((update) => {\n setDownloaded(update.version);\n });\n }, [desktop]);\n\n if (!desktop) {\n return WEB_VERSION;\n }\n\n if (downloaded === null) {\n return { current: desktop.version, latest: desktop.version, isCurrent: true };\n }\n\n return { current: desktop.version, latest: downloaded, isCurrent: false, upgrade: () => desktop.installUpdate() };\n}\n","import { getDesktop } from './desktop';\nimport { flexkitDomain } from './domains';\nimport { getLocalStorage } from './local-storage';\nimport { STUDIO_VERSION } from './use-studio-version';\n\n/**\n * The on/off decision and the transport shared by the Studio's error reports\n * (core/error/error-reporter.ts) and product events\n * (core/analytics/product-events.ts).\n */\n\n/** Turns error reports and product events on (`on`) or off (`off`) in this browser, whatever the environment. */\nexport const TELEMETRY_STORAGE_KEY = 'flexkit:telemetry';\n/** The key error reporting shipped with; still honoured. */\nexport const LEGACY_TELEMETRY_STORAGE_KEY = 'flexkit:error-reporting';\n\nexport interface TelemetryEnvironment {\n /** The Studio lists the signed-in user's projects (hosted Studio, desktop app). */\n hosted: boolean;\n isDesktop: boolean;\n domain: string;\n hostname: string;\n version: string;\n /** The local storage setting in this browser, if any. */\n override: string | null;\n}\n\nconst LOCAL_HOSTNAME = /^(localhost|127\\.0\\.0\\.1|\\[::1\\]|0\\.0\\.0\\.0)$|\\.(localhost|test|local)$/i;\n\n/**\n * On for the hosted Studio and the desktop app against the production\n * backend, and off in development: a local backend (`flexkit.test`), a local\n * host, or a build without a version. The local storage setting forces it\n * `on` or `off`.\n */\nexport function isTelemetryEnabled(env: TelemetryEnvironment): boolean {\n if (env.override === 'on') {\n return true;\n }\n\n if (env.override === 'off') {\n return false;\n }\n\n if (!env.hosted || env.domain !== 'flexkit.io' || env.version === '0.0.0') {\n return false;\n }\n\n return env.isDesktop || !LOCAL_HOSTNAME.test(env.hostname);\n}\n\nfunction readOverride(): string | null {\n try {\n const storage = getLocalStorage();\n\n return storage?.getItem(TELEMETRY_STORAGE_KEY) ?? storage?.getItem(LEGACY_TELEMETRY_STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n}\n\n/** Whether this Studio sends error reports and product events to Flexkit. */\nexport function isStudioTelemetryEnabled({ hosted }: { hosted: boolean }): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n return isTelemetryEnabled({\n hosted,\n isDesktop: Boolean(getDesktop()),\n domain: flexkitDomain,\n hostname: window.location.hostname,\n version: STUDIO_VERSION,\n override: readOverride(),\n });\n}\n\n/**\n * POSTs JSON to a user-level backend route through the Studio's server proxy,\n * which adds the session. `keepalive` lets the request outlive the page.\n * Returns the response status.\n */\nexport async function postToUserApi(path: string, body: string, { keepalive = false } = {}): Promise<number> {\n const response = await fetch(path, {\n body,\n credentials: 'same-origin',\n headers: { 'Content-Type': 'application/json' },\n keepalive,\n method: 'POST',\n });\n\n return response.status;\n}\n","import { userApiPaths } from '../api-paths';\nimport { getDesktop } from '../desktop';\nimport { STUDIO_VERSION } from '../use-studio-version';\nimport { isStudioTelemetryEnabled, postToUserApi } from '../telemetry';\n\n/**\n * Reports unexpected Studio errors (uncaught errors, unhandled rejections and\n * errors caught by the error boundaries) to Flexkit through the Studio's own\n * BFF (`/api/flexkit/-/client-errors`), which forwards the session so the\n * report is attributed to the signed-in user.\n *\n * Reports carry the error, the Studio path (no query string or hash) and the\n * current project id; never request bodies, form values or record data.\n */\n\nexport type ClientErrorSource = 'window' | 'unhandledrejection' | 'react' | 'manual';\n\nexport interface ClientError {\n source: ClientErrorSource;\n name: string;\n message: string;\n stack?: string;\n componentStack?: string;\n path?: string;\n projectId?: string;\n occurredAt: string;\n}\n\nexport interface ClientErrorApp {\n platform: 'web' | 'desktop';\n version: string;\n userAgent?: string;\n}\n\nexport interface ClientErrorReport {\n app: ClientErrorApp;\n errors: ClientError[];\n}\n\n/** Field limits of the backend schema. */\nconst LIMITS = {\n componentStack: 4_000,\n message: 2_000,\n name: 200,\n path: 500,\n stack: 8_000,\n userAgent: 500,\n} as const;\n\n/** The backend accepts 1 to 10 errors per report. */\nexport const MAX_ERRORS_PER_REPORT = 10;\n/** The backend refuses bodies over 64 KB; `keepalive` requests share a 64 KB budget too. */\nexport const MAX_REPORT_BYTES = 60_000;\n/** Reports kept per page session; anything after that is dropped. */\nexport const MAX_ERRORS_PER_SESSION = 50;\n/** At most one report is sent per interval; errors in between are batched. */\nexport const FLUSH_INTERVAL_MS = 5_000;\n\n/** Kept for callers and tests that name the gate after error reporting. */\nexport {\n isTelemetryEnabled as isErrorReportingEnabled,\n LEGACY_TELEMETRY_STORAGE_KEY as ERROR_REPORTING_STORAGE_KEY,\n type TelemetryEnvironment as ErrorReportingEnvironment,\n} from '../telemetry';\n\nexport const PROJECT_ID_PATTERN = /^[a-z0-9]{1,64}$/;\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max) : value;\n}\n\n/** The pathname of a path or URL, without query string or hash. */\nexport function toReportPath(pathOrUrl: string): string {\n let path = pathOrUrl;\n\n try {\n if (/^[a-z][a-z0-9+.-]*:/i.test(pathOrUrl)) {\n path = new URL(pathOrUrl).pathname;\n }\n } catch {\n // Not a URL; strip by hand below.\n }\n\n return truncate(path.split(/[?#]/)[0] ?? '', LIMITS.path);\n}\n\nexport interface ErrorDetails {\n name: string;\n message: string;\n stack?: string;\n}\n\n/**\n * Name, message and stack of anything thrown. A non-Error value (a rejected\n * promise with a plain object) is described by its type only, so record data\n * someone rejected with never leaves the browser.\n */\nexport function describeError(error: unknown): ErrorDetails {\n if (error instanceof Error) {\n return {\n name: error.name || 'Error',\n message: typeof error.message === 'string' ? error.message : '',\n stack: typeof error.stack === 'string' ? error.stack : undefined,\n };\n }\n\n if (typeof error === 'string') {\n return { name: 'Error', message: error };\n }\n\n if (error === null || error === undefined) {\n return { name: 'Error', message: `Non-Error thrown: ${String(error)}` };\n }\n\n if (typeof error === 'object') {\n const constructorName = (error as { constructor?: { name?: unknown } }).constructor?.name;\n\n return {\n name: 'Error',\n message: `Non-Error thrown: ${typeof constructorName === 'string' && constructorName ? constructorName : 'object'}`,\n };\n }\n\n return { name: 'Error', message: `Non-Error thrown: ${typeof error}` };\n}\n\nconst NOISE_MESSAGES = [\n /ResizeObserver loop (limit exceeded|completed with undelivered notifications)/i,\n // Cross-origin script errors carry nothing to act on.\n /^Script error\\.?$/i,\n /The (operation|user) (was )?aborted/i,\n /signal is aborted without reason/i,\n];\n\nconst EXTENSION_URL = /\\b(chrome|moz|safari(-web)?|ms-browser)-extension:\\/\\//i;\n\nconst EMAIL_ADDRESS = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi;\n\n/** Masks email addresses an error message may quote from a record or form. */\nexport function maskMessage(message: string): string {\n return message.replace(EMAIL_ADDRESS, '<email>');\n}\n\n/** Errors that are not Studio bugs: browser quirks, aborted requests, browser extensions. */\nexport function isNoiseError(details: ErrorDetails, sourceUrl?: string): boolean {\n if (details.name === 'AbortError') {\n return true;\n }\n\n if (NOISE_MESSAGES.some((pattern) => pattern.test(details.message))) {\n return true;\n }\n\n if (sourceUrl && EXTENSION_URL.test(sourceUrl)) {\n return true;\n }\n\n return Boolean(details.stack && EXTENSION_URL.test(details.stack));\n}\n\nexport interface BuildClientErrorOptions {\n source: ClientErrorSource;\n componentStack?: string;\n path?: string;\n projectId?: string | null;\n /** The script the error came from (`ErrorEvent.filename`), checked for browser extensions. */\n sourceUrl?: string;\n now?: Date;\n}\n\n/** The report entry for an error, or null when it is noise. */\nexport function buildClientError(error: unknown, options: BuildClientErrorOptions): ClientError | null {\n const details = describeError(error);\n\n if (isNoiseError(details, options.sourceUrl)) {\n return null;\n }\n\n const entry: ClientError = {\n source: options.source,\n name: truncate(details.name, LIMITS.name),\n message: truncate(maskMessage(details.message), LIMITS.message),\n occurredAt: (options.now ?? new Date()).toISOString(),\n };\n\n if (details.stack) {\n entry.stack = truncate(details.stack, LIMITS.stack);\n }\n\n if (options.componentStack) {\n entry.componentStack = truncate(options.componentStack, LIMITS.componentStack);\n }\n\n if (options.path) {\n entry.path = toReportPath(options.path);\n }\n\n if (options.projectId && PROJECT_ID_PATTERN.test(options.projectId)) {\n entry.projectId = options.projectId;\n }\n\n return entry;\n}\n\n/** Identity of an error within a page session: the same message and stack are reported once. */\nexport function errorKey(error: Pick<ClientError, 'message' | 'name' | 'stack'>): string {\n return `${error.name}\\n${error.message}\\n${error.stack ?? ''}`;\n}\n\nconst encoder = new TextEncoder();\n\nfunction byteLength(value: string): number {\n return encoder.encode(value).length;\n}\n\n/**\n * Takes the errors that fit one report (at most 10 and `maxBytes` of JSON)\n * off the front of the queue. Returns the request body and how many errors it holds.\n */\nexport function buildReportBody(\n app: ClientErrorApp,\n queue: readonly ClientError[],\n maxBytes = MAX_REPORT_BYTES\n): { body: string; count: number } | null {\n // The envelope plus each error once, joined by commas.\n let size = byteLength(JSON.stringify({ app, errors: [] } satisfies ClientErrorReport));\n const errors: ClientError[] = [];\n\n for (const error of queue.slice(0, MAX_ERRORS_PER_REPORT)) {\n const errorSize = byteLength(JSON.stringify(error)) + (errors.length ? 1 : 0);\n\n if (size + errorSize > maxBytes) {\n break;\n }\n\n size += errorSize;\n errors.push(error);\n }\n\n if (errors.length === 0) {\n return null;\n }\n\n return { body: JSON.stringify({ app, errors } satisfies ClientErrorReport), count: errors.length };\n}\n\nexport type SendReport = (body: string, options: { unloading: boolean }) => Promise<number | null>;\n\nexport interface ErrorReporterOptions {\n app: ClientErrorApp;\n send: SendReport;\n /** The current Studio path; only its pathname is sent. */\n getPath?: () => string | undefined;\n now?: () => Date;\n setTimer?: (callback: () => void, ms: number) => unknown;\n clearTimer?: (timer: unknown) => void;\n}\n\nexport interface ErrorReporter {\n report: (error: unknown, options: Omit<BuildClientErrorOptions, 'path' | 'projectId' | 'now'>) => void;\n setProjectId: (projectId: string | null) => void;\n /** Sends the next report now; `unloading` uses a beacon or keepalive request that outlives the page. */\n flush: (options?: { unloading?: boolean }) => void;\n /** Errors waiting to be sent (tests). */\n pending: () => readonly ClientError[];\n dispose: () => void;\n}\n\n/** The queue, dedupe, cap and batching; the transport and the clock are injected. */\nexport function createErrorReporter({\n app,\n send,\n getPath,\n now = () => new Date(),\n setTimer = (callback, ms) => setTimeout(callback, ms),\n clearTimer = (timer) => clearTimeout(timer as ReturnType<typeof setTimeout>),\n}: ErrorReporterOptions): ErrorReporter {\n const queue: ClientError[] = [];\n const seen = new Set<string>();\n let accepted = 0;\n let projectId: string | null = null;\n let timer: unknown = null;\n let stopped = false;\n\n function schedule(): void {\n if (timer === null && queue.length > 0 && !stopped) {\n timer = setTimer(() => {\n timer = null;\n flush();\n }, FLUSH_INTERVAL_MS);\n }\n }\n\n function sendNext(unloading: boolean): boolean {\n const next = buildReportBody(app, queue);\n\n if (!next) {\n // An error that cannot fit a report on its own; drop it.\n queue.shift();\n\n return queue.length > 0;\n }\n\n queue.splice(0, next.count);\n send(next.body, { unloading })\n .then((status) => {\n // Rate limited or not allowed: stop for this page session rather than retry.\n if (status === 401 || status === 403 || status === 429) {\n stopped = true;\n queue.length = 0;\n }\n })\n .catch(() => {\n // Never report the reporter's own failures.\n });\n\n return queue.length > 0;\n }\n\n function flush({ unloading = false }: { unloading?: boolean } = {}): void {\n try {\n if (stopped) {\n return;\n }\n\n if (timer !== null && unloading) {\n clearTimer(timer);\n timer = null;\n }\n\n // One report per flush, also when the page goes away: beacons and\n // keepalive requests share a 64 KB budget, so a second would be refused.\n if (queue.length > 0) {\n sendNext(unloading);\n }\n\n schedule();\n } catch {\n // Error reporting must never break the Studio.\n }\n }\n\n return {\n report(error, options) {\n try {\n if (stopped || accepted >= MAX_ERRORS_PER_SESSION) {\n return;\n }\n\n const entry = buildClientError(error, {\n ...options,\n now: now(),\n path: getPath?.(),\n projectId,\n });\n\n if (!entry) {\n return;\n }\n\n const key = errorKey(entry);\n\n if (seen.has(key)) {\n return;\n }\n\n seen.add(key);\n accepted += 1;\n queue.push(entry);\n schedule();\n } catch {\n // Error reporting must never break the Studio.\n }\n },\n setProjectId(id) {\n projectId = id;\n },\n flush,\n pending: () => queue,\n dispose() {\n if (timer !== null) {\n clearTimer(timer);\n timer = null;\n }\n\n stopped = true;\n queue.length = 0;\n },\n };\n}\n\n/** Sends a report through the BFF; a beacon when the page is going away on the web. */\nexport const sendReportToBff: SendReport = async (body, { unloading }) => {\n const url = userApiPaths.clientErrors;\n\n // A beacon outlives the page. The BFF reads its JSON body like a fetch's\n // and the browser sends the session cookie with it (same origin). The\n // desktop app's BFF only answers script requests, so it uses `keepalive`.\n if (unloading && !getDesktop() && typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\n try {\n // text/plain is CORS-safelisted, so no browser refuses the beacon; the body is still JSON.\n if (navigator.sendBeacon(url, new Blob([body], { type: 'text/plain' }))) {\n return null;\n }\n } catch {\n // Fall back to a keepalive fetch.\n }\n }\n\n return postToUserApi(url, body, { keepalive: unloading });\n};\n\nlet installed: ErrorReporter | null = null;\n\n/** Reports an error caught by the Studio (an error boundary, for example). Does nothing when reporting is off. */\nexport function reportStudioError(\n error: unknown,\n { source = 'manual', componentStack }: { source?: ClientErrorSource; componentStack?: string } = {}\n): void {\n installed?.report(error, { source, componentStack });\n}\n\n/** The project the Studio shows, added to reports; null outside a project. */\nexport function setErrorReportingProjectId(projectId: string | null): void {\n installed?.setProjectId(projectId);\n}\n\n/**\n * Starts reporting uncaught errors and unhandled rejections when reporting is\n * enabled for this environment. Returns the function that stops it.\n */\nexport function installErrorReporter({ hosted }: { hosted: boolean }): () => void {\n if (typeof window === 'undefined' || installed) {\n return () => undefined;\n }\n\n if (!isStudioTelemetryEnabled({ hosted })) {\n return () => undefined;\n }\n\n const desktop = getDesktop();\n\n const reporter = createErrorReporter({\n app: {\n platform: desktop ? 'desktop' : 'web',\n version: STUDIO_VERSION,\n userAgent: truncate(navigator.userAgent, LIMITS.userAgent),\n },\n send: sendReportToBff,\n getPath: () => window.location.pathname,\n });\n\n function onError(event: ErrorEvent): void {\n reporter.report(event.error ?? event.message, { source: 'window', sourceUrl: event.filename });\n }\n\n function onUnhandledRejection(event: PromiseRejectionEvent): void {\n reporter.report(event.reason, { source: 'unhandledrejection' });\n }\n\n function onPageHide(): void {\n reporter.flush({ unloading: true });\n }\n\n window.addEventListener('error', onError);\n window.addEventListener('unhandledrejection', onUnhandledRejection);\n window.addEventListener('pagehide', onPageHide);\n installed = reporter;\n\n return () => {\n window.removeEventListener('error', onError);\n window.removeEventListener('unhandledrejection', onUnhandledRejection);\n window.removeEventListener('pagehide', onPageHide);\n reporter.flush({ unloading: true });\n reporter.dispose();\n\n if (installed === reporter) {\n installed = null;\n }\n };\n}\n","import { userApiPaths } from '../api-paths';\nimport { getDesktop } from '../desktop';\nimport { PROJECT_ID_PATTERN } from '../error/error-reporter';\nimport { isStudioTelemetryEnabled, postToUserApi } from '../telemetry';\n\n/**\n * Product events only the Studio can see, sent to Flexkit through the\n * Studio's own server proxy (`/api/flexkit/-/product-events`) with the\n * session: the Graph app opened, the desktop app launched. They follow the\n * Studio's telemetry setting (see core/telemetry.ts) and carry ids, the\n * desktop app version and the OS only.\n */\nexport type StudioProductEvent =\n | { event: 'graph_opened'; projectId: string }\n | { event: 'desktop_app_opened'; appVersion: string; os: 'darwin' | 'linux' | 'win32' };\n\n/** Identity of an event within a page session; the backend also counts each once per day. */\nexport function productEventKey(studioEvent: StudioProductEvent): string {\n return studioEvent.event === 'graph_opened' ? `graph_opened:${studioEvent.projectId}` : studioEvent.event;\n}\n\n/** Sends the event body; resolves with the response status. */\nexport type SendProductEvent = (body: string) => Promise<number>;\n\nexport interface ProductEventTracker {\n track: (studioEvent: StudioProductEvent, options?: { onDelivered?: () => void }) => void;\n}\n\n/**\n * Sends each event once per page session through `send`. An event counts as\n * sent only once the backend accepted it, so one sent while offline or signed\n * out is sent again next time. Never throws.\n */\nexport function createProductEventTracker(send: SendProductEvent): ProductEventTracker {\n const pending = new Set<string>();\n const delivered = new Set<string>();\n\n return {\n track(studioEvent, { onDelivered } = {}) {\n const key = productEventKey(studioEvent);\n\n if (pending.has(key) || delivered.has(key)) {\n return;\n }\n\n pending.add(key);\n\n const settle = (status: number | null): void => {\n pending.delete(key);\n\n if (status !== null && status >= 200 && status < 300) {\n delivered.add(key);\n onDelivered?.();\n }\n };\n\n try {\n send(JSON.stringify(studioEvent)).then(settle, () => settle(null));\n } catch {\n settle(null);\n }\n },\n };\n}\n\nlet tracker: ProductEventTracker | null = null;\n\n/** Records an event when product events are on (see `installProductEvents`); otherwise does nothing. */\nexport function trackStudioEvent(studioEvent: StudioProductEvent): void {\n if (studioEvent.event === 'graph_opened' && !PROJECT_ID_PATTERN.test(studioEvent.projectId)) {\n return;\n }\n\n tracker?.track(studioEvent);\n}\n\n/** Session storage flag: this desktop app launch was recorded (page reloads keep it, a relaunch does not). */\nexport const DESKTOP_LAUNCH_STORAGE_KEY = 'flexkit:desktop-launch-recorded';\n\nfunction readSessionFlag(key: string): boolean {\n try {\n return sessionStorage.getItem(key) === '1';\n } catch {\n return false;\n }\n}\n\nfunction writeSessionFlag(key: string): void {\n try {\n sessionStorage.setItem(key, '1');\n } catch {\n // Without session storage the backend's once-per-day count still applies.\n }\n}\n\n/**\n * Turns product events on for this environment and records the desktop app\n * launch (once per launch, once the user is signed in). Returns the function\n * that turns them off again.\n */\nexport function installProductEvents({ hosted }: { hosted: boolean }): () => void {\n if (!isStudioTelemetryEnabled({ hosted })) {\n return () => undefined;\n }\n\n const current = createProductEventTracker((body) =>\n postToUserApi(userApiPaths.productEvents, body, { keepalive: true })\n );\n const desktop = getDesktop();\n\n tracker = current;\n\n if (desktop && !readSessionFlag(DESKTOP_LAUNCH_STORAGE_KEY)) {\n current.track(\n { appVersion: desktop.version, event: 'desktop_app_opened', os: desktop.platform },\n { onDelivered: () => writeSessionFlag(DESKTOP_LAUNCH_STORAGE_KEY) }\n );\n }\n\n return () => {\n if (tracker === current) {\n tracker = null;\n }\n };\n}\n"]}
@@ -1,3 +1,3 @@
1
- import'./index.css';import {g,d as d$1}from'./chunk-WPCPL2TQ.js';import {b as b$1}from'./chunk-U45E5X3H.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Bot,Layout,FileStack,BookOpenText,Waypoints,SquarePlay}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import w,{mutate}from'swr';var d={name:"_asset",plural:"_assets",display:"originalFilename",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",hidden:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"url",label:"URL",scope:"global",hidden:true,readOnly:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var f={name:"_tag",plural:"_tags",display:"name",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};function x(){let{resolvedTheme:e}=b$1();return jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background",children:jsxs("div",{className:"fk:flex fk:flex-col fk:items-center",children:[e==="dark"?jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"#020817"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"white"})]}):jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"white"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"#020817"})]}),jsx("div",{className:"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse",children:"Loading..."})]})})}var _=Navigate;function o(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(x,{}),children:jsx(t,{})})}var J=o(()=>import('./root-GAB2SFFF.js').then(e=>({default:e.Root}))),X=o(()=>import('./list-GVATECOW.js').then(e=>({default:e.List}))),q=o(()=>import('./edit-entity-PVT34FD7.js').then(e=>({default:e.EditEntity}))),K=o(()=>import('./root-JWXXF653.js').then(e=>({default:e.Root}))),G=o(()=>import('./root-ZCXGZCUT.js').then(e=>({default:e.Root}))),$=o(()=>import('./list-HR55TZQX.js').then(e=>({default:e.List}))),Q=o(()=>import('./source-3YZNNITL.js').then(e=>({default:e.Source}))),Y=o(()=>import('./root-E35GZ7SV.js').then(e=>({default:e.Root}))),ee=o(()=>import('./root-54BI6S4V.js').then(e=>({default:e.Root}))),te=o(()=>import('./root-U52KZQSD.js').then(e=>({default:e.Root}))),oe=o(()=>import('./plugin-pages-BS2IMNRU.js').then(e=>({default:e.PluginsPage}))),ne=o(()=>import('./plugin-pages-BS2IMNRU.js').then(e=>({default:e.InstalledPluginsPage}))),ae=o(()=>import('./plugin-pages-BS2IMNRU.js').then(e=>({default:e.PluginDetailPage}))),T=o(()=>import('./chat-page-A7FG7WTN.js').then(e=>({default:e.AgentChatPage}))),ie=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.AutomationsPage}))),re=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.RunHistoryPage}))),se=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.ApprovalsPage}))),pe=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.ActivityPage}))),ce=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.ActivityItemPage}))),le=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.CreateAutomationPage}))),me=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.AutomationDetailPage}))),ue=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.RunsPage}))),de=o(()=>import('./pages-OJYYLSI3.js').then(e=>({default:e.RunDetailPage}))),fe=o(()=>import('./skills-pages-MA6JLBB4.js').then(e=>({default:e.SkillsPage}))),ge=o(()=>import('./skills-pages-MA6JLBB4.js').then(e=>({default:e.CreateSkillPage}))),he=o(()=>import('./skills-pages-MA6JLBB4.js').then(e=>({default:e.SkillDetailPage}))),l=[{name:"ai",icon:jsx(Bot,{strokeWidth:1.5}),title:"AI",component:te,routes:[{path:"plugins",component:oe},{path:"plugins/installed",component:ne},{path:"plugins/:pluginId",component:ae},{component:jsx(_,{replace:true,to:"agent"}),path:""},{component:T,path:"agent"},{component:T,path:"agent/chats/:chatId"},{component:ie,path:"automations"},{component:re,path:"runs"},{component:se,path:"approvals"},{component:pe,path:"activity"},{component:ce,path:"activity/:itemId"},{component:le,path:"automations/new"},{component:me,path:"automations/:automationId"},{component:ue,path:"automations/:automationId/runs"},{component:de,path:"automations/:automationId/runs/:runId"},{component:fe,path:"skills"},{component:ge,path:"skills/new"},{component:he,path:"skills/:skillId"}]},{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:J,routes:[{path:"list/:entity",component:X,children:[{path:"edit/:id",component:q}]}]},{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:K,routes:[]},{name:"knowledge",icon:jsx(BookOpenText,{strokeWidth:1.5}),title:"Knowledge",component:G,routes:[{component:$,path:""},{component:Q,path:":sourceId"}]},{name:"graph",icon:jsx(Waypoints,{strokeWidth:1.5}),title:"Graph",component:Y,routes:[]},{name:"explorer",icon:jsx(SquarePlay,{strokeWidth:1.5}),title:"Explorer",component:ee,routes:[]}];async function C(e){try{let t=await fetch(d$1(e).schema,{credentials:"include",mode:"cors"});if(!t.ok){let a=t.statusText||`Request failed with status ${String(t.status)}`;try{let i=await t.json();a=i.error??i.message??a;}catch{}return {ok:!1,projectId:e,error:{status:t.status,message:a}}}let n=await t.json();return {ok:!0,project:{...n,projectId:n.projectId||e}}}catch(t){return {ok:false,projectId:e,error:{status:0,message:t instanceof Error?t.message:"Network error"}}}}function b(e,t){let n=[],a={};for(let i of e??[])i.ok?n.push(i.project):a[i.projectId]=i.error;return {projects:n,errors:a,isLoading:t}}function L(e,t){let n=t&&e.length>0?["project-schemas",t,...e]:null,{data:a,isLoading:i}=w(n,()=>Promise.all(e.map(p=>C(p))),{revalidateOnFocus:false,revalidateOnReconnect:false});return b(a,!!n&&(i||a===void 0))}function Pe(e,t){return b(e?[e]:void 0,t)}function A(e,t){let n=t&&e?["project-schema",t,e]:null,{data:a,isLoading:i}=w(n,()=>C(e??""),{revalidateOnFocus:false,revalidateOnReconnect:false});return Pe(a,!!n&&(i||a===void 0))}function Se(e,t){return Array.isArray(e)&&(e[0]==="project-schema"||e[0]==="project-schemas")&&e.slice(2).includes(t)}function Fe(e){return mutate(t=>Se(t,e))}var R=createContext({mode:"projects",apps:l,contributions:{apps:l},currentProjectId:void 0,currentProject:void 0,currentProjectSchema:[],projects:[],projectIds:[],projectSummaries:[],schemaErrors:{},isLoadingSchemas:false});function xe(e){return [...e.filter(n=>n.name!==d.name&&n.name!==f.name),d,f]}function Xe({projectIds:e,projectSummaries:t=[],mode:n="projects",userId:a,children:i}){let{projectId:p}=useParams(),[,I]=g(),h=I.user?.id??a,V=L(n==="projects"?e:[],h),O=A(n==="hosted"&&p&&e.includes(p)?p:void 0,h),{projects:y,errors:P,isLoading:S}=n==="hosted"?O:V,m=useMemo(()=>e.map(s=>y.find(u=>u.projectId===s)).filter(s=>s!==void 0).map(s=>({...s,schema:xe(s.schema)})),[y,e]),H=useMemo(()=>{let s=m.find(u=>u.projectId===p);return {mode:n,apps:l,contributions:{apps:l},currentProjectId:p,currentProject:s,currentProjectSchema:s?.schema??[],projects:m,projectIds:e,projectSummaries:t,schemaErrors:P,isLoadingSchemas:S}},[p,P,S,n,e,t,m]);return jsx(R.Provider,{value:H,children:i})}function qe(){return useContext(R)}
2
- export{x as a,d as b,f as c,Fe as d,Xe as e,qe as f};//# sourceMappingURL=chunk-NSVX6HEN.js.map
3
- //# sourceMappingURL=chunk-NSVX6HEN.js.map
1
+ import'./index.css';import {g,d as d$1}from'./chunk-WPCPL2TQ.js';import {b as b$1}from'./chunk-U45E5X3H.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Bot,Layout,FileStack,BookOpenText,Waypoints,SquarePlay}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import w,{mutate}from'swr';var d={name:"_asset",plural:"_assets",display:"originalFilename",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",hidden:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"url",label:"URL",scope:"global",hidden:true,readOnly:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var f={name:"_tag",plural:"_tags",display:"name",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};function x(){let{resolvedTheme:e}=b$1();return jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background",children:jsxs("div",{className:"fk:flex fk:flex-col fk:items-center",children:[e==="dark"?jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"#020817"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"white"})]}):jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"white"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"#020817"})]}),jsx("div",{className:"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse",children:"Loading..."})]})})}var _=Navigate;function o(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(x,{}),children:jsx(t,{})})}var J=o(()=>import('./root-MDKGJJB4.js').then(e=>({default:e.Root}))),X=o(()=>import('./list-76SBWKGF.js').then(e=>({default:e.List}))),q=o(()=>import('./edit-entity-PVT34FD7.js').then(e=>({default:e.EditEntity}))),K=o(()=>import('./root-6Y5RN4PW.js').then(e=>({default:e.Root}))),G=o(()=>import('./root-FGVYUZZ6.js').then(e=>({default:e.Root}))),$=o(()=>import('./list-YIIXASZF.js').then(e=>({default:e.List}))),Q=o(()=>import('./source-ZLZHE7TL.js').then(e=>({default:e.Source}))),Y=o(()=>import('./root-BRC7XSCT.js').then(e=>({default:e.Root}))),ee=o(()=>import('./root-UKGHRHON.js').then(e=>({default:e.Root}))),te=o(()=>import('./root-RD5VRALH.js').then(e=>({default:e.Root}))),oe=o(()=>import('./plugin-pages-MLF2FUBT.js').then(e=>({default:e.PluginsPage}))),ne=o(()=>import('./plugin-pages-MLF2FUBT.js').then(e=>({default:e.InstalledPluginsPage}))),ae=o(()=>import('./plugin-pages-MLF2FUBT.js').then(e=>({default:e.PluginDetailPage}))),T=o(()=>import('./chat-page-Z7HA3GSH.js').then(e=>({default:e.AgentChatPage}))),ie=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.AutomationsPage}))),re=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.RunHistoryPage}))),se=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.ApprovalsPage}))),pe=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.ActivityPage}))),ce=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.ActivityItemPage}))),le=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.CreateAutomationPage}))),me=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.AutomationDetailPage}))),ue=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.RunsPage}))),de=o(()=>import('./pages-N3IGHP7Y.js').then(e=>({default:e.RunDetailPage}))),fe=o(()=>import('./skills-pages-LZCCHOJB.js').then(e=>({default:e.SkillsPage}))),ge=o(()=>import('./skills-pages-LZCCHOJB.js').then(e=>({default:e.CreateSkillPage}))),he=o(()=>import('./skills-pages-LZCCHOJB.js').then(e=>({default:e.SkillDetailPage}))),l=[{name:"ai",icon:jsx(Bot,{strokeWidth:1.5}),title:"AI",component:te,routes:[{path:"plugins",component:oe},{path:"plugins/installed",component:ne},{path:"plugins/:pluginId",component:ae},{component:jsx(_,{replace:true,to:"agent"}),path:""},{component:T,path:"agent"},{component:T,path:"agent/chats/:chatId"},{component:ie,path:"automations"},{component:re,path:"runs"},{component:se,path:"approvals"},{component:pe,path:"activity"},{component:ce,path:"activity/:itemId"},{component:le,path:"automations/new"},{component:me,path:"automations/:automationId"},{component:ue,path:"automations/:automationId/runs"},{component:de,path:"automations/:automationId/runs/:runId"},{component:fe,path:"skills"},{component:ge,path:"skills/new"},{component:he,path:"skills/:skillId"}]},{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:J,routes:[{path:"list/:entity",component:X,children:[{path:"edit/:id",component:q}]}]},{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:K,routes:[]},{name:"knowledge",icon:jsx(BookOpenText,{strokeWidth:1.5}),title:"Knowledge",component:G,routes:[{component:$,path:""},{component:Q,path:":sourceId"}]},{name:"graph",icon:jsx(Waypoints,{strokeWidth:1.5}),title:"Graph",component:Y,routes:[]},{name:"explorer",icon:jsx(SquarePlay,{strokeWidth:1.5}),title:"Explorer",component:ee,routes:[]}];async function C(e){try{let t=await fetch(d$1(e).schema,{credentials:"include",mode:"cors"});if(!t.ok){let a=t.statusText||`Request failed with status ${String(t.status)}`;try{let i=await t.json();a=i.error??i.message??a;}catch{}return {ok:!1,projectId:e,error:{status:t.status,message:a}}}let n=await t.json();return {ok:!0,project:{...n,projectId:n.projectId||e}}}catch(t){return {ok:false,projectId:e,error:{status:0,message:t instanceof Error?t.message:"Network error"}}}}function b(e,t){let n=[],a={};for(let i of e??[])i.ok?n.push(i.project):a[i.projectId]=i.error;return {projects:n,errors:a,isLoading:t}}function L(e,t){let n=t&&e.length>0?["project-schemas",t,...e]:null,{data:a,isLoading:i}=w(n,()=>Promise.all(e.map(p=>C(p))),{revalidateOnFocus:false,revalidateOnReconnect:false});return b(a,!!n&&(i||a===void 0))}function Pe(e,t){return b(e?[e]:void 0,t)}function A(e,t){let n=t&&e?["project-schema",t,e]:null,{data:a,isLoading:i}=w(n,()=>C(e??""),{revalidateOnFocus:false,revalidateOnReconnect:false});return Pe(a,!!n&&(i||a===void 0))}function Se(e,t){return Array.isArray(e)&&(e[0]==="project-schema"||e[0]==="project-schemas")&&e.slice(2).includes(t)}function Fe(e){return mutate(t=>Se(t,e))}var R=createContext({mode:"projects",apps:l,contributions:{apps:l},currentProjectId:void 0,currentProject:void 0,currentProjectSchema:[],projects:[],projectIds:[],projectSummaries:[],schemaErrors:{},isLoadingSchemas:false});function xe(e){return [...e.filter(n=>n.name!==d.name&&n.name!==f.name),d,f]}function Xe({projectIds:e,projectSummaries:t=[],mode:n="projects",userId:a,children:i}){let{projectId:p}=useParams(),[,I]=g(),h=I.user?.id??a,V=L(n==="projects"?e:[],h),O=A(n==="hosted"&&p&&e.includes(p)?p:void 0,h),{projects:y,errors:P,isLoading:S}=n==="hosted"?O:V,m=useMemo(()=>e.map(s=>y.find(u=>u.projectId===s)).filter(s=>s!==void 0).map(s=>({...s,schema:xe(s.schema)})),[y,e]),H=useMemo(()=>{let s=m.find(u=>u.projectId===p);return {mode:n,apps:l,contributions:{apps:l},currentProjectId:p,currentProject:s,currentProjectSchema:s?.schema??[],projects:m,projectIds:e,projectSummaries:t,schemaErrors:P,isLoadingSchemas:S}},[p,P,S,n,e,t,m]);return jsx(R.Provider,{value:H,children:i})}function qe(){return useContext(R)}
2
+ export{x as a,d as b,f as c,Fe as d,Xe as e,qe as f};//# sourceMappingURL=chunk-SK7C7CGH.js.map
3
+ //# sourceMappingURL=chunk-SK7C7CGH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/ui/components/loading.tsx","../src/core/apps/built-in-apps.tsx","../src/core/config/use-project-schemas.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","Loading","resolvedTheme","useTheme","jsx","jsxs","NavigateCompat","Navigate","lazyElement","loader","Component","lazy","Suspense","deskRoot","m","deskList","deskEditEntity","assetManagerRoot","knowledgeRoot","knowledgeList","knowledgeSource","graphRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiActivityPage","aiActivityItemPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","BotIcon","LayoutIcon","FileStackIcon","BookOpenTextIcon","WaypointsIcon","SquarePlayIcon","fetchProjectSchema","projectId","response","apiPaths","message","body","project","error","toProjectSchemasState","outcomes","isLoading","projects","errors","outcome","useProjectSchemas","projectIds","userId","key","data","useSWR","toProjectSchemaState","useProjectSchema","isProjectSchemaKey","revalidateProjectSchema","mutate","ConfigContext","createContext","upsertReservedEntities","schema","entity","ConfigProvider","projectSummaries","mode","children","currentProjectId","useParams","auth","useAuth","schemaUserId","allSchemas","currentSchema","loadedProjects","useMemo","value","currentProject","useConfig","useContext"],"mappings":"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","file":"chunk-NSVX6HEN.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n display: 'originalFilename',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 320,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 90,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 100,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n hidden: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'url',\n label: 'URL',\n scope: 'global',\n hidden: true,\n readOnly: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n display: 'name',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","import type { JSX } from 'react';\nimport { useTheme } from '../theme-context';\n\nexport function Loading(): JSX.Element {\n const { resolvedTheme } = useTheme();\n\n return (\n <div className=\"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background\">\n <div className=\"fk:flex fk:flex-col fk:items-center\">\n {resolvedTheme === 'dark' ? (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"#020817\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"white\"\n />\n </svg>\n ) : (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"white\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"#020817\"\n />\n </svg>\n )}\n <div className=\"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse\">Loading...</div>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense } from 'react';\nimport type { ComponentType, JSX } from 'react';\nimport {\n BookOpenText as BookOpenTextIcon,\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n Waypoints as WaypointsIcon,\n} from 'lucide-react';\nimport { Navigate } from 'react-router-dom';\nimport { Loading } from '../../ui/components/loading';\nimport type { AppOptions } from '../config/types';\n\nconst NavigateCompat = Navigate as unknown as ComponentType<{\n replace?: boolean;\n to: string;\n}>;\n\n/**\n * Wraps a lazily imported component in Suspense so each built-in app (and each of its routes)\n * is only downloaded when it is first rendered.\n */\nfunction lazyElement(loader: () => Promise<{ default: ComponentType }>): JSX.Element {\n const Component = lazy(loader);\n\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// Desk\nconst deskRoot = lazyElement(() => import('../../apps/desk/root').then((m) => ({ default: m.Root })));\nconst deskList = lazyElement(() => import('../../apps/desk/list').then((m) => ({ default: m.List })));\nconst deskEditEntity = lazyElement(() =>\n import('../../apps/desk/edit-entity').then((m) => ({ default: m.EditEntity }))\n);\n\n// Asset Manager\nconst assetManagerRoot = lazyElement(() => import('../../apps/asset-manager/root').then((m) => ({ default: m.Root })));\n\n// Knowledge\nconst knowledgeRoot = lazyElement(() => import('../../apps/knowledge/root').then((m) => ({ default: m.Root })));\nconst knowledgeList = lazyElement(() => import('../../apps/knowledge/list').then((m) => ({ default: m.List })));\nconst knowledgeSource = lazyElement(() => import('../../apps/knowledge/source').then((m) => ({ default: m.Source })));\n\n// Graph\nconst graphRoot = lazyElement(() => import('../../apps/graph/root').then((m) => ({ default: m.Root })));\n\n// Explorer\nconst explorerRoot = lazyElement(() => import('../../apps/explorer/root').then((m) => ({ default: m.Root })));\n\n// AI\nconst aiRoot = lazyElement(() => import('../../apps/ai/root').then((m) => ({ default: m.Root })));\nconst aiPluginsPage = lazyElement(() => import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage })));\nconst aiInstalledPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.InstalledPluginsPage }))\n);\nconst aiPluginDetailPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginDetailPage }))\n);\nconst aiAgentChatPage = lazyElement(() =>\n import('../../apps/ai/agent/chat-page').then((m) => ({ default: m.AgentChatPage }))\n);\nconst aiAutomationsPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationsPage }))\n);\nconst aiRunHistoryPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage })));\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiActivityPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ActivityPage })));\nconst aiActivityItemPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.ActivityItemPage }))\n);\nconst aiCreateAutomationPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.CreateAutomationPage }))\n);\nconst aiAutomationDetailPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationDetailPage }))\n);\nconst aiRunsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunsPage })));\nconst aiRunDetailPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunDetailPage })));\nconst aiSkillsPage = lazyElement(() => import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage })));\nconst aiCreateSkillPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.CreateSkillPage }))\n);\nconst aiSkillDetailPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillDetailPage }))\n);\n\nexport const builtInApps: AppOptions[] = [\n {\n name: 'ai',\n icon: <BotIcon strokeWidth={1.5} />,\n title: 'AI',\n component: aiRoot,\n routes: [\n { path: 'plugins', component: aiPluginsPage },\n { path: 'plugins/installed', component: aiInstalledPluginsPage },\n { path: 'plugins/:pluginId', component: aiPluginDetailPage },\n {\n component: <NavigateCompat replace to=\"agent\" />,\n path: '',\n },\n {\n component: aiAgentChatPage,\n path: 'agent',\n },\n {\n component: aiAgentChatPage,\n path: 'agent/chats/:chatId',\n },\n {\n component: aiAutomationsPage,\n path: 'automations',\n },\n {\n component: aiRunHistoryPage,\n path: 'runs',\n },\n {\n component: aiApprovalsPage,\n path: 'approvals',\n },\n {\n component: aiActivityPage,\n path: 'activity',\n },\n {\n component: aiActivityItemPage,\n path: 'activity/:itemId',\n },\n {\n component: aiCreateAutomationPage,\n path: 'automations/new',\n },\n {\n component: aiAutomationDetailPage,\n path: 'automations/:automationId',\n },\n {\n component: aiRunsPage,\n path: 'automations/:automationId/runs',\n },\n {\n component: aiRunDetailPage,\n path: 'automations/:automationId/runs/:runId',\n },\n {\n component: aiSkillsPage,\n path: 'skills',\n },\n {\n component: aiCreateSkillPage,\n path: 'skills/new',\n },\n {\n component: aiSkillDetailPage,\n path: 'skills/:skillId',\n },\n ],\n },\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: deskRoot,\n routes: [\n {\n path: 'list/:entity',\n component: deskList,\n children: [\n {\n path: 'edit/:id',\n component: deskEditEntity, // Not used, left here as an example of how to nest routes in apps\n },\n ],\n },\n ],\n },\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: assetManagerRoot,\n routes: [],\n },\n {\n name: 'knowledge',\n icon: <BookOpenTextIcon strokeWidth={1.5} />,\n title: 'Knowledge',\n component: knowledgeRoot,\n routes: [\n {\n component: knowledgeList,\n path: '',\n },\n {\n component: knowledgeSource,\n path: ':sourceId',\n },\n ],\n },\n {\n name: 'graph',\n icon: <WaypointsIcon strokeWidth={1.5} />,\n title: 'Graph',\n component: graphRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\n },\n];\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { apiPaths } from '../api-paths';\nimport type { ProjectSchemaError, ProjectUiConfig } from './types';\n\nexport type ProjectSchemasState = {\n projects: ProjectUiConfig[];\n errors: { [projectId: string]: ProjectSchemaError };\n isLoading: boolean;\n};\n\ntype FetchOutcome = { ok: true; project: ProjectUiConfig } | { ok: false; projectId: string; error: ProjectSchemaError };\n\nasync function fetchProjectSchema(projectId: string): Promise<FetchOutcome> {\n try {\n const response = await fetch(apiPaths(projectId).schema, { credentials: 'include', mode: 'cors' });\n\n if (!response.ok) {\n let message = response.statusText || `Request failed with status ${String(response.status)}`;\n\n try {\n const body = (await response.json()) as { error?: string; message?: string };\n message = body.error ?? body.message ?? message;\n } catch {\n // keep the status text\n }\n\n return { ok: false, projectId, error: { status: response.status, message } };\n }\n\n const project = (await response.json()) as ProjectUiConfig;\n\n return { ok: true, project: { ...project, projectId: project.projectId || projectId } };\n } catch (error) {\n return {\n ok: false,\n projectId,\n error: { status: 0, message: error instanceof Error ? error.message : 'Network error' },\n };\n }\n}\n\nexport function toProjectSchemasState(outcomes: FetchOutcome[] | undefined, isLoading: boolean): ProjectSchemasState {\n const projects: ProjectUiConfig[] = [];\n const errors: { [projectId: string]: ProjectSchemaError } = {};\n\n for (const outcome of outcomes ?? []) {\n if (outcome.ok) {\n projects.push(outcome.project);\n } else {\n errors[outcome.projectId] = outcome.error;\n }\n }\n\n return { projects, errors, isLoading };\n}\n\n/**\n * Loads the deployed schema of every project the Studio can open. Fetching\n * starts once the user is known (the endpoint needs a session) and the result\n * is kept for the lifetime of the page: schemas only change on deploy.\n */\nexport function useProjectSchemas(projectIds: string[], userId: string | undefined): ProjectSchemasState {\n const key = userId && projectIds.length > 0 ? ['project-schemas', userId, ...projectIds] : null;\n const { data, isLoading } = useSWR(key, () => Promise.all(projectIds.map((projectId) => fetchProjectSchema(projectId))), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemasState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** State of a single project's schema, in the same shape as the multi-project hook. */\nexport function toProjectSchemaState(outcome: FetchOutcome | undefined, isLoading: boolean): ProjectSchemasState {\n return toProjectSchemasState(outcome ? [outcome] : undefined, isLoading);\n}\n\n/**\n * Hosted mode: loads only the project currently open. Each project has its own\n * SWR key, so switching back to a project reuses the schema already fetched.\n */\nexport function useProjectSchema(projectId: string | undefined, userId: string | undefined): ProjectSchemasState {\n const key = userId && projectId ? ['project-schema', userId, projectId] : null;\n const { data, isLoading } = useSWR(key, () => fetchProjectSchema(projectId ?? ''), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemaState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** True for the SWR keys that hold `projectId`'s schema (single- and multi-project hooks). */\nexport function isProjectSchemaKey(key: unknown, projectId: string): boolean {\n return (\n Array.isArray(key) &&\n (key[0] === 'project-schema' || key[0] === 'project-schemas') &&\n key.slice(2).includes(projectId)\n );\n}\n\n/** Refetches the deployed schema of `projectId`, e.g. after the agent deployed a schema change. */\nexport function revalidateProjectSchema(projectId: string): Promise<unknown> {\n return mutate((key) => isProjectSchemaKey(key, projectId));\n}\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport { builtInApps } from '../apps/built-in-apps';\nimport type { AppOptions, ProjectSchemaError, ProjectSummary, ProjectUiConfig, StudioMode } from './types';\nimport type { Entity } from '../types';\nimport { useProjectSchema, useProjectSchemas } from './use-project-schemas';\n\nexport interface ConfigContext {\n /** `projects` when the host passed `projectIds`, `hosted` when the Studio listed the user's projects itself. */\n mode: StudioMode;\n /** The Studio apps shown in the app bar, in order. */\n apps: AppOptions[];\n /** Kept for callers that read `contributions.apps`; same list as `apps`. */\n contributions: {\n apps: AppOptions[];\n };\n currentProjectId?: string;\n /** The project named by the `:projectId` route param, once its schema has loaded. */\n currentProject?: ProjectUiConfig;\n currentProjectSchema: Entity[];\n /** Projects whose schema loaded, in `projectIds` order. */\n projects: ProjectUiConfig[];\n /** Every project id the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: name, avatar, role and team of each project, known before any schema loads. */\n projectSummaries: ProjectSummary[];\n /** Per project id: why its schema could not be loaded. */\n schemaErrors: { [projectId: string]: ProjectSchemaError };\n isLoadingSchemas: boolean;\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n mode: 'projects',\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId: undefined,\n currentProject: undefined,\n currentProjectSchema: [],\n projects: [],\n projectIds: [],\n projectSummaries: [],\n schemaErrors: {},\n isLoadingSchemas: false,\n});\n\n/** Appends the reserved asset and tag entities to a deployed schema. */\nexport function upsertReservedEntities(schema: Entity[]): Entity[] {\n const withoutReserved = schema.filter((entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name);\n\n return [...withoutReserved, assetSchema, tagSchema];\n}\n\nexport function ConfigProvider({\n projectIds,\n projectSummaries = [],\n mode = 'projects',\n userId,\n children,\n}: {\n projectIds: string[];\n projectSummaries?: ProjectSummary[];\n mode?: StudioMode;\n /** Hosted mode: the signed-in user's id, known before the per-project `/users/me` call. */\n userId?: string;\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const [, auth] = useAuth();\n const schemaUserId = auth.user?.id ?? userId;\n // Project mode loads every project up front (short, host-defined list); hosted mode only the one open.\n const allSchemas = useProjectSchemas(mode === 'projects' ? projectIds : [], schemaUserId);\n const currentSchema = useProjectSchema(\n mode === 'hosted' && currentProjectId && projectIds.includes(currentProjectId) ? currentProjectId : undefined,\n schemaUserId\n );\n const { projects: loadedProjects, errors, isLoading } = mode === 'hosted' ? currentSchema : allSchemas;\n const projects = useMemo(\n () =>\n projectIds\n .map((projectId) => loadedProjects.find((project) => project.projectId === projectId))\n .filter((project): project is ProjectUiConfig => project !== undefined)\n .map((project) => ({ ...project, schema: upsertReservedEntities(project.schema) })),\n [loadedProjects, projectIds]\n );\n\n const value = useMemo<ConfigContext>(() => {\n const currentProject = projects.find((project) => project.projectId === currentProjectId);\n\n return {\n mode,\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId,\n currentProject,\n currentProjectSchema: currentProject?.schema ?? [],\n projects,\n projectIds,\n projectSummaries,\n schemaErrors: errors,\n isLoadingSchemas: isLoading,\n };\n }, [currentProjectId, errors, isLoading, mode, projectIds, projectSummaries, projects]);\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n"]}
1
+ {"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/ui/components/loading.tsx","../src/core/apps/built-in-apps.tsx","../src/core/config/use-project-schemas.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","Loading","resolvedTheme","useTheme","jsx","jsxs","NavigateCompat","Navigate","lazyElement","loader","Component","lazy","Suspense","deskRoot","m","deskList","deskEditEntity","assetManagerRoot","knowledgeRoot","knowledgeList","knowledgeSource","graphRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiActivityPage","aiActivityItemPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","BotIcon","LayoutIcon","FileStackIcon","BookOpenTextIcon","WaypointsIcon","SquarePlayIcon","fetchProjectSchema","projectId","response","apiPaths","message","body","project","error","toProjectSchemasState","outcomes","isLoading","projects","errors","outcome","useProjectSchemas","projectIds","userId","key","data","useSWR","toProjectSchemaState","useProjectSchema","isProjectSchemaKey","revalidateProjectSchema","mutate","ConfigContext","createContext","upsertReservedEntities","schema","entity","ConfigProvider","projectSummaries","mode","children","currentProjectId","useParams","auth","useAuth","schemaUserId","allSchemas","currentSchema","loadedProjects","useMemo","value","currentProject","useConfig","useContext"],"mappings":"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","file":"chunk-SK7C7CGH.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n display: 'originalFilename',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 320,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 90,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 100,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n hidden: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'url',\n label: 'URL',\n scope: 'global',\n hidden: true,\n readOnly: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n display: 'name',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","import type { JSX } from 'react';\nimport { useTheme } from '../theme-context';\n\nexport function Loading(): JSX.Element {\n const { resolvedTheme } = useTheme();\n\n return (\n <div className=\"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background\">\n <div className=\"fk:flex fk:flex-col fk:items-center\">\n {resolvedTheme === 'dark' ? (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"#020817\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"white\"\n />\n </svg>\n ) : (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"white\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"#020817\"\n />\n </svg>\n )}\n <div className=\"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse\">Loading...</div>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense } from 'react';\nimport type { ComponentType, JSX } from 'react';\nimport {\n BookOpenText as BookOpenTextIcon,\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n Waypoints as WaypointsIcon,\n} from 'lucide-react';\nimport { Navigate } from 'react-router-dom';\nimport { Loading } from '../../ui/components/loading';\nimport type { AppOptions } from '../config/types';\n\nconst NavigateCompat = Navigate as unknown as ComponentType<{\n replace?: boolean;\n to: string;\n}>;\n\n/**\n * Wraps a lazily imported component in Suspense so each built-in app (and each of its routes)\n * is only downloaded when it is first rendered.\n */\nfunction lazyElement(loader: () => Promise<{ default: ComponentType }>): JSX.Element {\n const Component = lazy(loader);\n\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// Desk\nconst deskRoot = lazyElement(() => import('../../apps/desk/root').then((m) => ({ default: m.Root })));\nconst deskList = lazyElement(() => import('../../apps/desk/list').then((m) => ({ default: m.List })));\nconst deskEditEntity = lazyElement(() =>\n import('../../apps/desk/edit-entity').then((m) => ({ default: m.EditEntity }))\n);\n\n// Asset Manager\nconst assetManagerRoot = lazyElement(() => import('../../apps/asset-manager/root').then((m) => ({ default: m.Root })));\n\n// Knowledge\nconst knowledgeRoot = lazyElement(() => import('../../apps/knowledge/root').then((m) => ({ default: m.Root })));\nconst knowledgeList = lazyElement(() => import('../../apps/knowledge/list').then((m) => ({ default: m.List })));\nconst knowledgeSource = lazyElement(() => import('../../apps/knowledge/source').then((m) => ({ default: m.Source })));\n\n// Graph\nconst graphRoot = lazyElement(() => import('../../apps/graph/root').then((m) => ({ default: m.Root })));\n\n// Explorer\nconst explorerRoot = lazyElement(() => import('../../apps/explorer/root').then((m) => ({ default: m.Root })));\n\n// AI\nconst aiRoot = lazyElement(() => import('../../apps/ai/root').then((m) => ({ default: m.Root })));\nconst aiPluginsPage = lazyElement(() => import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage })));\nconst aiInstalledPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.InstalledPluginsPage }))\n);\nconst aiPluginDetailPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginDetailPage }))\n);\nconst aiAgentChatPage = lazyElement(() =>\n import('../../apps/ai/agent/chat-page').then((m) => ({ default: m.AgentChatPage }))\n);\nconst aiAutomationsPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationsPage }))\n);\nconst aiRunHistoryPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage })));\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiActivityPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ActivityPage })));\nconst aiActivityItemPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.ActivityItemPage }))\n);\nconst aiCreateAutomationPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.CreateAutomationPage }))\n);\nconst aiAutomationDetailPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationDetailPage }))\n);\nconst aiRunsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunsPage })));\nconst aiRunDetailPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunDetailPage })));\nconst aiSkillsPage = lazyElement(() => import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage })));\nconst aiCreateSkillPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.CreateSkillPage }))\n);\nconst aiSkillDetailPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillDetailPage }))\n);\n\nexport const builtInApps: AppOptions[] = [\n {\n name: 'ai',\n icon: <BotIcon strokeWidth={1.5} />,\n title: 'AI',\n component: aiRoot,\n routes: [\n { path: 'plugins', component: aiPluginsPage },\n { path: 'plugins/installed', component: aiInstalledPluginsPage },\n { path: 'plugins/:pluginId', component: aiPluginDetailPage },\n {\n component: <NavigateCompat replace to=\"agent\" />,\n path: '',\n },\n {\n component: aiAgentChatPage,\n path: 'agent',\n },\n {\n component: aiAgentChatPage,\n path: 'agent/chats/:chatId',\n },\n {\n component: aiAutomationsPage,\n path: 'automations',\n },\n {\n component: aiRunHistoryPage,\n path: 'runs',\n },\n {\n component: aiApprovalsPage,\n path: 'approvals',\n },\n {\n component: aiActivityPage,\n path: 'activity',\n },\n {\n component: aiActivityItemPage,\n path: 'activity/:itemId',\n },\n {\n component: aiCreateAutomationPage,\n path: 'automations/new',\n },\n {\n component: aiAutomationDetailPage,\n path: 'automations/:automationId',\n },\n {\n component: aiRunsPage,\n path: 'automations/:automationId/runs',\n },\n {\n component: aiRunDetailPage,\n path: 'automations/:automationId/runs/:runId',\n },\n {\n component: aiSkillsPage,\n path: 'skills',\n },\n {\n component: aiCreateSkillPage,\n path: 'skills/new',\n },\n {\n component: aiSkillDetailPage,\n path: 'skills/:skillId',\n },\n ],\n },\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: deskRoot,\n routes: [\n {\n path: 'list/:entity',\n component: deskList,\n children: [\n {\n path: 'edit/:id',\n component: deskEditEntity, // Not used, left here as an example of how to nest routes in apps\n },\n ],\n },\n ],\n },\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: assetManagerRoot,\n routes: [],\n },\n {\n name: 'knowledge',\n icon: <BookOpenTextIcon strokeWidth={1.5} />,\n title: 'Knowledge',\n component: knowledgeRoot,\n routes: [\n {\n component: knowledgeList,\n path: '',\n },\n {\n component: knowledgeSource,\n path: ':sourceId',\n },\n ],\n },\n {\n name: 'graph',\n icon: <WaypointsIcon strokeWidth={1.5} />,\n title: 'Graph',\n component: graphRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\n },\n];\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { apiPaths } from '../api-paths';\nimport type { ProjectSchemaError, ProjectUiConfig } from './types';\n\nexport type ProjectSchemasState = {\n projects: ProjectUiConfig[];\n errors: { [projectId: string]: ProjectSchemaError };\n isLoading: boolean;\n};\n\ntype FetchOutcome = { ok: true; project: ProjectUiConfig } | { ok: false; projectId: string; error: ProjectSchemaError };\n\nasync function fetchProjectSchema(projectId: string): Promise<FetchOutcome> {\n try {\n const response = await fetch(apiPaths(projectId).schema, { credentials: 'include', mode: 'cors' });\n\n if (!response.ok) {\n let message = response.statusText || `Request failed with status ${String(response.status)}`;\n\n try {\n const body = (await response.json()) as { error?: string; message?: string };\n message = body.error ?? body.message ?? message;\n } catch {\n // keep the status text\n }\n\n return { ok: false, projectId, error: { status: response.status, message } };\n }\n\n const project = (await response.json()) as ProjectUiConfig;\n\n return { ok: true, project: { ...project, projectId: project.projectId || projectId } };\n } catch (error) {\n return {\n ok: false,\n projectId,\n error: { status: 0, message: error instanceof Error ? error.message : 'Network error' },\n };\n }\n}\n\nexport function toProjectSchemasState(outcomes: FetchOutcome[] | undefined, isLoading: boolean): ProjectSchemasState {\n const projects: ProjectUiConfig[] = [];\n const errors: { [projectId: string]: ProjectSchemaError } = {};\n\n for (const outcome of outcomes ?? []) {\n if (outcome.ok) {\n projects.push(outcome.project);\n } else {\n errors[outcome.projectId] = outcome.error;\n }\n }\n\n return { projects, errors, isLoading };\n}\n\n/**\n * Loads the deployed schema of every project the Studio can open. Fetching\n * starts once the user is known (the endpoint needs a session) and the result\n * is kept for the lifetime of the page: schemas only change on deploy.\n */\nexport function useProjectSchemas(projectIds: string[], userId: string | undefined): ProjectSchemasState {\n const key = userId && projectIds.length > 0 ? ['project-schemas', userId, ...projectIds] : null;\n const { data, isLoading } = useSWR(key, () => Promise.all(projectIds.map((projectId) => fetchProjectSchema(projectId))), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemasState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** State of a single project's schema, in the same shape as the multi-project hook. */\nexport function toProjectSchemaState(outcome: FetchOutcome | undefined, isLoading: boolean): ProjectSchemasState {\n return toProjectSchemasState(outcome ? [outcome] : undefined, isLoading);\n}\n\n/**\n * Hosted mode: loads only the project currently open. Each project has its own\n * SWR key, so switching back to a project reuses the schema already fetched.\n */\nexport function useProjectSchema(projectId: string | undefined, userId: string | undefined): ProjectSchemasState {\n const key = userId && projectId ? ['project-schema', userId, projectId] : null;\n const { data, isLoading } = useSWR(key, () => fetchProjectSchema(projectId ?? ''), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemaState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** True for the SWR keys that hold `projectId`'s schema (single- and multi-project hooks). */\nexport function isProjectSchemaKey(key: unknown, projectId: string): boolean {\n return (\n Array.isArray(key) &&\n (key[0] === 'project-schema' || key[0] === 'project-schemas') &&\n key.slice(2).includes(projectId)\n );\n}\n\n/** Refetches the deployed schema of `projectId`, e.g. after the agent deployed a schema change. */\nexport function revalidateProjectSchema(projectId: string): Promise<unknown> {\n return mutate((key) => isProjectSchemaKey(key, projectId));\n}\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport { builtInApps } from '../apps/built-in-apps';\nimport type { AppOptions, ProjectSchemaError, ProjectSummary, ProjectUiConfig, StudioMode } from './types';\nimport type { Entity } from '../types';\nimport { useProjectSchema, useProjectSchemas } from './use-project-schemas';\n\nexport interface ConfigContext {\n /** `projects` when the host passed `projectIds`, `hosted` when the Studio listed the user's projects itself. */\n mode: StudioMode;\n /** The Studio apps shown in the app bar, in order. */\n apps: AppOptions[];\n /** Kept for callers that read `contributions.apps`; same list as `apps`. */\n contributions: {\n apps: AppOptions[];\n };\n currentProjectId?: string;\n /** The project named by the `:projectId` route param, once its schema has loaded. */\n currentProject?: ProjectUiConfig;\n currentProjectSchema: Entity[];\n /** Projects whose schema loaded, in `projectIds` order. */\n projects: ProjectUiConfig[];\n /** Every project id the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: name, avatar, role and team of each project, known before any schema loads. */\n projectSummaries: ProjectSummary[];\n /** Per project id: why its schema could not be loaded. */\n schemaErrors: { [projectId: string]: ProjectSchemaError };\n isLoadingSchemas: boolean;\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n mode: 'projects',\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId: undefined,\n currentProject: undefined,\n currentProjectSchema: [],\n projects: [],\n projectIds: [],\n projectSummaries: [],\n schemaErrors: {},\n isLoadingSchemas: false,\n});\n\n/** Appends the reserved asset and tag entities to a deployed schema. */\nexport function upsertReservedEntities(schema: Entity[]): Entity[] {\n const withoutReserved = schema.filter((entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name);\n\n return [...withoutReserved, assetSchema, tagSchema];\n}\n\nexport function ConfigProvider({\n projectIds,\n projectSummaries = [],\n mode = 'projects',\n userId,\n children,\n}: {\n projectIds: string[];\n projectSummaries?: ProjectSummary[];\n mode?: StudioMode;\n /** Hosted mode: the signed-in user's id, known before the per-project `/users/me` call. */\n userId?: string;\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const [, auth] = useAuth();\n const schemaUserId = auth.user?.id ?? userId;\n // Project mode loads every project up front (short, host-defined list); hosted mode only the one open.\n const allSchemas = useProjectSchemas(mode === 'projects' ? projectIds : [], schemaUserId);\n const currentSchema = useProjectSchema(\n mode === 'hosted' && currentProjectId && projectIds.includes(currentProjectId) ? currentProjectId : undefined,\n schemaUserId\n );\n const { projects: loadedProjects, errors, isLoading } = mode === 'hosted' ? currentSchema : allSchemas;\n const projects = useMemo(\n () =>\n projectIds\n .map((projectId) => loadedProjects.find((project) => project.projectId === projectId))\n .filter((project): project is ProjectUiConfig => project !== undefined)\n .map((project) => ({ ...project, schema: upsertReservedEntities(project.schema) })),\n [loadedProjects, projectIds]\n );\n\n const value = useMemo<ConfigContext>(() => {\n const currentProject = projects.find((project) => project.projectId === currentProjectId);\n\n return {\n mode,\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId,\n currentProject,\n currentProjectSchema: currentProject?.schema ?? [],\n projects,\n projectIds,\n projectSummaries,\n schemaErrors: errors,\n isLoadingSchemas: isLoading,\n };\n }, [currentProjectId, errors, isLoading, mode, projectIds, projectSummaries, projects]);\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {c}from'./chunk-XMOSCJOI.js';import {a}from'./chunk-ERDARDGB.js';import {f}from'./chunk-NSVX6HEN.js';import {d}from'./chunk-WPCPL2TQ.js';import {useMemo}from'react';import A from'swr';import {find,propEq}from'ramda';function T(n,o){let{scope:c$1}=c(),{currentProject:r}=f(),a=useMemo(()=>r?.schema??[],[r]),m=r?.scopes?.find(t=>t.isDefault)?.name??"default",e=o?.commonParams.q?JSON.stringify(o):null,{data:s,error:i,isLoading:y}=A(e,()=>fetch(d(n).search,{headers:{"Content-Type":"application/json"},body:JSON.stringify(o),method:"POST",mode:"cors"}).then(t=>t.json()),{keepPreviousData:true});return {results:useMemo(()=>e?E(s?.results??[],n,a,c$1,m)??[]:[],[s,m,n,a,c$1,e]),error:i,isLoading:y}}function E(n,o,c,r,a$1){return n?.filter(l=>l?.hits?.length>0).map(l=>{let m=l,e=m.collection.replace(`${o}_`,"").replace(/_\d+$/,""),s=find(propEq(e,"plural"))(c);if(!s)return [];let i=a(s)?.name??"",y=s?.name??e;return m.hits.map(({document:u})=>{let t=u[i],b=(t&&typeof t!="string"?t[r]??t[a$1]:null)??u[i],N=Object.entries(u).reduce((d,[p,f])=>{if(p!==i&&p!=="id"&&p!=="_updatedAt"){let _=typeof f!="string"?f[r]??f[a$1]:f;d[p]=_;}return d},{});return {_id:u.id,_entityName:y,_entityNamePlural:e,[i]:b,...N}})}).flat()}export{T as a};//# sourceMappingURL=chunk-3IUKXOKF.js.map
2
- //# sourceMappingURL=chunk-3IUKXOKF.js.map
1
+ import'./index.css';import {c}from'./chunk-XMOSCJOI.js';import {a}from'./chunk-ERDARDGB.js';import {f}from'./chunk-SK7C7CGH.js';import {d}from'./chunk-WPCPL2TQ.js';import {useMemo}from'react';import A from'swr';import {find,propEq}from'ramda';function T(n,o){let{scope:c$1}=c(),{currentProject:r}=f(),a=useMemo(()=>r?.schema??[],[r]),m=r?.scopes?.find(t=>t.isDefault)?.name??"default",e=o?.commonParams.q?JSON.stringify(o):null,{data:s,error:i,isLoading:y}=A(e,()=>fetch(d(n).search,{headers:{"Content-Type":"application/json"},body:JSON.stringify(o),method:"POST",mode:"cors"}).then(t=>t.json()),{keepPreviousData:true});return {results:useMemo(()=>e?E(s?.results??[],n,a,c$1,m)??[]:[],[s,m,n,a,c$1,e]),error:i,isLoading:y}}function E(n,o,c,r,a$1){return n?.filter(l=>l?.hits?.length>0).map(l=>{let m=l,e=m.collection.replace(`${o}_`,"").replace(/_\d+$/,""),s=find(propEq(e,"plural"))(c);if(!s)return [];let i=a(s)?.name??"",y=s?.name??e;return m.hits.map(({document:u})=>{let t=u[i],b=(t&&typeof t!="string"?t[r]??t[a$1]:null)??u[i],N=Object.entries(u).reduce((d,[p,f])=>{if(p!==i&&p!=="id"&&p!=="_updatedAt"){let _=typeof f!="string"?f[r]??f[a$1]:f;d[p]=_;}return d},{});return {_id:u.id,_entityName:y,_entityNamePlural:e,[i]:b,...N}})}).flat()}export{T as a};//# sourceMappingURL=chunk-SKHHYRVA.js.map
2
+ //# sourceMappingURL=chunk-SKHHYRVA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/use-search.tsx"],"names":["useSearch","projectId","searchRequest","scope","useAppContext","currentProject","useConfig","schema","useMemo","defaultScope","s","swrKey","data","error","isLoading","useSWR","apiPaths","res","mapResults","results","result","item","entityNamePlural","entitySchema","find","propEq","primaryAttributeName","getDisplayAttribute","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"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","file":"chunk-3IUKXOKF.js","sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport useSWR from 'swr';\nimport { find, propEq } from 'ramda';\nimport { apiPaths } from './api-paths';\nimport { useAppContext } from './app-context';\nimport { useConfig } from './config/config-context';\nimport { getDisplayAttribute } from './get-display-attribute';\nimport type { Entity, RawResultItem, RawSearchResultItems, SearchRequestProps, SearchResultItem } from './types';\n\nexport function useSearch(\n projectId: string,\n searchRequest: SearchRequestProps | null\n): { results: SearchResultItem[] | []; error: Error; isLoading: boolean } {\n const { scope } = useAppContext();\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const scopes = currentProject?.scopes;\n const defaultScope = scopes?.find((s) => s.isDefault)?.name ?? 'default';\n const swrKey = searchRequest?.commonParams.q ? JSON.stringify(searchRequest) : null;\n const { data, error, isLoading } = useSWR(\n swrKey,\n () =>\n fetch(apiPaths(projectId).search, {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(searchRequest),\n method: 'POST',\n mode: 'cors',\n }).then((res) => res.json() as Promise<{ results: RawSearchResultItems }>),\n // Show the previous hits until the next request lands instead of flashing an empty list per keystroke.\n { keepPreviousData: true }\n );\n const results = useMemo(\n // SWR keeps the previous key's data while a new key loads, and also after the key becomes null.\n // Callers treat an empty query as \"no search\", so return no hits once there is nothing to search for.\n () => (swrKey ? (mapResults(data?.results ?? [], projectId, schema, scope, defaultScope) ?? []) : []),\n [data, defaultScope, projectId, schema, scope, swrKey]\n );\n\n return { results, error, isLoading };\n}\n\nfunction mapResults(\n results: RawSearchResultItems | undefined,\n projectId: string,\n schema: Entity[],\n scope: string,\n defaultScope: string\n): SearchResultItem[] | undefined {\n return results\n ?.filter((result) => (result as RawResultItem)?.hits?.length > 0)\n .map((result) => {\n const item = result as RawResultItem;\n const entityNamePlural = item.collection.replace(`${projectId}_`, '').replace(/_\\d+$/, '');\n const entitySchema = find<Entity>(propEq(entityNamePlural, 'plural'))(schema);\n\n if (!entitySchema) {\n return [];\n }\n\n const primaryAttributeName = getDisplayAttribute(entitySchema)?.name ?? '';\n const entityName = entitySchema?.name ?? entityNamePlural;\n\n // iterate over the hits and return an object with the primary attribute value first and then the rest of the attributes.\n return item.hits.map(({ document }) => {\n const primaryAttribute = document[primaryAttributeName];\n const scopedPrimaryAttribute =\n primaryAttribute && typeof primaryAttribute !== 'string'\n ? (primaryAttribute[scope] ?? primaryAttribute[defaultScope])\n : null;\n const primaryAttributeValue = scopedPrimaryAttribute ?? document[primaryAttributeName];\n const attributes = Object.entries(document).reduce(\n (acc: Omit<SearchResultItem, '_id' | '_entityName' | '_entityNamePlural'>, [key, value]) => {\n if (key !== primaryAttributeName && key !== 'id' && key !== '_updatedAt') {\n const scopedValue = typeof value !== 'string' ? (value[scope] ?? value[defaultScope]) : value;\n\n acc[key] = scopedValue;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n _id: document.id,\n _entityName: entityName,\n _entityNamePlural: entityNamePlural,\n [primaryAttributeName]: primaryAttributeValue as string,\n ...attributes,\n };\n });\n })\n .flat();\n}\n"]}
1
+ {"version":3,"sources":["../src/core/use-search.tsx"],"names":["useSearch","projectId","searchRequest","scope","useAppContext","currentProject","useConfig","schema","useMemo","defaultScope","s","swrKey","data","error","isLoading","useSWR","apiPaths","res","mapResults","results","result","item","entityNamePlural","entitySchema","find","propEq","primaryAttributeName","getDisplayAttribute","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"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","file":"chunk-SKHHYRVA.js","sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport useSWR from 'swr';\nimport { find, propEq } from 'ramda';\nimport { apiPaths } from './api-paths';\nimport { useAppContext } from './app-context';\nimport { useConfig } from './config/config-context';\nimport { getDisplayAttribute } from './get-display-attribute';\nimport type { Entity, RawResultItem, RawSearchResultItems, SearchRequestProps, SearchResultItem } from './types';\n\nexport function useSearch(\n projectId: string,\n searchRequest: SearchRequestProps | null\n): { results: SearchResultItem[] | []; error: Error; isLoading: boolean } {\n const { scope } = useAppContext();\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const scopes = currentProject?.scopes;\n const defaultScope = scopes?.find((s) => s.isDefault)?.name ?? 'default';\n const swrKey = searchRequest?.commonParams.q ? JSON.stringify(searchRequest) : null;\n const { data, error, isLoading } = useSWR(\n swrKey,\n () =>\n fetch(apiPaths(projectId).search, {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(searchRequest),\n method: 'POST',\n mode: 'cors',\n }).then((res) => res.json() as Promise<{ results: RawSearchResultItems }>),\n // Show the previous hits until the next request lands instead of flashing an empty list per keystroke.\n { keepPreviousData: true }\n );\n const results = useMemo(\n // SWR keeps the previous key's data while a new key loads, and also after the key becomes null.\n // Callers treat an empty query as \"no search\", so return no hits once there is nothing to search for.\n () => (swrKey ? (mapResults(data?.results ?? [], projectId, schema, scope, defaultScope) ?? []) : []),\n [data, defaultScope, projectId, schema, scope, swrKey]\n );\n\n return { results, error, isLoading };\n}\n\nfunction mapResults(\n results: RawSearchResultItems | undefined,\n projectId: string,\n schema: Entity[],\n scope: string,\n defaultScope: string\n): SearchResultItem[] | undefined {\n return results\n ?.filter((result) => (result as RawResultItem)?.hits?.length > 0)\n .map((result) => {\n const item = result as RawResultItem;\n const entityNamePlural = item.collection.replace(`${projectId}_`, '').replace(/_\\d+$/, '');\n const entitySchema = find<Entity>(propEq(entityNamePlural, 'plural'))(schema);\n\n if (!entitySchema) {\n return [];\n }\n\n const primaryAttributeName = getDisplayAttribute(entitySchema)?.name ?? '';\n const entityName = entitySchema?.name ?? entityNamePlural;\n\n // iterate over the hits and return an object with the primary attribute value first and then the rest of the attributes.\n return item.hits.map(({ document }) => {\n const primaryAttribute = document[primaryAttributeName];\n const scopedPrimaryAttribute =\n primaryAttribute && typeof primaryAttribute !== 'string'\n ? (primaryAttribute[scope] ?? primaryAttribute[defaultScope])\n : null;\n const primaryAttributeValue = scopedPrimaryAttribute ?? document[primaryAttributeName];\n const attributes = Object.entries(document).reduce(\n (acc: Omit<SearchResultItem, '_id' | '_entityName' | '_entityNamePlural'>, [key, value]) => {\n if (key !== primaryAttributeName && key !== 'id' && key !== '_updatedAt') {\n const scopedValue = typeof value !== 'string' ? (value[scope] ?? value[defaultScope]) : value;\n\n acc[key] = scopedValue;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n _id: document.id,\n _entityName: entityName,\n _entityNamePlural: entityNamePlural,\n [primaryAttributeName]: primaryAttributeValue as string,\n ...attributes,\n };\n });\n })\n .flat();\n}\n"]}
@@ -1,4 +1,4 @@
1
- import'./index.css';import {e,d,a as a$2,c,b as b$1}from'./chunk-AKW7EKYI.js';import {a}from'./chunk-YDVO6XWD.js';import {a as a$1}from'./chunk-ERDARDGB.js';import {b,c as c$1}from'./chunk-NSVX6HEN.js';import {find,propEq,omit,pick,toPairs,uniq,uniqBy,prop}from'ramda';import {useState,useRef,useMemo,useEffect,useCallback}from'react';import {gql,NetworkStatus}from'@apollo/client';import {useQuery}from'@apollo/client/react';var Gt=25,yn=3,Wt=3,mn=["id","string"],hn=["date","datetime","duration","time"],$t=`_id
1
+ import'./index.css';import {e,d,a as a$2,c,b as b$1}from'./chunk-JTUOTP5S.js';import {a}from'./chunk-YDVO6XWD.js';import {a as a$1}from'./chunk-ERDARDGB.js';import {b,c as c$1}from'./chunk-SK7C7CGH.js';import {find,propEq,omit,pick,toPairs,uniq,uniqBy,prop}from'ramda';import {useState,useRef,useMemo,useEffect,useCallback}from'react';import {gql,NetworkStatus}from'@apollo/client';import {useQuery}from'@apollo/client/react';var Gt=25,yn=3,Wt=3,mn=["id","string"],hn=["date","datetime","duration","time"],$t=`_id
2
2
  originalFilename
3
3
  mimeType
4
4
  path
@@ -374,5 +374,5 @@ ${A} ]
374
374
  }
375
375
  }
376
376
  }
377
- `}}var nt=t=>t.charAt(0).toUpperCase()+t.slice(1);function v(t){let n=t.split(/[^0-9A-Za-z]+/).filter(Boolean).map(nt).join("");return n?/^[A-Za-z_]/.test(n)?n:`Entity${n}`:"Entity"}function U(t,n){return n==="_assets"?b:find(propEq(n,"plural"))(t)}function ee(t,n,e){if(!t||typeof t!="object")return {};let r=U(e,n);if(!r)return {};let i=`update${nt(n)}`,s=t[i];if(!s||typeof s!="object")return {};let o=s[n],c=Array.isArray(o)?o[0]:void 0;return !c||typeof c!="object"?{}:r.attributes.reduce((u,l)=>{if(a(l)!=="local")return u;let d=B(c[l.name])?._id;return typeof d!="string"||d.length===0?u:{...u,[l.name]:d}},{})}var dt=null,_t=new Set,en=[],Rt=new Set,It=new Set,wt=new Set;function oe(t,n){if(t==="_asset"||t==="_assets")return `Get${v(b.plural)}`;let e=n.find(s=>s.plural===t),r=n.find(s=>s.name===t),i=e?.plural??r?.plural??t;return `Get${v(i)}`}function rn(t){return Rt.add(t),()=>{Rt.delete(t);}}function sn(t){return It.add(t),()=>{It.delete(t);}}function on(t){return wt.add(t),()=>{wt.delete(t);}}function ue(t,n,e){let r=new Set(e.filter(Boolean));if(r.size>0)for(let i of It)i(n,r);return jn(t,n)}function le(t,n){let e=n.filter(r=>!!r._id);if(e.length!==0)for(let r of wt)r(t,e);}function jn(t,n){return _t.add(n),new Promise((e,r)=>{en.push({resolve:e,reject:r}),dt&&clearTimeout(dt),dt=setTimeout(()=>{let i=new Set(_t),s=en.splice(0);_t.clear(),dt=null,Promise.all([...Rt].map(o=>Promise.resolve(o(i)))).then(()=>{for(let{resolve:o}of s)o();}).catch(o=>{console.error("Error refreshing entity lists:",o);for(let{reject:c}of s)c(o);});},50);})}function $e({entityNamePlural:t,schema:n,scope:e$1,variables:r,isForm:i,selection:s="full",includeCount:o=true}){let[c$1,u]=useState({count:0,results:[]}),[l,a]=useState(false),[d$1,f]=useState(false),[g,h]=useState(null),y=useRef(false),A=useRef(false),p=useRef(0),m=useRef(null),E=useRef(null),T=`${t}Total`,F=U(n,t),Q=r?.where===void 0&&(F?.spaces?.length??0)===0&&(g?.field!==T||g.schema!==n)?"total":"aggregate",J=useMemo(()=>gql(at(t,e$1,n,{selection:s,countMode:Q,includeCount:o}).query),[t,e$1,n,s,Q,o]),z=useMemo(()=>gql(at(t,e$1,n,{selection:s,includeCount:false}).query),[t,e$1,n,s]),{schemaErrorMessage:$,setSchemaErrorMessage:R}=e(),{loading:q,data:j,fetchMore:it,refetch:st,error:ot,networkStatus:H}=useQuery(J,{variables:r,notifyOnNetworkStatusChange:true}),Lt=useRef(it),gt=useRef(st),Ft=useRef(z),Ct=useRef(H),Tt=useRef(r);Lt.current=it,gt.current=st,Ft.current=z,Tt.current=r;let yt=o&&d(ot,T),Mt=Q==="total"&&yt,G=yt?void 0:ot,Y=yt&&!j?.[t],Qt=a$2(G),P=c(G),{isProjectDisabled:an,isProjectReadOnly:dn}=(()=>{if(Qt?.statusCode===403){let I=b$1(Qt.bodyText);if(I&&typeof I.code=="string"){if(I.code==="PROJECT_PAUSED")return {isProjectDisabled:true,isProjectReadOnly:false};if(I.code==="READ_ONLY_MODE")return {isProjectDisabled:false,isProjectReadOnly:true}}return {isProjectDisabled:true,isProjectReadOnly:false}}return {isProjectDisabled:false,isProjectReadOnly:false}})();useEffect(()=>{Mt&&h({field:T,schema:n});},[n,Mt,T]);let fn=useCallback(I=>{if(y.current||A.current)return;y.current=true,a(true);let{limit:x}=I.variables,k=p.current;Lt.current({...I,query:Ft.current,variables:{...Tt.current,...I.variables,offset:k,limit:x}}).then(({data:X})=>{let M=rt({data:X,entityNamePlural:t,isForm:i,schema:n,scope:e$1}),D=M.results.length;p.current=k+(D===0?0:Math.min(D,x)),u(C=>{let W=uniqBy(prop("_id"),[...C.results,...M.results]);return W.length===C.results.length?{count:C.results.length,results:C.results}:{count:M.count||C.count,results:W}});}).catch(X=>{console.error("Error fetching more data:",X);}).finally(()=>{y.current=false,a(false);});},[t,i,n,e$1]),pn=useCallback(I=>{if(A.current)return Promise.resolve();let x=I?.preserve===true;return A.current=true,y.current=false,a(false),x||(m.current=null,E.current=null,p.current=0,f(true),u({count:0,results:[]})),gt.current().then(({data:k})=>{let X=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),M=rt({data:k,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=X,E.current=null,p.current=pt(r)+M.results.length,u(M);}).catch(k=>{console.error("Error reloading data:",k);}).finally(()=>{A.current=false,f(false);})},[t,i,n,e$1,s,o,r]);return useEffect(()=>{if(P){R(P);return}j&&$&&!G&&R(null);},[j,G,$,P,R]),useEffect(()=>{if(G||P||Y)return;let I=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r});if(m.current===I)return;if(q&&E.current!==I){E.current=I,p.current=0,u({count:0,results:[]});return}if(q)return;let x=rt({data:j,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=I,E.current=null,p.current=pt(r)+x.results.length,u(x);},[j,G,t,i,q,Y,n,P,e$1,s,o,r]),useEffect(()=>{let I=Ct.current;if(Ct.current=H,G||P||A.current||Y||I!==NetworkStatus.refetch||H!==NetworkStatus.ready||!j)return;let x=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),k=rt({data:j,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=x,E.current=null,p.current=pt(r)+k.results.length,u(k);},[j,G,t,i,Y,H,n,P,e$1,s,o,r]),useEffect(()=>{if(i)return;let I=`Get${v(t)}`,x=rn(M=>{if(!(!M.has(I)||y.current||A.current))return gt.current().then(({data:D})=>{let C=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),W=rt({data:D,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=C,E.current=null,p.current=pt(r)+W.results.length,u(W);}).catch(D=>{console.error("Error soft-refreshing entity list:",D);})}),k=sn((M,D)=>{M===I&&u(C=>{let W=C.results.filter(xt=>{let kt=typeof xt._id=="string"?xt._id:void 0;return !kt||!D.has(kt)}),qt=C.results.length-W.length;return qt===0?C:{count:Math.max(0,C.count-qt),results:W}});}),X=on((M,D)=>{M===I&&u(C=>Bn(C,D,r?.sort));});return ()=>{x(),k(),X();}},[t,i,n,e$1,s,o,r]),{isLoading:q&&H!==NetworkStatus.refetch||d$1||Y,isLoadingMore:l,fetchMore:fn,reload:pn,count:c$1.count,data:c$1.results,isProjectDisabled:an,isProjectReadOnly:dn,schemaErrorMessage:$}}function pt(t){let n=t?.offset;return typeof n=="number"&&Number.isFinite(n)?n:0}function rt(t){let n=t.entityNamePlural;return t.data?.[n]?t.isForm?Ht(t.entityNamePlural,t.scope,t.data,t.schema):Zt(t.entityNamePlural,t.scope,t.data,t.schema):{count:0,results:[]}}function Bn(t,n,e){let r=new Map(n.map(o=>[o._id,o])),i=false,s=t.results.map(o=>{let c=typeof o._id=="string"?o._id:void 0;if(!c)return o;let u=r.get(c);return u?(i=true,{...o,...u.attributes}):o});return i?{count:t.count,results:zn(s,e)}:t}function zn(t,n){if(!Array.isArray(n)||n.length===0)return t;let[e]=n;if(!e||typeof e!="object")return t;let[r]=Object.entries(e),[i,s]=r??[];if(!i||s!=="ASC"&&s!=="DESC")return t;let o=s==="DESC"?-1:1;return [...t].sort((c,u)=>{let l=c[i],a=u[i],d=typeof l=="string"?l:"",f=typeof a=="string"?a:"";return d.localeCompare(f)*o})}export{Gt as a,Kt as b,An as c,Xn as d,at as e,Zt as f,Zn as g,Hn as h,Yn as i,Nn as j,te as k,ne as l,U as m,ee as n,oe as o,ue as p,le as q,jn as r,$e as s};//# sourceMappingURL=chunk-XV2B3W6Z.js.map
378
- //# sourceMappingURL=chunk-XV2B3W6Z.js.map
377
+ `}}var nt=t=>t.charAt(0).toUpperCase()+t.slice(1);function v(t){let n=t.split(/[^0-9A-Za-z]+/).filter(Boolean).map(nt).join("");return n?/^[A-Za-z_]/.test(n)?n:`Entity${n}`:"Entity"}function U(t,n){return n==="_assets"?b:find(propEq(n,"plural"))(t)}function ee(t,n,e){if(!t||typeof t!="object")return {};let r=U(e,n);if(!r)return {};let i=`update${nt(n)}`,s=t[i];if(!s||typeof s!="object")return {};let o=s[n],c=Array.isArray(o)?o[0]:void 0;return !c||typeof c!="object"?{}:r.attributes.reduce((u,l)=>{if(a(l)!=="local")return u;let d=B(c[l.name])?._id;return typeof d!="string"||d.length===0?u:{...u,[l.name]:d}},{})}var dt=null,_t=new Set,en=[],Rt=new Set,It=new Set,wt=new Set;function oe(t,n){if(t==="_asset"||t==="_assets")return `Get${v(b.plural)}`;let e=n.find(s=>s.plural===t),r=n.find(s=>s.name===t),i=e?.plural??r?.plural??t;return `Get${v(i)}`}function rn(t){return Rt.add(t),()=>{Rt.delete(t);}}function sn(t){return It.add(t),()=>{It.delete(t);}}function on(t){return wt.add(t),()=>{wt.delete(t);}}function ue(t,n,e){let r=new Set(e.filter(Boolean));if(r.size>0)for(let i of It)i(n,r);return jn(t,n)}function le(t,n){let e=n.filter(r=>!!r._id);if(e.length!==0)for(let r of wt)r(t,e);}function jn(t,n){return _t.add(n),new Promise((e,r)=>{en.push({resolve:e,reject:r}),dt&&clearTimeout(dt),dt=setTimeout(()=>{let i=new Set(_t),s=en.splice(0);_t.clear(),dt=null,Promise.all([...Rt].map(o=>Promise.resolve(o(i)))).then(()=>{for(let{resolve:o}of s)o();}).catch(o=>{console.error("Error refreshing entity lists:",o);for(let{reject:c}of s)c(o);});},50);})}function $e({entityNamePlural:t,schema:n,scope:e$1,variables:r,isForm:i,selection:s="full",includeCount:o=true}){let[c$1,u]=useState({count:0,results:[]}),[l,a]=useState(false),[d$1,f]=useState(false),[g,h]=useState(null),y=useRef(false),A=useRef(false),p=useRef(0),m=useRef(null),E=useRef(null),T=`${t}Total`,F=U(n,t),Q=r?.where===void 0&&(F?.spaces?.length??0)===0&&(g?.field!==T||g.schema!==n)?"total":"aggregate",J=useMemo(()=>gql(at(t,e$1,n,{selection:s,countMode:Q,includeCount:o}).query),[t,e$1,n,s,Q,o]),z=useMemo(()=>gql(at(t,e$1,n,{selection:s,includeCount:false}).query),[t,e$1,n,s]),{schemaErrorMessage:$,setSchemaErrorMessage:R}=e(),{loading:q,data:j,fetchMore:it,refetch:st,error:ot,networkStatus:H}=useQuery(J,{variables:r,notifyOnNetworkStatusChange:true}),Lt=useRef(it),gt=useRef(st),Ft=useRef(z),Ct=useRef(H),Tt=useRef(r);Lt.current=it,gt.current=st,Ft.current=z,Tt.current=r;let yt=o&&d(ot,T),Mt=Q==="total"&&yt,G=yt?void 0:ot,Y=yt&&!j?.[t],Qt=a$2(G),P=c(G),{isProjectDisabled:an,isProjectReadOnly:dn}=(()=>{if(Qt?.statusCode===403){let I=b$1(Qt.bodyText);if(I&&typeof I.code=="string"){if(I.code==="PROJECT_PAUSED")return {isProjectDisabled:true,isProjectReadOnly:false};if(I.code==="READ_ONLY_MODE")return {isProjectDisabled:false,isProjectReadOnly:true}}return {isProjectDisabled:true,isProjectReadOnly:false}}return {isProjectDisabled:false,isProjectReadOnly:false}})();useEffect(()=>{Mt&&h({field:T,schema:n});},[n,Mt,T]);let fn=useCallback(I=>{if(y.current||A.current)return;y.current=true,a(true);let{limit:x}=I.variables,k=p.current;Lt.current({...I,query:Ft.current,variables:{...Tt.current,...I.variables,offset:k,limit:x}}).then(({data:X})=>{let M=rt({data:X,entityNamePlural:t,isForm:i,schema:n,scope:e$1}),D=M.results.length;p.current=k+(D===0?0:Math.min(D,x)),u(C=>{let W=uniqBy(prop("_id"),[...C.results,...M.results]);return W.length===C.results.length?{count:C.results.length,results:C.results}:{count:M.count||C.count,results:W}});}).catch(X=>{console.error("Error fetching more data:",X);}).finally(()=>{y.current=false,a(false);});},[t,i,n,e$1]),pn=useCallback(I=>{if(A.current)return Promise.resolve();let x=I?.preserve===true;return A.current=true,y.current=false,a(false),x||(m.current=null,E.current=null,p.current=0,f(true),u({count:0,results:[]})),gt.current().then(({data:k})=>{let X=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),M=rt({data:k,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=X,E.current=null,p.current=pt(r)+M.results.length,u(M);}).catch(k=>{console.error("Error reloading data:",k);}).finally(()=>{A.current=false,f(false);})},[t,i,n,e$1,s,o,r]);return useEffect(()=>{if(P){R(P);return}j&&$&&!G&&R(null);},[j,G,$,P,R]),useEffect(()=>{if(G||P||Y)return;let I=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r});if(m.current===I)return;if(q&&E.current!==I){E.current=I,p.current=0,u({count:0,results:[]});return}if(q)return;let x=rt({data:j,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=I,E.current=null,p.current=pt(r)+x.results.length,u(x);},[j,G,t,i,q,Y,n,P,e$1,s,o,r]),useEffect(()=>{let I=Ct.current;if(Ct.current=H,G||P||A.current||Y||I!==NetworkStatus.refetch||H!==NetworkStatus.ready||!j)return;let x=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),k=rt({data:j,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=x,E.current=null,p.current=pt(r)+k.results.length,u(k);},[j,G,t,i,Y,H,n,P,e$1,s,o,r]),useEffect(()=>{if(i)return;let I=`Get${v(t)}`,x=rn(M=>{if(!(!M.has(I)||y.current||A.current))return gt.current().then(({data:D})=>{let C=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),W=rt({data:D,entityNamePlural:t,isForm:i,schema:n,scope:e$1});m.current=C,E.current=null,p.current=pt(r)+W.results.length,u(W);}).catch(D=>{console.error("Error soft-refreshing entity list:",D);})}),k=sn((M,D)=>{M===I&&u(C=>{let W=C.results.filter(xt=>{let kt=typeof xt._id=="string"?xt._id:void 0;return !kt||!D.has(kt)}),qt=C.results.length-W.length;return qt===0?C:{count:Math.max(0,C.count-qt),results:W}});}),X=on((M,D)=>{M===I&&u(C=>Bn(C,D,r?.sort));});return ()=>{x(),k(),X();}},[t,i,n,e$1,s,o,r]),{isLoading:q&&H!==NetworkStatus.refetch||d$1||Y,isLoadingMore:l,fetchMore:fn,reload:pn,count:c$1.count,data:c$1.results,isProjectDisabled:an,isProjectReadOnly:dn,schemaErrorMessage:$}}function pt(t){let n=t?.offset;return typeof n=="number"&&Number.isFinite(n)?n:0}function rt(t){let n=t.entityNamePlural;return t.data?.[n]?t.isForm?Ht(t.entityNamePlural,t.scope,t.data,t.schema):Zt(t.entityNamePlural,t.scope,t.data,t.schema):{count:0,results:[]}}function Bn(t,n,e){let r=new Map(n.map(o=>[o._id,o])),i=false,s=t.results.map(o=>{let c=typeof o._id=="string"?o._id:void 0;if(!c)return o;let u=r.get(c);return u?(i=true,{...o,...u.attributes}):o});return i?{count:t.count,results:zn(s,e)}:t}function zn(t,n){if(!Array.isArray(n)||n.length===0)return t;let[e]=n;if(!e||typeof e!="object")return t;let[r]=Object.entries(e),[i,s]=r??[];if(!i||s!=="ASC"&&s!=="DESC")return t;let o=s==="DESC"?-1:1;return [...t].sort((c,u)=>{let l=c[i],a=u[i],d=typeof l=="string"?l:"",f=typeof a=="string"?a:"";return d.localeCompare(f)*o})}export{Gt as a,Kt as b,An as c,Xn as d,at as e,Zt as f,Zn as g,Hn as h,Yn as i,Nn as j,te as k,ne as l,U as m,ee as n,oe as o,ue as p,le as q,jn as r,$e as s};//# sourceMappingURL=chunk-SRFTSMZD.js.map
378
+ //# sourceMappingURL=chunk-SRFTSMZD.js.map