vibe64 0.1.39 → 0.1.41

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 (262) hide show
  1. package/bin/run.js +1955 -1855
  2. package/bin/server.js +136 -112
  3. package/bin/upgrade-state.js +5514 -5343
  4. package/dist/assets/GithubBrowserTabs-YvIe2BdE.js +1 -0
  5. package/dist/assets/LocalDatabaseServer-BWAvRlUl.css +1 -0
  6. package/dist/assets/LocalDatabaseServer-CVsGChHh.js +2 -0
  7. package/dist/assets/StudioErrorNotice-C_jbvp9V.js +1 -0
  8. package/dist/assets/VAlert-gwuhYlYb.js +1 -0
  9. package/dist/assets/VAutocomplete-D7Vk5wq_.js +1 -0
  10. package/dist/assets/VAvatar-DvRBcmqv.js +1 -0
  11. package/dist/assets/VBtn-BhVEwXLX.js +1 -0
  12. package/dist/assets/VCard-C3Hx769y.js +1 -0
  13. package/dist/assets/VCheckbox-DyCGSN0H.js +1 -0
  14. package/dist/assets/VCheckboxBtn-DCyuVH7W.css +1 -0
  15. package/dist/assets/VCheckboxBtn-DYcQU2Pn.js +1 -0
  16. package/dist/assets/VChip-VVdtjfq-.js +1 -0
  17. package/dist/assets/VDialog-CQDhjRiV.js +1 -0
  18. package/dist/assets/VDivider-Dq25WsKu.js +1 -0
  19. package/dist/assets/VExpansionPanels-C1y-myl5.js +1 -0
  20. package/dist/assets/VMenu-CDcBLYWR.js +1 -0
  21. package/dist/assets/VOverlay-Cp4rFk6g.js +1 -0
  22. package/dist/assets/VRadioGroup-CAjNZwF7.js +1 -0
  23. package/dist/assets/VRow-BskP28jR.js +1 -0
  24. package/dist/assets/VSelect-D3oLvCcB.js +2 -0
  25. package/dist/assets/VSheet-DxYEFfnM.js +1 -0
  26. package/dist/assets/VSkeletonLoader-Cync3lZZ.js +1 -0
  27. package/dist/assets/VSpacer-CgWOWvBh.js +1 -0
  28. package/dist/assets/VSwitch-BxGuGypi.js +1 -0
  29. package/dist/assets/VTextField-C0b_0cSa.js +1 -0
  30. package/dist/assets/VTextField-F6unyhrS.css +1 -0
  31. package/dist/assets/VTextarea-B7sZd1JY.js +1 -0
  32. package/dist/assets/{Vibe64AsyncModuleState-Do9EqX3S.js → Vibe64AsyncModuleState-syuPcpGx.js} +1 -1
  33. package/dist/assets/{Vibe64AuthSettingsButton-M44SSmZ9.css → Vibe64AuthSettingsButton-D2lltUhi.css} +1 -1
  34. package/dist/assets/Vibe64AuthSettingsButton-DLdfT68V.js +5 -0
  35. package/dist/assets/Vibe64CopyCommand-CYiZcy0d.js +1 -0
  36. package/dist/assets/Vibe64CopyCommand-ClbQLYZi.css +1 -0
  37. package/dist/assets/{Vibe64DashboardBackButton-BH_8j_VR.js → Vibe64DashboardBackButton-Go_MJuIK.js} +1 -1
  38. package/dist/assets/{Vibe64DashboardPageHeader-BXQR00HK.js → Vibe64DashboardPageHeader-BMrdRph6.js} +1 -1
  39. package/dist/assets/Vibe64DashboardPageHeader-CdlzsyKQ.css +1 -0
  40. package/dist/assets/Vibe64DashboardShell-DMPz6fIx.js +1 -0
  41. package/dist/assets/{Vibe64DatabaseWorkspace-CEml9BWn.js → Vibe64DatabaseWorkspace-BCEIOlSg.js} +3 -3
  42. package/dist/assets/{Vibe64DatabaseWorkspace-DPDMxhAW.css → Vibe64DatabaseWorkspace-DePBDUMy.css} +1 -1
  43. package/dist/assets/{Vibe64OutputControls-Co5YzwcK.css → Vibe64OutputControls-CeBzZPUT.css} +1 -1
  44. package/dist/assets/Vibe64OutputControls-DMoqL0VD.js +8 -0
  45. package/dist/assets/{Vibe64RepositoryWorkspace-obZFXkoG.js → Vibe64RepositoryWorkspace-BdwRwbxp.js} +2 -2
  46. package/dist/assets/{Vibe64RepositoryWorkspace-Agyt4O-V.css → Vibe64RepositoryWorkspace-Bw9W691N.css} +1 -1
  47. package/dist/assets/{Vibe64SessionFiles-CQzs6fee.js → Vibe64SessionFiles-ChJWUOqm.js} +4 -4
  48. package/dist/assets/Vibe64SessionFiles-DsPb8hOe.css +1 -0
  49. package/dist/assets/{Vibe64TemporaryAiFixAction-BiuIE9mC.js → Vibe64TemporaryAiFixAction-CIePbdW8.js} +1 -1
  50. package/dist/assets/{Vibe64UiStoryboardView-BhKRpL0N.js → Vibe64UiStoryboardView-Bp9STItF.js} +1 -1
  51. package/dist/assets/{Vibe64UnavailableSessions-Ca5nC7KH.js → Vibe64UnavailableSessions-JBgHzM-j.js} +1 -1
  52. package/dist/assets/{_sessionId_-CKkGH3Rx.js → _sessionId_-Bw0KfJeR.js} +1 -1
  53. package/dist/assets/{_sessionTool_-1V-z6Pbp.js → _sessionTool_-BV1AwpUx.js} +1 -1
  54. package/dist/assets/_slug_-CAmuBm-M.css +1 -0
  55. package/dist/assets/_slug_-q9prK_gX.js +25 -0
  56. package/dist/assets/{access-WlhPvPgy.js → access-C05Nkq6r.js} +1 -1
  57. package/dist/assets/app-D1CGY9Xm.js +1 -0
  58. package/dist/assets/assistantRouting-DeE8jvtE.js +3 -0
  59. package/dist/assets/{changes-CHJjrZAc.js → changes-D17XpgGz.js} +1 -1
  60. package/dist/assets/client-BxGiylrJ.js +2 -0
  61. package/dist/assets/client-C8jwAMY9.css +1 -0
  62. package/dist/assets/{conversation-B90ERX9h.js → conversation-DZW4-Wck.js} +2 -2
  63. package/dist/assets/{conversation-vxJGwmtW.css → conversation-TK6EmDk4.css} +1 -1
  64. package/dist/assets/{createSimpleFunctional-CZTGuNuR.js → createSimpleFunctional-zlXZooQW.js} +1 -1
  65. package/dist/assets/{dashboard-CuutW8iv.js → dashboard-BXXgeQ0Q.js} +1 -1
  66. package/dist/assets/definitions-SNvFDEFS.js +1 -0
  67. package/dist/assets/dialog-transition-D2vqGksQ.js +1 -0
  68. package/dist/assets/env-B5V1EC4M.css +1 -0
  69. package/dist/assets/env-sXAQqKWk.js +1 -0
  70. package/dist/assets/health-92hh8xXh.css +1 -0
  71. package/dist/assets/health-Cr34pf2p.js +1 -0
  72. package/dist/assets/{history-1_NU8azF.js → history-N1iRZaab.js} +1 -1
  73. package/dist/assets/incoming-Bdqo8z25.css +1 -0
  74. package/dist/assets/incoming-CNwZa_yD.js +2 -0
  75. package/dist/assets/{index-irlMYzLh.css → index-B17d4wpZ.css} +1 -1
  76. package/dist/assets/index-Mxalhei8.js +138 -0
  77. package/dist/assets/{integrations-BMzWQQpa.js → integrations-BmwFvHgZ.js} +10 -10
  78. package/dist/assets/integrations-Co8WvCiD.css +1 -0
  79. package/dist/assets/issues-BbiG7dCV.js +1 -0
  80. package/dist/assets/layout-B2Ap07aa.js +1 -0
  81. package/dist/assets/{lazy-NHSwD9FS.js → lazy-BjyT2XvW.js} +1 -1
  82. package/dist/assets/{learning-Bdi3XRS7.js → learning-CUCuuoHM.js} +1 -1
  83. package/dist/assets/mdi-Bt90Ns76.js +1 -0
  84. package/dist/assets/placement-CQy46H3H.js +1 -0
  85. package/dist/assets/publish-4r_4K5IY.js +3 -0
  86. package/dist/assets/publish-BFTsAMCF.css +1 -0
  87. package/dist/assets/pull-requests-BjwokcU0.css +1 -0
  88. package/dist/assets/pull-requests-DY9jg3cE.js +1 -0
  89. package/dist/assets/{repository-BL_2bgzC.js → repository-DhXdoMP6.js} +1 -1
  90. package/dist/assets/ripple-EFNA8EBu.js +11 -0
  91. package/dist/assets/rolldown-runtime-DBalRfVu.js +1 -0
  92. package/dist/assets/{session-BdhKrcX4.js → session-BGpiZThC.js} +1 -1
  93. package/dist/assets/{settings-1rpuL7eR.js → settings-Cj4u-76p.js} +1 -1
  94. package/dist/assets/settings-D8x4KUqV.css +1 -0
  95. package/dist/assets/shared-DZETtWRH.js +2 -0
  96. package/dist/assets/studioGateApi-BXHVBVEc.js +1 -0
  97. package/dist/assets/studioUrls-DpSS-0z1.js +1 -0
  98. package/dist/assets/useArchivedVibe64Sessions-BXNg8oES.js +1 -0
  99. package/dist/assets/useCommand-nWFczmJy.js +1 -0
  100. package/dist/assets/useEndpointResource-Ds8EDBZ2.js +1 -0
  101. package/dist/assets/useRealtimeEvent-DrOiU8lJ.js +1 -0
  102. package/dist/assets/{useUiFeedback-BPBF_0bp.js → useUiFeedback-CMwE4MLs.js} +1 -1
  103. package/dist/assets/useVibe64ConversationLog-C1xjhFtS.js +1 -0
  104. package/dist/assets/{useVibe64DatabaseTools-4o6S8eXq.js → useVibe64DatabaseTools-H6H-YJQX.js} +1 -1
  105. package/dist/assets/useVibe64ProjectScope-B5ogg6jd.js +1 -0
  106. package/dist/assets/useVibe64SessionData-CnDOFFHb.js +1 -0
  107. package/dist/assets/{useVibe64SessionSelection-BzL1y_Vq.js → useVibe64SessionSelection-J87nJ9p5.js} +1 -1
  108. package/dist/assets/{useVibe64SystemGraph-B4RmsC9Y.js → useVibe64SystemGraph-DbSfrYF8.js} +1 -1
  109. package/dist/assets/{useVibe64Terminal-Cg3idMcy.js → useVibe64Terminal-I7Sf6xMW.js} +1 -1
  110. package/dist/assets/vibe64ProjectScope.local-B06ABkhI.js +1 -0
  111. package/dist/assets/vibe64SavedEnvValues-B_QE9aAj.js +1 -0
  112. package/dist/assets/vibe64SessionFocus-CA-sk8Ri.css +1 -0
  113. package/dist/assets/vibe64SessionFocus-DlN8NwcE.js +1 -0
  114. package/dist/assets/{vibe64SessionInfo-BuBUdL-e.js → vibe64SessionInfo-B0uItVOK.js} +1 -1
  115. package/dist/assets/{vibe64SessionToolDefinitions-BJaJH5LR.js → vibe64SessionToolDefinitions-Dsn8WYmO.js} +1 -1
  116. package/dist/index.html +56 -46
  117. package/docs/colleague-usage/account-profile-and-appearance.md +1 -1
  118. package/docs/colleague-usage/{ai-accounts-and-routing.md → ai-accounts.md} +41 -114
  119. package/docs/colleague-usage/ai-model-setups.md +159 -0
  120. package/docs/colleague-usage/ai-onboarding.md +97 -22
  121. package/docs/colleague-usage/ai-personal-use.md +41 -0
  122. package/docs/colleague-usage/auto-workflow.md +8 -3
  123. package/docs/colleague-usage/codex-context-recovery.md +2 -1
  124. package/docs/colleague-usage/coding-agent-goals.md +7 -4
  125. package/docs/colleague-usage/coding-agents.md +8 -5
  126. package/docs/colleague-usage/colleague-watches.md +15 -4
  127. package/docs/colleague-usage/colleague.md +21 -5
  128. package/docs/colleague-usage/connected-contributions.md +13 -13
  129. package/docs/colleague-usage/connected-projects.md +2 -2
  130. package/docs/colleague-usage/conversation-context.md +1 -1
  131. package/docs/colleague-usage/dashboard-navigation.md +5 -3
  132. package/docs/colleague-usage/development-env.md +21 -4
  133. package/docs/colleague-usage/file-interfaces.md +1 -1
  134. package/docs/colleague-usage/github-work.md +8 -8
  135. package/docs/colleague-usage/health-checks.md +52 -18
  136. package/docs/colleague-usage/incoming-changes.md +3 -3
  137. package/docs/colleague-usage/integrations.md +5 -3
  138. package/docs/colleague-usage/learning-course-catalogue.md +3 -3
  139. package/docs/colleague-usage/learning-environment.md +78 -56
  140. package/docs/colleague-usage/learning-mode-ui.md +31 -19
  141. package/docs/colleague-usage/learning-practice-projects.md +15 -4
  142. package/docs/colleague-usage/learning-teacher-guide.md +10 -4
  143. package/docs/colleague-usage/learning-with-colleague.md +12 -8
  144. package/docs/colleague-usage/lesson-authoring.md +13 -13
  145. package/docs/colleague-usage/lesson-step-bar.md +47 -33
  146. package/docs/colleague-usage/main-chat-approvals.md +150 -0
  147. package/docs/colleague-usage/preview-browser-checks.md +5 -1
  148. package/docs/colleague-usage/preview-starting-application.md +10 -1
  149. package/docs/colleague-usage/project-language-tools.md +16 -2
  150. package/docs/colleague-usage/project-settings.md +1 -1
  151. package/docs/colleague-usage/project-setup.md +17 -7
  152. package/docs/colleague-usage/publishing.md +187 -0
  153. package/docs/colleague-usage/running-vibe64-on-your-computer.md +54 -6
  154. package/docs/colleague-usage/sessions.md +18 -10
  155. package/docs/colleague-usage/set-up-linux.md +254 -0
  156. package/docs/colleague-usage/set-up-macos.md +199 -0
  157. package/docs/colleague-usage/set-up-windows.md +76 -0
  158. package/docs/colleague-usage/starter-apps.md +23 -6
  159. package/docs/colleague-usage/teaching-content.md +2 -2
  160. package/docs/colleague-usage/team-ai-access.md +108 -0
  161. package/docs/colleague-usage/temporary-chats.md +9 -7
  162. package/docs/colleague-usage/workspace-preparation.md +50 -1
  163. package/docs/templates/learn-topic/README.md +3 -3
  164. package/docs/templates/learn-topic/training/lessons/TOPIC-01/lesson.json +2 -1
  165. package/docs/training-content.md +37 -15
  166. package/node_modules/@jskit-ai/assistant-core/package.json +1 -1
  167. package/node_modules/@jskit-ai/assistant-runtime/package.json +1 -1
  168. package/node_modules/@jskit-ai/assistant-voice/package.json +1 -1
  169. package/node_modules/@jskit-ai/connector-google-calendar/package.json +1 -1
  170. package/node_modules/@jskit-ai/connectors-catalog/package.json +1 -1
  171. package/node_modules/@jskit-ai/connectors-catalog/patterns/oauth-connection/PATTERN.md +25 -0
  172. package/node_modules/@jskit-ai/connectors-core/package.json +1 -1
  173. package/node_modules/@jskit-ai/http-runtime/package.json +1 -1
  174. package/node_modules/@jskit-ai/kernel/package.json +1 -1
  175. package/node_modules/@jskit-ai/realtime/package.json +1 -1
  176. package/node_modules/@jskit-ai/resource-core/package.json +1 -1
  177. package/node_modules/@jskit-ai/resource-crud-core/package.json +1 -1
  178. package/node_modules/@jskit-ai/uploads-runtime/package.json +1 -1
  179. package/node_modules/@local/vibe64-accounts/package.json +2 -1
  180. package/node_modules/@local/vibe64-core/package.json +4 -1
  181. package/node_modules/@local/vibe64-execution/src/host/execHelper.js +82 -81
  182. package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +83 -82
  183. package/node_modules/@local/vibe64-genesis/package.json +1 -0
  184. package/node_modules/@local/vibe64-genesis/src/server/agentSpecs.js +118 -68
  185. package/node_modules/@local/vibe64-genesis/src/server/index.js +536 -449
  186. package/node_modules/@local/vibe64-genesis/src/server/packaging.js +105 -0
  187. package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +144 -145
  188. package/node_modules/@local/vibe64-packaging/package.json +26 -0
  189. package/node_modules/@local/vibe64-packaging/src/server/packers/capacitor/ShellIcons.java +112 -0
  190. package/node_modules/@local/vibe64-project/package.json +3 -1
  191. package/node_modules/@local/vibe64-publishing/package.json +12 -0
  192. package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +7 -7
  193. package/node_modules/@local/vibe64-runtime/src/shared/assistantRoutingScores.json +25 -22
  194. package/node_modules/@local/vibe64-terminals/package.json +2 -1
  195. package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1341 -1300
  196. package/node_modules/@local/vibe64-training/package.json +2 -1
  197. package/package.json +19 -15
  198. package/server.bundle.mjs +43109 -41089
  199. package/dist/assets/GithubBrowserTabs-C2NO5l8g.js +0 -1
  200. package/dist/assets/StudioErrorNotice-CSrUw1QV.js +0 -1
  201. package/dist/assets/VAlert-P256xaE0.js +0 -1
  202. package/dist/assets/VAutocomplete-BDb95qJX.js +0 -1
  203. package/dist/assets/VAvatar-DPzqDH4r.js +0 -1
  204. package/dist/assets/VBtn-B2MBK2DL.js +0 -1
  205. package/dist/assets/VCard-mXy0k4aS.js +0 -1
  206. package/dist/assets/VCheckbox-C7A1ZW4D.js +0 -1
  207. package/dist/assets/VChip-CcI-Oo2J.js +0 -1
  208. package/dist/assets/VDialog-Bu3EfKb1.js +0 -1
  209. package/dist/assets/VDivider-BMEqUoAB.js +0 -1
  210. package/dist/assets/VExpansionPanels-Dgjrop0V.js +0 -1
  211. package/dist/assets/VMenu-C_x18lwb.js +0 -1
  212. package/dist/assets/VOverlay-CeMZurIN.js +0 -1
  213. package/dist/assets/VRadioGroup-CUu2-KIP.js +0 -1
  214. package/dist/assets/VRow-Cpw7OHQV.js +0 -1
  215. package/dist/assets/VSelect-DL3HaA5m.js +0 -2
  216. package/dist/assets/VSheet-DZWsu0kL.js +0 -1
  217. package/dist/assets/VSkeletonLoader-CttxM1tw.js +0 -1
  218. package/dist/assets/VSpacer-Dhmsvk4t.js +0 -1
  219. package/dist/assets/VSwitch-BRHeDJkH.js +0 -1
  220. package/dist/assets/VTextField-BR2eZeFT.js +0 -1
  221. package/dist/assets/VTextField-BiatYyd3.css +0 -1
  222. package/dist/assets/VTextarea-DbqamXJd.js +0 -1
  223. package/dist/assets/Vibe64AuthSettingsButton-fY4ZiIFF.js +0 -5
  224. package/dist/assets/Vibe64DashboardPageHeader-Gm1IvlHx.css +0 -1
  225. package/dist/assets/Vibe64DashboardShell-BSq7uXEW.js +0 -1
  226. package/dist/assets/Vibe64OutputControls-_zhGX9ne.js +0 -8
  227. package/dist/assets/Vibe64SessionFiles-Bl8wJ5Sk.css +0 -1
  228. package/dist/assets/_slug_-BclonbST.js +0 -24
  229. package/dist/assets/_slug_-CZ1bxO9C.css +0 -1
  230. package/dist/assets/app-BNP_n_Tt.js +0 -1
  231. package/dist/assets/assistantRouting-D4XpXcEf.js +0 -3
  232. package/dist/assets/client-BWV84wi2.js +0 -2
  233. package/dist/assets/client-DGrP-2AJ.css +0 -1
  234. package/dist/assets/definitions-BrMvu6yV.js +0 -1
  235. package/dist/assets/env-BzRtyO0w.css +0 -1
  236. package/dist/assets/env-D3KQGvRe.js +0 -1
  237. package/dist/assets/health-BJvooRnJ.css +0 -1
  238. package/dist/assets/health-BhoO1d4h.js +0 -1
  239. package/dist/assets/incoming-DWDrmxyH.css +0 -1
  240. package/dist/assets/incoming-DzADFGqp.js +0 -2
  241. package/dist/assets/index-dNxr4Lg9.js +0 -138
  242. package/dist/assets/integrations-Cq1x-Di9.css +0 -1
  243. package/dist/assets/issues-Bywux4s7.js +0 -1
  244. package/dist/assets/mdi-CG9pWOSj.js +0 -1
  245. package/dist/assets/placement-BF-zIEhA.js +0 -1
  246. package/dist/assets/pull-requests-CdbhyFOv.css +0 -1
  247. package/dist/assets/pull-requests-ncmKT3sS.js +0 -1
  248. package/dist/assets/ripple-BVltMmyV.js +0 -11
  249. package/dist/assets/settings-BopLnpB0.css +0 -1
  250. package/dist/assets/shared-DpMvYJO3.js +0 -2
  251. package/dist/assets/studioGateApi-DcCqiD9V.js +0 -1
  252. package/dist/assets/studioUrls-DmMMIScP.js +0 -1
  253. package/dist/assets/useArchivedVibe64Sessions-_LB2XxEa.js +0 -1
  254. package/dist/assets/useCommand-Bqxb-naz.js +0 -1
  255. package/dist/assets/useEndpointResource-DWoQ2keu.js +0 -1
  256. package/dist/assets/useRealtimeEvent-Bwapstla.js +0 -1
  257. package/dist/assets/useVibe64ConversationLog-BqUI0S5n.js +0 -1
  258. package/dist/assets/useVibe64Learning-DyqXkpLw.js +0 -1
  259. package/dist/assets/useVibe64ProjectScope-Bp1ImZlz.js +0 -1
  260. package/dist/assets/useVibe64SessionData-B686lToN.js +0 -1
  261. package/dist/assets/vibe64SessionFocus-CqZNTvYF.js +0 -1
  262. package/dist/assets/vibe64SessionFocus-OJ2toBd9.css +0 -1
@@ -0,0 +1 @@
1
+ import{r as __exportAll}from"./rolldown-runtime-DBalRfVu.js";import{c as normalizeObject,d as normalizeText,f as normalizeTransactionOutcome,n as isRecord$4,p as normalizeUniqueTextList,r as normalizeArray,t as TRANSACTION_OUTCOMES}from"./normalize-CO2KHj_d.js";import{t as deepFreeze}from"./deepFreeze-BgoYkoTa.js";function splitPathAndHash(path=``){const normalizedPath=String(path||``).trim();const hashIndex=normalizedPath.indexOf(`#`);if(hashIndex<0)return{pathWithoutHash:normalizedPath,hash:``};return{pathWithoutHash:normalizedPath.slice(0,hashIndex),hash:normalizedPath.slice(hashIndex)}}function splitPathQueryAndHash(path=``){const{pathWithoutHash,hash}=splitPathAndHash(path);const queryIndex=pathWithoutHash.indexOf(`?`);if(queryIndex<0)return{pathname:pathWithoutHash,queryString:``,hash};return{pathname:pathWithoutHash.slice(0,queryIndex),queryString:pathWithoutHash.slice(queryIndex+1),hash}}function appendQueryString(path=``,queryString=``){const normalizedPath=String(path||``).trim();if(!normalizedPath)return``;const normalizedQuery=String(queryString||``).trim().replace(/^\?+/,``);if(!normalizedQuery)return normalizedPath;const{pathWithoutHash,hash}=splitPathAndHash(normalizedPath);return`${pathWithoutHash}${pathWithoutHash.includes(`?`)?`&`:`?`}${normalizedQuery}${hash}`}function normalizeFieldErrors(value){const source=isRecord$4(value)?value:{};const normalized={};for(const[field,message]of Object.entries(source)){const normalizedField=String(field||``).trim();if(!normalizedField)continue;normalized[normalizedField]=String(message||``)}return normalized}function resolveFieldErrors(value=null){const source=isRecord$4(value)?value:{};if(isRecord$4(source.fieldErrors))return normalizeFieldErrors(source.fieldErrors);if(isRecord$4(source.details?.fieldErrors))return normalizeFieldErrors(source.details.fieldErrors);return{}}function resolveRelationshipFieldKey(relationshipName=``,lookupFieldMap=null){const normalizedRelationshipName=normalizeText(relationshipName);const explicitFieldKey=normalizeText(lookupFieldMap?.[normalizedRelationshipName]);if(explicitFieldKey)return explicitFieldKey;return normalizedRelationshipName?`${normalizedRelationshipName}Id`:``}function simplifyJsonApiResourceWithRelationshipIds(resource={},{lookupFieldMap=null}={}){const normalizedResource=isRecord$4(resource)?normalizeObject(resource):{};const simplified={id:normalizedResource.id==null?``:String(normalizedResource.id),...normalizeObject(normalizedResource.attributes)};for(const[relationshipName,relationshipValue]of Object.entries(normalizeObject(normalizedResource.relationships))){const relationshipData=relationshipValue?.data;if(Array.isArray(relationshipData))continue;const fieldKey=resolveRelationshipFieldKey(relationshipName,lookupFieldMap);if(!fieldKey||Object.hasOwn(simplified,fieldKey))continue;simplified[fieldKey]=relationshipData?.id==null?null:String(relationshipData.id)}return simplified}var JSON_API_CONTENT_TYPE=`application/vnd.api+json`;function isRecord$3(value){return Boolean(value)&&typeof value===`object`&&!Array.isArray(value)}function normalizeMediaType(contentType=``){return String(contentType||``).split(`;`)[0].trim().toLowerCase()}function isJsonContentType(contentType=``){const mediaType=normalizeMediaType(contentType);if(!mediaType)return false;return mediaType===`application/json`||/^application\/[a-z0-9.!#$&^_-]+\+json$/i.test(mediaType)}function isJsonApiContentType(contentType=``){return normalizeMediaType(contentType)===JSON_API_CONTENT_TYPE}function resolveJsonApiTransportTypes({type=``,requestType=``,responseType=``}={},{context=`JSON:API transport`}={}){const fallbackType=normalizeText(type);const normalizedRequestType=normalizeText(requestType,{fallback:fallbackType});const normalizedResponseType=normalizeText(responseType,{fallback:fallbackType||normalizedRequestType});if(!normalizedRequestType&&!normalizedResponseType)throw new TypeError(`${context} requires requestType, responseType, or type.`);return Object.freeze({requestType:normalizedRequestType,responseType:normalizedResponseType})}function normalizeJsonApiResourceObject(resource={}){if(!isRecord$3(resource))return Object.freeze({});const source=normalizeObject(resource);const normalized={};if(source.type!=null)normalized.type=String(source.type);if(source.id!=null)normalized.id=String(source.id);if(isRecord$3(source.attributes))normalized.attributes=normalizeObject(source.attributes);if(isRecord$3(source.relationships))normalized.relationships=normalizeObject(source.relationships);if(isRecord$3(source.links))normalized.links=normalizeObject(source.links);if(isRecord$3(source.meta))normalized.meta=normalizeObject(source.meta);return Object.freeze(normalized)}function normalizeJsonApiResourceArray(value){return Object.freeze(normalizeArray(value).map(entry=>normalizeJsonApiResourceObject(entry)))}function normalizeJsonApiLinks(value){return isRecord$3(value)?Object.freeze(normalizeObject(value)):void 0}function normalizeJsonApiMeta(value){return isRecord$3(value)?Object.freeze(normalizeObject(value)):void 0}function normalizeJsonApiErrors(value){return Array.isArray(value)?Object.freeze(value.map(entry=>isRecord$3(entry)?normalizeObject(entry):{})):void 0}function isJsonApiResourceDocument(payload={}){return isRecord$3(payload)&&isRecord$3(payload.data)&&!Array.isArray(payload.data)}function isJsonApiCollectionDocument(payload={}){return isRecord$3(payload)&&Array.isArray(payload.data)}function isJsonApiErrorDocument(payload={}){return isRecord$3(payload)&&Array.isArray(payload.errors)}function normalizeJsonApiDocument(payload={}){const source=isRecord$3(payload)?normalizeObject(payload):{};const links=normalizeJsonApiLinks(source.links);const meta=normalizeJsonApiMeta(source.meta);const included=normalizeJsonApiResourceArray(source.included);if(isJsonApiResourceDocument(source))return Object.freeze({kind:`resource`,data:normalizeJsonApiResourceObject(source.data),...included.length>0?{included}:{},...links?{links}:{},...meta?{meta}:{}});if(Object.hasOwn(source,`data`)&&source.data==null)return Object.freeze({kind:`resource`,data:null,...included.length>0?{included}:{},...links?{links}:{},...meta?{meta}:{}});if(isJsonApiCollectionDocument(source))return Object.freeze({kind:`collection`,data:normalizeJsonApiResourceArray(source.data),...included.length>0?{included}:{},...links?{links}:{},...meta?{meta}:{}});if(isJsonApiErrorDocument(source)){const errors=normalizeJsonApiErrors(source.errors);return Object.freeze({kind:`errors`,errors:errors||Object.freeze([]),...links?{links}:{},...meta?{meta}:{}})}if(meta&&!Object.hasOwn(source,`data`)&&!Object.hasOwn(source,`errors`))return Object.freeze({kind:`meta`,meta,...links?{links}:{}});return Object.freeze({kind:`unknown`,value:source})}function createJsonApiResourceObject({type=``,id=null,attributes=void 0,relationships=void 0,links=void 0,meta=void 0}={}){const normalizedType=String(type||``).trim();if(!normalizedType)throw new TypeError(`createJsonApiResourceObject requires a non-empty type.`);const resource={type:normalizedType};if(id!=null&&String(id).trim())resource.id=String(id);if(attributes!==void 0){if(!isRecord$3(attributes))throw new TypeError(`createJsonApiResourceObject attributes must be an object.`);resource.attributes=normalizeObject(attributes)}if(relationships!==void 0){if(!isRecord$3(relationships))throw new TypeError(`createJsonApiResourceObject relationships must be an object.`);resource.relationships=normalizeObject(relationships)}if(links!==void 0){if(!isRecord$3(links))throw new TypeError(`createJsonApiResourceObject links must be an object.`);resource.links=normalizeObject(links)}if(meta!==void 0){if(!isRecord$3(meta))throw new TypeError(`createJsonApiResourceObject meta must be an object.`);resource.meta=normalizeObject(meta)}return Object.freeze(resource)}function createJsonApiDocument({data=void 0,included=void 0,links=void 0,meta=void 0,errors=void 0}={}){const hasData=data!==void 0;const hasErrors=errors!==void 0;if(!hasData&&!hasErrors&&!(meta!==void 0))throw new TypeError(`createJsonApiDocument requires at least one of data, errors, or meta.`);if(hasData&&hasErrors)throw new TypeError(`createJsonApiDocument cannot include both data and errors.`);const document={};if(hasData){if(data==null)document.data=null;else if(Array.isArray(data))document.data=normalizeJsonApiResourceArray(data);else if(isRecord$3(data))document.data=normalizeJsonApiResourceObject(data);else throw new TypeError(`createJsonApiDocument data must be a resource object, an array, or null.`)}if(hasErrors){if(!Array.isArray(errors))throw new TypeError(`createJsonApiDocument errors must be an array.`);document.errors=normalizeJsonApiErrors(errors)||Object.freeze([])}if(included!==void 0){if(!Array.isArray(included))throw new TypeError(`createJsonApiDocument included must be an array.`);document.included=normalizeJsonApiResourceArray(included)}if(links!==void 0){if(!isRecord$3(links))throw new TypeError(`createJsonApiDocument links must be an object.`);document.links=Object.freeze(normalizeObject(links))}if(meta!==void 0){if(!isRecord$3(meta))throw new TypeError(`createJsonApiDocument meta must be an object.`);document.meta=Object.freeze(normalizeObject(meta))}return Object.freeze(document)}function createJsonApiErrorObject({status=``,code=``,title=``,detail=``,source=void 0,links=void 0,meta=void 0}={}){const errorObject={};const normalizedStatus=String(status||``).trim();const normalizedCode=String(code||``).trim();const normalizedTitle=String(title||``).trim();const normalizedDetail=String(detail||``).trim();if(normalizedStatus)errorObject.status=normalizedStatus;if(normalizedCode)errorObject.code=normalizedCode;if(normalizedTitle)errorObject.title=normalizedTitle;if(normalizedDetail)errorObject.detail=normalizedDetail;if(source!==void 0){if(!isRecord$3(source))throw new TypeError(`createJsonApiErrorObject source must be an object.`);errorObject.source=normalizeObject(source)}if(links!==void 0){if(!isRecord$3(links))throw new TypeError(`createJsonApiErrorObject links must be an object.`);errorObject.links=normalizeObject(links)}if(meta!==void 0){if(!isRecord$3(meta))throw new TypeError(`createJsonApiErrorObject meta must be an object.`);errorObject.meta=normalizeObject(meta)}return Object.freeze(errorObject)}function escapeJsonPointerSegment(value=``){return String(value||``).replace(/~/g,`~0`).replace(/\//g,`~1`)}function resolveValidationFieldName(issue={}){const pathParts=String(issue?.instancePath||``).split(`/`).filter(Boolean);const missingProperty=String(issue?.params?.missingProperty||``).trim();return String(issue?.params?.additionalProperty||``).trim()||missingProperty||pathParts[pathParts.length-1]||``}function resolveJsonApiValidationSource(issue={},validationContext=``){const normalizedContext=String(validationContext||``).trim().toLowerCase();const fieldName=resolveValidationFieldName(issue);if(normalizedContext===`querystring`||normalizedContext===`params`)return fieldName?Object.freeze({parameter:fieldName}):void 0;const instancePath=String(issue?.instancePath||``).trim();if(!instancePath&&!fieldName)return;const pointerBase=instancePath||``;const pointer=fieldName&&!pointerBase.endsWith(`/${fieldName}`)?`${pointerBase}/${escapeJsonPointerSegment(fieldName)}`:pointerBase;return Object.freeze({pointer:pointer||`/`})}function createJsonApiErrorDocumentFromFailure({statusCode=500,code=``,message=``,transactionOutcome,fieldErrors={},validationIssues=[],validationContext=``,pointerPrefix=`/data/attributes`}={}){const outcome=normalizeTransactionOutcome(transactionOutcome);const meta=outcome?{transactionOutcome:outcome}:void 0;const normalizedStatus=String(Number(statusCode)||500);const normalizedCode=String(code||``).trim();const normalizedMessage=String(message||``).trim()||`Request failed.`;const normalizedFieldErrors=isRecord$3(fieldErrors)?normalizeObject(fieldErrors):{};const issues=Array.isArray(validationIssues)?validationIssues:[];if(issues.length>0)return createJsonApiDocument({errors:issues.map(issue=>createJsonApiErrorObject({status:normalizedStatus,meta,code:normalizedCode,title:normalizedMessage,detail:String(issue?.message||`Invalid value.`).trim()||`Invalid value.`,source:resolveJsonApiValidationSource(issue,validationContext)}))});const fieldEntries=Object.entries(normalizedFieldErrors).filter(([field])=>String(field||``).trim());if(fieldEntries.length>0)return createJsonApiDocument({errors:fieldEntries.map(([field,detail])=>createJsonApiErrorObject({status:normalizedStatus,meta,code:normalizedCode,title:normalizedMessage,detail:String(detail||`Invalid value.`).trim()||`Invalid value.`,source:{pointer:`${pointerPrefix}/${escapeJsonPointerSegment(field)}`}}))});return createJsonApiDocument({errors:[createJsonApiErrorObject({status:normalizedStatus,meta,code:normalizedCode,title:normalizedMessage})]})}function simplifyJsonApiResourceObject(resource={}){return simplifyJsonApiResourceWithRelationshipIds(normalizeJsonApiResourceObject(resource))}function simplifyJsonApiDocument(payload={}){const document=normalizeJsonApiDocument(payload);if(document.kind===`resource`)return document.data==null?null:simplifyJsonApiResourceObject(document.data);if(document.kind===`collection`)return document.data.map(entry=>simplifyJsonApiResourceObject(entry));if(document.kind===`meta`)return document.meta||{};return payload}function normalizeJsonApiFieldList(value=[]){const values=Array.isArray(value)?value:[value];const fields=new Set;for(const entry of values){const parts=typeof entry===`string`?entry.split(`,`):[entry];for(const part of parts){const field=normalizeText(part);if(field)fields.add(field)}}return Object.freeze([...fields].sort((left,right)=>left.localeCompare(right)))}function normalizeJsonApiFieldsets(value={},{primaryType=``}={}){const normalizedPrimaryType=normalizeText(primaryType);let source={};if(value&&typeof value===`object`&&!Array.isArray(value))source=value;else if(normalizedPrimaryType)source={[normalizedPrimaryType]:value};const fieldsets=[];for(const[rawType,rawFields]of Object.entries(source)){const type=normalizeText(rawType);const fields=normalizeJsonApiFieldList(rawFields);if(!type||fields.length<1)continue;fieldsets.push([type,fields])}return deepFreeze(Object.fromEntries(fieldsets.sort(([left],[right])=>left.localeCompare(right))))}function buildJsonApiFieldsetsToken(value={}){const fieldsets=normalizeJsonApiFieldsets(value);return Object.keys(fieldsets).length>0?JSON.stringify(fieldsets):``}function isPlainObject(value){if(value===null||typeof value!==`object`)return false;const prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null||isEmptyNullPrototypeRecord(prototype)}function isEmptyNullPrototypeRecord(value){return value!==null&&typeof value===`object`&&Object.getPrototypeOf(value)===null&&Reflect.ownKeys(value).length===0}function isSchemaLike(value){return value!==null&&typeof value===`object`&&isPlainObject(value.structure)&&isPlainObject(value.operations)&&typeof value.validateWith===`function`&&typeof value.toJsonSchema===`function`&&typeof value.cleanup===`function`}function resolveArrayItemsConfig(fieldPath,definition){if(!Object.hasOwn(definition,`items`))return null;const{items}=definition;if(isSchemaLike(items))return{kind:`schema`,schema:items};if(!isPlainObject(items)||typeof items.type!==`string`)throw new Error(`Array field "${fieldPath}" must define items as either a Schema instance or a field definition object.`);return{kind:`definition`,definition:items}}function resolveObjectValuesConfig(fieldPath,definition){if(!Object.hasOwn(definition,`values`))return null;const{values}=definition;if(isSchemaLike(values))return{kind:`schema`,schema:values};if(!isPlainObject(values)||typeof values.type!==`string`)throw new Error(`Object field "${fieldPath}" must define values as either a Schema instance or a field definition object.`);return{kind:`definition`,definition:values}}function resolveObjectFieldMode(fieldPath,definition){const hasNestedSchema=Object.hasOwn(definition,`schema`);const hasValues=Object.hasOwn(definition,`values`);const hasAdditionalProperties=Object.hasOwn(definition,`additionalProperties`);if(hasNestedSchema&&hasValues)throw new Error(`Object field "${fieldPath}" cannot define both schema and values.`);if(hasAdditionalProperties&&definition.additionalProperties!==true)throw new Error(`Object field "${fieldPath}" only supports additionalProperties: true.`);if(hasValues&&definition.additionalProperties===true)throw new Error(`Object field "${fieldPath}" cannot define both values and additionalProperties: true.`);if(hasNestedSchema){if(!isSchemaLike(definition.schema))throw new Error(`Object field "${fieldPath}" must define schema as a Schema instance.`);return{kind:`nested`,schema:definition.schema,allowAdditionalProperties:definition.additionalProperties===true}}if(hasValues)return{kind:`map`,valuesConfig:resolveObjectValuesConfig(fieldPath,definition)};if(definition.additionalProperties===true)return{kind:`opaque`};return{kind:`plain`}}function isNumericDefinition(definition){return definition?.type===`number`||definition?.type===`integer`||definition?.type===`epochMilliseconds`||definition?.type===`epochSeconds`}var EPOCH_MILLISECONDS_LIMIT=864e13;var EPOCH_SECONDS_LIMIT=864e10;var EPOCH_INTEGER_STRING_PATTERN=`^(?:0|-?[1-9]\\d*)$`;var YEAR_PATTERN=`\\d{4}`;var MONTH_PATTERN=`0[1-9]|1[0-2]`;var DAY_PATTERN=`0[1-9]|[12]\\d|3[01]`;var HOUR_PATTERN=`[01]\\d|2[0-3]`;var MINUTE_OR_SECOND_PATTERN=`[0-5]\\d`;var HOUR_MINUTE_PATTERN=`(?:${HOUR_PATTERN}):${MINUTE_OR_SECOND_PATTERN}`;var TIME_ZONE_PATTERN=`(?:Z|[+-](?:${HOUR_PATTERN}):${MINUTE_OR_SECOND_PATTERN})`;var CAPTURED_DATE_PATTERN=`(${YEAR_PATTERN})-(${MONTH_PATTERN})-(${DAY_PATTERN})`;var JSON_SCHEMA_DATE_PATTERN=`${YEAR_PATTERN}-(?:${MONTH_PATTERN})-(?:${DAY_PATTERN})`;var DATE_JSON_SCHEMA_PATTERN=`^${JSON_SCHEMA_DATE_PATTERN}$`;var DATE_PATTERN=new RegExp(`^${CAPTURED_DATE_PATTERN}$`);var TIME_PATTERN=new RegExp(`^${HOUR_MINUTE_PATTERN}(?::${MINUTE_OR_SECOND_PATTERN}(?:\\.(\\d+))?)?$`);var DATE_TIME_PATTERN=new RegExp(`^${CAPTURED_DATE_PATTERN}T${HOUR_MINUTE_PATTERN}:${MINUTE_OR_SECOND_PATTERN}(?:\\.(\\d+))?${TIME_ZONE_PATTERN}$`);var EPOCH_INTEGER_STRING=new RegExp(EPOCH_INTEGER_STRING_PATTERN);var DAYS_PER_MONTH=[31,28,31,30,31,30,31,31,30,31,30,31];function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function daysInMonth(year,month){if(month===2)return isLeapYear(year)?29:28;return DAYS_PER_MONTH[month-1]}function isValidCalendarDateParts(yearText,monthText,dayText){const year=Number(yearText);const month=Number(monthText);const day=Number(dayText);return month>=1&&month<=12&&day>=1&&day<=daysInMonth(year,month)}function resolveTemporalPrecision(definition,fieldName){const precision=definition.temporalPrecision;if(precision===void 0)return void 0;if(!Number.isInteger(precision)||precision<0)throw new Error(`temporalPrecision for "${fieldName}" must be a non-negative integer.`);return precision}function hasAllowedFractionalPrecision(fraction,temporalPrecision){if(fraction===void 0)return true;return temporalPrecision===void 0||fraction.length<=temporalPrecision}function isValidDate(value){if(typeof value!==`string`)return false;const match=DATE_PATTERN.exec(value);return match!==null&&isValidCalendarDateParts(match[1],match[2],match[3])}function isValidTime(value,temporalPrecision){if(typeof value!==`string`)return false;const match=TIME_PATTERN.exec(value);return match!==null&&hasAllowedFractionalPrecision(match[1],temporalPrecision)}function isValidDateTime(value,temporalPrecision){if(typeof value!==`string`)return false;const match=DATE_TIME_PATTERN.exec(value);if(match===null)return false;return isValidCalendarDateParts(match[1],match[2],match[3])&&hasAllowedFractionalPrecision(match[4],temporalPrecision)}function fractionalPattern(temporalPrecision){if(temporalPrecision===void 0)return`(?:\\.\\d+)?`;if(temporalPrecision===0)return``;return`(?:\\.\\d{1,${temporalPrecision}})?`}function timeJsonSchemaPattern(definition,fieldName){const precision=resolveTemporalPrecision(definition,fieldName);return`^${HOUR_MINUTE_PATTERN}(?::${MINUTE_OR_SECOND_PATTERN}${fractionalPattern(precision)})?$`}function dateTimeJsonSchemaPattern(definition,fieldName){const precision=resolveTemporalPrecision(definition,fieldName);return`^${JSON_SCHEMA_DATE_PATTERN}T${HOUR_MINUTE_PATTERN}:${MINUTE_OR_SECOND_PATTERN}${fractionalPattern(precision)}${TIME_ZONE_PATTERN}$`}function castEpochInteger(value,limit){let integerValue;if(typeof value===`number`)integerValue=value;else if(typeof value===`string`&&EPOCH_INTEGER_STRING.test(value))integerValue=Number(value);else return null;if(!Number.isSafeInteger(integerValue)||integerValue<-limit||integerValue>limit)return null;return integerValue===0?0:integerValue}var UNSAFE_PATH_SEGMENTS=new Set([`__proto__`,`prototype`,`constructor`]);function setOwnProperty(target,key,value){Object.defineProperty(target,key,{value,enumerable:true,configurable:true,writable:true})}function assertSafePathSegment(segment,helperName){if(UNSAFE_PATH_SEGMENTS.has(segment))throw new Error(`${helperName}() received unsafe path segment "${segment}".`)}function normalizeFieldPath(path){if(typeof path!==`string`)return path;return path.replace(/\[(.+?)\]/g,`.$1`).replace(/^\.+/,``).replace(/\.+/g,`.`).replace(/\.$/,``)}function buildPathSegments$1(path,helperName,{normalize=false,allowEmpty=false}={}){const normalizedPath=normalize?normalizeFieldPath(path):path;if(typeof normalizedPath!==`string`||normalizedPath.trim()===``){if(allowEmpty&&normalizedPath===``)return[];throw new Error(`${helperName}() expects a non-empty dotted path string.`)}const segments=normalizedPath.split(`.`);if(segments.some(segment=>segment===``))throw new Error(`${helperName}() received an invalid path "${normalizedPath}".`);for(const segment of segments)assertSafePathSegment(segment,helperName);return segments}var JSON_SCHEMA_DRAFT_07=`http://json-schema.org/draft-07/schema#`;var JSON_REST_EXTENSION_KEY=`x-json-rest-schema`;var NON_NULL_JSON_TYPES=[`object`,`array`,`string`,`number`,`boolean`];var EXPORT_CONTEXT_KEY=Symbol(`json-rest-schema.exportContext`);var BOOLEAN_TRUE_VALUES=[`true`,`1`,`yes`,`y`,`on`];var BOOLEAN_FALSE_VALUES=[`false`,`0`,`no`,`n`,`off`];function epochIntegerSchema(limit){return{anyOf:[{type:`integer`,minimum:-limit,maximum:limit},{type:`string`,pattern:EPOCH_INTEGER_STRING_PATTERN}]}}function extensionMetadataFragment(section,values){return{[JSON_REST_EXTENSION_KEY]:{[section]:values}}}var BUILTIN_TYPE_EXPORTERS={none:()=>({type:NON_NULL_JSON_TYPES}),blob:()=>({type:NON_NULL_JSON_TYPES}),serialize:()=>({type:NON_NULL_JSON_TYPES}),object:()=>({type:`object`}),array:()=>({type:`array`}),file:()=>({type:`string`}),string:()=>({type:`string`}),number:()=>({type:[`number`,`string`]}),integer:()=>({type:[`integer`,`string`]}),epochMilliseconds:()=>epochIntegerSchema(EPOCH_MILLISECONDS_LIMIT),epochSeconds:()=>epochIntegerSchema(EPOCH_SECONDS_LIMIT),dateTime:({definition,fieldName})=>({type:`string`,format:`date-time`,pattern:dateTimeJsonSchemaPattern(definition,fieldName)}),date:()=>({type:`string`,format:`date`,pattern:DATE_JSON_SCHEMA_PATTERN}),time:({definition,fieldName})=>({type:`string`,pattern:timeJsonSchemaPattern(definition,fieldName)}),boolean:({definition})=>{if(definition.strictBoolean===true)return{type:`boolean`};const trueValues=new Set([...BOOLEAN_TRUE_VALUES,String(definition.stringTrueWhen||`true`).trim().toLowerCase()]);return{anyOf:[{type:`boolean`},{type:`number`,enum:[0,1]},{type:`string`,enum:[...new Set([...BOOLEAN_FALSE_VALUES,String(definition.stringFalseWhen||`false`).trim().toLowerCase()]),...trueValues]}]}},id:()=>({type:[`integer`,`string`],minimum:1,pattern:`^[1-9][0-9]*$`})};var BUILTIN_VALIDATOR_EXPORTERS={minLength:({definition,parameterValue})=>definition.type===`string`?{minLength:parameterValue}:null,maxLength:({definition,parameterValue})=>definition.type===`string`?{maxLength:parameterValue}:null,min:({definition,parameterValue})=>isNumericDefinition(definition)?{minimum:parameterValue}:null,max:({definition,parameterValue})=>isNumericDefinition(definition)?{maximum:parameterValue}:null,pattern:({definition,parameterValue})=>definition.type===`string`?{pattern:parameterValue instanceof RegExp?parameterValue.source:parameterValue}:null,enum:({parameterValue})=>({enum:parameterValue}),notEmpty:({parameterValue,definition})=>{if(!parameterValue)return null;if(definition.type===`array`)return null;return{minLength:1}},uppercase:({parameterValue})=>parameterValue?extensionMetadataFragment(`transforms`,{uppercase:true}):null,lowercase:({parameterValue})=>parameterValue?extensionMetadataFragment(`transforms`,{lowercase:true}):null,length:({parameterValue})=>extensionMetadataFragment(`transforms`,{length:parameterValue}),unsigned:({parameterValue})=>parameterValue?extensionMetadataFragment(`metadata`,{unsigned:true}):null,precision:({parameterValue})=>extensionMetadataFragment(`metadata`,{precision:parameterValue}),scale:({parameterValue})=>extensionMetadataFragment(`metadata`,{scale:parameterValue}),temporalPrecision:({parameterValue})=>extensionMetadataFragment(`metadata`,{temporalPrecision:parameterValue}),strictBoolean:()=>null,required:()=>null,nullable:()=>null,nullOnEmpty:()=>null,defaultTo:()=>null};function mergePlainObjects(target,source){for(const key of Object.keys(source)){const sourceValue=source[key];const targetValue=target[key];if(sourceValue&&targetValue&&typeof sourceValue===`object`&&typeof targetValue===`object`&&!Array.isArray(sourceValue)&&!Array.isArray(targetValue)){mergePlainObjects(targetValue,sourceValue);continue}target[key]=sourceValue}}function mergeSchemaFragment(target,fragment){if(!fragment||typeof fragment!==`object`||Array.isArray(fragment))throw new Error(`JSON Schema export hooks must return an object or null.`);for(const key of Object.keys(fragment)){if(key===JSON_REST_EXTENSION_KEY&&target[key]&&typeof target[key]===`object`&&typeof fragment[key]===`object`&&!Array.isArray(target[key])&&!Array.isArray(fragment[key])){mergePlainObjects(target[key],fragment[key]);continue}target[key]=fragment[key]}}function buildAnyOfSchema(baseSchema,alternatives){const finalAlternatives=[...Array.isArray(baseSchema.anyOf)&&Object.keys(baseSchema).length===1?baseSchema.anyOf:[baseSchema],...alternatives];if(finalAlternatives.length===1)return baseSchema;return{anyOf:finalAlternatives}}function getTypeExporter(schema,definition){if(!Object.hasOwn(schema.types,definition.type))throw new Error(`No casting function for type: ${definition.type}`);const handler=schema.types[definition.type];if(typeof handler.toJsonSchema===`function`)return handler.toJsonSchema;const exporter=BUILTIN_TYPE_EXPORTERS[definition.type];if(!exporter)throw new Error(`Type '${definition.type}' cannot be exported to JSON Schema without a toJsonSchema hook.`);return exporter}function getValidatorExporter(schema,parameterName,fieldName){if(!Object.hasOwn(schema.validators,parameterName))return null;const handler=schema.validators[parameterName];if(typeof handler.toJsonSchema===`function`)return handler.toJsonSchema;const exporter=BUILTIN_VALIDATOR_EXPORTERS[parameterName];if(exporter)return exporter;throw new Error(`Validator '${parameterName}' on field '${fieldName}' cannot be exported to JSON Schema without a toJsonSchema hook.`)}function normalizeMode(mode){if(mode===void 0)return`create`;if([`create`,`replace`,`patch`].includes(mode))return mode;throw new Error(`Unsupported JSON Schema export mode '${mode}'. Expected 'create', 'replace', or 'patch'.`)}function resolveOperationName(schema,options={}){if(options.mode!==void 0&&options.operation!==void 0){const normalizedMode=normalizeMode(options.mode);if(normalizedMode!==options.operation)throw new Error(`Conflicting JSON Schema export options: mode '${normalizedMode}' does not match operation '${options.operation}'.`)}if(options.operation!==void 0){if(!Object.hasOwn(schema.operations,options.operation))throw new Error(`Unknown JSON Schema export operation '${options.operation}'.`);return options.operation}return normalizeMode(options.mode)}function resolveExportOperation(schema,options={}){if(options.operationName!==void 0&&options.operationDescriptor!==void 0)return{operationName:options.operationName,operation:options.operationDescriptor};const operationName=resolveOperationName(schema,options);return{operationName,operation:schema.operations[operationName]}}function createExportOptions(options={}){const exportOptions={...options};Object.defineProperty(exportOptions,EXPORT_CONTEXT_KEY,{value:{definitions:{},nodes:[],nextDefinitionId:1,rootNode:null},enumerable:false});return exportOptions}function getExportContext(options={}){if(options[EXPORT_CONTEXT_KEY])return options[EXPORT_CONTEXT_KEY];return{definitions:{},nodes:[],nextDefinitionId:1,rootNode:null}}function sanitizeDefinitionNamePart(value){return String(value).replace(/[^a-zA-Z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`operation`}function isReferenceOnlySchema(schema){return isPlainObject(schema)&&Object.keys(schema).length===1&&typeof schema.$ref===`string`}function wrapReferenceSchema(schema){if(!isReferenceOnlySchema(schema))return schema;return{allOf:[schema]}}function findExportNode(exportContext,schema,operationName,operation,additionalProperties){return exportContext.nodes.find(node=>node.schema===schema&&node.operationName===operationName&&node.operation===operation&&node.additionalProperties===additionalProperties)||null}function createDefinitionName(exportContext,operationName){const suffix=sanitizeDefinitionNamePart(operationName);const definitionName=`SchemaNode_${exportContext.nextDefinitionId}_${suffix}`;exportContext.nextDefinitionId+=1;return definitionName}function getOrCreateExportNode(schema,options,operationName,operation,additionalProperties,{root=false}={}){const exportContext=getExportContext(options);const existingNode=findExportNode(exportContext,schema,operationName,operation,additionalProperties);if(existingNode){if(root){existingNode.pointer=`#`;exportContext.rootNode=existingNode}return existingNode}const node={schema,operationName,operation,additionalProperties,status:`new`,definitionName:root?null:createDefinitionName(exportContext,operationName),pointer:root?`#`:null};if(!root)node.pointer=`#/definitions/${node.definitionName}`;else exportContext.rootNode=node;exportContext.nodes.push(node);return node}function buildExportNodeSchema(node,options){if(node.status===`built`)return{$ref:node.pointer};if(node.status===`building`)return{$ref:node.pointer};const exportContext=getExportContext(options);node.status=`building`;if(node.pointer!==`#`)exportContext.definitions[node.definitionName]={};const objectSchema=buildSchemaObjectFragment(node.schema,options,node.operationName,node.operation,node.additionalProperties);node.status=`built`;if(node.pointer===`#`)return objectSchema;exportContext.definitions[node.definitionName]=objectSchema;return{$ref:node.pointer}}function buildSchemaReference(schema,options,operationName,operation,additionalProperties=false){const exportContext=getExportContext(options);const node=getOrCreateExportNode(schema,options,operationName,operation,additionalProperties);if(exportContext.rootNode===node)return{$ref:`#`};return buildExportNodeSchema(node,options)}function createFieldSchemaState(schema,{referenceBacked=false}={}){return{schema,referenceBacked}}function buildSchemaObjectFragment(schema,options,operationName,operation,additionalProperties=false){const properties={};const required=[];for(const[fieldName,definition]of Object.entries(schema.structure)){setOwnProperty(properties,fieldName,buildFieldSchema(schema,fieldName,definition,options,operationName,operation));if(operation.enforceRequired&&definition.required===true)required.push(fieldName)}const objectSchema={type:`object`,properties,additionalProperties};if(required.length>0)objectSchema.required=required;return objectSchema}function buildArrayItemsSchema(schema,fieldName,definition,options,operationName,operation){const itemsConfig=resolveArrayItemsConfig(fieldName,definition);if(!itemsConfig)return null;if(itemsConfig.kind===`schema`)return{...wrapReferenceSchema(buildSchemaReference(itemsConfig.schema,options,`replace`,itemsConfig.schema.operations.replace,false)),[JSON_REST_EXTENSION_KEY]:{castType:`object`}};const itemOperationName=definition.items.type===`object`&&Object.hasOwn(definition.items,`schema`)?`replace`:operationName;const itemOperation=itemOperationName===`replace`?schema.operations.replace:operation;return buildFieldSchema(schema,`${fieldName}[]`,definition.items,options,itemOperationName,itemOperation)}function buildObjectValuesSchema(schema,fieldName,definition,options,operationName,operation){const valuesConfig=resolveObjectValuesConfig(fieldName,definition);if(!valuesConfig)return null;if(valuesConfig.kind===`schema`)return{...wrapReferenceSchema(buildSchemaReference(valuesConfig.schema,options,`replace`,valuesConfig.schema.operations.replace,false)),[JSON_REST_EXTENSION_KEY]:{castType:`object`}};const valueOperationName=valuesConfig.definition.type===`object`&&Object.hasOwn(valuesConfig.definition,`schema`)?`replace`:operationName;const valueOperation=valueOperationName===`replace`?schema.operations.replace:operation;return buildFieldSchema(schema,`${fieldName}.*`,valuesConfig.definition,options,valueOperationName,valueOperation)}function buildBaseFieldSchema(schema,fieldName,definition,options,operationName,operation){if(definition.type===`object`){const objectMode=resolveObjectFieldMode(fieldName,definition);if(objectMode.kind===`nested`)return createFieldSchemaState(buildSchemaReference(objectMode.schema,options,operationName,operation,objectMode.allowAdditionalProperties===true),{referenceBacked:true});if(objectMode.kind===`opaque`)return createFieldSchemaState({type:`object`,additionalProperties:true});if(objectMode.kind===`map`)return createFieldSchemaState({type:`object`,additionalProperties:buildObjectValuesSchema(schema,fieldName,definition,options,operationName,operation)})}const baseSchema=getTypeExporter(schema,definition)({schema,fieldName,definition,operation:operationName,mode:operationName,options});if(!baseSchema||typeof baseSchema!==`object`||Array.isArray(baseSchema))throw new Error(`Type '${definition.type}' on field '${fieldName}' returned an invalid JSON Schema fragment.`);if(definition.type===`array`){const itemsSchema=buildArrayItemsSchema(schema,fieldName,definition,options,operationName,operation);if(itemsSchema)return createFieldSchemaState({...baseSchema,items:itemsSchema},{referenceBacked:isReferenceOnlySchema(baseSchema)})}return createFieldSchemaState(baseSchema,{referenceBacked:isReferenceOnlySchema(baseSchema)})}function buildFieldSchema(schema,fieldName,definition,options,operationName,operation){const exportContext={schema,fieldName,definition,operation:operationName,mode:operationName,options};const baseFieldSchemaState=buildBaseFieldSchema(schema,fieldName,definition,options,operationName,operation);const workingSchema=baseFieldSchemaState.referenceBacked?wrapReferenceSchema(baseFieldSchemaState.schema):{...baseFieldSchemaState.schema};const extensionMetadata={castType:definition.type};for(const parameterName of Object.keys(definition)){if(parameterName===`type`)continue;if(!Object.hasOwn(schema.validators,parameterName))continue;const exporter=getValidatorExporter(schema,parameterName,fieldName);if(!exporter)continue;const fragment=exporter({...exportContext,parameterName,parameterValue:definition[parameterName],fieldSchema:{...workingSchema}});if(!fragment)continue;mergeSchemaFragment(workingSchema,fragment)}if(workingSchema[JSON_REST_EXTENSION_KEY]){mergePlainObjects(extensionMetadata,workingSchema[JSON_REST_EXTENSION_KEY]);delete workingSchema[JSON_REST_EXTENSION_KEY]}const alternatives=[];if(definition.nullable===true)alternatives.push({type:`null`});if(definition.nullOnEmpty===true)alternatives.push({const:``});const finalSchema=wrapReferenceSchema(buildAnyOfSchema(workingSchema,alternatives));if(definition.defaultTo!==void 0&&operation.applyDefaults){if(typeof definition.defaultTo!==`function`){const defaultResult=schema._normalizeDefault(definition,definition.defaultTo,{fieldPath:fieldName,currentObject:{},containerKey:fieldName,objectBeforeCast:{},options:{},settings:schema._buildOperationSettings(operationName,operation,{})});if(Object.keys(defaultResult.errors).length>0){const firstError=Object.values(defaultResult.errors)[0];throw new Error(`defaultTo for "${fieldName}" is invalid (${firstError.code}).`)}finalSchema.default=defaultResult.value}else extensionMetadata.defaults={providedByFunction:true}}finalSchema[JSON_REST_EXTENSION_KEY]=extensionMetadata;return finalSchema}function buildJsonSchema(schema,options={}){const exportOptions=createExportOptions(options);const{operationName,operation}=resolveExportOperation(schema,exportOptions);const additionalProperties=exportOptions.additionalProperties===void 0?false:exportOptions.additionalProperties;const exportContext=getExportContext(exportOptions);const rootNode=getOrCreateExportNode(schema,exportOptions,operationName,operation,additionalProperties,{root:true});const transportSchema={$schema:JSON_SCHEMA_DRAFT_07,...buildExportNodeSchema(rootNode,exportOptions)};if(Object.keys(exportContext.definitions).length>0)transportSchema.definitions=exportContext.definitions;return transportSchema}function isThenable$1(value){return value!==null&&(typeof value===`object`||typeof value===`function`)&&typeof value.then===`function`}function isSchemaInstance(value){return value instanceof Schema}function createSelectionNode(){return{self:false,children:{}}}function hasSelectionChildren(selectionNode){return Object.keys(selectionNode.children).length>0}function joinPath(basePath,pathSegment){return`${basePath}.${String(pathSegment)}`}function buildFieldPath(basePath,fieldName){return basePath===``?String(fieldName):joinPath(basePath,fieldName)}function stripPathPrefix(path,prefix){if(path===prefix)return``;const prefixWithDot=`${prefix}.`;if(!path.startsWith(prefixWithDot))return null;return path.slice(prefixWithDot.length)}function prefixErrorMap(errors,prefix){const prefixedErrors={};for(const error of Object.values(errors)){const field=joinPath(prefix,error.field);setOwnProperty(prefixedErrors,field,{...error,field})}return prefixedErrors}function buildPathSegments(path){return buildPathSegments$1(path,`validatePath`)}function buildSelectionTree(paths){const selectionTree={};for(const path of paths){const segments=buildPathSegments(path);let currentTree=selectionTree;for(let index=0;index<segments.length;index++){const segment=segments[index];if(!Object.hasOwn(currentTree,segment))setOwnProperty(currentTree,segment,createSelectionNode());if(index===segments.length-1)currentTree[segment].self=true;currentTree=currentTree[segment].children}}return selectionTree}function getValueAtPath(value,pathSegments){let currentValue=value;for(const segment of pathSegments){if(currentValue===null||currentValue===void 0)return void 0;if(typeof currentValue!==`object`)return void 0;if(!Object.hasOwn(currentValue,segment))return void 0;currentValue=currentValue[segment]}return currentValue}function hasSelectedValue(value){if(value===null)return true;if(Array.isArray(value))return Object.keys(value).length>0;if(isPlainObject(value))return Object.keys(value).length>0;return value!==void 0}function sortSelectionKeys(keys){return[...keys].sort((left,right)=>{const leftIsIndex=/^[0-9]+$/.test(left);const rightIsIndex=/^[0-9]+$/.test(right);if(leftIsIndex&&rightIsIndex)return Number(left)-Number(right);if(leftIsIndex)return-1;if(rightIsIndex)return 1;return left.localeCompare(right)})}function isNumericPathSegment(segment){return/^[0-9]+$/.test(segment)}function cloneSchemaIntrospectionSnapshot(schema,seen=new WeakMap){if(seen.has(schema))return seen.get(schema);const snapshot=Object.create(Schema.prototype);seen.set(schema,snapshot);snapshot.structure=null;snapshot.types=schema.types;snapshot.validators=schema.validators;snapshot.operations=schema.operations;snapshot.structure=freezeIntrospectionValue(cloneIntrospectionValue(schema.structure,seen));snapshot._installOperationMethods();return Object.freeze(snapshot)}function cloneIntrospectionValue(value,seen=new WeakMap){if(value===null||typeof value!==`object`)return value;if(isSchemaInstance(value))return cloneSchemaIntrospectionSnapshot(value,seen);if(value instanceof Date)return new Date(value.getTime());if(value instanceof RegExp){const cloned=new RegExp(value.source,value.flags);cloned.lastIndex=value.lastIndex;return cloned}if(seen.has(value))return seen.get(value);if(Array.isArray(value)){const cloned=[];seen.set(value,cloned);for(const item of value)cloned.push(cloneIntrospectionValue(item,seen));return cloned}if(!isPlainObject(value))return value;const cloned={};seen.set(value,cloned);for(const[key,entry]of Object.entries(value))setOwnProperty(cloned,key,cloneIntrospectionValue(entry,seen));return cloned}function freezeIntrospectionValue(value,seen=new WeakSet){if(value===null||typeof value!==`object`||seen.has(value)||isSchemaInstance(value))return value;seen.add(value);if(Array.isArray(value))for(const item of value)freezeIntrospectionValue(item,seen);else for(const key of Reflect.ownKeys(value))freezeIntrospectionValue(value[key],seen);return Object.freeze(value)}function createIntrospectionSnapshot(value){return freezeIntrospectionValue(cloneIntrospectionValue(value))}function resolveDefinitionFromSchemaPath(schema,pathSegments,basePath=``){if(!isSchemaInstance(schema))return null;if(!Array.isArray(pathSegments)||pathSegments.length<1)return null;const[fieldName,...rest]=pathSegments;if(!Object.hasOwn(schema.structure,fieldName))return null;const definition=schema.structure[fieldName];if(rest.length<1)return definition;return resolveNestedDefinitionAtPath(schema,definition,rest,buildFieldPath(basePath,fieldName))}function resolveNestedDefinitionAtPath(schema,definition,pathSegments,fieldPath){if(definition?.type===`object`){const objectMode=schema._resolveObjectFieldMode(fieldPath,definition);if(objectMode.kind!==`nested`)return null;return resolveDefinitionFromSchemaPath(objectMode.schema,pathSegments,fieldPath)}if(definition?.type===`array`){const itemsConfig=schema._resolveArrayItemsConfig(fieldPath,definition);if(!itemsConfig||pathSegments.length<1)return null;const[indexSegment,...rest]=pathSegments;if(!isNumericPathSegment(indexSegment))return null;const itemPath=joinPath(fieldPath,indexSegment);if(itemsConfig.kind===`schema`){if(rest.length<1)return null;return resolveDefinitionFromSchemaPath(itemsConfig.schema,rest,itemPath)}if(rest.length<1)return itemsConfig.definition;return resolveNestedDefinitionAtPath(schema,itemsConfig.definition,rest,itemPath)}return null}function buildNestedOptions(options,prefix){const nestedOptions={...options};if(Array.isArray(options.skipFields)){const skipFields=options.skipFields.map(fieldPath=>stripPathPrefix(fieldPath,prefix)).filter(fieldPath=>fieldPath!==null&&fieldPath!==``);if(skipFields.length>0)nestedOptions.skipFields=skipFields;else delete nestedOptions.skipFields}if(isPlainObject(options.skipParams)){const skipParams={};for(const[fieldPath,parameters]of Object.entries(options.skipParams)){const nestedFieldPath=stripPathPrefix(fieldPath,prefix);if(nestedFieldPath===null||nestedFieldPath===``)continue;setOwnProperty(skipParams,nestedFieldPath,parameters)}if(Object.keys(skipParams).length>0)nestedOptions.skipParams=skipParams;else delete nestedOptions.skipParams}return nestedOptions}var DEFAULT_OPERATIONS=Object.freeze({create:Object.freeze({targetFields:`schema`,enforceRequired:true,applyDefaults:true,outputFields:`validated`,rejectExplicitUndefined:true}),replace:Object.freeze({targetFields:`schema`,enforceRequired:true,applyDefaults:true,outputFields:`validated`,rejectExplicitUndefined:true}),patch:Object.freeze({targetFields:`input`,enforceRequired:false,applyDefaults:false,outputFields:`input`,rejectExplicitUndefined:true})});function validateOperationOption(operationName,descriptor,key,allowedValues){const value=descriptor[key];if(!allowedValues.includes(value))throw new Error(`Operation "${operationName}" must define ${key} as one of: ${allowedValues.join(`, `)}.`)}function validateBooleanOperationOption(operationName,descriptor,key,required=true){const value=descriptor[key];if(value===void 0&&!required)return;if(typeof value!==`boolean`)throw new Error(`Operation "${operationName}" must define ${key} as a boolean.`)}function normalizeOperationDescriptor(operationName,descriptor){if(typeof descriptor!==`object`||descriptor===null||Array.isArray(descriptor))throw new Error(`Operation "${operationName}" must be an object.`);validateOperationOption(operationName,descriptor,`targetFields`,[`schema`,`input`]);validateBooleanOperationOption(operationName,descriptor,`enforceRequired`);validateBooleanOperationOption(operationName,descriptor,`applyDefaults`);validateOperationOption(operationName,descriptor,`outputFields`,[`validated`,`input`]);validateBooleanOperationOption(operationName,descriptor,`rejectExplicitUndefined`,false);return Object.freeze({targetFields:descriptor.targetFields,enforceRequired:descriptor.enforceRequired,applyDefaults:descriptor.applyDefaults,outputFields:descriptor.outputFields,rejectExplicitUndefined:descriptor.rejectExplicitUndefined===void 0?true:descriptor.rejectExplicitUndefined})}function normalizeOperations(operations={}){if(typeof operations!==`object`||operations===null||Array.isArray(operations))throw new Error(`Schema operations must be an object.`);const normalizedOperations=Object.create(null);for(const[operationName,descriptor]of Object.entries(DEFAULT_OPERATIONS))setOwnProperty(normalizedOperations,operationName,descriptor);for(const[operationName,descriptor]of Object.entries(operations))setOwnProperty(normalizedOperations,operationName,normalizeOperationDescriptor(operationName,descriptor));return Object.freeze(normalizedOperations)}function freezeOwnMap(source){const map=Object.create(null);for(const[key,value]of Object.entries(source))setOwnProperty(map,key,value);return Object.freeze(map)}function cloneValidationOptions(options){const validationOptions={...options};delete validationOptions.operation;delete validationOptions.mode;return validationOptions}var Schema=class{constructor(structure,types,validators,operations={}){this.structure=structure;this.types=freezeOwnMap(types);this.validators=freezeOwnMap(validators);this.operations=normalizeOperations(operations);this._installOperationMethods()}_typeError(field){return this._paramError(field,`TYPE_CAST_FAILED`,`Value could not be cast to the required type.`)}_paramError(field,code,message,params={}){const e=new Error(message);e.errorObject={field,code,message,params};return e}_paramToBeSkipped(parameterName,skipParams,fieldName){if(typeof skipParams!==`object`||skipParams===null)return false;if(Array.isArray(skipParams[fieldName])&&skipParams[fieldName].includes(parameterName))return true;return false}_fieldToBeSkipped(fieldPath,options){return Array.isArray(options.skipFields)&&options.skipFields.includes(fieldPath)}_mergeErrors(target,source){for(const[fieldPath,error]of Object.entries(source))setOwnProperty(target,fieldPath,error)}_singleErrorMap(error){const errors={};setOwnProperty(errors,error.field,error);return errors}_assertSupportedOptions(options={}){if(Object.hasOwn(options,`onlyObjectValues`))throw new Error("Unsupported validation option `onlyObjectValues`. Call `patch()` directly.");if(Object.hasOwn(options,`mode`))throw new Error("Unsupported validation option `mode`. Call `validateWith()` or an operation method directly.");if(Object.hasOwn(options,`operation`))throw new Error("Unsupported validation option `operation`. Call `validateWith()` or an operation method directly.")}_buildOperationSettings(operationName,operation,object){return{operationName,operation,targetFieldNames:operation.targetFields===`input`?Object.keys(object):Object.keys(this.structure),outputFieldNames:operation.outputFields===`input`?Object.keys(object):Object.keys(this.structure),enforceRequired:operation.enforceRequired,applyDefaults:operation.applyDefaults,rejectExplicitUndefined:operation.rejectExplicitUndefined,defaultedFields:new Set,isFieldPresent:fieldName=>Object.hasOwn(object,fieldName)}}_assertPlainObjectInput(methodName,object){if(!isPlainObject(object))throw new Error(`${methodName}() expects a plain object input.`)}_resolvePathValidationRequest(options={}){const operationName=options.operation??options.mode??`patch`;if(Object.hasOwn(options,`operation`)&&Object.hasOwn(options,`mode`)&&options.operation!==options.mode)throw new Error("Path validation options `operation` and `mode` must match when both are provided.");if(!Object.hasOwn(this.operations,operationName))throw new Error(`Unknown operation "${operationName}".`);return{operationName,operation:this.operations[operationName],validationOptions:cloneValidationOptions(options)}}_buildOperationResult(object,workingObject,settings){const validatedObject={};for(const fieldName of settings.outputFieldNames){if(!Object.hasOwn(this.structure,fieldName))continue;const fieldPresent=settings.isFieldPresent(fieldName);if(!(workingObject[fieldName]!==void 0||fieldPresent&&object[fieldName]===null||settings.defaultedFields.has(fieldName)))continue;if(!fieldPresent&&!settings.defaultedFields.has(fieldName))continue;setOwnProperty(validatedObject,fieldName,workingObject[fieldName])}return validatedObject}_resolveObjectFieldMode(fieldPath,definition){return resolveObjectFieldMode(fieldPath,definition)}_resolveArrayItemsConfig(fieldPath,definition){return resolveArrayItemsConfig(fieldPath,definition)}_resolveObjectValuesConfig(fieldPath,definition){return resolveObjectValuesConfig(fieldPath,definition)}_buildArrayItemSettings(definition,settings){if(definition.type===`object`&&Object.hasOwn(definition,`schema`))return{...settings,operationName:`replace`,operation:this.operations.replace};return settings}_castValue(definition,rawValue,fieldPath,currentObject,containerKey,objectBeforeCast,options,settings){const nullable=definition.nullable===true||options.nullable===true;const nullOnEmpty=definition.nullOnEmpty===true||options.nullOnEmpty===true;if(!Object.hasOwn(this.types,definition.type))throw new Error(`No casting function for type: ${definition.type}`);const typeHandler=this.types[definition.type];if(rawValue===null){if(nullable){setOwnProperty(currentObject,containerKey,null);return{errors:{},shouldContinue:false}}return{errors:this._singleErrorMap({field:fieldPath,code:`NOT_NULLABLE`,message:`Field cannot be null`,params:{}}),shouldContinue:false}}if(rawValue===``&&nullOnEmpty){setOwnProperty(currentObject,containerKey,null);return{errors:{},shouldContinue:false}}const context={schema:this,definition,value:rawValue,fieldName:fieldPath,object:currentObject,objectBeforeCast,valueBeforeCast:rawValue,options,mode:settings.operationName,operation:settings.operationName,fieldPresent:true,computedOptions:{nullable:nullable||nullOnEmpty,nullOnEmpty},throwTypeError:()=>{throw this._typeError(fieldPath)},throwParamError:(code,message,params)=>{throw this._paramError(fieldPath,code,message,params)}};try{const castResult=typeHandler(context);if(isThenable$1(castResult))throw new Error(`Type handler for "${definition.type}" must be synchronous.`);if(castResult!==void 0){setOwnProperty(currentObject,containerKey,castResult);context.value=castResult}}catch(e){if(e.errorObject)return{errors:this._singleErrorMap(e.errorObject),shouldContinue:false};throw e}return{errors:{},context,shouldContinue:true}}_runFieldValidators(definition,fieldPath,currentObject,containerKey,context,options){for(const paramName of Object.keys(definition)){if(paramName===`type`)continue;if(this._paramToBeSkipped(paramName,options.skipParams,fieldPath))continue;if(!Object.hasOwn(this.validators,paramName))continue;const validatorHandler=this.validators[paramName];try{context.parameterName=paramName;context.parameterValue=definition[paramName];const validatorResult=validatorHandler(context);if(isThenable$1(validatorResult))throw new Error(`Validator handler for "${paramName}" must be synchronous.`);if(validatorResult!==void 0){setOwnProperty(currentObject,containerKey,validatorResult);context.value=validatorResult}}catch(e){if(e.errorObject)return this._singleErrorMap(e.errorObject);throw e}}return{}}_normalizeAndValidateValue(definition,rawValue,fieldPath,currentObject,containerKey,objectBeforeCast,options,settings){const castResult=this._castValue(definition,rawValue,fieldPath,currentObject,containerKey,objectBeforeCast,options,settings);if(Object.keys(castResult.errors).length>0)return castResult.errors;if(!castResult.shouldContinue)return{};const{context}=castResult;const nestedErrors=this._validateNestedValue(definition,fieldPath,currentObject,containerKey,options,settings);if(Object.keys(nestedErrors).length>0)return nestedErrors;context.value=currentObject[containerKey];return this._runFieldValidators(definition,fieldPath,currentObject,containerKey,context,options)}_normalizeDefault(definition,defaultValue,{fieldPath,currentObject,containerKey,objectBeforeCast,options,settings}){const defaultObject={...currentObject};setOwnProperty(defaultObject,containerKey,defaultValue);return{errors:this._normalizeAndValidateValue(definition,defaultValue,fieldPath,defaultObject,containerKey,objectBeforeCast,options,settings),value:defaultObject[containerKey]}}_validateNestedValue(definition,fieldPath,currentObject,containerKey,options,settings){if(definition.type===`object`){const objectMode=this._resolveObjectFieldMode(fieldPath,definition);if(objectMode.kind===`nested`)return this._validateNestedObjectSchema(objectMode,fieldPath,currentObject,containerKey,options,settings);if(objectMode.kind===`map`)return this._validateObjectValues(fieldPath,currentObject,containerKey,objectMode.valuesConfig,options,settings);return{}}if(definition.type!==`array`)return{};const itemsConfig=this._resolveArrayItemsConfig(fieldPath,definition);if(!itemsConfig)return{};return this._validateArrayItems(fieldPath,currentObject,containerKey,itemsConfig,options,settings)}_validateNestedObjectSchema(objectMode,fieldPath,currentObject,containerKey,options,settings){const sourceObject=currentObject[containerKey];const nestedInput=objectMode.allowAdditionalProperties?this._extractKnownObjectFields(sourceObject,objectMode.schema):sourceObject;const nestedResult=objectMode.schema._validateWithOperation(settings.operationName,settings.operation,nestedInput,buildNestedOptions(options,fieldPath));setOwnProperty(currentObject,containerKey,objectMode.allowAdditionalProperties?this._mergeKnownAndPassthroughObjectFields(sourceObject,objectMode.schema,nestedResult.validatedObject):nestedResult.validatedObject);return prefixErrorMap(nestedResult.errors,fieldPath)}_extractKnownObjectFields(sourceObject,nestedSchema){const knownObject={};for(const[key,value]of Object.entries(sourceObject))if(Object.hasOwn(nestedSchema.structure,key))setOwnProperty(knownObject,key,value);return knownObject}_mergeKnownAndPassthroughObjectFields(sourceObject,nestedSchema,validatedObject){const mergedObject={};for(const key of Object.keys(sourceObject)){if(!Object.hasOwn(nestedSchema.structure,key)){setOwnProperty(mergedObject,key,sourceObject[key]);continue}if(Object.hasOwn(validatedObject,key))setOwnProperty(mergedObject,key,validatedObject[key])}for(const[key,value]of Object.entries(validatedObject))if(!Object.hasOwn(mergedObject,key))setOwnProperty(mergedObject,key,value);return mergedObject}_validateObjectValues(fieldPath,currentObject,containerKey,valuesConfig,options,settings){const originalEntries=currentObject[containerKey];const normalizedEntries={...originalEntries};const errors={};setOwnProperty(currentObject,containerKey,normalizedEntries);for(const key of Object.keys(originalEntries)){const valuePath=joinPath(fieldPath,key);if(this._fieldToBeSkipped(valuePath,options))continue;const rawValue=normalizedEntries[key];if(rawValue===void 0){if(settings.rejectExplicitUndefined)this._mergeErrors(errors,this._singleErrorMap(this._typeError(valuePath).errorObject));else delete normalizedEntries[key];continue}if(valuesConfig.kind===`schema`){const valueResult=valuesConfig.schema._validateWithOperation(`replace`,valuesConfig.schema.operations.replace,rawValue,buildNestedOptions(options,valuePath));setOwnProperty(normalizedEntries,key,valueResult.validatedObject);this._mergeErrors(errors,prefixErrorMap(valueResult.errors,valuePath));continue}const valueErrors=this._normalizeAndValidateValue(valuesConfig.definition,rawValue,valuePath,normalizedEntries,key,originalEntries,options,this._buildArrayItemSettings(valuesConfig.definition,settings));this._mergeErrors(errors,valueErrors)}return errors}_validateArrayItems(fieldPath,currentObject,containerKey,itemsConfig,options,settings){const originalItems=currentObject[containerKey];const normalizedItems=originalItems.slice();const errors={};setOwnProperty(currentObject,containerKey,normalizedItems);for(let index=0;index<normalizedItems.length;index++){const itemPath=joinPath(fieldPath,index);if(this._fieldToBeSkipped(itemPath,options))continue;if(!Object.hasOwn(originalItems,index)||normalizedItems[index]===void 0){if(settings.rejectExplicitUndefined)this._mergeErrors(errors,this._singleErrorMap(this._typeError(itemPath).errorObject));else delete normalizedItems[index];continue}if(itemsConfig.kind===`schema`){const itemResult=itemsConfig.schema._validateWithOperation(`replace`,itemsConfig.schema.operations.replace,normalizedItems[index],buildNestedOptions(options,itemPath));setOwnProperty(normalizedItems,index,itemResult.validatedObject);this._mergeErrors(errors,prefixErrorMap(itemResult.errors,itemPath));continue}const itemErrors=this._normalizeAndValidateValue(itemsConfig.definition,normalizedItems[index],itemPath,normalizedItems,index,originalItems,options,this._buildArrayItemSettings(itemsConfig.definition,settings));this._mergeErrors(errors,itemErrors)}return errors}_validateField(fieldName,object,validatedObject,options,settings){if(!Object.hasOwn(this.structure,fieldName))return{};const definition=this.structure[fieldName];if(this._fieldToBeSkipped(fieldName,options))return{};const fieldPresent=settings.isFieldPresent(fieldName);const rawValue=object[fieldName];const valueMissing=rawValue===void 0;if(settings.enforceRequired&&definition.required&&(!fieldPresent||valueMissing)){if(!this._paramToBeSkipped(`required`,options.skipParams,fieldName))return this._singleErrorMap({field:fieldName,code:`REQUIRED`,message:`Field is required`,params:{}})}if(!fieldPresent)return{};if(valueMissing){if(settings.rejectExplicitUndefined)return this._singleErrorMap(this._typeError(fieldName).errorObject);return{}}return this._normalizeAndValidateValue(definition,rawValue,fieldName,validatedObject,fieldName,object,options,settings)}_validateWithOperation(operationName,operation,object,options){this._assertSupportedOptions(options);const errors={};const workingObject={...object};const settings=this._buildOperationSettings(operationName,operation,object);for(const fieldName of Object.keys(object))if(!Object.hasOwn(this.structure,fieldName))setOwnProperty(errors,fieldName,{field:fieldName,code:`FIELD_NOT_ALLOWED`,message:`Field not allowed`,params:{}});for(const fieldName of settings.targetFieldNames){const fieldErrors=this._validateField(fieldName,object,workingObject,options,settings);this._mergeErrors(errors,fieldErrors)}if(settings.applyDefaults)for(const fieldName of Object.keys(this.structure)){if(settings.isFieldPresent(fieldName))continue;if(this.structure[fieldName].defaultTo!==void 0){const definition=this.structure[fieldName];const defaultValue=typeof definition.defaultTo===`function`?definition.defaultTo():definition.defaultTo;const defaultResult=this._normalizeDefault(definition,defaultValue,{fieldPath:fieldName,currentObject:workingObject,containerKey:fieldName,objectBeforeCast:object,options,settings});this._mergeErrors(errors,defaultResult.errors);if(Object.keys(defaultResult.errors).length>0)continue;setOwnProperty(workingObject,fieldName,defaultResult.value);settings.defaultedFields.add(fieldName)}}return{validatedObject:this._buildOperationResult(object,workingObject,settings),errors}}_validateSelectedTree(selectionTree,object,options,settings,basePath=``){const errors={};const validatedObject={};for(const fieldName of sortSelectionKeys(Object.keys(selectionTree))){const fieldPath=buildFieldPath(basePath,fieldName);if(!Object.hasOwn(this.structure,fieldName))throw new Error(`Unknown schema path "${fieldPath}".`);const fieldErrors=this._validateSelectedField(fieldName,selectionTree[fieldName],object,validatedObject,options,settings,fieldPath);this._mergeErrors(errors,fieldErrors)}return{validatedObject,errors}}_validateSelectedField(fieldName,selectionNode,object,validatedObject,options,settings,fieldPath){if(!Object.hasOwn(this.structure,fieldName))return{};const definition=this.structure[fieldName];const exactSelected=selectionNode.self===true;const hasChildren=hasSelectionChildren(selectionNode);if(this._fieldToBeSkipped(fieldPath,options))return{};const fieldPresent=Object.hasOwn(object,fieldName);const rawValue=object[fieldName];const errors={};if(!fieldPresent){if(exactSelected&&settings.enforceRequired&&definition.required&&!this._paramToBeSkipped(`required`,options.skipParams,fieldPath))this._mergeErrors(errors,this._singleErrorMap({field:fieldPath,code:`REQUIRED`,message:`Field is required`,params:{}}));if(exactSelected&&settings.applyDefaults&&definition.defaultTo!==void 0){const defaultValue=typeof definition.defaultTo===`function`?definition.defaultTo():definition.defaultTo;const defaultResult=this._normalizeDefault(definition,defaultValue,{fieldPath,currentObject:validatedObject,containerKey:fieldName,objectBeforeCast:object,options,settings});this._mergeErrors(errors,defaultResult.errors);if(Object.keys(defaultResult.errors).length===0)setOwnProperty(validatedObject,fieldName,defaultResult.value)}return errors}if(rawValue===void 0){if(exactSelected&&settings.rejectExplicitUndefined)return this._singleErrorMap(this._typeError(fieldPath).errorObject);return{}}const currentObject={[fieldName]:rawValue};if(exactSelected){const fieldErrors=this._normalizeAndValidateValue(definition,rawValue,fieldPath,currentObject,fieldName,object,options,settings);if(Object.hasOwn(currentObject,fieldName)&&currentObject[fieldName]!==void 0)setOwnProperty(validatedObject,fieldName,currentObject[fieldName]);else if(currentObject[fieldName]===null)setOwnProperty(validatedObject,fieldName,null);return fieldErrors}if(!hasChildren)return{};const castResult=this._castValue(definition,rawValue,fieldPath,currentObject,fieldName,object,options,settings);if(Object.keys(castResult.errors).length>0)return castResult.errors;if(!castResult.shouldContinue)return{};const nestedResult=this._validateSelectedDescendants(definition,selectionNode.children,fieldPath,currentObject,fieldName,options,settings);if(hasSelectedValue(currentObject[fieldName]))setOwnProperty(validatedObject,fieldName,currentObject[fieldName]);return nestedResult}_validateSelectedDescendants(definition,selectionTree,fieldPath,currentObject,containerKey,options,settings){if(definition.type===`object`){const objectMode=this._resolveObjectFieldMode(fieldPath,definition);if(objectMode.kind!==`nested`)throw new Error(`Schema path "${fieldPath}" does not support nested field selection.`);const nestedValue=currentObject[containerKey];if(!isPlainObject(nestedValue))return{};const nestedResult=objectMode.schema._validateSelectedTree(selectionTree,nestedValue,buildNestedOptions(options,fieldPath),{...settings,defaultedFields:new Set});setOwnProperty(currentObject,containerKey,nestedResult.validatedObject);return prefixErrorMap(nestedResult.errors,fieldPath)}if(definition.type===`array`){const itemsConfig=this._resolveArrayItemsConfig(fieldPath,definition);if(!itemsConfig)throw new Error(`Schema path "${fieldPath}" does not define array items for nested selection.`);return this._validateSelectedArrayItems(fieldPath,currentObject,containerKey,itemsConfig,selectionTree,options,settings)}throw new Error(`Schema path "${fieldPath}" does not support nested field selection.`)}_validateSelectedArrayItems(fieldPath,currentObject,containerKey,itemsConfig,selectionTree,options,settings){const normalizedItems=[];const sourceItems=currentObject[containerKey];const errors={};setOwnProperty(currentObject,containerKey,normalizedItems);for(const indexKey of sortSelectionKeys(Object.keys(selectionTree))){if(!/^[0-9]+$/.test(indexKey))throw new Error(`Schema path "${joinPath(fieldPath,indexKey)}" is invalid because array segments must use numeric indexes.`);const index=Number(indexKey);const itemPath=joinPath(fieldPath,index);const selectionNode=selectionTree[indexKey];const exactSelected=selectionNode.self===true;const hasChildren=hasSelectionChildren(selectionNode);if(this._fieldToBeSkipped(itemPath,options))continue;if(!Object.hasOwn(sourceItems,index)){if(exactSelected&&settings.rejectExplicitUndefined)setOwnProperty(errors,itemPath,this._typeError(itemPath).errorObject);continue}const rawValue=sourceItems[index];if(rawValue===void 0){if(exactSelected&&settings.rejectExplicitUndefined)setOwnProperty(errors,itemPath,this._typeError(itemPath).errorObject);continue}if(itemsConfig.kind===`schema`){if(exactSelected){const itemResult=itemsConfig.schema._validateWithOperation(`replace`,itemsConfig.schema.operations.replace,rawValue,buildNestedOptions(options,itemPath));if(hasSelectedValue(itemResult.validatedObject))setOwnProperty(normalizedItems,index,itemResult.validatedObject);this._mergeErrors(errors,prefixErrorMap(itemResult.errors,itemPath));continue}if(!hasChildren)continue;const itemResult=itemsConfig.schema._validateSelectedTree(selectionNode.children,rawValue,buildNestedOptions(options,itemPath),{...settings,operationName:`replace`,operation:itemsConfig.schema.operations.replace,defaultedFields:new Set});if(hasSelectedValue(itemResult.validatedObject))setOwnProperty(normalizedItems,index,itemResult.validatedObject);this._mergeErrors(errors,prefixErrorMap(itemResult.errors,itemPath));continue}const itemSettings=this._buildArrayItemSettings(itemsConfig.definition,settings);const itemHolder=[rawValue];if(exactSelected){const itemErrors=this._normalizeAndValidateValue(itemsConfig.definition,rawValue,itemPath,itemHolder,0,sourceItems,options,itemSettings);if(Object.hasOwn(itemHolder,0)&&itemHolder[0]!==void 0)setOwnProperty(normalizedItems,index,itemHolder[0]);else if(itemHolder[0]===null)setOwnProperty(normalizedItems,index,null);this._mergeErrors(errors,itemErrors);continue}if(!hasChildren)continue;const castResult=this._castValue(itemsConfig.definition,rawValue,itemPath,itemHolder,0,sourceItems,options,itemSettings);if(Object.keys(castResult.errors).length>0){this._mergeErrors(errors,castResult.errors);continue}if(!castResult.shouldContinue)continue;const itemErrors=this._validateSelectedDescendants(itemsConfig.definition,selectionNode.children,itemPath,itemHolder,0,options,itemSettings);if(hasSelectedValue(itemHolder[0]))setOwnProperty(normalizedItems,index,itemHolder[0]);this._mergeErrors(errors,itemErrors)}return errors}validateWith(operationName,object,options={}){if(!Object.hasOwn(this.operations,operationName))throw new Error(`Unknown operation "${operationName}".`);const operation=this.operations[operationName];this._assertPlainObjectInput(operationName,object);return this._validateWithOperation(operationName,operation,object,options)}validateAt(path,object,options={}){this._assertPlainObjectInput(`validateAt`,object);const pathSegments=buildPathSegments(path);const{operationName,operation,validationOptions}=this._resolvePathValidationRequest(options);const result=this._validateSelectedTree(buildSelectionTree([path]),object,validationOptions,this._buildOperationSettings(operationName,operation,object));return{validatedValue:getValueAtPath(result.validatedObject,pathSegments),errors:result.errors}}validatePaths(paths,object,options={}){this._assertPlainObjectInput(`validatePaths`,object);if(!Array.isArray(paths)||paths.length===0)throw new Error(`validatePaths() expects a non-empty array of schema paths.`);const{operationName,operation,validationOptions}=this._resolvePathValidationRequest(options);return this._validateSelectedTree(buildSelectionTree(paths),object,validationOptions,this._buildOperationSettings(operationName,operation,object))}_installOperationMethods(){for(const operationName of Object.keys(this.operations)){if(operationName in this)throw new Error(`Operation name "${operationName}" is reserved and cannot be used as a schema method.`);this[operationName]=(object,options={})=>this.validateWith(operationName,object,options)}}toJsonSchema(options={}){return buildJsonSchema(this,options)}getFieldDefinitions(){return createIntrospectionSnapshot(this.structure)}getFieldDefinition(path){if(typeof path!==`string`||path.trim()===``)throw new Error(`Field path must be a non-empty string.`);const definition=resolveDefinitionFromSchemaPath(this,buildPathSegments(path.trim()));return definition===null?null:createIntrospectionSnapshot(definition)}getFieldMessages(path){const definition=this.getFieldDefinition(path);if(!definition||typeof definition.messages!==`object`||definition.messages===null)return Object.freeze({});return createIntrospectionSnapshot(definition.messages)}cleanup(object,parameterName){const newObject={};for(const k of Object.keys(object))if(Object.hasOwn(this.structure,k)&&this.structure[k][parameterName])setOwnProperty(newObject,k,object[k]);return newObject}};var{parse:$parse,stringify:$stringify}=JSON;var{keys}=Object;var Primitive=String;var primitive=`string`;var object=`object`;var noop=(_,value)=>value;var set=(known,input,value)=>{const index=Primitive(input.push(value)-1);known.set(value,index);return index};var stringify=(value,replacer,space)=>{const $=replacer&&typeof replacer===object?(k,v)=>k===``||-1<replacer.indexOf(k)?v:void 0:replacer||noop;const known=new Map;const input=[];const output=[];let i=+set(known,input,$.call({"":value},``,value));let firstRun=!i;while(i<input.length){firstRun=true;output[i]=$stringify(input[i++],replace,space)}return`[`+output.join(`,`)+`]`;function replace(key,value){if(firstRun){firstRun=!firstRun;return value}const after=$.call(this,key,value);switch(typeof after){case object:if(after===null)return after;case primitive:return known.get(after)||set(known,input,after)}return after}};var DEFAULT_BOOLEAN_TRUE_VALUES=new Set([`true`,`1`,`yes`,`y`,`on`]);var DEFAULT_BOOLEAN_FALSE_VALUES=new Set([`false`,`0`,`no`,`n`,`off`]);function isThenable(value){return value!==null&&(typeof value===`object`||typeof value===`function`)&&typeof value.then===`function`}function normalizeFiniteNumberInput(value){if(typeof value===`number`)return Number.isFinite(value)?value:null;if(typeof value===`bigint`){const numberValue=Number(value);return Number.isSafeInteger(numberValue)?numberValue:null}if(typeof value===`string`){const trimmed=value.trim();if(trimmed===``)return null;const numberValue=Number(trimmed);return Number.isFinite(numberValue)?numberValue:null}return null}function deepEqual(left,right){if(Object.is(left,right))return true;if(left instanceof Date&&right instanceof Date)return left.getTime()===right.getTime();if(left instanceof RegExp&&right instanceof RegExp)return left.source===right.source&&left.flags===right.flags;if(Array.isArray(left)||Array.isArray(right)){if(!Array.isArray(left)||!Array.isArray(right))return false;if(left.length!==right.length)return false;for(let index=0;index<left.length;index++)if(!deepEqual(left[index],right[index]))return false;return true}if(left===null||right===null||typeof left!==`object`||typeof right!==`object`)return false;if(Object.getPrototypeOf(left)!==Object.getPrototypeOf(right))return false;const leftKeys=Object.keys(left);const rightKeys=Object.keys(right);if(leftKeys.length!==rightKeys.length)return false;for(const key of leftKeys){if(!Object.hasOwn(right,key))return false;if(!deepEqual(left[key],right[key]))return false}return true}var CorePlugin={install(api){const{addType,addValidator}=api;addType(`none`,context=>context.value);addType(`file`,context=>{const val=context.value;if(val===void 0||val===null)context.throwTypeError();const valType=typeof val;if(valType===`string`||valType===`number`||valType===`boolean`){const s=val.toString();return context.definition.noTrim?s:s.trim()}context.throwTypeError()});addType(`string`,context=>{const val=context.value;if(val===void 0||val===null)return``;const valType=typeof val;if(valType===`string`||valType===`number`||valType===`boolean`){const s=val.toString();return context.definition.noTrim?s:s.trim()}context.throwTypeError()});addType(`blob`,context=>context.value);addType(`number`,context=>{const numberValue=normalizeFiniteNumberInput(context.value);if(numberValue===null)context.throwTypeError();return numberValue});addType(`integer`,context=>{const numberValue=normalizeFiniteNumberInput(context.value);if(numberValue===null||!Number.isInteger(numberValue))context.throwTypeError();return numberValue});addType(`epochMilliseconds`,context=>{const epochMilliseconds=castEpochInteger(context.value,EPOCH_MILLISECONDS_LIMIT);if(epochMilliseconds===null)context.throwTypeError();return epochMilliseconds});addType(`epochSeconds`,context=>{const epochSeconds=castEpochInteger(context.value,EPOCH_SECONDS_LIMIT);if(epochSeconds===null)context.throwTypeError();return epochSeconds});addType(`dateTime`,context=>{const temporalPrecision=resolveTemporalPrecision(context.definition,context.fieldName);if(!isValidDateTime(context.value,temporalPrecision))context.throwTypeError();return context.value});addType(`date`,context=>{if(!isValidDate(context.value))context.throwTypeError();return context.value});addType(`time`,context=>{const temporalPrecision=resolveTemporalPrecision(context.definition,context.fieldName);if(!isValidTime(context.value,temporalPrecision))context.throwTypeError();return context.value});addType(`array`,context=>{if(context.definition.type===`array`&&!Array.isArray(context.value))return[context.value];return context.value});addType(`object`,context=>{if(!isPlainObject(context.value))context.throwTypeError();return context.value});addType(`serialize`,context=>{try{return JSON.stringify(context.value)}catch(e){try{return stringify(context.value)}catch(e2){context.throwTypeError()}}});addType(`boolean`,context=>{if(typeof context.value===`boolean`)return context.value;if(typeof context.value===`number`){if(context.value===1)return true;if(context.value===0)return false;context.throwTypeError()}if(typeof context.value===`bigint`){if(context.value===1n)return true;if(context.value===0n)return false;context.throwTypeError()}if(typeof context.value===`string`){const falseVal=String(context.definition.stringFalseWhen||`false`).trim().toLowerCase();const trueVal=String(context.definition.stringTrueWhen||`true`).trim().toLowerCase();const lowerValue=context.value.trim().toLowerCase();const falseValues=new Set([...DEFAULT_BOOLEAN_FALSE_VALUES,falseVal]);const trueValues=new Set([...DEFAULT_BOOLEAN_TRUE_VALUES,trueVal]);if(falseValues.has(lowerValue))return false;if(trueValues.has(lowerValue))return true}context.throwTypeError()});addType(`id`,context=>{if(typeof context.value===`number`){if(Number.isSafeInteger(context.value)&&context.value>0)return context.value;context.throwTypeError()}if(typeof context.value===`bigint`){if(context.value>0n&&context.value<=BigInt(Number.MAX_SAFE_INTEGER))return Number(context.value);context.throwTypeError()}if(typeof context.value===`string`){const trimmed=context.value.trim();if(!/^[1-9][0-9]*$/.test(trimmed))context.throwTypeError();const numberValue=Number(trimmed);if(!Number.isSafeInteger(numberValue))context.throwTypeError();return numberValue}context.throwTypeError()});addValidator(`minLength`,context=>{if(context.value===void 0)return;if(context.definition.type===`string`&&context.value.toString&&context.value.toString().length<context.parameterValue)context.throwParamError(`MIN_LENGTH`,`Length must be at least ${context.parameterValue} characters.`,{min:context.parameterValue,actual:context.value.toString().length})});addValidator(`min`,context=>{if(context.value===void 0)return;if(isNumericDefinition(context.definition)&&typeof context.value===`number`&&context.value<context.parameterValue)context.throwParamError(`MIN_VALUE`,`Value must be at least ${context.parameterValue}.`,{min:context.parameterValue,actual:context.value})});addValidator(`maxLength`,context=>{if(context.value===void 0)return;if(context.definition.type===`string`&&context.value.toString&&context.value.toString().length>context.parameterValue)context.throwParamError(`MAX_LENGTH`,`Length must be no more than ${context.parameterValue} characters.`,{max:context.parameterValue,actual:context.value.toString().length})});addValidator(`max`,context=>{if(context.value===void 0)return;if(isNumericDefinition(context.definition)&&typeof context.value===`number`&&context.value>context.parameterValue)context.throwParamError(`MAX_VALUE`,`Value must be no more than ${context.parameterValue}.`,{max:context.parameterValue,actual:context.value})});addValidator(`enum`,context=>{if(!Array.isArray(context.parameterValue))throw new Error(`Enum for ${context.fieldName} must be an array.`);if(!context.parameterValue.some(allowedValue=>deepEqual(allowedValue,context.value)))context.throwParamError(`ENUM_VALUE`,`Value must match one of the allowed enum values.`,{allowed:context.parameterValue})});addValidator(`pattern`,context=>{if(context.value===void 0)return;if(context.definition.type!==`string`||typeof context.value!==`string`)return;const patternValue=context.parameterValue;const matcher=patternValue instanceof RegExp?new RegExp(patternValue.source,patternValue.flags):typeof patternValue===`string`?new RegExp(patternValue):null;if(!matcher)throw new Error(`Pattern for ${context.fieldName} must be a string or RegExp.`);if(!matcher.test(context.value))context.throwParamError(`PATTERN`,`Value does not match the required pattern.`,{pattern:matcher.source})});addValidator(`strictBoolean`,context=>{if(!context.parameterValue)return;if(context.definition.type!==`boolean`)throw new Error(`strictBoolean can only be used on boolean fields (${context.fieldName}).`);if(typeof context.valueBeforeCast!==`boolean`)context.throwParamError(`STRICT_BOOLEAN`,`Value must be a boolean.`)});addValidator(`validator`,context=>{if(typeof context.parameterValue!==`function`)throw new Error(`Validator for ${context.fieldName} must be a function.`);const r=context.parameterValue(context.value,context.object,context);if(isThenable(r))throw new Error(`Custom validator for "${context.fieldName}" must be synchronous.`);if(typeof r===`string`)context.throwParamError(`CUSTOM_VALIDATOR_FAILED`,r)});addValidator(`uppercase`,context=>{if(typeof context.value===`string`)return context.value.toUpperCase()});addValidator(`lowercase`,context=>{if(typeof context.value===`string`)return context.value.toLowerCase()});addValidator(`length`,context=>{if(typeof context.value===`string`)return context.value.substr(0,context.parameterValue);else if(Number.isInteger(Number(context.valueBeforeCast))&&String(context.valueBeforeCast).length>context.parameterValue)context.throwParamError(`RANGE_EXCEEDED`,`Numeric value is out of the allowed character range.`,{max:context.parameterValue,actual:String(context.valueBeforeCast).length})});addValidator(`notEmpty`,context=>{if(context.parameterValue&&typeof context.value===`string`&&context.value===``)context.throwParamError(`NOT_EMPTY`,`Field cannot be empty.`)});addValidator(`required`,()=>{});addValidator(`unsigned`,()=>{});addValidator(`precision`,()=>{});addValidator(`scale`,()=>{});addValidator(`temporalPrecision`,context=>{if(context.definition.type!==`time`&&context.definition.type!==`dateTime`)throw new Error(`temporalPrecision can only be used on time or dateTime fields (${context.fieldName}).`)});addValidator(`nullable`,()=>{});addValidator(`nullOnEmpty`,()=>{});addValidator(`defaultTo`,()=>{})}};var factoryTypesBySource=new WeakMap;var factoryValidatorsBySource=new WeakMap;var registryMetadataSymbol=Symbol.for(`json-rest-schema.registry-metadata`);function registerTypeHandler(types,name,handler){if(typeof handler!==`function`)throw new Error(`Type handler for '${name}' must be a function.`);setOwnProperty(types,name,handler)}function registerValidatorHandler(validators,name,handler){if(typeof handler!==`function`)throw new Error(`Validator handler for '${name}' must be a function.`);setOwnProperty(validators,name,handler)}function createHandlerRegistry(source={}){const registry=Object.create(null);for(const[name,handler]of Object.entries(source))setOwnProperty(registry,name,handler);return registry}function installPlugin(plugin,api){if(typeof plugin.install!==`function`)throw new Error(`Plugin must have an install method.`);plugin.install(api)}function attachRegistryMetadata(target,types,validators){factoryTypesBySource.set(target,types);factoryValidatorsBySource.set(target,validators);Object.defineProperty(target,registryMetadataSymbol,{value:Object.freeze({getTypes:()=>types,getValidators:()=>validators}),enumerable:false,configurable:false,writable:false})}function extractRegistryMetadata(source){if(!source||typeof source!==`object`&&typeof source!==`function`)return null;const types=factoryTypesBySource.get(source);const validators=factoryValidatorsBySource.get(source);if(types&&validators)return{types,validators};const symbolMetadata=source[registryMetadataSymbol];if(symbolMetadata&&typeof symbolMetadata.getTypes===`function`&&typeof symbolMetadata.getValidators===`function`)return{types:symbolMetadata.getTypes(),validators:symbolMetadata.getValidators()};if(typeof source===`object`&&source.types&&typeof source.types===`object`&&source.validators&&typeof source.validators===`object`&&typeof source.create===`function`&&typeof source.replace===`function`&&typeof source.patch===`function`&&typeof source.toJsonSchema===`function`)return{types:source.types,validators:source.validators};return null}function normalizeFactorySources(sources){if(sources.length===1&&Array.isArray(sources[0]))return sources[0];return sources}function areEquivalentHandlers(left,right){return left===right}function mergeRegistryHandlers(target,source,kind){for(const[name,handler]of Object.entries(source)){if(Object.hasOwn(target,name)&&!areEquivalentHandlers(target[name],handler))throw new Error(`Cannot merge schema factories with conflicting ${kind} "${name}".`);setOwnProperty(target,name,handler)}}function resolveMergedRegistries(fallbackTypes,fallbackValidators,sources){const normalizedSources=normalizeFactorySources(sources).filter(Boolean);if(normalizedSources.length<1)return{types:createHandlerRegistry(fallbackTypes),validators:createHandlerRegistry(fallbackValidators)};const mergedTypes=Object.create(null);const mergedValidators=Object.create(null);for(const source of normalizedSources){const metadata=extractRegistryMetadata(source);if(!metadata)throw new Error(`Factory sources must be schema instances or schema factories created by json-rest-schema.`);mergeRegistryHandlers(mergedTypes,metadata.types,`type`);mergeRegistryHandlers(mergedValidators,metadata.validators,`validator`)}return{types:mergedTypes,validators:mergedValidators}}function createSchemaFactory({types={},validators={},installCore=true}={}){const factoryTypes=createHandlerRegistry(types);const factoryValidators=createHandlerRegistry(validators);const factory=(structure,options={})=>{const schema=new Schema(structure,factoryTypes,factoryValidators,options.operations);attachRegistryMetadata(schema,factoryTypes,factoryValidators);return schema};attachRegistryMetadata(factory,factoryTypes,factoryValidators);factory.addType=(name,handler)=>{registerTypeHandler(factoryTypes,name,handler)};factory.addValidator=(name,handler)=>{registerValidatorHandler(factoryValidators,name,handler)};factory.use=plugin=>{installPlugin(plugin,{addType:factory.addType,addValidator:factory.addValidator})};factory.createFactory=(...sources)=>{const mergedRegistries=resolveMergedRegistries(factoryTypes,factoryValidators,sources);return createSchemaFactory({types:mergedRegistries.types,validators:mergedRegistries.validators,installCore:false})};if(installCore)factory.use(CorePlugin);return factory}var createSchema=createSchemaFactory({installCore:true});var JSON_REST_SCHEMA_MODES=new Set([`create`,`replace`,`patch`]);var JSON_REST_SCHEMA_ERROR_MESSAGE_KEYS=Object.freeze({REQUIRED:`required`,TYPE_CAST_FAILED:`default`,NOT_NULLABLE:`default`,MIN_LENGTH:`minLength`,MAX_LENGTH:`maxLength`,MIN_VALUE:`min`,MAX_VALUE:`max`,PATTERN:`pattern`,ENUM_VALUE:`enum`,FIELD_NOT_ALLOWED:`additionalProperties`,CUSTOM_VALIDATOR_FAILED:`default`});function isJsonRestSchemaInstance(value){return Boolean(value)&&typeof value===`object`&&typeof value.create===`function`&&typeof value.replace===`function`&&typeof value.patch===`function`&&typeof value.toJsonSchema===`function`}function requireJsonRestSchemaInstance(schemaDefinition=null,{context=`schema definition.schema`}={}){const schema=normalizeObject(schemaDefinition).schema;if(!isJsonRestSchemaInstance(schema))throw new TypeError(`${context} must be a json-rest-schema schema instance.`);return schema}function resolveSchemaDefinitionMode(schemaDefinition=null,{defaultMode=`create`,context=`schema definition.mode`}={}){const source=normalizeObject(schemaDefinition);const fallbackMode=normalizeText(defaultMode).toLowerCase()||`create`;const rawMode=Object.prototype.hasOwnProperty.call(source,`mode`)?normalizeText(source.mode).toLowerCase():``;if(!rawMode)return fallbackMode;if(!JSON_REST_SCHEMA_MODES.has(rawMode))throw new TypeError(`${context} must be one of: create, replace, patch.`);return rawMode}function resolveSchemaDefinitionTransportSchema(schemaDefinition=null,options={}){const schema=requireJsonRestSchemaInstance(schemaDefinition,{context:`${options?.context||`schema definition`}.schema`});const mode=resolveSchemaDefinitionMode(schemaDefinition,options);return schema.toJsonSchema({mode})}function executeSchemaDefinition(schemaDefinition=null,payload,options={}){return requireJsonRestSchemaInstance(schemaDefinition,{context:`${options?.context||`schema definition`}.schema`})[resolveSchemaDefinitionMode(schemaDefinition,options)](payload)}function resolveJsonRestSchemaFieldMessages(schemaDefinition=null,fieldName=``){const normalizedFieldName=normalizeText(fieldName);if(!normalizedFieldName)return{};const source=normalizeObject(schemaDefinition);if(!isJsonRestSchemaInstance(source.schema))return{};return normalizeObject(source.schema.getFieldMessages(normalizedFieldName))}function resolveJsonRestSchemaParentFieldMessages(schemaDefinition=null,fieldName=``){const segments=normalizeText(fieldName).split(`.`).filter(Boolean);if(segments.length<2)return{};segments.pop();return resolveJsonRestSchemaFieldMessages(schemaDefinition,segments.join(`.`))}function resolveJsonRestSchemaFieldErrorMessage(fieldName,entry,schemaDefinition=null){const errorCode=normalizeText(entry?.code).toUpperCase();const directMessages=resolveJsonRestSchemaFieldMessages(schemaDefinition,fieldName);const messages=errorCode===`FIELD_NOT_ALLOWED`&&Object.keys(directMessages).length<1?resolveJsonRestSchemaParentFieldMessages(schemaDefinition,fieldName):directMessages;const messageKey=JSON_REST_SCHEMA_ERROR_MESSAGE_KEYS[errorCode];if(messageKey&&typeof messages[messageKey]===`string`){const overrideMessage=normalizeText(messages[messageKey]);if(overrideMessage)return overrideMessage}if(typeof messages.default===`string`){const defaultMessage=normalizeText(messages.default);if(defaultMessage)return defaultMessage}return normalizeText(entry?.message||entry?.code||`Invalid value.`)}function normalizeJsonRestSchemaFieldErrors(errors={},schemaDefinition=null){const source=normalizeObject(errors);const fieldErrors={};for(const[fieldName,entry]of Object.entries(source)){const normalizedFieldName=normalizeText(fieldName);if(!normalizedFieldName)continue;if(typeof entry===`string`){fieldErrors[normalizedFieldName]=entry;continue}fieldErrors[normalizedFieldName]=resolveJsonRestSchemaFieldErrorMessage(normalizedFieldName,entry,schemaDefinition)||`Invalid value.`}return fieldErrors}function isSchemaDefinitionObject(value){return Boolean(value)&&typeof value===`object`&&!Array.isArray(value)&&(Object.prototype.hasOwnProperty.call(value,`schema`)||Object.prototype.hasOwnProperty.call(value,`mode`))}function normalizeSingleSchemaDefinition(value,{context=`schema definition`,defaultMode=``}={}){if(value==null)return null;if(!isSchemaDefinitionObject(value))throw new TypeError(`${context} must be a schema definition object.`);const source=normalizeObject(value);if(!Object.prototype.hasOwnProperty.call(source,`schema`))throw new TypeError(`${context}.schema is required.`);if(!isJsonRestSchemaInstance(source.schema))throw new TypeError(`${context}.schema must be a json-rest-schema schema instance.`);const normalized={schema:source.schema};const resolvedDefaultMode=normalizeText(defaultMode).toLowerCase();normalized.mode=resolveSchemaDefinitionMode(source,{defaultMode:resolvedDefaultMode||`patch`,context:`${context}.mode`});return Object.freeze(normalized)}function normalizeSchemaDefinition(value,{context=`schema definition`,defaultMode=``}={}){return normalizeSingleSchemaDefinition(value,{context,defaultMode})}function resolveSchemaTransportSchemaDefinition(value,{context=`schema definition`,defaultMode=``}={}){const normalized=normalizeSchemaDefinition(value,{context,defaultMode});if(!normalized)return;return resolveSchemaDefinitionTransportSchema(normalized,{defaultMode:defaultMode||`patch`,context:`${context}.mode`})}function executeJsonRestSchemaDefinition(value,payload,{context=`schema definition`,defaultMode=``}={}){const normalized=normalizeSchemaDefinition(value,{context,defaultMode});if(!normalized)return null;return executeSchemaDefinition(normalized,payload,{defaultMode:defaultMode||`patch`,context:`${context}.mode`})}function createCursorListValidator(itemValidator){const itemDefinition=normalizeSingleSchemaDefinition(itemValidator,{context:`cursor list item`,defaultMode:`replace`});return deepFreeze({schema:createSchema({items:{type:`array`,required:true,items:itemDefinition.schema},nextCursor:{type:`string`,required:false,nullable:true,minLength:1}}),mode:`replace`})}var cursorPaginationQuerySchema=createSchema({cursor:{type:`id`,required:false},limit:{type:`number`,required:false,min:1,unsigned:true}});var cursorPaginationQueryValidator=Object.freeze({schema:cursorPaginationQuerySchema,mode:`patch`});var HTML_TIME_STRING_SCHEMA=Object.freeze({type:`string`,pattern:`^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$`,minLength:5});var NULLABLE_HTML_TIME_STRING_SCHEMA=Object.freeze({...HTML_TIME_STRING_SCHEMA,nullable:true});function buildSchemaValidationError({message=`Schema validation failed.`,fieldErrors=null,errors=null,cause,statusCode=null}={}){const error=new Error(message,cause?{cause}:void 0);if(Number.isInteger(statusCode)&&statusCode>=400&&statusCode<=599)error.statusCode=statusCode;if(fieldErrors&&typeof fieldErrors===`object`){error.fieldErrors=fieldErrors;error.details={...error.details||{},fieldErrors}}else if(errors!==null&&errors!==void 0)error.details={...error.details||{},errors};return error}function validateSchemaPayload(schemaDefinition,payload,{phase=`input`,context=`schema definition`,statusCode=null}={}){if(schemaDefinition==null)return payload;const result=executeJsonRestSchemaDefinition(schemaDefinition,payload,{defaultMode:phase===`output`?`replace`:`patch`,context});if(!result)throw new TypeError(`${context}.schema must be a json-rest-schema schema instance.`);const fieldErrors=normalizeJsonRestSchemaFieldErrors(result?.errors,schemaDefinition);if(Object.keys(fieldErrors).length>0)throw buildSchemaValidationError({fieldErrors,statusCode});return result?.validatedObject??payload}var RECORD_ID_PATTERN=`^[1-9][0-9]*$`;var recordIdSchema=deepFreeze({type:`string`,minLength:1,pattern:RECORD_ID_PATTERN});var nullableRecordIdSchema=deepFreeze({...recordIdSchema,nullable:true});var recordIdParamsValidator=deepFreeze({schema:createSchema({recordId:{...recordIdSchema,required:true,messages:{pattern:`Record id must be a canonical positive integer string.`}}}),mode:`patch`});var JSON_API_QUERY_PAGE_CURSOR_KEY=`page[cursor]`;var JSON_API_QUERY_PAGE_LIMIT_KEY=`page[limit]`;var JSON_API_QUERY_INCLUDE_KEY=`include`;var JSON_API_QUERY_SORT_KEY=`sort`;var JSON_API_FILTER_PREFIX=`filter[`;var JSON_API_FIELDS_PREFIX=`fields[`;function isRecord$2(value){return Boolean(value)&&typeof value===`object`&&!Array.isArray(value)}function normalizeQueryKey(key=``){return String(key||``).trim()}function buildFieldsTransportKey(responseType=``){const normalizedResponseType=normalizeText(responseType);return normalizedResponseType?`${JSON_API_FIELDS_PREFIX}${normalizedResponseType}]`:``}function parseFieldsTransportType(key=``){const normalizedKey=normalizeQueryKey(key);if(!normalizedKey.startsWith(JSON_API_FIELDS_PREFIX)||!normalizedKey.endsWith(`]`))return``;return normalizeText(normalizedKey.slice(7,-1))}function addJsonApiFieldset(fieldsets,type=``,value=[]){const normalizedType=normalizeText(type);const fields=normalizeJsonApiFieldList(value);if(!normalizedType||fields.length<1)return;fieldsets.set(normalizedType,normalizeJsonApiFieldList([...fieldsets.get(normalizedType)||[],...fields]))}function createJsonApiFieldsTransportValueSchema(){return{anyOf:[{type:`string`,minLength:1},{type:`array`,minItems:1,items:{type:`string`,minLength:1}}]}}function mapPlainQueryKeyToTransportKey(key=``,{responseType=``}={}){const normalizedKey=normalizeQueryKey(key);if(!normalizedKey)return``;if(normalizedKey===`cursor`)return JSON_API_QUERY_PAGE_CURSOR_KEY;if(normalizedKey===`limit`)return JSON_API_QUERY_PAGE_LIMIT_KEY;if(normalizedKey===`q`)return`${JSON_API_FILTER_PREFIX}q]`;if(normalizedKey===`include`)return JSON_API_QUERY_INCLUDE_KEY;if(normalizedKey===`sort`)return JSON_API_QUERY_SORT_KEY;if(normalizedKey===`fields`)return buildFieldsTransportKey(responseType);return`${JSON_API_FILTER_PREFIX}${normalizedKey}]`}function mapTransportQueryKeyToPlainKey(key=``,{responseType=``}={}){const normalizedKey=normalizeQueryKey(key);if(!normalizedKey)return``;if(normalizedKey===`page[cursor]`)return`cursor`;if(normalizedKey===`page[limit]`)return`limit`;if(normalizedKey===`include`)return`include`;if(normalizedKey===`sort`)return`sort`;if(normalizedKey===`${JSON_API_FILTER_PREFIX}q]`)return`q`;const fieldsTransportKey=buildFieldsTransportKey(responseType);if(fieldsTransportKey&&normalizedKey===fieldsTransportKey)return`fields`;if(normalizedKey.startsWith(JSON_API_FILTER_PREFIX)&&normalizedKey.endsWith(`]`))return normalizedKey.slice(7,-1);if(normalizedKey.startsWith(JSON_API_FIELDS_PREFIX)&&normalizedKey.endsWith(`]`))return`fields`;return normalizedKey}function normalizeTransportQueryScalar(value){if(Array.isArray(value)){const normalizedValues=value.map(entry=>String(entry??``).trim()).filter(Boolean);if(normalizedValues.length<1)return``;return normalizedValues.join(`,`)}return String(value??``).trim()}function encodeJsonApiResourceQueryObject(query={},{responseType=``}={}){if(!isRecord$2(query))return Object.freeze({});const source=normalizeObject(query);const encoded={};for(const[rawKey,rawValue]of Object.entries(source)){if(normalizeQueryKey(rawKey)===`fields`){for(const[type,fields]of Object.entries(normalizeJsonApiFieldsets(rawValue,{primaryType:responseType})))encoded[buildFieldsTransportKey(type)]=fields.join(`,`);continue}const transportKey=mapPlainQueryKeyToTransportKey(rawKey,{responseType});if(!transportKey)continue;const normalizedValues=(Array.isArray(rawValue)?rawValue:[rawValue]).map(entry=>String(entry??``).trim()).filter(Boolean);if(normalizedValues.length<1)continue;encoded[transportKey]=normalizedValues.length===1?normalizedValues[0]:normalizedValues}return Object.freeze(encoded)}function decodeJsonApiResourceQueryObject(query={},{responseType=``}={}){if(!isRecord$2(query))return Object.freeze({});const source=normalizeObject(query);const decoded={};const fieldsets=new Map;for(const[rawKey,rawValue]of Object.entries(source)){if(normalizeQueryKey(rawKey)===`fields`){addJsonApiFieldset(fieldsets,responseType,rawValue);continue}const fieldsetType=parseFieldsTransportType(rawKey);if(fieldsetType){addJsonApiFieldset(fieldsets,fieldsetType,rawValue);continue}const plainKey=mapTransportQueryKeyToPlainKey(rawKey,{responseType});if(!plainKey)continue;const normalizedValue=normalizeTransportQueryScalar(rawValue);if(!normalizedValue)continue;decoded[plainKey]=normalizedValue}const normalizedFieldsets=normalizeJsonApiFieldsets(Object.fromEntries(fieldsets));if(Object.keys(normalizedFieldsets).length>0)decoded.fields=normalizedFieldsets;return Object.freeze(decoded)}function createJsonApiResourceQueryTransportSchema({query,responseType=``}={}){const transportSchema=resolveSchemaTransportSchemaDefinition(query,{context:`JSON:API resource query`,defaultMode:`patch`});if(!transportSchema||typeof transportSchema!==`object`||Array.isArray(transportSchema))throw new TypeError(`JSON:API resource query transport schema must resolve to an object schema.`);const sourceSchema=normalizeObject(transportSchema);const sourceProperties=normalizeObject(sourceSchema.properties);const properties={};const patternProperties={};for(const[plainKey,propertySchema]of Object.entries(sourceProperties)){if(plainKey===`fields`){properties.fields=createJsonApiFieldsTransportValueSchema();patternProperties[`^fields\\[[^\\[\\]]+\\]$`]=createJsonApiFieldsTransportValueSchema();continue}const transportKey=mapPlainQueryKeyToTransportKey(plainKey,{responseType});if(!transportKey)continue;properties[transportKey]=propertySchema}const schema={type:`object`,additionalProperties:false,properties};if(Object.keys(patternProperties).length>0)schema.patternProperties=patternProperties;if(isRecord$2(sourceSchema.definitions)&&Object.keys(sourceSchema.definitions).length>0)schema.definitions=normalizeObject(sourceSchema.definitions);return schema}function isRecord$1(value){return Boolean(value)&&typeof value===`object`&&!Array.isArray(value)}function normalizeTransportKind(transport=null){return String(transport?.kind||``).trim().toLowerCase()}function isJsonApiResourceTransport(transport=null){return normalizeTransportKind(transport)===`jsonapi-resource`}function normalizeJsonApiClientTransport(transport=null){if(!isJsonApiResourceTransport(transport))return null;const resolvedTypes=resolveJsonApiTransportTypes(transport,{context:`JSON:API client transport`});return Object.freeze({kind:`jsonapi-resource`,requestType:resolvedTypes.requestType,responseType:resolvedTypes.responseType,responseKind:normalizeText(transport?.responseKind,{fallback:`record`}).toLowerCase(),includeBodyId:transport?.includeBodyId===true,lookupContainerKey:normalizeText(transport?.lookupContainerKey,{fallback:`lookups`}),lookupFieldMap:Object.freeze(Object.fromEntries(Object.entries(normalizeObject(transport?.lookupFieldMap)).map(([relationshipName,fieldKey])=>[normalizeText(relationshipName),normalizeText(fieldKey)]).filter(([relationshipName,fieldKey])=>relationshipName&&fieldKey).sort(([left],[right])=>left.localeCompare(right))))})}function defaultEncodeAttributes(body={}){const attributes={...normalizeObject(body)};delete attributes.id;return attributes}function encodeJsonApiResourceRequestBody(body,transport=null){const normalizedTransport=normalizeJsonApiClientTransport(transport);if(!normalizedTransport)return body;if(!isRecord$1(body))throw new TypeError(`JSON:API resource request body must be an object.`);if(!normalizedTransport.requestType)throw new TypeError(`JSON:API resource request body requires requestType.`);const source=normalizeObject(body);return createJsonApiDocument({data:createJsonApiResourceObject({type:normalizedTransport.requestType,...normalizedTransport.includeBodyId&&source.id!=null?{id:source.id}:{},attributes:defaultEncodeAttributes(source)})})}function encodeJsonApiResourceQuery(query,transport=null){const normalizedTransport=normalizeJsonApiClientTransport(transport);if(!normalizedTransport)return query;return encodeJsonApiResourceQueryObject(query,{responseType:normalizedTransport.responseType})}function createIncludedResourceIndex(document={}){const index=new Map;for(const resource of normalizeArray(document?.included)){const type=normalizeText(resource?.type);const id=normalizeText(resource?.id);if(!type||!id)continue;index.set(`${type}:${id}`,resource)}return index}function simplifyRelationshipResource(linkage={},options={}){const normalizedLinkage=isRecord$1(linkage)?normalizeObject(linkage):{};const type=normalizeText(normalizedLinkage.type);const id=normalizeText(normalizedLinkage.id);if(!type||!id)return null;const resourceKey=`${type}:${id}`;const includedResource=options.includedResourceIndex?.get(resourceKey);if(!includedResource)return null;return simplifyResourceObject(includedResource,options)}function simplifyResourceObject(resource={},options={}){const normalizedResource=isRecord$1(resource)?normalizeObject(resource):{};const simplified=simplifyJsonApiResourceWithRelationshipIds(normalizedResource,{lookupFieldMap:options.lookupFieldMap||null});const lookupContainerKey=normalizeText(options.lookupContainerKey,{fallback:`lookups`});const lookupFieldMap=options.lookupFieldMap||null;const resourceKey=`${normalizeText(normalizedResource.type)}:${normalizeText(normalizedResource.id)}`;if(resourceKey&&options.inFlightKeys?.has(resourceKey))return simplified;if(resourceKey&&options.resourceCache?.has(resourceKey))return options.resourceCache.get(resourceKey);if(resourceKey)options.inFlightKeys?.add(resourceKey);const lookups={};for(const[relationshipName,relationshipValue]of Object.entries(normalizeObject(normalizedResource.relationships))){const relationshipData=relationshipValue?.data;if(Array.isArray(relationshipData)){const items=relationshipData.map(entry=>simplifyRelationshipResource(entry,{...options,lookupFieldMap:null})).filter(Boolean);if(items.length>0)lookups[relationshipName]=items;continue}const fieldKey=resolveRelationshipFieldKey(relationshipName,lookupFieldMap);if(!Object.hasOwn(simplified,fieldKey))simplified[fieldKey]=relationshipData?.id==null?null:String(relationshipData.id);const lookupRecord=relationshipData==null?null:simplifyRelationshipResource(relationshipData,{...options,lookupFieldMap:null});if(lookupRecord){lookups[fieldKey]=lookupRecord;if(relationshipName!==fieldKey)lookups[relationshipName]=lookupRecord}}if(Object.keys(lookups).length>0)simplified[lookupContainerKey]=lookups;if(resourceKey){options.inFlightKeys?.delete(resourceKey);options.resourceCache?.set(resourceKey,simplified)}return simplified}function assertPrimaryDataType(resource={},expectedType=``){const normalizedExpectedType=normalizeText(expectedType);if(!normalizedExpectedType)return;const actualType=normalizeText(resource?.type);if(actualType&&actualType!==normalizedExpectedType)throw new Error(`Expected JSON:API resource type ${normalizedExpectedType}, received ${actualType}.`)}function resolveCollectionPageMeta(document={}){return{nextCursor:normalizeText(document?.meta?.page?.nextCursor||document?.meta?.pagination?.cursor?.next)||null,...isRecord$1(document?.meta)?{meta:document.meta}:{},...isRecord$1(document?.links)?{links:document.links}:{}}}function decodeJsonApiResourceResponse(payload,transport=null){const normalizedTransport=normalizeJsonApiClientTransport(transport);if(!normalizedTransport)return payload;const document=normalizeJsonApiDocument(payload);const simplifyOptions={lookupContainerKey:normalizedTransport.lookupContainerKey,lookupFieldMap:normalizedTransport.lookupFieldMap,includedResourceIndex:createIncludedResourceIndex(document),resourceCache:new Map,inFlightKeys:new Set};if(document.kind===`unknown`)throw new Error(`Expected JSON:API response document.`);if(normalizedTransport.responseKind===`collection`){if(document.kind!==`collection`)throw new Error(`Expected JSON:API collection document.`);for(const entry of document.data)assertPrimaryDataType(entry,normalizedTransport.responseType);return{items:document.data.map(entry=>simplifyResourceObject(entry,simplifyOptions)),...resolveCollectionPageMeta(document)}}if(normalizedTransport.responseKind===`meta`){if(document.kind!==`meta`)throw new Error(`Expected JSON:API meta document.`);return isRecord$1(document.meta)?document.meta:{}}if(normalizedTransport.responseKind===`nullable-record`){if(document.kind!==`resource`)throw new Error(`Expected JSON:API resource document.`);if(document.data!=null)assertPrimaryDataType(document.data,normalizedTransport.responseType);return document.data==null?null:simplifyResourceObject(document.data,simplifyOptions)}if(document.kind!==`resource`)throw new Error(`Expected JSON:API resource document.`);if(document.data!=null)assertPrimaryDataType(document.data,normalizedTransport.responseType);return document.data==null?null:simplifyResourceObject(document.data,simplifyOptions)}function decodeJsonApiErrorFieldErrors(payload={}){const document=normalizeJsonApiDocument(payload);if(document.kind!==`errors`)return{};const fieldErrors={};for(const error of normalizeArray(document.errors)){const pointer=normalizeText(error?.source?.pointer);const parameter=normalizeText(error?.source?.parameter);const detail=normalizeText(error?.detail||error?.title,{fallback:`Invalid value.`});if(parameter&&!Object.hasOwn(fieldErrors,parameter)){fieldErrors[parameter]=detail;continue}if(!pointer.startsWith(`/data/attributes/`))continue;const fieldName=normalizeText(pointer.slice(17).split(`/`)[0]);if(fieldName&&!Object.hasOwn(fieldErrors,fieldName))fieldErrors[fieldName]=detail}return fieldErrors}function createJsonApiClientErrorPayload(payload={}){const document=normalizeJsonApiDocument(payload);if(document.kind!==`errors`)return null;const firstError=normalizeArray(document.errors)[0]||{};const fieldErrors=decodeJsonApiErrorFieldErrors(payload);const transactionOutcome=normalizeTransactionOutcome(firstError.meta?.transactionOutcome);return{error:normalizeText(firstError.detail||firstError.title,{fallback:`Request failed.`}),code:normalizeText(firstError.code)||null,...transactionOutcome?{transactionOutcome}:{},...Object.keys(fieldErrors).length>0?{fieldErrors,details:{fieldErrors}}:{}}}function standardErrorMessage(payload={}){const nestedMessage=Array.isArray(payload.errors)?payload.errors.find(entry=>isRecord$4(entry)&&String(entry.message||``).trim())?.message:``;return String(payload.error||payload.message||nestedMessage||``).trim()}function createHttpError(response,data={}){const payload=isRecord$4(data)?data:{};const message=standardErrorMessage(payload);const jsonApiPayload=message?null:createJsonApiClientErrorPayload(payload);if(jsonApiPayload)return createHttpError(response,jsonApiPayload);const error=new Error(message||`Request failed with status ${response.status}.`);const normalizedFieldErrors=resolveFieldErrors(payload);error.status=Number(response?.status||0);error.code=String(payload.code||``).trim()||null;const transactionOutcome=normalizeTransactionOutcome(payload.transactionOutcome);if(transactionOutcome)error.transactionOutcome=transactionOutcome;error.fieldErrors=Object.keys(normalizedFieldErrors).length>0?normalizedFieldErrors:null;if(isRecord$4(payload.details))error.details=payload.details;else if(error.fieldErrors)error.details={fieldErrors:error.fieldErrors};else error.details=null;return error}function createNetworkError(cause){const error=new Error(`Network request failed.`);error.status=0;error.code=null;error.fieldErrors=null;error.details=null;error.cause=cause;return error}function normalizeHeaderName(name){return String(name||``).trim().toLowerCase()}function hasHeader(headers,name){const normalizedTarget=normalizeHeaderName(name);if(!normalizedTarget||!headers||typeof headers!==`object`)return false;return Object.keys(headers).some(key=>normalizeHeaderName(key)===normalizedTarget)}function setHeaderIfMissing(headers,name,value){if(!headers||typeof headers!==`object`||!name||value==null)return;if(hasHeader(headers,name))return;headers[name]=value}var DEFAULT_RETRYABLE_CSRF_ERROR_CODES=Object.freeze([`FST_CSRF_INVALID_TOKEN`,`FST_CSRF_MISSING_SECRET`]);function toUpperStringSet(values,fallback=[]){return new Set((Array.isArray(values)?values:fallback).map(value=>String(value||``).trim().toUpperCase()).filter(Boolean))}function shouldRetryForCsrfFailure({response,method,state,data,unsafeMethods,retryableErrorCodes=DEFAULT_RETRYABLE_CSRF_ERROR_CODES}){const methodValue=String(method||``).trim().toUpperCase();if(Number(response?.status)!==403||!unsafeMethods?.has(methodValue)||state?.csrfRetried)return false;const payload=createJsonApiClientErrorPayload(data)||data;const transactionOutcome=normalizeTransactionOutcome(payload?.transactionOutcome);if([`pending`,`committed`,`unknown`].includes(transactionOutcome))return false;const code=String(payload?.details?.code||payload?.code||``).trim().toUpperCase();return toUpperStringSet(retryableErrorCodes,DEFAULT_RETRYABLE_CSRF_ERROR_CODES).has(code)}function normalizePermissionList(value){const source=Array.isArray(value)?value:[value];const unique=new Set;for(const entry of source){const normalizedEntry=normalizeText(entry);if(!normalizedEntry)continue;unique.add(normalizedEntry)}return[...unique]}function hasPermission(permissionSet=[],permission=``){const requiredPermission=normalizeText(permission);if(!requiredPermission)return true;const permissions=normalizePermissionList(permissionSet);if(permissions.includes(`*`)||permissions.includes(requiredPermission))return true;for(const grantedPermission of permissions){if(!grantedPermission.endsWith(`.*`))continue;const wildcardNamespace=grantedPermission.slice(0,-2);if(!wildcardNamespace)continue;if(requiredPermission.startsWith(`${wildcardNamespace}.`))return true}return false}var TRANSIENT_QUERY_ERROR_STATUSES=Object.freeze(new Set([0,502,503,504]));var MAX_TRANSIENT_QUERY_RETRIES=2;var MAX_TRANSIENT_RETRY_DELAY_MS=3e3;function normalizeQueryErrorStatus(error){const status=Number(error?.status||error?.statusCode||0);return Number.isInteger(status)?status:0}function isTransientQueryError(error){return TRANSIENT_QUERY_ERROR_STATUSES.has(normalizeQueryErrorStatus(error))}function shouldRetryTransientQueryFailure(failureCount,error){if(!isTransientQueryError(error))return false;return Number(failureCount)<2}function transientQueryRetryDelay(attemptIndex){const normalizedAttempt=Number.isInteger(Number(attemptIndex))?Number(attemptIndex):1;return Math.min(1e3*2**Math.max(0,normalizedAttempt-1),MAX_TRANSIENT_RETRY_DELAY_MS)}var DEFAULT_UNSAFE_METHODS=Object.freeze([`POST`,`PUT`,`PATCH`,`DELETE`]);var DEFAULT_NDJSON_CONTENT_TYPE=`application/x-ndjson`;var DEFAULT_READ_TIMEOUT_MS=3e4;function requestSignalWithDeadline(signal,timeoutMs){if(!Number.isSafeInteger(timeoutMs)||timeoutMs<=0)throw new TypeError(`Request timeoutMs must be a positive finite integer.`);const deadline=AbortSignal.timeout(timeoutMs);return signal?AbortSignal.any([signal,deadline]):deadline}function normalizeMethod(method){return String(method||`GET`).trim().toUpperCase()}function resolveUnsafeMethods(value){return new Set((Array.isArray(value)?value:DEFAULT_UNSAFE_METHODS).map(method=>normalizeMethod(method)).filter(Boolean))}function resolveFetch(){if(typeof fetch===`function`)return fetch;throw new Error(`createHttpClient requires fetchImpl when global fetch is unavailable.`)}function normalizeResolvedRequestUrl(value,fallback=``){if(value===void 0||value===null||value===``)return fallback;return String(value)}function isObjectBody(value){return Boolean(value)&&typeof value===`object`&&!(value instanceof FormData)}function isQueryValuePresent(value){if(Array.isArray(value))return value.some(entry=>String(entry??``).trim());return String(value??``).trim().length>0}function appendRequestQueryToUrl(url,query=null,transport=null){const normalizedUrl=String(url||``).trim();if(!normalizedUrl)return``;const encodedQuery=transport?encodeJsonApiResourceQuery(query,transport):query&&typeof query===`object`&&!Array.isArray(query)?query:null;if(!encodedQuery||typeof encodedQuery!==`object`||Array.isArray(encodedQuery))return normalizedUrl;const searchParams=new URLSearchParams;for(const[key,rawValue]of Object.entries(encodedQuery)){const normalizedKey=String(key||``).trim();if(!normalizedKey||!isQueryValuePresent(rawValue))continue;const values=Array.isArray(rawValue)?rawValue:[rawValue];for(const value of values){const normalizedValue=String(value??``).trim();if(!normalizedValue)continue;searchParams.append(normalizedKey,normalizedValue)}}const serializedQuery=searchParams.toString();if(!serializedQuery)return normalizedUrl;return appendQueryString(normalizedUrl,serializedQuery)}function parseJsonSafely(response,signal){const contentType=String(response?.headers?.get?.(`content-type`)||``);const isJson=isJsonContentType(contentType);if(!isJson)return Promise.resolve({contentType,isJson,data:{}});return Promise.resolve(response?.json?.()).catch(error=>{signal?.throwIfAborted();if(error?.name===`AbortError`)throw error;return{}}).then(data=>({contentType,isJson,data:data&&typeof data===`object`?data:{}}))}function emitNdjsonLine(line,handlers){const normalizedLine=String(line||``).trim();if(!normalizedLine)return;try{const payload=JSON.parse(normalizedLine);if(typeof handlers?.onEvent===`function`)handlers.onEvent(payload)}catch(error){if(typeof handlers?.onMalformedLine===`function`)handlers.onMalformedLine(normalizedLine,error)}}async function readNdjsonStream(response,handlers={}){if(!response?.body||typeof response.body.getReader!==`function`){if(typeof response?.text===`function`){const rawText=await response.text().catch(()=>``);for(const line of String(rawText||``).split(/\r?\n/g))emitNdjsonLine(line,handlers)}return}const reader=response.body.getReader();const decoder=new TextDecoder;let buffered=``;while(true){const{value,done}=await reader.read();if(done)break;buffered+=decoder.decode(value,{stream:true});const lines=buffered.split(/\r?\n/g);buffered=lines.pop()||``;for(const line of lines)emitNdjsonLine(line,handlers)}buffered+=decoder.decode();if(buffered)emitNdjsonLine(buffered,handlers)}function createHttpClient(options={}){const configuredFetchImpl=typeof options.fetchImpl===`function`?options.fetchImpl:null;const configuredResolveRequestUrl=typeof options.resolveRequestUrl===`function`?options.resolveRequestUrl:null;const unsafeMethods=resolveUnsafeMethods(options.unsafeMethods);const hooks=options?.hooks&&typeof options.hooks===`object`?options.hooks:{};const csrf={enabled:options?.csrf?.enabled!==false,sessionPath:String(options?.csrf?.sessionPath||`/api/session`),headerName:String(options?.csrf?.headerName||`csrf-token`),tokenField:String(options?.csrf?.tokenField||`csrfToken`),retryableErrorCodes:Array.isArray(options?.csrf?.retryableErrorCodes)?options.csrf.retryableErrorCodes:DEFAULT_RETRYABLE_CSRF_ERROR_CODES};let csrfTokenCache=``;let csrfFetchPromise=null;function updateCsrfTokenFromPayload(data){const token=String(data?.[csrf.tokenField]||``);if(token)csrfTokenCache=token}async function fetchSessionForCsrf(){const activeFetch=configuredFetchImpl||resolveFetch();const signal=requestSignalWithDeadline(null,options.readTimeoutMs??DEFAULT_READ_TIMEOUT_MS);const requestUrl=await resolveRequestUrl(csrf.sessionPath,{originalUrl:csrf.sessionPath,method:`GET`,requestOptions:{method:`GET`},state:null,stream:false,csrfSession:true});let response;try{response=await activeFetch(requestUrl,{method:`GET`,credentials:String(options?.credentials||`same-origin`),signal})}catch(cause){signal.throwIfAborted();throw createNetworkError(cause)}const{data}=await parseJsonSafely(response,signal);signal.throwIfAborted();updateCsrfTokenFromPayload(data);if(!response.ok)throw createHttpError(response,data);return data}async function ensureCsrfToken(forceRefresh=false){if(!csrf.enabled)return``;if(!forceRefresh&&csrfTokenCache)return csrfTokenCache;if(!csrfFetchPromise||forceRefresh)csrfFetchPromise=fetchSessionForCsrf().finally(()=>{csrfFetchPromise=null});await csrfFetchPromise;return csrfTokenCache}function decorateHeaders({url,method,headers,requestOptions,state,stream}){if(typeof hooks.decorateHeaders!==`function`)return null;return hooks.decorateHeaders({url,method,headers,requestOptions,state,stream})}async function notifyFailure(payload){if(typeof hooks.onFailure===`function`)await hooks.onFailure(payload)}async function notifySuccess(payload){if(typeof hooks.onSuccess===`function`)await hooks.onSuccess(payload)}async function resolveRequestUrl(url,context={}){const normalizedUrl=String(url||``).trim();if(!configuredResolveRequestUrl)return normalizedUrl;return normalizeResolvedRequestUrl(await configuredResolveRequestUrl(normalizedUrl,{...context,url:normalizedUrl}),normalizedUrl)}async function maybeRetry({response,method,state,data,stream,csrfEnabled=csrf.enabled}){if(!csrfEnabled)return false;const customShouldRetry=typeof hooks.shouldRetryRequest===`function`?await hooks.shouldRetryRequest({response,method,state,data,stream}):null;if(!(customShouldRetry==null?shouldRetryForCsrfFailure({response,method,state,data,unsafeMethods,retryableErrorCodes:csrf.retryableErrorCodes}):Boolean(customShouldRetry)))return false;if(typeof hooks.onRetryableFailure===`function`)await hooks.onRetryableFailure({response,method,state,data,stream});csrfTokenCache=``;await ensureCsrfToken(true);state.csrfRetried=true;return true}function resolveRequestState(state){const resolvedState=state&&typeof state===`object`?state:{};if(typeof resolvedState.csrfRetried!==`boolean`)resolvedState.csrfRetried=false;return resolvedState}async function prepareRequestConfig(url,requestOptions,state,stream){const resolvedState=resolveRequestState(state);const method=normalizeMethod(requestOptions.method);const transport=normalizeJsonApiClientTransport(requestOptions.transport);const{transport:_transport,query:requestQuery,csrf:requestCsrf,timeoutMs:requestTimeoutMs,...forwardedRequestOptions}=requestOptions&&typeof requestOptions===`object`?requestOptions:{};const csrfEnabled=csrf.enabled&&requestCsrf!==false;const resolvedRequestUrl=await resolveRequestUrl(appendRequestQueryToUrl(url,requestQuery,transport),{originalUrl:url,method,requestOptions,state:resolvedState,stream:Boolean(stream),csrfSession:false});const headers=requestOptions.headers&&typeof requestOptions.headers===`object`?{...requestOptions.headers}:{};const decorateHeadersResult=decorateHeaders({url:resolvedRequestUrl,method,headers,requestOptions,state:resolvedState,stream:Boolean(stream)});if(decorateHeadersResult&&typeof decorateHeadersResult.then===`function`)await decorateHeadersResult;const config={credentials:String(options?.credentials||`same-origin`),...forwardedRequestOptions,method,headers};const ordinaryRead=!stream&&[`GET`,`HEAD`].includes(method);const timeoutMs=requestTimeoutMs??(ordinaryRead?options.readTimeoutMs??DEFAULT_READ_TIMEOUT_MS:void 0);if(timeoutMs!==void 0)config.signal=requestSignalWithDeadline(config.signal,timeoutMs);if(transport)setHeaderIfMissing(headers,`Accept`,JSON_API_CONTENT_TYPE);if(transport&&isObjectBody(config.body)){setHeaderIfMissing(headers,`Content-Type`,JSON_API_CONTENT_TYPE);config.body=encodeJsonApiResourceRequestBody(config.body,transport)}if(isObjectBody(config.body)){setHeaderIfMissing(headers,`Content-Type`,`application/json`);config.body=JSON.stringify(config.body)}if(csrfEnabled&&unsafeMethods.has(method)&&!hasHeader(headers,csrf.headerName)){const token=await ensureCsrfToken();if(token)setHeaderIfMissing(headers,csrf.headerName,token)}return{method,config,state:resolvedState,csrfEnabled,transport,url:resolvedRequestUrl}}async function executePreparedRequest(url,config,{method,state},onNetworkFailure){config.signal?.throwIfAborted();let response;try{response=await(configuredFetchImpl||resolveFetch())(url,config)}catch(cause){config.signal?.throwIfAborted();return onNetworkFailure(cause)}const{contentType,isJson,data}=await parseJsonSafely(response,config.signal);config.signal?.throwIfAborted();updateCsrfTokenFromPayload(data);return{response,data,contentType,isJson,method,state}}async function handleHttpFailure({url,method,state,response,data,contentType,isJson,stream,csrfEnabled,retryRequest}){if(await maybeRetry({response,method,state,data,stream,csrfEnabled}))return retryRequest();const error=createHttpError(response,data);if(Number(response.status)===401&&typeof hooks.onUnauthorized===`function`)await hooks.onUnauthorized(error);await notifyFailure({url,method,state,reason:`http_${response.status}`,error,response,data,contentType,isJson,stream});throw error}async function executeRequestLifecycle({url,requestOptions={},state=null,stream=false,handleNetworkFailure,retryRequest}={}){if(typeof handleNetworkFailure!==`function`)throw new TypeError(`executeRequestLifecycle requires handleNetworkFailure().`);if(typeof retryRequest!==`function`)throw new TypeError(`executeRequestLifecycle requires retryRequest().`);const requestContext=await prepareRequestConfig(url,requestOptions,state,stream);const{method,state:resolvedState}=requestContext;const result=await executePreparedRequest(requestContext.url,requestContext.config,requestContext,cause=>handleNetworkFailure({cause,url,method,state:resolvedState,stream}));if(!result.response.ok)return{handled:true,value:await handleHttpFailure({url,method,state:resolvedState,response:result.response,data:result.data,contentType:result.contentType,isJson:result.isJson,stream,csrfEnabled:requestContext.csrfEnabled,retryRequest(){return retryRequest(resolvedState)}})};return{handled:false,value:{method,state:resolvedState,result,transport:requestContext.transport}}}async function request(url,requestOptions={},state=null){const execution=await executeRequestLifecycle({url,requestOptions,state,stream:false,async handleNetworkFailure({cause,method,state:resolvedState}){if(cause?.name===`AbortError`)throw cause;const error=createNetworkError(cause);await notifyFailure({url,method,state:resolvedState,reason:`network_error`,error,stream:false});throw error},retryRequest(nextState){return request(url,requestOptions,nextState)}});if(execution.handled)return execution.value;const{method,state:resolvedState,result,transport}=execution.value;if(Number(result.response?.status||200)===204){await notifySuccess({url,method,state:resolvedState,response:result.response,data:null,rawData:null,contentType:result.contentType,isJson:result.isJson,stream:false});return null}let responseData=result.data;if(transport)try{responseData=decodeJsonApiResourceResponse(result.data,transport)}catch(cause){const error=createNetworkError(cause);error.message=`JSON:API response decoding failed.`;await notifyFailure({url,method,state:resolvedState,reason:`transport_decode_error`,error,response:result.response,data:result.data,contentType:result.contentType,isJson:result.isJson,stream:false});throw error}await notifySuccess({url,method,state:resolvedState,response:result.response,data:responseData,rawData:result.data,contentType:result.contentType,isJson:result.isJson,stream:false});return responseData}async function requestStream(url,requestOptions={},handlers={},state=null){const execution=await executeRequestLifecycle({url,requestOptions,state,stream:true,async handleNetworkFailure({cause,method,state:resolvedState}){const aborted=String(cause?.name||``)===`AbortError`;await notifyFailure({url,method,state:resolvedState,reason:aborted?`aborted`:`network_error`,error:cause,stream:true});if(aborted)throw cause;throw createNetworkError(cause)},retryRequest(nextState){return requestStream(url,requestOptions,handlers,nextState)}});if(execution.handled)return execution.value;const{method,state:resolvedState,result}=execution.value;try{let shouldParseAsNdjson=result.contentType.includes(DEFAULT_NDJSON_CONTENT_TYPE);if(!shouldParseAsNdjson&&typeof hooks.shouldTreatAsNdjsonStream===`function`)shouldParseAsNdjson=Boolean(await hooks.shouldTreatAsNdjsonStream({url,method,state:resolvedState,contentType:result.contentType,isJson:result.isJson,data:result.data,response:result.response}));if(shouldParseAsNdjson)await readNdjsonStream(result.response,handlers);else if(typeof handlers?.onEvent===`function`&&Object.keys(result.data).length>0)handlers.onEvent(result.data);else if(typeof handlers?.onEvent===`function`&&typeof result.response?.text===`function`){const rawText=await result.response.text().catch(()=>``);for(const line of String(rawText||``).split(/\r?\n/g))emitNdjsonLine(line,handlers)}}catch(error){await notifyFailure({url,method,state:resolvedState,reason:`stream_error`,error,response:result.response,data:result.data,contentType:result.contentType,isJson:result.isJson,stream:true});throw error}await notifySuccess({url,method,state:resolvedState,response:result.response,data:result.data,contentType:result.contentType,isJson:result.isJson,stream:true})}function clearCsrfTokenCache(){csrfTokenCache=``}function resetForTests(){csrfTokenCache=``;csrfFetchPromise=null}function get(url,requestOptions={}){return request(url,{...requestOptions,method:`GET`})}function post(url,body,requestOptions={}){return request(url,{...requestOptions,method:`POST`,body})}function put(url,body,requestOptions={}){return request(url,{...requestOptions,method:`PUT`,body})}function patch(url,body,requestOptions={}){return request(url,{...requestOptions,method:`PATCH`,body})}function del(url,requestOptions={}){return request(url,{...requestOptions,method:`DELETE`})}return{request,requestStream,ensureCsrfToken,clearCsrfTokenCache,resetForTests,get,post,put,patch,delete:del,__testables:{fetchSessionForCsrf,updateCsrfTokenFromPayload,createHttpError,createNetworkError,readNdjsonStream}}}var SAFE_RETRY_METHODS=Object.freeze(new Set([`GET`,`HEAD`]));var MAX_TRANSIENT_HTTP_RETRIES=2;function sleep(delayMs){return new Promise(resolve=>{setTimeout(resolve,delayMs)})}function shouldRetryTransientHttpFailure(error,method,attemptIndex){if(error?.name===`AbortError`||error?.name===`TimeoutError`)return false;if(!SAFE_RETRY_METHODS.has(String(method||`GET`).toUpperCase()))return false;if(!isTransientQueryError(error))return false;return Number(attemptIndex)<MAX_TRANSIENT_HTTP_RETRIES}async function requestWithTransientRetry(executor,method,signal){let attemptIndex=0;while(true){signal?.throwIfAborted();try{return await executor()}catch(error){signal?.throwIfAborted();if(!shouldRetryTransientHttpFailure(error,method,attemptIndex))throw error;attemptIndex+=1;await sleep(transientQueryRetryDelay(attemptIndex))}}}function createTransientRetryHttpClient(options={}){const baseHttpClient=createHttpClient(options);return Object.freeze({...baseHttpClient,request(url,requestOptions={},state=null){return requestWithTransientRetry(()=>baseHttpClient.request(url,requestOptions,state),String(requestOptions?.method||`GET`).toUpperCase(),requestOptions?.signal)},requestStream(url,requestOptions={},handlers={},state=null){return requestWithTransientRetry(()=>baseHttpClient.requestStream(url,requestOptions,handlers,state),String(requestOptions?.method||`GET`).toUpperCase(),requestOptions?.signal)}})}function createValidationFailure({error=`Validation failed.`,code=`validation_failed`,fieldErrors={}}={}){const normalizedFieldErrors=normalizeFieldErrors(fieldErrors);return{error:String(error||`Validation failed.`).trim()||`Validation failed.`,code:String(code||`validation_failed`).trim()||`validation_failed`,fieldErrors:normalizedFieldErrors,details:{fieldErrors:normalizedFieldErrors}}}var ARCHITECTURE_ID_PATTERN=/^[a-z][a-z0-9_.-]*$/u;var LOCAL_NAME_PATTERN=/^[A-Za-z_$][A-Za-z0-9_$]*$/u;function normalizeArchitectureId(value,label){const normalized=String(value||``).trim().toLowerCase();if(!ARCHITECTURE_ID_PATTERN.test(normalized))throw new TypeError(`${label} must match ${ARCHITECTURE_ID_PATTERN.toString()}.`);return normalized}function normalizeCapabilityMap(value,label){if(value==null)return Object.freeze({});if(!isRecord$4(value))throw new TypeError(`${label} must be an object mapping local names to capability ids.`);const normalized={};const seenCapabilityIds=new Set;for(const[rawLocalName,rawCapabilityId]of Object.entries(value)){const localName=String(rawLocalName||``).trim();if(!LOCAL_NAME_PATTERN.test(localName))throw new TypeError(`${label} local name "${localName}" must be a JavaScript identifier.`);const capabilityId=normalizeArchitectureId(rawCapabilityId,`${label}.${localName}`);if(seenCapabilityIds.has(capabilityId))throw new TypeError(`${label} declares capability "${capabilityId}" more than once.`);seenCapabilityIds.add(capabilityId);normalized[localName]=capabilityId}return Object.freeze(normalized)}function assertDistinctLocalNames(maps){const owners=new Map;for(const[kind,entries]of Object.entries(maps))for(const localName of Object.keys(entries)){if(owners.has(localName))throw new TypeError(`Provider local name "${localName}" is declared by both ${owners.get(localName)} and ${kind}.`);owners.set(localName,kind)}}function normalizeLifecycleMethod(value,label){if(value==null)return null;if(typeof value!==`function`)throw new TypeError(`${label} must be a function when provided.`);return value}function defineProvider({id,requires={},optional={},provides={},setup,boot=null,shutdown=null}={}){const providerId=normalizeArchitectureId(id,`Provider id`);const normalizedRequires=normalizeCapabilityMap(requires,`${providerId}.requires`);const normalizedOptional=normalizeCapabilityMap(optional,`${providerId}.optional`);const normalizedProvides=normalizeCapabilityMap(provides,`${providerId}.provides`);assertDistinctLocalNames({requires:normalizedRequires,optional:normalizedOptional,provides:normalizedProvides});const setupMethod=normalizeLifecycleMethod(setup,`${providerId}.setup`);if(!setupMethod)throw new TypeError(`${providerId}.setup is required.`);return Object.freeze({id:providerId,requires:normalizedRequires,optional:normalizedOptional,provides:normalizedProvides,setup:setupMethod,boot:normalizeLifecycleMethod(boot,`${providerId}.boot`),shutdown:normalizeLifecycleMethod(shutdown,`${providerId}.shutdown`)})}function normalizeProviderDefinition(value){if(!isRecord$4(value))throw new TypeError(`Capability runtime providers must be provider definitions.`);return defineProvider(value)}function normalizeInputCapabilities(value){if(value==null)return new Map;if(!isRecord$4(value))throw new TypeError(`Capability runtime inputs must be an object keyed by capability id.`);return new Map(Object.entries(value).map(([id,capability])=>[normalizeArchitectureId(id,`Runtime input capability id`),capability]))}function providerCapabilityIds(provider,field){return Object.values(provider[field]||{})}function buildProviderOrder(providers,inputCapabilities){const normalizedProviders=providers.map(normalizeProviderDefinition);const providersById=new Map;const providerByCapability=new Map;for(const provider of normalizedProviders){if(providersById.has(provider.id))throw new Error(`Provider "${provider.id}" is duplicated.`);providersById.set(provider.id,provider);for(const capabilityId of providerCapabilityIds(provider,`provides`)){if(inputCapabilities.has(capabilityId))throw new Error(`Capability "${capabilityId}" is supplied both as a runtime input and by ${provider.id}.`);if(providerByCapability.has(capabilityId))throw new Error(`Capability "${capabilityId}" is provided by both ${providerByCapability.get(capabilityId).id} and ${provider.id}.`);providerByCapability.set(capabilityId,provider)}}for(const provider of normalizedProviders)for(const capabilityId of providerCapabilityIds(provider,`requires`)){if(!inputCapabilities.has(capabilityId)&&!providerByCapability.has(capabilityId))throw new Error(`Provider "${provider.id}" requires missing capability "${capabilityId}".`);if(providerByCapability.get(capabilityId)?.id===provider.id)throw new Error(`Provider "${provider.id}" cannot require capability "${capabilityId}" that it provides.`)}const visited=new Set;const visiting=new Set;const ordered=[];function visit(provider,lineage=[]){if(visited.has(provider.id))return;if(visiting.has(provider.id))throw new Error(`Provider capability cycle detected: ${[...lineage,provider.id].join(` -> `)}.`);visiting.add(provider.id);const dependencyProviders=[...providerCapabilityIds(provider,`requires`),...providerCapabilityIds(provider,`optional`)].map(capabilityId=>providerByCapability.get(capabilityId)||null).filter(Boolean).sort((left,right)=>left.id.localeCompare(right.id));for(const dependencyProvider of dependencyProviders)visit(dependencyProvider,[...lineage,provider.id]);visiting.delete(provider.id);visited.add(provider.id);ordered.push(provider)}for(const provider of[...normalizedProviders].sort((left,right)=>left.id.localeCompare(right.id)))visit(provider);return Object.freeze(ordered)}function resolveProviderDependencies(provider,capabilities){const dependencies={};for(const[localName,capabilityId]of Object.entries(provider.requires)){if(!capabilities.has(capabilityId))throw new Error(`Provider "${provider.id}" requires unavailable capability "${capabilityId}".`);dependencies[localName]=capabilities.get(capabilityId)}for(const[localName,capabilityId]of Object.entries(provider.optional))dependencies[localName]=capabilities.has(capabilityId)?capabilities.get(capabilityId):null;return Object.freeze(dependencies)}function normalizeProviderOutputs(provider,value){const expectedNames=Object.keys(provider.provides);if(expectedNames.length===0){if(value!=null&&(!isRecord$4(value)||Object.keys(value).length>0))throw new Error(`Provider "${provider.id}" declares no capabilities but setup() returned outputs.`);return Object.freeze({})}if(!isRecord$4(value))throw new Error(`Provider "${provider.id}" setup() must return its declared capability outputs.`);const actualNames=Object.keys(value).sort();const sortedExpectedNames=[...expectedNames].sort();if(actualNames.length!==sortedExpectedNames.length||actualNames.some((name,index)=>name!==sortedExpectedNames[index]))throw new Error(`Provider "${provider.id}" setup() outputs must be exactly: ${sortedExpectedNames.join(`, `)||`<none>`}.`);return Object.freeze({...value})}function createCapabilityRuntime({providers=[],inputs={},profile=``}={}){const capabilities=normalizeInputCapabilities(inputs);const providerOrder=buildProviderOrder(Array.isArray(providers)?providers:[],capabilities);const providerStates=new Map;const normalizedProfile=String(profile||``).trim();let lifecycleState=`created`;async function stopInitializedProviders(){const stopped=[];let firstError=null;for(const provider of[...providerOrder].reverse()){if(!providerStates.has(provider.id))continue;if(provider.shutdown){const state=providerStates.get(provider.id);try{await provider.shutdown(state.dependencies,Object.freeze({outputs:state.outputs,profile:normalizedProfile}))}catch(error){firstError||=error}}stopped.push(provider.id)}if(firstError)throw firstError;return Object.freeze(stopped)}async function start(){if(lifecycleState!==`created`)throw new Error(`Capability runtime cannot start from state "${lifecycleState}".`);lifecycleState=`starting`;try{for(const provider of providerOrder){const dependencies=resolveProviderDependencies(provider,capabilities);const outputs=normalizeProviderOutputs(provider,await provider.setup(dependencies,Object.freeze({profile:normalizedProfile})));for(const[localName,capabilityId]of Object.entries(provider.provides))capabilities.set(capabilityId,outputs[localName]);providerStates.set(provider.id,Object.freeze({dependencies,outputs}))}for(const provider of providerOrder)if(provider.boot){const state=providerStates.get(provider.id);await provider.boot(state.dependencies,Object.freeze({outputs:state.outputs,profile:normalizedProfile}))}lifecycleState=`started`;return api}catch(error){lifecycleState=`failed`;try{await stopInitializedProviders()}catch(shutdownError){throw new AggregateError([error,shutdownError],`Capability runtime startup failed and cleanup also failed.`,{cause:error})}throw error}}async function shutdown(){if(lifecycleState===`stopped`)return Object.freeze([]);if(lifecycleState!==`started`)throw new Error(`Capability runtime cannot shut down from state "${lifecycleState}".`);lifecycleState=`stopping`;try{return await stopInitializedProviders()}finally{lifecycleState=`stopped`}}function diagnostics(){return Object.freeze({profile:normalizedProfile,lifecycleState,providerOrder:Object.freeze(providerOrder.map(provider=>provider.id)),capabilityIds:Object.freeze([...capabilities.keys()].sort())})}const api=Object.freeze({start,shutdown,diagnostics});return api}function createPaginationQuerySchema({defaultPage=1,defaultPageSize=10,minPage=1,minPageSize=1,maxPageSize=100}={}){return createSchema({page:{type:`integer`,required:false,min:minPage,default:defaultPage},pageSize:{type:`integer`,required:false,min:minPageSize,max:maxPageSize,default:defaultPageSize}})}function rewriteEmbeddedTransportSchemaRefs(value,{rootRef=`#`,definitionRefByName={}}={}){if(Array.isArray(value))return value.map(entry=>rewriteEmbeddedTransportSchemaRefs(entry,{rootRef,definitionRefByName}));if(!value||typeof value!==`object`)return value;const rewritten={};for(const[key,entry]of Object.entries(value)){if(key===`$ref`&&typeof entry===`string`){if(entry===`#`){rewritten[key]=rootRef;continue}if(entry.startsWith(`#/definitions/`)){rewritten[key]=definitionRefByName[entry.slice(14)]||entry;continue}}rewritten[key]=rewriteEmbeddedTransportSchemaRefs(entry,{rootRef,definitionRefByName})}return rewritten}function createEmbeddableTransportSchemaDocument(schemaDocument={},rootDefinitionName=`TransportSchema`){const{$schema:_jsonSchemaDraft,definitions:sourceDefinitions={},...rootSchema}=schemaDocument||{};const rootRef=`#/definitions/${rootDefinitionName}`;const definitionRefByName={};const definitions={};for(const definitionName of Object.keys(sourceDefinitions))definitionRefByName[definitionName]=`#/definitions/${rootDefinitionName}__${definitionName}`;definitions[rootDefinitionName]=rewriteEmbeddedTransportSchemaRefs(rootSchema,{rootRef,definitionRefByName});for(const[definitionName,definitionSchema]of Object.entries(sourceDefinitions))definitions[`${rootDefinitionName}__${definitionName}`]=rewriteEmbeddedTransportSchemaRefs(definitionSchema,{rootRef,definitionRefByName});return{schema:{allOf:[{$ref:rootRef}]},definitions}}var fieldErrorsFieldDefinition=deepFreeze({type:`object`,values:{type:`string`,minLength:1}});var apiErrorDetailsSchema=createSchema({fieldErrors:{...fieldErrorsFieldDefinition,required:false}});var apiValidationErrorDetailsSchema=createSchema({fieldErrors:{...fieldErrorsFieldDefinition,required:true}});var apiErrorOutputValidator=deepFreeze({schema:createSchema({error:{type:`string`,required:true,minLength:1},code:{type:`string`,required:false,minLength:1},transactionOutcome:{type:`string`,required:false,enum:TRANSACTION_OUTCOMES},details:{type:`object`,required:false,schema:apiErrorDetailsSchema,additionalProperties:true},fieldErrors:{...fieldErrorsFieldDefinition,required:false}}),mode:`replace`});var apiValidationErrorOutputValidator=deepFreeze({schema:createSchema({error:{type:`string`,required:true,minLength:1},code:{type:`string`,required:false,minLength:1},transactionOutcome:{type:`string`,required:false,enum:TRANSACTION_OUTCOMES},fieldErrors:{...fieldErrorsFieldDefinition,required:true},details:{type:`object`,required:true,schema:apiValidationErrorDetailsSchema,additionalProperties:true}}),mode:`replace`});var apiErrorTransportSchema=apiErrorOutputValidator.schema.toJsonSchema({mode:apiErrorOutputValidator.mode});var apiValidationErrorTransportSchema=apiValidationErrorOutputValidator.schema.toJsonSchema({mode:apiValidationErrorOutputValidator.mode});var fastifyDefaultErrorTransportSchema={type:`object`,additionalProperties:true,required:[`statusCode`,`error`,`message`],properties:{statusCode:{type:`integer`,minimum:400,maximum:599},error:{type:`string`,minLength:1},message:{type:`string`,minLength:1},code:{type:`string`,minLength:1},transactionOutcome:{type:`string`,enum:TRANSACTION_OUTCOMES},details:{},fieldErrors:{type:`object`,additionalProperties:{type:`string`}}}};var STANDARD_ERROR_STATUS_CODES=[400,401,403,404,409,422,429,500,503];function createTransportResponseSchema(schema={}){return{transportSchema:schema}}var embeddedApiErrorTransportSchema=createEmbeddableTransportSchemaDocument(apiErrorTransportSchema,`ApiErrorOutput`);var embeddedApiValidationErrorTransportSchema=createEmbeddableTransportSchemaDocument(apiValidationErrorTransportSchema,`ApiValidationErrorOutput`);var sharedErrorTransportDefinitions={...embeddedApiValidationErrorTransportSchema.definitions,...embeddedApiErrorTransportSchema.definitions};function passthroughErrorResponses(successResponses){return successResponses}function withStandardErrorResponses(successResponses,{includeValidation400=false}={}){const responses={...successResponses};for(const statusCode of STANDARD_ERROR_STATUS_CODES){if(responses[statusCode])continue;if(statusCode===400&&includeValidation400){responses[statusCode]=createTransportResponseSchema({anyOf:[embeddedApiValidationErrorTransportSchema.schema,embeddedApiErrorTransportSchema.schema,fastifyDefaultErrorTransportSchema],definitions:sharedErrorTransportDefinitions});continue}responses[statusCode]=createTransportResponseSchema({anyOf:[embeddedApiErrorTransportSchema.schema,fastifyDefaultErrorTransportSchema],definitions:embeddedApiErrorTransportSchema.definitions})}return responses}function enumSchema(values){return{anyOf:values.map(value=>({const:value}))}}function asSchemaDefinition(value,label,defaultMode,{required=true}={}){if(value==null){if(!required)return null;throw new TypeError(`${label} is required.`)}try{return normalizeSingleSchemaDefinition(value,{context:label,defaultMode})}catch(error){throw new TypeError(error?.message||`${label} must be a schema definition object.`)}}function createCursorPagedListResponseSchema(itemSchema){return createCursorListValidator(itemSchema)}function createResource({record,create,replace,patch,list=null,listItem=null}={}){const normalizedRecordSchema=asSchemaDefinition(record,`record`,`replace`);const normalizedCreateSchema=asSchemaDefinition(create,`create`,`create`);const normalizedReplaceSchema=asSchemaDefinition(replace,`replace`,`replace`);const normalizedPatchSchema=asSchemaDefinition(patch,`patch`,`patch`);const normalizedListItemSchema=listItem?asSchemaDefinition(listItem,`listItem`,`replace`):normalizedRecordSchema;const normalizedListSchema=list?asSchemaDefinition(list,`list`,`replace`):createCursorPagedListResponseSchema(normalizedListItemSchema);return deepFreeze({record:normalizedRecordSchema,create:normalizedCreateSchema,replace:normalizedReplaceSchema,patch:normalizedPatchSchema,listItem:normalizedListItemSchema,list:normalizedListSchema})}function createCommand({input,output,idempotent=null,invalidates=[]}={}){const command={input:asSchemaDefinition(input,`input`,`patch`),output:asSchemaDefinition(output,`output`,`replace`),invalidates:Object.freeze(normalizeUniqueTextList(invalidates))};if(typeof idempotent===`boolean`)command.idempotent=idempotent;return deepFreeze(command)}function resolveIssueField(issue={}){const instancePath=normalizeText(issue.instancePath);if(instancePath){const segments=instancePath.replace(/^\//,``).split(`/`).map(entry=>normalizeText(entry)).filter(Boolean);if(segments.length>0)return segments[0]}const params=isRecord$4(issue.params)?issue.params:{};const missingProperty=normalizeText(params.missingProperty);if(missingProperty)return missingProperty;const requiredProperties=Array.isArray(params.requiredProperties)?params.requiredProperties:[];if(requiredProperties.length>0)return normalizeText(requiredProperties[0]);const additionalProperties=Array.isArray(params.additionalProperties)?params.additionalProperties:[];if(additionalProperties.length>0)return normalizeText(additionalProperties[0]);const additionalProperty=normalizeText(params.additionalProperty);if(additionalProperty)return additionalProperty;return``}function decodePointerSegment(value=``){return String(value).replace(/~1/g,`/`).replace(/~0/g,`~`)}function resolveSchemaPathSegments(schemaPath=``){const normalizedSchemaPath=normalizeText(schemaPath);if(!normalizedSchemaPath.startsWith(`#`))return[];const pointer=normalizedSchemaPath.slice(1);if(!pointer)return[];return pointer.replace(/^\//,``).split(`/`).map(segment=>decodePointerSegment(segment)).filter(segment=>segment.length>0)}function resolveFieldFromSchemaPath(schemaPath=``){const segments=resolveSchemaPathSegments(schemaPath);for(let index=0;index<segments.length-1;index+=1){if(segments[index]!==`properties`)continue;const field=normalizeText(segments[index+1]);if(field)return field}return``}function resolveSchemaNode(schema={},schemaPath=``){const source=isRecord$4(schema)?schema:{};const segments=resolveSchemaPathSegments(schemaPath);let current=source;for(const segment of segments){if(Array.isArray(current)){const index=Number.parseInt(segment,10);if(!Number.isInteger(index)||index<0||index>=current.length)return null;current=current[index];continue}if(!isRecord$4(current)||!Object.hasOwn(current,segment))return null;current=current[segment]}return current}function collectSchemaFieldCandidates(schema={}){if(!isRecord$4(schema))return[];const fields=[];const seenFields=new Set;const addField=value=>{const normalized=normalizeText(value);if(!normalized||seenFields.has(normalized))return;seenFields.add(normalized);fields.push(normalized)};const properties=isRecord$4(schema.properties)?schema.properties:{};for(const field of Object.keys(properties))addField(field);const required=Array.isArray(schema.required)?schema.required:[];for(const field of required)addField(field);const addFromSchema=entry=>{if(!isRecord$4(entry))return;const entryProperties=isRecord$4(entry.properties)?entry.properties:{};for(const field of Object.keys(entryProperties))addField(field);const entryRequired=Array.isArray(entry.required)?entry.required:[];for(const field of entryRequired)addField(field)};for(const keyword of[`anyOf`,`oneOf`,`allOf`]){const branches=Array.isArray(schema[keyword])?schema[keyword]:[];for(const branch of branches)addFromSchema(branch)}for(const keyword of[`if`,`then`,`else`])addFromSchema(schema[keyword]);return fields}function resolveConditionalIssueField(issue={},schema={}){const params=isRecord$4(issue.params)?issue.params:{};const failingKeyword=normalizeText(params.failingKeyword).toLowerCase();if(failingKeyword!==`then`&&failingKeyword!==`else`)return``;const scopeSchema=resolveSchemaNode(schema,issue.schemaPath)||schema;if(!isRecord$4(scopeSchema))return``;const conditionalSchema=scopeSchema[failingKeyword];return collectSchemaFieldCandidates(conditionalSchema)[0]||``}function resolveFallbackIssueField(issue={},schema={}){const fromSchemaPath=resolveFieldFromSchemaPath(issue.schemaPath);if(fromSchemaPath)return fromSchemaPath;if(normalizeText(issue.keyword).toLowerCase()===`if`)return resolveConditionalIssueField(issue,schema);return``}function shouldSuppressRootUnionGlobalIssue(issue={},fieldErrors={}){if(Object.keys(fieldErrors).length<1)return false;const keyword=normalizeText(issue.keyword).toLowerCase();if(keyword!==`anyof`&&keyword!==`oneof`&&keyword!==`allof`)return false;const instancePath=normalizeText(issue.instancePath);const schemaPath=normalizeText(issue.schemaPath);return!instancePath&&(schemaPath===`#`||schemaPath===`#/`)}function resolveMissingRequiredFields(issue={}){const params=isRecord$4(issue.params)?issue.params:{};return(Array.isArray(params.requiredProperties)?params.requiredProperties:[]).map(entry=>normalizeText(entry)).filter(Boolean)}function resolveSchemaMessages(schema={}){const messages=(isRecord$4(schema)?schema:{}).messages;return isRecord$4(messages)?messages:{}}function resolveFieldSchema(schema={},field=``){const source=isRecord$4(schema)?schema:{};const fieldSchema=(isRecord$4(source.properties)?source.properties:{})[field];return isRecord$4(fieldSchema)?fieldSchema:null}function resolveIssueMessageFromSchema(field,issue,schema={}){const keyword=normalizeText(issue?.keyword);if(field){const fieldMessages=resolveSchemaMessages(resolveFieldSchema(schema,field));const fieldKeywordMessage=normalizeText(fieldMessages[keyword]);if(fieldKeywordMessage)return fieldKeywordMessage;const fieldDefaultMessage=normalizeText(fieldMessages.default);if(fieldDefaultMessage)return fieldDefaultMessage}const schemaMessages=resolveSchemaMessages(schema);const schemaKeywordMessage=normalizeText(schemaMessages[keyword]);if(schemaKeywordMessage)return schemaKeywordMessage;const schemaDefaultMessage=normalizeText(schemaMessages.default);if(schemaDefaultMessage)return schemaDefaultMessage;const issueMessage=normalizeText(issue?.message);if(issueMessage)return issueMessage;return`Invalid value.`}function mapOperationIssues(issues=[],schema={}){const source=Array.isArray(issues)?issues:[];const fieldErrors={};const globalErrors=[];for(const issue of source){const missingRequiredFields=resolveMissingRequiredFields(issue);if(missingRequiredFields.length>0){for(const field of missingRequiredFields){if(Object.hasOwn(fieldErrors,field))continue;fieldErrors[field]=resolveIssueMessageFromSchema(field,issue,schema)}continue}const field=resolveIssueField(issue)||resolveFallbackIssueField(issue,schema);if(field){if(!Object.hasOwn(fieldErrors,field))fieldErrors[field]=resolveIssueMessageFromSchema(field,issue,schema);continue}if(shouldSuppressRootUnionGlobalIssue(issue,fieldErrors))continue;globalErrors.push(resolveIssueMessageFromSchema(``,issue,schema))}return{fieldErrors,globalErrors}}function resolveOperationSection(operation={},section=`body`){if(!operation||typeof operation!==`object`||Array.isArray(operation))return null;return operation[section]==null?null:operation[section]}function buildValidationSuccessResult(value){return{ok:true,value,normalized:value,fieldErrors:{},globalErrors:[],issues:[]}}function isFieldValidationError(error){return Boolean(error?.fieldErrors&&typeof error.fieldErrors===`object`)}function buildValidationFailureResult(error,normalized){return{ok:false,value:null,normalized,fieldErrors:error.fieldErrors,globalErrors:[],issues:[]}}function validateOperationSection({operation={},section=`body`,value,context={}}={}){const sectionDefinition=resolveOperationSection(operation,section);if(!sectionDefinition)return buildValidationSuccessResult(value);try{return buildValidationSuccessResult(validateSchemaPayload(sectionDefinition,value,{phase:`input`,context:`operation section "${section}"`}))}catch(error){if(!isFieldValidationError(error))throw error;return buildValidationFailureResult(error,value)}}function validateOperationInput({operation={},input={},context={}}={}){const source=input&&typeof input===`object`&&!Array.isArray(input)?input:{};const sectionResults={params:validateOperationSection({operation,section:`params`,value:source.params,context}),query:validateOperationSection({operation,section:`query`,value:source.query,context}),body:validateOperationSection({operation,section:`body`,value:source.body,context})};const fieldErrors={...sectionResults.params.fieldErrors,...sectionResults.query.fieldErrors,...sectionResults.body.fieldErrors};const globalErrors=[...sectionResults.params.globalErrors,...sectionResults.query.globalErrors,...sectionResults.body.globalErrors];return{ok:sectionResults.params.ok&&sectionResults.query.ok&&sectionResults.body.ok,value:{params:sectionResults.params.value,query:sectionResults.query.value,body:sectionResults.body.value},normalized:{params:sectionResults.params.normalized,query:sectionResults.query.normalized,body:sectionResults.body.normalized},fieldErrors,globalErrors,issues:[...sectionResults.params.issues,...sectionResults.query.issues,...sectionResults.body.issues]}}var JSON_API_RESULT_MARKER=`__jskitJsonApiResult`;var JSON_API_RESULT_KINDS=Object.freeze([`data`,`document`,`meta`]);function normalizeJsonApiResultKind(kind=``){const normalizedKind=String(kind||``).trim().toLowerCase();if(!JSON_API_RESULT_KINDS.includes(normalizedKind))throw new TypeError(`Unsupported JSON:API result kind: ${normalizedKind||`<empty>`}.`);return normalizedKind}function isJsonApiResult(value){return Boolean(value)&&typeof value===`object`&&!Array.isArray(value)&&value[`__jskitJsonApiResult`]===true&&JSON_API_RESULT_KINDS.includes(String(value.kind||``).trim().toLowerCase())}function isJsonApiResultKind(value,kind){return isJsonApiResult(value)&&value.kind===normalizeJsonApiResultKind(kind)}function isJsonApiDataResult(value){return isJsonApiResultKind(value,`data`)}function isJsonApiDocumentResult(value){return isJsonApiResultKind(value,`document`)}function isJsonApiMetaResult(value){return isJsonApiResultKind(value,`meta`)}function unwrapJsonApiResult(value){if(!isJsonApiResult(value))return null;return value}var JSON_API_ID_SCHEMA=Object.freeze({anyOf:[{type:`string`,minLength:1},{type:`number`}]});var JSON_API_LINK_VALUE_SCHEMA=Object.freeze({anyOf:[{type:`string`,minLength:1},{type:`object`,additionalProperties:true}]});var JSON_API_LINKS_SCHEMA=Object.freeze({type:`object`,additionalProperties:JSON_API_LINK_VALUE_SCHEMA});var JSON_API_META_SCHEMA=Object.freeze({type:`object`,additionalProperties:true});var JSON_API_RESOURCE_IDENTIFIER_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`type`,`id`],properties:{type:{type:`string`,minLength:1},id:JSON_API_ID_SCHEMA}});var JSON_API_RELATIONSHIP_OBJECT_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`data`],properties:{data:{anyOf:[JSON_API_RESOURCE_IDENTIFIER_SCHEMA,{type:`array`,items:JSON_API_RESOURCE_IDENTIFIER_SCHEMA},{type:`null`}]}}});var JSON_API_INCLUDED_RESOURCE_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`type`,`id`],properties:{type:{type:`string`,minLength:1},id:JSON_API_ID_SCHEMA,attributes:{type:`object`,additionalProperties:true},relationships:{type:`object`,additionalProperties:JSON_API_RELATIONSHIP_OBJECT_SCHEMA},links:JSON_API_LINKS_SCHEMA,meta:JSON_API_META_SCHEMA}});var JSON_API_ERROR_OBJECT_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,properties:{status:{type:`string`,minLength:1},code:{type:`string`,minLength:1},title:{type:`string`,minLength:1},detail:{type:`string`,minLength:1},source:{type:`object`,additionalProperties:true},links:JSON_API_LINKS_SCHEMA,meta:JSON_API_META_SCHEMA}});var JSON_API_ERROR_DOCUMENT_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`errors`],properties:{errors:{type:`array`,minItems:1,items:JSON_API_ERROR_OBJECT_SCHEMA},links:JSON_API_LINKS_SCHEMA,meta:JSON_API_META_SCHEMA}});function isRecord(value){return Boolean(value)&&typeof value===`object`&&!Array.isArray(value)}function createJsonApiTransportError(statusCode,message,code){const error=new Error(String(message||`JSON:API transport error.`));error.status=Number(statusCode)||500;error.statusCode=error.status;error.code=String(code||`jsonapi_transport_error`).trim()||`jsonapi_transport_error`;return error}function resolveRouteType(type=``){const normalizedType=String(type||``).trim();if(!normalizedType)throw new TypeError(`JSON:API resource transport requires a non-empty type.`);return normalizedType}function resolveRouteTypes(value={}){const resolvedTypes=resolveJsonApiTransportTypes(value,{context:`JSON:API resource transport`});return Object.freeze({requestType:resolvedTypes.requestType?resolveRouteType(resolvedTypes.requestType):``,responseType:resolvedTypes.responseType?resolveRouteType(resolvedTypes.responseType):``})}function resolveEmbeddedAttributesTransportSchema(definition,{context=`JSON:API resource`,defaultMode=`replace`,removeId=false,removeKeys=[],allowSparseFields=false}={}){const transportSchema=resolveSchemaTransportSchemaDefinition(definition,{context,defaultMode});if(!transportSchema||typeof transportSchema!==`object`||Array.isArray(transportSchema))throw new TypeError(`${context} transport schema must resolve to an object schema.`);const sourceSchema=normalizeObject(transportSchema);const nextProperties={...normalizeObject(sourceSchema.properties)};const excludedKeys=new Set(normalizeArray(removeKeys).map(entry=>String(entry||``).trim()).filter(Boolean));if(removeId)excludedKeys.add(`id`);for(const key of excludedKeys)delete nextProperties[key];const schemaFieldDefinitions=(()=>{const fieldDefinitions=definition?.schema?.getFieldDefinitions?.();return isRecord(fieldDefinitions)?fieldDefinitions:{}})();const required=allowSparseFields!==true&&Array.isArray(sourceSchema.required)?sourceSchema.required.filter(entry=>{const normalizedEntry=String(entry||``).trim();if(!normalizedEntry||excludedKeys.has(normalizedEntry))return false;return normalizeObject(schemaFieldDefinitions[normalizedEntry]).nullable!==true}):[];const attributeSchema={...sourceSchema,type:`object`,properties:nextProperties};if(required.length>0)attributeSchema.required=required;else delete attributeSchema.required;return createEmbeddableTransportSchemaDocument(attributeSchema,`${normalizeText(context,{fallback:`JsonApiAttributes`}).replace(/[^a-z0-9]+/gi,`_`)}`)}function normalizeRelationshipSchemaEntries(entries=[]){const normalizedEntries=[];for(const entry of normalizeArray(entries)){const source=normalizeObject(entry);const relationshipName=normalizeText(source.relationshipName||source.name);const relationshipType=normalizeText(source.relationshipType||source.type);const attributeKey=normalizeText(source.attributeKey||source.fieldKey);if(!relationshipName)continue;normalizedEntries.push(Object.freeze({relationshipName,relationshipType,attributeKey,many:source.many===true,required:source.required===true,nullable:source.nullable===true}))}return Object.freeze(normalizedEntries)}function createJsonApiRelationshipDataSchema(relationshipType=``,{many=false,nullable=false}={}){const normalizedRelationshipType=normalizeText(relationshipType);const resourceIdentifierSchema=normalizedRelationshipType?{type:`object`,additionalProperties:false,required:[`type`,`id`],properties:{type:{const:normalizedRelationshipType},id:JSON_API_ID_SCHEMA}}:JSON_API_RESOURCE_IDENTIFIER_SCHEMA;const linkageSchema=many?{type:`array`,items:resourceIdentifierSchema}:resourceIdentifierSchema;return{anyOf:nullable?[linkageSchema,{type:`null`}]:[linkageSchema]}}function createJsonApiRelationshipsTransportSchema(entries=[],{includeRequired=false}={}){const relationshipEntries=normalizeRelationshipSchemaEntries(entries);if(relationshipEntries.length<1)return null;const properties={};const required=[];for(const entry of relationshipEntries){properties[entry.relationshipName]={type:`object`,additionalProperties:false,required:[`data`],properties:{data:createJsonApiRelationshipDataSchema(entry.relationshipType,{many:entry.many,nullable:entry.nullable})}};if(includeRequired&&entry.required)required.push(entry.relationshipName)}const schema={type:`object`,additionalProperties:false,properties};if(required.length>0)schema.required=required;return Object.freeze({schema,entries:relationshipEntries})}function createJsonApiResourceObjectTransportSchema({type=``,attributes,requireId=true,includeLinks=false,includeMeta=false,excludeAttributeKeys=[],relationshipEntries=[],relationshipMembersRequired=false,allowSparseFields=false}={}){const normalizedType=resolveRouteType(type);const relationshipsTransport=createJsonApiRelationshipsTransportSchema(relationshipEntries,{includeRequired:relationshipMembersRequired});const relationFieldKeys=relationshipsTransport?relationshipsTransport.entries.map(entry=>entry.attributeKey).filter(Boolean):[];const embeddedAttributes=resolveEmbeddedAttributesTransportSchema(attributes,{context:`${normalizedType} resource attributes`,defaultMode:`replace`,removeId:true,removeKeys:[...normalizeArray(excludeAttributeKeys),...relationFieldKeys],allowSparseFields});const properties={type:{const:normalizedType},attributes:embeddedAttributes.schema};const required=allowSparseFields===true?[`type`]:[`type`,`attributes`];if(requireId){properties.id=JSON_API_ID_SCHEMA;required.push(`id`)}if(relationshipsTransport)properties.relationships=relationshipsTransport.schema;if(includeLinks)properties.links=JSON_API_LINKS_SCHEMA;if(includeMeta)properties.meta=JSON_API_META_SCHEMA;return{schema:{type:`object`,additionalProperties:false,required,properties},definitions:embeddedAttributes.definitions,hasRelationships:Boolean(relationshipsTransport)}}function createJsonApiResourceRequestBodyTransportSchema({type=``,attributes,requireId=false,excludeAttributeKeys=[],relationshipEntries=[]}={}){const resourceTransport=createJsonApiResourceObjectTransportSchema({type,attributes,requireId,excludeAttributeKeys,relationshipEntries,relationshipMembersRequired:true});const embeddedResource=createEmbeddableTransportSchemaDocument({...resourceTransport.schema,definitions:resourceTransport.definitions},`${resolveRouteType(type)}RequestResource`);return{type:`object`,additionalProperties:false,required:[`data`],properties:{data:embeddedResource.schema},definitions:embeddedResource.definitions}}function createJsonApiMetaSuccessTransportSchema({meta}={}){const embeddedMeta=resolveEmbeddedAttributesTransportSchema(meta,{context:`JSON:API success meta`,defaultMode:`replace`,removeId:false});return{type:`object`,additionalProperties:false,required:[`meta`],properties:{meta:embeddedMeta.schema},definitions:embeddedMeta.definitions}}function createJsonApiResourceSuccessTransportSchema({type=``,attributes,kind=`record`,includeLinks=false,includeMeta=false,includeIncluded=false,allowSparseFields=false,excludeAttributeKeys=[],relationshipEntries=[]}={}){const normalizedKind=String(kind||`record`).trim().toLowerCase();if(![`record`,`nullable-record`,`collection`,`meta`].includes(normalizedKind))throw new TypeError(`Unsupported JSON:API success schema kind: ${normalizedKind||`<empty>`}.`);if(normalizedKind===`meta`)return createJsonApiMetaSuccessTransportSchema({meta:attributes});const resourceTransport=createJsonApiResourceObjectTransportSchema({type,attributes,requireId:true,allowSparseFields,excludeAttributeKeys,relationshipEntries});const embeddedResource=createEmbeddableTransportSchemaDocument({...resourceTransport.schema,definitions:resourceTransport.definitions},`${resolveRouteType(type)}SuccessResource`);const documentProperties={};const documentDefinitions={...resourceTransport.definitions,...embeddedResource.definitions};if(normalizedKind===`collection`)documentProperties.data={type:`array`,items:embeddedResource.schema};else if(normalizedKind===`nullable-record`)documentProperties.data={anyOf:[{type:`null`},embeddedResource.schema]};else documentProperties.data=embeddedResource.schema;if(includeIncluded||resourceTransport.hasRelationships)documentProperties.included={type:`array`,items:JSON_API_INCLUDED_RESOURCE_SCHEMA};if(includeLinks)documentProperties.links=JSON_API_LINKS_SCHEMA;if(includeMeta)documentProperties.meta=JSON_API_META_SCHEMA;return{type:`object`,additionalProperties:false,required:[`data`],properties:documentProperties,definitions:documentDefinitions}}function withJsonApiErrorResponses(successResponses,{includeValidation400=false}={}){const responses={...normalizeObject(successResponses)};for(const statusCode of STANDARD_ERROR_STATUS_CODES){if(responses[statusCode])continue;if(statusCode===400&&!includeValidation400)continue;responses[statusCode]=createTransportResponseSchema(JSON_API_ERROR_DOCUMENT_SCHEMA)}return responses}function defaultRecordTypeResolver(type){return function resolveRecordType(){return type}}function defaultRecordIdResolver(record={}){if(!isRecord(record)||record.id==null||String(record.id).trim()===``)throw createJsonApiTransportError(500,`JSON:API resource response requires record.id.`,`jsonapi_record_id_missing`);return record.id}function defaultRecordAttributesResolver(record={}){if(!isRecord(record))return{};const attributes={...record};delete attributes.id;return attributes}function defaultCollectionItemsResolver(payload){if(Array.isArray(payload))return payload;return Array.isArray(payload?.items)?payload.items:[]}function defaultCollectionMetaResolver(payload){const nextCursor=String(payload?.nextCursor||``).trim();if(!nextCursor)return;return{page:{nextCursor}}}function assertJsonApiSuccessResult(payload){const result=unwrapJsonApiResult(payload);if(!result)throw createJsonApiTransportError(500,`JSON:API route success payload must be returned with an explicit JSON:API result wrapper.`,`jsonapi_success_result_missing`);return result}function createJsonApiResourceRouteTransport({type=``,requestType=``,responseType=``,query=null,allowBodyId=false,successKind=`record`,pointerPrefix=`/data/attributes`,mapRequestRelationships=null,getRecordType=null,getRecordId=null,getRecordAttributes=null,getRecordRelationships=null,getRecordLinks=null,getRecordMeta=null,getIncluded=null,getDocumentLinks=null,getDocumentMeta=null,getCollectionItems=null}={}){const resolvedTypes=resolveRouteTypes({type,requestType,responseType});const normalizedRequestType=resolvedTypes.requestType;const normalizedResponseType=resolvedTypes.responseType;const normalizedSuccessKind=String(successKind||`record`).trim().toLowerCase();const resolveRecordType=typeof getRecordType===`function`?getRecordType:defaultRecordTypeResolver(normalizedResponseType);const resolveRecordId=typeof getRecordId===`function`?getRecordId:defaultRecordIdResolver;const resolveRecordAttributes=typeof getRecordAttributes===`function`?getRecordAttributes:defaultRecordAttributesResolver;const resolveCollectionItems=typeof getCollectionItems===`function`?getCollectionItems:defaultCollectionItemsResolver;const resolveDocumentMeta=typeof getDocumentMeta===`function`?getDocumentMeta:defaultCollectionMetaResolver;function buildResourceObject(record,context){if(!isRecord(record))throw createJsonApiTransportError(500,`JSON:API resource response requires an object record.`,`jsonapi_record_invalid`);const resourceOptions={type:resolveRecordType(record,context),id:resolveRecordId(record,context),attributes:resolveRecordAttributes(record,context)};if(typeof getRecordRelationships===`function`){const relationships=getRecordRelationships(record,context);if(relationships!==void 0)resourceOptions.relationships=relationships}if(typeof getRecordLinks===`function`){const links=getRecordLinks(record,context);if(links!==void 0)resourceOptions.links=links}if(typeof getRecordMeta===`function`){const meta=getRecordMeta(record,context);if(meta!==void 0)resourceOptions.meta=meta}return createJsonApiResourceObject(resourceOptions)}return Object.freeze({kind:`jsonapi-resource`,contentType:JSON_API_CONTENT_TYPE,request:{body(payload){if(!normalizedRequestType)throw createJsonApiTransportError(500,`JSON:API request transport requires requestType for body parsing.`,`jsonapi_request_type_missing`);const document=normalizeJsonApiDocument(payload);if(document.kind!==`resource`||document.data==null)throw createJsonApiTransportError(400,`JSON:API request body must contain a resource document.`,`jsonapi_request_body_invalid`);if(String(document.data.type||``).trim()!==normalizedRequestType)throw createJsonApiTransportError(409,`JSON:API resource type must be ${normalizedRequestType}.`,`jsonapi_request_type_mismatch`);const nextBody={...document.data.attributes||{}};if(allowBodyId&&document.data.id!=null&&String(document.data.id).trim())nextBody.id=document.data.id;if(typeof mapRequestRelationships===`function`)Object.assign(nextBody,mapRequestRelationships(document.data.relationships||{},{payload,document})||{});return nextBody},query(payload){if(!query)return payload;return decodeJsonApiResourceQueryObject(payload,{responseType:normalizedResponseType})}},response(payload,context={}){if(normalizedSuccessKind===`no-content`||Number(context?.statusCode||200)===204)return;const result=assertJsonApiSuccessResult(payload);if(isJsonApiDocumentResult(result)){const document=normalizeJsonApiDocument(result.value);if(document.kind===`unknown`)throw createJsonApiTransportError(500,`JSON:API document result must contain a valid JSON:API document.`,`jsonapi_document_result_invalid`);if(normalizedSuccessKind===`collection`&&document.kind!==`collection`)throw createJsonApiTransportError(500,`JSON:API collection route requires a collection document result.`,`jsonapi_document_result_kind_mismatch`);if((normalizedSuccessKind===`record`||normalizedSuccessKind===`nullable-record`)&&document.kind!==`resource`)throw createJsonApiTransportError(500,`JSON:API record route requires a resource document result.`,`jsonapi_document_result_kind_mismatch`);if(normalizedSuccessKind===`meta`&&document.kind!==`meta`)throw createJsonApiTransportError(500,`JSON:API meta route requires a meta-only document result.`,`jsonapi_document_result_kind_mismatch`);return result.value}if(normalizedSuccessKind===`meta`){if(isJsonApiMetaResult(result))return createJsonApiDocument({meta:result.value});throw createJsonApiTransportError(500,`JSON:API meta route requires a meta result.`,`jsonapi_meta_result_missing`)}if(!isJsonApiDataResult(result))throw createJsonApiTransportError(500,`JSON:API resource route requires a data or document result.`,`jsonapi_success_result_kind_invalid`);const sourcePayload=result.value;if(normalizedSuccessKind===`collection`){const documentOptions={data:normalizeArray(resolveCollectionItems(sourcePayload,context)).map(entry=>buildResourceObject(entry,context))};if(typeof getIncluded===`function`){const included=normalizeArray(getIncluded(sourcePayload,context));if(included.length>0)documentOptions.included=included}const links=typeof getDocumentLinks===`function`?getDocumentLinks(sourcePayload,context):void 0;if(links!==void 0)documentOptions.links=links;const meta=resolveDocumentMeta(sourcePayload,context);if(meta!==void 0)documentOptions.meta=meta;return createJsonApiDocument(documentOptions)}if(sourcePayload==null){if(normalizedSuccessKind===`nullable-record`)return createJsonApiDocument({data:null});throw createJsonApiTransportError(500,`JSON:API resource response requires a record payload.`,`jsonapi_record_missing`)}const documentOptions={data:buildResourceObject(sourcePayload,context)};if(typeof getIncluded===`function`){const included=normalizeArray(getIncluded(sourcePayload,context));if(included.length>0)documentOptions.included=included}if(typeof getDocumentLinks===`function`){const links=getDocumentLinks(sourcePayload,context);if(links!==void 0)documentOptions.links=links}if(typeof getDocumentMeta===`function`){const meta=getDocumentMeta(sourcePayload,context);if(meta!==void 0)documentOptions.meta=meta}return createJsonApiDocument(documentOptions)},error(error,{statusCode=500,code=``,message=error?.message,exposeDetails=true}={}){const fieldErrors=!exposeDetails?{}:isRecord(error?.fieldErrors)?error.fieldErrors:isRecord(error?.details?.fieldErrors)?error.details.fieldErrors:{};return createJsonApiErrorDocumentFromFailure({statusCode,code,message,transactionOutcome:error?.transactionOutcome,fieldErrors,validationIssues:exposeDetails&&Array.isArray(error?.validation)?error.validation:[],validationContext:String(error?.validationContext||``).trim(),pointerPrefix})}})}function createJsonApiResourceRouteContract({type=``,requestType=``,responseType=``,body=null,query=null,output=null,outputKind=`record`,successStatus=200,includeValidation400=false,allowSparseFields=false,allowBodyId=false,pointerPrefix=`/data/attributes`,bodyAttributeExcludeKeys=[],outputAttributeExcludeKeys=[],bodyRelationshipEntries=[],outputRelationshipEntries=[],getRecordType=null,getRecordId=null,getRecordAttributes=null,getRecordRelationships=null,getRecordLinks=null,getRecordMeta=null,getIncluded=null,getDocumentLinks=null,getDocumentMeta=null,getCollectionItems=null,mapRequestRelationships=null}={}){const resolvedTypes=resolveRouteTypes({type,requestType,responseType});const normalizedRequestType=resolvedTypes.requestType;const normalizedResponseType=resolvedTypes.responseType;const normalizedOutputKind=String(outputKind||`record`).trim().toLowerCase();const statusCode=Number(successStatus);if(!Number.isInteger(statusCode)||statusCode<200||statusCode>299)throw new TypeError(`JSON:API resource route contract requires a 2xx successStatus.`);const contract={transport:createJsonApiResourceRouteTransport({requestType:normalizedRequestType,responseType:normalizedResponseType,query,allowBodyId,successKind:normalizedOutputKind,pointerPrefix,getRecordType,getRecordId,getRecordAttributes,getRecordRelationships,getRecordLinks,getRecordMeta,getIncluded,getDocumentLinks,getDocumentMeta,getCollectionItems,mapRequestRelationships})};const fastifySchema={};if(body){contract.body=body;fastifySchema.body=createJsonApiResourceRequestBodyTransportSchema({type:normalizedRequestType,attributes:body,requireId:allowBodyId,excludeAttributeKeys:bodyAttributeExcludeKeys,relationshipEntries:bodyRelationshipEntries})}if(query){contract.query=query;fastifySchema.querystring=createJsonApiResourceQueryTransportSchema({query,responseType:normalizedResponseType})}if(Object.keys(fastifySchema).length>0)contract.advanced={fastifySchema};const successResponses={};if(normalizedOutputKind!==`no-content`){if(!output)throw new TypeError(`JSON:API resource route contract for ${normalizedResponseType} requires output schema.`);successResponses[statusCode]=createTransportResponseSchema(createJsonApiResourceSuccessTransportSchema({type:normalizedResponseType,attributes:output,kind:normalizedOutputKind,includeLinks:typeof getDocumentLinks===`function`,includeMeta:typeof getDocumentMeta===`function`||normalizedOutputKind===`collection`,includeIncluded:typeof getIncluded===`function`,allowSparseFields,excludeAttributeKeys:outputAttributeExcludeKeys,relationshipEntries:outputRelationshipEntries}))}contract.responses=withJsonApiErrorResponses(successResponses,{includeValidation400});return Object.freeze(contract)}var HTTP_VALIDATORS_API=Object.freeze({createPaginationQuerySchema,fieldErrorsFieldDefinition,apiErrorDetailsSchema,apiValidationErrorDetailsSchema,apiErrorOutputValidator,apiValidationErrorOutputValidator,apiErrorTransportSchema,apiValidationErrorTransportSchema,fastifyDefaultErrorTransportSchema,STANDARD_ERROR_STATUS_CODES,createTransportResponseSchema,passthroughErrorResponses,withStandardErrorResponses,enumSchema,createCursorPagedListResponseSchema,createResource,createCommand,resolveSchemaMessages,resolveFieldSchema,resolveIssueField,resolveMissingRequiredFields,resolveIssueMessageFromSchema,mapOperationIssues,validateOperationSection,validateOperationInput,JSON_API_CONTENT_TYPE,createJsonApiDocument,createJsonApiErrorDocumentFromFailure,createJsonApiErrorObject,createJsonApiResourceObject,isJsonApiCollectionDocument,isJsonApiContentType,isJsonApiErrorDocument,isJsonApiResourceDocument,isJsonContentType,normalizeJsonApiDocument,normalizeJsonApiResourceObject,resolveJsonApiTransportTypes,simplifyJsonApiDocument,JSON_API_QUERY_PAGE_CURSOR_KEY,JSON_API_QUERY_PAGE_LIMIT_KEY,JSON_API_QUERY_INCLUDE_KEY,JSON_API_QUERY_SORT_KEY,mapPlainQueryKeyToTransportKey,mapTransportQueryKeyToPlainKey,encodeJsonApiResourceQueryObject,decodeJsonApiResourceQueryObject,createJsonApiResourceQueryTransportSchema,JSON_API_ERROR_DOCUMENT_SCHEMA,createJsonApiResourceObjectTransportSchema,createJsonApiResourceRequestBodyTransportSchema,createJsonApiResourceSuccessTransportSchema,withJsonApiErrorResponses,createJsonApiResourceRouteTransport,createJsonApiResourceRouteContract});var HttpValidatorsClientProvider=defineProvider({id:`validators.http.client`,provides:{validators:`validators.http.client`},setup(){return{validators:HTTP_VALIDATORS_API}}});var clientRuntime_exports=__exportAll({DEFAULT_RETRYABLE_CSRF_ERROR_CODES:()=>DEFAULT_RETRYABLE_CSRF_ERROR_CODES,createHttpClient:()=>createHttpClient,createHttpError:()=>createHttpError,createNetworkError:()=>createNetworkError,hasHeader:()=>hasHeader,normalizeHeaderName:()=>normalizeHeaderName,setHeaderIfMissing:()=>setHeaderIfMissing,shouldRetryForCsrfFailure:()=>shouldRetryForCsrfFailure});var HTTP_CLIENT_RUNTIME_CLIENT_API=Object.freeze({...clientRuntime_exports});var HttpClientRuntimeClientProvider=defineProvider({id:`runtime.http-client.client`,provides:{httpClient:`runtime.http-client.client`},setup(){return{httpClient:HTTP_CLIENT_RUNTIME_CLIENT_API}}});var client_exports=__exportAll({DEFAULT_RETRYABLE_CSRF_ERROR_CODES:()=>DEFAULT_RETRYABLE_CSRF_ERROR_CODES,HttpClientRuntimeClientProvider:()=>HttpClientRuntimeClientProvider,HttpValidatorsClientProvider:()=>HttpValidatorsClientProvider,createHttpClient:()=>createHttpClient,createHttpError:()=>createHttpError,createNetworkError:()=>createNetworkError,createTransientRetryHttpClient:()=>createTransientRetryHttpClient,createValidationFailure:()=>createValidationFailure,hasHeader:()=>hasHeader,normalizeFieldErrors:()=>normalizeFieldErrors,normalizeHeaderName:()=>normalizeHeaderName,resolveFieldErrors:()=>resolveFieldErrors,setHeaderIfMissing:()=>setHeaderIfMissing,shouldRetryForCsrfFailure:()=>shouldRetryForCsrfFailure});function normalizeOptions(value=null){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function createHttpWebClient(options={}){const source=normalizeOptions(options);const sourceCsrf=normalizeOptions(source.csrf);return createTransientRetryHttpClient({...source,credentials:source.credentials??`include`,csrf:{sessionPath:`/api/session`,...sourceCsrf}})}var httpWebClient=createHttpWebClient();function configureHttpWebClient(optionsOrClient={}){const source=normalizeOptions(optionsOrClient);httpWebClient=typeof source.request===`function`?source:createHttpWebClient(source);return httpWebClient}function getHttpWebClient(){return httpWebClient}function firstRouteParam(value){const rawValue=Array.isArray(value)?value[0]:value;return String(rawValue||``).trim()}var VIBE64_PROJECT_APP_PATH_PREFIX=`/app/project`;function normalizedProjectRouteSuffix(suffix=``){const normalized=String(suffix||``).trim();if(!normalized)return``;return normalized.startsWith(`/`)?normalized:`/${normalized}`}function normalizeProjectRoutePath(path=``){const normalized=String(path||``).trim();if(!normalized||normalized===`/`)return`/`;const compacted=(normalized.startsWith(`/`)?normalized:`/${normalized}`).replace(/\/{2,}/gu,`/`);if(compacted===`/`)return`/`;return compacted.replace(/\/+$/u,``)||`/`}function projectAppPath(slug=``,suffix=``){const projectSlug=String(slug||``).trim();if(!projectSlug)return`/app`;return`${VIBE64_PROJECT_APP_PATH_PREFIX}/${encodeURIComponent(projectSlug)}${normalizedProjectRouteSuffix(suffix)}`}function projectSlugFromPathname(pathname=``){const match=/^\/app\/project\/([^/?#]+)/u.exec(String(pathname||``));return decodeURIComponent(match?.[1]||``).trim()||``}function currentProjectSlugFromLocation(browserWindow=globalThis.window){return projectSlugFromPathname(browserWindow?.location?.pathname||``)}function projectSlugFromRoute(route={}){return firstRouteParam(route?.params?.slug)||currentProjectSlugFromLocation()}function projectScopeValue(slug=currentProjectSlugFromLocation()){return String(slug||``).trim()||`unscoped`}function vibe64ProjectQueryScope(slug=currentProjectSlugFromLocation()){return[`project`,projectScopeValue(slug)]}function vibe64ProjectScopedStorageKey(baseKey=``,slug=currentProjectSlugFromLocation()){const normalizedBaseKey=String(baseKey||``).trim();if(!normalizedBaseKey)return``;return`${normalizedBaseKey}:project:${encodeURIComponent(projectScopeValue(slug))}`}export{appendQueryString as A,RECORD_ID_PATTERN as C,buildJsonApiFieldsetsToken as D,createSchema as E,normalizeJsonApiFieldsets as O,encodeJsonApiResourceQueryObject as S,createCursorListValidator as T,createHttpClient as _,projectSlugFromRoute as a,hasPermission as b,configureHttpWebClient as c,httpWebClient as d,client_exports as f,createValidationFailure as g,defineProvider as h,projectSlugFromPathname as i,splitPathQueryAndHash as j,resolveFieldErrors as k,createHttpWebClient as l,createCapabilityRuntime as m,normalizeProjectRoutePath as n,vibe64ProjectQueryScope as o,validateOperationSection as p,projectAppPath as r,vibe64ProjectScopedStorageKey as s,currentProjectSlugFromLocation as t,getHttpWebClient as u,shouldRetryTransientQueryFailure as v,validateSchemaPayload as w,normalizePermissionList as x,transientQueryRetryDelay as y};
@@ -0,0 +1 @@
1
+ import{J as inject,g as computed,un as isRef}from"./runtime-core.esm-bundler-DGXg_mpN.js";var VIBE64_SAVED_ENV_VALUES_KEY=Symbol(`vibe64.saved-env-values`);var SAVED_ENV_VALUE_SOURCE=`vibe64-host:saved-value`;function recordIsSavedEnvValue(record={}){return record?.source===`vibe64-host:saved-value`&&record?.editable!==true}function savedEnvValueEnvironment(environmentLabel=``){return String(environmentLabel).toLowerCase()===`production`?`production`:`development`}function useVibe64SavedEnvValues(){const provided=inject(VIBE64_SAVED_ENV_VALUES_KEY,null);return computed(()=>{const host=isRef(provided)?provided.value:provided;return host&&host.component&&typeof host.label===`string`?host:null})}export{savedEnvValueEnvironment as n,useVibe64SavedEnvValues as r,recordIsSavedEnvValue as t};
@@ -0,0 +1 @@
1
+ .pr-destination[data-v-aa3e4084]{overflow-wrap:anywhere}.pr-details summary[data-v-aa3e4084]{cursor:pointer;min-height:48px}.vibe64-assistant-dialog__progress[data-v-93667ae5]{gap:.5rem;padding:0 1.5rem .5rem;display:grid}.vibe64-assistant-dialog[data-v-93667ae5]{border:1px solid rgba(var(--v-theme-outline), .18)}.vibe64-assistant-dialog__title[data-v-93667ae5]{justify-content:space-between;align-items:center;padding:1rem 1.25rem .75rem;display:flex}.vibe64-assistant-dialog__title-copy[data-v-93667ae5]{gap:.15rem;display:grid}.vibe64-assistant-dialog__title-copy small[data-v-93667ae5]{color:rgba(var(--v-theme-on-surface), .66);white-space:normal}.vibe64-assistant-dialog__body[data-v-93667ae5]{padding:.25rem 1.25rem 1rem!important}.vibe64-assistant-dialog__actions[data-v-93667ae5]{border-top:1px solid rgba(var(--v-theme-outline), .14);justify-content:flex-end;gap:.5rem;padding:.75rem 1.25rem}@media (width<=600px){.vibe64-assistant-dialog__body[data-v-93667ae5],.vibe64-assistant-dialog__actions[data-v-93667ae5],.vibe64-assistant-dialog__title[data-v-93667ae5]{padding-inline:1rem!important}}
@@ -0,0 +1 @@
1
+ import{D as createVNode,E as createTextVNode,Ht as watch,On as unref,_ as createBaseVNode,b as createElementBlock,g as computed,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,tt as nextTick,v as createBlock,vn as ref,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{d as VProgressLinear,h as VIcon}from"./ripple-EFNA8EBu.js";import{t as useEndpointResource}from"./useEndpointResource-Ds8EDBZ2.js";import{t as VSelect}from"./VSelect-D3oLvCcB.js";import{t as VTextField}from"./VTextField-C0b_0cSa.js";import{r as scopedDevelopmentApiUrl}from"./studioUrls-DpSS-0z1.js";import{Cr as mdiSourcePull,X as mdiClose}from"./mdi-Bt90Ns76.js";import{t as VBtn}from"./VBtn-BhVEwXLX.js";import{t as VAlert}from"./VAlert-gwuhYlYb.js";import{t as VSheet}from"./VSheet-DxYEFfnM.js";import{t as VDialog}from"./VDialog-CQDhjRiV.js";import{i as VCardTitle,n as VCardText,o as VCardActions,t as VCard}from"./VCard-C3Hx769y.js";import{t as VSpacer}from"./VSpacer-CgWOWvBh.js";import{b as useModelRouting,u as requestVibe64AiOnboarding}from"./client-BxGiylrJ.js";import{t as VSkeletonLoader}from"./VSkeletonLoader-Cync3lZZ.js";import{t as VSwitch}from"./VSwitch-BxGuGypi.js";import{t as VTextarea}from"./VTextarea-B7sZd1JY.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{c as vibe64AssistantSelectionLabel}from"./shared-DZETtWRH.js";import{t as useUiFeedback}from"./useUiFeedback-CMwE4MLs.js";import{S as requestVibe64AccountConnectionsDialog,b as readRefOrGetterValue}from"./index-Mxalhei8.js";import{a as vibe64SessionPullRequest,i as vibe64SessionDisplayTitle}from"./vibe64SessionViewModel-DR4tOlGM.js";import{n as githubProjectRepositoryName}from"./vibe64GithubProject-CdFrbVHp.js";var _hoisted_1$1={class:`d-flex align-center justify-space-between ga-2 pa-5 pb-2`};var _hoisted_2$1={class:`d-flex align-center ga-3`};var _hoisted_3$1={class:`text-label-large`};var _hoisted_4$1={class:`text-body-medium mt-1`};var _hoisted_5$1={key:0,role:`status`};var _sfc_main$1={__name:`Vibe64CreatePullRequestDialog`,props:{modelValue:Boolean,dashboardContext:{type:Object,default:()=>({})}},emits:[`update:modelValue`,`created`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const title=ref(``);const body=ref(``);const draft=ref(true);const pending=ref(false);const destinationReview=ref(null);const feedback=useUiFeedback({source:`vibe64.pullRequests.create`});const session=computed(()=>props.dashboardContext.session||{});const source=computed(()=>vibe64SessionPullRequest(session.value));const repository=computed(()=>githubProjectRepositoryName(props.dashboardContext.projectContext));const branch=computed(()=>{if(source.value?.headBranch)return source.value.headBranch;const destination=props.dashboardContext.workState?.destination;if(destination?.mode===`github`&&destination.branch!==props.dashboardContext.projectContext?.repository?.defaultBranch)return destination.branch;return`vibe64/pr-${props.dashboardContext.sessionId}`});const base=computed(()=>source.value?.baseBranch||props.dashboardContext.projectContext?.repository?.defaultBranch||``);const path=computed(()=>`${readRefOrGetterValue(props.dashboardContext.sessionsApiPath)}/${props.dashboardContext.sessionId}/pull-request`);const resource=useEndpointResource({path,queryKey:computed(()=>[`vibe64.createPullRequest`,path.value]),enabled:false});watch(()=>props.modelValue,open=>{if(open)destinationReview.value=props.dashboardContext.workState?.destination?{...props.dashboardContext.workState.destination}:null},{immediate:true});watch(()=>props.dashboardContext.sessionId,()=>{title.value=source.value?.title||vibe64SessionDisplayTitle(session.value);body.value=source.value?.body||``;draft.value=true},{immediate:true});async function submit(){if(pending.value||!title.value.trim())return;pending.value=true;try{const result=await resource.save({title:title.value.trim(),body:body.value,draft:draft.value,destinationReview:destinationReview.value},{method:`POST`});feedback.success(`Pull request created. Future commits update its source branch.`);emit(`created`,result.pullRequest);emit(`update:modelValue`,false);props.dashboardContext.refreshSessionWork?.()}catch(error){feedback.error(error,`The pull request could not be confirmed. Retry to check GitHub and continue.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"model-value":__props.modelValue,"max-width":`38rem`,scrollable:``,persistent:pending.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>emit(`update:modelValue`,$event))},{default:withCtx(()=>[createVNode(VCard,{rounded:`xl`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$1,[createBaseVNode(`div`,_hoisted_2$1,[createVNode(VIcon,{icon:unref(mdiSourcePull),color:`primary`},null,8,[`icon`]),_cache[6]||(_cache[6]=createBaseVNode(`h2`,{class:`text-title-large`},`Create pull request`,-1))]),createVNode(VBtn,{icon:unref(mdiClose),size:`48`,variant:`text`,"aria-label":`Close pull request dialog`,disabled:pending.value,onClick:_cache[0]||(_cache[0]=$event=>emit(`update:modelValue`,false))},null,8,[`icon`,`disabled`])]),createVNode(VCardText,{class:`d-flex flex-column ga-3`},{default:withCtx(()=>[createVNode(VSheet,{color:`surface-light`,rounded:`lg`,class:`pa-3 pr-destination`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_3$1,toDisplayString(repository.value),1),createBaseVNode(`div`,_hoisted_4$1,toDisplayString(branch.value)+` → `+toDisplayString(base.value),1),_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`text-body-small text-medium-emphasis mt-2 mb-0`},`The base branch stays unchanged.`,-1))]),_:1}),_cache[8]||(_cache[8]=createBaseVNode(`p`,{class:`text-body-small ma-0`},`Save open file edits first.`,-1)),!destinationReview.value?(openBlock(),createElementBlock(`p`,_hoisted_5$1,`Refresh repository status before creating a pull request.`)):createCommentVNode(``,true),createVNode(VTextField,{modelValue:title.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>title.value=$event),label:`Title`,variant:`outlined`,maxlength:`256`,disabled:pending.value,"hide-details":``},null,8,[`modelValue`,`disabled`]),createVNode(VTextarea,{modelValue:body.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>body.value=$event),label:`Description`,placeholder:`What changed, and how did you check it?`,variant:`outlined`,rows:`3`,"auto-grow":``,maxlength:`65536`,disabled:pending.value,"hide-details":``},null,8,[`modelValue`,`disabled`]),createVNode(VSwitch,{modelValue:draft.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>draft.value=$event),color:`primary`,label:`Create as draft`,disabled:pending.value,"hide-details":``},null,8,[`modelValue`,`disabled`]),_cache[9]||(_cache[9]=createBaseVNode(`details`,{class:`pr-details text-body-small`},[createBaseVNode(`summary`,{class:`py-3`},`What gets pushed`),createBaseVNode(`p`,null,`All saved file changes are committed and pushed to the PR branch. Database data and chat history are separate. GitHub automation may run; this does not deploy the app.`)],-1))]),_:1}),createVNode(VCardActions,{class:`pa-5 pt-2`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,height:`48`,disabled:pending.value,onClick:_cache[4]||(_cache[4]=$event=>emit(`update:modelValue`,false))},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`primary`,variant:`flat`,rounded:`pill`,height:`48`,disabled:pending.value||!title.value.trim()||!destinationReview.value||__props.dashboardContext.sourceOperationsSuspended,"aria-busy":pending.value,onClick:submit},{default:withCtx(()=>[createTextVNode(toDisplayString(pending.value?`Creating…`:draft.value?`Create draft PR`:`Create pull request`),1)]),_:1},8,[`disabled`,`aria-busy`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`])}}};var Vibe64CreatePullRequestDialog_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-aa3e4084`]]);var _hoisted_1={key:2,class:`text-body-medium mb-0`};var _hoisted_2={key:3,class:`d-flex flex-column ga-2`};var _hoisted_3={key:0,class:`d-flex flex-column ga-3 mt-3`};var _hoisted_4={key:0,class:`text-body-small`,style:{"overflow-wrap":`anywhere`}};var _hoisted_5={key:0,class:`vibe64-assistant-dialog__progress`,role:`status`,"aria-live":`polite`};var _sfc_main={__name:`Vibe64AssistantSessionDialog`,props:{modelValue:Boolean,toolbar:{type:Object,default:()=>({})}},emits:[`created`,`update:model-value`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const routing=useModelRouting({enabled:computed(()=>props.modelValue)});const mainSelection=computed(()=>routing.setups.value?.owner?.roles?.senior?.effective||routing.setups.value?.owner?.roles?.senior?.recommendation||null);const openConnectionSettings=()=>requestVibe64AccountConnectionsDialog({section:`ai`});function setUpAi(){close();requestVibe64AiOnboarding()}const submitButton=ref(null);const submitting=computed(()=>props.toolbar.createSessionRunning===true);const branchMode=ref(`project`);const chooseBranch=computed(()=>branchMode.value!==`project`);const createBranch=computed(()=>branchMode.value===`new`);const branchName=ref(``);const newBranchName=ref(``);const branchProject=computed(()=>props.toolbar.projectContext||{});const branchSelectionAvailable=computed(()=>!props.toolbar.repositoryBranchSelectionDisabled&&[`github`,`managed_git`].includes(branchProject.value.repositoryMode||branchProject.value.repository?.mode));const branchChoices=computed(()=>[{title:`Project branch (${branchProject.value.repository?.defaultBranch||`main`})`,value:`project`},{title:`Create a new branch`,value:`new`},{title:`Use an existing branch`,value:`existing`}]);const branchRepository=computed(()=>branchProject.value.githubRepository?.fullName||branchProject.value.repository?.github?.fullName||branchProject.value.slug);const branchPath=computed(()=>scopedDevelopmentApiUrl(`/api/vibe64/repository/branches`,branchProject.value.slug));const branches=useEndpointResource({path:branchPath,queryKey:computed(()=>[`vibe64.branches`,branchPath.value]),enabled:computed(()=>props.modelValue&&branchSelectionAvailable.value&&chooseBranch.value),queryOptions:{retry:false},fallbackLoadError:`Repository branches could not load.`});const selectedBranch=computed(()=>branches.data.value?.branches?.find(item=>item.name===branchName.value));const branchAlreadyExists=computed(()=>branches.data.value?.branches?.some(item=>item.name===newBranchName.value.trim()));const branchSelectionReady=computed(()=>{if(!chooseBranch.value)return true;if(!selectedBranch.value||branches.isLoading.value||branches.loadError.value)return false;return!createBranch.value||Boolean(newBranchName.value.trim())&&!branchAlreadyExists.value});watch(()=>branches.data.value,value=>{if(!value?.branches?.some(item=>item.name===branchName.value))branchName.value=value?.defaultBranch||``},{immediate:true});function close(){if(!submitting.value)emit(`update:model-value`,false)}async function submit(){if(!mainSelection.value||submitting.value||!branchSelectionReady.value)return;let response;try{const options={};if(chooseBranch.value)options.repositoryBranch={name:createBranch.value?newBranchName.value.trim():branchName.value,...createBranch.value?{fromBranch:branchName.value}:{},expectedCommit:selectedBranch.value.commit};response=await props.toolbar.createSession?.({},options)}catch{return}if(response?.ok!==false&&response?.sessionId){emit(`created`,response);emit(`update:model-value`,false)}}watch(()=>props.modelValue,open=>{if(!open)return;branchMode.value=`project`;branchName.value=branches.data.value?.defaultBranch||``;newBranchName.value=``},{immediate:true});watch(submitting,async(running,wasRunning)=>{if(running||!wasRunning||!props.modelValue)return;await nextTick();const target=submitButton.value?.$el||submitButton.value;if(target?.isConnected===true&&typeof target.focus===`function`)target.focus({preventScroll:true})});return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"model-value":__props.modelValue,persistent:submitting.value,"max-width":`38rem`,scrollable:``,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>!$event&&close())},{default:withCtx(()=>[createVNode(VCard,{class:`vibe64-assistant-dialog`,rounded:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`vibe64-assistant-dialog__title`},{default:withCtx(()=>[_cache[6]||(_cache[6]=createBaseVNode(`span`,{class:`vibe64-assistant-dialog__title-copy`},[createBaseVNode(`strong`,{class:`text-title-large`},`Start an AI session`),createBaseVNode(`small`,{class:`text-body-small`},`Start with Senior. Choose Junior or Auto from chat.`)],-1)),createVNode(VBtn,{"aria-label":`Close AI session dialog`,disabled:submitting.value,icon:unref(mdiClose),title:`Close`,variant:`text`,onClick:close},null,8,[`disabled`,`icon`])]),_:1}),createVNode(VCardText,{class:`vibe64-assistant-dialog__body`},{default:withCtx(()=>[unref(routing).resource.isInitialLoading.value?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`list-item-two-line`})):unref(routing).loadError.value?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(routing).loadError.value)+` `,1),createVNode(VBtn,{variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>unref(routing).resource.reload())},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`Try again`,-1)])]),_:1})]),_:1})):mainSelection.value?(openBlock(),createElementBlock(`p`,_hoisted_1,[createTextVNode(` Runs on your main AI: `+toDisplayString(unref(vibe64AssistantSelectionLabel)(mainSelection.value))+` `,1),createVNode(VBtn,{variant:`text`,size:`small`,onClick:openConnectionSettings},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(`Change`,-1)])]),_:1})])):(openBlock(),createElementBlock(`div`,_hoisted_2,[_cache[10]||(_cache[10]=createBaseVNode(`strong`,null,`No AI is set up yet`,-1)),_cache[11]||(_cache[11]=createBaseVNode(`span`,{class:`text-body-small`},`Set up your AI, then come back to start a session.`,-1)),createVNode(VBtn,{color:`primary`,variant:`flat`,class:`align-self-start`,onClick:setUpAi},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Set up your AI`,-1)])]),_:1})])),branchSelectionAvailable.value?(openBlock(),createElementBlock(Fragment,{key:4},[createVNode(VSelect,{modelValue:branchMode.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>branchMode.value=$event),items:branchChoices.value,label:`Work on`,disabled:submitting.value,"hide-details":``,class:`mt-4`},null,8,[`modelValue`,`items`,`disabled`]),chooseBranch.value?(openBlock(),createElementBlock(`div`,_hoisted_3,[createBranch.value?(openBlock(),createBlock(VTextField,{key:0,modelValue:newBranchName.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>newBranchName.value=$event),label:`New branch name`,placeholder:`e.g. improve-booking`,maxlength:`255`,disabled:submitting.value,"error-messages":newBranchName.value.trim()&&branchAlreadyExists.value?`That branch already exists. Choose an existing branch instead.`:[],"hide-details":`auto`},null,8,[`modelValue`,`disabled`,`error-messages`])):createCommentVNode(``,true),unref(branches).isLoading.value?(openBlock(),createBlock(VSkeletonLoader,{key:1,type:`list-item-two-line, paragraph`})):unref(branches).loadError.value?(openBlock(),createBlock(VAlert,{key:2,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(branches).loadError.value)+` `,1),createVNode(VBtn,{variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>unref(branches).reload())},{default:withCtx(()=>[..._cache[12]||(_cache[12]=[createTextVNode(`Try again`,-1)])]),_:1})]),_:1})):(openBlock(),createElementBlock(Fragment,{key:3},[createVNode(VSelect,{modelValue:branchName.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>branchName.value=$event),items:unref(branches).data.value?.branches||[],"item-title":`name`,"item-value":`name`,label:createBranch.value?`Create from`:`Branch`,disabled:submitting.value,"hide-details":``},null,8,[`modelValue`,`items`,`label`,`disabled`]),selectedBranch.value?(openBlock(),createElementBlock(`p`,_hoisted_4,toDisplayString(createBranch.value?`Creates the branch and opens a new session.`:`Opens a new session on this branch.`)+` Your changes will be saved to `+toDisplayString(branchRepository.value)+`:`+toDisplayString(createBranch.value?newBranchName.value.trim()||`your new branch`:branchName.value)+`. `,1)):createCommentVNode(``,true),_cache[13]||(_cache[13]=createBaseVNode(`p`,{class:`text-body-small`},`Deploying the app still uses the project branch.`,-1))],64))])):createCommentVNode(``,true)],64)):createCommentVNode(``,true)]),_:1}),submitting.value?(openBlock(),createElementBlock(`div`,_hoisted_5,[createVNode(VProgressLinear,{indeterminate:``,color:`primary`,rounded:``}),_cache[14]||(_cache[14]=createBaseVNode(`p`,{class:`text-body-small mb-0`},` Copying the project source for the new session. This can take a little while for a large project. Any connected projects and workspace setup then continue in the session, which shows their progress. `,-1))])):createCommentVNode(``,true),createVNode(VCardActions,{class:`vibe64-assistant-dialog__actions`},{default:withCtx(()=>[createVNode(VBtn,{disabled:submitting.value,variant:`text`,onClick:close},{default:withCtx(()=>[..._cache[15]||(_cache[15]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{ref_key:`submitButton`,ref:submitButton,"aria-busy":submitting.value?`true`:void 0,color:`primary`,disabled:!mainSelection.value||submitting.value||!branchSelectionReady.value,variant:`flat`,onClick:submit},{default:withCtx(()=>[createTextVNode(toDisplayString(submitting.value?`Creating session…`:chooseBranch.value&&createBranch.value?`Create branch & session`:`Create session`),1)]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`])}}};var Vibe64AssistantSessionDialog_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-93667ae5`]]);var CREATED_SESSION_FOCUS_TIMEOUT_MS=2e3;async function focusCreatedVibe64SessionTab(sessionId=``){const normalizedSessionId=String(sessionId||``).trim();if(!normalizedSessionId||typeof document===`undefined`)return false;const deadline=Date.now()+CREATED_SESSION_FOCUS_TIMEOUT_MS;while(Date.now()<deadline){const dialogVisible=[...document.querySelectorAll(`.vibe64-assistant-dialog`)].some(element=>element.getClientRects().length>0);const target=[...document.querySelectorAll(`[data-vibe64-session-id]`)].find(element=>element.getAttribute(`data-vibe64-session-id`)===normalizedSessionId&&element.getClientRects().length>0);if(!dialogVisible&&target&&typeof target.focus===`function`){target.focus({preventScroll:true});return document.activeElement===target}await new Promise(resolve=>{(globalThis.requestAnimationFrame||(callback=>setTimeout(callback,16)))(resolve)})}return false}export{Vibe64AssistantSessionDialog_default as n,Vibe64CreatePullRequestDialog_default as r,focusCreatedVibe64SessionTab as t};
@@ -1,2 +1,2 @@
1
- import{$n as mdiSourceBranch,Gn as mdiRobotOutline,Gt as mdiIdentifier,Nt as mdiFolderHomeOutline,Pt as mdiFolderOutline,Rt as mdiGithub,k as mdiCalendarClockOutline,tr as mdiSourceCommit}from"./mdi-CG9pWOSj.js";import{a as vibe64SessionPullRequest,r as shortVibe64SessionId}from"./vibe64SessionViewModel-DR4tOlGM.js";function text(value=``){return String(value||``).trim()}function plainObject(value=null){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function safeRepositoryRemote(value=``){const remote=text(value);if(!remote||/[\r\n\0]/u.test(remote))return``;try{const url=new URL(remote);url.username=``;url.password=``;url.search=``;url.hash=``;return url.toString()}catch{return/^git@[^\s/:]+:[^\s]+$/u.test(remote)?remote:``}}function githubRepositoryName(project={}){const github=plainObject(project.githubRepository||project.repository?.github);return text(github.fullName||github.repository||github.name)}function repositoryFact(session={},project={}){const metadata=plainObject(session.metadata);const fullName=githubRepositoryName(project);const remote=safeRepositoryRemote(metadata.source_remote_url||project.repository?.github?.cloneUrl||project.githubRepository?.cloneUrl||project.repository?.remoteUrl);if(!fullName&&!remote)return null;const href=remote.startsWith(`https://`)||remote.startsWith(`http://`)?remote.replace(/\.git$/u,``):``;return{copyValue:remote||fullName,detail:remote&&fullName?remote:`Canonical Git remote`,href,icon:mdiGithub,key:`repository`,label:`Repository`,value:fullName||remote}}function vibe64SessionInfoFacts(session=null,project={}){if(!session||typeof session!==`object`||Array.isArray(session))return[];const metadata=plainObject(session.metadata);const agentSession=plainObject(session.agentSession);const agentThread=plainObject(agentSession.thread);const agentTurn=plainObject(agentSession.turn);const sessionId=text(session.sessionId);const sessionRoot=text(session.sessionRoot);const sourcePath=text(session.sourcePath||session.source||metadata.source_path);const projectSource=text(project.sourceRoot);const branch=text(metadata.branch||session.branch);const baseBranch=text(metadata.base_branch||metadata.source_default_branch);const baseCommit=text(metadata.base_commit);const threadId=text(agentThread.id||agentTurn.threadId);const turnId=text(agentTurn.id||agentTurn.turnId);const createdAt=text(session.manifest?.createdAt||session.createdAt);const repository=repositoryFact(session,project);const pullRequest=vibe64SessionPullRequest(session);return[...pullRequest?[{key:`pull-request`,label:pullRequest.number?`PR #${pullRequest.number}`:`Pull request branch`,value:pullRequest.title||pullRequest.headBranch,href:pullRequest.url,icon:mdiGithub,detail:`Save to ${pullRequest.headRepository}:${pullRequest.headBranch}`},{key:`save-destination`,label:`Save destination`,value:`${pullRequest.headRepository}:${pullRequest.headBranch}`,icon:mdiSourceBranch,detail:`Save updates this pull request branch`}]:[],{copyValue:sessionId,detail:`Vibe64 session identifier`,icon:mdiIdentifier,key:`session`,label:`Session`,value:shortVibe64SessionId(sessionId),visible:Boolean(sessionId)},{copyValue:sourcePath,detail:session.sourceReady===false?`Session source is not ready`:`Session source`,icon:mdiFolderOutline,key:`source`,label:`Source`,value:sourcePath,visible:Boolean(sourcePath)},{copyValue:projectSource,detail:`Project checkout used as the session baseline`,icon:mdiFolderHomeOutline,key:`project-source`,label:`Project baseline`,value:projectSource,visible:Boolean(projectSource&&projectSource!==sourcePath)},{copyValue:sessionRoot,detail:`Vibe64 conversation and runtime state`,icon:mdiFolderOutline,key:`session-state`,label:`Session state`,value:sessionRoot,visible:Boolean(sessionRoot)},{copyValue:branch,detail:`Session branch remains recoverable in Git`,icon:mdiSourceBranch,key:`branch`,label:`Branch`,value:branch,visible:Boolean(branch)},{copyValue:baseBranch,detail:baseCommit?`Based on ${baseCommit.slice(0,12)}`:`Project branch cloned for this session`,icon:mdiSourceBranch,key:`base-branch`,label:`Base branch`,value:baseBranch,visible:Boolean(baseBranch)},{copyValue:baseCommit,detail:`Exact project baseline commit`,icon:mdiSourceCommit,key:`base-commit`,label:`Base commit`,value:baseCommit.slice(0,12),visible:Boolean(baseCommit)},repository,{copyValue:threadId,detail:`Provider thread used to continue this conversation`,icon:mdiRobotOutline,key:`agent-thread`,label:`Agent thread`,value:threadId,visible:Boolean(threadId)},{copyValue:turnId,detail:`Most recently observed provider turn`,icon:mdiRobotOutline,key:`agent-turn`,label:`Agent turn`,value:turnId,visible:Boolean(turnId)},{copyValue:createdAt,detail:`Session creation time`,icon:mdiCalendarClockOutline,key:`created-at`,label:`Created`,value:createdAt,visible:Boolean(createdAt)}].filter(fact=>fact?.visible!==false&&fact?.value)}function vibe64SessionInfoText(facts=[],{status=``}={}){const lines=(Array.isArray(facts)?facts:[]).map(fact=>{const value=text(fact?.copyValue||fact?.value);return value?`${text(fact?.label)||`Value`}: ${value}`:``}).filter(Boolean);const normalizedStatus=text(status);if(normalizedStatus)lines.splice(1,0,`Status: ${normalizedStatus.replaceAll(`_`,` `)}`);return lines.join(`
1
+ import{$t as mdiIdentifier,Ht as mdiFolderOutline,Kt as mdiGithub,P as mdiCalendarClockOutline,Vt as mdiFolderHomeOutline,sr as mdiRobotOutline,vr as mdiSourceBranch,xr as mdiSourceCommit}from"./mdi-Bt90Ns76.js";import{a as vibe64SessionPullRequest,r as shortVibe64SessionId}from"./vibe64SessionViewModel-DR4tOlGM.js";function text(value=``){return String(value||``).trim()}function plainObject(value=null){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function safeRepositoryRemote(value=``){const remote=text(value);if(!remote||/[\r\n\0]/u.test(remote))return``;try{const url=new URL(remote);url.username=``;url.password=``;url.search=``;url.hash=``;return url.toString()}catch{return/^git@[^\s/:]+:[^\s]+$/u.test(remote)?remote:``}}function githubRepositoryName(project={}){const github=plainObject(project.githubRepository||project.repository?.github);return text(github.fullName||github.repository||github.name)}function repositoryFact(session={},project={}){const metadata=plainObject(session.metadata);const fullName=githubRepositoryName(project);const remote=safeRepositoryRemote(metadata.source_remote_url||project.repository?.github?.cloneUrl||project.githubRepository?.cloneUrl||project.repository?.remoteUrl);if(!fullName&&!remote)return null;const href=remote.startsWith(`https://`)||remote.startsWith(`http://`)?remote.replace(/\.git$/u,``):``;return{copyValue:remote||fullName,detail:remote&&fullName?remote:`Canonical Git remote`,href,icon:mdiGithub,key:`repository`,label:`Repository`,value:fullName||remote}}function vibe64SessionInfoFacts(session=null,project={}){if(!session||typeof session!==`object`||Array.isArray(session))return[];const metadata=plainObject(session.metadata);const agentSession=plainObject(session.agentSession);const agentThread=plainObject(agentSession.thread);const agentTurn=plainObject(agentSession.turn);const sessionId=text(session.sessionId);const sessionRoot=text(session.sessionRoot);const sourcePath=text(session.sourcePath||session.source||metadata.source_path);const projectSource=text(project.sourceRoot);const branch=text(metadata.branch||session.branch);const baseBranch=text(metadata.base_branch||metadata.source_default_branch);const baseCommit=text(metadata.base_commit);const threadId=text(agentThread.id||agentTurn.threadId);const turnId=text(agentTurn.id||agentTurn.turnId);const createdAt=text(session.manifest?.createdAt||session.createdAt);const repository=repositoryFact(session,project);const pullRequest=vibe64SessionPullRequest(session);return[...pullRequest?[{key:`pull-request`,label:pullRequest.number?`PR #${pullRequest.number}`:`Pull request branch`,value:pullRequest.title||pullRequest.headBranch,href:pullRequest.url,icon:mdiGithub,detail:`Save to ${pullRequest.headRepository}:${pullRequest.headBranch}`},{key:`save-destination`,label:`Save destination`,value:`${pullRequest.headRepository}:${pullRequest.headBranch}`,icon:mdiSourceBranch,detail:`Save updates this pull request branch`}]:[],{copyValue:sessionId,detail:`Vibe64 session identifier`,icon:mdiIdentifier,key:`session`,label:`Session`,value:shortVibe64SessionId(sessionId),visible:Boolean(sessionId)},{copyValue:sourcePath,detail:session.sourceReady===false?`Session source is not ready`:`Session source`,icon:mdiFolderOutline,key:`source`,label:`Source`,value:sourcePath,visible:Boolean(sourcePath)},{copyValue:projectSource,detail:`Project checkout used as the session baseline`,icon:mdiFolderHomeOutline,key:`project-source`,label:`Project baseline`,value:projectSource,visible:Boolean(projectSource&&projectSource!==sourcePath)},{copyValue:sessionRoot,detail:`Vibe64 conversation and runtime state`,icon:mdiFolderOutline,key:`session-state`,label:`Session state`,value:sessionRoot,visible:Boolean(sessionRoot)},{copyValue:branch,detail:`Session branch remains recoverable in Git`,icon:mdiSourceBranch,key:`branch`,label:`Branch`,value:branch,visible:Boolean(branch)},{copyValue:baseBranch,detail:baseCommit?`Based on ${baseCommit.slice(0,12)}`:`Project branch cloned for this session`,icon:mdiSourceBranch,key:`base-branch`,label:`Base branch`,value:baseBranch,visible:Boolean(baseBranch)},{copyValue:baseCommit,detail:`Exact project baseline commit`,icon:mdiSourceCommit,key:`base-commit`,label:`Base commit`,value:baseCommit.slice(0,12),visible:Boolean(baseCommit)},repository,{copyValue:threadId,detail:`Provider thread used to continue this conversation`,icon:mdiRobotOutline,key:`agent-thread`,label:`Agent thread`,value:threadId,visible:Boolean(threadId)},{copyValue:turnId,detail:`Most recently observed provider turn`,icon:mdiRobotOutline,key:`agent-turn`,label:`Agent turn`,value:turnId,visible:Boolean(turnId)},{copyValue:createdAt,detail:`Session creation time`,icon:mdiCalendarClockOutline,key:`created-at`,label:`Created`,value:createdAt,visible:Boolean(createdAt)}].filter(fact=>fact?.visible!==false&&fact?.value)}function vibe64SessionInfoText(facts=[],{status=``}={}){const lines=(Array.isArray(facts)?facts:[]).map(fact=>{const value=text(fact?.copyValue||fact?.value);return value?`${text(fact?.label)||`Value`}: ${value}`:``}).filter(Boolean);const normalizedStatus=text(status);if(normalizedStatus)lines.splice(1,0,`Status: ${normalizedStatus.replaceAll(`_`,` `)}`);return lines.join(`
2
2
  `)}export{vibe64SessionInfoText as n,vibe64SessionInfoFacts as t};
@@ -1 +1 @@
1
- import{t as deepFreeze}from"./deepFreeze-BgoYkoTa.js";import{Ct as mdiFileCompare,Gn as mdiRobotOutline,Yt as mdiInformationOutline,dt as mdiDatabaseOutline,ir as mdiSourceRepository,xt as mdiFileCodeOutline,zt as mdiGraphOutline}from"./mdi-CG9pWOSj.js";var VIBE64_ACTIVE_SESSION_NAV_TARGET=`page.active-session-nav`;var VIBE64_ACTIVE_SESSION_NAV_OWNER=`vibe64-session`;var VIBE64_SESSION_TOOL_DEFINITIONS=deepFreeze([{icon:mdiInformationOutline,id:`info`,guideId:`session-info`,label:`Session info`,order:100,routeSegment:`session`,title:`View paths and Git context for the active session`},{icon:mdiFileCompare,id:`changes`,guideId:`changes`,label:`Current changes`,order:150,routeSegment:`changes`,title:`Review files changed in this session`},{icon:mdiSourceRepository,id:`repository`,guideId:`git-log`,label:`Git log`,navigationScope:`project`,order:290,routeSegment:`repository`,title:`Review the project's saved Git history`},{icon:mdiFileCodeOutline,id:`editor`,guideId:`files`,label:`Files`,order:200,routeSegment:`files`,title:`Browse, edit, and explain session source files`},{icon:mdiDatabaseOutline,id:`database`,guideId:`database`,label:`Database`,order:225,routeSegment:`database`,title:`Query, edit, and map the active session database`},{icon:mdiGraphOutline,id:`system`,guideId:`architecture`,label:`Architecture`,order:250,routeSegment:`system`,title:`Explore subsystem responsibilities, operations, and data`},{icon:mdiRobotOutline,id:`ai-terminal`,label:`AI Terminal`,order:700,routeSegment:`ai-terminal`,title:`Open the active session AI terminal`}]);function normalizeSessionToolRouteSegment(value=``){return String(value||``).trim().replace(/^\/+|\/+$/gu,``)}function vibe64SessionToolDefinition(toolId=``){const normalizedId=String(toolId||``).trim();return VIBE64_SESSION_TOOL_DEFINITIONS.find(tool=>tool.id===normalizedId)||null}function vibe64SessionToolRouteSegment(toolId=``){const tool=vibe64SessionToolDefinition(toolId);return normalizeSessionToolRouteSegment(tool?.routeSegment||tool?.id||``)}function vibe64SessionToolIdFromRouteSegment(routeSegment=``){const normalizedSegment=normalizeSessionToolRouteSegment(routeSegment);return VIBE64_SESSION_TOOL_DEFINITIONS.find(tool=>normalizeSessionToolRouteSegment(tool.routeSegment||tool.id)===normalizedSegment)?.id||``}function vibe64SessionToolGuideId(toolId=``){return vibe64SessionToolDefinition(toolId)?.guideId||void 0}function vibe64SessionToolDashboardSuffix(toolId=``){const routeSegment=vibe64SessionToolRouteSegment(toolId);return routeSegment?`/dashboard/${routeSegment}`:``}export{vibe64SessionToolGuideId as a,vibe64SessionToolDashboardSuffix as i,VIBE64_ACTIVE_SESSION_NAV_TARGET as n,vibe64SessionToolIdFromRouteSegment as o,VIBE64_SESSION_TOOL_DEFINITIONS as r,VIBE64_ACTIVE_SESSION_NAV_OWNER as t};
1
+ import{t as deepFreeze}from"./deepFreeze-BgoYkoTa.js";import{jt as mdiFileCompare,kt as mdiFileCodeOutline,qt as mdiGraphOutline,rn as mdiInformationOutline,sr as mdiRobotOutline,wr as mdiSourceRepository,yt as mdiDatabaseOutline}from"./mdi-Bt90Ns76.js";var VIBE64_ACTIVE_SESSION_NAV_TARGET=`page.active-session-nav`;var VIBE64_ACTIVE_SESSION_NAV_OWNER=`vibe64-session`;var VIBE64_SESSION_TOOL_DEFINITIONS=deepFreeze([{icon:mdiInformationOutline,id:`info`,guideId:`session-info`,label:`Session info`,order:100,routeSegment:`session`,title:`View paths and Git context for the active session`},{icon:mdiFileCompare,id:`changes`,guideId:`changes`,label:`Current changes`,order:150,routeSegment:`changes`,title:`Review files changed in this session`},{icon:mdiSourceRepository,id:`repository`,guideId:`git-log`,label:`Git log`,navigationScope:`project`,order:290,routeSegment:`repository`,title:`Review the project's saved Git history`},{icon:mdiFileCodeOutline,id:`editor`,guideId:`files`,label:`Files`,order:200,routeSegment:`files`,title:`Browse, edit, and explain session source files`},{icon:mdiDatabaseOutline,id:`database`,guideId:`database`,label:`Database`,order:225,routeSegment:`database`,title:`Query, edit, and map the active session database`},{icon:mdiGraphOutline,id:`system`,guideId:`architecture`,label:`Architecture`,order:250,routeSegment:`system`,title:`Explore subsystem responsibilities, operations, and data`},{icon:mdiRobotOutline,id:`ai-terminal`,label:`AI Terminal`,order:700,routeSegment:`ai-terminal`,title:`Open the active session AI terminal`}]);function normalizeSessionToolRouteSegment(value=``){return String(value||``).trim().replace(/^\/+|\/+$/gu,``)}function vibe64SessionToolDefinition(toolId=``){const normalizedId=String(toolId||``).trim();return VIBE64_SESSION_TOOL_DEFINITIONS.find(tool=>tool.id===normalizedId)||null}function vibe64SessionToolRouteSegment(toolId=``){const tool=vibe64SessionToolDefinition(toolId);return normalizeSessionToolRouteSegment(tool?.routeSegment||tool?.id||``)}function vibe64SessionToolIdFromRouteSegment(routeSegment=``){const normalizedSegment=normalizeSessionToolRouteSegment(routeSegment);return VIBE64_SESSION_TOOL_DEFINITIONS.find(tool=>normalizeSessionToolRouteSegment(tool.routeSegment||tool.id)===normalizedSegment)?.id||``}function vibe64SessionToolGuideId(toolId=``){return vibe64SessionToolDefinition(toolId)?.guideId||void 0}function vibe64SessionToolDashboardSuffix(toolId=``){const routeSegment=vibe64SessionToolRouteSegment(toolId);return routeSegment?`/dashboard/${routeSegment}`:``}export{vibe64SessionToolGuideId as a,vibe64SessionToolDashboardSuffix as i,VIBE64_ACTIVE_SESSION_NAV_TARGET as n,vibe64SessionToolIdFromRouteSegment as o,VIBE64_SESSION_TOOL_DEFINITIONS as r,VIBE64_ACTIVE_SESSION_NAV_OWNER as t};