@scalar/agent-chat 0.10.13 → 0.10.14

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 (180) hide show
  1. package/dist/App.vue.js +3 -3
  2. package/dist/App.vue.script.js +24 -20
  3. package/dist/App.vue.script.js.map +1 -1
  4. package/dist/Chat.vue.js +3 -3
  5. package/dist/Chat.vue.script.js +50 -39
  6. package/dist/Chat.vue.script.js.map +1 -1
  7. package/dist/_virtual/_plugin-vue_export-helper.js +5 -5
  8. package/dist/api.js +66 -57
  9. package/dist/api.js.map +1 -1
  10. package/dist/client-tools/execute-request.js +84 -60
  11. package/dist/client-tools/execute-request.js.map +1 -1
  12. package/dist/components/ActionsDropdown.vue.js +4 -4
  13. package/dist/components/ActionsDropdown.vue.script.js +29 -25
  14. package/dist/components/ActionsDropdown.vue.script.js.map +1 -1
  15. package/dist/components/ApprovalSection.vue.js +4 -4
  16. package/dist/components/ApprovalSection.vue.script.js +23 -18
  17. package/dist/components/ApprovalSection.vue.script.js.map +1 -1
  18. package/dist/components/AuthenticationProvided.vue.js +8 -7
  19. package/dist/components/AuthenticationProvided.vue.js.map +1 -1
  20. package/dist/components/AuthenticationRequired.vue.js +8 -7
  21. package/dist/components/AuthenticationRequired.vue.js.map +1 -1
  22. package/dist/components/AutosendPaused.vue.js +8 -7
  23. package/dist/components/AutosendPaused.vue.js.map +1 -1
  24. package/dist/components/BuildingRequest.vue.js +9 -8
  25. package/dist/components/BuildingRequest.vue.js.map +1 -1
  26. package/dist/components/ContextItem.vue.js +4 -4
  27. package/dist/components/ContextItem.vue.script.js +8 -5
  28. package/dist/components/ContextItem.vue.script.js.map +1 -1
  29. package/dist/components/ErrorMessage.vue.js +4 -4
  30. package/dist/components/ErrorMessage.vue.script.js +15 -12
  31. package/dist/components/ErrorMessage.vue.script.js.map +1 -1
  32. package/dist/components/FreeMessagesInfoSection.vue.js +4 -4
  33. package/dist/components/FreeMessagesInfoSection.vue.script.js +45 -34
  34. package/dist/components/FreeMessagesInfoSection.vue.script.js.map +1 -1
  35. package/dist/components/LoadingOpenAPISpecsSummary.vue.js +8 -7
  36. package/dist/components/LoadingOpenAPISpecsSummary.vue.js.map +1 -1
  37. package/dist/components/LoadingSearchOpenAPIOperations.vue.js +8 -7
  38. package/dist/components/LoadingSearchOpenAPIOperations.vue.js.map +1 -1
  39. package/dist/components/Logo.vue.js +9 -8
  40. package/dist/components/Logo.vue.js.map +1 -1
  41. package/dist/components/PaymentSection.vue.js +4 -4
  42. package/dist/components/PaymentSection.vue.script.js +20 -15
  43. package/dist/components/PaymentSection.vue.script.js.map +1 -1
  44. package/dist/components/RequestApproved.vue.js +8 -7
  45. package/dist/components/RequestApproved.vue.js.map +1 -1
  46. package/dist/components/RequestFailed.vue.js +9 -8
  47. package/dist/components/RequestFailed.vue.js.map +1 -1
  48. package/dist/components/RequestPreview.vue.js +4 -4
  49. package/dist/components/RequestPreview.vue.script.js +96 -73
  50. package/dist/components/RequestPreview.vue.script.js.map +1 -1
  51. package/dist/components/RequestRejected.vue.js +9 -8
  52. package/dist/components/RequestRejected.vue.js.map +1 -1
  53. package/dist/components/RequestSuccess.vue.js +8 -7
  54. package/dist/components/RequestSuccess.vue.js.map +1 -1
  55. package/dist/components/ResponseBody/ResponseBody.vue.js +3 -3
  56. package/dist/components/ResponseBody/ResponseBody.vue.script.js +33 -30
  57. package/dist/components/ResponseBody/ResponseBody.vue.script.js.map +1 -1
  58. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js +9 -7
  59. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js.map +1 -1
  60. package/dist/components/ResponseBody/ResponseBodyPreview.vue.js +4 -4
  61. package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js +51 -44
  62. package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js.map +1 -1
  63. package/dist/components/ResponseBody/ResponseBodyRaw.vue.js +3 -3
  64. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js +13 -11
  65. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js.map +1 -1
  66. package/dist/components/ResponseBody/ResponseBodyToggle.vue.js +3 -3
  67. package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js +17 -14
  68. package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js.map +1 -1
  69. package/dist/components/ResponseBody/helpers/media-types.js +37 -35
  70. package/dist/components/ResponseBody/helpers/media-types.js.map +1 -1
  71. package/dist/components/ResponseBody/helpers/process-response-body.js +30 -20
  72. package/dist/components/ResponseBody/helpers/process-response-body.js.map +1 -1
  73. package/dist/components/SearchPopover.vue.js +4 -4
  74. package/dist/components/SearchPopover.vue.script.js +52 -42
  75. package/dist/components/SearchPopover.vue.script.js.map +1 -1
  76. package/dist/components/Selector.vue.js +3 -3
  77. package/dist/components/Selector.vue.script.js +54 -45
  78. package/dist/components/Selector.vue.script.js.map +1 -1
  79. package/dist/components/SendingRequest.vue.js +9 -8
  80. package/dist/components/SendingRequest.vue.js.map +1 -1
  81. package/dist/components/ServerSelector.vue.js +3 -3
  82. package/dist/components/ServerSelector.vue.script.js +52 -43
  83. package/dist/components/ServerSelector.vue.script.js.map +1 -1
  84. package/dist/components/UploadSection.vue.js +4 -4
  85. package/dist/components/UploadSection.vue.script.js +38 -29
  86. package/dist/components/UploadSection.vue.script.js.map +1 -1
  87. package/dist/consts/urls.js +2 -2
  88. package/dist/consts/urls.js.map +1 -1
  89. package/dist/entities/error/constants.js +2 -2
  90. package/dist/entities/error/constants.js.map +1 -1
  91. package/dist/entities/error/helpers.js +4 -4
  92. package/dist/entities/error/helpers.js.map +1 -1
  93. package/dist/entities/index.js +10 -10
  94. package/dist/entities/prompt/constants.js +2 -2
  95. package/dist/entities/prompt/constants.js.map +1 -1
  96. package/dist/entities/registry/document.js +9 -9
  97. package/dist/entities/registry/document.js.map +1 -1
  98. package/dist/entities/tools/ask-for-authentication.js +6 -5
  99. package/dist/entities/tools/ask-for-authentication.js.map +1 -1
  100. package/dist/entities/tools/execute-request.js +10 -9
  101. package/dist/entities/tools/execute-request.js.map +1 -1
  102. package/dist/entities/tools/get-openapi-specs-summary.js +2 -2
  103. package/dist/entities/tools/get-openapi-specs-summary.js.map +1 -1
  104. package/dist/entities/tools/search-openapi-operations.js +4 -3
  105. package/dist/entities/tools/search-openapi-operations.js.map +1 -1
  106. package/dist/helpers.js +53 -27
  107. package/dist/helpers.js.map +1 -1
  108. package/dist/hooks/use-agent-key-documents.js +16 -15
  109. package/dist/hooks/use-agent-key-documents.js.map +1 -1
  110. package/dist/hooks/use-chat-approvals.js +27 -24
  111. package/dist/hooks/use-chat-approvals.js.map +1 -1
  112. package/dist/hooks/use-chat-error.js +19 -17
  113. package/dist/hooks/use-chat-error.js.map +1 -1
  114. package/dist/hooks/use-chat-pending-client-tool-parts.js +10 -8
  115. package/dist/hooks/use-chat-pending-client-tool-parts.js.map +1 -1
  116. package/dist/hooks/use-chat-scroll.js +13 -10
  117. package/dist/hooks/use-chat-scroll.js.map +1 -1
  118. package/dist/hooks/use-curated-documents.js +9 -8
  119. package/dist/hooks/use-curated-documents.js.map +1 -1
  120. package/dist/hooks/use-search.js +25 -16
  121. package/dist/hooks/use-search.js.map +1 -1
  122. package/dist/hooks/use-signup-link.js +19 -9
  123. package/dist/hooks/use-signup-link.js.map +1 -1
  124. package/dist/hooks/use-term-and-conditions.js +12 -11
  125. package/dist/hooks/use-term-and-conditions.js.map +1 -1
  126. package/dist/hooks/use-upload-tmp-document.js +67 -54
  127. package/dist/hooks/use-upload-tmp-document.js.map +1 -1
  128. package/dist/index.js +2 -2
  129. package/dist/package.json +9 -2
  130. package/dist/plugins/persistance.js +18 -10
  131. package/dist/plugins/persistance.js.map +1 -1
  132. package/dist/registry/add-documents-to-store.js +39 -33
  133. package/dist/registry/add-documents-to-store.js.map +1 -1
  134. package/dist/registry/create-document-name.js +3 -3
  135. package/dist/registry/create-document-name.js.map +1 -1
  136. package/dist/state/state.js +176 -132
  137. package/dist/state/state.js.map +1 -1
  138. package/dist/style.css +6596 -1
  139. package/dist/styles/tailwind.config.css +12 -0
  140. package/dist/views/Catalog/Catalog.vue.js +4 -4
  141. package/dist/views/Catalog/Catalog.vue.script.js +56 -39
  142. package/dist/views/Catalog/Catalog.vue.script.js.map +1 -1
  143. package/dist/views/Chat/Chat.vue.js +4 -4
  144. package/dist/views/Chat/Chat.vue.script.js +55 -43
  145. package/dist/views/Chat/Chat.vue.script.js.map +1 -1
  146. package/dist/views/Chat/Messages/AskForAuthentication.vue.js +4 -4
  147. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js +67 -55
  148. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js.map +1 -1
  149. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.js +4 -4
  150. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js +29 -18
  151. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js.map +1 -1
  152. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.js +3 -3
  153. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js +15 -10
  154. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js.map +1 -1
  155. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.js +4 -4
  156. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js +55 -40
  157. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js.map +1 -1
  158. package/dist/views/Chat/Messages/Text.vue.js +3 -3
  159. package/dist/views/Chat/Messages/Text.vue.script.js +8 -6
  160. package/dist/views/Chat/Messages/Text.vue.script.js.map +1 -1
  161. package/dist/views/Layout.vue.js +4 -4
  162. package/dist/views/Layout.vue.script.js +21 -17
  163. package/dist/views/Layout.vue.script.js.map +1 -1
  164. package/dist/views/PromptForm.vue.js +4 -4
  165. package/dist/views/PromptForm.vue.script.js +214 -170
  166. package/dist/views/PromptForm.vue.script.js.map +1 -1
  167. package/dist/views/Settings/Auth.vue.js +3 -3
  168. package/dist/views/Settings/Auth.vue.script.js +58 -46
  169. package/dist/views/Settings/Auth.vue.script.js.map +1 -1
  170. package/dist/views/Settings/DocSettings.vue.js +4 -4
  171. package/dist/views/Settings/DocSettings.vue.script.js +45 -39
  172. package/dist/views/Settings/DocSettings.vue.script.js.map +1 -1
  173. package/dist/views/Settings/Settings.vue.js +4 -4
  174. package/dist/views/Settings/Settings.vue.script.js +59 -48
  175. package/dist/views/Settings/Settings.vue.script.js.map +1 -1
  176. package/dist/views/Start.vue.js +4 -4
  177. package/dist/views/Start.vue.script.js +40 -33
  178. package/dist/views/Start.vue.script.js.map +1 -1
  179. package/dist/vue-styles.css +1341 -0
  180. package/package.json +17 -10
@@ -1,152 +1,196 @@
1
- import { createError as e } from "../entities/error/helpers.js";
2
- import { createApi as t, createAuthorizationHeaders as n } from "../api.js";
3
- import { createDocumentName as r } from "../registry/create-document-name.js";
1
+ import { createError } from "../entities/error/helpers.js";
2
+ import { createApi, createAuthorizationHeaders } from "../api.js";
3
+ import { createDocumentName } from "../registry/create-document-name.js";
4
4
  import "../entities/tools/execute-request.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 { apiReferenceConfigurationSchema as y } from "@scalar/types/api-reference";
17
- import { createWorkspaceStore as b } from "@scalar/workspace-store/client";
18
- import { createWorkspaceEventBus as x } from "@scalar/workspace-store/events";
19
- import { DefaultChatTransport as S, lastAssistantMessageIsCompleteWithToolCalls as C } from "ai";
20
- import { n as w } from "neverpanic";
5
+ import { executeRequestTool } from "../client-tools/execute-request.js";
6
+ import { URLS } from "../consts/urls.js";
7
+ import { createDocumentSettings } from "../helpers.js";
8
+ import { useTermsAndConditions } from "../hooks/use-term-and-conditions.js";
9
+ import { removeTmpDocFromLocalStorage } from "../hooks/use-upload-tmp-document.js";
10
+ import { persistencePlugin } from "../plugins/persistance.js";
11
+ import { loadDocument } from "../registry/add-documents-to-store.js";
12
+ import { computed, inject, reactive, ref, watch } from "vue";
13
+ import { useToasts } from "@scalar/use-toasts";
14
+ import { Chat } from "@ai-sdk/vue";
15
+ import { useModal } from "@scalar/components";
16
+ import { apiReferenceConfigurationSchema } from "@scalar/types/api-reference";
17
+ import { createWorkspaceStore } from "@scalar/workspace-store/client";
18
+ import { createWorkspaceEventBus } from "@scalar/workspace-store/events";
19
+ import { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from "ai";
20
+ import { n } from "neverpanic";
21
21
  //#region src/state/state.ts
22
- var T = Symbol("STATE_SYMBOL"), { toast: E } = g();
23
- function D({ registryDocuments: e, workspaceStore: t, baseUrl: r, proxyUrl: a, getAccessToken: s, getAgentKey: c }) {
24
- let l = new _({
25
- sendAutomaticallyWhen: C,
26
- transport: new S({
27
- api: `${r}/vector/openapi/chat`,
28
- headers: () => n({
29
- getAccessToken: s,
30
- getAgentKey: c
22
+ var STATE_SYMBOL = Symbol("STATE_SYMBOL");
23
+ var { toast } = useToasts();
24
+ function createChat({ registryDocuments, workspaceStore, baseUrl, proxyUrl, getAccessToken, getAgentKey }) {
25
+ const chat = new Chat({
26
+ sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,
27
+ transport: new DefaultChatTransport({
28
+ api: `${baseUrl}/vector/openapi/chat`,
29
+ headers: () => createAuthorizationHeaders({
30
+ getAccessToken,
31
+ getAgentKey
31
32
  }),
32
- body: () => ({ registryDocuments: e.value })
33
+ body: () => ({ registryDocuments: registryDocuments.value })
33
34
  }),
34
- async onToolCall({ toolCall: e }) {
35
- e.dynamic || e.toolName === "execute-request" && e.input.method.toLowerCase() === "get" && await i({
36
- documentSettings: o(t),
37
- input: e.input,
38
- toolCallId: e.toolCallId,
39
- chat: l,
40
- proxyUrl: a.value
35
+ async onToolCall({ toolCall }) {
36
+ if (toolCall.dynamic) return;
37
+ if (toolCall.toolName === "execute-request" && toolCall.input.method.toLowerCase() === "get") await executeRequestTool({
38
+ documentSettings: createDocumentSettings(workspaceStore),
39
+ input: toolCall.input,
40
+ toolCallId: toolCall.toolCallId,
41
+ chat,
42
+ proxyUrl: proxyUrl.value
41
43
  });
42
44
  }
43
45
  });
44
- return l;
46
+ return chat;
45
47
  }
46
- function O({ initialRegistryDocuments: n, registryUrl: i, dashboardUrl: o, platformProxyUrl: f, baseUrl: g, mode: _, isLoggedIn: S, getAccessToken: C, getAgentKey: T, getActiveDocumentJson: O, prefilledMessageRef: k, hideAddApi: A }) {
47
- 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 = x(), B = b({ plugins: [l({ persistAuth: !0 })] }), V = d(() => y.parse({
48
- proxyUrl: I.value,
49
- persistAuth: !0
50
- })), H = D({
51
- registryDocuments: M,
52
- workspaceStore: B,
53
- baseUrl: g,
54
- proxyUrl: I,
55
- getAccessToken: C,
56
- getAgentKey: T
57
- }), U = t({
58
- baseUrl: g,
59
- getAccessToken: C,
60
- getAgentKey: T
61
- }), W = d(() => H.status === "submitted" || H.status === "streaming" && !H.lastMessage?.parts.some((e) => e.type === "text"));
62
- h(() => H.status, () => {
63
- H.status === "streaming" && (j.value = "");
64
- }), k && h(k, async (e) => {
65
- e && (j.value = e, R.accepted.value && await H.sendMessage({ text: j.value }));
48
+ function createState({ initialRegistryDocuments, registryUrl, dashboardUrl, platformProxyUrl, baseUrl, mode, isLoggedIn, getAccessToken, getAgentKey, getActiveDocumentJson, prefilledMessageRef, hideAddApi }) {
49
+ const prompt = ref(prefilledMessageRef?.value ?? "");
50
+ const registryDocuments = ref([]);
51
+ const pendingDocuments = reactive({});
52
+ const curatedDocuments = ref([]);
53
+ const proxyUrlRaw = ref(URLS.DEFAULT_PROXY_URL);
54
+ const proxyUrl = computed(() => proxyUrlRaw.value?.trim() || URLS.DEFAULT_PROXY_URL);
55
+ const uploadedTmpDocumentUrl = ref();
56
+ const terms = useTermsAndConditions();
57
+ const eventBus = createWorkspaceEventBus();
58
+ const workspaceStore = createWorkspaceStore({ plugins: [persistencePlugin({ persistAuth: true })] });
59
+ const config = computed(() => apiReferenceConfigurationSchema.parse({
60
+ proxyUrl: proxyUrl.value,
61
+ persistAuth: true
62
+ }));
63
+ const chat = createChat({
64
+ registryDocuments,
65
+ workspaceStore,
66
+ baseUrl,
67
+ proxyUrl,
68
+ getAccessToken,
69
+ getAgentKey
66
70
  });
67
- let G = v();
68
- async function K({ namespace: e, slug: t, removable: n = !0, tmp: r = !1 }) {
69
- if (M.value.find((n) => n.namespace === e && n.slug === t)) return;
70
- let a = `@${e}/${t}`;
71
- N[a] = !0;
72
- let o = await u({
73
- namespace: e,
74
- slug: t,
75
- workspaceStore: B,
76
- registryUrl: i,
77
- registryDocuments: M,
78
- config: V.value,
79
- getAccessToken: C,
80
- api: U,
81
- removable: n
71
+ const api = createApi({
72
+ baseUrl,
73
+ getAccessToken,
74
+ getAgentKey
75
+ });
76
+ const loading = computed(() => chat.status === "submitted" || chat.status === "streaming" && !chat.lastMessage?.parts.some((part) => part.type === "text"));
77
+ watch(() => chat.status, () => {
78
+ if (chat.status === "streaming") prompt.value = "";
79
+ });
80
+ if (prefilledMessageRef) watch(prefilledMessageRef, async (val) => {
81
+ if (val) {
82
+ prompt.value = val;
83
+ if (terms.accepted.value) await chat.sendMessage({ text: prompt.value });
84
+ }
85
+ });
86
+ const settingsModal = useModal();
87
+ async function addDocument({ namespace, slug, removable = true, tmp = false }) {
88
+ if (registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)) return;
89
+ const identifier = `@${namespace}/${slug}`;
90
+ pendingDocuments[identifier] = true;
91
+ const loadDocumentResult = await loadDocument({
92
+ namespace,
93
+ slug,
94
+ workspaceStore,
95
+ registryUrl,
96
+ registryDocuments,
97
+ config: config.value,
98
+ getAccessToken,
99
+ api,
100
+ removable
82
101
  });
83
- if (N[a] = !1, !o.success) throw r ? (c(), o.error) : (console.warn("[AGENT]: Unable to load document", o.error), E(`Unable to load the document @${e}/${t}`, "warn"), o.error);
102
+ pendingDocuments[identifier] = false;
103
+ if (!loadDocumentResult.success) {
104
+ /**
105
+ * If we are unable to load a document, we just remove it
106
+ * from tmp local storage, do not warn the user.
107
+ */
108
+ if (tmp) {
109
+ removeTmpDocFromLocalStorage();
110
+ throw loadDocumentResult.error;
111
+ }
112
+ console.warn("[AGENT]: Unable to load document", loadDocumentResult.error);
113
+ toast(`Unable to load the document @${namespace}/${slug}`, "warn");
114
+ throw loadDocumentResult.error;
115
+ }
84
116
  }
85
- async function q({ namespace: t, slug: n, removable: r = !0 }) {
86
- if (M.value.find((e) => e.namespace === t && e.slug === n)) return;
87
- let a = `@${t}/${n}`;
88
- N[a] = !0;
89
- let o = await w.fromUnsafe(() => fetch(`${g}/vector/registry/embeddings/${t}/${n}`, { method: "GET" }), (t) => e("FAILED_TO_GET_EMBEDDING_STATUS", t));
90
- if (o.success && o.data.ok) {
91
- let e = await u({
92
- namespace: t,
93
- slug: n,
94
- workspaceStore: B,
95
- registryUrl: i,
96
- registryDocuments: M,
97
- config: V.value,
98
- getAccessToken: C,
99
- api: U,
100
- removable: r
117
+ /**
118
+ * Waits for document to be available in embeddings
119
+ * and adds to the list
120
+ */
121
+ async function addDocumentAsync({ namespace, slug, removable = true }) {
122
+ if (registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)) return;
123
+ const identifier = `@${namespace}/${slug}`;
124
+ pendingDocuments[identifier] = true;
125
+ const embeddingStatusResponse = await n.fromUnsafe(() => fetch(`${baseUrl}/vector/registry/embeddings/${namespace}/${slug}`, { method: "GET" }), (originalError) => createError("FAILED_TO_GET_EMBEDDING_STATUS", originalError));
126
+ if (embeddingStatusResponse.success && embeddingStatusResponse.data.ok) {
127
+ const loadDocumentResult = await loadDocument({
128
+ namespace,
129
+ slug,
130
+ workspaceStore,
131
+ registryUrl,
132
+ registryDocuments,
133
+ config: config.value,
134
+ getAccessToken,
135
+ api,
136
+ removable
101
137
  });
102
- e.success || (console.warn("[AGENT]: Unable to load document", e.error), E(`Unable to load the document @${t}/${n}`, "warn"));
103
- } else console.warn("[AGENT]: Document could not be embedded"), E(`Unable to embed the document @${t}/${n}`, "warn");
104
- N[a] = !1;
138
+ if (!loadDocumentResult.success) {
139
+ console.warn("[AGENT]: Unable to load document", loadDocumentResult.error);
140
+ toast(`Unable to load the document @${namespace}/${slug}`, "warn");
141
+ }
142
+ } else {
143
+ console.warn("[AGENT]: Document could not be embedded");
144
+ toast(`Unable to embed the document @${namespace}/${slug}`, "warn");
145
+ }
146
+ pendingDocuments[identifier] = false;
105
147
  }
106
- function J({ namespace: e, slug: t }) {
107
- M.value = M.value.filter((n) => !(n.namespace === e && n.slug === t)), B.deleteDocument(r(e, t));
148
+ function removeDocument({ namespace, slug }) {
149
+ registryDocuments.value = registryDocuments.value.filter((doc) => !(doc.namespace === namespace && doc.slug === slug));
150
+ workspaceStore.deleteDocument(createDocumentName(namespace, slug));
108
151
  }
109
- return n.forEach(({ namespace: e, slug: t }) => K({
110
- namespace: e,
111
- slug: t,
112
- removable: !1
113
- })), {
114
- prompt: j,
115
- chat: H,
116
- workspaceStore: B,
117
- eventBus: z,
118
- loading: W,
119
- settingsModal: G,
120
- config: V,
121
- registryUrl: i,
122
- dashboardUrl: o,
123
- platformProxyUrl: f,
124
- baseUrl: g,
125
- registryDocuments: M,
126
- pendingDocuments: N,
127
- proxyUrl: I,
128
- proxyUrlRaw: F,
129
- mode: _,
130
- terms: R,
131
- isLoggedIn: S,
132
- addDocument: K,
133
- addDocumentAsync: q,
134
- removeDocument: J,
135
- getAccessToken: C,
136
- getAgentKey: T,
137
- api: U,
138
- uploadedTmpDocumentUrl: L,
139
- curatedDocuments: P,
140
- getActiveDocumentJson: O,
141
- hideAddApi: A
152
+ initialRegistryDocuments.forEach(({ namespace, slug }) => addDocument({
153
+ namespace,
154
+ slug,
155
+ removable: false
156
+ }));
157
+ return {
158
+ prompt,
159
+ chat,
160
+ workspaceStore,
161
+ eventBus,
162
+ loading,
163
+ settingsModal,
164
+ config,
165
+ registryUrl,
166
+ dashboardUrl,
167
+ platformProxyUrl,
168
+ baseUrl,
169
+ registryDocuments,
170
+ pendingDocuments,
171
+ proxyUrl,
172
+ proxyUrlRaw,
173
+ mode,
174
+ terms,
175
+ isLoggedIn,
176
+ addDocument,
177
+ addDocumentAsync,
178
+ removeDocument,
179
+ getAccessToken,
180
+ getAgentKey,
181
+ api,
182
+ uploadedTmpDocumentUrl,
183
+ curatedDocuments,
184
+ getActiveDocumentJson,
185
+ hideAddApi
142
186
  };
143
187
  }
144
- function k() {
145
- let e = f(T);
146
- if (!e) throw Error("No state provided.");
147
- return e;
188
+ function useState() {
189
+ const state = inject(STATE_SYMBOL);
190
+ if (!state) throw new Error("No state provided.");
191
+ return state;
148
192
  }
149
193
  //#endregion
150
- export { T as STATE_SYMBOL, O as createState, k as useState };
194
+ export { STATE_SYMBOL, createState, useState };
151
195
 
152
196
  //# sourceMappingURL=state.js.map
@@ -1 +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 { 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 GetOpenAPISpecsSummaryToolOutput,\n SUMMARIZE_OPENAPI_SPECS_TOOL_NAME,\n} from '@/entities/tools/get-openapi-specs-summary'\nimport type {\n SEARCH_OPENAPI_OPERATIONS_TOOL_NAME,\n SearchOpenAPIOperationsToolInput,\n SearchOpenAPIOperationsToolOutput,\n} from '@/entities/tools/search-openapi-operations'\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 [SEARCH_OPENAPI_OPERATIONS_TOOL_NAME]: {\n input: SearchOpenAPIOperationsToolInput\n output: SearchOpenAPIOperationsToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [SUMMARIZE_OPENAPI_SPECS_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 platformProxyUrl: 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: `${baseUrl}/vector/openapi/chat`,\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\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 platformProxyUrl,\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 platformProxyUrl: 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 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 getAccessToken,\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(`${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 getAccessToken,\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 platformProxyUrl,\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":"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"}
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 { 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 GetOpenAPISpecsSummaryToolOutput,\n SUMMARIZE_OPENAPI_SPECS_TOOL_NAME,\n} from '@/entities/tools/get-openapi-specs-summary'\nimport type {\n SEARCH_OPENAPI_OPERATIONS_TOOL_NAME,\n SearchOpenAPIOperationsToolInput,\n SearchOpenAPIOperationsToolOutput,\n} from '@/entities/tools/search-openapi-operations'\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 [SEARCH_OPENAPI_OPERATIONS_TOOL_NAME]: {\n input: SearchOpenAPIOperationsToolInput\n output: SearchOpenAPIOperationsToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [SUMMARIZE_OPENAPI_SPECS_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 platformProxyUrl: 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: `${baseUrl}/vector/openapi/chat`,\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\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 platformProxyUrl,\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 platformProxyUrl: 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 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 getAccessToken,\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(`${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 getAccessToken,\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 platformProxyUrl,\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":"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"}