@scalar/agent-chat 0.1.2 → 0.2.0

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 (292) hide show
  1. package/{dist/App.vue.d.ts → App.vue.d.ts} +2 -2
  2. package/App.vue.d.ts.map +1 -0
  3. package/{dist/App.vue.js → App.vue.js} +9 -3
  4. package/App.vue.js.map +1 -0
  5. package/{dist/Chat.vue.js → Chat.vue.js} +3 -3
  6. package/Chat.vue.js.map +1 -0
  7. package/components/ApprovalSection.vue.d.ts +9 -0
  8. package/components/ApprovalSection.vue.d.ts.map +1 -0
  9. package/components/ApprovalSection.vue.js +8 -0
  10. package/components/ApprovalSection.vue.js.map +1 -0
  11. package/components/ApprovalSection.vue2.js +47 -0
  12. package/components/ApprovalSection.vue2.js.map +1 -0
  13. package/components/AutosendPaused.vue.d.ts +3 -0
  14. package/components/AutosendPaused.vue.d.ts.map +1 -0
  15. package/components/AutosendPaused.vue.js +15 -0
  16. package/components/AutosendPaused.vue.js.map +1 -0
  17. package/{dist/components → components}/ContextItem.vue.d.ts.map +1 -1
  18. package/{dist/components → components}/ContextItem.vue.js +1 -1
  19. package/{dist/components → components}/ContextItem.vue2.js +1 -1
  20. package/components/ContextItem.vue2.js.map +1 -0
  21. package/components/ErrorMessage.vue.d.ts +6 -0
  22. package/components/ErrorMessage.vue.d.ts.map +1 -0
  23. package/components/ErrorMessage.vue.js +8 -0
  24. package/components/ErrorMessage.vue.js.map +1 -0
  25. package/components/ErrorMessage.vue2.js +28 -0
  26. package/components/ErrorMessage.vue2.js.map +1 -0
  27. package/{dist/components → components}/LoadingMiniOpenAPIDoc.vue.d.ts.map +1 -1
  28. package/components/LoadingMiniOpenAPIDoc.vue.js +16 -0
  29. package/components/LoadingMiniOpenAPIDoc.vue.js.map +1 -0
  30. package/components/LoadingOpenAPISpecsSummary.vue.d.ts +3 -0
  31. package/components/LoadingOpenAPISpecsSummary.vue.d.ts.map +1 -0
  32. package/components/LoadingOpenAPISpecsSummary.vue.js +16 -0
  33. package/components/LoadingOpenAPISpecsSummary.vue.js.map +1 -0
  34. package/components/RequestApproved.vue.d.ts +3 -0
  35. package/components/RequestApproved.vue.d.ts.map +1 -0
  36. package/components/RequestApproved.vue.js +15 -0
  37. package/components/RequestApproved.vue.js.map +1 -0
  38. package/components/RequestFailed.vue.d.ts +3 -0
  39. package/components/RequestFailed.vue.d.ts.map +1 -0
  40. package/components/RequestFailed.vue.js +26 -0
  41. package/components/RequestFailed.vue.js.map +1 -0
  42. package/components/RequestPreview.vue.d.ts +10 -0
  43. package/components/RequestPreview.vue.d.ts.map +1 -0
  44. package/components/RequestPreview.vue.js +9 -0
  45. package/components/RequestPreview.vue.js.map +1 -0
  46. package/components/RequestPreview.vue2.js +150 -0
  47. package/components/RequestPreview.vue2.js.map +1 -0
  48. package/components/RequestRejected.vue.d.ts +3 -0
  49. package/components/RequestRejected.vue.d.ts.map +1 -0
  50. package/components/RequestRejected.vue.js +24 -0
  51. package/components/RequestRejected.vue.js.map +1 -0
  52. package/components/RequestSuccess.vue.d.ts +3 -0
  53. package/components/RequestSuccess.vue.d.ts.map +1 -0
  54. package/components/RequestSuccess.vue.js +15 -0
  55. package/components/RequestSuccess.vue.js.map +1 -0
  56. package/components/ResponseBody/ResponseBody.vue.d.ts +15 -0
  57. package/components/ResponseBody/ResponseBody.vue.d.ts.map +1 -0
  58. package/components/ResponseBody/ResponseBody.vue.js +45 -0
  59. package/components/ResponseBody/ResponseBody.vue.js.map +1 -0
  60. package/components/ResponseBody/ResponseBody.vue2.js +5 -0
  61. package/components/ResponseBody/ResponseBody.vue2.js.map +1 -0
  62. package/components/ResponseBody/ResponseBodyInfo.vue.d.ts +13 -0
  63. package/components/ResponseBody/ResponseBodyInfo.vue.d.ts.map +1 -0
  64. package/components/ResponseBody/ResponseBodyInfo.vue.js +17 -0
  65. package/components/ResponseBody/ResponseBodyInfo.vue.js.map +1 -0
  66. package/components/ResponseBody/ResponseBodyPreview.vue.d.ts +10 -0
  67. package/components/ResponseBody/ResponseBodyPreview.vue.d.ts.map +1 -0
  68. package/components/ResponseBody/ResponseBodyPreview.vue.js +8 -0
  69. package/components/ResponseBody/ResponseBodyPreview.vue.js.map +1 -0
  70. package/components/ResponseBody/ResponseBodyPreview.vue2.js +73 -0
  71. package/components/ResponseBody/ResponseBodyPreview.vue2.js.map +1 -0
  72. package/components/ResponseBody/ResponseBodyRaw.vue.d.ts +7 -0
  73. package/components/ResponseBody/ResponseBodyRaw.vue.d.ts.map +1 -0
  74. package/components/ResponseBody/ResponseBodyRaw.vue.js +23 -0
  75. package/components/ResponseBody/ResponseBodyRaw.vue.js.map +1 -0
  76. package/components/ResponseBody/ResponseBodyRaw.vue2.js +5 -0
  77. package/components/ResponseBody/ResponseBodyRaw.vue2.js.map +1 -0
  78. package/components/ResponseBody/ResponseBodyToggle.vue.d.ts +10 -0
  79. package/components/ResponseBody/ResponseBodyToggle.vue.d.ts.map +1 -0
  80. package/components/ResponseBody/ResponseBodyToggle.vue.js +30 -0
  81. package/components/ResponseBody/ResponseBodyToggle.vue.js.map +1 -0
  82. package/components/ResponseBody/ResponseBodyToggle.vue2.js +5 -0
  83. package/components/ResponseBody/ResponseBodyToggle.vue2.js.map +1 -0
  84. package/components/ResponseBody/helpers/media-types.d.ts +15 -0
  85. package/components/ResponseBody/helpers/media-types.d.ts.map +1 -0
  86. package/components/ResponseBody/helpers/media-types.js +134 -0
  87. package/components/ResponseBody/helpers/media-types.js.map +1 -0
  88. package/components/ResponseBody/helpers/process-response-body.d.ts +10 -0
  89. package/components/ResponseBody/helpers/process-response-body.d.ts.map +1 -0
  90. package/components/ResponseBody/helpers/process-response-body.js +63 -0
  91. package/components/ResponseBody/helpers/process-response-body.js.map +1 -0
  92. package/components/SearchPopover.vue.d.ts +13 -0
  93. package/components/SearchPopover.vue.d.ts.map +1 -0
  94. package/components/SearchPopover.vue.js +8 -0
  95. package/components/SearchPopover.vue.js.map +1 -0
  96. package/components/SearchPopover.vue2.js +78 -0
  97. package/components/SearchPopover.vue2.js.map +1 -0
  98. package/{dist/components → components}/SendingRequest.vue.d.ts.map +1 -1
  99. package/{dist/components → components}/SendingRequest.vue.js +1 -1
  100. package/{dist/components → components}/SendingRequest.vue.js.map +1 -1
  101. package/{dist/components → components}/Suggestion.vue.d.ts.map +1 -1
  102. package/{dist/components → components}/Suggestion.vue.js +1 -1
  103. package/{dist/components → components}/Suggestion.vue2.js +1 -1
  104. package/{dist/components → components}/Suggestion.vue2.js.map +1 -1
  105. package/{dist/components → components}/TestRequestButton.vue2.js +1 -1
  106. package/{dist/components → components}/TestRequestButton.vue2.js.map +1 -1
  107. package/helpers.d.ts +418 -0
  108. package/helpers.d.ts.map +1 -0
  109. package/helpers.js +201 -0
  110. package/helpers.js.map +1 -0
  111. package/hooks/useChatApprovals.d.ts +24 -0
  112. package/hooks/useChatApprovals.d.ts.map +1 -0
  113. package/hooks/useChatApprovals.js +25 -0
  114. package/hooks/useChatApprovals.js.map +1 -0
  115. package/{dist/hooks → hooks}/useChatOperationBlocks.js +1 -1
  116. package/hooks/useSearch.d.ts +26 -0
  117. package/hooks/useSearch.d.ts.map +1 -0
  118. package/hooks/useSearch.js +36 -0
  119. package/hooks/useSearch.js.map +1 -0
  120. package/package.json +3 -36
  121. package/registry/add-documents-to-store.d.ts +21 -0
  122. package/registry/add-documents-to-store.d.ts.map +1 -0
  123. package/registry/add-documents-to-store.js +42 -0
  124. package/registry/add-documents-to-store.js.map +1 -0
  125. package/{dist/state → state}/state.d.ts +29 -14
  126. package/state/state.d.ts.map +1 -0
  127. package/{dist/state → state}/state.js +45 -40
  128. package/state/state.js.map +1 -0
  129. package/{dist/style.css → style.css} +686 -234
  130. package/{dist/views → views}/Chat/Chat.vue.d.ts.map +1 -1
  131. package/{dist/views → views}/Chat/Chat.vue.js +1 -1
  132. package/{dist/views → views}/Chat/Chat.vue2.js +17 -5
  133. package/views/Chat/Chat.vue2.js.map +1 -0
  134. package/{dist/views → views}/Chat/Messages/ExecuteRequestTool.vue.d.ts.map +1 -1
  135. package/{dist/views → views}/Chat/Messages/ExecuteRequestTool.vue.js +1 -1
  136. package/views/Chat/Messages/ExecuteRequestTool.vue2.js +39 -0
  137. package/views/Chat/Messages/ExecuteRequestTool.vue2.js.map +1 -0
  138. package/{dist/views → views}/Chat/Messages/GetMiniOpenAPIDocTool.vue.d.ts.map +1 -1
  139. package/{dist/views → views}/Chat/Messages/GetMiniOpenAPIDocTool.vue.js +1 -1
  140. package/{dist/views → views}/Chat/Messages/GetMiniOpenAPIDocTool.vue2.js +2 -3
  141. package/views/Chat/Messages/GetMiniOpenAPIDocTool.vue2.js.map +1 -0
  142. package/views/Chat/Messages/GetOpenAPISpecsSummary.vue.d.ts +11 -0
  143. package/views/Chat/Messages/GetOpenAPISpecsSummary.vue.d.ts.map +1 -0
  144. package/views/Chat/Messages/GetOpenAPISpecsSummary.vue.js +32 -0
  145. package/views/Chat/Messages/GetOpenAPISpecsSummary.vue.js.map +1 -0
  146. package/views/Chat/Messages/GetOpenAPISpecsSummary.vue2.js +5 -0
  147. package/views/Chat/Messages/GetOpenAPISpecsSummary.vue2.js.map +1 -0
  148. package/{dist/views → views}/Chat/Messages/Text.vue.js +1 -1
  149. package/{dist/views → views}/Chat/Messages/Text.vue.js.map +1 -1
  150. package/views/Layout.vue.d.ts.map +1 -0
  151. package/{dist/views → views}/Layout.vue.js +1 -1
  152. package/{dist/views → views}/Layout.vue2.js +0 -4
  153. package/views/Layout.vue2.js.map +1 -0
  154. package/{dist/views → views}/PromptForm.vue.d.ts.map +1 -1
  155. package/{dist/views → views}/PromptForm.vue.js +1 -1
  156. package/views/PromptForm.vue2.js +182 -0
  157. package/views/PromptForm.vue2.js.map +1 -0
  158. package/{dist/views → views/Settings}/Auth.vue.d.ts +1 -0
  159. package/views/Settings/Auth.vue.d.ts.map +1 -0
  160. package/{dist/views → views/Settings}/Auth.vue.js +21 -26
  161. package/views/Settings/Auth.vue.js.map +1 -0
  162. package/views/Settings/DocSettings.vue.d.ts +8 -0
  163. package/views/Settings/DocSettings.vue.d.ts.map +1 -0
  164. package/views/Settings/DocSettings.vue.js +8 -0
  165. package/views/Settings/DocSettings.vue.js.map +1 -0
  166. package/views/Settings/DocSettings.vue2.js +50 -0
  167. package/views/Settings/DocSettings.vue2.js.map +1 -0
  168. package/views/Settings/Settings.vue.d.ts.map +1 -0
  169. package/{dist/views → views/Settings}/Settings.vue.js +2 -2
  170. package/views/Settings/Settings.vue2.js +78 -0
  171. package/views/Settings/Settings.vue2.js.map +1 -0
  172. package/views/Start.vue.d.ts.map +1 -0
  173. package/{dist/views → views}/Start.vue.js +1 -1
  174. package/{dist/views → views}/Start.vue2.js +0 -1
  175. package/views/Start.vue2.js.map +1 -0
  176. package/dist/App.vue.d.ts.map +0 -1
  177. package/dist/App.vue.js.map +0 -1
  178. package/dist/Chat.vue.js.map +0 -1
  179. package/dist/components/ContextItem.vue2.js.map +0 -1
  180. package/dist/components/LoadingMiniOpenAPIDoc.vue.js +0 -32
  181. package/dist/components/LoadingMiniOpenAPIDoc.vue.js.map +0 -1
  182. package/dist/helpers.d.ts +0 -39
  183. package/dist/helpers.d.ts.map +0 -1
  184. package/dist/helpers.js +0 -111
  185. package/dist/helpers.js.map +0 -1
  186. package/dist/hooks/useActiveServer.d.ts +0 -2
  187. package/dist/hooks/useActiveServer.d.ts.map +0 -1
  188. package/dist/hooks/useActiveServer.js +0 -20
  189. package/dist/hooks/useActiveServer.js.map +0 -1
  190. package/dist/hooks/useSecuritySchemes.d.ts +0 -2
  191. package/dist/hooks/useSecuritySchemes.d.ts.map +0 -1
  192. package/dist/hooks/useSecuritySchemes.js +0 -29
  193. package/dist/hooks/useSecuritySchemes.js.map +0 -1
  194. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/api.js +0 -11
  195. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/api.js.map +0 -1
  196. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/core.js +0 -58
  197. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/core.js.map +0 -1
  198. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/errors.js +0 -25
  199. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/errors.js.map +0 -1
  200. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/parse.js +0 -64
  201. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/parse.js.map +0 -1
  202. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/regexes.js +0 -8
  203. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/regexes.js.map +0 -1
  204. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/schemas.js +0 -181
  205. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/schemas.js.map +0 -1
  206. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/util.js +0 -61
  207. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/util.js.map +0 -1
  208. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/versions.js +0 -9
  209. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/versions.js.map +0 -1
  210. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/mini/schemas.js +0 -60
  211. package/dist/node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/mini/schemas.js.map +0 -1
  212. package/dist/package.json +0 -63
  213. package/dist/registry/get-document.d.ts +0 -4
  214. package/dist/registry/get-document.d.ts.map +0 -1
  215. package/dist/registry/get-document.js +0 -23
  216. package/dist/registry/get-document.js.map +0 -1
  217. package/dist/state/state.d.ts.map +0 -1
  218. package/dist/state/state.js.map +0 -1
  219. package/dist/views/Auth.vue.d.ts.map +0 -1
  220. package/dist/views/Auth.vue.js.map +0 -1
  221. package/dist/views/Chat/Chat.vue2.js.map +0 -1
  222. package/dist/views/Chat/Messages/ExecuteRequestTool.vue2.js +0 -62
  223. package/dist/views/Chat/Messages/ExecuteRequestTool.vue2.js.map +0 -1
  224. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue2.js.map +0 -1
  225. package/dist/views/Layout.vue.d.ts.map +0 -1
  226. package/dist/views/Layout.vue2.js.map +0 -1
  227. package/dist/views/PromptForm.vue2.js +0 -125
  228. package/dist/views/PromptForm.vue2.js.map +0 -1
  229. package/dist/views/Settings.vue.d.ts.map +0 -1
  230. package/dist/views/Settings.vue2.js +0 -81
  231. package/dist/views/Settings.vue2.js.map +0 -1
  232. package/dist/views/Start.vue.d.ts.map +0 -1
  233. package/dist/views/Start.vue2.js.map +0 -1
  234. /package/{dist/App.vue2.js → App.vue2.js} +0 -0
  235. /package/{dist/App.vue2.js.map → App.vue2.js.map} +0 -0
  236. /package/{dist/Chat.vue.d.ts → Chat.vue.d.ts} +0 -0
  237. /package/{dist/Chat.vue.d.ts.map → Chat.vue.d.ts.map} +0 -0
  238. /package/{dist/Chat.vue2.js → Chat.vue2.js} +0 -0
  239. /package/{dist/Chat.vue2.js.map → Chat.vue2.js.map} +0 -0
  240. /package/{dist/_virtual → _virtual}/_plugin-vue_export-helper.js +0 -0
  241. /package/{dist/_virtual → _virtual}/_plugin-vue_export-helper.js.map +0 -0
  242. /package/{dist/components → components}/ContextItem.vue.d.ts +0 -0
  243. /package/{dist/components → components}/ContextItem.vue.js.map +0 -0
  244. /package/{dist/components → components}/Endpoint.vue.d.ts +0 -0
  245. /package/{dist/components → components}/Endpoint.vue.d.ts.map +0 -0
  246. /package/{dist/components → components}/Endpoint.vue.js +0 -0
  247. /package/{dist/components → components}/Endpoint.vue.js.map +0 -0
  248. /package/{dist/components → components}/Endpoint.vue2.js +0 -0
  249. /package/{dist/components → components}/Endpoint.vue2.js.map +0 -0
  250. /package/{dist/components → components}/LoadingMiniOpenAPIDoc.vue.d.ts +0 -0
  251. /package/{dist/components → components}/Logo.vue.d.ts +0 -0
  252. /package/{dist/components → components}/Logo.vue.d.ts.map +0 -0
  253. /package/{dist/components → components}/Logo.vue.js +0 -0
  254. /package/{dist/components → components}/Logo.vue.js.map +0 -0
  255. /package/{dist/components → components}/SendingRequest.vue.d.ts +0 -0
  256. /package/{dist/components → components}/Suggestion.vue.d.ts +0 -0
  257. /package/{dist/components → components}/Suggestion.vue.js.map +0 -0
  258. /package/{dist/components → components}/TestRequestButton.vue.d.ts +0 -0
  259. /package/{dist/components → components}/TestRequestButton.vue.d.ts.map +0 -0
  260. /package/{dist/components → components}/TestRequestButton.vue.js +0 -0
  261. /package/{dist/components → components}/TestRequestButton.vue.js.map +0 -0
  262. /package/{dist/hooks → hooks}/useChatOperationBlocks.d.ts +0 -0
  263. /package/{dist/hooks → hooks}/useChatOperationBlocks.d.ts.map +0 -0
  264. /package/{dist/hooks → hooks}/useChatOperationBlocks.js.map +0 -0
  265. /package/{dist/hooks → hooks}/useChatScroll.d.ts +0 -0
  266. /package/{dist/hooks → hooks}/useChatScroll.d.ts.map +0 -0
  267. /package/{dist/hooks → hooks}/useChatScroll.js +0 -0
  268. /package/{dist/hooks → hooks}/useChatScroll.js.map +0 -0
  269. /package/{dist/index.d.ts → index.d.ts} +0 -0
  270. /package/{dist/index.d.ts.map → index.d.ts.map} +0 -0
  271. /package/{dist/index.js → index.js} +0 -0
  272. /package/{dist/index.js.map → index.js.map} +0 -0
  273. /package/{dist/views → views}/Chat/Chat.vue.d.ts +0 -0
  274. /package/{dist/views → views}/Chat/Chat.vue.js.map +0 -0
  275. /package/{dist/views → views}/Chat/Messages/ExecuteRequestTool.vue.d.ts +0 -0
  276. /package/{dist/views → views}/Chat/Messages/ExecuteRequestTool.vue.js.map +0 -0
  277. /package/{dist/views → views}/Chat/Messages/GetMiniOpenAPIDocTool.vue.d.ts +0 -0
  278. /package/{dist/views → views}/Chat/Messages/GetMiniOpenAPIDocTool.vue.js.map +0 -0
  279. /package/{dist/views → views}/Chat/Messages/Text.vue.d.ts +0 -0
  280. /package/{dist/views → views}/Chat/Messages/Text.vue.d.ts.map +0 -0
  281. /package/{dist/views → views}/Chat/Messages/Text.vue2.js +0 -0
  282. /package/{dist/views → views}/Chat/Messages/Text.vue2.js.map +0 -0
  283. /package/{dist/views → views}/Layout.vue.d.ts +0 -0
  284. /package/{dist/views → views}/Layout.vue.js.map +0 -0
  285. /package/{dist/views → views}/PromptForm.vue.d.ts +0 -0
  286. /package/{dist/views → views}/PromptForm.vue.js.map +0 -0
  287. /package/{dist/views → views/Settings}/Auth.vue2.js +0 -0
  288. /package/{dist/views → views/Settings}/Auth.vue2.js.map +0 -0
  289. /package/{dist/views → views/Settings}/Settings.vue.d.ts +0 -0
  290. /package/{dist/views → views/Settings}/Settings.vue.js.map +0 -0
  291. /package/{dist/views → views}/Start.vue.d.ts +0 -0
  292. /package/{dist/views → views}/Start.vue.js.map +0 -0
package/helpers.d.ts ADDED
@@ -0,0 +1,418 @@
1
+ import type { ToolUIPart, UIDataTypes, UIMessagePart } from 'ai';
2
+ import type { MergedSecuritySchemes } from '@scalar/api-client/v2/blocks/scalar-auth-selector-block';
3
+ import type { OpenAPIV3_1 } from '@scalar/openapi-types';
4
+ import type { AuthenticationConfiguration } from '@scalar/types/api-reference';
5
+ import type { WorkspaceStore } from '@scalar/workspace-store/client';
6
+ import type { WorkspaceDocument } from '@scalar/workspace-store/schemas';
7
+ import type { XScalarSelectedSecurity } from '@scalar/workspace-store/schemas/extensions/security/x-scalar-selected-security';
8
+ import type { OpenApiDocument, OperationObject, ParameterObject, PathItemObject, SecurityRequirementObject, SecuritySchemeObject, ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
9
+ import { type SecuritySchemes } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
10
+ import type { Tools } from './state/state.js';
11
+ /** Combine pathItem and operation parameters into a single, dereferenced parameter array */
12
+ export declare const combineParams: (pathParams?: PathItemObject["parameters"], operationParams?: OperationObject["parameters"]) => ParameterObject[];
13
+ /**
14
+ * Iterate through all available servers and pick the first one
15
+ *
16
+ * @example
17
+ * getFirstServer([operation.servers, pathItem.servers, server])
18
+ */
19
+ export declare function getFirstServer(...availableServers: (ServerObject[] | ServerObject | undefined | null)[]): ServerObject | undefined;
20
+ /** Determine if a message part is a tool */
21
+ export declare function isToolPart(part: UIMessagePart<UIDataTypes, Tools>): part is ToolUIPart<Tools>;
22
+ /**
23
+ * Extracts the default scopes for a security scheme.
24
+ * Only OAuth2 schemes can have default scopes via the x-default-scopes extension.
25
+ */
26
+ export declare const getDefaultScopes: (scheme: SecuritySchemeObject | undefined) => string[];
27
+ /**
28
+ * Determines the default security scheme to use for an operation.
29
+ *
30
+ * Priority order:
31
+ * 1. User-configured preferred security scheme (if provided)
32
+ * 2. First security requirement from the OpenAPI spec
33
+ * 3. null (no security required)
34
+ */
35
+ export declare const getDefaultSecurity: (securityRequirements: SecurityRequirementObject[], preferredSecurityScheme: AuthenticationConfiguration["preferredSecurityScheme"], securitySchemes: MergedSecuritySchemes) => SecurityRequirementObject | null;
36
+ /**
37
+ * Find the intersection between which security is selected on the document and what this operation requires
38
+ *
39
+ * If there is no overlap, we return the first requirement
40
+ */
41
+ export declare const filterSelectedSecurity: (document: OpenApiDocument, operation: OperationObject | null, securitySchemes?: MergedSecuritySchemes) => SecuritySchemeObject[];
42
+ export declare function getOperations(doc: Partial<OpenAPIV3_1.Document>): OperationObject[];
43
+ /** Flattens all security requirements from a document */
44
+ export declare function getSecurityFromDocument(document: WorkspaceDocument): SecuritySchemeObject[];
45
+ /** Generate document settings from workspace store */
46
+ export declare function createDocumentSettings(workspaceStore: WorkspaceStore): {
47
+ [k: string]: {
48
+ activeServer: ServerObject | null;
49
+ securitySchemes: SecuritySchemeObject[];
50
+ };
51
+ };
52
+ /**
53
+ * Provides an interface to store and retrieve the selected client value
54
+ * in local storage.
55
+ */
56
+ export declare const clientStorage: () => {
57
+ /**
58
+ * Gets the stored selected client from local storage.
59
+ */
60
+ get: () => string | null;
61
+ /**
62
+ * Stores the selected client value in local storage.
63
+ * @param value The value to store
64
+ */
65
+ set: (value: string) => void;
66
+ };
67
+ /**
68
+ * Provides an interface to store and retrieve authentication scheme
69
+ * information in local storage, including both the available schemes and
70
+ * the user's selected schemes.
71
+ */
72
+ export declare const authStorage: () => {
73
+ /**
74
+ * Retrieves and coerces the authentication schemes stored in local storage.
75
+ */
76
+ getSchemas: (slug: string) => {
77
+ [x: string]: ({
78
+ description?: string | undefined;
79
+ } & {
80
+ 'x-scalar-secret-token': string;
81
+ } & {
82
+ type: "apiKey";
83
+ in: "header" | "query" | "cookie";
84
+ name: string;
85
+ }) | ({
86
+ description?: string | undefined;
87
+ } & {
88
+ 'x-scalar-secret-token': string;
89
+ } & {
90
+ 'x-scalar-secret-username': string;
91
+ 'x-scalar-secret-password': string;
92
+ } & {
93
+ bearerFormat?: string | undefined;
94
+ type: "http";
95
+ scheme: "basic" | "bearer";
96
+ }) | ({
97
+ description?: string | undefined;
98
+ } & {
99
+ type: "oauth2";
100
+ flows: {
101
+ password?: ({
102
+ refreshUrl: string;
103
+ scopes: {
104
+ [x: string]: string;
105
+ };
106
+ } & {
107
+ 'x-scalar-secret-client-id': string;
108
+ } & {
109
+ 'x-scalar-secret-token': string;
110
+ } & {
111
+ 'x-scalar-security-query'?: {
112
+ [x: string]: string;
113
+ } | undefined;
114
+ } & {
115
+ 'x-scalar-security-body'?: {
116
+ [x: string]: string;
117
+ } | undefined;
118
+ } & {
119
+ 'x-tokenName'?: string | undefined;
120
+ } & {
121
+ tokenUrl: string;
122
+ } & {
123
+ 'x-scalar-secret-username': string;
124
+ 'x-scalar-secret-password': string;
125
+ } & {
126
+ 'x-scalar-secret-client-secret': string;
127
+ } & {
128
+ 'x-scalar-credentials-location'?: "body" | "header" | undefined;
129
+ }) | undefined;
130
+ implicit?: ({
131
+ refreshUrl: string;
132
+ scopes: {
133
+ [x: string]: string;
134
+ };
135
+ } & {
136
+ 'x-scalar-secret-client-id': string;
137
+ } & {
138
+ 'x-scalar-secret-token': string;
139
+ } & {
140
+ 'x-scalar-security-query'?: {
141
+ [x: string]: string;
142
+ } | undefined;
143
+ } & {
144
+ 'x-scalar-security-body'?: {
145
+ [x: string]: string;
146
+ } | undefined;
147
+ } & {
148
+ 'x-tokenName'?: string | undefined;
149
+ } & {
150
+ authorizationUrl: string;
151
+ } & {
152
+ 'x-scalar-secret-redirect-uri': string;
153
+ }) | undefined;
154
+ clientCredentials?: ({
155
+ refreshUrl: string;
156
+ scopes: {
157
+ [x: string]: string;
158
+ };
159
+ } & {
160
+ 'x-scalar-secret-client-id': string;
161
+ } & {
162
+ 'x-scalar-secret-token': string;
163
+ } & {
164
+ 'x-scalar-security-query'?: {
165
+ [x: string]: string;
166
+ } | undefined;
167
+ } & {
168
+ 'x-scalar-security-body'?: {
169
+ [x: string]: string;
170
+ } | undefined;
171
+ } & {
172
+ 'x-tokenName'?: string | undefined;
173
+ } & {
174
+ tokenUrl: string;
175
+ } & {
176
+ 'x-scalar-secret-client-secret': string;
177
+ } & {
178
+ 'x-scalar-credentials-location'?: "body" | "header" | undefined;
179
+ }) | undefined;
180
+ authorizationCode?: ({
181
+ refreshUrl: string;
182
+ scopes: {
183
+ [x: string]: string;
184
+ };
185
+ } & {
186
+ 'x-scalar-secret-client-id': string;
187
+ } & {
188
+ 'x-scalar-secret-token': string;
189
+ } & {
190
+ 'x-scalar-security-query'?: {
191
+ [x: string]: string;
192
+ } | undefined;
193
+ } & {
194
+ 'x-scalar-security-body'?: {
195
+ [x: string]: string;
196
+ } | undefined;
197
+ } & {
198
+ 'x-tokenName'?: string | undefined;
199
+ } & {
200
+ authorizationUrl: string;
201
+ tokenUrl: string;
202
+ } & {
203
+ 'x-scalar-secret-client-secret': string;
204
+ } & {
205
+ 'x-scalar-secret-redirect-uri': string;
206
+ } & {
207
+ 'x-usePkce': "SHA-256" | "plain" | "no";
208
+ } & {
209
+ 'x-scalar-credentials-location'?: "body" | "header" | undefined;
210
+ }) | undefined;
211
+ };
212
+ } & {
213
+ 'x-default-scopes'?: string[] | undefined;
214
+ }) | ({
215
+ description?: string | undefined;
216
+ } & {
217
+ type: "openIdConnect";
218
+ openIdConnectUrl: string;
219
+ }) | ({
220
+ summary?: string | undefined;
221
+ description?: string | undefined;
222
+ $ref: string;
223
+ } & {
224
+ $status?: "error" | "loading" | undefined;
225
+ $global?: boolean | undefined;
226
+ } & {
227
+ '$ref-value': ({
228
+ description?: string | undefined;
229
+ } & {
230
+ 'x-scalar-secret-token': string;
231
+ } & {
232
+ type: "apiKey";
233
+ in: "header" | "query" | "cookie";
234
+ name: string;
235
+ }) | ({
236
+ description?: string | undefined;
237
+ } & {
238
+ 'x-scalar-secret-token': string;
239
+ } & {
240
+ 'x-scalar-secret-username': string;
241
+ 'x-scalar-secret-password': string;
242
+ } & {
243
+ bearerFormat?: string | undefined;
244
+ type: "http";
245
+ scheme: "basic" | "bearer";
246
+ }) | ({
247
+ description?: string | undefined;
248
+ } & {
249
+ type: "oauth2";
250
+ flows: {
251
+ password?: ({
252
+ refreshUrl: string;
253
+ scopes: {
254
+ [x: string]: string;
255
+ };
256
+ } & {
257
+ 'x-scalar-secret-client-id': string;
258
+ } & {
259
+ 'x-scalar-secret-token': string;
260
+ } & {
261
+ 'x-scalar-security-query'?: {
262
+ [x: string]: string;
263
+ } | undefined;
264
+ } & {
265
+ 'x-scalar-security-body'?: {
266
+ [x: string]: string;
267
+ } | undefined;
268
+ } & {
269
+ 'x-tokenName'?: string | undefined;
270
+ } & {
271
+ tokenUrl: string;
272
+ } & {
273
+ 'x-scalar-secret-username': string;
274
+ 'x-scalar-secret-password': string;
275
+ } & {
276
+ 'x-scalar-secret-client-secret': string;
277
+ } & {
278
+ 'x-scalar-credentials-location'?: "body" | "header" | undefined;
279
+ }) | undefined;
280
+ implicit?: ({
281
+ refreshUrl: string;
282
+ scopes: {
283
+ [x: string]: string;
284
+ };
285
+ } & {
286
+ 'x-scalar-secret-client-id': string;
287
+ } & {
288
+ 'x-scalar-secret-token': string;
289
+ } & {
290
+ 'x-scalar-security-query'?: {
291
+ [x: string]: string;
292
+ } | undefined;
293
+ } & {
294
+ 'x-scalar-security-body'?: {
295
+ [x: string]: string;
296
+ } | undefined;
297
+ } & {
298
+ 'x-tokenName'?: string | undefined;
299
+ } & {
300
+ authorizationUrl: string;
301
+ } & {
302
+ 'x-scalar-secret-redirect-uri': string;
303
+ }) | undefined;
304
+ clientCredentials?: ({
305
+ refreshUrl: string;
306
+ scopes: {
307
+ [x: string]: string;
308
+ };
309
+ } & {
310
+ 'x-scalar-secret-client-id': string;
311
+ } & {
312
+ 'x-scalar-secret-token': string;
313
+ } & {
314
+ 'x-scalar-security-query'?: {
315
+ [x: string]: string;
316
+ } | undefined;
317
+ } & {
318
+ 'x-scalar-security-body'?: {
319
+ [x: string]: string;
320
+ } | undefined;
321
+ } & {
322
+ 'x-tokenName'?: string | undefined;
323
+ } & {
324
+ tokenUrl: string;
325
+ } & {
326
+ 'x-scalar-secret-client-secret': string;
327
+ } & {
328
+ 'x-scalar-credentials-location'?: "body" | "header" | undefined;
329
+ }) | undefined;
330
+ authorizationCode?: ({
331
+ refreshUrl: string;
332
+ scopes: {
333
+ [x: string]: string;
334
+ };
335
+ } & {
336
+ 'x-scalar-secret-client-id': string;
337
+ } & {
338
+ 'x-scalar-secret-token': string;
339
+ } & {
340
+ 'x-scalar-security-query'?: {
341
+ [x: string]: string;
342
+ } | undefined;
343
+ } & {
344
+ 'x-scalar-security-body'?: {
345
+ [x: string]: string;
346
+ } | undefined;
347
+ } & {
348
+ 'x-tokenName'?: string | undefined;
349
+ } & {
350
+ authorizationUrl: string;
351
+ tokenUrl: string;
352
+ } & {
353
+ 'x-scalar-secret-client-secret': string;
354
+ } & {
355
+ 'x-scalar-secret-redirect-uri': string;
356
+ } & {
357
+ 'x-usePkce': "SHA-256" | "plain" | "no";
358
+ } & {
359
+ 'x-scalar-credentials-location'?: "body" | "header" | undefined;
360
+ }) | undefined;
361
+ };
362
+ } & {
363
+ 'x-default-scopes'?: string[] | undefined;
364
+ }) | ({
365
+ description?: string | undefined;
366
+ } & {
367
+ type: "openIdConnect";
368
+ openIdConnectUrl: string;
369
+ });
370
+ });
371
+ };
372
+ /**
373
+ * Stores the authentication schemes in local storage.
374
+ * @param value The SecuritySchemes object to stringify and store.
375
+ */
376
+ setSchemas: (slug: string, value: SecuritySchemes) => void;
377
+ /**
378
+ * Retrieves and coerces the selected authentication schemes stored in local storage.
379
+ */
380
+ getSelectedSchemes: (slug: string) => {
381
+ 'x-scalar-selected-security'?: {
382
+ selectedSchemes: {}[];
383
+ selectedIndex: number;
384
+ } | undefined;
385
+ };
386
+ /**
387
+ * Stores the user's selected authentication schemes in local storage.
388
+ * @param value The XScalarSelectedSecurity object to stringify and store.
389
+ */
390
+ setSelectedSchemes: (slug: string, value: XScalarSelectedSecurity) => void;
391
+ };
392
+ /**
393
+ * Recursively merges secret values from stored data into the current schema.
394
+ * Only merges secrets if the corresponding structure exists in the current schema.
395
+ *
396
+ * This function walks through both objects in parallel, copying any keys that
397
+ * start with 'x-scalar-secret-' from the stored object to the current object,
398
+ * but only if the path exists in the current schema.
399
+ *
400
+ * @param current - The current schema object (source of truth for structure)
401
+ * @param stored - The stored object containing secret values to restore
402
+ */
403
+ export declare const mergeSecrets: (current: unknown, stored: unknown) => void;
404
+ /**
405
+ * Restores authentication secrets from local storage to the workspace store.
406
+ *
407
+ * This function iterates through stored authentication schemes and restores
408
+ * any secret values (keys starting with x-scalar-secret-) to the active
409
+ * document's security schemes. It uses the current security schemes as the
410
+ * source of truth, only restoring secrets for structures that exist in the
411
+ * current document.
412
+ */
413
+ export declare const restoreAuthSecretsFromStorage: ({ documentName, workspaceStore, }: {
414
+ documentName: string;
415
+ workspaceStore: WorkspaceStore;
416
+ }) => void;
417
+ export declare function safeParseJson(value: string): any;
418
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
package/helpers.js ADDED
@@ -0,0 +1,201 @@
1
+ import { getSecuritySchemes } from "@scalar/api-client/v2/blocks/operation-block";
2
+ import { getSelectedSecurity, getSelectedServer } from "@scalar/api-client/v2/features/operation";
3
+ import { isDefined } from "@scalar/helpers/array/is-defined";
4
+ import { isObject } from "@scalar/helpers/object/is-object";
5
+ import { REFERENCE_LS_KEYS, safeLocalStorage } from "@scalar/helpers/object/local-storage";
6
+ import { getResolvedRef } from "@scalar/workspace-store/helpers/get-resolved-ref";
7
+ import { coerceValue } from "@scalar/workspace-store/schemas/typebox-coerce";
8
+ import { XScalarSelectedSecuritySchema, SecuritySchemesSchema } from "@scalar/workspace-store/schemas/v3.1/strict/openapi-document";
9
+ const combineParams = (pathParams = [], operationParams = []) => {
10
+ const allParams = [...pathParams, ...operationParams].map((param) => getResolvedRef(param)).filter((e) => isDefined(e) && e.name);
11
+ const uniqueParams = /* @__PURE__ */ new Map();
12
+ for (const param of allParams) {
13
+ const key = `${param.in}:${param.name}`;
14
+ uniqueParams.set(key, param);
15
+ }
16
+ return Array.from(uniqueParams.values());
17
+ };
18
+ function getFirstServer(...availableServers) {
19
+ for (const serverSource of availableServers) {
20
+ if (!serverSource) {
21
+ continue;
22
+ }
23
+ if (!Array.isArray(serverSource)) {
24
+ const resolvedServer = getResolvedRef(serverSource);
25
+ if (resolvedServer?.url) {
26
+ return resolvedServer;
27
+ }
28
+ continue;
29
+ }
30
+ for (const server of serverSource) {
31
+ const resolvedServer = getResolvedRef(server);
32
+ if (resolvedServer?.url) {
33
+ return resolvedServer;
34
+ }
35
+ }
36
+ }
37
+ return void 0;
38
+ }
39
+ const getKey = (requirement) => Object.keys(requirement).sort().join(",");
40
+ const filterSelectedSecurity = (document, operation, securitySchemes = {}) => {
41
+ const securityRequirements = operation?.security ?? document.security ?? [];
42
+ const selectedSecurity = getSelectedSecurity(
43
+ document?.["x-scalar-selected-security"],
44
+ operation?.["x-scalar-selected-security"]
45
+ );
46
+ const requirementSet = new Set(securityRequirements.map((r) => getKey(r)));
47
+ const selectedRequirement = selectedSecurity.selectedSchemes[selectedSecurity.selectedIndex];
48
+ if (selectedRequirement && requirementSet.has(getKey(selectedRequirement))) {
49
+ return getSecuritySchemes(securitySchemes, [selectedRequirement]);
50
+ }
51
+ for (const selected of selectedSecurity.selectedSchemes) {
52
+ if (requirementSet.has(getKey(selected))) {
53
+ return getSecuritySchemes(securitySchemes, [selected]);
54
+ }
55
+ }
56
+ if (operation?.security?.length && !document?.["x-scalar-set-operation-security"]) {
57
+ return getSecuritySchemes(securitySchemes, securityRequirements.slice(0, 1));
58
+ }
59
+ return [];
60
+ };
61
+ function getOperations(doc) {
62
+ return Object.values(doc.paths ?? {}).flatMap(
63
+ (path) => Object.values(path ?? {})
64
+ );
65
+ }
66
+ function getSecurityFromDocument(document) {
67
+ const selectedSchemes = document["x-scalar-selected-security"]?.selectedSchemes ?? [];
68
+ const schemeKeys = selectedSchemes.flatMap((scheme) => Object.keys(scheme));
69
+ const securitySchemes = document.components?.securitySchemes;
70
+ if (!securitySchemes) return [];
71
+ return schemeKeys.reduce((acc, cur) => {
72
+ const security = securitySchemes[cur];
73
+ if (security) acc.push(getResolvedRef(security));
74
+ return acc;
75
+ }, []);
76
+ }
77
+ function createDocumentSettings(workspaceStore) {
78
+ return Object.fromEntries(
79
+ Object.entries(workspaceStore.workspace.documents).map(
80
+ ([key, document]) => [
81
+ key,
82
+ {
83
+ activeServer: getSelectedServer(document),
84
+ securitySchemes: getSecurityFromDocument(document)
85
+ }
86
+ ]
87
+ )
88
+ );
89
+ }
90
+ const storage = safeLocalStorage();
91
+ const authStorage = () => {
92
+ const schemasKey = REFERENCE_LS_KEYS.AUTH_SCHEMES;
93
+ const selectedSchemesKey = REFERENCE_LS_KEYS.SELECTED_AUTH_SCHEMES;
94
+ const getAuthId = (type, prefix) => {
95
+ const getKey2 = (type2) => {
96
+ return type2 === "schemas" ? schemasKey : selectedSchemesKey;
97
+ };
98
+ return `${prefix}-${getKey2(type)}`;
99
+ };
100
+ return {
101
+ /**
102
+ * Retrieves and coerces the authentication schemes stored in local storage.
103
+ */
104
+ getSchemas: (slug) => {
105
+ const parsed = JSON.parse(
106
+ storage.getItem(getAuthId("schemas", slug)) ?? "{}"
107
+ );
108
+ return coerceValue(SecuritySchemesSchema, parsed);
109
+ },
110
+ /**
111
+ * Stores the authentication schemes in local storage.
112
+ * @param value The SecuritySchemes object to stringify and store.
113
+ */
114
+ setSchemas: (slug, value) => {
115
+ storage.setItem(getAuthId("schemas", slug), JSON.stringify(value));
116
+ },
117
+ /**
118
+ * Retrieves and coerces the selected authentication schemes stored in local storage.
119
+ */
120
+ getSelectedSchemes: (slug) => {
121
+ const parsed = JSON.parse(
122
+ storage.getItem(getAuthId("selectedSchemes", slug)) ?? "{}"
123
+ );
124
+ return coerceValue(XScalarSelectedSecuritySchema, parsed);
125
+ },
126
+ /**
127
+ * Stores the user's selected authentication schemes in local storage.
128
+ * @param value The XScalarSelectedSecurity object to stringify and store.
129
+ */
130
+ setSelectedSchemes: (slug, value) => {
131
+ storage.setItem(getAuthId("selectedSchemes", slug), JSON.stringify(value));
132
+ }
133
+ };
134
+ };
135
+ const mergeSecrets = (current, stored) => {
136
+ if (!isObject(current) || !isObject(stored)) {
137
+ return;
138
+ }
139
+ for (const [key, storedValue] of Object.entries(stored)) {
140
+ if (typeof storedValue !== "object") {
141
+ current[key] = storedValue;
142
+ continue;
143
+ }
144
+ mergeSecrets(getResolvedRef(current[key]), storedValue);
145
+ }
146
+ };
147
+ const isSchemeValid = (scheme, availableSchemes) => Object.keys(scheme).every((key) => availableSchemes.has(key));
148
+ const clampSelectedIndex = (selectedIndex, schemesLength) => selectedIndex >= schemesLength ? schemesLength - 1 : selectedIndex;
149
+ const restoreAuthSecretsFromStorage = ({
150
+ documentName,
151
+ workspaceStore
152
+ }) => {
153
+ const storedAuthSchemes = authStorage().getSchemas(documentName);
154
+ const document = workspaceStore.workspace.documents[documentName];
155
+ if (!document) return;
156
+ const authPersistence = authStorage();
157
+ const storedSelectedAuthSchemes = authPersistence.getSelectedSchemes(documentName);
158
+ const availableSchemes = new Set(
159
+ Object.keys(document.components?.securitySchemes ?? {})
160
+ );
161
+ const selectedSchemes = storedSelectedAuthSchemes["x-scalar-selected-security"]?.selectedSchemes;
162
+ const validSchemes = selectedSchemes?.filter(
163
+ (scheme) => isSchemeValid(scheme, availableSchemes)
164
+ );
165
+ if (!document["x-scalar-selected-security"] && validSchemes && validSchemes.length > 0) {
166
+ const selectedIdx = storedSelectedAuthSchemes["x-scalar-selected-security"]?.selectedIndex;
167
+ const clampedIndex = clampSelectedIndex(
168
+ selectedIdx ?? 0,
169
+ validSchemes.length
170
+ );
171
+ document["x-scalar-selected-security"] = {
172
+ selectedIndex: clampedIndex,
173
+ selectedSchemes: validSchemes
174
+ };
175
+ }
176
+ const securitySchemes = document.components?.securitySchemes ?? {};
177
+ for (const [key, storedScheme] of Object.entries(storedAuthSchemes)) {
178
+ const currentScheme = getResolvedRef(securitySchemes[key]);
179
+ if (isObject(currentScheme)) mergeSecrets(currentScheme, storedScheme);
180
+ }
181
+ };
182
+ function safeParseJson(value) {
183
+ try {
184
+ return JSON.parse(value);
185
+ } catch {
186
+ return;
187
+ }
188
+ }
189
+ export {
190
+ authStorage,
191
+ combineParams,
192
+ createDocumentSettings,
193
+ filterSelectedSecurity,
194
+ getFirstServer,
195
+ getOperations,
196
+ getSecurityFromDocument,
197
+ mergeSecrets,
198
+ restoreAuthSecretsFromStorage,
199
+ safeParseJson
200
+ };
201
+ //# sourceMappingURL=helpers.js.map
package/helpers.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sources":["../src/helpers.ts"],"sourcesContent":["import type { ToolUIPart, UIDataTypes, UIMessagePart } from 'ai'\n\nimport { getSecuritySchemes } from '@scalar/api-client/v2/blocks/operation-block'\nimport type { MergedSecuritySchemes } from '@scalar/api-client/v2/blocks/scalar-auth-selector-block'\nimport {\n getSelectedSecurity,\n getSelectedServer,\n} from '@scalar/api-client/v2/features/operation'\nimport { isDefined } from '@scalar/helpers/array/is-defined'\nimport { isObject } from '@scalar/helpers/object/is-object'\nimport {\n REFERENCE_LS_KEYS,\n safeLocalStorage,\n} from '@scalar/helpers/object/local-storage'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { AuthenticationConfiguration } from '@scalar/types/api-reference'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport type { WorkspaceDocument } from '@scalar/workspace-store/schemas'\nimport type { XScalarSelectedSecurity } from '@scalar/workspace-store/schemas/extensions/security/x-scalar-selected-security'\nimport { coerceValue } from '@scalar/workspace-store/schemas/typebox-coerce'\nimport type {\n OpenApiDocument,\n OperationObject,\n ParameterObject,\n PathItemObject,\n SecurityRequirementObject,\n SecuritySchemeObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport {\n type SecuritySchemes,\n SecuritySchemesSchema,\n XScalarSelectedSecuritySchema,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\n\nimport type { Tools } from '@/state/state'\n\n/** Combine pathItem and operation parameters into a single, dereferenced parameter array */\nexport const combineParams = (\n pathParams: PathItemObject['parameters'] = [],\n operationParams: OperationObject['parameters'] = [],\n): ParameterObject[] => {\n const allParams = [...pathParams, ...operationParams]\n .map((param) => getResolvedRef(param))\n // For unresolved params, coercion is going to generate a template object with an empty name, we don't want to include those\n .filter((e) => isDefined(e) && e.name)\n\n // Use a Map to ensure unique in+name combinations\n // Operation parameters take precedence over path parameters\n const uniqueParams = new Map<string, ParameterObject>()\n\n for (const param of allParams) {\n const key = `${param.in}:${param.name}`\n uniqueParams.set(key, param)\n }\n\n return Array.from(uniqueParams.values())\n}\n\n/**\n * Iterate through all available servers and pick the first one\n *\n * @example\n * getFirstServer([operation.servers, pathItem.servers, server])\n */\nexport function getFirstServer(\n ...availableServers: (ServerObject[] | ServerObject | undefined | null)[]\n): ServerObject | undefined {\n for (const serverSource of availableServers) {\n if (!serverSource) {\n continue\n }\n\n // Handle single server object\n if (!Array.isArray(serverSource)) {\n const resolvedServer = getResolvedRef(serverSource) as ServerObject\n if (resolvedServer?.url) {\n return resolvedServer\n }\n continue\n }\n\n // Handle array of servers, pick the first one with a URL\n for (const server of serverSource) {\n const resolvedServer = getResolvedRef(server) as ServerObject\n if (resolvedServer?.url) {\n return resolvedServer\n }\n }\n }\n\n return undefined\n}\n\n/** Determine if a message part is a tool */\nexport function isToolPart(\n part: UIMessagePart<UIDataTypes, Tools>,\n): part is ToolUIPart<Tools> {\n return part.type.startsWith('tool-')\n}\n\n/**\n * Extracts the default scopes for a security scheme.\n * Only OAuth2 schemes can have default scopes via the x-default-scopes extension.\n */\nexport const getDefaultScopes = (\n scheme: SecuritySchemeObject | undefined,\n): string[] => {\n if (!scheme || scheme.type !== 'oauth2') {\n return []\n }\n\n return scheme['x-default-scopes'] ?? []\n}\n\n/**\n * Processes a single scheme name and adds it to the accumulator with its default scopes.\n */\nconst addSchemeToRequirement = (\n acc: SecurityRequirementObject,\n schemeName: string,\n securitySchemes: MergedSecuritySchemes,\n): void => {\n const scheme = getResolvedRef(securitySchemes[schemeName])\n acc[schemeName] = getDefaultScopes(scheme)\n}\n\n/**\n * Converts the preferred security scheme configuration into a SecurityRequirementObject.\n * Handles both flat arrays and nested arrays (for complex auth scenarios).\n */\nconst buildSecurityRequirementFromPreferred = (\n preferredSecurityScheme: string | (string | string[])[],\n securitySchemes: MergedSecuritySchemes,\n): SecurityRequirementObject => {\n if (!Array.isArray(preferredSecurityScheme)) {\n const scheme = getResolvedRef(securitySchemes[preferredSecurityScheme])\n return { [preferredSecurityScheme]: getDefaultScopes(scheme) }\n }\n\n const requirement: SecurityRequirementObject = {}\n\n for (const item of preferredSecurityScheme) {\n if (Array.isArray(item)) {\n // Handle nested arrays for complex auth (e.g., [['oauth2', 'apiKey'], 'basic'])\n for (const schemeName of item) {\n addSchemeToRequirement(requirement, schemeName, securitySchemes)\n }\n } else {\n addSchemeToRequirement(requirement, item, securitySchemes)\n }\n }\n\n return requirement\n}\n\n/**\n * Determines the default security scheme to use for an operation.\n *\n * Priority order:\n * 1. User-configured preferred security scheme (if provided)\n * 2. First security requirement from the OpenAPI spec\n * 3. null (no security required)\n */\nexport const getDefaultSecurity = (\n securityRequirements: SecurityRequirementObject[],\n preferredSecurityScheme: AuthenticationConfiguration['preferredSecurityScheme'],\n securitySchemes: MergedSecuritySchemes,\n): SecurityRequirementObject | null => {\n if (preferredSecurityScheme) {\n return buildSecurityRequirementFromPreferred(\n preferredSecurityScheme,\n securitySchemes,\n )\n }\n\n const firstRequirement = securityRequirements[0]\n if (firstRequirement) {\n return unpackProxyObject(firstRequirement, { depth: 1 })\n }\n\n return null\n}\n\n/** Builds a quick cache key from the sorted object keys */\nconst getKey = (requirement: SecurityRequirementObject) =>\n Object.keys(requirement).sort().join(',')\n\n/**\n * Find the intersection between which security is selected on the document and what this operation requires\n *\n * If there is no overlap, we return the first requirement\n */\nexport const filterSelectedSecurity = (\n document: OpenApiDocument,\n operation: OperationObject | null,\n securitySchemes: MergedSecuritySchemes = {},\n): SecuritySchemeObject[] => {\n const securityRequirements = operation?.security ?? document.security ?? []\n\n /** The selected security keys for the document */\n const selectedSecurity = getSelectedSecurity(\n document?.['x-scalar-selected-security'],\n operation?.['x-scalar-selected-security'],\n )\n\n /** Build a set for O(1) lookup */\n const requirementSet = new Set(securityRequirements.map((r) => getKey(r)))\n\n // Lets check the selectedIndex first\n const selectedRequirement =\n selectedSecurity.selectedSchemes[selectedSecurity.selectedIndex]\n if (selectedRequirement && requirementSet.has(getKey(selectedRequirement))) {\n return getSecuritySchemes(securitySchemes, [selectedRequirement])\n }\n\n // Otherwise lets loop over all selected\n for (const selected of selectedSecurity.selectedSchemes) {\n if (requirementSet.has(getKey(selected))) {\n return getSecuritySchemes(securitySchemes, [selected])\n }\n }\n\n /**\n * If we are selected security on the document,\n * we should show the first requirement of the operation to show auth is required\n */\n if (\n operation?.security?.length &&\n !document?.['x-scalar-set-operation-security']\n ) {\n return getSecuritySchemes(securitySchemes, securityRequirements.slice(0, 1))\n }\n\n return []\n}\n\nexport function getOperations(doc: Partial<OpenAPIV3_1.Document>) {\n return Object.values(doc.paths ?? {}).flatMap((path) =>\n Object.values(path ?? {}),\n ) as OperationObject[]\n}\n\n/** Flattens all security requirements from a document */\nexport function getSecurityFromDocument(document: WorkspaceDocument) {\n const selectedSchemes =\n document['x-scalar-selected-security']?.selectedSchemes ?? []\n\n const schemeKeys = selectedSchemes.flatMap((scheme) => Object.keys(scheme))\n\n const securitySchemes = document.components?.securitySchemes\n\n if (!securitySchemes) return []\n\n return schemeKeys.reduce<SecuritySchemeObject[]>((acc, cur) => {\n const security = securitySchemes[cur]\n\n if (security) acc.push(getResolvedRef(security))\n\n return acc\n }, [])\n}\n\n/** Generate document settings from workspace store */\nexport function createDocumentSettings(workspaceStore: WorkspaceStore) {\n return Object.fromEntries(\n Object.entries(workspaceStore.workspace.documents).map(\n ([key, document]) => [\n key,\n {\n activeServer: getSelectedServer(document),\n securitySchemes: getSecurityFromDocument(document),\n },\n ],\n ),\n )\n}\n\n// Local storage helper instance, safely wrapped.\nconst storage = safeLocalStorage()\n\n/**\n * Provides an interface to store and retrieve the selected client value\n * in local storage.\n */\nexport const clientStorage = () => {\n const key = REFERENCE_LS_KEYS.SELECTED_CLIENT\n return {\n /**\n * Gets the stored selected client from local storage.\n */\n get: () => {\n return storage.getItem(key)\n },\n /**\n * Stores the selected client value in local storage.\n * @param value The value to store\n */\n set: (value: string) => {\n storage.setItem(key, value as string)\n },\n }\n}\n\n/**\n * Provides an interface to store and retrieve authentication scheme\n * information in local storage, including both the available schemes and\n * the user's selected schemes.\n */\nexport const authStorage = () => {\n const schemasKey = REFERENCE_LS_KEYS.AUTH_SCHEMES\n const selectedSchemesKey = REFERENCE_LS_KEYS.SELECTED_AUTH_SCHEMES\n\n const getAuthId = (type: 'schemas' | 'selectedSchemes', prefix: string) => {\n const getKey = (type: 'schemas' | 'selectedSchemes') => {\n return type === 'schemas' ? schemasKey : selectedSchemesKey\n }\n return `${prefix}-${getKey(type)}`\n }\n\n return {\n /**\n * Retrieves and coerces the authentication schemes stored in local storage.\n */\n getSchemas: (slug: string) => {\n const parsed = JSON.parse(\n storage.getItem(getAuthId('schemas', slug)) ?? '{}',\n )\n return coerceValue(SecuritySchemesSchema, parsed)\n },\n /**\n * Stores the authentication schemes in local storage.\n * @param value The SecuritySchemes object to stringify and store.\n */\n setSchemas: (slug: string, value: SecuritySchemes) => {\n storage.setItem(getAuthId('schemas', slug), JSON.stringify(value))\n },\n /**\n * Retrieves and coerces the selected authentication schemes stored in local storage.\n */\n getSelectedSchemes: (slug: string) => {\n const parsed = JSON.parse(\n storage.getItem(getAuthId('selectedSchemes', slug)) ?? '{}',\n )\n return coerceValue(XScalarSelectedSecuritySchema, parsed)\n },\n /**\n * Stores the user's selected authentication schemes in local storage.\n * @param value The XScalarSelectedSecurity object to stringify and store.\n */\n setSelectedSchemes: (slug: string, value: XScalarSelectedSecurity) => {\n storage.setItem(getAuthId('selectedSchemes', slug), JSON.stringify(value))\n },\n }\n}\n\n/**\n * Recursively merges secret values from stored data into the current schema.\n * Only merges secrets if the corresponding structure exists in the current schema.\n *\n * This function walks through both objects in parallel, copying any keys that\n * start with 'x-scalar-secret-' from the stored object to the current object,\n * but only if the path exists in the current schema.\n *\n * @param current - The current schema object (source of truth for structure)\n * @param stored - The stored object containing secret values to restore\n */\nexport const mergeSecrets = (current: unknown, stored: unknown): void => {\n if (!isObject(current) || !isObject(stored)) {\n return\n }\n\n // Iterate through stored keys to find secrets to restore\n for (const [key, storedValue] of Object.entries(stored)) {\n // If this is a secret key and it has a value, restore it to current\n if (typeof storedValue !== 'object') {\n current[key] = storedValue\n continue\n }\n\n // If the value is an object (and not null), recurse into it\n mergeSecrets(getResolvedRef(current[key]), storedValue)\n }\n}\n\ntype SelectedSecurityScheme = NonNullable<\n XScalarSelectedSecurity['x-scalar-selected-security']\n>['selectedSchemes'][number]\n\n/**\n * Validates that all keys in a security scheme exist in the available schemes.\n */\nconst isSchemeValid = (\n scheme: SelectedSecurityScheme,\n availableSchemes: Set<string>,\n): boolean => Object.keys(scheme).every((key) => availableSchemes.has(key))\n\n/**\n * Clamps the selected index to be within the valid range of schemes.\n * If the index is out of bounds, returns the last valid index.\n */\nconst clampSelectedIndex = (\n selectedIndex: number,\n schemesLength: number,\n): number =>\n selectedIndex >= schemesLength ? schemesLength - 1 : selectedIndex\n\n/**\n * Restores authentication secrets from local storage to the workspace store.\n *\n * This function iterates through stored authentication schemes and restores\n * any secret values (keys starting with x-scalar-secret-) to the active\n * document's security schemes. It uses the current security schemes as the\n * source of truth, only restoring secrets for structures that exist in the\n * current document.\n */\nexport const restoreAuthSecretsFromStorage = ({\n documentName,\n workspaceStore,\n}: {\n documentName: string\n workspaceStore: WorkspaceStore\n}): void => {\n const storedAuthSchemes = authStorage().getSchemas(documentName)\n\n const document = workspaceStore.workspace.documents[documentName]\n\n if (!document) return\n\n const authPersistence = authStorage()\n\n const storedSelectedAuthSchemes =\n authPersistence.getSelectedSchemes(documentName)\n\n const availableSchemes = new Set(\n Object.keys(document.components?.securitySchemes ?? {}),\n )\n\n const selectedSchemes =\n storedSelectedAuthSchemes['x-scalar-selected-security']?.selectedSchemes\n\n const validSchemes = selectedSchemes?.filter((scheme) =>\n isSchemeValid(scheme, availableSchemes),\n )\n\n if (\n !document['x-scalar-selected-security'] &&\n validSchemes &&\n validSchemes.length > 0\n ) {\n const selectedIdx =\n storedSelectedAuthSchemes['x-scalar-selected-security']?.selectedIndex\n\n const clampedIndex = clampSelectedIndex(\n selectedIdx ?? 0,\n validSchemes.length,\n )\n\n document['x-scalar-selected-security'] = {\n selectedIndex: clampedIndex,\n selectedSchemes: validSchemes,\n }\n }\n\n const securitySchemes = document.components?.securitySchemes ?? {}\n\n for (const [key, storedScheme] of Object.entries(storedAuthSchemes)) {\n const currentScheme = getResolvedRef(securitySchemes[key])\n\n if (isObject(currentScheme)) mergeSecrets(currentScheme, storedScheme)\n }\n}\n\nexport function safeParseJson(value: string) {\n try {\n return JSON.parse(value)\n } catch {\n return\n }\n}\n"],"names":["getKey","type"],"mappings":";;;;;;;;AAwCO,MAAM,gBAAgB,CAC3B,aAA2C,IAC3C,kBAAiD,CAAA,MAC3B;AACtB,QAAM,YAAY,CAAC,GAAG,YAAY,GAAG,eAAe,EACjD,IAAI,CAAC,UAAU,eAAe,KAAK,CAAC,EAEpC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI;AAIvC,QAAM,mCAAmB,IAAA;AAEzB,aAAW,SAAS,WAAW;AAC7B,UAAM,MAAM,GAAG,MAAM,EAAE,IAAI,MAAM,IAAI;AACrC,iBAAa,IAAI,KAAK,KAAK;AAAA,EAC7B;AAEA,SAAO,MAAM,KAAK,aAAa,OAAA,CAAQ;AACzC;AAQO,SAAS,kBACX,kBACuB;AAC1B,aAAW,gBAAgB,kBAAkB;AAC3C,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAGA,QAAI,CAAC,MAAM,QAAQ,YAAY,GAAG;AAChC,YAAM,iBAAiB,eAAe,YAAY;AAClD,UAAI,gBAAgB,KAAK;AACvB,eAAO;AAAA,MACT;AACA;AAAA,IACF;AAGA,eAAW,UAAU,cAAc;AACjC,YAAM,iBAAiB,eAAe,MAAM;AAC5C,UAAI,gBAAgB,KAAK;AACvB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AA6FA,MAAM,SAAS,CAAC,gBACd,OAAO,KAAK,WAAW,EAAE,KAAA,EAAO,KAAK,GAAG;AAOnC,MAAM,yBAAyB,CACpC,UACA,WACA,kBAAyC,CAAA,MACd;AAC3B,QAAM,uBAAuB,WAAW,YAAY,SAAS,YAAY,CAAA;AAGzE,QAAM,mBAAmB;AAAA,IACvB,WAAW,4BAA4B;AAAA,IACvC,YAAY,4BAA4B;AAAA,EAAA;AAI1C,QAAM,iBAAiB,IAAI,IAAI,qBAAqB,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;AAGzE,QAAM,sBACJ,iBAAiB,gBAAgB,iBAAiB,aAAa;AACjE,MAAI,uBAAuB,eAAe,IAAI,OAAO,mBAAmB,CAAC,GAAG;AAC1E,WAAO,mBAAmB,iBAAiB,CAAC,mBAAmB,CAAC;AAAA,EAClE;AAGA,aAAW,YAAY,iBAAiB,iBAAiB;AACvD,QAAI,eAAe,IAAI,OAAO,QAAQ,CAAC,GAAG;AACxC,aAAO,mBAAmB,iBAAiB,CAAC,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AAMA,MACE,WAAW,UAAU,UACrB,CAAC,WAAW,iCAAiC,GAC7C;AACA,WAAO,mBAAmB,iBAAiB,qBAAqB,MAAM,GAAG,CAAC,CAAC;AAAA,EAC7E;AAEA,SAAO,CAAA;AACT;AAEO,SAAS,cAAc,KAAoC;AAChE,SAAO,OAAO,OAAO,IAAI,SAAS,CAAA,CAAE,EAAE;AAAA,IAAQ,CAAC,SAC7C,OAAO,OAAO,QAAQ,CAAA,CAAE;AAAA,EAAA;AAE5B;AAGO,SAAS,wBAAwB,UAA6B;AACnE,QAAM,kBACJ,SAAS,4BAA4B,GAAG,mBAAmB,CAAA;AAE7D,QAAM,aAAa,gBAAgB,QAAQ,CAAC,WAAW,OAAO,KAAK,MAAM,CAAC;AAE1E,QAAM,kBAAkB,SAAS,YAAY;AAE7C,MAAI,CAAC,gBAAiB,QAAO,CAAA;AAE7B,SAAO,WAAW,OAA+B,CAAC,KAAK,QAAQ;AAC7D,UAAM,WAAW,gBAAgB,GAAG;AAEpC,QAAI,SAAU,KAAI,KAAK,eAAe,QAAQ,CAAC;AAE/C,WAAO;AAAA,EACT,GAAG,CAAA,CAAE;AACP;AAGO,SAAS,uBAAuB,gBAAgC;AACrE,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,eAAe,UAAU,SAAS,EAAE;AAAA,MACjD,CAAC,CAAC,KAAK,QAAQ,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,UACE,cAAc,kBAAkB,QAAQ;AAAA,UACxC,iBAAiB,wBAAwB,QAAQ;AAAA,QAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEJ;AAGA,MAAM,UAAU,iBAAA;AA8BT,MAAM,cAAc,MAAM;AAC/B,QAAM,aAAa,kBAAkB;AACrC,QAAM,qBAAqB,kBAAkB;AAE7C,QAAM,YAAY,CAAC,MAAqC,WAAmB;AACzE,UAAMA,UAAS,CAACC,UAAwC;AACtD,aAAOA,UAAS,YAAY,aAAa;AAAA,IAC3C;AACA,WAAO,GAAG,MAAM,IAAID,QAAO,IAAI,CAAC;AAAA,EAClC;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,YAAY,CAAC,SAAiB;AAC5B,YAAM,SAAS,KAAK;AAAA,QAClB,QAAQ,QAAQ,UAAU,WAAW,IAAI,CAAC,KAAK;AAAA,MAAA;AAEjD,aAAO,YAAY,uBAAuB,MAAM;AAAA,IAClD;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,YAAY,CAAC,MAAc,UAA2B;AACpD,cAAQ,QAAQ,UAAU,WAAW,IAAI,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,IACnE;AAAA;AAAA;AAAA;AAAA,IAIA,oBAAoB,CAAC,SAAiB;AACpC,YAAM,SAAS,KAAK;AAAA,QAClB,QAAQ,QAAQ,UAAU,mBAAmB,IAAI,CAAC,KAAK;AAAA,MAAA;AAEzD,aAAO,YAAY,+BAA+B,MAAM;AAAA,IAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,oBAAoB,CAAC,MAAc,UAAmC;AACpE,cAAQ,QAAQ,UAAU,mBAAmB,IAAI,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,IAC3E;AAAA,EAAA;AAEJ;AAaO,MAAM,eAAe,CAAC,SAAkB,WAA0B;AACvE,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,MAAM,GAAG;AAC3C;AAAA,EACF;AAGA,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AAEvD,QAAI,OAAO,gBAAgB,UAAU;AACnC,cAAQ,GAAG,IAAI;AACf;AAAA,IACF;AAGA,iBAAa,eAAe,QAAQ,GAAG,CAAC,GAAG,WAAW;AAAA,EACxD;AACF;AASA,MAAM,gBAAgB,CACpB,QACA,qBACY,OAAO,KAAK,MAAM,EAAE,MAAM,CAAC,QAAQ,iBAAiB,IAAI,GAAG,CAAC;AAM1E,MAAM,qBAAqB,CACzB,eACA,kBAEA,iBAAiB,gBAAgB,gBAAgB,IAAI;AAWhD,MAAM,gCAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AACF,MAGY;AACV,QAAM,oBAAoB,cAAc,WAAW,YAAY;AAE/D,QAAM,WAAW,eAAe,UAAU,UAAU,YAAY;AAEhE,MAAI,CAAC,SAAU;AAEf,QAAM,kBAAkB,YAAA;AAExB,QAAM,4BACJ,gBAAgB,mBAAmB,YAAY;AAEjD,QAAM,mBAAmB,IAAI;AAAA,IAC3B,OAAO,KAAK,SAAS,YAAY,mBAAmB,CAAA,CAAE;AAAA,EAAA;AAGxD,QAAM,kBACJ,0BAA0B,4BAA4B,GAAG;AAE3D,QAAM,eAAe,iBAAiB;AAAA,IAAO,CAAC,WAC5C,cAAc,QAAQ,gBAAgB;AAAA,EAAA;AAGxC,MACE,CAAC,SAAS,4BAA4B,KACtC,gBACA,aAAa,SAAS,GACtB;AACA,UAAM,cACJ,0BAA0B,4BAA4B,GAAG;AAE3D,UAAM,eAAe;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,IAAA;AAGf,aAAS,4BAA4B,IAAI;AAAA,MACvC,eAAe;AAAA,MACf,iBAAiB;AAAA,IAAA;AAAA,EAErB;AAEA,QAAM,kBAAkB,SAAS,YAAY,mBAAmB,CAAA;AAEhE,aAAW,CAAC,KAAK,YAAY,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AACnE,UAAM,gBAAgB,eAAe,gBAAgB,GAAG,CAAC;AAEzD,QAAI,SAAS,aAAa,EAAG,cAAa,eAAe,YAAY;AAAA,EACvE;AACF;AAEO,SAAS,cAAc,OAAe;AAC3C,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN;AAAA,EACF;AACF;"}