@flexkit/studio 0.2.32 → 0.2.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/activity-nav-button-ZHQOZBCC.js +2 -0
  2. package/dist/{activity-nav-button-E4I4YC3X.js.map → activity-nav-button-ZHQOZBCC.js.map} +1 -1
  3. package/dist/astro.js +1 -1
  4. package/dist/chat-page-LR7XC2US.js +4 -0
  5. package/dist/{chat-page-7UB3BMBF.js.map → chat-page-LR7XC2US.js.map} +1 -1
  6. package/dist/chunk-2MVQXXY7.js +4 -0
  7. package/dist/{chunk-R2O4WC3H.js.map → chunk-2MVQXXY7.js.map} +1 -1
  8. package/dist/{chunk-ERCVR23U.js → chunk-36DLIVZF.js} +2 -2
  9. package/dist/{chunk-ERCVR23U.js.map → chunk-36DLIVZF.js.map} +1 -1
  10. package/dist/chunk-3SY46ERM.js +2 -0
  11. package/dist/chunk-3SY46ERM.js.map +1 -0
  12. package/dist/chunk-4ZWQ44NZ.js +2 -0
  13. package/dist/{chunk-2NXQF2F7.js.map → chunk-4ZWQ44NZ.js.map} +1 -1
  14. package/dist/chunk-5JUG4BEF.js +2 -0
  15. package/dist/chunk-5JUG4BEF.js.map +1 -0
  16. package/dist/chunk-6I7D2JBA.js +3 -0
  17. package/dist/chunk-6I7D2JBA.js.map +1 -0
  18. package/dist/chunk-7ODGH7G2.js +2 -0
  19. package/dist/{chunk-5LGIALCK.js.map → chunk-7ODGH7G2.js.map} +1 -1
  20. package/dist/{chunk-SZEGGBOC.js → chunk-A4DPLZZF.js} +2 -2
  21. package/dist/{chunk-SZEGGBOC.js.map → chunk-A4DPLZZF.js.map} +1 -1
  22. package/dist/{chunk-C4XLDODU.js → chunk-C2KPTRYM.js} +3 -1
  23. package/dist/chunk-C3OHXPJV.js +2 -0
  24. package/dist/chunk-C3OHXPJV.js.map +1 -0
  25. package/dist/{chunk-KR27GOH6.js → chunk-CFYO546Y.js} +3 -3
  26. package/dist/{chunk-KR27GOH6.js.map → chunk-CFYO546Y.js.map} +1 -1
  27. package/dist/chunk-DHE6PO3V.js +2 -0
  28. package/dist/{chunk-5AJXR47U.js.map → chunk-DHE6PO3V.js.map} +1 -1
  29. package/dist/{chunk-V7C4EHK3.js → chunk-DSLPTDZX.js} +2 -2
  30. package/dist/{chunk-V7C4EHK3.js.map → chunk-DSLPTDZX.js.map} +1 -1
  31. package/dist/chunk-HSGUVQXU.js +10 -0
  32. package/dist/{chunk-JAPZBEBZ.js.map → chunk-HSGUVQXU.js.map} +1 -1
  33. package/dist/{chunk-EMFHKTAV.js → chunk-K3HW6YWS.js} +2 -2
  34. package/dist/{chunk-EMFHKTAV.js.map → chunk-K3HW6YWS.js.map} +1 -1
  35. package/dist/chunk-L5T56MRH.js +7 -0
  36. package/dist/chunk-L5T56MRH.js.map +1 -0
  37. package/dist/chunk-MBBE4RND.js +3 -0
  38. package/dist/chunk-MBBE4RND.js.map +1 -0
  39. package/dist/{chunk-USNXQOMJ.js → chunk-N33S7BSG.js} +2 -2
  40. package/dist/{chunk-USNXQOMJ.js.map → chunk-N33S7BSG.js.map} +1 -1
  41. package/dist/{chunk-KN7OJFEX.js → chunk-N52JTYBJ.js} +2 -2
  42. package/dist/{chunk-KN7OJFEX.js.map → chunk-N52JTYBJ.js.map} +1 -1
  43. package/dist/{chunk-AY2RXJWS.js → chunk-NFEQBTIW.js} +2 -2
  44. package/dist/{chunk-AY2RXJWS.js.map → chunk-NFEQBTIW.js.map} +1 -1
  45. package/dist/chunk-RFUMT6ZR.js +2 -0
  46. package/dist/{chunk-JWJJZVP3.js.map → chunk-RFUMT6ZR.js.map} +1 -1
  47. package/dist/{chunk-GSGPULRL.js → chunk-RLVHUIFC.js} +2 -2
  48. package/dist/{chunk-GSGPULRL.js.map → chunk-RLVHUIFC.js.map} +1 -1
  49. package/dist/chunk-S26WK6RF.js +2 -0
  50. package/dist/{chunk-54AXLGAK.js.map → chunk-S26WK6RF.js.map} +1 -1
  51. package/dist/{chunk-ONB3FWK5.js → chunk-S7VNSSIK.js} +2 -2
  52. package/dist/{chunk-ONB3FWK5.js.map → chunk-S7VNSSIK.js.map} +1 -1
  53. package/dist/chunk-S7Z6KKIN.js +2 -0
  54. package/dist/chunk-S7Z6KKIN.js.map +1 -0
  55. package/dist/{chunk-2NQ2RZ2M.js → chunk-U5XZWEPO.js} +3 -3
  56. package/dist/{chunk-2NQ2RZ2M.js.map → chunk-U5XZWEPO.js.map} +1 -1
  57. package/dist/chunk-UB22GYFK.js +2 -0
  58. package/dist/{chunk-MRHZN4G4.js.map → chunk-UB22GYFK.js.map} +1 -1
  59. package/dist/chunk-VUZ7GHSO.js +7 -0
  60. package/dist/{chunk-NNISUDZX.js.map → chunk-VUZ7GHSO.js.map} +1 -1
  61. package/dist/chunk-X3SHNHHM.js +2 -0
  62. package/dist/chunk-X3SHNHHM.js.map +1 -0
  63. package/dist/{chunk-XV7U33XQ.js → chunk-YKM3FUGK.js} +3 -3
  64. package/dist/{chunk-XV7U33XQ.js.map → chunk-YKM3FUGK.js.map} +1 -1
  65. package/dist/electron.js +1 -1
  66. package/dist/{entry-CA2QAEHN.js → entry-ROTT3ZDN.js} +2 -2
  67. package/dist/{entry-CA2QAEHN.js.map → entry-ROTT3ZDN.js.map} +1 -1
  68. package/dist/index.d.ts +10 -1
  69. package/dist/index.js +7 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/list-N4E3VXM5.js +3 -0
  72. package/dist/{list-Q2KAEJ26.js.map → list-N4E3VXM5.js.map} +1 -1
  73. package/dist/list-RCTHBJOK.js +2 -0
  74. package/dist/{list-UMMVRYVD.js.map → list-RCTHBJOK.js.map} +1 -1
  75. package/dist/nextjs.js +1 -1
  76. package/dist/pages-XUJGIHQI.js +5 -0
  77. package/dist/{pages-KZ66JVNU.js.map → pages-XUJGIHQI.js.map} +1 -1
  78. package/dist/plugin-pages-FEQILAQR.js +2 -0
  79. package/dist/{plugin-pages-SR2WSUKZ.js.map → plugin-pages-FEQILAQR.js.map} +1 -1
  80. package/dist/project-selector-U64ROZ5D.js +2 -0
  81. package/dist/project-selector-U64ROZ5D.js.map +1 -0
  82. package/dist/record-links-HO4SEHOA.js +2 -0
  83. package/dist/{record-links-3WZGSVFU.js.map → record-links-HO4SEHOA.js.map} +1 -1
  84. package/dist/root-BUXIQKA5.js +14 -0
  85. package/dist/{root-LFJ5BQSY.js.map → root-BUXIQKA5.js.map} +1 -1
  86. package/dist/root-CCUROZVR.js +2 -0
  87. package/dist/{root-6QTQUYK4.js.map → root-CCUROZVR.js.map} +1 -1
  88. package/dist/root-GQL3P63Z.js +31 -0
  89. package/dist/{root-7BUVDOMV.js.map → root-GQL3P63Z.js.map} +1 -1
  90. package/dist/root-KXY4A6DW.js +2 -0
  91. package/dist/{root-2VBLPRG7.js.map → root-KXY4A6DW.js.map} +1 -1
  92. package/dist/root-MLEJUEMJ.js +23 -0
  93. package/dist/{root-FZLKYL5W.js.map → root-MLEJUEMJ.js.map} +1 -1
  94. package/dist/root-VA3E6HEY.js +2 -0
  95. package/dist/{root-OXS3QQX6.js.map → root-VA3E6HEY.js.map} +1 -1
  96. package/dist/search-YY4GQQRM.js +2 -0
  97. package/dist/{search-AZK3Q2KX.js.map → search-YY4GQQRM.js.map} +1 -1
  98. package/dist/skills-pages-SAOZTUOH.js +2 -0
  99. package/dist/{skills-pages-7IYBJ4QI.js.map → skills-pages-SAOZTUOH.js.map} +1 -1
  100. package/dist/source-2S24MZ5D.js +2 -0
  101. package/dist/{source-4BP5PJ2N.js.map → source-2S24MZ5D.js.map} +1 -1
  102. package/dist/spec-renderer-ZSIVMKVE.js +2 -0
  103. package/dist/{spec-renderer-3GAVSV52.js.map → spec-renderer-ZSIVMKVE.js.map} +1 -1
  104. package/dist/tanstack-start.js +1 -1
  105. package/dist/ui.js +1 -1
  106. package/dist/user-nav-ZH63YHX7.js +2 -0
  107. package/dist/{user-nav-OWTTAXZS.js.map → user-nav-ZH63YHX7.js.map} +1 -1
  108. package/package.json +4 -4
  109. package/dist/activity-nav-button-E4I4YC3X.js +0 -2
  110. package/dist/chat-page-7UB3BMBF.js +0 -4
  111. package/dist/chunk-2NXQF2F7.js +0 -2
  112. package/dist/chunk-32ZU4MLE.js +0 -2
  113. package/dist/chunk-32ZU4MLE.js.map +0 -1
  114. package/dist/chunk-54AXLGAK.js +0 -2
  115. package/dist/chunk-5AJXR47U.js +0 -2
  116. package/dist/chunk-5LGIALCK.js +0 -2
  117. package/dist/chunk-6NRQMG26.js +0 -2
  118. package/dist/chunk-6NRQMG26.js.map +0 -1
  119. package/dist/chunk-AKQ6ELDX.js +0 -2
  120. package/dist/chunk-AKQ6ELDX.js.map +0 -1
  121. package/dist/chunk-DGIY4SKN.js +0 -7
  122. package/dist/chunk-DGIY4SKN.js.map +0 -1
  123. package/dist/chunk-HDOIOXMP.js +0 -2
  124. package/dist/chunk-HDOIOXMP.js.map +0 -1
  125. package/dist/chunk-HZOD2HOF.js +0 -3
  126. package/dist/chunk-HZOD2HOF.js.map +0 -1
  127. package/dist/chunk-JAPZBEBZ.js +0 -10
  128. package/dist/chunk-JWJJZVP3.js +0 -2
  129. package/dist/chunk-MRHZN4G4.js +0 -2
  130. package/dist/chunk-NNISUDZX.js +0 -7
  131. package/dist/chunk-O2QMYUPS.js +0 -2
  132. package/dist/chunk-O2QMYUPS.js.map +0 -1
  133. package/dist/chunk-R2O4WC3H.js +0 -4
  134. package/dist/chunk-WPCPL2TQ.js +0 -3
  135. package/dist/chunk-WPCPL2TQ.js.map +0 -1
  136. package/dist/list-Q2KAEJ26.js +0 -3
  137. package/dist/list-UMMVRYVD.js +0 -2
  138. package/dist/pages-KZ66JVNU.js +0 -5
  139. package/dist/plugin-pages-SR2WSUKZ.js +0 -2
  140. package/dist/project-selector-72VM6SUI.js +0 -2
  141. package/dist/project-selector-72VM6SUI.js.map +0 -1
  142. package/dist/record-links-3WZGSVFU.js +0 -2
  143. package/dist/root-2VBLPRG7.js +0 -2
  144. package/dist/root-6QTQUYK4.js +0 -2
  145. package/dist/root-7BUVDOMV.js +0 -31
  146. package/dist/root-FZLKYL5W.js +0 -23
  147. package/dist/root-LFJ5BQSY.js +0 -14
  148. package/dist/root-OXS3QQX6.js +0 -2
  149. package/dist/search-AZK3Q2KX.js +0 -2
  150. package/dist/skills-pages-7IYBJ4QI.js +0 -2
  151. package/dist/source-4BP5PJ2N.js +0 -2
  152. package/dist/spec-renderer-3GAVSV52.js +0 -2
  153. package/dist/user-nav-OWTTAXZS.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/ai/plugin-oauth.ts","../src/apps/ai/plugin-token-format.ts","../src/apps/ai/plugin-token.tsx"],"names":["OAUTH_START_PATH","PluginAccountMismatchError","httpsUrl","value","url","trustedPluginOAuthTargets","authorizeUrl","completionOrigin","origin","getPlatformOrigin","authorize","completion","connectPluginPopup","api","pluginId","scope","options","popup","transaction","error","targets","expectedOrigin","resolve","reject","polling","finished","handedOff","finish","interval","timeout","onMessage","poll","status","event","payload","pluginSecretFormats","plugin","connect","method","field","credentialFormFields","selected","item","credentialFormComplete","fields","values","credentialFormError","matchesTokenPattern","token","pattern","compileTokenPattern","findPastedPluginToken","text","plugins","words","word","found","tokens","format","request","lastRequestId","cancelLatest","listeners","setRequest","next","listener","subscribe","connectPlugin","id","connectionId","settle","connected","httpsHref","PluginTokenDialogHost","current","useSyncExternalStore","jsx","PluginTokenDialog","PluginCredentialsDialog","FieldError","message","HelpLink","href","label","safeHref","jsxs","ExternalLinkIcon","name","formId","useId","setMethod","useState","setValues","setError","saving","setSaving","selectedMethod","ready","save","problem","failure","Dialog","open","DialogContent","DialogHeader","DialogTitle","DialogDescription","index","inputId","fieldError","Input","previous","DialogFooter","Button","LoaderCircle","setToken"],"mappings":"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","file":"chunk-5LGIALCK.js","sourcesContent":["import { getPlatformOrigin, type ApiClient } from './api';\nimport type { PluginScope } from './plugin-types';\n\nconst OAUTH_START_PATH = '/plugins/oauth/start';\n\n/** A Reconnect was completed with a different provider account than the one being reconnected. */\nexport class PluginAccountMismatchError extends Error {\n readonly code = 'account_mismatch';\n\n constructor() {\n super('You signed in with a different account. Use \"Connect another account\" to add it.');\n this.name = 'PluginAccountMismatchError';\n }\n}\n\nfunction httpsUrl(value: string): URL | null {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n return null;\n }\n\n if (url.protocol !== 'https:' || url.username !== '' || url.password !== '') {\n return null;\n }\n\n return url;\n}\n\n/** Popup navigation and postMessage stay on the platform OAuth start page. */\nfunction trustedPluginOAuthTargets(\n authorizeUrl: string,\n completionOrigin: string\n): { href: string; origin: string } | null {\n const origin = getPlatformOrigin();\n const authorize = httpsUrl(authorizeUrl);\n const completion = httpsUrl(completionOrigin);\n\n if (!authorize || !completion) {\n return null;\n }\n\n if (authorize.origin !== origin || authorize.pathname !== OAUTH_START_PATH) {\n return null;\n }\n\n if (completion.origin !== origin || completion.pathname !== '/') {\n return null;\n }\n\n return { href: authorize.href, origin };\n}\n\n/** Must be called directly from the click handler so browsers allow the popup. */\nexport async function connectPluginPopup(\n api: ApiClient,\n pluginId: string,\n scope: PluginScope,\n options?: { connectionId?: string }\n): Promise<void> {\n const popup = window.open('about:blank', `flexkit-plugin-${crypto.randomUUID()}`, 'popup,width=560,height=720');\n\n if (!popup) {\n throw new Error('Allow popups for Studio, then connect again.');\n }\n\n let transaction: Awaited<ReturnType<ApiClient['connectPlugins']>>;\n\n try {\n transaction = await api.connectPlugins({\n pluginId,\n scope,\n studioOrigin: window.location.origin,\n ...(options?.connectionId ? { connectionId: options.connectionId } : {}),\n });\n } catch (error) {\n popup.close();\n throw error;\n }\n\n const targets = trustedPluginOAuthTargets(transaction.authorizeUrl, transaction.completionOrigin);\n\n if (!targets) {\n popup.close();\n throw new Error('Connection could not be started.');\n }\n\n const expectedOrigin = targets.origin;\n\n await new Promise<void>((resolve, reject) => {\n let polling = false;\n let finished = false;\n // Once the popup leaves for the provider, `popup.closed` says nothing:\n // providers isolate their pages (Cross-Origin-Opener-Policy), which severs\n // the opener and reports the window as closed while it is open. From then\n // on only the transaction's status (and the timeout) ends the wait.\n let handedOff = false;\n const finish = (error?: Error) => {\n if (finished) {\n return;\n }\n\n finished = true;\n window.clearInterval(interval);\n window.clearTimeout(timeout);\n window.removeEventListener('message', onMessage);\n popup.close();\n\n if (error) {\n reject(error);\n\n return;\n }\n\n resolve();\n };\n const poll = async () => {\n if (polling || finished) {\n return;\n }\n\n polling = true;\n let status: Awaited<ReturnType<ApiClient['pluginOAuthStatus']>>;\n\n try {\n status = await api.pluginOAuthStatus(transaction.transactionId);\n } catch {\n polling = false;\n\n return;\n }\n\n polling = false;\n\n if (status.status === 'complete') {\n finish();\n\n return;\n }\n\n if (!handedOff && popup.closed && status.status === 'pending') {\n finish(new Error('Connection window was closed.'));\n\n return;\n }\n\n if (status.status === 'failed' || new Date(status.expires_at).getTime() < Date.now()) {\n finish(new Error('Connection was not completed. Please try again.'));\n }\n };\n const onMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== expectedOrigin || event.source !== popup || !event.data || typeof event.data !== 'object') {\n return;\n }\n\n const payload = event.data as { type?: string; transactionId?: string; status?: string; error?: string };\n\n if (payload.type === 'flexkit:plugin-oauth-ready' && payload.transactionId === transaction.transactionId) {\n handedOff = true;\n popup.postMessage(\n {\n type: 'flexkit:plugin-oauth-start',\n transactionId: transaction.transactionId,\n ticket: transaction.launchTicket,\n },\n expectedOrigin\n );\n\n return;\n }\n\n if (payload.type === 'flexkit:plugin-oauth' && payload.transactionId === transaction.transactionId) {\n if (payload.status === 'failed' && payload.error === 'account_mismatch') {\n finish(new PluginAccountMismatchError());\n\n return;\n }\n\n void poll();\n }\n };\n const interval = window.setInterval(() => {\n void poll();\n }, 2000);\n const timeout = window.setTimeout(() => finish(new Error('Connection timed out. Please try again.')), 600_000);\n window.addEventListener('message', onMessage);\n popup.location.href = targets.href;\n });\n}\n","import type { MarketplacePlugin, PluginCredentialField, PluginCredentialsConnect } from './plugin-types';\n\nexport type ConnectablePlugin = Pick<MarketplacePlugin, 'connect' | 'id' | 'name'>;\n\n/** Longer than any credential a provider issues; the server rejects more. */\nexport const MAX_CREDENTIAL_VALUE_LENGTH = 4096;\n\n/**\n * The secrets a plugin's connect form takes that can be recognized on their\n * own (a distinctive prefix, say), each with that pattern and what to call it.\n */\nexport function pluginSecretFormats(plugin: ConnectablePlugin): Array<{ label: string; pattern: string }> {\n const { connect } = plugin;\n\n if (connect?.type === 'api-token') {\n return connect.pattern ? [{ label: connect.tokenLabel, pattern: connect.pattern }] : [];\n }\n\n if (connect?.type === 'credentials') {\n return [...connect.fields, ...connect.methods.flatMap((method) => method.fields)]\n .filter((field) => field.kind === 'secret' && field.detect)\n .map((field) => ({ label: field.label, pattern: field.detect! }));\n }\n\n return [];\n}\n\n/** The fields a credentials form shows: the shared ones, then those of the chosen method. */\nexport function credentialFormFields(connect: PluginCredentialsConnect, method: string | null): PluginCredentialField[] {\n const selected = connect.methods.find((item) => item.key === method);\n\n return [...connect.fields, ...(selected?.fields ?? [])];\n}\n\n/** Whether every required field has a value: what the Connect button waits for. */\nexport function credentialFormComplete(\n fields: readonly PluginCredentialField[],\n values: { [key: string]: string }\n): boolean {\n return fields.every((field) => !field.required || Boolean(values[field.key]?.trim()));\n}\n\n/** The first problem with the values entered, or null when they can be submitted. */\nexport function credentialFormError(\n fields: readonly PluginCredentialField[],\n values: { [key: string]: string }\n): { field: string; message: string } | null {\n for (const field of fields) {\n const value = values[field.key]?.trim() ?? '';\n\n if (!value) {\n if (field.required) {\n return { field: field.key, message: `Enter the ${field.label}.` };\n }\n\n continue;\n }\n\n if (value.length > MAX_CREDENTIAL_VALUE_LENGTH) {\n return { field: field.key, message: `The ${field.label} is too long; paste only the value.` };\n }\n\n if (!matchesTokenPattern(value, field.pattern)) {\n return { field: field.key, message: `That is not a valid ${field.label}.` };\n }\n }\n\n return null;\n}\n\nexport function matchesTokenPattern(token: string, pattern: string | null): boolean {\n if (!pattern) {\n return true;\n }\n\n try {\n return new RegExp(pattern, 'u').test(token);\n } catch {\n // The server validates the pattern when it admits the plugin; never block on a bad one here.\n return true;\n }\n}\n\n/** A pattern that compiles; an empty or broken one detects nothing rather than every word. */\nfunction compileTokenPattern(pattern: string | null): RegExp | null {\n if (!pattern) {\n return null;\n }\n\n try {\n return new RegExp(pattern, 'u');\n } catch {\n return null;\n }\n}\n\n/**\n * The first plugin whose secret format `text` contains, if any, with every\n * secret-shaped word in the message and what the plugin calls that secret: a\n * token pasted into the chat would be stored in the conversation and sent to\n * the model.\n */\nexport function findPastedPluginToken(\n text: string,\n plugins: readonly ConnectablePlugin[]\n): { plugin: ConnectablePlugin; tokens: string[]; label: string } | null {\n // A token is often glued to a label (`token=…`, `key: …`) or wrapped in\n // brackets, quotes or a sentence's punctuation; none of those are part of it.\n const words = text\n .split(/[\\s\"'`()<>[\\]{},;:=!?&]+/)\n .map((word) => word.replace(/\\.+$/, ''))\n .filter(Boolean);\n let found: { plugin: ConnectablePlugin; label: string } | null = null;\n const tokens = new Set<string>();\n\n for (const plugin of plugins) {\n for (const format of pluginSecretFormats(plugin)) {\n const pattern = compileTokenPattern(format.pattern);\n\n for (const word of pattern ? words : []) {\n if (pattern!.test(word)) {\n found ??= { plugin, label: format.label };\n tokens.add(word);\n }\n }\n }\n }\n\n return found ? { ...found, tokens: [...tokens] } : null;\n}\n","import type { FormEvent, JSX } from 'react';\nimport { useId, useState, useSyncExternalStore } from 'react';\nimport { ExternalLinkIcon, LoaderCircle } from 'lucide-react';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '../../ui';\nimport type { ApiClient } from './api';\nimport { connectPluginPopup } from './plugin-oauth';\nimport {\n credentialFormComplete,\n credentialFormError,\n credentialFormFields,\n matchesTokenPattern,\n type ConnectablePlugin,\n} from './plugin-token-format';\nimport type { PluginApiTokenConnect, PluginCredentialsConnect, PluginScope } from './plugin-types';\n\ninterface TokenRequest {\n id: number;\n plugin: ConnectablePlugin & { connect: PluginApiTokenConnect };\n /** Saves the token; rejects with a message the dialog shows next to the field. */\n submit: (_token: string) => Promise<void>;\n settle: (_connected: boolean) => void;\n}\n\ninterface CredentialsRequest {\n id: number;\n plugin: ConnectablePlugin & { connect: PluginCredentialsConnect };\n /** Saves the form; rejects with a message the dialog shows under the fields. */\n submit: (_method: string | undefined, _values: { [key: string]: string }) => Promise<void>;\n settle: (_connected: boolean) => void;\n}\n\ntype FormRequest = ({ kind: 'token' } & TokenRequest) | ({ kind: 'credentials' } & CredentialsRequest);\n\n/** The one open connect form, outside React so any connect button can open it. */\nlet request: FormRequest | null = null;\nlet lastRequestId = 0;\n/** Cancels the latest request, whether its dialog has opened yet or not. */\nlet cancelLatest: (() => void) | null = null;\nconst listeners = new Set<() => void>();\n\nfunction setRequest(next: FormRequest | null): void {\n request = next;\n listeners.forEach((listener) => listener());\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n}\n\n/**\n * Connects a plugin: a sign-in popup for OAuth plugins, the token dialog for\n * plugins that take a pasted token, the credentials dialog for plugins that\n * take the credentials of an app the user created at the provider. Resolves\n * `false` when the user closes a dialog without connecting.\n *\n * Call it straight from a click handler: browsers only allow the popup there.\n */\nexport function connectPlugin(\n api: ApiClient,\n plugin: ConnectablePlugin,\n scope: PluginScope,\n options?: { connectionId?: string }\n): Promise<boolean> {\n const { connect } = plugin;\n\n if (connect?.type !== 'api-token' && connect?.type !== 'credentials') {\n return connectPluginPopup(api, plugin.id, scope, options).then(() => true);\n }\n\n // Opening a second dialog closes the first, as if cancelled.\n cancelLatest?.();\n\n const id = ++lastRequestId;\n const connectionId = options?.connectionId ? { connectionId: options.connectionId } : {};\n\n return new Promise<boolean>((resolve) => {\n const settle = (connected: boolean): void => {\n // A save still running for a replaced dialog must not close its successor.\n if (request?.id === id) {\n setRequest(null);\n }\n\n if (lastRequestId === id) {\n cancelLatest = null;\n }\n\n resolve(connected);\n };\n const next: FormRequest =\n connect.type === 'api-token'\n ? {\n kind: 'token',\n id,\n plugin: { ...plugin, connect },\n submit: async (token) => {\n await api.connectPluginToken({ pluginId: plugin.id, scope, token, ...connectionId });\n },\n settle,\n }\n : {\n kind: 'credentials',\n id,\n plugin: { ...plugin, connect },\n submit: async (method, values) => {\n await api.connectPluginCredentials({ pluginId: plugin.id, scope, method, values, ...connectionId });\n },\n settle,\n };\n\n cancelLatest = () => settle(false);\n\n // Open after the current event: a menu item that started this closes first\n // and returns focus to its trigger, which would take it from the first field.\n setTimeout(() => {\n if (lastRequestId === id) {\n setRequest(next);\n }\n });\n });\n}\n\nfunction httpsHref(value: string | null): string | null {\n if (!value) {\n return null;\n }\n\n try {\n const url = new URL(value);\n\n return url.protocol === 'https:' ? url.href : null;\n } catch {\n return null;\n }\n}\n\n/** Mounted once by the Studio layout; renders the dialog `connectPlugin` opens for token and credentials plugins. */\nexport function PluginTokenDialogHost(): JSX.Element | null {\n const current = useSyncExternalStore(\n subscribe,\n () => request,\n () => null\n );\n\n if (!current) {\n return null;\n }\n\n // A new key per request resets the fields, so a secret never outlives its dialog.\n return current.kind === 'token' ? (\n <PluginTokenDialog key={current.id} request={current} />\n ) : (\n <PluginCredentialsDialog key={current.id} request={current} />\n );\n}\n\nfunction FieldError({ id, message }: { id: string; message: string | null }): JSX.Element | null {\n return message ? (\n <p className=\"fk:text-sm fk:text-destructive\" id={id}>\n {message}\n </p>\n ) : null;\n}\n\nfunction HelpLink({ href, label }: { href: string | null; label: string }): JSX.Element | null {\n const safeHref = httpsHref(href);\n\n return safeHref ? (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground fk:underline-offset-4 fk:hover:underline\"\n href={safeHref}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n <ExternalLinkIcon className=\"fk:size-3.5\" />\n </a>\n ) : null;\n}\n\nfunction PluginCredentialsDialog({ request: current }: { request: CredentialsRequest }): JSX.Element {\n const { connect, name } = current.plugin;\n const formId = useId();\n const [method, setMethod] = useState<string | null>(connect.methods[0]?.key ?? null);\n const [values, setValues] = useState<{ [key: string]: string }>({});\n const [error, setError] = useState<{ field: string | null; message: string } | null>(null);\n const [saving, setSaving] = useState(false);\n const fields = credentialFormFields(connect, method);\n const selectedMethod = connect.methods.find((item) => item.key === method) ?? null;\n // Submitting surfaces which field is malformed; the button only waits for the required values.\n const ready = credentialFormComplete(fields, values);\n\n async function save(event: FormEvent): Promise<void> {\n event.preventDefault();\n\n if (saving) {\n return;\n }\n\n const problem = credentialFormError(fields, values);\n\n if (problem) {\n setError(problem);\n\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await current.submit(\n method ?? undefined,\n Object.fromEntries(fields.map((field) => [field.key, values[field.key]?.trim() ?? '']).filter(([, value]) => value))\n );\n setValues({});\n current.settle(true);\n } catch (failure) {\n setError({ field: null, message: failure instanceof Error ? failure.message : `${name} could not be connected.` });\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !saving) {\n current.settle(false);\n }\n }}\n >\n <DialogContent>\n <form className=\"fk:flex fk:flex-col fk:gap-4\" onSubmit={(event) => void save(event)}>\n <DialogHeader>\n <DialogTitle>Connect {name}</DialogTitle>\n <DialogDescription>\n {connect.description} Flexkit checks the credentials with {name}, stores them encrypted and sends them\n only to Flexkit&apos;s own {name} server; the agent can use the tools but never sees them.\n </DialogDescription>\n </DialogHeader>\n {connect.methods.length > 1 ? (\n <div className=\"fk:space-y-1.5\" role=\"group\" aria-label=\"How to connect\">\n {connect.methods.map((item) => (\n <button\n aria-pressed={method === item.key}\n className={`fk:flex fk:w-full fk:flex-col fk:rounded-lg fk:border fk:px-3 fk:py-2 fk:text-left fk:corner-squircle ${\n method === item.key ? 'fk:border-primary fk:bg-primary/5' : 'fk:border-border fk:hover:bg-muted/60'\n }`}\n disabled={saving}\n key={item.key}\n onClick={() => {\n setMethod(item.key);\n setError(null);\n }}\n type=\"button\"\n >\n <span className=\"fk:text-sm fk:font-medium\">{item.label}</span>\n {item.description ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">{item.description}</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : selectedMethod?.description ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{selectedMethod.description}</p>\n ) : null}\n {fields.map((field, index) => {\n const inputId = `${formId}-${field.key}`;\n const fieldError = error?.field === field.key ? error.message : null;\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-2\" key={field.key}>\n <label className=\"fk:text-sm fk:font-medium\" htmlFor={inputId}>\n {field.label}\n </label>\n <Input\n aria-describedby={fieldError ? `${inputId}-error` : field.help ? `${inputId}-help` : undefined}\n aria-invalid={fieldError ? true : undefined}\n autoComplete=\"off\"\n autoFocus={index === 0}\n disabled={saving}\n id={inputId}\n placeholder={field.placeholder ?? undefined}\n spellCheck={false}\n type={field.kind === 'secret' ? 'password' : 'text'}\n value={values[field.key] ?? ''}\n onChange={(event) => {\n setValues((previous) => ({ ...previous, [field.key]: event.target.value }));\n setError(null);\n }}\n />\n {field.help && !fieldError ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\" id={`${inputId}-help`}>\n {field.help}\n </p>\n ) : null}\n <FieldError id={`${inputId}-error`} message={fieldError} />\n </div>\n );\n })}\n <FieldError id={`${formId}-error`} message={error?.field === null ? error.message : null} />\n <HelpLink href={connect.helpUrl} label={`How to set up ${name}`} />\n <DialogFooter>\n <Button disabled={saving} size=\"sm\" type=\"button\" variant=\"outline\" onClick={() => current.settle(false)}>\n Cancel\n </Button>\n <Button disabled={saving || !ready} size=\"sm\" type=\"submit\">\n {saving ? <LoaderCircle className=\"fk:size-4 fk:animate-spin\" /> : null}\n Connect\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction PluginTokenDialog({ request: current }: { request: TokenRequest }): JSX.Element {\n const { connect, name } = current.plugin;\n const inputId = useId();\n const [token, setToken] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n\n async function save(event: FormEvent): Promise<void> {\n event.preventDefault();\n const value = token.trim();\n\n if (saving || !value) {\n return;\n }\n\n if (!matchesTokenPattern(value, connect.pattern)) {\n setError(`That does not look like a ${connect.tokenLabel}.`);\n\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await current.submit(value);\n setToken('');\n current.settle(true);\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : `${name} could not be connected.`);\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !saving) {\n current.settle(false);\n }\n }}\n >\n <DialogContent>\n <form className=\"fk:flex fk:flex-col fk:gap-4\" onSubmit={(event) => void save(event)}>\n <DialogHeader>\n <DialogTitle>Connect {name}</DialogTitle>\n <DialogDescription>\n Paste a {connect.tokenLabel}. Flexkit stores it encrypted and sends it only to {name}; the agent can use{' '}\n {name}&apos;s tools but never sees the token. Give it read access only, unless the agent should change\n things in {name}.\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <label className=\"fk:text-sm fk:font-medium\" htmlFor={inputId}>\n {connect.tokenLabel}\n </label>\n <Input\n aria-describedby={error ? `${inputId}-error` : undefined}\n aria-invalid={error ? true : undefined}\n autoComplete=\"off\"\n autoFocus\n disabled={saving}\n id={inputId}\n placeholder={connect.placeholder ?? undefined}\n spellCheck={false}\n type=\"password\"\n value={token}\n onChange={(event) => {\n setToken(event.target.value);\n setError(null);\n }}\n />\n <FieldError id={`${inputId}-error`} message={error} />\n <HelpLink href={connect.helpUrl} label={`How to create a ${connect.tokenLabel}`} />\n </div>\n <DialogFooter>\n <Button disabled={saving} size=\"sm\" type=\"button\" variant=\"outline\" onClick={() => current.settle(false)}>\n Cancel\n </Button>\n <Button disabled={saving || !token.trim()} size=\"sm\" type=\"submit\">\n {saving ? <LoaderCircle className=\"fk:size-4 fk:animate-spin\" /> : null}\n Connect\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/ai/plugin-oauth.ts","../src/apps/ai/plugin-token-format.ts","../src/apps/ai/plugin-token.tsx"],"names":["OAUTH_START_PATH","PluginAccountMismatchError","httpsUrl","value","url","trustedPluginOAuthTargets","authorizeUrl","completionOrigin","origin","getPlatformOrigin","authorize","completion","connectPluginPopup","api","pluginId","scope","options","popup","transaction","error","targets","expectedOrigin","resolve","reject","polling","finished","handedOff","finish","interval","timeout","onMessage","poll","status","event","payload","pluginSecretFormats","plugin","connect","method","field","credentialFormFields","selected","item","credentialFormComplete","fields","values","credentialFormError","matchesTokenPattern","token","pattern","compileTokenPattern","findPastedPluginToken","text","plugins","words","word","found","tokens","format","request","lastRequestId","cancelLatest","listeners","setRequest","next","listener","subscribe","connectPlugin","id","connectionId","settle","connected","httpsHref","PluginTokenDialogHost","current","useSyncExternalStore","jsx","PluginTokenDialog","PluginCredentialsDialog","FieldError","message","HelpLink","href","label","safeHref","jsxs","ExternalLinkIcon","name","formId","useId","setMethod","useState","setValues","setError","saving","setSaving","selectedMethod","ready","save","problem","failure","Dialog","open","DialogContent","DialogHeader","DialogTitle","DialogDescription","index","inputId","fieldError","Input","previous","DialogFooter","Button","LoaderCircle","setToken"],"mappings":"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","file":"chunk-7ODGH7G2.js","sourcesContent":["import { getPlatformOrigin, type ApiClient } from './api';\nimport type { PluginScope } from './plugin-types';\n\nconst OAUTH_START_PATH = '/plugins/oauth/start';\n\n/** A Reconnect was completed with a different provider account than the one being reconnected. */\nexport class PluginAccountMismatchError extends Error {\n readonly code = 'account_mismatch';\n\n constructor() {\n super('You signed in with a different account. Use \"Connect another account\" to add it.');\n this.name = 'PluginAccountMismatchError';\n }\n}\n\nfunction httpsUrl(value: string): URL | null {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n return null;\n }\n\n if (url.protocol !== 'https:' || url.username !== '' || url.password !== '') {\n return null;\n }\n\n return url;\n}\n\n/** Popup navigation and postMessage stay on the platform OAuth start page. */\nfunction trustedPluginOAuthTargets(\n authorizeUrl: string,\n completionOrigin: string\n): { href: string; origin: string } | null {\n const origin = getPlatformOrigin();\n const authorize = httpsUrl(authorizeUrl);\n const completion = httpsUrl(completionOrigin);\n\n if (!authorize || !completion) {\n return null;\n }\n\n if (authorize.origin !== origin || authorize.pathname !== OAUTH_START_PATH) {\n return null;\n }\n\n if (completion.origin !== origin || completion.pathname !== '/') {\n return null;\n }\n\n return { href: authorize.href, origin };\n}\n\n/** Must be called directly from the click handler so browsers allow the popup. */\nexport async function connectPluginPopup(\n api: ApiClient,\n pluginId: string,\n scope: PluginScope,\n options?: { connectionId?: string }\n): Promise<void> {\n const popup = window.open('about:blank', `flexkit-plugin-${crypto.randomUUID()}`, 'popup,width=560,height=720');\n\n if (!popup) {\n throw new Error('Allow popups for Studio, then connect again.');\n }\n\n let transaction: Awaited<ReturnType<ApiClient['connectPlugins']>>;\n\n try {\n transaction = await api.connectPlugins({\n pluginId,\n scope,\n studioOrigin: window.location.origin,\n ...(options?.connectionId ? { connectionId: options.connectionId } : {}),\n });\n } catch (error) {\n popup.close();\n throw error;\n }\n\n const targets = trustedPluginOAuthTargets(transaction.authorizeUrl, transaction.completionOrigin);\n\n if (!targets) {\n popup.close();\n throw new Error('Connection could not be started.');\n }\n\n const expectedOrigin = targets.origin;\n\n await new Promise<void>((resolve, reject) => {\n let polling = false;\n let finished = false;\n // Once the popup leaves for the provider, `popup.closed` says nothing:\n // providers isolate their pages (Cross-Origin-Opener-Policy), which severs\n // the opener and reports the window as closed while it is open. From then\n // on only the transaction's status (and the timeout) ends the wait.\n let handedOff = false;\n const finish = (error?: Error) => {\n if (finished) {\n return;\n }\n\n finished = true;\n window.clearInterval(interval);\n window.clearTimeout(timeout);\n window.removeEventListener('message', onMessage);\n popup.close();\n\n if (error) {\n reject(error);\n\n return;\n }\n\n resolve();\n };\n const poll = async () => {\n if (polling || finished) {\n return;\n }\n\n polling = true;\n let status: Awaited<ReturnType<ApiClient['pluginOAuthStatus']>>;\n\n try {\n status = await api.pluginOAuthStatus(transaction.transactionId);\n } catch {\n polling = false;\n\n return;\n }\n\n polling = false;\n\n if (status.status === 'complete') {\n finish();\n\n return;\n }\n\n if (!handedOff && popup.closed && status.status === 'pending') {\n finish(new Error('Connection window was closed.'));\n\n return;\n }\n\n if (status.status === 'failed' || new Date(status.expires_at).getTime() < Date.now()) {\n finish(new Error('Connection was not completed. Please try again.'));\n }\n };\n const onMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== expectedOrigin || event.source !== popup || !event.data || typeof event.data !== 'object') {\n return;\n }\n\n const payload = event.data as { type?: string; transactionId?: string; status?: string; error?: string };\n\n if (payload.type === 'flexkit:plugin-oauth-ready' && payload.transactionId === transaction.transactionId) {\n handedOff = true;\n popup.postMessage(\n {\n type: 'flexkit:plugin-oauth-start',\n transactionId: transaction.transactionId,\n ticket: transaction.launchTicket,\n },\n expectedOrigin\n );\n\n return;\n }\n\n if (payload.type === 'flexkit:plugin-oauth' && payload.transactionId === transaction.transactionId) {\n if (payload.status === 'failed' && payload.error === 'account_mismatch') {\n finish(new PluginAccountMismatchError());\n\n return;\n }\n\n void poll();\n }\n };\n const interval = window.setInterval(() => {\n void poll();\n }, 2000);\n const timeout = window.setTimeout(() => finish(new Error('Connection timed out. Please try again.')), 600_000);\n window.addEventListener('message', onMessage);\n popup.location.href = targets.href;\n });\n}\n","import type { MarketplacePlugin, PluginCredentialField, PluginCredentialsConnect } from './plugin-types';\n\nexport type ConnectablePlugin = Pick<MarketplacePlugin, 'connect' | 'id' | 'name'>;\n\n/** Longer than any credential a provider issues; the server rejects more. */\nexport const MAX_CREDENTIAL_VALUE_LENGTH = 4096;\n\n/**\n * The secrets a plugin's connect form takes that can be recognized on their\n * own (a distinctive prefix, say), each with that pattern and what to call it.\n */\nexport function pluginSecretFormats(plugin: ConnectablePlugin): Array<{ label: string; pattern: string }> {\n const { connect } = plugin;\n\n if (connect?.type === 'api-token') {\n return connect.pattern ? [{ label: connect.tokenLabel, pattern: connect.pattern }] : [];\n }\n\n if (connect?.type === 'credentials') {\n return [...connect.fields, ...connect.methods.flatMap((method) => method.fields)]\n .filter((field) => field.kind === 'secret' && field.detect)\n .map((field) => ({ label: field.label, pattern: field.detect! }));\n }\n\n return [];\n}\n\n/** The fields a credentials form shows: the shared ones, then those of the chosen method. */\nexport function credentialFormFields(connect: PluginCredentialsConnect, method: string | null): PluginCredentialField[] {\n const selected = connect.methods.find((item) => item.key === method);\n\n return [...connect.fields, ...(selected?.fields ?? [])];\n}\n\n/** Whether every required field has a value: what the Connect button waits for. */\nexport function credentialFormComplete(\n fields: readonly PluginCredentialField[],\n values: { [key: string]: string }\n): boolean {\n return fields.every((field) => !field.required || Boolean(values[field.key]?.trim()));\n}\n\n/** The first problem with the values entered, or null when they can be submitted. */\nexport function credentialFormError(\n fields: readonly PluginCredentialField[],\n values: { [key: string]: string }\n): { field: string; message: string } | null {\n for (const field of fields) {\n const value = values[field.key]?.trim() ?? '';\n\n if (!value) {\n if (field.required) {\n return { field: field.key, message: `Enter the ${field.label}.` };\n }\n\n continue;\n }\n\n if (value.length > MAX_CREDENTIAL_VALUE_LENGTH) {\n return { field: field.key, message: `The ${field.label} is too long; paste only the value.` };\n }\n\n if (!matchesTokenPattern(value, field.pattern)) {\n return { field: field.key, message: `That is not a valid ${field.label}.` };\n }\n }\n\n return null;\n}\n\nexport function matchesTokenPattern(token: string, pattern: string | null): boolean {\n if (!pattern) {\n return true;\n }\n\n try {\n return new RegExp(pattern, 'u').test(token);\n } catch {\n // The server validates the pattern when it admits the plugin; never block on a bad one here.\n return true;\n }\n}\n\n/** A pattern that compiles; an empty or broken one detects nothing rather than every word. */\nfunction compileTokenPattern(pattern: string | null): RegExp | null {\n if (!pattern) {\n return null;\n }\n\n try {\n return new RegExp(pattern, 'u');\n } catch {\n return null;\n }\n}\n\n/**\n * The first plugin whose secret format `text` contains, if any, with every\n * secret-shaped word in the message and what the plugin calls that secret: a\n * token pasted into the chat would be stored in the conversation and sent to\n * the model.\n */\nexport function findPastedPluginToken(\n text: string,\n plugins: readonly ConnectablePlugin[]\n): { plugin: ConnectablePlugin; tokens: string[]; label: string } | null {\n // A token is often glued to a label (`token=…`, `key: …`) or wrapped in\n // brackets, quotes or a sentence's punctuation; none of those are part of it.\n const words = text\n .split(/[\\s\"'`()<>[\\]{},;:=!?&]+/)\n .map((word) => word.replace(/\\.+$/, ''))\n .filter(Boolean);\n let found: { plugin: ConnectablePlugin; label: string } | null = null;\n const tokens = new Set<string>();\n\n for (const plugin of plugins) {\n for (const format of pluginSecretFormats(plugin)) {\n const pattern = compileTokenPattern(format.pattern);\n\n for (const word of pattern ? words : []) {\n if (pattern!.test(word)) {\n found ??= { plugin, label: format.label };\n tokens.add(word);\n }\n }\n }\n }\n\n return found ? { ...found, tokens: [...tokens] } : null;\n}\n","import type { FormEvent, JSX } from 'react';\nimport { useId, useState, useSyncExternalStore } from 'react';\nimport { ExternalLinkIcon, LoaderCircle } from 'lucide-react';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '../../ui';\nimport type { ApiClient } from './api';\nimport { connectPluginPopup } from './plugin-oauth';\nimport {\n credentialFormComplete,\n credentialFormError,\n credentialFormFields,\n matchesTokenPattern,\n type ConnectablePlugin,\n} from './plugin-token-format';\nimport type { PluginApiTokenConnect, PluginCredentialsConnect, PluginScope } from './plugin-types';\n\ninterface TokenRequest {\n id: number;\n plugin: ConnectablePlugin & { connect: PluginApiTokenConnect };\n /** Saves the token; rejects with a message the dialog shows next to the field. */\n submit: (_token: string) => Promise<void>;\n settle: (_connected: boolean) => void;\n}\n\ninterface CredentialsRequest {\n id: number;\n plugin: ConnectablePlugin & { connect: PluginCredentialsConnect };\n /** Saves the form; rejects with a message the dialog shows under the fields. */\n submit: (_method: string | undefined, _values: { [key: string]: string }) => Promise<void>;\n settle: (_connected: boolean) => void;\n}\n\ntype FormRequest = ({ kind: 'token' } & TokenRequest) | ({ kind: 'credentials' } & CredentialsRequest);\n\n/** The one open connect form, outside React so any connect button can open it. */\nlet request: FormRequest | null = null;\nlet lastRequestId = 0;\n/** Cancels the latest request, whether its dialog has opened yet or not. */\nlet cancelLatest: (() => void) | null = null;\nconst listeners = new Set<() => void>();\n\nfunction setRequest(next: FormRequest | null): void {\n request = next;\n listeners.forEach((listener) => listener());\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n}\n\n/**\n * Connects a plugin: a sign-in popup for OAuth plugins, the token dialog for\n * plugins that take a pasted token, the credentials dialog for plugins that\n * take the credentials of an app the user created at the provider. Resolves\n * `false` when the user closes a dialog without connecting.\n *\n * Call it straight from a click handler: browsers only allow the popup there.\n */\nexport function connectPlugin(\n api: ApiClient,\n plugin: ConnectablePlugin,\n scope: PluginScope,\n options?: { connectionId?: string }\n): Promise<boolean> {\n const { connect } = plugin;\n\n if (connect?.type !== 'api-token' && connect?.type !== 'credentials') {\n return connectPluginPopup(api, plugin.id, scope, options).then(() => true);\n }\n\n // Opening a second dialog closes the first, as if cancelled.\n cancelLatest?.();\n\n const id = ++lastRequestId;\n const connectionId = options?.connectionId ? { connectionId: options.connectionId } : {};\n\n return new Promise<boolean>((resolve) => {\n const settle = (connected: boolean): void => {\n // A save still running for a replaced dialog must not close its successor.\n if (request?.id === id) {\n setRequest(null);\n }\n\n if (lastRequestId === id) {\n cancelLatest = null;\n }\n\n resolve(connected);\n };\n const next: FormRequest =\n connect.type === 'api-token'\n ? {\n kind: 'token',\n id,\n plugin: { ...plugin, connect },\n submit: async (token) => {\n await api.connectPluginToken({ pluginId: plugin.id, scope, token, ...connectionId });\n },\n settle,\n }\n : {\n kind: 'credentials',\n id,\n plugin: { ...plugin, connect },\n submit: async (method, values) => {\n await api.connectPluginCredentials({ pluginId: plugin.id, scope, method, values, ...connectionId });\n },\n settle,\n };\n\n cancelLatest = () => settle(false);\n\n // Open after the current event: a menu item that started this closes first\n // and returns focus to its trigger, which would take it from the first field.\n setTimeout(() => {\n if (lastRequestId === id) {\n setRequest(next);\n }\n });\n });\n}\n\nfunction httpsHref(value: string | null): string | null {\n if (!value) {\n return null;\n }\n\n try {\n const url = new URL(value);\n\n return url.protocol === 'https:' ? url.href : null;\n } catch {\n return null;\n }\n}\n\n/** Mounted once by the Studio layout; renders the dialog `connectPlugin` opens for token and credentials plugins. */\nexport function PluginTokenDialogHost(): JSX.Element | null {\n const current = useSyncExternalStore(\n subscribe,\n () => request,\n () => null\n );\n\n if (!current) {\n return null;\n }\n\n // A new key per request resets the fields, so a secret never outlives its dialog.\n return current.kind === 'token' ? (\n <PluginTokenDialog key={current.id} request={current} />\n ) : (\n <PluginCredentialsDialog key={current.id} request={current} />\n );\n}\n\nfunction FieldError({ id, message }: { id: string; message: string | null }): JSX.Element | null {\n return message ? (\n <p className=\"fk:text-sm fk:text-destructive\" id={id}>\n {message}\n </p>\n ) : null;\n}\n\nfunction HelpLink({ href, label }: { href: string | null; label: string }): JSX.Element | null {\n const safeHref = httpsHref(href);\n\n return safeHref ? (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground fk:underline-offset-4 fk:hover:underline\"\n href={safeHref}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n <ExternalLinkIcon className=\"fk:size-3.5\" />\n </a>\n ) : null;\n}\n\nfunction PluginCredentialsDialog({ request: current }: { request: CredentialsRequest }): JSX.Element {\n const { connect, name } = current.plugin;\n const formId = useId();\n const [method, setMethod] = useState<string | null>(connect.methods[0]?.key ?? null);\n const [values, setValues] = useState<{ [key: string]: string }>({});\n const [error, setError] = useState<{ field: string | null; message: string } | null>(null);\n const [saving, setSaving] = useState(false);\n const fields = credentialFormFields(connect, method);\n const selectedMethod = connect.methods.find((item) => item.key === method) ?? null;\n // Submitting surfaces which field is malformed; the button only waits for the required values.\n const ready = credentialFormComplete(fields, values);\n\n async function save(event: FormEvent): Promise<void> {\n event.preventDefault();\n\n if (saving) {\n return;\n }\n\n const problem = credentialFormError(fields, values);\n\n if (problem) {\n setError(problem);\n\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await current.submit(\n method ?? undefined,\n Object.fromEntries(fields.map((field) => [field.key, values[field.key]?.trim() ?? '']).filter(([, value]) => value))\n );\n setValues({});\n current.settle(true);\n } catch (failure) {\n setError({ field: null, message: failure instanceof Error ? failure.message : `${name} could not be connected.` });\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !saving) {\n current.settle(false);\n }\n }}\n >\n <DialogContent>\n <form className=\"fk:flex fk:flex-col fk:gap-4\" onSubmit={(event) => void save(event)}>\n <DialogHeader>\n <DialogTitle>Connect {name}</DialogTitle>\n <DialogDescription>\n {connect.description} Flexkit checks the credentials with {name}, stores them encrypted and sends them\n only to Flexkit&apos;s own {name} server; the agent can use the tools but never sees them.\n </DialogDescription>\n </DialogHeader>\n {connect.methods.length > 1 ? (\n <div className=\"fk:space-y-1.5\" role=\"group\" aria-label=\"How to connect\">\n {connect.methods.map((item) => (\n <button\n aria-pressed={method === item.key}\n className={`fk:flex fk:w-full fk:flex-col fk:rounded-lg fk:border fk:px-3 fk:py-2 fk:text-left fk:corner-squircle ${\n method === item.key ? 'fk:border-primary fk:bg-primary/5' : 'fk:border-border fk:hover:bg-muted/60'\n }`}\n disabled={saving}\n key={item.key}\n onClick={() => {\n setMethod(item.key);\n setError(null);\n }}\n type=\"button\"\n >\n <span className=\"fk:text-sm fk:font-medium\">{item.label}</span>\n {item.description ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">{item.description}</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : selectedMethod?.description ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{selectedMethod.description}</p>\n ) : null}\n {fields.map((field, index) => {\n const inputId = `${formId}-${field.key}`;\n const fieldError = error?.field === field.key ? error.message : null;\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-2\" key={field.key}>\n <label className=\"fk:text-sm fk:font-medium\" htmlFor={inputId}>\n {field.label}\n </label>\n <Input\n aria-describedby={fieldError ? `${inputId}-error` : field.help ? `${inputId}-help` : undefined}\n aria-invalid={fieldError ? true : undefined}\n autoComplete=\"off\"\n autoFocus={index === 0}\n disabled={saving}\n id={inputId}\n placeholder={field.placeholder ?? undefined}\n spellCheck={false}\n type={field.kind === 'secret' ? 'password' : 'text'}\n value={values[field.key] ?? ''}\n onChange={(event) => {\n setValues((previous) => ({ ...previous, [field.key]: event.target.value }));\n setError(null);\n }}\n />\n {field.help && !fieldError ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\" id={`${inputId}-help`}>\n {field.help}\n </p>\n ) : null}\n <FieldError id={`${inputId}-error`} message={fieldError} />\n </div>\n );\n })}\n <FieldError id={`${formId}-error`} message={error?.field === null ? error.message : null} />\n <HelpLink href={connect.helpUrl} label={`How to set up ${name}`} />\n <DialogFooter>\n <Button disabled={saving} size=\"sm\" type=\"button\" variant=\"outline\" onClick={() => current.settle(false)}>\n Cancel\n </Button>\n <Button disabled={saving || !ready} size=\"sm\" type=\"submit\">\n {saving ? <LoaderCircle className=\"fk:size-4 fk:animate-spin\" /> : null}\n Connect\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction PluginTokenDialog({ request: current }: { request: TokenRequest }): JSX.Element {\n const { connect, name } = current.plugin;\n const inputId = useId();\n const [token, setToken] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n\n async function save(event: FormEvent): Promise<void> {\n event.preventDefault();\n const value = token.trim();\n\n if (saving || !value) {\n return;\n }\n\n if (!matchesTokenPattern(value, connect.pattern)) {\n setError(`That does not look like a ${connect.tokenLabel}.`);\n\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await current.submit(value);\n setToken('');\n current.settle(true);\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : `${name} could not be connected.`);\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !saving) {\n current.settle(false);\n }\n }}\n >\n <DialogContent>\n <form className=\"fk:flex fk:flex-col fk:gap-4\" onSubmit={(event) => void save(event)}>\n <DialogHeader>\n <DialogTitle>Connect {name}</DialogTitle>\n <DialogDescription>\n Paste a {connect.tokenLabel}. Flexkit stores it encrypted and sends it only to {name}; the agent can use{' '}\n {name}&apos;s tools but never sees the token. Give it read access only, unless the agent should change\n things in {name}.\n </DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <label className=\"fk:text-sm fk:font-medium\" htmlFor={inputId}>\n {connect.tokenLabel}\n </label>\n <Input\n aria-describedby={error ? `${inputId}-error` : undefined}\n aria-invalid={error ? true : undefined}\n autoComplete=\"off\"\n autoFocus\n disabled={saving}\n id={inputId}\n placeholder={connect.placeholder ?? undefined}\n spellCheck={false}\n type=\"password\"\n value={token}\n onChange={(event) => {\n setToken(event.target.value);\n setError(null);\n }}\n />\n <FieldError id={`${inputId}-error`} message={error} />\n <HelpLink href={connect.helpUrl} label={`How to create a ${connect.tokenLabel}`} />\n </div>\n <DialogFooter>\n <Button disabled={saving} size=\"sm\" type=\"button\" variant=\"outline\" onClick={() => current.settle(false)}>\n Cancel\n </Button>\n <Button disabled={saving || !token.trim()} size=\"sm\" type=\"submit\">\n {saving ? <LoaderCircle className=\"fk:size-4 fk:animate-spin\" /> : null}\n Connect\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {a}from'./chunk-O2QMYUPS.js';import {Avatar,DropdownMenu}from'radix-ui';import {jsx,jsxs}from'react/jsx-runtime';import {CheckIcon,CircleIcon,ChevronRightIcon}from'lucide-react';function g({className:e,size:t="default",...r}){return jsx(Avatar.Root,{"data-slot":"avatar","data-size":t,className:a("fk:group/avatar fk:relative fk:flex fk:size-8 fk:shrink-0 fk:overflow-hidden fk:rounded-full fk:select-none fk:data-[size=lg]:size-10 fk:data-[size=sm]:size-6 fk:corner-squircle",e),...r})}function v({className:e,...t}){return jsx(Avatar.Image,{"data-slot":"avatar-image",className:a("fk:aspect-square fk:size-full",e),...t})}function b({className:e,...t}){return jsx(Avatar.Fallback,{"data-slot":"avatar-fallback",className:a("fk:flex fk:size-full fk:items-center fk:justify-center fk:rounded-full fk:bg-muted fk:text-sm fk:text-muted-foreground fk:group-data-[size=sm]/avatar:text-xs fk:corner-squircle",e),...t})}function w({className:e,...t}){return jsx("div",{"data-slot":"avatar-group",className:a("fk:group/avatar-group fk:flex fk:-space-x-2 fk:*:data-[slot=avatar]:ring-2 fk:*:data-[slot=avatar]:ring-background",e),...t})}function M({...e}){return jsx(DropdownMenu.Root,{"data-slot":"dropdown-menu",...e})}function C({...e}){return jsx(DropdownMenu.Portal,{"data-slot":"dropdown-menu-portal",...e})}function R({...e}){return jsx(DropdownMenu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function y({className:e,sideOffset:t=4,...r}){return jsx(DropdownMenu.Portal,{children:jsx(DropdownMenu.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:a("fk:z-50 fk:max-h-(--radix-dropdown-menu-content-available-height) fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-x-hidden fk:overflow-y-auto fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-md fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle",e),...r})})}function I({...e}){return jsx(DropdownMenu.Group,{"data-slot":"dropdown-menu-group",...e})}function N({className:e,inset:t,variant:r="default",...f}){return jsx(DropdownMenu.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":r,className:a("fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:data-inset:pl-8 fk:data-[variant=destructive]:text-destructive fk:data-[variant=destructive]:focus:bg-destructive/10 fk:data-[variant=destructive]:focus:text-destructive fk:dark:data-[variant=destructive]:focus:bg-destructive/20 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:data-[variant=destructive]:*:[svg]:text-destructive! fk:corner-squircle",e),...f})}function S({className:e,children:t,checked:r,...f}){return jsxs(DropdownMenu.CheckboxItem,{"data-slot":"dropdown-menu-checkbox-item",className:a("fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle",e),checked:r,...f,children:[jsx("span",{className:"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center",children:jsx(DropdownMenu.ItemIndicator,{children:jsx(CheckIcon,{className:"fk:size-4"})})}),t]})}function _({...e}){return jsx(DropdownMenu.RadioGroup,{"data-slot":"dropdown-menu-radio-group",...e})}function q({className:e,children:t,...r}){return jsxs(DropdownMenu.RadioItem,{"data-slot":"dropdown-menu-radio-item",className:a("fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle",e),...r,children:[jsx("span",{className:"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center",children:jsx(DropdownMenu.ItemIndicator,{children:jsx(CircleIcon,{className:"size-2 fill-current"})})}),t]})}function A({className:e,inset:t,...r}){return jsx(DropdownMenu.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:a("fk:px-2 fk:py-1.5 fk:text-sm fk:font-medium fk:data-inset:pl-8",e),...r})}function G({className:e,...t}){return jsx(DropdownMenu.Separator,{"data-slot":"dropdown-menu-separator",className:a("fk:-mx-1 fk:my-1 fk:h-px fk:bg-border",e),...t})}function T({className:e,...t}){return jsx("span",{"data-slot":"dropdown-menu-shortcut",className:a("fk:ml-auto fk:text-xs fk:tracking-widest fk:text-muted-foreground",e),...t})}function F({...e}){return jsx(DropdownMenu.Sub,{"data-slot":"dropdown-menu-sub",...e})}function L({className:e,inset:t,children:r,...f}){return jsxs(DropdownMenu.SubTrigger,{"data-slot":"dropdown-menu-sub-trigger","data-inset":t,className:a("fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-inset:pl-8 fk:data-[state=open]:bg-accent fk:data-[state=open]:text-accent-foreground fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:corner-squircle",e),...f,children:[r,jsx(ChevronRightIcon,{className:"fk:ml-auto fk:size-4"})]})}function j({className:e,...t}){return jsx(DropdownMenu.SubContent,{"data-slot":"dropdown-menu-sub-content",className:a("fk:z-50 fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-hidden fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-lg fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle",e),...t})}function H({className:e,...t}){return jsx("div",{"data-slot":"skeleton",className:a("fk:animate-pulse fk:rounded-md fk:bg-accent fk:corner-squircle",e),...t})}export{g as a,v as b,b as c,w as d,M as e,C as f,R as g,y as h,I as i,N as j,S as k,_ as l,q as m,A as n,G as o,T as p,F as q,L as r,j as s,H as t};//# sourceMappingURL=chunk-SZEGGBOC.js.map
2
- //# sourceMappingURL=chunk-SZEGGBOC.js.map
1
+ import'./index.css';import {a}from'./chunk-X3SHNHHM.js';import {Avatar,DropdownMenu}from'radix-ui';import {jsx,jsxs}from'react/jsx-runtime';import {CheckIcon,CircleIcon,ChevronRightIcon}from'lucide-react';function g({className:e,size:t="default",...r}){return jsx(Avatar.Root,{"data-slot":"avatar","data-size":t,className:a("fk:group/avatar fk:relative fk:flex fk:size-8 fk:shrink-0 fk:overflow-hidden fk:rounded-full fk:select-none fk:data-[size=lg]:size-10 fk:data-[size=sm]:size-6 fk:corner-squircle",e),...r})}function v({className:e,...t}){return jsx(Avatar.Image,{"data-slot":"avatar-image",className:a("fk:aspect-square fk:size-full",e),...t})}function b({className:e,...t}){return jsx(Avatar.Fallback,{"data-slot":"avatar-fallback",className:a("fk:flex fk:size-full fk:items-center fk:justify-center fk:rounded-full fk:bg-muted fk:text-sm fk:text-muted-foreground fk:group-data-[size=sm]/avatar:text-xs fk:corner-squircle",e),...t})}function w({className:e,...t}){return jsx("div",{"data-slot":"avatar-group",className:a("fk:group/avatar-group fk:flex fk:-space-x-2 fk:*:data-[slot=avatar]:ring-2 fk:*:data-[slot=avatar]:ring-background",e),...t})}function M({...e}){return jsx(DropdownMenu.Root,{"data-slot":"dropdown-menu",...e})}function C({...e}){return jsx(DropdownMenu.Portal,{"data-slot":"dropdown-menu-portal",...e})}function R({...e}){return jsx(DropdownMenu.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function y({className:e,sideOffset:t=4,...r}){return jsx(DropdownMenu.Portal,{children:jsx(DropdownMenu.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:a("fk:z-50 fk:max-h-(--radix-dropdown-menu-content-available-height) fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-x-hidden fk:overflow-y-auto fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-md fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle",e),...r})})}function I({...e}){return jsx(DropdownMenu.Group,{"data-slot":"dropdown-menu-group",...e})}function N({className:e,inset:t,variant:r="default",...f}){return jsx(DropdownMenu.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":r,className:a("fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:data-inset:pl-8 fk:data-[variant=destructive]:text-destructive fk:data-[variant=destructive]:focus:bg-destructive/10 fk:data-[variant=destructive]:focus:text-destructive fk:dark:data-[variant=destructive]:focus:bg-destructive/20 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:data-[variant=destructive]:*:[svg]:text-destructive! fk:corner-squircle",e),...f})}function S({className:e,children:t,checked:r,...f}){return jsxs(DropdownMenu.CheckboxItem,{"data-slot":"dropdown-menu-checkbox-item",className:a("fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle",e),checked:r,...f,children:[jsx("span",{className:"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center",children:jsx(DropdownMenu.ItemIndicator,{children:jsx(CheckIcon,{className:"fk:size-4"})})}),t]})}function _({...e}){return jsx(DropdownMenu.RadioGroup,{"data-slot":"dropdown-menu-radio-group",...e})}function q({className:e,children:t,...r}){return jsxs(DropdownMenu.RadioItem,{"data-slot":"dropdown-menu-radio-item",className:a("fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle",e),...r,children:[jsx("span",{className:"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center",children:jsx(DropdownMenu.ItemIndicator,{children:jsx(CircleIcon,{className:"size-2 fill-current"})})}),t]})}function A({className:e,inset:t,...r}){return jsx(DropdownMenu.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:a("fk:px-2 fk:py-1.5 fk:text-sm fk:font-medium fk:data-inset:pl-8",e),...r})}function G({className:e,...t}){return jsx(DropdownMenu.Separator,{"data-slot":"dropdown-menu-separator",className:a("fk:-mx-1 fk:my-1 fk:h-px fk:bg-border",e),...t})}function T({className:e,...t}){return jsx("span",{"data-slot":"dropdown-menu-shortcut",className:a("fk:ml-auto fk:text-xs fk:tracking-widest fk:text-muted-foreground",e),...t})}function F({...e}){return jsx(DropdownMenu.Sub,{"data-slot":"dropdown-menu-sub",...e})}function L({className:e,inset:t,children:r,...f}){return jsxs(DropdownMenu.SubTrigger,{"data-slot":"dropdown-menu-sub-trigger","data-inset":t,className:a("fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-inset:pl-8 fk:data-[state=open]:bg-accent fk:data-[state=open]:text-accent-foreground fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:corner-squircle",e),...f,children:[r,jsx(ChevronRightIcon,{className:"fk:ml-auto fk:size-4"})]})}function j({className:e,...t}){return jsx(DropdownMenu.SubContent,{"data-slot":"dropdown-menu-sub-content",className:a("fk:z-50 fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-hidden fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-lg fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle",e),...t})}function H({className:e,...t}){return jsx("div",{"data-slot":"skeleton",className:a("fk:animate-pulse fk:rounded-md fk:bg-accent fk:corner-squircle",e),...t})}export{g as a,v as b,b as c,w as d,M as e,C as f,R as g,y as h,I as i,N as j,S as k,_ as l,q as m,A as n,G as o,T as p,F as q,L as r,j as s,H as t};//# sourceMappingURL=chunk-A4DPLZZF.js.map
2
+ //# sourceMappingURL=chunk-A4DPLZZF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/primitives/avatar.tsx","../src/ui/primitives/dropdown-menu.tsx","../src/ui/primitives/skeleton.tsx"],"names":["Avatar","className","size","props","jsx","AvatarPrimitive","cn","AvatarImage","AvatarFallback","AvatarGroup","DropdownMenu","DropdownMenuPrimitive","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuContent","sideOffset","DropdownMenuGroup","DropdownMenuItem","inset","variant","DropdownMenuCheckboxItem","children","checked","jsxs","CheckIcon","DropdownMenuRadioGroup","DropdownMenuRadioItem","CircleIcon","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubTrigger","ChevronRightIcon","DropdownMenuSubContent","Skeleton"],"mappings":"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","file":"chunk-SZEGGBOC.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Avatar as AvatarPrimitive } from 'radix-ui';\nimport { cn } from '../lib/utils';\n\nfunction Avatar({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: 'default' | 'sm' | 'lg';\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n 'fk:group/avatar fk:relative fk:flex fk:size-8 fk:shrink-0 fk:overflow-hidden fk:rounded-full fk:select-none fk:data-[size=lg]:size-10 fk:data-[size=sm]:size-6 fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('fk:aspect-square fk:size-full', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n 'fk:flex fk:size-full fk:items-center fk:justify-center fk:rounded-full fk:bg-muted fk:text-sm fk:text-muted-foreground fk:group-data-[size=sm]/avatar:text-xs fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n 'fk:absolute fk:right-0 fk:bottom-0 fk:z-10 fk:inline-flex fk:items-center fk:justify-center fk:rounded-full fk:bg-primary fk:text-primary-foreground fk:ring-2 fk:ring-background fk:select-none fk:corner-squircle',\n 'fk:group-data-[size=sm]/avatar:size-2 fk:group-data-[size=sm]/avatar:[&>svg]:hidden',\n 'fk:group-data-[size=default]/avatar:size-2.5 fk:group-data-[size=default]/avatar:[&>svg]:size-2',\n 'fk:group-data-[size=lg]/avatar:size-3 fk:group-data-[size=lg]/avatar:[&>svg]:size-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n 'fk:group/avatar-group fk:flex fk:-space-x-2 fk:*:data-[slot=avatar]:ring-2 fk:*:data-[slot=avatar]:ring-background',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarGroupCount({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n 'fk:relative fk:flex fk:size-8 fk:shrink-0 fk:items-center fk:justify-center fk:rounded-full fk:bg-muted fk:text-sm fk:text-muted-foreground fk:ring-2 fk:ring-background fk:group-has-data-[size=lg]/avatar-group:size-10 fk:group-has-data-[size=sm]/avatar-group:size-6 fk:[&>svg]:size-4 fk:group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 fk:group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback, AvatarBadge, AvatarGroup, AvatarGroupCount };\n","'use client';\n\nimport * as React from 'react';\nimport { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nfunction DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'fk:z-50 fk:max-h-(--radix-dropdown-menu-content-available-height) fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-x-hidden fk:overflow-y-auto fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-md fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:data-inset:pl-8 fk:data-[variant=destructive]:text-destructive fk:data-[variant=destructive]:focus:bg-destructive/10 fk:data-[variant=destructive]:focus:text-destructive fk:dark:data-[variant=destructive]:focus:bg-destructive/20 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:data-[variant=destructive]:*:[svg]:text-destructive! fk:corner-squircle\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"fk:size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle\",\n className\n )}\n {...props}\n >\n <span className=\"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn('fk:px-2 fk:py-1.5 fk:text-sm fk:font-medium fk:data-inset:pl-8', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('fk:-mx-1 fk:my-1 fk:h-px fk:bg-border', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('fk:ml-auto fk:text-xs fk:tracking-widest fk:text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-inset:pl-8 fk:data-[state=open]:bg-accent fk:data-[state=open]:text-accent-foreground fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:corner-squircle\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"fk:ml-auto fk:size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'fk:z-50 fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-hidden fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-lg fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","import { cn } from '../lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div data-slot=\"skeleton\" className={cn('fk:animate-pulse fk:rounded-md fk:bg-accent fk:corner-squircle', className)} {...props} />\n );\n}\n\nexport { Skeleton };\n"]}
1
+ {"version":3,"sources":["../src/ui/primitives/avatar.tsx","../src/ui/primitives/dropdown-menu.tsx","../src/ui/primitives/skeleton.tsx"],"names":["Avatar","className","size","props","jsx","AvatarPrimitive","cn","AvatarImage","AvatarFallback","AvatarGroup","DropdownMenu","DropdownMenuPrimitive","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuContent","sideOffset","DropdownMenuGroup","DropdownMenuItem","inset","variant","DropdownMenuCheckboxItem","children","checked","jsxs","CheckIcon","DropdownMenuRadioGroup","DropdownMenuRadioItem","CircleIcon","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubTrigger","ChevronRightIcon","DropdownMenuSubContent","Skeleton"],"mappings":"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","file":"chunk-A4DPLZZF.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Avatar as AvatarPrimitive } from 'radix-ui';\nimport { cn } from '../lib/utils';\n\nfunction Avatar({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: 'default' | 'sm' | 'lg';\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n 'fk:group/avatar fk:relative fk:flex fk:size-8 fk:shrink-0 fk:overflow-hidden fk:rounded-full fk:select-none fk:data-[size=lg]:size-10 fk:data-[size=sm]:size-6 fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('fk:aspect-square fk:size-full', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n 'fk:flex fk:size-full fk:items-center fk:justify-center fk:rounded-full fk:bg-muted fk:text-sm fk:text-muted-foreground fk:group-data-[size=sm]/avatar:text-xs fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n 'fk:absolute fk:right-0 fk:bottom-0 fk:z-10 fk:inline-flex fk:items-center fk:justify-center fk:rounded-full fk:bg-primary fk:text-primary-foreground fk:ring-2 fk:ring-background fk:select-none fk:corner-squircle',\n 'fk:group-data-[size=sm]/avatar:size-2 fk:group-data-[size=sm]/avatar:[&>svg]:hidden',\n 'fk:group-data-[size=default]/avatar:size-2.5 fk:group-data-[size=default]/avatar:[&>svg]:size-2',\n 'fk:group-data-[size=lg]/avatar:size-3 fk:group-data-[size=lg]/avatar:[&>svg]:size-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n 'fk:group/avatar-group fk:flex fk:-space-x-2 fk:*:data-[slot=avatar]:ring-2 fk:*:data-[slot=avatar]:ring-background',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarGroupCount({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n 'fk:relative fk:flex fk:size-8 fk:shrink-0 fk:items-center fk:justify-center fk:rounded-full fk:bg-muted fk:text-sm fk:text-muted-foreground fk:ring-2 fk:ring-background fk:group-has-data-[size=lg]/avatar-group:size-10 fk:group-has-data-[size=sm]/avatar-group:size-6 fk:[&>svg]:size-4 fk:group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 fk:group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback, AvatarBadge, AvatarGroup, AvatarGroupCount };\n","'use client';\n\nimport * as React from 'react';\nimport { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nfunction DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'fk:z-50 fk:max-h-(--radix-dropdown-menu-content-available-height) fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-x-hidden fk:overflow-y-auto fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-md fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:data-inset:pl-8 fk:data-[variant=destructive]:text-destructive fk:data-[variant=destructive]:focus:bg-destructive/10 fk:data-[variant=destructive]:focus:text-destructive fk:dark:data-[variant=destructive]:focus:bg-destructive/20 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:data-[variant=destructive]:*:[svg]:text-destructive! fk:corner-squircle\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"fk:size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"fk:relative fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:py-1.5 fk:pr-2 fk:pl-8 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-disabled:pointer-events-none fk:data-disabled:opacity-50 fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:corner-squircle\",\n className\n )}\n {...props}\n >\n <span className=\"fk:pointer-events-none fk:absolute fk:left-2 fk:flex fk:size-3.5 fk:items-center fk:justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn('fk:px-2 fk:py-1.5 fk:text-sm fk:font-medium fk:data-inset:pl-8', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('fk:-mx-1 fk:my-1 fk:h-px fk:bg-border', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('fk:ml-auto fk:text-xs fk:tracking-widest fk:text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"fk:flex fk:cursor-default fk:items-center fk:gap-2 fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-sm fk:outline-hidden fk:select-none fk:focus:bg-accent fk:focus:text-accent-foreground fk:data-inset:pl-8 fk:data-[state=open]:bg-accent fk:data-[state=open]:text-accent-foreground fk:[&_svg]:pointer-events-none fk:[&_svg]:shrink-0 fk:[&_svg:not([class*='size-'])]:size-4 fk:[&_svg:not([class*='text-'])]:text-muted-foreground fk:corner-squircle\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"fk:ml-auto fk:size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'fk:z-50 fk:min-w-32 fk:origin-(--radix-dropdown-menu-content-transform-origin) fk:overflow-hidden fk:rounded-md fk:border fk:bg-popover fk:p-1 fk:text-popover-foreground fk:shadow-lg fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","import { cn } from '../lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div data-slot=\"skeleton\" className={cn('fk:animate-pulse fk:rounded-md fk:bg-accent fk:corner-squircle', className)} {...props} />\n );\n}\n\nexport { Skeleton };\n"]}
@@ -38,8 +38,10 @@ var userApiPaths = {
38
38
  logout: `/api/flexkit/${USER_API_SEGMENT}/auth/logout`,
39
39
  /** POST: product events only Studio sees (see core/analytics/product-events.ts). */
40
40
  productEvents: `/api/flexkit/${USER_API_SEGMENT}/product-events`,
41
- /** Signed-in user plus every project they can open. */
41
+ /** Signed-in user, every project they can open, and their teams. */
42
42
  me: `/api/flexkit/${USER_API_SEGMENT}/me`,
43
+ /** POST `{ name, teamId? }`: create a project owned by the signed-in user. */
44
+ myProjects: `/api/flexkit/${USER_API_SEGMENT}/me/projects`,
43
45
  /** The signed-in user's notification preferences (desktop kinds, approval email). */
44
46
  notificationPreferences: `/api/flexkit/${USER_API_SEGMENT}/me/notification-preferences`,
45
47
  /** Web Push: GET the VAPID public key, POST or DELETE this browser's subscription. */
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {c as c$3}from'./chunk-MBBE4RND.js';import {a,b,c as c$1,e as e$1}from'./chunk-3SY46ERM.js';import {a as a$1,d,c,e,g}from'./chunk-S7Z6KKIN.js';import {c as c$2}from'./chunk-X3SHNHHM.js';import {useId,useState}from'react';import {useNavigate}from'react-router-dom';import {Loader2}from'lucide-react';import K,{mutate}from'swr';import {jsxs,jsx}from'react/jsx-runtime';function Q(e,t,r=[]){return r.find(o=>o.id===e)?.name??t.find(o=>o.projectId===e)?.title??e}function Z(e,t){let r=new Map;for(let o of e){let n=t.find(u=>u.id===o),l=n?.team.id??"",c=r.get(l)??{label:n?.team.name??"",projectIds:[]};c.projectIds.push(o),r.set(l,c);}return r.size<=1?[{label:null,projectIds:e}]:[...r.values()].map(o=>({label:o.label||null,projectIds:o.projectIds}))}var G="Could not create the project. Please try again.";async function L(e){try{let t=await fetch(c$3.myProjects,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),r=await t.json().catch(()=>({}));return t.ok&&r.project?.id&&r.team?.id?{ok:!0,project:r.project,team:r.team}:{ok:!1,code:r.code??"unknown_error",message:r.error??G}}catch{return {ok:false,code:"network_error",message:"Flexkit is not reachable. Check your connection and try again."}}}function E(e){return e.filter(t=>t.role==="owner")}function U(e){return `/${e}/ai`}var R="hosted-session";async function X(){try{let e=await fetch(c$3.me,{credentials:"same-origin"});return e.status===401?{kind:"anonymous"}:e.ok?{kind:"ready",data:await e.json()}:{kind:"error",message:`Flexkit answered ${String(e.status)} while loading your projects.`}}catch(e){return {kind:"error",message:e instanceof Error?e.message:"Flexkit is not reachable."}}}function Y(e){return e?e.kind==="anonymous"?{status:"anonymous"}:e.kind==="error"?{status:"error",message:e.message}:{status:"ready",projects:e.data.projects,teams:e.data.teams??[],user:e.data.user}:{status:"loading"}}function se(){let{data:e}=K(R,X,{revalidateOnFocus:false,revalidateOnReconnect:false,shouldRetryOnError:false});return Y(e)}function $(e,t){if(e?.kind!=="ready"||e.data.projects.some(n=>n.id===t.project.id))return e;let r=e.data.teams??[],o={avatarUrl:null,id:t.project.id,name:t.project.name,readOnly:false,role:"owner",suspended:false,team:t.team};return {kind:"ready",data:{...e.data,projects:[...e.data.projects,o],teams:r.some(n=>n.id===t.team.id)?r:[...r,{...t.team,role:"owner"}]}}}async function v(e){await mutate(R,t=>$(t,e),{revalidate:false});}function q(e){let t=e.trim();return t?t.length>48?"Project names can be up to 48 characters.":null:"Give your project a name."}function ye({autoFocus:e$2=false,isFirstProject:t=false,onCancel:r,onCreated:o,submitLabel:n="Create project",teams:l}){let c$3=useNavigate(),u=useId(),b$1=useId(),f=E(l),[j,_]=useState(""),[x,D]=useState(null),y=f.some(a=>a.id===x)?x??"":f[0]?.id??"",[k,P]=useState(null),[d$1,w]=useState(false);async function J(){let a=q(j);if(a){P(a);return}P(null),w(true);let i=await L({name:j.trim(),...y?{teamId:y}:{}});if(!i.ok){P(i.message),w(false);return}let C=U(i.project.id);t?(c$3(C),await v(i)):(await v(i),c$3(C)),o?.(i.project.id);}return jsxs("form",{className:"fk:flex fk:w-full fk:flex-col fk:gap-4",onSubmit:a=>{a.preventDefault(),J();},children:[jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(a,{htmlFor:u,children:"Project name"}),jsx(b,{"aria-invalid":k?true:void 0,autoComplete:"off",autoFocus:e$2,disabled:d$1,id:u,maxLength:48,onChange:a=>{_(a.target.value);},placeholder:"e.g. Aven Living",value:j}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:"Usually your store or company name. You can change it later."})]}),f.length>1?jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(a,{htmlFor:b$1,children:"Team"}),jsxs(a$1,{disabled:d$1,onValueChange:D,value:y,children:[jsx(d,{id:b$1,children:jsx(c,{})}),jsx(e,{children:f.map(a=>jsx(g,{value:a.id,children:a.name},a.id))})]})]}):null,k?jsx(c$1,{variant:"destructive",children:jsx(e$1,{children:k})}):null,jsxs("div",{className:"fk:flex fk:justify-end fk:gap-2",children:[r?jsx(c$2,{disabled:d$1,onClick:r,type:"button",variant:"outline",children:"Cancel"}):null,jsxs(c$2,{className:r?void 0:"fk:w-full",disabled:d$1,type:"submit",children:[d$1?jsx(Loader2,{className:"fk:h-4 fk:w-4 fk:animate-spin"}):null,n]})]})]})}export{Q as a,Z as b,se as c,ye as d};//# sourceMappingURL=chunk-C3OHXPJV.js.map
2
+ //# sourceMappingURL=chunk-C3OHXPJV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/components/project-label.ts","../src/core/config/create-project.ts","../src/core/config/use-hosted-session.ts","../src/ui/components/create-project-form.tsx"],"names":["getProjectLabel","projectId","projects","projectSummaries","project","groupProjectIdsByTeam","projectIds","teams","id","summary","key","group","FALLBACK_MESSAGE","createHostedProject","input","response","userApiPaths","body","ownedTeams","team","newProjectPath","SESSION_KEY","fetchMe","error","toHostedSession","outcome","useHostedSession","data","useSWR","withCreatedProject","created","rememberCreatedProject","mutate","current","validateName","name","trimmed","CreateProjectForm","autoFocus","isFirstProject","onCancel","onCreated","submitLabel","navigate","useNavigate","nameId","useId","teamId","owned","setName","useState","pickedTeamId","setPickedTeamId","selectedTeamId","setError","isSubmitting","setIsSubmitting","submit","invalid","path","jsxs","event","jsx","Label","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Alert","AlertDescription","Button","Loader2"],"mappings":"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","file":"chunk-C3OHXPJV.js","sourcesContent":["import type { ProjectSummary, ProjectUiConfig } from '../../core/config/types';\n\n/** Name of a project: the listed name, else the deployed schema title, else the id. */\nexport function getProjectLabel(\n projectId: string,\n projects: ProjectUiConfig[],\n projectSummaries: ProjectSummary[] = []\n): string {\n return (\n projectSummaries.find((project) => project.id === projectId)?.name ??\n projects.find((project) => project.projectId === projectId)?.title ??\n projectId\n );\n}\n\n/** Groups ids by team when the summaries span more than one team; otherwise a single unnamed group. */\nexport function groupProjectIdsByTeam(\n projectIds: string[],\n projectSummaries: ProjectSummary[]\n): { label: string | null; projectIds: string[] }[] {\n const teams = new Map<string, { label: string; projectIds: string[] }>();\n\n for (const id of projectIds) {\n const summary = projectSummaries.find((project) => project.id === id);\n const key = summary?.team.id ?? '';\n const group = teams.get(key) ?? { label: summary?.team.name ?? '', projectIds: [] };\n group.projectIds.push(id);\n teams.set(key, group);\n }\n\n if (teams.size <= 1) {\n return [{ label: null, projectIds }];\n }\n\n return [...teams.values()].map((group) => ({ label: group.label || null, projectIds: group.projectIds }));\n}\n","import { userApiPaths } from '../api-paths';\nimport type { HostedTeam } from './types';\n\n/** What `POST /api/me/projects` answers: the new project and the team it went to (possibly a new personal team). */\nexport type CreatedProject = { project: { id: string; name: string }; team: { id: string; name: string } };\n\nexport type CreateProjectOutcome = ({ ok: true } & CreatedProject) | { ok: false; code: string; message: string };\n\nconst FALLBACK_MESSAGE = 'Could not create the project. Please try again.';\n\n/** Hosted mode: creates a project for the signed-in user (Free plan, user as owner). */\nexport async function createHostedProject(input: { name: string; teamId?: string }): Promise<CreateProjectOutcome> {\n try {\n const response = await fetch(userApiPaths.myProjects, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n const body = (await response.json().catch(() => ({}))) as {\n code?: string;\n error?: string;\n project?: { id: string; name: string };\n team?: { id: string; name: string };\n };\n\n if (response.ok && body.project?.id && body.team?.id) {\n return { ok: true, project: body.project, team: body.team };\n }\n\n return { ok: false, code: body.code ?? 'unknown_error', message: body.error ?? FALLBACK_MESSAGE };\n } catch {\n return {\n ok: false,\n code: 'network_error',\n message: 'Flexkit is not reachable. Check your connection and try again.',\n };\n }\n}\n\n/** Teams the user may create projects in, in the order `/api/me` lists them (oldest first). */\nexport function ownedTeams(teams: HostedTeam[]): HostedTeam[] {\n return teams.filter((team) => team.role === 'owner');\n}\n\n/** Where a new project opens: the AI chat, which can design its schema. */\nexport function newProjectPath(projectId: string): string {\n return `/${projectId}/ai`;\n}\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { userApiPaths } from '../api-paths';\nimport type { CreatedProject } from './create-project';\nimport type { HostedTeam, HostedUser, ProjectSummary } from './types';\n\nexport type HostedSession =\n | { status: 'loading' }\n | { status: 'anonymous' }\n | { status: 'error'; message: string }\n | { status: 'ready'; user: HostedUser; projects: ProjectSummary[]; teams: HostedTeam[] };\n\n/** `teams` is missing from backends older than Studio onboarding. */\ntype MeResponse = { projects: ProjectSummary[]; teams?: HostedTeam[]; user: HostedUser };\n\nconst SESSION_KEY = 'hosted-session';\nexport type MeOutcome =\n | { kind: 'anonymous' }\n | { kind: 'error'; message: string }\n | { kind: 'ready'; data: MeResponse };\n\nasync function fetchMe(): Promise<MeOutcome> {\n try {\n const response = await fetch(userApiPaths.me, { credentials: 'same-origin' });\n\n if (response.status === 401) {\n return { kind: 'anonymous' };\n }\n\n if (!response.ok) {\n return { kind: 'error', message: `Flexkit answered ${String(response.status)} while loading your projects.` };\n }\n\n return { kind: 'ready', data: (await response.json()) as MeResponse };\n } catch (error) {\n return { kind: 'error', message: error instanceof Error ? error.message : 'Flexkit is not reachable.' };\n }\n}\n\nexport function toHostedSession(outcome: MeOutcome | undefined): HostedSession {\n if (!outcome) {\n return { status: 'loading' };\n }\n\n if (outcome.kind === 'anonymous') {\n return { status: 'anonymous' };\n }\n\n if (outcome.kind === 'error') {\n return { status: 'error', message: outcome.message };\n }\n\n return {\n status: 'ready',\n projects: outcome.data.projects,\n teams: outcome.data.teams ?? [],\n user: outcome.data.user,\n };\n}\n\n/**\n * Hosted mode: who is signed in and which projects they can open. Fetched once\n * per page load; `rememberCreatedProject` adds a project the user just created.\n */\nexport function useHostedSession(): HostedSession {\n const { data } = useSWR(SESSION_KEY, fetchMe, {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n shouldRetryOnError: false,\n });\n\n return toHostedSession(data);\n}\n\n/** The session with a just-created project (and its team, if new) added; the user owns both. */\nexport function withCreatedProject(outcome: MeOutcome | undefined, created: CreatedProject): MeOutcome | undefined {\n if (outcome?.kind !== 'ready' || outcome.data.projects.some((project) => project.id === created.project.id)) {\n return outcome;\n }\n\n const teams = outcome.data.teams ?? [];\n const project: ProjectSummary = {\n avatarUrl: null,\n id: created.project.id,\n name: created.project.name,\n readOnly: false,\n role: 'owner',\n suspended: false,\n team: created.team,\n };\n\n return {\n kind: 'ready',\n data: {\n ...outcome.data,\n projects: [...outcome.data.projects, project],\n teams: teams.some((team) => team.id === created.team.id) ? teams : [...teams, { ...created.team, role: 'owner' }],\n },\n };\n}\n\n/**\n * Adds a project the user just created to the session, so the Studio can open\n * it at once. No `/api/me` round trip: the create response says everything the\n * session needs, and a failed re-read must not hide a project that exists.\n */\nexport async function rememberCreatedProject(created: CreatedProject): Promise<void> {\n await mutate<MeOutcome>(SESSION_KEY, (current) => withCreatedProject(current, created), { revalidate: false });\n}\n","import { useId, useState, type JSX } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Loader2 } from 'lucide-react';\nimport { createHostedProject, newProjectPath, ownedTeams } from '../../core/config/create-project';\nimport type { HostedTeam } from '../../core/config/types';\nimport { rememberCreatedProject } from '../../core/config/use-hosted-session';\nimport { Alert, AlertDescription } from '../primitives/alert';\nimport { Button } from '../primitives/button';\nimport { Input } from '../primitives/input';\nimport { Label } from '../primitives/label';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\n\n/** Only what the field can tell; the backend owns the character rules and says what it refuses. */\nfunction validateName(name: string): string | null {\n const trimmed = name.trim();\n\n if (!trimmed) {\n return 'Give your project a name.';\n }\n\n if (trimmed.length > 48) {\n return 'Project names can be up to 48 characters.';\n }\n\n return null;\n}\n\n/**\n * Hosted mode: name a project and create it. The backend puts it on the Free\n * plan with the user as owner (a user who owns no team gets a personal one),\n * then the Studio opens the new project's AI chat.\n */\nexport function CreateProjectForm({\n autoFocus = false,\n isFirstProject = false,\n onCancel,\n onCreated,\n submitLabel = 'Create project',\n teams,\n}: {\n autoFocus?: boolean;\n /**\n * The user has no project yet, so the Studio shows this form at `/`. Leave\n * `/` before the session lists the project: there, `/` redirects to the\n * project root instead of its AI chat.\n */\n isFirstProject?: boolean;\n onCancel?: () => void;\n /** Called with the new project's id once the Studio opened it. */\n onCreated?: (projectId: string) => void;\n submitLabel?: string;\n teams: HostedTeam[];\n}): JSX.Element {\n const navigate = useNavigate();\n const nameId = useId();\n const teamId = useId();\n const owned = ownedTeams(teams);\n const [name, setName] = useState('');\n const [pickedTeamId, setPickedTeamId] = useState<string | null>(null);\n // Follow the teams prop: a pick that is no longer owned falls back to the first owned team.\n const selectedTeamId = owned.some((team) => team.id === pickedTeamId) ? (pickedTeamId ?? '') : (owned[0]?.id ?? '');\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n async function submit(): Promise<void> {\n const invalid = validateName(name);\n\n if (invalid) {\n setError(invalid);\n\n return;\n }\n\n setError(null);\n setIsSubmitting(true);\n\n // No owned team yet: let the backend create the personal team.\n const outcome = await createHostedProject({\n name: name.trim(),\n ...(selectedTeamId ? { teamId: selectedTeamId } : {}),\n });\n\n if (!outcome.ok) {\n setError(outcome.message);\n setIsSubmitting(false);\n\n return;\n }\n\n const path = newProjectPath(outcome.project.id);\n\n // Inside a project the Studio only opens ids the session lists, so add it first there.\n if (isFirstProject) {\n navigate(path);\n await rememberCreatedProject(outcome);\n } else {\n await rememberCreatedProject(outcome);\n navigate(path);\n }\n\n onCreated?.(outcome.project.id);\n }\n\n return (\n <form\n className=\"fk:flex fk:w-full fk:flex-col fk:gap-4\"\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={nameId}>Project name</Label>\n <Input\n aria-invalid={error ? true : undefined}\n autoComplete=\"off\"\n autoFocus={autoFocus}\n disabled={isSubmitting}\n id={nameId}\n maxLength={48}\n onChange={(event) => {\n setName(event.target.value);\n }}\n placeholder=\"e.g. Aven Living\"\n value={name}\n />\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Usually your store or company name. You can change it later.\n </p>\n </div>\n {owned.length > 1 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={teamId}>Team</Label>\n <Select disabled={isSubmitting} onValueChange={setPickedTeamId} value={selectedTeamId}>\n <SelectTrigger id={teamId}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {owned.map((team) => (\n <SelectItem key={team.id} value={team.id}>\n {team.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:justify-end fk:gap-2\">\n {onCancel ? (\n <Button disabled={isSubmitting} onClick={onCancel} type=\"button\" variant=\"outline\">\n Cancel\n </Button>\n ) : null}\n <Button className={onCancel ? undefined : 'fk:w-full'} disabled={isSubmitting} type=\"submit\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import'./index.css';import {e,d,a as a$2,c,b as b$1}from'./chunk-XV7U33XQ.js';import {a}from'./chunk-YDVO6XWD.js';import {a as a$1}from'./chunk-ERDARDGB.js';import {b,c as c$1}from'./chunk-HZOD2HOF.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 Wt=25,mn=3,Kt=3,hn=["id","string"],$n=["date","datetime","duration","time"],$t=`_id
1
+ import'./index.css';import {e,d,a as a$2,c,b as b$1}from'./chunk-YKM3FUGK.js';import {a}from'./chunk-YDVO6XWD.js';import {a as a$1}from'./chunk-ERDARDGB.js';import {b,c as c$1}from'./chunk-6I7D2JBA.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 Wt=25,mn=3,Kt=3,hn=["id","string"],$n=["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 et=t=>t.charAt(0).toUpperCase()+t.slice(1);function x(t){let n=t.split(/[^0-9A-Za-z]+/).filter(Boolean).map(et).join("");return n?/^[A-Za-z_]/.test(n)?n:`Entity${n}`:"Entity"}function D(t,n){return n==="_assets"?b:find(propEq(n,"plural"))(t)}function re(t,n,e){if(!t||typeof t!="object")return {};let r=D(e,n);if(!r)return {};let i=`update${et(n)}`,s=t[i];if(!s||typeof s!="object")return {};let o=s[n],l=Array.isArray(o)?o[0]:void 0;return !l||typeof l!="object"?{}:r.attributes.reduce((c,u)=>{if(a(u)!=="local")return c;let d=B(l[u.name])?._id;return typeof d!="string"||d.length===0?c:{...c,[u.name]:d}},{})}var dt=null,_t=new Set,rn=[],Rt=new Set,It=new Set,wt=new Set;function ue(t,n){if(t==="_asset"||t==="_assets")return `Get${x(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${x(i)}`}function sn(t){return Rt.add(t),()=>{Rt.delete(t);}}function on(t){return It.add(t),()=>{It.delete(t);}}function un(t){return wt.add(t),()=>{wt.delete(t);}}function le(t,n,e){let r=new Set(e.filter(Boolean));if(r.size>0)for(let i of It)i(n,r);return Dn(t,n)}function ce(t,n){let e=n.filter(r=>!!r._id);if(e.length!==0)for(let r of wt)r(t,e);}function Dn(t,n){return _t.add(n),new Promise((e,r)=>{rn.push({resolve:e,reject:r}),dt&&clearTimeout(dt),dt=setTimeout(()=>{let i=new Set(_t),s=rn.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:l}of s)l(o);});},50);})}function Ae({entityNamePlural:t,schema:n,scope:e$1,variables:r,isForm:i,selection:s="full",includeCount:o=true,fetchPolicy:l}){let[c$1,u]=useState({count:0,results:[]}),[a,d$1]=useState(false),[f,p]=useState(false),[m,h]=useState(null),A=useRef(false),g=useRef(false),y=useRef(0),E=useRef(null),C=useRef(null),F=`${t}Total`,b=D(n,t),V=r?.where===void 0&&(b?.spaces?.length??0)===0&&(m?.field!==F||m.schema!==n)?"total":"aggregate",J=useMemo(()=>gql(at(t,e$1,n,{selection:s,countMode:V,includeCount:o}).query),[t,e$1,n,s,V,o]),$=useMemo(()=>gql(at(t,e$1,n,{selection:s,includeCount:false}).query),[t,e$1,n,s]),{schemaErrorMessage:R,setSchemaErrorMessage:k}=e(),{loading:H,data:v,fetchMore:st,refetch:ot,error:Lt,networkStatus:Y}=useQuery(J,{variables:r,notifyOnNetworkStatusChange:true,fetchPolicy:l}),Ft=useRef(st),gt=useRef(ot),Ct=useRef($),Tt=useRef(Y),Mt=useRef(r);Ft.current=st,gt.current=ot,Ct.current=$,Mt.current=r;let yt=o&&d(Lt,F),Qt=V==="total"&&yt,G=yt?void 0:Lt,N=yt&&!v?.[t],qt=a$2(G),P=c(G),{isProjectDisabled:dn,isProjectReadOnly:fn}=(()=>{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(()=>{Qt&&h({field:F,schema:n});},[n,Qt,F]);let pn=useCallback(I=>{if(A.current||g.current)return;A.current=true,d$1(true);let{limit:Q}=I.variables,q=y.current;Ft.current({...I,query:Ct.current,variables:{...Mt.current,...I.variables,offset:q,limit:Q}}).then(({data:X})=>{let M=it({data:X,entityNamePlural:t,isForm:i,schema:n,scope:e$1}),j=M.results.length;y.current=q+(j===0?0:Math.min(j,Q)),u(T=>{let W=uniqBy(prop("_id"),[...T.results,...M.results]);return W.length===T.results.length?{count:T.results.length,results:T.results}:{count:M.count||T.count,results:W}});}).catch(X=>{console.error("Error fetching more data:",X);}).finally(()=>{A.current=false,d$1(false);});},[t,i,n,e$1]),gn=useCallback(I=>{if(g.current)return Promise.resolve();let Q=I?.preserve===true;return g.current=true,A.current=false,d$1(false),Q||(E.current=null,C.current=null,y.current=0,p(true),u({count:0,results:[]})),gt.current().then(({data:q})=>{let X=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),M=it({data:q,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=X,C.current=null,y.current=pt(r)+M.results.length,u(M);}).catch(q=>{console.error("Error reloading data:",q);}).finally(()=>{g.current=false,p(false);})},[t,i,n,e$1,s,o,r]);return useEffect(()=>{if(P){k(P);return}v&&R&&!G&&k(null);},[v,G,R,P,k]),useEffect(()=>{if(G||P||N)return;let I=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r});if(E.current===I)return;if(H&&C.current!==I){C.current=I,y.current=0,u({count:0,results:[]});return}if(H)return;let Q=it({data:v,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=I,C.current=null,y.current=pt(r)+Q.results.length,u(Q);},[v,G,t,i,H,N,n,P,e$1,s,o,r]),useEffect(()=>{let I=Tt.current;if(Tt.current=Y,G||P||g.current||N||I!==NetworkStatus.refetch||Y!==NetworkStatus.ready||!v)return;let Q=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),q=it({data:v,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=Q,C.current=null,y.current=pt(r)+q.results.length,u(q);},[v,G,t,i,N,Y,n,P,e$1,s,o,r]),useEffect(()=>{if(i)return;let I=`Get${x(t)}`,Q=sn(M=>{if(!(!M.has(I)||A.current||g.current))return gt.current().then(({data:j})=>{let T=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),W=it({data:j,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=T,C.current=null,y.current=pt(r)+W.results.length,u(W);}).catch(j=>{console.error("Error soft-refreshing entity list:",j);})}),q=on((M,j)=>{M===I&&u(T=>{let W=T.results.filter(kt=>{let vt=typeof kt._id=="string"?kt._id:void 0;return !vt||!j.has(vt)}),xt=T.results.length-W.length;return xt===0?T:{count:Math.max(0,T.count-xt),results:W}});}),X=un((M,j)=>{M===I&&u(T=>zn(T,j,r?.sort));});return ()=>{Q(),q(),X();}},[t,i,n,e$1,s,o,r]),{isLoading:H&&Y!==NetworkStatus.refetch||f||N,isLoadingMore:a,fetchMore:pn,reload:gn,count:c$1.count,data:c$1.results,isProjectDisabled:dn,isProjectReadOnly:fn,schemaErrorMessage:R}}function pt(t){let n=t?.offset;return typeof n=="number"&&Number.isFinite(n)?n:0}function it(t){let n=t.entityNamePlural;return t.data?.[n]?t.isForm?Yt(t.entityNamePlural,t.scope,t.data,t.schema):Ht(t.entityNamePlural,t.scope,t.data,t.schema):{count:0,results:[]}}function zn(t,n,e){let r=new Map(n.map(o=>[o._id,o])),i=false,s=t.results.map(o=>{let l=typeof o._id=="string"?o._id:void 0;if(!l)return o;let c=r.get(l);return c?(i=true,{...o,...c.attributes}):o});return i?{count:t.count,results:Gn(s,e)}:t}function Gn(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((l,c)=>{let u=l[i],a=c[i],d=typeof u=="string"?u:"",f=typeof a=="string"?a:"";return d.localeCompare(f)*o})}export{Wt as a,Jt as b,En as c,Zn as d,at as e,Ht as f,Hn as g,Yn as h,Nn as i,te as j,ne as k,ee as l,D as m,re as n,ue as o,le as p,ce as q,Dn as r,Ae as s};//# sourceMappingURL=chunk-KR27GOH6.js.map
378
- //# sourceMappingURL=chunk-KR27GOH6.js.map
377
+ `}}var et=t=>t.charAt(0).toUpperCase()+t.slice(1);function x(t){let n=t.split(/[^0-9A-Za-z]+/).filter(Boolean).map(et).join("");return n?/^[A-Za-z_]/.test(n)?n:`Entity${n}`:"Entity"}function D(t,n){return n==="_assets"?b:find(propEq(n,"plural"))(t)}function re(t,n,e){if(!t||typeof t!="object")return {};let r=D(e,n);if(!r)return {};let i=`update${et(n)}`,s=t[i];if(!s||typeof s!="object")return {};let o=s[n],l=Array.isArray(o)?o[0]:void 0;return !l||typeof l!="object"?{}:r.attributes.reduce((c,u)=>{if(a(u)!=="local")return c;let d=B(l[u.name])?._id;return typeof d!="string"||d.length===0?c:{...c,[u.name]:d}},{})}var dt=null,_t=new Set,rn=[],Rt=new Set,It=new Set,wt=new Set;function ue(t,n){if(t==="_asset"||t==="_assets")return `Get${x(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${x(i)}`}function sn(t){return Rt.add(t),()=>{Rt.delete(t);}}function on(t){return It.add(t),()=>{It.delete(t);}}function un(t){return wt.add(t),()=>{wt.delete(t);}}function le(t,n,e){let r=new Set(e.filter(Boolean));if(r.size>0)for(let i of It)i(n,r);return Dn(t,n)}function ce(t,n){let e=n.filter(r=>!!r._id);if(e.length!==0)for(let r of wt)r(t,e);}function Dn(t,n){return _t.add(n),new Promise((e,r)=>{rn.push({resolve:e,reject:r}),dt&&clearTimeout(dt),dt=setTimeout(()=>{let i=new Set(_t),s=rn.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:l}of s)l(o);});},50);})}function Ae({entityNamePlural:t,schema:n,scope:e$1,variables:r,isForm:i,selection:s="full",includeCount:o=true,fetchPolicy:l}){let[c$1,u]=useState({count:0,results:[]}),[a,d$1]=useState(false),[f,p]=useState(false),[m,h]=useState(null),A=useRef(false),g=useRef(false),y=useRef(0),E=useRef(null),C=useRef(null),F=`${t}Total`,b=D(n,t),V=r?.where===void 0&&(b?.spaces?.length??0)===0&&(m?.field!==F||m.schema!==n)?"total":"aggregate",J=useMemo(()=>gql(at(t,e$1,n,{selection:s,countMode:V,includeCount:o}).query),[t,e$1,n,s,V,o]),$=useMemo(()=>gql(at(t,e$1,n,{selection:s,includeCount:false}).query),[t,e$1,n,s]),{schemaErrorMessage:R,setSchemaErrorMessage:k}=e(),{loading:H,data:v,fetchMore:st,refetch:ot,error:Lt,networkStatus:Y}=useQuery(J,{variables:r,notifyOnNetworkStatusChange:true,fetchPolicy:l}),Ft=useRef(st),gt=useRef(ot),Ct=useRef($),Tt=useRef(Y),Mt=useRef(r);Ft.current=st,gt.current=ot,Ct.current=$,Mt.current=r;let yt=o&&d(Lt,F),Qt=V==="total"&&yt,G=yt?void 0:Lt,N=yt&&!v?.[t],qt=a$2(G),P=c(G),{isProjectDisabled:dn,isProjectReadOnly:fn}=(()=>{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(()=>{Qt&&h({field:F,schema:n});},[n,Qt,F]);let pn=useCallback(I=>{if(A.current||g.current)return;A.current=true,d$1(true);let{limit:Q}=I.variables,q=y.current;Ft.current({...I,query:Ct.current,variables:{...Mt.current,...I.variables,offset:q,limit:Q}}).then(({data:X})=>{let M=it({data:X,entityNamePlural:t,isForm:i,schema:n,scope:e$1}),j=M.results.length;y.current=q+(j===0?0:Math.min(j,Q)),u(T=>{let W=uniqBy(prop("_id"),[...T.results,...M.results]);return W.length===T.results.length?{count:T.results.length,results:T.results}:{count:M.count||T.count,results:W}});}).catch(X=>{console.error("Error fetching more data:",X);}).finally(()=>{A.current=false,d$1(false);});},[t,i,n,e$1]),gn=useCallback(I=>{if(g.current)return Promise.resolve();let Q=I?.preserve===true;return g.current=true,A.current=false,d$1(false),Q||(E.current=null,C.current=null,y.current=0,p(true),u({count:0,results:[]})),gt.current().then(({data:q})=>{let X=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),M=it({data:q,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=X,C.current=null,y.current=pt(r)+M.results.length,u(M);}).catch(q=>{console.error("Error reloading data:",q);}).finally(()=>{g.current=false,p(false);})},[t,i,n,e$1,s,o,r]);return useEffect(()=>{if(P){k(P);return}v&&R&&!G&&k(null);},[v,G,R,P,k]),useEffect(()=>{if(G||P||N)return;let I=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r});if(E.current===I)return;if(H&&C.current!==I){C.current=I,y.current=0,u({count:0,results:[]});return}if(H)return;let Q=it({data:v,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=I,C.current=null,y.current=pt(r)+Q.results.length,u(Q);},[v,G,t,i,H,N,n,P,e$1,s,o,r]),useEffect(()=>{let I=Tt.current;if(Tt.current=Y,G||P||g.current||N||I!==NetworkStatus.refetch||Y!==NetworkStatus.ready||!v)return;let Q=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),q=it({data:v,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=Q,C.current=null,y.current=pt(r)+q.results.length,u(q);},[v,G,t,i,N,Y,n,P,e$1,s,o,r]),useEffect(()=>{if(i)return;let I=`Get${x(t)}`,Q=sn(M=>{if(!(!M.has(I)||A.current||g.current))return gt.current().then(({data:j})=>{let T=JSON.stringify({entityNamePlural:t,scope:e$1,selection:s,includeCount:o,variables:r}),W=it({data:j,entityNamePlural:t,isForm:i,schema:n,scope:e$1});E.current=T,C.current=null,y.current=pt(r)+W.results.length,u(W);}).catch(j=>{console.error("Error soft-refreshing entity list:",j);})}),q=on((M,j)=>{M===I&&u(T=>{let W=T.results.filter(kt=>{let vt=typeof kt._id=="string"?kt._id:void 0;return !vt||!j.has(vt)}),xt=T.results.length-W.length;return xt===0?T:{count:Math.max(0,T.count-xt),results:W}});}),X=un((M,j)=>{M===I&&u(T=>zn(T,j,r?.sort));});return ()=>{Q(),q(),X();}},[t,i,n,e$1,s,o,r]),{isLoading:H&&Y!==NetworkStatus.refetch||f||N,isLoadingMore:a,fetchMore:pn,reload:gn,count:c$1.count,data:c$1.results,isProjectDisabled:dn,isProjectReadOnly:fn,schemaErrorMessage:R}}function pt(t){let n=t?.offset;return typeof n=="number"&&Number.isFinite(n)?n:0}function it(t){let n=t.entityNamePlural;return t.data?.[n]?t.isForm?Yt(t.entityNamePlural,t.scope,t.data,t.schema):Ht(t.entityNamePlural,t.scope,t.data,t.schema):{count:0,results:[]}}function zn(t,n,e){let r=new Map(n.map(o=>[o._id,o])),i=false,s=t.results.map(o=>{let l=typeof o._id=="string"?o._id:void 0;if(!l)return o;let c=r.get(l);return c?(i=true,{...o,...c.attributes}):o});return i?{count:t.count,results:Gn(s,e)}:t}function Gn(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((l,c)=>{let u=l[i],a=c[i],d=typeof u=="string"?u:"",f=typeof a=="string"?a:"";return d.localeCompare(f)*o})}export{Wt as a,Jt as b,En as c,Zn as d,at as e,Ht as f,Hn as g,Yn as h,Nn as i,te as j,ne as k,ee as l,D as m,re as n,ue as o,le as p,ce as q,Dn as r,Ae as s};//# sourceMappingURL=chunk-CFYO546Y.js.map
378
+ //# sourceMappingURL=chunk-CFYO546Y.js.map