@scalar/agent-chat 0.9.12 → 0.9.13

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 (231) hide show
  1. package/dist/App.vue.d.ts +3 -3
  2. package/dist/App.vue.js +7 -0
  3. package/dist/App.vue.js.map +1 -0
  4. package/dist/App.vue.script.js +41 -0
  5. package/dist/App.vue.script.js.map +1 -0
  6. package/dist/Chat.vue.js +7 -0
  7. package/dist/Chat.vue.js.map +1 -0
  8. package/dist/Chat.vue.script.js +48 -0
  9. package/dist/Chat.vue.script.js.map +1 -0
  10. package/dist/_virtual/_plugin-vue_export-helper.js +8 -0
  11. package/dist/api.js +75 -0
  12. package/dist/api.js.map +1 -0
  13. package/dist/client-tools/execute-request.d.ts +1 -1
  14. package/dist/client-tools/execute-request.js +88 -0
  15. package/dist/client-tools/execute-request.js.map +1 -0
  16. package/dist/components/ActionsDropdown.vue.js +9 -0
  17. package/dist/components/ActionsDropdown.vue.js.map +1 -0
  18. package/dist/components/ActionsDropdown.vue.script.js +33 -0
  19. package/dist/components/ActionsDropdown.vue.script.js.map +1 -0
  20. package/dist/components/ApprovalSection.vue.js +9 -0
  21. package/dist/components/ApprovalSection.vue.js.map +1 -0
  22. package/dist/components/ApprovalSection.vue.script.js +26 -0
  23. package/dist/components/ApprovalSection.vue.script.js.map +1 -0
  24. package/dist/components/AuthenticationProvided.vue.js +13 -0
  25. package/dist/components/AuthenticationProvided.vue.js.map +1 -0
  26. package/dist/components/AuthenticationRequired.vue.js +13 -0
  27. package/dist/components/AuthenticationRequired.vue.js.map +1 -0
  28. package/dist/components/AutosendPaused.vue.js +13 -0
  29. package/dist/components/AutosendPaused.vue.js.map +1 -0
  30. package/dist/components/BuildingRequest.vue.js +19 -0
  31. package/dist/components/BuildingRequest.vue.js.map +1 -0
  32. package/dist/components/ContextItem.vue.js +9 -0
  33. package/dist/components/ContextItem.vue.js.map +1 -0
  34. package/dist/components/ContextItem.vue.script.js +13 -0
  35. package/dist/components/ContextItem.vue.script.js.map +1 -0
  36. package/dist/components/ErrorMessage.vue.d.ts +1 -1
  37. package/dist/components/ErrorMessage.vue.js +9 -0
  38. package/dist/components/ErrorMessage.vue.js.map +1 -0
  39. package/dist/components/ErrorMessage.vue.script.js +22 -0
  40. package/dist/components/ErrorMessage.vue.script.js.map +1 -0
  41. package/dist/components/FreeMessagesInfoSection.vue.js +9 -0
  42. package/dist/components/FreeMessagesInfoSection.vue.js.map +1 -0
  43. package/dist/components/FreeMessagesInfoSection.vue.script.js +43 -0
  44. package/dist/components/FreeMessagesInfoSection.vue.script.js.map +1 -0
  45. package/dist/components/LoadingMiniOpenAPIDoc.vue.js +13 -0
  46. package/dist/components/LoadingMiniOpenAPIDoc.vue.js.map +1 -0
  47. package/dist/components/LoadingOpenAPISpecsSummary.vue.js +13 -0
  48. package/dist/components/LoadingOpenAPISpecsSummary.vue.js.map +1 -0
  49. package/dist/components/Logo.vue.js +23 -0
  50. package/dist/components/Logo.vue.js.map +1 -0
  51. package/dist/components/PaymentSection.vue.js +9 -0
  52. package/dist/components/PaymentSection.vue.js.map +1 -0
  53. package/dist/components/PaymentSection.vue.script.js +22 -0
  54. package/dist/components/PaymentSection.vue.script.js.map +1 -0
  55. package/dist/components/RequestApproved.vue.js +13 -0
  56. package/dist/components/RequestApproved.vue.js.map +1 -0
  57. package/dist/components/RequestFailed.vue.js +19 -0
  58. package/dist/components/RequestFailed.vue.js.map +1 -0
  59. package/dist/components/RequestPreview.vue.d.ts +1 -1
  60. package/dist/components/RequestPreview.vue.js +9 -0
  61. package/dist/components/RequestPreview.vue.js.map +1 -0
  62. package/dist/components/RequestPreview.vue.script.js +96 -0
  63. package/dist/components/RequestPreview.vue.script.js.map +1 -0
  64. package/dist/components/RequestRejected.vue.js +19 -0
  65. package/dist/components/RequestRejected.vue.js.map +1 -0
  66. package/dist/components/RequestSuccess.vue.js +13 -0
  67. package/dist/components/RequestSuccess.vue.js.map +1 -0
  68. package/dist/components/ResponseBody/ResponseBody.vue.d.ts +1 -1
  69. package/dist/components/ResponseBody/ResponseBody.vue.js +7 -0
  70. package/dist/components/ResponseBody/ResponseBody.vue.js.map +1 -0
  71. package/dist/components/ResponseBody/ResponseBody.vue.script.js +43 -0
  72. package/dist/components/ResponseBody/ResponseBody.vue.script.js.map +1 -0
  73. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js +12 -0
  74. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js.map +1 -0
  75. package/dist/components/ResponseBody/ResponseBodyPreview.vue.d.ts +1 -1
  76. package/dist/components/ResponseBody/ResponseBodyPreview.vue.js +9 -0
  77. package/dist/components/ResponseBody/ResponseBodyPreview.vue.js.map +1 -0
  78. package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js +59 -0
  79. package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js.map +1 -0
  80. package/dist/components/ResponseBody/ResponseBodyRaw.vue.js +7 -0
  81. package/dist/components/ResponseBody/ResponseBodyRaw.vue.js.map +1 -0
  82. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js +22 -0
  83. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js.map +1 -0
  84. package/dist/components/ResponseBody/ResponseBodyToggle.vue.js +7 -0
  85. package/dist/components/ResponseBody/ResponseBodyToggle.vue.js.map +1 -0
  86. package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js +23 -0
  87. package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js.map +1 -0
  88. package/dist/components/ResponseBody/helpers/media-types.js +223 -0
  89. package/dist/components/ResponseBody/helpers/media-types.js.map +1 -0
  90. package/dist/components/ResponseBody/helpers/process-response-body.js +33 -0
  91. package/dist/components/ResponseBody/helpers/process-response-body.js.map +1 -0
  92. package/dist/components/SearchPopover.vue.js +9 -0
  93. package/dist/components/SearchPopover.vue.js.map +1 -0
  94. package/dist/components/SearchPopover.vue.script.js +53 -0
  95. package/dist/components/SearchPopover.vue.script.js.map +1 -0
  96. package/dist/components/Selector.vue.js +7 -0
  97. package/dist/components/Selector.vue.js.map +1 -0
  98. package/dist/components/Selector.vue.script.js +62 -0
  99. package/dist/components/Selector.vue.script.js.map +1 -0
  100. package/dist/components/SendingRequest.vue.js +19 -0
  101. package/dist/components/SendingRequest.vue.js.map +1 -0
  102. package/dist/components/ServerSelector.vue.js +7 -0
  103. package/dist/components/ServerSelector.vue.js.map +1 -0
  104. package/dist/components/ServerSelector.vue.script.js +60 -0
  105. package/dist/components/ServerSelector.vue.script.js.map +1 -0
  106. package/dist/components/UploadSection.vue.d.ts +1 -1
  107. package/dist/components/UploadSection.vue.js +9 -0
  108. package/dist/components/UploadSection.vue.js.map +1 -0
  109. package/dist/components/UploadSection.vue.script.js +52 -0
  110. package/dist/components/UploadSection.vue.script.js.map +1 -0
  111. package/dist/consts/urls.js +12 -0
  112. package/dist/consts/urls.js.map +1 -0
  113. package/dist/entities/error/constants.js +6 -0
  114. package/dist/entities/error/constants.js.map +1 -0
  115. package/dist/entities/error/helpers.d.ts +1 -1
  116. package/dist/entities/error/helpers.js +11 -0
  117. package/dist/entities/error/helpers.js.map +1 -0
  118. package/dist/entities/index.d.ts +9 -9
  119. package/dist/entities/index.js +10 -2
  120. package/dist/entities/prompt/constants.js +6 -0
  121. package/dist/entities/prompt/constants.js.map +1 -0
  122. package/dist/entities/registry/document.js +14 -0
  123. package/dist/entities/registry/document.js.map +1 -0
  124. package/dist/entities/tools/ask-for-authentication.js +7 -0
  125. package/dist/entities/tools/ask-for-authentication.js.map +1 -0
  126. package/dist/entities/tools/constants.js +6 -0
  127. package/dist/entities/tools/constants.js.map +1 -0
  128. package/dist/entities/tools/execute-request.d.ts +1 -1
  129. package/dist/entities/tools/execute-request.js +13 -0
  130. package/dist/entities/tools/execute-request.js.map +1 -0
  131. package/dist/entities/tools/get-mini-openapi-spec.js +7 -0
  132. package/dist/entities/tools/get-mini-openapi-spec.js.map +1 -0
  133. package/dist/entities/tools/get-openapi-spec-summary.js +6 -0
  134. package/dist/entities/tools/get-openapi-spec-summary.js.map +1 -0
  135. package/dist/helpers.js +42 -0
  136. package/dist/helpers.js.map +1 -0
  137. package/dist/hooks/use-agent-key-documents.js +24 -0
  138. package/dist/hooks/use-agent-key-documents.js.map +1 -0
  139. package/dist/hooks/use-chat-approvals.d.ts +1 -1
  140. package/dist/hooks/use-chat-approvals.js +38 -0
  141. package/dist/hooks/use-chat-approvals.js.map +1 -0
  142. package/dist/hooks/use-chat-error.js +25 -0
  143. package/dist/hooks/use-chat-error.js.map +1 -0
  144. package/dist/hooks/use-chat-pending-client-tool-parts.js +14 -0
  145. package/dist/hooks/use-chat-pending-client-tool-parts.js.map +1 -0
  146. package/dist/hooks/use-chat-scroll.js +17 -0
  147. package/dist/hooks/use-chat-scroll.js.map +1 -0
  148. package/dist/hooks/use-curated-documents.js +14 -0
  149. package/dist/hooks/use-curated-documents.js.map +1 -0
  150. package/dist/hooks/use-search.d.ts +1 -1
  151. package/dist/hooks/use-search.js +23 -0
  152. package/dist/hooks/use-search.js.map +1 -0
  153. package/dist/hooks/use-signup-link.js +17 -0
  154. package/dist/hooks/use-signup-link.js.map +1 -0
  155. package/dist/hooks/use-term-and-conditions.js +20 -0
  156. package/dist/hooks/use-term-and-conditions.js.map +1 -0
  157. package/dist/hooks/use-upload-tmp-document.js +92 -0
  158. package/dist/hooks/use-upload-tmp-document.js.map +1 -0
  159. package/dist/index.d.ts +2 -2
  160. package/dist/index.js +2 -2065
  161. package/dist/package.json +1 -1
  162. package/dist/plugins/persistance.js +16 -0
  163. package/dist/plugins/persistance.js.map +1 -0
  164. package/dist/registry/add-documents-to-store.d.ts +2 -2
  165. package/dist/registry/add-documents-to-store.js +36 -0
  166. package/dist/registry/add-documents-to-store.js.map +1 -0
  167. package/dist/registry/create-document-name.js +8 -0
  168. package/dist/registry/create-document-name.js.map +1 -0
  169. package/dist/state/state.d.ts +6 -6
  170. package/dist/state/state.js +154 -0
  171. package/dist/state/state.js.map +1 -0
  172. package/dist/views/Catalog/Catalog.vue.js +10 -0
  173. package/dist/views/Catalog/Catalog.vue.js.map +1 -0
  174. package/dist/views/Catalog/Catalog.vue.script.js +50 -0
  175. package/dist/views/Catalog/Catalog.vue.script.js.map +1 -0
  176. package/dist/views/Chat/Chat.vue.js +9 -0
  177. package/dist/views/Chat/Chat.vue.js.map +1 -0
  178. package/dist/views/Chat/Chat.vue.script.js +55 -0
  179. package/dist/views/Chat/Chat.vue.script.js.map +1 -0
  180. package/dist/views/Chat/Messages/AskForAuthentication.vue.d.ts +2 -2
  181. package/dist/views/Chat/Messages/AskForAuthentication.vue.js +9 -0
  182. package/dist/views/Chat/Messages/AskForAuthentication.vue.js.map +1 -0
  183. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js +72 -0
  184. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js.map +1 -0
  185. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.d.ts +2 -2
  186. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.js +9 -0
  187. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.js.map +1 -0
  188. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js +26 -0
  189. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js.map +1 -0
  190. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.d.ts +2 -2
  191. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.js +9 -0
  192. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.js.map +1 -0
  193. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.script.js +39 -0
  194. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.script.js.map +1 -0
  195. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.d.ts +2 -2
  196. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.js +7 -0
  197. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.js.map +1 -0
  198. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js +21 -0
  199. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js.map +1 -0
  200. package/dist/views/Chat/Messages/Text.vue.js +7 -0
  201. package/dist/views/Chat/Messages/Text.vue.js.map +1 -0
  202. package/dist/views/Chat/Messages/Text.vue.script.js +14 -0
  203. package/dist/views/Chat/Messages/Text.vue.script.js.map +1 -0
  204. package/dist/views/Layout.vue.js +9 -0
  205. package/dist/views/Layout.vue.js.map +1 -0
  206. package/dist/views/Layout.vue.script.js +25 -0
  207. package/dist/views/Layout.vue.script.js.map +1 -0
  208. package/dist/views/PromptForm.vue.js +9 -0
  209. package/dist/views/PromptForm.vue.js.map +1 -0
  210. package/dist/views/PromptForm.vue.script.js +202 -0
  211. package/dist/views/PromptForm.vue.script.js.map +1 -0
  212. package/dist/views/Settings/Auth.vue.js +7 -0
  213. package/dist/views/Settings/Auth.vue.js.map +1 -0
  214. package/dist/views/Settings/Auth.vue.script.js +63 -0
  215. package/dist/views/Settings/Auth.vue.script.js.map +1 -0
  216. package/dist/views/Settings/DocSettings.vue.js +9 -0
  217. package/dist/views/Settings/DocSettings.vue.js.map +1 -0
  218. package/dist/views/Settings/DocSettings.vue.script.js +48 -0
  219. package/dist/views/Settings/DocSettings.vue.script.js.map +1 -0
  220. package/dist/views/Settings/Settings.vue.js +10 -0
  221. package/dist/views/Settings/Settings.vue.js.map +1 -0
  222. package/dist/views/Settings/Settings.vue.script.js +59 -0
  223. package/dist/views/Settings/Settings.vue.script.js.map +1 -0
  224. package/dist/views/Start.vue.js +9 -0
  225. package/dist/views/Start.vue.js.map +1 -0
  226. package/dist/views/Start.vue.script.js +41 -0
  227. package/dist/views/Start.vue.script.js.map +1 -0
  228. package/package.json +7 -7
  229. package/dist/entities-NWeuOkBB.js +0 -28
  230. package/dist/entities-NWeuOkBB.js.map +0 -1
  231. package/dist/index.js.map +0 -1
package/dist/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/scalar/scalar.git",
11
11
  "directory": "packages/agent-chat"
12
12
  },
13
- "version": "0.9.12",
13
+ "version": "0.9.13",
14
14
  "engines": {
15
15
  "node": ">=22"
16
16
  },
@@ -0,0 +1,16 @@
1
+ import { authStorage as e } from "../helpers.js";
2
+ import { debounce as t } from "@scalar/helpers/general/debounce";
3
+ //#region src/plugins/persistance.ts
4
+ var n = ({ debounceDelay: n = 500, maxWait: r = 1e4, persistAuth: i = !1 }) => {
5
+ let { execute: a } = t({
6
+ delay: n,
7
+ maxWait: r
8
+ }), o = e(), s = () => typeof i == "function" ? i() : i;
9
+ return { hooks: { onWorkspaceStateChanges(e) {
10
+ s() && e.type === "auth" && a("auth", () => o.setAuth(e.documentName, e.value));
11
+ } } };
12
+ };
13
+ //#endregion
14
+ export { n as persistencePlugin };
15
+
16
+ //# sourceMappingURL=persistance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistance.js","names":[],"sources":["../../src/plugins/persistance.ts"],"sourcesContent":["import { debounce } from '@scalar/helpers/general/debounce'\nimport type { WorkspacePlugin } from '@scalar/workspace-store/workspace-plugin'\n\nimport { authStorage } from '@/helpers'\n\n/**\n * Plugin to persist workspace state changes with debounced writes.\n */\nexport const persistencePlugin = ({\n debounceDelay = 500,\n maxWait = 10000,\n persistAuth = false,\n}: {\n debounceDelay?: number\n /** Maximum time in milliseconds to wait before forcing execution, even with continuous calls. */\n maxWait?: number\n /**\n * Determines whether authentication details should be persisted.\n * Accepts a boolean or a function that returns a boolean.\n * Allows for conditional persistence logic, e.g., based on environment or user settings.\n */\n persistAuth?: boolean | (() => boolean)\n}): WorkspacePlugin => {\n // Debounced execute function for batching similar state changes\n const { execute } = debounce({ delay: debounceDelay, maxWait })\n const authPersistence = authStorage()\n\n const getPersistAuth = () => {\n if (typeof persistAuth === 'function') {\n return persistAuth()\n }\n\n return persistAuth\n }\n\n return {\n hooks: {\n /**\n * Handles all workspace state change events.\n * Each write is debounced by a key to prevent frequent writes for the same entity.\n */\n onWorkspaceStateChanges(event) {\n // Persist auth\n if (getPersistAuth() && event.type === 'auth') {\n execute('auth', () => authPersistence.setAuth(event.documentName, event.value))\n }\n\n // No action for other event types\n return\n },\n },\n }\n}\n"],"mappings":";;;AAQA,IAAa,KAAqB,EAChC,mBAAgB,KAChB,aAAU,KACV,iBAAc,SAWO;CAErB,IAAM,EAAE,eAAY,EAAS;EAAE,OAAO;EAAe;EAAS,CAAC,EACzD,IAAkB,GAAa,EAE/B,UACA,OAAO,KAAgB,aAClB,GAAa,GAGf;AAGT,QAAO,EACL,OAAO,EAKL,wBAAwB,GAAO;AAE7B,EAAI,GAAgB,IAAI,EAAM,SAAS,UACrC,EAAQ,cAAc,EAAgB,QAAQ,EAAM,cAAc,EAAM,MAAM,CAAC;IAMpF,EACF"}
@@ -1,8 +1,8 @@
1
1
  import type { ApiReferenceConfiguration } from '@scalar/types/api-reference';
2
2
  import type { WorkspaceStore } from '@scalar/workspace-store/client';
3
3
  import type { Ref } from 'vue';
4
- import type { Api } from '../api';
5
- import type { ApiMetadata } from '../entities/registry/document';
4
+ import type { Api } from '../api.js';
5
+ import type { ApiMetadata } from '../entities/registry/document.js';
6
6
  export declare const loadDocument: (args_0: {
7
7
  namespace: string;
8
8
  slug: string;
@@ -0,0 +1,36 @@
1
+ import { createError as e } from "../entities/error/helpers.js";
2
+ import { createDocumentName as t } from "./create-document-name.js";
3
+ import { restoreAuthSecretsFromStorage as n } from "../helpers.js";
4
+ import { n as r } from "neverpanic";
5
+ import { bundle as i } from "@scalar/json-magic/bundle";
6
+ import { fetchUrls as a } from "@scalar/json-magic/bundle/plugins/browser";
7
+ //#region src/registry/add-documents-to-store.ts
8
+ var o = r.safeFn(async ({ namespace: e, slug: r, workspaceStore: o, registryDocuments: s, registryUrl: c, config: l, api: u, removable: d }) => {
9
+ let f = await u.getDocument({
10
+ namespace: e,
11
+ slug: r
12
+ });
13
+ if (!f.success) return f;
14
+ s.value.push({
15
+ ...f.data,
16
+ removable: d
17
+ });
18
+ let p = await i(new URL(`/@${e}/apis/${r}/latest`, c).toString(), {
19
+ plugins: [a()],
20
+ treeShake: !1
21
+ }), m = t(e, r);
22
+ return await o.addDocument({
23
+ name: m,
24
+ document: p
25
+ }, l), o.update("x-scalar-active-document", m), n({
26
+ documentName: m,
27
+ workspaceStore: o
28
+ }), {
29
+ success: !0,
30
+ data: f.data
31
+ };
32
+ }, (t) => e("UNABLE_TO_LOAD_DOCUMENT", t));
33
+ //#endregion
34
+ export { o as loadDocument };
35
+
36
+ //# sourceMappingURL=add-documents-to-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-documents-to-store.js","names":[],"sources":["../../src/registry/add-documents-to-store.ts"],"sourcesContent":["import { bundle } from '@scalar/json-magic/bundle'\nimport { fetchUrls } from '@scalar/json-magic/bundle/plugins/browser'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { ApiReferenceConfiguration } from '@scalar/types/api-reference'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport { n } from 'neverpanic'\nimport type { Ref } from 'vue'\n\nimport type { Api } from '@/api'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport { restoreAuthSecretsFromStorage } from '@/helpers'\nimport { createDocumentName } from '@/registry/create-document-name'\n\nexport const loadDocument = n.safeFn(\n async ({\n namespace,\n slug,\n workspaceStore,\n registryDocuments,\n registryUrl,\n config,\n api,\n removable,\n }: {\n namespace: string\n slug: string\n workspaceStore: WorkspaceStore\n registryDocuments: Ref<ApiMetadata[]>\n registryUrl: string\n config: Partial<ApiReferenceConfiguration>\n api: Api\n removable?: boolean\n }) => {\n const getDocumentResult = await api.getDocument({\n namespace,\n slug,\n })\n\n if (!getDocumentResult.success) {\n return getDocumentResult\n }\n\n registryDocuments.value.push({ ...getDocumentResult.data, removable })\n\n const url = new URL(`/@${namespace}/apis/${slug}/latest`, registryUrl)\n\n const document: OpenAPIV3_1.Document = await bundle(url.toString(), {\n plugins: [fetchUrls()],\n treeShake: false,\n })\n\n const documentName = createDocumentName(namespace, slug)\n\n await workspaceStore.addDocument(\n {\n name: documentName,\n document,\n },\n config,\n )\n\n workspaceStore.update('x-scalar-active-document', documentName)\n\n restoreAuthSecretsFromStorage({ documentName, workspaceStore })\n\n return {\n success: true,\n data: getDocumentResult.data,\n }\n },\n (originalError) => createError('UNABLE_TO_LOAD_DOCUMENT', originalError),\n)\n"],"mappings":";;;;;;;AAcA,IAAa,IAAe,EAAE,OAC5B,OAAO,EACL,cACA,SACA,mBACA,sBACA,gBACA,WACA,QACA,mBAUI;CACJ,IAAM,IAAoB,MAAM,EAAI,YAAY;EAC9C;EACA;EACD,CAAC;AAEF,KAAI,CAAC,EAAkB,QACrB,QAAO;AAGT,GAAkB,MAAM,KAAK;EAAE,GAAG,EAAkB;EAAM;EAAW,CAAC;CAItE,IAAM,IAAiC,MAAM,EAFjC,IAAI,IAAI,KAAK,EAAU,QAAQ,EAAK,UAAU,EAAY,CAEd,UAAU,EAAE;EAClE,SAAS,CAAC,GAAW,CAAC;EACtB,WAAW;EACZ,CAAC,EAEI,IAAe,EAAmB,GAAW,EAAK;AAcxD,QAZA,MAAM,EAAe,YACnB;EACE,MAAM;EACN;EACD,EACD,EACD,EAED,EAAe,OAAO,4BAA4B,EAAa,EAE/D,EAA8B;EAAE;EAAc;EAAgB,CAAC,EAExD;EACL,SAAS;EACT,MAAM,EAAkB;EACzB;IAEF,MAAkB,EAAY,2BAA2B,EAAc,CACzE"}
@@ -0,0 +1,8 @@
1
+ //#region src/registry/create-document-name.ts
2
+ function e(e, t) {
3
+ return `${e}/${t}`;
4
+ }
5
+ //#endregion
6
+ export { e as createDocumentName };
7
+
8
+ //# sourceMappingURL=create-document-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-document-name.js","names":[],"sources":["../../src/registry/create-document-name.ts"],"sourcesContent":["export function createDocumentName(namespace: string, slug: string) {\n return `${namespace}/${slug}`\n}\n"],"mappings":";AAAA,SAAgB,EAAmB,GAAmB,GAAc;AAClE,QAAO,GAAG,EAAU,GAAG"}
@@ -5,12 +5,12 @@ import { type WorkspaceStore } from '@scalar/workspace-store/client';
5
5
  import type { WorkspaceEventBus } from '@scalar/workspace-store/events';
6
6
  import { type UIDataTypes, type UIMessage } from 'ai';
7
7
  import { type ComputedRef, type InjectionKey, type Ref } from 'vue';
8
- import { type Api } from '../api';
9
- import type { ApiMetadata } from '../entities/registry/document';
10
- import type { ASK_FOR_AUTHENTICATION_TOOL_NAME, AskForAuthenticationInput } from '../entities/tools/ask-for-authentication';
11
- import { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME, type ExecuteClientSideRequestToolInput, type ExecuteClientSideRequestToolOutput } from '../entities/tools/execute-request';
12
- import type { GET_MINI_OPENAPI_SPEC_TOOL_NAME, GetMiniOpenAPIDocToolInput, GetMiniOpenAPIDocToolOutput } from '../entities/tools/get-mini-openapi-spec';
13
- import type { GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME, GetOpenAPISpecsSummaryToolOutput } from '../entities/tools/get-openapi-spec-summary';
8
+ import { type Api } from '../api.js';
9
+ import type { ApiMetadata } from '../entities/registry/document.js';
10
+ import type { ASK_FOR_AUTHENTICATION_TOOL_NAME, AskForAuthenticationInput } from '../entities/tools/ask-for-authentication.js';
11
+ import { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME, type ExecuteClientSideRequestToolInput, type ExecuteClientSideRequestToolOutput } from '../entities/tools/execute-request.js';
12
+ import type { GET_MINI_OPENAPI_SPEC_TOOL_NAME, GetMiniOpenAPIDocToolInput, GetMiniOpenAPIDocToolOutput } from '../entities/tools/get-mini-openapi-spec.js';
13
+ import type { GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME, GetOpenAPISpecsSummaryToolOutput } from '../entities/tools/get-openapi-spec-summary.js';
14
14
  import type { ChatMode } from '../types';
15
15
  export type RegistryDocument = {
16
16
  namespace: string;
@@ -0,0 +1,154 @@
1
+ import { createError as e } from "../entities/error/helpers.js";
2
+ import { createApi as t, createAuthorizationHeaders as n } from "../api.js";
3
+ import "../entities/tools/execute-request.js";
4
+ import { createDocumentName as r } from "../registry/create-document-name.js";
5
+ import { executeRequestTool as i } from "../client-tools/execute-request.js";
6
+ import { URLS as a } from "../consts/urls.js";
7
+ import { createDocumentSettings as o } from "../helpers.js";
8
+ import { useTermsAndConditions as s } from "../hooks/use-term-and-conditions.js";
9
+ import { removeTmpDocFromLocalStorage as c } from "../hooks/use-upload-tmp-document.js";
10
+ import { persistencePlugin as l } from "../plugins/persistance.js";
11
+ import { loadDocument as u } from "../registry/add-documents-to-store.js";
12
+ import { computed as d, inject as f, reactive as p, ref as m, watch as h } from "vue";
13
+ import { useToasts as g } from "@scalar/use-toasts";
14
+ import { Chat as _ } from "@ai-sdk/vue";
15
+ import { useModal as v } from "@scalar/components";
16
+ import { redirectToProxy as y } from "@scalar/helpers/url/redirect-to-proxy";
17
+ import { apiReferenceConfigurationSchema as b } from "@scalar/types/api-reference";
18
+ import { createWorkspaceStore as x } from "@scalar/workspace-store/client";
19
+ import { createWorkspaceEventBus as S } from "@scalar/workspace-store/events";
20
+ import { DefaultChatTransport as C, lastAssistantMessageIsCompleteWithToolCalls as w } from "ai";
21
+ import { n as T } from "neverpanic";
22
+ //#region src/state/state.ts
23
+ var E = Symbol("STATE_SYMBOL"), { toast: D } = g();
24
+ function O({ registryDocuments: e, workspaceStore: t, baseUrl: r, proxyUrl: a, getAccessToken: s, getAgentKey: c }) {
25
+ let l = new _({
26
+ sendAutomaticallyWhen: w,
27
+ transport: new C({
28
+ api: y(a.value, `${r}/vector/openapi/chat`),
29
+ headers: () => n({
30
+ getAccessToken: s,
31
+ getAgentKey: c
32
+ }),
33
+ body: () => ({
34
+ registryDocuments: e.value,
35
+ documentSettings: o(t)
36
+ })
37
+ }),
38
+ async onToolCall({ toolCall: e }) {
39
+ e.dynamic || e.toolName === "execute-request" && e.input.method.toLowerCase() === "get" && await i({
40
+ documentSettings: o(t),
41
+ input: e.input,
42
+ toolCallId: e.toolCallId,
43
+ chat: l,
44
+ proxyUrl: a.value
45
+ });
46
+ }
47
+ });
48
+ return l;
49
+ }
50
+ function k({ initialRegistryDocuments: n, registryUrl: i, dashboardUrl: o, baseUrl: f, mode: g, isLoggedIn: _, getAccessToken: C, getAgentKey: w, getActiveDocumentJson: E, prefilledMessageRef: k, hideAddApi: A }) {
51
+ let j = m(k?.value ?? ""), M = m([]), N = p({}), P = m([]), F = m(a.DEFAULT_PROXY_URL), I = d(() => F.value?.trim() || a.DEFAULT_PROXY_URL), L = m(), R = s(), z = S(), B = x({ plugins: [l({ persistAuth: !0 })] }), V = d(() => b.parse({
52
+ proxyUrl: I.value,
53
+ persistAuth: !0
54
+ })), H = O({
55
+ registryDocuments: M,
56
+ workspaceStore: B,
57
+ baseUrl: f,
58
+ proxyUrl: I,
59
+ getAccessToken: C,
60
+ getAgentKey: w
61
+ }), U = t({
62
+ baseUrl: f,
63
+ proxyUrl: I,
64
+ getAccessToken: C,
65
+ getAgentKey: w
66
+ }), W = d(() => H.status === "submitted" || H.status === "streaming" && !H.lastMessage?.parts.some((e) => e.type === "text"));
67
+ h(() => H.status, () => {
68
+ H.status === "streaming" && (j.value = "");
69
+ }), k && h(k, async (e) => {
70
+ e && (j.value = e, R.accepted.value && await H.sendMessage({ text: j.value }));
71
+ });
72
+ let G = v();
73
+ async function K({ namespace: e, slug: t, removable: n = !0, tmp: r = !1 }) {
74
+ if (M.value.find((n) => n.namespace === e && n.slug === t)) return;
75
+ let a = `@${e}/${t}`;
76
+ N[a] = !0;
77
+ let o = await u({
78
+ namespace: e,
79
+ slug: t,
80
+ workspaceStore: B,
81
+ registryUrl: i,
82
+ registryDocuments: M,
83
+ config: V.value,
84
+ api: U,
85
+ removable: n
86
+ });
87
+ if (N[a] = !1, !o.success) throw r ? (c(), o.error) : (console.warn("[AGENT]: Unable to load document", o.error), D(`Unable to load the document @${e}/${t}`, "warn"), o.error);
88
+ }
89
+ async function q({ namespace: t, slug: n, removable: r = !0 }) {
90
+ if (M.value.find((e) => e.namespace === t && e.slug === n)) return;
91
+ let a = `@${t}/${n}`;
92
+ N[a] = !0;
93
+ let o = await T.fromUnsafe(() => fetch(y(I.value, `${f}/vector/registry/embeddings/${t}/${n}`), { method: "GET" }), (t) => e("FAILED_TO_GET_EMBEDDING_STATUS", t));
94
+ if (o.success && o.data.ok) {
95
+ let e = await u({
96
+ namespace: t,
97
+ slug: n,
98
+ workspaceStore: B,
99
+ registryUrl: i,
100
+ registryDocuments: M,
101
+ config: V.value,
102
+ api: U,
103
+ removable: r
104
+ });
105
+ e.success || (console.warn("[AGENT]: Unable to load document", e.error), D(`Unable to load the document @${t}/${n}`, "warn"));
106
+ } else console.warn("[AGENT]: Document could not be embedded"), D(`Unable to embed the document @${t}/${n}`, "warn");
107
+ N[a] = !1;
108
+ }
109
+ function J({ namespace: e, slug: t }) {
110
+ M.value = M.value.filter((n) => !(n.namespace === e && n.slug === t)), B.deleteDocument(r(e, t));
111
+ }
112
+ return n.forEach(({ namespace: e, slug: t }) => K({
113
+ namespace: e,
114
+ slug: t,
115
+ removable: !1
116
+ })), {
117
+ prompt: j,
118
+ chat: H,
119
+ workspaceStore: B,
120
+ eventBus: z,
121
+ loading: W,
122
+ settingsModal: G,
123
+ config: V,
124
+ registryUrl: i,
125
+ dashboardUrl: o,
126
+ baseUrl: f,
127
+ registryDocuments: M,
128
+ pendingDocuments: N,
129
+ proxyUrl: I,
130
+ proxyUrlRaw: F,
131
+ mode: g,
132
+ terms: R,
133
+ isLoggedIn: _,
134
+ addDocument: K,
135
+ addDocumentAsync: q,
136
+ removeDocument: J,
137
+ getAccessToken: C,
138
+ getAgentKey: w,
139
+ api: U,
140
+ uploadedTmpDocumentUrl: L,
141
+ curatedDocuments: P,
142
+ getActiveDocumentJson: E,
143
+ hideAddApi: A
144
+ };
145
+ }
146
+ function A() {
147
+ let e = f(E);
148
+ if (!e) throw Error("No state provided.");
149
+ return e;
150
+ }
151
+ //#endregion
152
+ export { E as STATE_SYMBOL, k as createState, A as useState };
153
+
154
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","names":[],"sources":["../../src/state/state.ts"],"sourcesContent":["import { Chat } from '@ai-sdk/vue'\nimport { type ModalState, useModal } from '@scalar/components'\nimport { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport { type ApiReferenceConfigurationRaw, apiReferenceConfigurationSchema } from '@scalar/types/api-reference'\nimport { useToasts } from '@scalar/use-toasts'\nimport { type WorkspaceStore, createWorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { createWorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { DefaultChatTransport, type UIDataTypes, type UIMessage, lastAssistantMessageIsCompleteWithToolCalls } from 'ai'\nimport { n } from 'neverpanic'\nimport { type ComputedRef, type InjectionKey, type Ref, computed, inject, reactive, ref, watch } from 'vue'\n\nimport { type Api, createApi, createAuthorizationHeaders } from '@/api'\nimport { executeRequestTool } from '@/client-tools/execute-request'\nimport { URLS } from '@/consts/urls'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport type {\n ASK_FOR_AUTHENTICATION_TOOL_NAME,\n AskForAuthenticationInput,\n} from '@/entities/tools/ask-for-authentication'\nimport {\n EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n type ExecuteClientSideRequestToolInput,\n type ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\nimport type {\n GET_MINI_OPENAPI_SPEC_TOOL_NAME,\n GetMiniOpenAPIDocToolInput,\n GetMiniOpenAPIDocToolOutput,\n} from '@/entities/tools/get-mini-openapi-spec'\nimport type {\n GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME,\n GetOpenAPISpecsSummaryToolOutput,\n} from '@/entities/tools/get-openapi-spec-summary'\nimport { createDocumentSettings } from '@/helpers'\nimport { useTermsAndConditions } from '@/hooks/use-term-and-conditions'\nimport { removeTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { persistencePlugin } from '@/plugins/persistance'\nimport { loadDocument } from '@/registry/add-documents-to-store'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport type { ChatMode } from '@/types'\n\nexport type RegistryDocument = {\n namespace: string\n slug: string\n}\n\nexport type Tools = {\n [GET_MINI_OPENAPI_SPEC_TOOL_NAME]: {\n input: GetMiniOpenAPIDocToolInput\n output: GetMiniOpenAPIDocToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME]: {\n input: object\n output: GetOpenAPISpecsSummaryToolOutput\n }\n [ASK_FOR_AUTHENTICATION_TOOL_NAME]: {\n input: AskForAuthenticationInput\n output: unknown\n }\n}\n\nexport const STATE_SYMBOL: InjectionKey<State> = Symbol('STATE_SYMBOL')\n\nconst { toast } = useToasts()\n\ntype State = {\n prompt: Ref<string>\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n workspaceStore: WorkspaceStore\n loading: ComputedRef<boolean>\n settingsModal: ModalState\n eventBus: WorkspaceEventBus\n proxyUrl: ComputedRef<string>\n proxyUrlRaw: Ref<string | undefined>\n config: ComputedRef<ApiReferenceConfigurationRaw>\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n isLoggedIn?: Ref<boolean>\n registryDocuments: Ref<ApiMetadata[]>\n pendingDocuments: Record<string, boolean>\n mode: ChatMode\n terms: { accepted: Ref<boolean>; accept: () => void }\n addDocument: (document: { namespace: string; slug: string; removable?: boolean; tmp?: boolean }) => Promise<void>\n addDocumentAsync: (document: { namespace: string; slug: string; removable?: boolean }) => Promise<void>\n removeDocument: (document: { namespace: string; slug: string }) => void\n getAccessToken?: () => string\n getAgentKey?: () => string\n api: Api\n uploadedTmpDocumentUrl: Ref<string | undefined>\n curatedDocuments: Ref<ApiMetadata[]>\n getActiveDocumentJson?: () => string\n hideAddApi?: boolean\n}\n\nfunction createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n}: {\n registryDocuments: Ref<ApiMetadata[]>\n workspaceStore: WorkspaceStore\n baseUrl: string\n proxyUrl: ComputedRef<string>\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const chat = new Chat<UIMessage<unknown, UIDataTypes, Tools>>({\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n transport: new DefaultChatTransport({\n api: redirectToProxy(proxyUrl.value, `${baseUrl}/vector/openapi/chat`),\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\n documentSettings: createDocumentSettings(workspaceStore),\n }),\n }),\n async onToolCall({ toolCall }): Promise<any> {\n if (toolCall.dynamic) {\n return\n }\n\n if (\n toolCall.toolName === EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME &&\n toolCall.input.method.toLowerCase() === 'get'\n ) {\n await executeRequestTool({\n documentSettings: createDocumentSettings(workspaceStore),\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n chat,\n proxyUrl: proxyUrl.value,\n })\n }\n },\n })\n\n return chat\n}\n\nexport function createState({\n initialRegistryDocuments,\n registryUrl,\n dashboardUrl,\n baseUrl,\n mode,\n isLoggedIn,\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n prefilledMessageRef,\n hideAddApi,\n}: {\n initialRegistryDocuments: { namespace: string; slug: string }[]\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n mode: ChatMode\n isLoggedIn?: Ref<boolean>\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n prefilledMessageRef?: Ref<string>\n hideAddApi?: boolean\n}): State {\n const prompt = ref<State['prompt']['value']>(prefilledMessageRef?.value ?? '')\n const registryDocuments = ref<ApiMetadata[]>([])\n const pendingDocuments = reactive<Record<string, boolean>>({})\n const curatedDocuments = ref<ApiMetadata[]>([])\n const proxyUrlRaw = ref<State['proxyUrlRaw']['value']>(URLS.DEFAULT_PROXY_URL)\n const proxyUrl = computed(() => proxyUrlRaw.value?.trim() || URLS.DEFAULT_PROXY_URL)\n const uploadedTmpDocumentUrl = ref<string>()\n const terms = useTermsAndConditions()\n\n const eventBus = createWorkspaceEventBus()\n const workspaceStore = createWorkspaceStore({\n plugins: [\n persistencePlugin({\n persistAuth: true,\n }),\n ],\n })\n\n const config = computed(() =>\n apiReferenceConfigurationSchema.parse({\n proxyUrl: proxyUrl.value,\n persistAuth: true,\n }),\n )\n\n const chat = createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const api = createApi({\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const loading = computed(\n () =>\n chat.status === 'submitted' ||\n (chat.status === 'streaming' && !chat.lastMessage?.parts.some((part) => part.type === 'text')),\n )\n\n watch(\n () => chat.status,\n () => {\n if (chat.status === 'streaming') {\n prompt.value = ''\n }\n },\n )\n\n if (prefilledMessageRef) {\n watch(prefilledMessageRef, async (val) => {\n if (val) {\n prompt.value = val\n if (terms.accepted.value) {\n await chat.sendMessage({ text: prompt.value })\n }\n }\n })\n }\n\n const settingsModal = useModal()\n\n async function addDocument({\n namespace,\n slug,\n removable = true,\n tmp = false,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n tmp?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n api,\n removable,\n })\n\n pendingDocuments[identifier] = false\n\n if (!loadDocumentResult.success) {\n /**\n * If we are unable to load a document, we just remove it\n * from tmp local storage, do not warn the user.\n */\n if (tmp) {\n removeTmpDocFromLocalStorage()\n throw loadDocumentResult.error\n }\n\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n throw loadDocumentResult.error\n }\n }\n\n /**\n * Waits for document to be available in embeddings\n * and adds to the list\n */\n async function addDocumentAsync({\n namespace,\n slug,\n removable = true,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const embeddingStatusResponse = await n.fromUnsafe(\n () =>\n fetch(redirectToProxy(proxyUrl.value, `${baseUrl}/vector/registry/embeddings/${namespace}/${slug}`), {\n method: 'GET',\n }),\n (originalError) => createError('FAILED_TO_GET_EMBEDDING_STATUS', originalError),\n )\n\n if (embeddingStatusResponse.success && embeddingStatusResponse.data.ok) {\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n api,\n removable,\n })\n\n if (!loadDocumentResult.success) {\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n }\n } else {\n console.warn('[AGENT]: Document could not be embedded')\n toast(`Unable to embed the document @${namespace}/${slug}`, 'warn')\n }\n\n pendingDocuments[identifier] = false\n }\n\n function removeDocument({ namespace, slug }: { namespace: string; slug: string }) {\n registryDocuments.value = registryDocuments.value.filter(\n (doc) => !(doc.namespace === namespace && doc.slug === slug),\n )\n\n workspaceStore.deleteDocument(createDocumentName(namespace, slug))\n }\n\n initialRegistryDocuments.forEach(({ namespace, slug }) => addDocument({ namespace, slug, removable: false }))\n\n return {\n prompt,\n chat,\n workspaceStore,\n eventBus,\n loading,\n settingsModal,\n config,\n registryUrl,\n dashboardUrl,\n baseUrl,\n registryDocuments,\n pendingDocuments,\n proxyUrl,\n proxyUrlRaw,\n mode,\n terms,\n isLoggedIn,\n addDocument,\n addDocumentAsync,\n removeDocument,\n getAccessToken,\n getAgentKey,\n api,\n uploadedTmpDocumentUrl,\n curatedDocuments,\n getActiveDocumentJson,\n hideAddApi,\n }\n}\n\nexport function useState() {\n const state = inject(STATE_SYMBOL)\n\n if (!state) {\n throw new Error('No state provided.')\n }\n\n return state\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmEA,IAAa,IAAoC,OAAO,eAAe,EAEjE,EAAE,aAAU,GAAW;AAgC7B,SAAS,EAAW,EAClB,sBACA,mBACA,YACA,aACA,mBACA,kBAQC;CACD,IAAM,IAAO,IAAI,EAA6C;EAC5D,uBAAuB;EACvB,WAAW,IAAI,EAAqB;GAClC,KAAK,EAAgB,EAAS,OAAO,GAAG,EAAQ,sBAAsB;GACtE,eAAe,EAA2B;IAAE;IAAgB;IAAa,CAAC;GAC1E,aAAa;IACX,mBAAmB,EAAkB;IACrC,kBAAkB,EAAuB,EAAe;IACzD;GACF,CAAC;EACF,MAAM,WAAW,EAAE,eAA0B;AACvC,KAAS,WAKX,EAAS,aAAA,qBACT,EAAS,MAAM,OAAO,aAAa,KAAK,SAExC,MAAM,EAAmB;IACvB,kBAAkB,EAAuB,EAAe;IACxD,OAAO,EAAS;IAChB,YAAY,EAAS;IACrB;IACA,UAAU,EAAS;IACpB,CAAC;;EAGP,CAAC;AAEF,QAAO;;AAGT,SAAgB,EAAY,EAC1B,6BACA,gBACA,iBACA,YACA,SACA,eACA,mBACA,gBACA,0BACA,wBACA,iBAaQ;CACR,IAAM,IAAS,EAA8B,GAAqB,SAAS,GAAG,EACxE,IAAoB,EAAmB,EAAE,CAAC,EAC1C,IAAmB,EAAkC,EAAE,CAAC,EACxD,IAAmB,EAAmB,EAAE,CAAC,EACzC,IAAc,EAAmC,EAAK,kBAAkB,EACxE,IAAW,QAAe,EAAY,OAAO,MAAM,IAAI,EAAK,kBAAkB,EAC9E,IAAyB,GAAa,EACtC,IAAQ,GAAuB,EAE/B,IAAW,GAAyB,EACpC,IAAiB,EAAqB,EAC1C,SAAS,CACP,EAAkB,EAChB,aAAa,IACd,CAAC,CACH,EACF,CAAC,EAEI,IAAS,QACb,EAAgC,MAAM;EACpC,UAAU,EAAS;EACnB,aAAa;EACd,CAAC,CACH,EAEK,IAAO,EAAW;EACtB;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAEI,IAAM,EAAU;EACpB;EACA;EACA;EACA;EACD,CAAC,EAEI,IAAU,QAEZ,EAAK,WAAW,eACf,EAAK,WAAW,eAAe,CAAC,EAAK,aAAa,MAAM,MAAM,MAAS,EAAK,SAAS,OAAO,CAChG;AAWD,CATA,QACQ,EAAK,cACL;AACJ,EAAI,EAAK,WAAW,gBAClB,EAAO,QAAQ;GAGpB,EAEG,KACF,EAAM,GAAqB,OAAO,MAAQ;AACxC,EAAI,MACF,EAAO,QAAQ,GACX,EAAM,SAAS,SACjB,MAAM,EAAK,YAAY,EAAE,MAAM,EAAO,OAAO,CAAC;GAGlD;CAGJ,IAAM,IAAgB,GAAU;CAEhC,eAAe,EAAY,EACzB,cACA,SACA,eAAY,IACZ,SAAM,MAML;AAGD,MAFoB,EAAkB,MAAM,MAAM,MAAQ,EAAI,cAAc,KAAa,EAAI,SAAS,EAAK,CAGzG;EAGF,IAAM,IAAa,IAAI,EAAU,GAAG;AAEpC,IAAiB,KAAc;EAE/B,IAAM,IAAqB,MAAM,EAAa;GAC5C;GACA;GACA;GACA;GACA;GACA,QAAQ,EAAO;GACf;GACA;GACD,CAAC;AAIF,MAFA,EAAiB,KAAc,IAE3B,CAAC,EAAmB,QAYtB,OAPI,KACF,GAA8B,EACxB,EAAmB,UAG3B,QAAQ,KAAK,oCAAoC,EAAmB,MAAM,EAC1E,EAAM,gCAAgC,EAAU,GAAG,KAAQ,OAAO,EAC5D,EAAmB;;CAQ7B,eAAe,EAAiB,EAC9B,cACA,SACA,eAAY,MAKX;AAGD,MAFoB,EAAkB,MAAM,MAAM,MAAQ,EAAI,cAAc,KAAa,EAAI,SAAS,EAAK,CAGzG;EAGF,IAAM,IAAa,IAAI,EAAU,GAAG;AAEpC,IAAiB,KAAc;EAE/B,IAAM,IAA0B,MAAM,EAAE,iBAEpC,MAAM,EAAgB,EAAS,OAAO,GAAG,EAAQ,8BAA8B,EAAU,GAAG,IAAO,EAAE,EACnG,QAAQ,OACT,CAAC,GACH,MAAkB,EAAY,kCAAkC,EAAc,CAChF;AAED,MAAI,EAAwB,WAAW,EAAwB,KAAK,IAAI;GACtE,IAAM,IAAqB,MAAM,EAAa;IAC5C;IACA;IACA;IACA;IACA;IACA,QAAQ,EAAO;IACf;IACA;IACD,CAAC;AAEF,GAAK,EAAmB,YACtB,QAAQ,KAAK,oCAAoC,EAAmB,MAAM,EAC1E,EAAM,gCAAgC,EAAU,GAAG,KAAQ,OAAO;QAIpE,CADA,QAAQ,KAAK,0CAA0C,EACvD,EAAM,iCAAiC,EAAU,GAAG,KAAQ,OAAO;AAGrE,IAAiB,KAAc;;CAGjC,SAAS,EAAe,EAAE,cAAW,WAA6C;AAKhF,EAJA,EAAkB,QAAQ,EAAkB,MAAM,QAC/C,MAAQ,EAAE,EAAI,cAAc,KAAa,EAAI,SAAS,GACxD,EAED,EAAe,eAAe,EAAmB,GAAW,EAAK,CAAC;;AAKpE,QAFA,EAAyB,SAAS,EAAE,cAAW,cAAW,EAAY;EAAE;EAAW;EAAM,WAAW;EAAO,CAAC,CAAC,EAEtG;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,IAAW;CACzB,IAAM,IAAQ,EAAO,EAAa;AAElC,KAAI,CAAC,EACH,OAAU,MAAM,qBAAqB;AAGvC,QAAO"}
@@ -0,0 +1,10 @@
1
+ import e from "../../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./Catalog.vue.script.js";
3
+ /* empty css */
4
+ /* empty css */
5
+ //#region src/views/Catalog/Catalog.vue
6
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-bc24f891"]]);
7
+ //#endregion
8
+ export { n as default };
9
+
10
+ //# sourceMappingURL=Catalog.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Catalog.vue.js","names":[],"sources":["../../../src/views/Catalog/Catalog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarIcon,\n ScalarModal,\n ScalarSearchInput,\n type ModalState,\n} from '@scalar/components'\nimport { computed } from 'vue'\n\nimport { useSearch } from '@/hooks/use-search'\nimport { useState } from '@/state/state'\n\ndefineProps<{\n modal: ModalState\n}>()\n\nconst search = useSearch()\n\nconst state = useState()\n\nconst searchOptions = computed(() =>\n search.results.value\n .filter((r) => {\n return !state.registryDocuments.value.some(\n (d) => d.namespace === r.namespace && d.slug === r.slug,\n )\n })\n .map((result) => ({\n ...result,\n label: result.title,\n id: result.id,\n })),\n)\n</script>\n\n<template>\n <ScalarModal\n class=\"catalogModal\"\n :state=\"modal\">\n <ScalarSearchInput\n autofocus\n class=\"searchInput\"\n :modelValue=\"search.query.value\"\n @update:modelValue=\"(v) => (search.query.value = v ?? '')\" />\n <template v-if=\"searchOptions.length\">\n <div class=\"catalog custom-scroll\">\n <button\n v-for=\"option in searchOptions\"\n :key=\"option.id\"\n class=\"item\"\n type=\"button\"\n @click=\"\n () => {\n state.addDocument(option)\n modal.hide()\n }\n \">\n <div class=\"left\">\n <img\n v-if=\"option.logoUrl\"\n class=\"logo\"\n :src=\"option.logoUrl\" />\n <ScalarIcon\n v-else\n class=\"logo\"\n logo=\"Openapi\" />\n </div>\n\n <div class=\"right\">\n <div class=\"item-top\">\n <span>{{ option.title }}</span>\n\n <span class=\"version\">v{{ option.currentVersion }}</span>\n </div>\n\n <span class=\"description\">\n @{{ option.namespace }}/{{ option.slug }}\n </span>\n </div>\n </button>\n </div>\n </template>\n </ScalarModal>\n</template>\n\n<style>\n.catalogModal .scalar-modal-body {\n display: flex;\n flex-direction: column;\n}\n</style>\n\n<style scoped>\n.searchInput {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-lg);\n margin-bottom: 10px;\n}\n.catalog {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n overflow-y: scroll;\n font-size: var(--scalar-font-size-3);\n}\n.item {\n display: flex;\n padding: 15px;\n gap: 10px;\n align-items: center;\n background-color: var(--scalar-background-2);\n border-radius: var(--scalar-radius-lg);\n transition: background-color 160ms ease;\n}\n.item:hover {\n background-color: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 40%\n ) !important;\n}\n.left {\n align-items: center;\n}\n.right {\n display: flex;\n flex-direction: column;\n}\n.logo {\n width: 25px;\n}\n.item-top {\n display: flex;\n gap: 10px;\n}\n.version {\n background: var(--scalar-background-3);\n padding: 2px 5px;\n border-radius: var(--scalar-radius);\n font-size: var(--scalar-font-size-5);\n color: var(--scalar-color-3);\n}\n.description {\n color: var(--scalar-color-2);\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { useState as e } from "../../state/state.js";
2
+ import { useSearch as t } from "../../hooks/use-search.js";
3
+ import { Fragment as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createVNode as c, defineComponent as l, openBlock as u, renderList as d, toDisplayString as f, unref as p, withCtx as m } from "vue";
4
+ import { ScalarIcon as h, ScalarModal as g, ScalarSearchInput as _ } from "@scalar/components";
5
+ //#region src/views/Catalog/Catalog.vue?vue&type=script&setup=true&lang.ts
6
+ var v = {
7
+ key: 0,
8
+ class: "catalog custom-scroll"
9
+ }, y = ["onClick"], b = { class: "left" }, x = ["src"], S = { class: "right" }, C = { class: "item-top" }, w = { class: "version" }, T = { class: "description" }, E = /* @__PURE__ */ l({
10
+ __name: "Catalog",
11
+ props: { modal: {} },
12
+ setup(l) {
13
+ let E = t(), D = e(), O = r(() => E.results.value.filter((e) => !D.registryDocuments.value.some((t) => t.namespace === e.namespace && t.slug === e.slug)).map((e) => ({
14
+ ...e,
15
+ label: e.title,
16
+ id: e.id
17
+ })));
18
+ return (e, t) => (u(), i(p(g), {
19
+ class: "catalogModal",
20
+ state: l.modal
21
+ }, {
22
+ default: m(() => [c(p(_), {
23
+ autofocus: "",
24
+ class: "searchInput",
25
+ modelValue: p(E).query.value,
26
+ "onUpdate:modelValue": t[0] ||= (e) => p(E).query.value = e ?? ""
27
+ }, null, 8, ["modelValue"]), O.value.length ? (u(), o("div", v, [(u(!0), o(n, null, d(O.value, (e) => (u(), o("button", {
28
+ key: e.id,
29
+ class: "item",
30
+ type: "button",
31
+ onClick: () => {
32
+ p(D).addDocument(e), l.modal.hide();
33
+ }
34
+ }, [s("div", b, [e.logoUrl ? (u(), o("img", {
35
+ key: 0,
36
+ class: "logo",
37
+ src: e.logoUrl
38
+ }, null, 8, x)) : (u(), i(p(h), {
39
+ key: 1,
40
+ class: "logo",
41
+ logo: "Openapi"
42
+ }))]), s("div", S, [s("div", C, [s("span", null, f(e.title), 1), s("span", w, "v" + f(e.currentVersion), 1)]), s("span", T, " @" + f(e.namespace) + "/" + f(e.slug), 1)])], 8, y))), 128))])) : a("", !0)]),
43
+ _: 1
44
+ }, 8, ["state"]));
45
+ }
46
+ });
47
+ //#endregion
48
+ export { E as default };
49
+
50
+ //# sourceMappingURL=Catalog.vue.script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Catalog.vue.script.js","names":[],"sources":["../../../src/views/Catalog/Catalog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarIcon,\n ScalarModal,\n ScalarSearchInput,\n type ModalState,\n} from '@scalar/components'\nimport { computed } from 'vue'\n\nimport { useSearch } from '@/hooks/use-search'\nimport { useState } from '@/state/state'\n\ndefineProps<{\n modal: ModalState\n}>()\n\nconst search = useSearch()\n\nconst state = useState()\n\nconst searchOptions = computed(() =>\n search.results.value\n .filter((r) => {\n return !state.registryDocuments.value.some(\n (d) => d.namespace === r.namespace && d.slug === r.slug,\n )\n })\n .map((result) => ({\n ...result,\n label: result.title,\n id: result.id,\n })),\n)\n</script>\n\n<template>\n <ScalarModal\n class=\"catalogModal\"\n :state=\"modal\">\n <ScalarSearchInput\n autofocus\n class=\"searchInput\"\n :modelValue=\"search.query.value\"\n @update:modelValue=\"(v) => (search.query.value = v ?? '')\" />\n <template v-if=\"searchOptions.length\">\n <div class=\"catalog custom-scroll\">\n <button\n v-for=\"option in searchOptions\"\n :key=\"option.id\"\n class=\"item\"\n type=\"button\"\n @click=\"\n () => {\n state.addDocument(option)\n modal.hide()\n }\n \">\n <div class=\"left\">\n <img\n v-if=\"option.logoUrl\"\n class=\"logo\"\n :src=\"option.logoUrl\" />\n <ScalarIcon\n v-else\n class=\"logo\"\n logo=\"Openapi\" />\n </div>\n\n <div class=\"right\">\n <div class=\"item-top\">\n <span>{{ option.title }}</span>\n\n <span class=\"version\">v{{ option.currentVersion }}</span>\n </div>\n\n <span class=\"description\">\n @{{ option.namespace }}/{{ option.slug }}\n </span>\n </div>\n </button>\n </div>\n </template>\n </ScalarModal>\n</template>\n\n<style>\n.catalogModal .scalar-modal-body {\n display: flex;\n flex-direction: column;\n}\n</style>\n\n<style scoped>\n.searchInput {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-lg);\n margin-bottom: 10px;\n}\n.catalog {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n overflow-y: scroll;\n font-size: var(--scalar-font-size-3);\n}\n.item {\n display: flex;\n padding: 15px;\n gap: 10px;\n align-items: center;\n background-color: var(--scalar-background-2);\n border-radius: var(--scalar-radius-lg);\n transition: background-color 160ms ease;\n}\n.item:hover {\n background-color: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 40%\n ) !important;\n}\n.left {\n align-items: center;\n}\n.right {\n display: flex;\n flex-direction: column;\n}\n.logo {\n width: 25px;\n}\n.item-top {\n display: flex;\n gap: 10px;\n}\n.version {\n background: var(--scalar-background-3);\n padding: 2px 5px;\n border-radius: var(--scalar-radius);\n font-size: var(--scalar-font-size-5);\n color: var(--scalar-color-3);\n}\n.description {\n color: var(--scalar-color-2);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;EAgBA,IAAM,IAAS,GAAU,EAEnB,IAAQ,GAAS,EAEjB,IAAgB,QACpB,EAAO,QAAQ,MACZ,QAAQ,MACA,CAAC,EAAM,kBAAkB,MAAM,MACnC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,KACrD,CACD,CACA,KAAK,OAAY;GAChB,GAAG;GACH,OAAO,EAAO;GACd,IAAI,EAAO;GACZ,EAAE,CACP;yBAIE,EA8Cc,EAAA,EAAA,EAAA;GA7CZ,OAAM;GACL,OAAO,EAAA;;oBAKuD,CAJ/D,EAI+D,EAAA,EAAA,EAAA;IAH7D,WAAA;IACA,OAAM;IACL,YAAY,EAAA,EAAM,CAAC,MAAM;IACzB,uBAAiB,AAAA,EAAA,QAAG,MAAO,EAAA,EAAM,CAAC,MAAM,QAAQ,KAAC;gCACpC,EAAA,MAAc,UAAA,GAAA,EAC5B,EAmCM,OAnCN,GAmCM,EAAA,EAAA,GAAA,EAlCJ,EAiCS,GAAA,MAAA,EAhCU,EAAA,QAAV,YADT,EAiCS,UAAA;IA/BN,KAAK,EAAO;IACb,OAAM;IACN,MAAK;IACJ,eAAA;AAAkF,KAAxC,EAAA,EAAK,CAAC,YAAY,EAAM,EAAgB,EAAA,MAAM,MAAI;;OAM7F,EASM,OATN,GASM,CAPI,EAAO,WAAA,GAAA,EADf,EAG0B,OAAA;;IADxB,OAAM;IACL,KAAK,EAAO;2BACf,EAGmB,EAAA,EAAA,EAAA;;IADjB,OAAM;IACN,MAAK;UAGT,EAUM,OAVN,GAUM,CATJ,EAIM,OAJN,GAIM,CAHJ,EAA+B,QAAA,MAAA,EAAtB,EAAO,MAAK,EAAA,EAAA,EAErB,EAAyD,QAAzD,GAAsB,MAAC,EAAG,EAAO,eAAc,EAAA,EAAA,CAAA,CAAA,EAGjD,EAEO,QAFP,GAA0B,OACvB,EAAG,EAAO,UAAS,GAAG,MAAC,EAAG,EAAO,KAAI,EAAA,EAAA,CAAA,CAAA,CAAA,EAAA,GAAA,EAAA"}
@@ -0,0 +1,9 @@
1
+ import e from "../../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./Chat.vue.script.js";
3
+ /* empty css */
4
+ //#region src/views/Chat/Chat.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-db4ff6c9"]]);
6
+ //#endregion
7
+ export { n as default };
8
+
9
+ //# sourceMappingURL=Chat.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.vue.js","names":[],"sources":["../../../src/views/Chat/Chat.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ToolUIPart } from 'ai'\nimport { reactive, toRef } from 'vue'\n\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { GET_MINI_OPENAPI_SPEC_TOOL_NAME } from '@/entities/tools/get-mini-openapi-spec'\nimport { GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME } from '@/entities/tools/get-openapi-spec-summary'\nimport { useState, type Tools } from '@/state/state'\nimport AskForAuthentication from '@/views/Chat/Messages/AskForAuthentication.vue'\nimport ExecuteRequestTool from '@/views/Chat/Messages/ExecuteRequestTool.vue'\nimport GetMiniOpenAPIDocTool from '@/views/Chat/Messages/GetMiniOpenAPIDocTool.vue'\nimport GetOpenAPISpecsSummary from '@/views/Chat/Messages/GetOpenAPISpecsSummary.vue'\nimport Text from '@/views/Chat/Messages/Text.vue'\nimport PromptForm from '@/views/PromptForm.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst state = useState()\n</script>\n\n<template>\n <div class=\"chat\">\n <template\n v-for=\"message in state.chat.messages\"\n :key=\"message.id\">\n <template v-if=\"message.role === 'user'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\"\n class=\"userMessage\">\n <p v-if=\"part.type === 'text'\">{{ part.text }}</p>\n </div>\n </template>\n <template v-if=\"message.role === 'assistant'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\">\n <Text\n v-if=\"part.type === 'text'\"\n :messagePart=\"toRef(part)\" />\n <ExecuteRequestTool\n v-if=\"part.type.endsWith(EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME>\n >,\n )\n \" />\n <GetMiniOpenAPIDocTool\n v-if=\"part.type.endsWith(GET_MINI_OPENAPI_SPEC_TOOL_NAME)\"\n :message=\"reactive(message)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof GET_MINI_OPENAPI_SPEC_TOOL_NAME>\n >,\n )\n \" />\n <GetOpenAPISpecsSummary\n v-if=\"part.type.endsWith(GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME)\"\n :message=\"reactive(message)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME>\n >,\n )\n \" />\n <AskForAuthentication\n v-if=\"part.type.endsWith(ASK_FOR_AUTHENTICATION_TOOL_NAME)\"\n :message=\"reactive(message)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof ASK_FOR_AUTHENTICATION_TOOL_NAME>\n >,\n )\n \" />\n </div>\n </template>\n </template>\n <div class=\"spacer\"></div>\n </div>\n <div class=\"formContainer\">\n <PromptForm\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.chat {\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 24px 0;\n max-width: 744px;\n}\n\n.userMessage {\n padding-top: 6px;\n padding-bottom: 6px;\n padding-inline: 16px;\n border-radius: 18px;\n background: var(--scalar-background-2);\n width: fit-content;\n max-width: 80%;\n margin-left: auto;\n font-size: 16px;\n line-height: 24px;\n color: var(--scalar-color-1);\n margin-bottom: 12px;\n}\ndiv + .userMessage {\n margin-top: 64px;\n}\n.chat > :deep(div:has(.executeRequestTool)) + div:has(.executeRequestTool) {\n margin-top: -12px;\n}\n.spacer {\n min-height: 280px;\n width: 100%;\n}\n\n.formContainer {\n position: fixed;\n bottom: 20px;\n width: 100%;\n max-width: 744px;\n z-index: 1;\n}\n.chat :deep(.markdown) {\n margin-bottom: 12px;\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import "../../entities/tools/ask-for-authentication.js";
2
+ import "../../entities/tools/execute-request.js";
3
+ import "../../entities/tools/get-mini-openapi-spec.js";
4
+ import "../../entities/tools/get-openapi-spec-summary.js";
5
+ import { useState as e } from "../../state/state.js";
6
+ import t from "./Messages/AskForAuthentication.vue.js";
7
+ import n from "./Messages/ExecuteRequestTool.vue.js";
8
+ import r from "./Messages/GetMiniOpenAPIDocTool.vue.js";
9
+ import i from "./Messages/GetOpenAPISpecsSummary.vue.js";
10
+ import a from "./Messages/Text.vue.js";
11
+ import o from "../PromptForm.vue.js";
12
+ import { Fragment as s, createBlock as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createVNode as f, defineComponent as p, openBlock as m, reactive as h, renderList as g, toDisplayString as _, toRef as v, unref as y } from "vue";
13
+ //#region src/views/Chat/Chat.vue?vue&type=script&setup=true&lang.ts
14
+ var b = { class: "chat" }, x = { key: 0 }, S = { class: "formContainer" }, C = /* @__PURE__ */ p({
15
+ __name: "Chat",
16
+ emits: ["submit", "uploadApi"],
17
+ setup(p, { emit: C }) {
18
+ let w = C, T = e();
19
+ return (e, p) => (m(), u(s, null, [d("div", b, [(m(!0), u(s, null, g(y(T).chat.messages, (e) => (m(), u(s, { key: e.id }, [e.role === "user" ? (m(!0), u(s, { key: 0 }, g(e.parts, (t, n) => (m(), u("div", {
20
+ key: `${e.id}-${n}`,
21
+ class: "userMessage"
22
+ }, [t.type === "text" ? (m(), u("p", x, _(t.text), 1)) : l("", !0)]))), 128)) : l("", !0), e.role === "assistant" ? (m(!0), u(s, { key: 1 }, g(e.parts, (o, s) => (m(), u("div", { key: `${e.id}-${s}` }, [
23
+ o.type === "text" ? (m(), c(a, {
24
+ key: 0,
25
+ messagePart: v(o)
26
+ }, null, 8, ["messagePart"])) : l("", !0),
27
+ o.type.endsWith(y("execute-request")) ? (m(), c(n, {
28
+ key: 1,
29
+ messagePart: v(o)
30
+ }, null, 8, ["messagePart"])) : l("", !0),
31
+ o.type.endsWith(y("get-mini-openapi-spec")) ? (m(), c(r, {
32
+ key: 2,
33
+ message: h(e),
34
+ messagePart: v(o)
35
+ }, null, 8, ["message", "messagePart"])) : l("", !0),
36
+ o.type.endsWith(y("get-openapi-specs-summary")) ? (m(), c(i, {
37
+ key: 3,
38
+ message: h(e),
39
+ messagePart: v(o)
40
+ }, null, 8, ["message", "messagePart"])) : l("", !0),
41
+ o.type.endsWith(y("ask-for-authentication")) ? (m(), c(t, {
42
+ key: 4,
43
+ message: h(e),
44
+ messagePart: v(o)
45
+ }, null, 8, ["message", "messagePart"])) : l("", !0)
46
+ ]))), 128)) : l("", !0)], 64))), 128)), p[2] ||= d("div", { class: "spacer" }, null, -1)]), d("div", S, [f(o, {
47
+ onSubmit: p[0] ||= (e) => w("submit"),
48
+ onUploadApi: p[1] ||= (e) => w("uploadApi")
49
+ })])], 64));
50
+ }
51
+ });
52
+ //#endregion
53
+ export { C as default };
54
+
55
+ //# sourceMappingURL=Chat.vue.script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.vue.script.js","names":[],"sources":["../../../src/views/Chat/Chat.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ToolUIPart } from 'ai'\nimport { reactive, toRef } from 'vue'\n\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { GET_MINI_OPENAPI_SPEC_TOOL_NAME } from '@/entities/tools/get-mini-openapi-spec'\nimport { GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME } from '@/entities/tools/get-openapi-spec-summary'\nimport { useState, type Tools } from '@/state/state'\nimport AskForAuthentication from '@/views/Chat/Messages/AskForAuthentication.vue'\nimport ExecuteRequestTool from '@/views/Chat/Messages/ExecuteRequestTool.vue'\nimport GetMiniOpenAPIDocTool from '@/views/Chat/Messages/GetMiniOpenAPIDocTool.vue'\nimport GetOpenAPISpecsSummary from '@/views/Chat/Messages/GetOpenAPISpecsSummary.vue'\nimport Text from '@/views/Chat/Messages/Text.vue'\nimport PromptForm from '@/views/PromptForm.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst state = useState()\n</script>\n\n<template>\n <div class=\"chat\">\n <template\n v-for=\"message in state.chat.messages\"\n :key=\"message.id\">\n <template v-if=\"message.role === 'user'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\"\n class=\"userMessage\">\n <p v-if=\"part.type === 'text'\">{{ part.text }}</p>\n </div>\n </template>\n <template v-if=\"message.role === 'assistant'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\">\n <Text\n v-if=\"part.type === 'text'\"\n :messagePart=\"toRef(part)\" />\n <ExecuteRequestTool\n v-if=\"part.type.endsWith(EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME>\n >,\n )\n \" />\n <GetMiniOpenAPIDocTool\n v-if=\"part.type.endsWith(GET_MINI_OPENAPI_SPEC_TOOL_NAME)\"\n :message=\"reactive(message)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof GET_MINI_OPENAPI_SPEC_TOOL_NAME>\n >,\n )\n \" />\n <GetOpenAPISpecsSummary\n v-if=\"part.type.endsWith(GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME)\"\n :message=\"reactive(message)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME>\n >,\n )\n \" />\n <AskForAuthentication\n v-if=\"part.type.endsWith(ASK_FOR_AUTHENTICATION_TOOL_NAME)\"\n :message=\"reactive(message)\"\n :messagePart=\"\n toRef(\n part as ToolUIPart<\n Pick<Tools, typeof ASK_FOR_AUTHENTICATION_TOOL_NAME>\n >,\n )\n \" />\n </div>\n </template>\n </template>\n <div class=\"spacer\"></div>\n </div>\n <div class=\"formContainer\">\n <PromptForm\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.chat {\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 24px 0;\n max-width: 744px;\n}\n\n.userMessage {\n padding-top: 6px;\n padding-bottom: 6px;\n padding-inline: 16px;\n border-radius: 18px;\n background: var(--scalar-background-2);\n width: fit-content;\n max-width: 80%;\n margin-left: auto;\n font-size: 16px;\n line-height: 24px;\n color: var(--scalar-color-1);\n margin-bottom: 12px;\n}\ndiv + .userMessage {\n margin-top: 64px;\n}\n.chat > :deep(div:has(.executeRequestTool)) + div:has(.executeRequestTool) {\n margin-top: -12px;\n}\n.spacer {\n min-height: 280px;\n width: 100%;\n}\n\n.formContainer {\n position: fixed;\n bottom: 20px;\n width: 100%;\n max-width: 744px;\n z-index: 1;\n}\n.chat :deep(.markdown) {\n margin-bottom: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;EAgBA,IAAM,IAAO,GAKP,IAAQ,GAAS;qCAIrB,EA8DM,OA9DN,GA8DM,EAAA,EAAA,GAAA,EA7DJ,EA2DW,GAAA,MAAA,EA1DS,EAAA,EAAK,CAAC,KAAK,WAAtB,wBACD,EAAQ,IAAA,EAAA,CACE,EAAQ,SAAI,UAAA,EAAA,GAAA,EAC1B,EAKM,GAAA,EAAA,KAAA,GAAA,EAAA,EAJoB,EAAQ,QAAxB,GAAM,YADhB,EAKM,OAAA;GAHH,KAAG,GAAK,EAAQ,GAAE,GAAI;GACvB,OAAM;MACG,EAAK,SAAI,UAAA,GAAA,EAAlB,EAAkD,KAAA,GAAA,EAAhB,EAAK,KAAI,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA,CAAA,CAAA,uBAG/B,EAAQ,SAAI,eAAA,EAAA,GAAA,EAC1B,EA6CM,GAAA,EAAA,KAAA,GAAA,EAAA,EA5CoB,EAAQ,QAAxB,GAAM,YADhB,EA6CM,OAAA,EA3CH,KAAG,GAAK,EAAQ,GAAE,GAAI,KAAA,EAAA;GAEf,EAAK,SAAI,UAAA,GAAA,EADjB,EAE+B,GAAA;;IAA5B,aAAa,EAAM,EAAI;;GAElB,EAAK,KAAK,SAAS,EAAA,kBAAqC,CAAA,IAAA,GAAA,EADhE,EAQM,GAAA;;IANH,aAA4B,EAAuB,EAAA;;GAQ9C,EAAK,KAAK,SAAS,EAAA,wBAA+B,CAAA,IAAA,GAAA,EAD1D,EASM,GAAA;;IAPH,SAAS,EAAS,EAAO;IACzB,aAA4B,EAAuB,EAAA;;GAQ9C,EAAK,KAAK,SAAS,EAAA,4BAAmC,CAAA,IAAA,GAAA,EAD9D,EASM,GAAA;;IAPH,SAAS,EAAS,EAAO;IACzB,aAA4B,EAAuB,EAAA;;GAQ9C,EAAK,KAAK,SAAS,EAAA,yBAAgC,CAAA,IAAA,GAAA,EAD3D,EASM,GAAA;;IAPH,SAAS,EAAS,EAAO;IACzB,aAA4B,EAAuB,EAAA;;mDAU5D,EAA0B,OAAA,EAArB,OAAM,UAAQ,EAAA,MAAA,GAAA,CAAA,CAAA,EAErB,EAIM,OAJN,GAIM,CAHJ,EAEmC,GAAA;GADhC,UAAM,AAAA,EAAA,QAAA,MAAE,EAAI,SAAA;GACZ,aAAS,AAAA,EAAA,QAAA,MAAE,EAAI,YAAA"}
@@ -1,7 +1,7 @@
1
1
  import type { ToolUIPart } from 'ai';
2
2
  import { type Ref } from 'vue';
3
- import { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '../../../entities/tools/ask-for-authentication';
4
- import { type Tools } from '../../../state/state';
3
+ import { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '../../../entities/tools/ask-for-authentication.js';
4
+ import { type Tools } from '../../../state/state.js';
5
5
  type __VLS_Props = {
6
6
  messagePart: Ref<ToolUIPart<Pick<Tools, typeof ASK_FOR_AUTHENTICATION_TOOL_NAME>>>;
7
7
  };
@@ -0,0 +1,9 @@
1
+ import e from "../../../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./AskForAuthentication.vue.script.js";
3
+ /* empty css */
4
+ //#region src/views/Chat/Messages/AskForAuthentication.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-8af07610"]]);
6
+ //#endregion
7
+ export { n as default };
8
+
9
+ //# sourceMappingURL=AskForAuthentication.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AskForAuthentication.vue.js","names":[],"sources":["../../../../src/views/Chat/Messages/AskForAuthentication.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { getSelectedServer } from '@scalar/api-client/v2/features/operation'\nimport { getActiveEnvironment, getServers } from '@scalar/api-client/v2/helpers'\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconArrowRight } from '@scalar/icons'\nimport type { ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport AuthenticationProvided from '@/components/AuthenticationProvided.vue'\nimport AuthenticationRequired from '@/components/AuthenticationRequired.vue'\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { TOOL_NAMESPACE_SLUG_DELIMITER } from '@/entities/tools/constants'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport { useState, type Tools } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof ASK_FOR_AUTHENTICATION_TOOL_NAME>>\n >\n}>()\n\nconst { workspaceStore, eventBus, config, chat } = useState()\n\nconst documentName = computed(() => {\n if (\n !messagePart.value.input?.uniqueIdentifier ||\n messagePart.value.state !== 'input-available'\n ) {\n return\n }\n\n const [namespace, slug] = messagePart.value.input.uniqueIdentifier.split(\n TOOL_NAMESPACE_SLUG_DELIMITER,\n )\n if (!namespace || !slug) {\n return\n }\n\n return createDocumentName(namespace, slug)\n})\n\nconst document = computed(() => {\n if (!documentName.value) {\n return\n }\n\n return workspaceStore.workspace.documents[documentName.value]\n})\n\nconst environment = computed(() => {\n if (!document.value) {\n return\n }\n\n return getActiveEnvironment(workspaceStore, document.value)\n})\n\nconst selectedServer = computed(() => {\n if (!document.value) {\n return\n }\n\n const servers = getServers(document.value.servers, {\n documentUrl: document.value['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(servers, document.value['x-scalar-selected-server'])\n})\n\nconst isAuthenticationExpanded = computed(\n () => documentName.value && environment.value && selectedServer.value,\n)\n\nasync function authorizeClicked() {\n await chat.addToolOutput({\n toolCallId: messagePart.value.toolCallId,\n output: 'Authentication provided.',\n tool: ASK_FOR_AUTHENTICATION_TOOL_NAME,\n state: 'output-available',\n })\n}\n</script>\n\n<template>\n <div\n class=\"askForAuthentication\"\n :class=\"{\n open: isAuthenticationExpanded,\n }\">\n <div class=\"toggleButton\">\n <AuthenticationProvided\n v-if=\"messagePart.value.state === 'output-available'\" />\n <AuthenticationRequired\n v-if=\"messagePart.value.state === 'input-available'\" />\n <ScalarButton\n v-if=\"messagePart.value.state === 'input-available'\"\n class=\"authorizeButton\"\n size=\"xs\"\n @click=\"authorizeClicked\">\n Authorize\n <ScalarIconArrowRight weight=\"bold\" />\n </ScalarButton>\n </div>\n <div class=\"authContent\">\n <div class=\"authContentInner\">\n <Auth\n v-if=\"documentName && document && environment && selectedServer\"\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name=\"documentName\"\n :options=\"config\"\n :selectedServer />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.askForAuthentication {\n display: flex;\n flex-direction: column;\n width: 100%;\n position: relative;\n border-top: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n margin-bottom: 12px;\n box-shadow:\n 0 var(--scalar-border-width) 0 var(--scalar-background-1),\n 0 calc(-1 * var(--scalar-border-width)) 0 var(--scalar-background-1);\n padding: 0;\n}\n\n.authContent {\n display: grid;\n grid-template-rows: 0fr;\n min-height: 0;\n overflow: hidden;\n transition: grid-template-rows 0.2s ease-out;\n max-width: 520px;\n margin: auto;\n width: 100%;\n}\n.authContentInner :deep(> div) {\n margin: 36px 0 48px 0;\n}\n.authContent :deep(.markdown) {\n margin-bottom: 0 !important;\n}\n.askForAuthentication.open .authContent {\n grid-template-rows: 1fr;\n}\n\n.continueButton {\n align-self: flex-end;\n}\n\n.toggleButton {\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n position: relative;\n display: flex;\n align-items: center;\n color: var(--scalar-color-3);\n justify-content: space-between;\n border-radius: var(--scalar-radius-lg);\n}\n\n.authContentInner {\n min-height: 0;\n overflow: hidden;\n}\n\n.authorizeButton {\n background: var(--scalar-color-blue) !important;\n color: white !important;\n margin: 0 !important;\n z-index: 1;\n display: flex;\n gap: 5px;\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { ASK_FOR_AUTHENTICATION_TOOL_NAME as e } from "../../../entities/tools/ask-for-authentication.js";
2
+ import "../../../entities/tools/constants.js";
3
+ import { createDocumentName as t } from "../../../registry/create-document-name.js";
4
+ import { useState as n } from "../../../state/state.js";
5
+ import r from "../../../components/AuthenticationProvided.vue.js";
6
+ import i from "../../../components/AuthenticationRequired.vue.js";
7
+ import a from "../../Settings/Auth.vue.js";
8
+ import { computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as f, defineComponent as p, normalizeClass as m, openBlock as h, unref as g, withCtx as _ } from "vue";
9
+ import { ScalarButton as v } from "@scalar/components";
10
+ import { getSelectedServer as y } from "@scalar/api-client/v2/features/operation";
11
+ import { getActiveEnvironment as b, getServers as x } from "@scalar/api-client/v2/helpers";
12
+ import { ScalarIconArrowRight as S } from "@scalar/icons";
13
+ //#region src/views/Chat/Messages/AskForAuthentication.vue?vue&type=script&setup=true&lang.ts
14
+ var C = { class: "toggleButton" }, w = { class: "authContent" }, T = { class: "authContentInner" }, E = /* @__PURE__ */ p({
15
+ __name: "AskForAuthentication",
16
+ props: { messagePart: {} },
17
+ setup(p) {
18
+ let { workspaceStore: E, eventBus: D, config: O, chat: k } = n(), A = o(() => {
19
+ if (!p.messagePart.value.input?.uniqueIdentifier || p.messagePart.value.state !== "input-available") return;
20
+ let [e, n] = p.messagePart.value.input.uniqueIdentifier.split("---");
21
+ if (!(!e || !n)) return t(e, n);
22
+ }), j = o(() => {
23
+ if (A.value) return E.workspace.documents[A.value];
24
+ }), M = o(() => {
25
+ if (j.value) return b(E, j.value);
26
+ }), N = o(() => {
27
+ if (j.value) return y(x(j.value.servers, { documentUrl: j.value["x-scalar-original-source-url"] }), j.value["x-scalar-selected-server"]);
28
+ }), P = o(() => A.value && M.value && N.value);
29
+ async function F() {
30
+ await k.addToolOutput({
31
+ toolCallId: p.messagePart.value.toolCallId,
32
+ output: "Authentication provided.",
33
+ tool: e,
34
+ state: "output-available"
35
+ });
36
+ }
37
+ return (e, t) => (h(), l("div", { class: m(["askForAuthentication", { open: P.value }]) }, [u("div", C, [
38
+ p.messagePart.value.state === "output-available" ? (h(), s(r, { key: 0 })) : c("", !0),
39
+ p.messagePart.value.state === "input-available" ? (h(), s(i, { key: 1 })) : c("", !0),
40
+ p.messagePart.value.state === "input-available" ? (h(), s(g(v), {
41
+ key: 2,
42
+ class: "authorizeButton",
43
+ size: "xs",
44
+ onClick: F
45
+ }, {
46
+ default: _(() => [t[0] ||= d(" Authorize ", -1), f(g(S), { weight: "bold" })]),
47
+ _: 1
48
+ })) : c("", !0)
49
+ ]), u("div", w, [u("div", T, [A.value && j.value && M.value && N.value ? (h(), s(a, {
50
+ key: 0,
51
+ authStore: g(E).auth,
52
+ document: j.value,
53
+ environment: M.value,
54
+ eventBus: g(D),
55
+ name: A.value,
56
+ options: g(O),
57
+ selectedServer: N.value
58
+ }, null, 8, [
59
+ "authStore",
60
+ "document",
61
+ "environment",
62
+ "eventBus",
63
+ "name",
64
+ "options",
65
+ "selectedServer"
66
+ ])) : c("", !0)])])], 2));
67
+ }
68
+ });
69
+ //#endregion
70
+ export { E as default };
71
+
72
+ //# sourceMappingURL=AskForAuthentication.vue.script.js.map