@scalar/agent-chat 0.12.2 → 0.12.4

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 (70) hide show
  1. package/dist/App.vue.d.ts +1 -1
  2. package/dist/App.vue.d.ts.map +1 -1
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +1 -1
  5. package/dist/api.js.map +1 -1
  6. package/dist/components/ActionsDropdown.vue.d.ts.map +1 -1
  7. package/dist/components/ActionsDropdown.vue.js +1 -1
  8. package/dist/components/ActionsDropdown.vue.js.map +1 -1
  9. package/dist/components/ActionsDropdown.vue.script.js +2 -1
  10. package/dist/components/ActionsDropdown.vue.script.js.map +1 -1
  11. package/dist/components/RequestPreview.vue.js +1 -1
  12. package/dist/components/RequestPreview.vue.js.map +1 -1
  13. package/dist/components/RequestPreview.vue.script.js +1 -1
  14. package/dist/components/RequestPreview.vue.script.js.map +1 -1
  15. package/dist/components/ResponseBody/ResponseBodyRaw.vue.js.map +1 -1
  16. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js +1 -1
  17. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js.map +1 -1
  18. package/dist/components/SearchPopover.vue.d.ts.map +1 -1
  19. package/dist/components/SearchPopover.vue.js +1 -1
  20. package/dist/components/SearchPopover.vue.js.map +1 -1
  21. package/dist/components/SearchPopover.vue.script.js +2 -1
  22. package/dist/components/SearchPopover.vue.script.js.map +1 -1
  23. package/dist/components/Selector.vue.d.ts.map +1 -1
  24. package/dist/components/Selector.vue.js.map +1 -1
  25. package/dist/components/Selector.vue.script.js +2 -1
  26. package/dist/components/Selector.vue.script.js.map +1 -1
  27. package/dist/components/ServerSelector.vue.js.map +1 -1
  28. package/dist/components/ServerSelector.vue.script.js +1 -1
  29. package/dist/components/ServerSelector.vue.script.js.map +1 -1
  30. package/dist/components/UploadSection.vue.js +1 -1
  31. package/dist/components/UploadSection.vue.js.map +1 -1
  32. package/dist/components/UploadSection.vue.script.js +1 -1
  33. package/dist/components/UploadSection.vue.script.js.map +1 -1
  34. package/dist/entities/registry/document.d.ts +1 -1
  35. package/dist/package.json +1 -1
  36. package/dist/state/state.d.ts +2 -2
  37. package/dist/state/state.d.ts.map +1 -1
  38. package/dist/state/state.js +2 -2
  39. package/dist/state/state.js.map +1 -1
  40. package/dist/style.css +202 -202
  41. package/dist/views/Catalog/Catalog.vue.d.ts +1 -1
  42. package/dist/views/Catalog/Catalog.vue.d.ts.map +1 -1
  43. package/dist/views/Catalog/Catalog.vue.js +1 -1
  44. package/dist/views/Catalog/Catalog.vue.js.map +1 -1
  45. package/dist/views/Catalog/Catalog.vue.script.js +3 -1
  46. package/dist/views/Catalog/Catalog.vue.script.js.map +1 -1
  47. package/dist/views/Chat/Messages/AskForAuthentication.vue.js +1 -1
  48. package/dist/views/Chat/Messages/AskForAuthentication.vue.js.map +1 -1
  49. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js +1 -1
  50. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js.map +1 -1
  51. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.js +1 -1
  52. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.js.map +1 -1
  53. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js +1 -1
  54. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js.map +1 -1
  55. package/dist/views/Chat/Messages/Text.vue.js.map +1 -1
  56. package/dist/views/Chat/Messages/Text.vue.script.js +1 -1
  57. package/dist/views/Chat/Messages/Text.vue.script.js.map +1 -1
  58. package/dist/views/PromptForm.vue.d.ts.map +1 -1
  59. package/dist/views/PromptForm.vue.js +1 -1
  60. package/dist/views/PromptForm.vue.js.map +1 -1
  61. package/dist/views/PromptForm.vue.script.js +3 -1
  62. package/dist/views/PromptForm.vue.script.js.map +1 -1
  63. package/dist/views/Settings/Settings.vue.d.ts +1 -1
  64. package/dist/views/Settings/Settings.vue.d.ts.map +1 -1
  65. package/dist/views/Settings/Settings.vue.js +1 -1
  66. package/dist/views/Settings/Settings.vue.js.map +1 -1
  67. package/dist/views/Settings/Settings.vue.script.js +3 -1
  68. package/dist/views/Settings/Settings.vue.script.js.map +1 -1
  69. package/dist/vue-styles.css +98 -98
  70. package/package.json +10 -10
@@ -12,13 +12,13 @@ import { loadDocument } from "../registry/add-documents-to-store.js";
12
12
  import { computed, inject, reactive, ref, watch } from "vue";
13
13
  import { useToasts } from "@scalar/use-toasts";
14
14
  import { Chat } from "@ai-sdk/vue";
15
- import { useModal } from "@scalar/components";
15
+ import { useModal } from "@scalar/components/modal";
16
16
  import { apiReferenceConfigurationSchema } from "@scalar/schemas/api-reference";
17
+ import { coerce } from "@scalar/validation";
17
18
  import { createWorkspaceStore } from "@scalar/workspace-store/client";
18
19
  import { createWorkspaceEventBus } from "@scalar/workspace-store/events";
19
20
  import { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from "ai";
20
21
  import { n } from "neverpanic";
21
- import { coerce } from "@scalar/validation";
22
22
  //#region src/state/state.ts
23
23
  var STATE_SYMBOL = Symbol("STATE_SYMBOL");
24
24
  var { toast } = useToasts();
@@ -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 } from '@scalar/types/api-reference'\nimport { apiReferenceConfigurationSchema } from '@scalar/schemas/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'\nimport { coerce } from '@scalar/validation'\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 coerce(apiReferenceConfigurationSchema, {\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/modal'\nimport { apiReferenceConfigurationSchema } from '@scalar/schemas/api-reference'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport { useToasts } from '@scalar/use-toasts'\nimport { coerce } from '@scalar/validation'\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 coerce(apiReferenceConfigurationSchema, {\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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"}